You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@metron.apache.org by rm...@apache.org on 2018/08/01 16:44:01 UTC

[1/5] metron git commit: METRON-1671 Create PCAP UI (tiborm via merrimanr) closes apache/metron#1103

Repository: metron
Updated Branches:
  refs/heads/feature/METRON-1554-pcap-query-panel 7dff4def2 -> d5eb56a96


http://git-wip-us.apache.org/repos/asf/metron/blob/d5eb56a9/metron-interface/metron-alerts/src/app/pcap/service/pcap.service.spec.ts
----------------------------------------------------------------------
diff --git a/metron-interface/metron-alerts/src/app/pcap/service/pcap.service.spec.ts b/metron-interface/metron-alerts/src/app/pcap/service/pcap.service.spec.ts
new file mode 100644
index 0000000..244a3ea
--- /dev/null
+++ b/metron-interface/metron-alerts/src/app/pcap/service/pcap.service.spec.ts
@@ -0,0 +1,1752 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { TestBed, async, inject } from '@angular/core/testing';
+import {
+  BaseRequestOptions,
+  HttpModule,
+  Http,
+  Response,
+  ResponseOptions
+} from '@angular/http';
+import { MockBackend } from '@angular/http/testing';
+
+import { PcapService } from './pcap.service';
+import { PcapRequest } from '../model/pcap.request';
+
+describe('PcapService', () => {
+  beforeEach(() => {
+
+    TestBed.configureTestingModule({
+      imports: [HttpModule],
+      providers: [
+        PcapService,
+        {
+          provide: Http,
+          useFactory: (mockBackend, options) => {
+            return new Http(mockBackend, options);
+          },
+          deps: [MockBackend, BaseRequestOptions]
+        },
+        MockBackend,
+        BaseRequestOptions
+      ]
+    });
+  });
+  describe('getPackets()', () => {
+    it('should return an Observable<Response>',
+      inject([PcapService, MockBackend], (pcapService, mockBackend) => {
+
+        let request: PcapRequest = {
+          startTimeMs: 0,
+          endTimeMs: 0,
+          ipSrcAddr: '0.0.0.0',
+          ipSrcPort: '80',
+          ipDstAddr: '0.0.0.0',
+          ipDstPort: '80',
+          protocol: '*',
+          packetFilter: '*',
+          includeReverse: false,
+        };
+
+        mockBackend.connections.subscribe((connection) => {
+          connection.mockRespond(new Response(new ResponseOptions({body: pdml_json()})));
+        });
+        let packets;
+        pcapService.getPackets(request).subscribe(r => packets = r)
+        expect(packets).toBeTruthy()
+        expect(packets.pdml).toBeTruthy()
+        expect(packets.pdml.packet.length).toBe(1)
+        expect(packets.pdml.packet[0].proto.length).toBeGreaterThan(3)
+
+        console.log(packets)
+      }))
+
+
+    it('should ...', inject([PcapService], (service: PcapService) => {
+      expect(service).toBeTruthy();
+    }));
+
+  })
+
+});
+
+
+
+
+function pdml_json() {
+  return `{
+  "pdml": {
+    "$": {
+      "version": "0",
+      "creator": "wireshark/2.4.2",
+      "time": "Tue Mar 27 21:55:25 2018",
+      "capture_file": "./metron-platform/metron-api/src/test/resources/test-tcp-packet.pcap"
+    },
+    "packet": [
+      {
+        "proto": [
+          {
+            "$": {
+              "name": "geninfo",
+              "pos": "0",
+              "showname": "General information",
+              "size": "104"
+            },
+            "field": [
+              {
+                "$": {
+                  "name": "num",
+                  "pos": "0",
+                  "show": "1",
+                  "showname": "Number",
+                  "value": "1",
+                  "size": "104"
+                }
+              },
+              {
+                "$": {
+                  "name": "len",
+                  "pos": "0",
+                  "show": "104",
+                  "showname": "Frame Length",
+                  "value": "68",
+                  "size": "104"
+                }
+              },
+              {
+                "$": {
+                  "name": "caplen",
+                  "pos": "0",
+                  "show": "104",
+                  "showname": "Captured Length",
+                  "value": "68",
+                  "size": "104"
+                }
+              },
+              {
+                "$": {
+                  "name": "timestamp",
+                  "pos": "0",
+                  "show": "Mar 26, 2014 19:59:40.024362000 GMT",
+                  "showname": "Captured Time",
+                  "value": "1395863980.024362000",
+                  "size": "104"
+                }
+              }
+            ]
+          },
+          {
+            "$": {
+              "name": "frame",
+              "showname": "Frame 1: 104 bytes on wire (832 bits), 104 bytes captured (832 bits)",
+              "size": "104",
+              "pos": "0"
+            },
+            "field": [
+              {
+                "$": {
+                  "name": "frame.encap_type",
+                  "showname": "Encapsulation type: Ethernet (1)",
+                  "size": "0",
+                  "pos": "0",
+                  "show": "1"
+                }
+              },
+              {
+                "$": {
+                  "name": "frame.time",
+                  "showname": "Arrival Time: Mar 26, 2014 19:59:40.024362000 GMT",
+                  "size": "0",
+                  "pos": "0",
+                  "show": "Mar 26, 2014 19:59:40.024362000 GMT"
+                }
+              },
+              {
+                "$": {
+                  "name": "frame.offset_shift",
+                  "showname": "Time shift for this packet: 0.000000000 seconds",
+                  "size": "0",
+                  "pos": "0",
+                  "show": "0.000000000"
+                }
+              },
+              {
+                "$": {
+                  "name": "frame.time_epoch",
+                  "showname": "Epoch Time: 1395863980.024362000 seconds",
+                  "size": "0",
+                  "pos": "0",
+                  "show": "1395863980.024362000"
+                }
+              },
+              {
+                "$": {
+                  "name": "frame.time_delta",
+                  "showname": "Time delta from previous captured frame: 0.000000000 seconds",
+                  "size": "0",
+                  "pos": "0",
+                  "show": "0.000000000"
+                }
+              },
+              {
+                "$": {
+                  "name": "frame.time_delta_displayed",
+                  "showname": "Time delta from previous displayed frame: 0.000000000 seconds",
+                  "size": "0",
+                  "pos": "0",
+                  "show": "0.000000000"
+                }
+              },
+              {
+                "$": {
+                  "name": "frame.time_relative",
+                  "showname": "Time since reference or first frame: 0.000000000 seconds",
+                  "size": "0",
+                  "pos": "0",
+                  "show": "0.000000000"
+                }
+              },
+              {
+                "$": {
+                  "name": "frame.number",
+                  "showname": "Frame Number: 1",
+                  "size": "0",
+                  "pos": "0",
+                  "show": "1"
+                }
+              },
+              {
+                "$": {
+                  "name": "frame.len",
+                  "showname": "Frame Length: 104 bytes (832 bits)",
+                  "size": "0",
+                  "pos": "0",
+                  "show": "104"
+                }
+              },
+              {
+                "$": {
+                  "name": "frame.cap_len",
+                  "showname": "Capture Length: 104 bytes (832 bits)",
+                  "size": "0",
+                  "pos": "0",
+                  "show": "104"
+                }
+              },
+              {
+                "$": {
+                  "name": "frame.marked",
+                  "showname": "Frame is marked: False",
+                  "size": "0",
+                  "pos": "0",
+                  "show": "0"
+                }
+              },
+              {
+                "$": {
+                  "name": "frame.ignored",
+                  "showname": "Frame is ignored: False",
+                  "size": "0",
+                  "pos": "0",
+                  "show": "0"
+                }
+              },
+              {
+                "$": {
+                  "name": "frame.protocols",
+                  "showname": "Protocols in frame: eth:ethertype:ip:tcp:smtp",
+                  "size": "0",
+                  "pos": "0",
+                  "show": "eth:ethertype:ip:tcp:smtp"
+                }
+              }
+            ]
+          },
+          {
+            "$": {
+              "name": "eth",
+              "showname": "Ethernet II, Src: MS-NLB-PhysServer-26_c5:01:00:02 (02:1a:c5:01:00:02), Dst: MS-NLB-PhysServer-26_c5:05:00:02 (02:1a:c5:05:00:02)",
+              "size": "14",
+              "pos": "0"
+            },
+            "field": [
+              {
+                "$": {
+                  "name": "eth.dst",
+                  "showname": "Destination: MS-NLB-PhysServer-26_c5:05:00:02 (02:1a:c5:05:00:02)",
+                  "size": "6",
+                  "pos": "0",
+                  "show": "02:1a:c5:05:00:02",
+                  "value": "021ac5050002"
+                },
+                "field": [
+                  {
+                    "$": {
+                      "name": "eth.dst_resolved",
+                      "showname": "Destination (resolved): MS-NLB-PhysServer-26_c5:05:00:02",
+                      "hide": "yes",
+                      "size": "6",
+                      "pos": "0",
+                      "show": "MS-NLB-PhysServer-26_c5:05:00:02",
+                      "value": "021ac5050002"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "eth.addr",
+                      "showname": "Address: MS-NLB-PhysServer-26_c5:05:00:02 (02:1a:c5:05:00:02)",
+                      "size": "6",
+                      "pos": "0",
+                      "show": "02:1a:c5:05:00:02",
+                      "value": "021ac5050002"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "eth.addr_resolved",
+                      "showname": "Address (resolved): MS-NLB-PhysServer-26_c5:05:00:02",
+                      "hide": "yes",
+                      "size": "6",
+                      "pos": "0",
+                      "show": "MS-NLB-PhysServer-26_c5:05:00:02",
+                      "value": "021ac5050002"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "eth.lg",
+                      "showname": ".... ..1. .... .... .... .... = LG bit: Locally administered address (this is NOT the factory default)",
+                      "size": "3",
+                      "pos": "0",
+                      "show": "1",
+                      "value": "1",
+                      "unmaskedvalue": "021ac5"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "eth.ig",
+                      "showname": ".... ...0 .... .... .... .... = IG bit: Individual address (unicast)",
+                      "size": "3",
+                      "pos": "0",
+                      "show": "0",
+                      "value": "0",
+                      "unmaskedvalue": "021ac5"
+                    }
+                  }
+                ]
+              },
+              {
+                "$": {
+                  "name": "eth.src",
+                  "showname": "Source: MS-NLB-PhysServer-26_c5:01:00:02 (02:1a:c5:01:00:02)",
+                  "size": "6",
+                  "pos": "6",
+                  "show": "02:1a:c5:01:00:02",
+                  "value": "021ac5010002"
+                },
+                "field": [
+                  {
+                    "$": {
+                      "name": "eth.src_resolved",
+                      "showname": "Source (resolved): MS-NLB-PhysServer-26_c5:01:00:02",
+                      "hide": "yes",
+                      "size": "6",
+                      "pos": "6",
+                      "show": "MS-NLB-PhysServer-26_c5:01:00:02",
+                      "value": "021ac5010002"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "eth.addr",
+                      "showname": "Address: MS-NLB-PhysServer-26_c5:01:00:02 (02:1a:c5:01:00:02)",
+                      "size": "6",
+                      "pos": "6",
+                      "show": "02:1a:c5:01:00:02",
+                      "value": "021ac5010002"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "eth.addr_resolved",
+                      "showname": "Address (resolved): MS-NLB-PhysServer-26_c5:01:00:02",
+                      "hide": "yes",
+                      "size": "6",
+                      "pos": "6",
+                      "show": "MS-NLB-PhysServer-26_c5:01:00:02",
+                      "value": "021ac5010002"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "eth.lg",
+                      "showname": ".... ..1. .... .... .... .... = LG bit: Locally administered address (this is NOT the factory default)",
+                      "size": "3",
+                      "pos": "6",
+                      "show": "1",
+                      "value": "1",
+                      "unmaskedvalue": "021ac5"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "eth.ig",
+                      "showname": ".... ...0 .... .... .... .... = IG bit: Individual address (unicast)",
+                      "size": "3",
+                      "pos": "6",
+                      "show": "0",
+                      "value": "0",
+                      "unmaskedvalue": "021ac5"
+                    }
+                  }
+                ]
+              },
+              {
+                "$": {
+                  "name": "eth.type",
+                  "showname": "Type: IPv4 (0x0800)",
+                  "size": "2",
+                  "pos": "12",
+                  "show": "0x00000800",
+                  "value": "0800"
+                }
+              },
+              {
+                "$": {
+                  "name": "eth.fcs",
+                  "showname": "Frame check sequence: 0x26469e92 [correct]",
+                  "size": "4",
+                  "pos": "100",
+                  "show": "0x26469e92",
+                  "value": "26469e92"
+                }
+              },
+              {
+                "$": {
+                  "name": "eth.fcs.status",
+                  "showname": "FCS Status: Good",
+                  "size": "0",
+                  "pos": "100",
+                  "show": "1"
+                }
+              }
+            ]
+          },
+          {
+            "$": {
+              "name": "ip",
+              "showname": "Internet Protocol Version 4, Src: 24.0.0.2, Dst: 24.128.0.2",
+              "size": "20",
+              "pos": "14"
+            },
+            "field": [
+              {
+                "$": {
+                  "name": "ip.version",
+                  "showname": "0100 .... = Version: 4",
+                  "size": "1",
+                  "pos": "14",
+                  "show": "4",
+                  "value": "4",
+                  "unmaskedvalue": "45"
+                }
+              },
+              {
+                "$": {
+                  "name": "ip.hdr_len",
+                  "showname": ".... 0101 = Header Length: 20 bytes (5)",
+                  "size": "1",
+                  "pos": "14",
+                  "show": "20",
+                  "value": "45"
+                }
+              },
+              {
+                "$": {
+                  "name": "ip.dsfield",
+                  "showname": "Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)",
+                  "size": "1",
+                  "pos": "15",
+                  "show": "0x00000000",
+                  "value": "00"
+                },
+                "field": [
+                  {
+                    "$": {
+                      "name": "ip.dsfield.dscp",
+                      "showname": "0000 00.. = Differentiated Services Codepoint: Default (0)",
+                      "size": "1",
+                      "pos": "15",
+                      "show": "0",
+                      "value": "0",
+                      "unmaskedvalue": "00"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "ip.dsfield.ecn",
+                      "showname": ".... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)",
+                      "size": "1",
+                      "pos": "15",
+                      "show": "0",
+                      "value": "0",
+                      "unmaskedvalue": "00"
+                    }
+                  }
+                ]
+              },
+              {
+                "$": {
+                  "name": "ip.len",
+                  "showname": "Total Length: 86",
+                  "size": "2",
+                  "pos": "16",
+                  "show": "86",
+                  "value": "0056"
+                }
+              },
+              {
+                "$": {
+                  "name": "ip.id",
+                  "showname": "Identification: 0xcff6 (53238)",
+                  "size": "2",
+                  "pos": "18",
+                  "show": "0x0000cff6",
+                  "value": "cff6"
+                }
+              },
+              {
+                "$": {
+                  "name": "ip.flags",
+                  "showname": "Flags: 0x02 (Don't Fragment)",
+                  "size": "1",
+                  "pos": "20",
+                  "show": "0x00000002",
+                  "value": "40"
+                },
+                "field": [
+                  {
+                    "$": {
+                      "name": "ip.flags.rb",
+                      "showname": "0... .... = Reserved bit: Not set",
+                      "size": "1",
+                      "pos": "20",
+                      "show": "0",
+                      "value": "40"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "ip.flags.df",
+                      "showname": ".1.. .... = Don't fragment: Set",
+                      "size": "1",
+                      "pos": "20",
+                      "show": "1",
+                      "value": "40"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "ip.flags.mf",
+                      "showname": "..0. .... = More fragments: Not set",
+                      "size": "1",
+                      "pos": "20",
+                      "show": "0",
+                      "value": "40"
+                    }
+                  }
+                ]
+              },
+              {
+                "$": {
+                  "name": "ip.frag_offset",
+                  "showname": "Fragment offset: 0",
+                  "size": "2",
+                  "pos": "20",
+                  "show": "0",
+                  "value": "4000"
+                }
+              },
+              {
+                "$": {
+                  "name": "ip.ttl",
+                  "showname": "Time to live: 32",
+                  "size": "1",
+                  "pos": "22",
+                  "show": "32",
+                  "value": "20"
+                }
+              },
+              {
+                "$": {
+                  "name": "ip.proto",
+                  "showname": "Protocol: TCP (6)",
+                  "size": "1",
+                  "pos": "23",
+                  "show": "6",
+                  "value": "06"
+                }
+              },
+              {
+                "$": {
+                  "name": "ip.checksum",
+                  "showname": "Header checksum: 0x5a28 [validation disabled]",
+                  "size": "2",
+                  "pos": "24",
+                  "show": "0x00005a28",
+                  "value": "5a28"
+                }
+              },
+              {
+                "$": {
+                  "name": "ip.checksum.status",
+                  "showname": "Header checksum status: Unverified",
+                  "size": "0",
+                  "pos": "24",
+                  "show": "2"
+                }
+              },
+              {
+                "$": {
+                  "name": "ip.src",
+                  "showname": "Source: 24.0.0.2",
+                  "size": "4",
+                  "pos": "26",
+                  "show": "24.0.0.2",
+                  "value": "18000002"
+                }
+              },
+              {
+                "$": {
+                  "name": "ip.addr",
+                  "showname": "Source or Destination Address: 24.0.0.2",
+                  "hide": "yes",
+                  "size": "4",
+                  "pos": "26",
+                  "show": "24.0.0.2",
+                  "value": "18000002"
+                }
+              },
+              {
+                "$": {
+                  "name": "ip.src_host",
+                  "showname": "Source Host: 24.0.0.2",
+                  "hide": "yes",
+                  "size": "4",
+                  "pos": "26",
+                  "show": "24.0.0.2",
+                  "value": "18000002"
+                }
+              },
+              {
+                "$": {
+                  "name": "ip.host",
+                  "showname": "Source or Destination Host: 24.0.0.2",
+                  "hide": "yes",
+                  "size": "4",
+                  "pos": "26",
+                  "show": "24.0.0.2",
+                  "value": "18000002"
+                }
+              },
+              {
+                "$": {
+                  "name": "ip.dst",
+                  "showname": "Destination: 24.128.0.2",
+                  "size": "4",
+                  "pos": "30",
+                  "show": "24.128.0.2",
+                  "value": "18800002"
+                }
+              },
+              {
+                "$": {
+                  "name": "ip.addr",
+                  "showname": "Source or Destination Address: 24.128.0.2",
+                  "hide": "yes",
+                  "size": "4",
+                  "pos": "30",
+                  "show": "24.128.0.2",
+                  "value": "18800002"
+                }
+              },
+              {
+                "$": {
+                  "name": "ip.dst_host",
+                  "showname": "Destination Host: 24.128.0.2",
+                  "hide": "yes",
+                  "size": "4",
+                  "pos": "30",
+                  "show": "24.128.0.2",
+                  "value": "18800002"
+                }
+              },
+              {
+                "$": {
+                  "name": "ip.host",
+                  "showname": "Source or Destination Host: 24.128.0.2",
+                  "hide": "yes",
+                  "size": "4",
+                  "pos": "30",
+                  "show": "24.128.0.2",
+                  "value": "18800002"
+                }
+              },
+              {
+                "$": {
+                  "name": "",
+                  "show": "Source GeoIP: United States, Woodbridge, NJ, AS7922 Comcast Cable Communications, LLC, United States, Woodbridge, NJ, AS7922 Comcast Cable Communications, LLC, 40.557598, -74.284599",
+                  "size": "4",
+                  "pos": "26",
+                  "value": "18000002"
+                },
+                "field": [
+                  {
+                    "$": {
+                      "name": "ip.geoip.src_country",
+                      "showname": "Source GeoIP Country: United States",
+                      "size": "4",
+                      "pos": "26",
+                      "show": "United States",
+                      "value": "18000002"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "ip.geoip.country",
+                      "showname": "Source or Destination GeoIP Country: United States",
+                      "hide": "yes",
+                      "size": "4",
+                      "pos": "26",
+                      "show": "United States",
+                      "value": "18000002"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "ip.geoip.src_city",
+                      "showname": "Source GeoIP City: Woodbridge, NJ",
+                      "size": "4",
+                      "pos": "26",
+                      "show": "Woodbridge, NJ",
+                      "value": "18000002"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "ip.geoip.city",
+                      "showname": "Source or Destination GeoIP City: Woodbridge, NJ",
+                      "hide": "yes",
+                      "size": "4",
+                      "pos": "26",
+                      "show": "Woodbridge, NJ",
+                      "value": "18000002"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "ip.geoip.src_asnum",
+                      "showname": "Source GeoIP AS Number: AS7922 Comcast Cable Communications, LLC",
+                      "size": "4",
+                      "pos": "26",
+                      "show": "AS7922 Comcast Cable Communications, LLC",
+                      "value": "18000002"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "ip.geoip.asnum",
+                      "showname": "Source or Destination GeoIP AS Number: AS7922 Comcast Cable Communications, LLC",
+                      "hide": "yes",
+                      "size": "4",
+                      "pos": "26",
+                      "show": "AS7922 Comcast Cable Communications, LLC",
+                      "value": "18000002"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "ip.geoip.src_country",
+                      "showname": "Source GeoIP Country: United States",
+                      "size": "4",
+                      "pos": "26",
+                      "show": "United States",
+                      "value": "18000002"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "ip.geoip.country",
+                      "showname": "Source or Destination GeoIP Country: United States",
+                      "hide": "yes",
+                      "size": "4",
+                      "pos": "26",
+                      "show": "United States",
+                      "value": "18000002"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "ip.geoip.src_city",
+                      "showname": "Source GeoIP City: Woodbridge, NJ",
+                      "size": "4",
+                      "pos": "26",
+                      "show": "Woodbridge, NJ",
+                      "value": "18000002"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "ip.geoip.city",
+                      "showname": "Source or Destination GeoIP City: Woodbridge, NJ",
+                      "hide": "yes",
+                      "size": "4",
+                      "pos": "26",
+                      "show": "Woodbridge, NJ",
+                      "value": "18000002"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "ip.geoip.src_asnum",
+                      "showname": "Source GeoIP AS Number: AS7922 Comcast Cable Communications, LLC",
+                      "size": "4",
+                      "pos": "26",
+                      "show": "AS7922 Comcast Cable Communications, LLC",
+                      "value": "18000002"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "ip.geoip.asnum",
+                      "showname": "Source or Destination GeoIP AS Number: AS7922 Comcast Cable Communications, LLC",
+                      "hide": "yes",
+                      "size": "4",
+                      "pos": "26",
+                      "show": "AS7922 Comcast Cable Communications, LLC",
+                      "value": "18000002"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "ip.geoip.src_lat",
+                      "showname": "Source GeoIP Latitude: 40.557598",
+                      "size": "4",
+                      "pos": "26",
+                      "show": "40.557598",
+                      "value": "18000002"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "ip.geoip.lat",
+                      "showname": "Source or Destination GeoIP Latitude: 40.557598",
+                      "hide": "yes",
+                      "size": "4",
+                      "pos": "26",
+                      "show": "40.557598",
+                      "value": "18000002"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "ip.geoip.src_lon",
+                      "showname": "Source GeoIP Longitude: -74.284599",
+                      "size": "4",
+                      "pos": "26",
+                      "show": "-74.284599",
+                      "value": "18000002"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "ip.geoip.lon",
+                      "showname": "Source or Destination GeoIP Longitude: -74.284599",
+                      "hide": "yes",
+                      "size": "4",
+                      "pos": "26",
+                      "show": "-74.284599",
+                      "value": "18000002"
+                    }
+                  }
+                ]
+              },
+              {
+                "$": {
+                  "name": "",
+                  "show": "Destination GeoIP: United States, Groton, CT, AS7922 Comcast Cable Communications, LLC, United States, Groton, CT, AS7922 Comcast Cable Communications, LLC, 41.353199, -72.038597",
+                  "size": "4",
+                  "pos": "30",
+                  "value": "18800002"
+                },
+                "field": [
+                  {
+                    "$": {
+                      "name": "ip.geoip.dst_country",
+                      "showname": "Destination GeoIP Country: United States",
+                      "size": "4",
+                      "pos": "30",
+                      "show": "United States",
+                      "value": "18800002"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "ip.geoip.country",
+                      "showname": "Source or Destination GeoIP Country: United States",
+                      "hide": "yes",
+                      "size": "4",
+                      "pos": "30",
+                      "show": "United States",
+                      "value": "18800002"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "ip.geoip.dst_city",
+                      "showname": "Destination GeoIP City: Groton, CT",
+                      "size": "4",
+                      "pos": "30",
+                      "show": "Groton, CT",
+                      "value": "18800002"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "ip.geoip.city",
+                      "showname": "Source or Destination GeoIP City: Groton, CT",
+                      "hide": "yes",
+                      "size": "4",
+                      "pos": "30",
+                      "show": "Groton, CT",
+                      "value": "18800002"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "ip.geoip.dst_asnum",
+                      "showname": "Destination GeoIP AS Number: AS7922 Comcast Cable Communications, LLC",
+                      "size": "4",
+                      "pos": "30",
+                      "show": "AS7922 Comcast Cable Communications, LLC",
+                      "value": "18800002"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "ip.geoip.asnum",
+                      "showname": "Source or Destination GeoIP AS Number: AS7922 Comcast Cable Communications, LLC",
+                      "hide": "yes",
+                      "size": "4",
+                      "pos": "30",
+                      "show": "AS7922 Comcast Cable Communications, LLC",
+                      "value": "18800002"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "ip.geoip.dst_country",
+                      "showname": "Destination GeoIP Country: United States",
+                      "size": "4",
+                      "pos": "30",
+                      "show": "United States",
+                      "value": "18800002"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "ip.geoip.country",
+                      "showname": "Source or Destination GeoIP Country: United States",
+                      "hide": "yes",
+                      "size": "4",
+                      "pos": "30",
+                      "show": "United States",
+                      "value": "18800002"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "ip.geoip.dst_city",
+                      "showname": "Destination GeoIP City: Groton, CT",
+                      "size": "4",
+                      "pos": "30",
+                      "show": "Groton, CT",
+                      "value": "18800002"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "ip.geoip.city",
+                      "showname": "Source or Destination GeoIP City: Groton, CT",
+                      "hide": "yes",
+                      "size": "4",
+                      "pos": "30",
+                      "show": "Groton, CT",
+                      "value": "18800002"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "ip.geoip.dst_asnum",
+                      "showname": "Destination GeoIP AS Number: AS7922 Comcast Cable Communications, LLC",
+                      "size": "4",
+                      "pos": "30",
+                      "show": "AS7922 Comcast Cable Communications, LLC",
+                      "value": "18800002"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "ip.geoip.asnum",
+                      "showname": "Source or Destination GeoIP AS Number: AS7922 Comcast Cable Communications, LLC",
+                      "hide": "yes",
+                      "size": "4",
+                      "pos": "30",
+                      "show": "AS7922 Comcast Cable Communications, LLC",
+                      "value": "18800002"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "ip.geoip.dst_lat",
+                      "showname": "Destination GeoIP Latitude: 41.353199",
+                      "size": "4",
+                      "pos": "30",
+                      "show": "41.353199",
+                      "value": "18800002"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "ip.geoip.lat",
+                      "showname": "Source or Destination GeoIP Latitude: 41.353199",
+                      "hide": "yes",
+                      "size": "4",
+                      "pos": "30",
+                      "show": "41.353199",
+                      "value": "18800002"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "ip.geoip.dst_lon",
+                      "showname": "Destination GeoIP Longitude: -72.038597",
+                      "size": "4",
+                      "pos": "30",
+                      "show": "-72.038597",
+                      "value": "18800002"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "ip.geoip.lon",
+                      "showname": "Source or Destination GeoIP Longitude: -72.038597",
+                      "hide": "yes",
+                      "size": "4",
+                      "pos": "30",
+                      "show": "-72.038597",
+                      "value": "18800002"
+                    }
+                  }
+                ]
+              }
+            ]
+          },
+          {
+            "$": {
+              "name": "tcp",
+              "showname": "Transmission Control Protocol, Src Port: 2137, Dst Port: 25, Seq: 1, Ack: 1, Len: 34",
+              "size": "32",
+              "pos": "34"
+            },
+            "field": [
+              {
+                "$": {
+                  "name": "tcp.srcport",
+                  "showname": "Source Port: 2137",
+                  "size": "2",
+                  "pos": "34",
+                  "show": "2137",
+                  "value": "0859"
+                }
+              },
+              {
+                "$": {
+                  "name": "tcp.dstport",
+                  "showname": "Destination Port: 25",
+                  "size": "2",
+                  "pos": "36",
+                  "show": "25",
+                  "value": "0019"
+                }
+              },
+              {
+                "$": {
+                  "name": "tcp.port",
+                  "showname": "Source or Destination Port: 2137",
+                  "hide": "yes",
+                  "size": "2",
+                  "pos": "34",
+                  "show": "2137",
+                  "value": "0859"
+                }
+              },
+              {
+                "$": {
+                  "name": "tcp.port",
+                  "showname": "Source or Destination Port: 25",
+                  "hide": "yes",
+                  "size": "2",
+                  "pos": "36",
+                  "show": "25",
+                  "value": "0019"
+                }
+              },
+              {
+                "$": {
+                  "name": "tcp.stream",
+                  "showname": "Stream index: 0",
+                  "size": "0",
+                  "pos": "34",
+                  "show": "0"
+                }
+              },
+              {
+                "$": {
+                  "name": "tcp.len",
+                  "showname": "TCP Segment Len: 34",
+                  "size": "1",
+                  "pos": "46",
+                  "show": "34",
+                  "value": "80"
+                }
+              },
+              {
+                "$": {
+                  "name": "tcp.seq",
+                  "showname": "Sequence number: 1    (relative sequence number)",
+                  "size": "4",
+                  "pos": "38",
+                  "show": "1",
+                  "value": "f88900ce"
+                }
+              },
+              {
+                "$": {
+                  "name": "tcp.nxtseq",
+                  "showname": "Next sequence number: 35    (relative sequence number)",
+                  "size": "0",
+                  "pos": "34",
+                  "show": "35"
+                }
+              },
+              {
+                "$": {
+                  "name": "tcp.ack",
+                  "showname": "Acknowledgment number: 1    (relative ack number)",
+                  "size": "4",
+                  "pos": "42",
+                  "show": "1",
+                  "value": "365aa74f"
+                }
+              },
+              {
+                "$": {
+                  "name": "tcp.hdr_len",
+                  "showname": "1000 .... = Header Length: 32 bytes (8)",
+                  "size": "1",
+                  "pos": "46",
+                  "show": "32",
+                  "value": "80"
+                }
+              },
+              {
+                "$": {
+                  "name": "tcp.flags",
+                  "showname": "Flags: 0x018 (PSH, ACK)",
+                  "size": "2",
+                  "pos": "46",
+                  "show": "0x00000018",
+                  "value": "18",
+                  "unmaskedvalue": "8018"
+                },
+                "field": [
+                  {
+                    "$": {
+                      "name": "tcp.flags.res",
+                      "showname": "000. .... .... = Reserved: Not set",
+                      "size": "1",
+                      "pos": "46",
+                      "show": "0",
+                      "value": "0",
+                      "unmaskedvalue": "80"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "tcp.flags.ns",
+                      "showname": "...0 .... .... = Nonce: Not set",
+                      "size": "1",
+                      "pos": "46",
+                      "show": "0",
+                      "value": "0",
+                      "unmaskedvalue": "80"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "tcp.flags.cwr",
+                      "showname": ".... 0... .... = Congestion Window Reduced (CWR): Not set",
+                      "size": "1",
+                      "pos": "47",
+                      "show": "0",
+                      "value": "0",
+                      "unmaskedvalue": "18"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "tcp.flags.ecn",
+                      "showname": ".... .0.. .... = ECN-Echo: Not set",
+                      "size": "1",
+                      "pos": "47",
+                      "show": "0",
+                      "value": "0",
+                      "unmaskedvalue": "18"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "tcp.flags.urg",
+                      "showname": ".... ..0. .... = Urgent: Not set",
+                      "size": "1",
+                      "pos": "47",
+                      "show": "0",
+                      "value": "0",
+                      "unmaskedvalue": "18"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "tcp.flags.ack",
+                      "showname": ".... ...1 .... = Acknowledgment: Set",
+                      "size": "1",
+                      "pos": "47",
+                      "show": "1",
+                      "value": "1",
+                      "unmaskedvalue": "18"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "tcp.flags.push",
+                      "showname": ".... .... 1... = Push: Set",
+                      "size": "1",
+                      "pos": "47",
+                      "show": "1",
+                      "value": "1",
+                      "unmaskedvalue": "18"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "tcp.flags.reset",
+                      "showname": ".... .... .0.. = Reset: Not set",
+                      "size": "1",
+                      "pos": "47",
+                      "show": "0",
+                      "value": "0",
+                      "unmaskedvalue": "18"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "tcp.flags.syn",
+                      "showname": ".... .... ..0. = Syn: Not set",
+                      "size": "1",
+                      "pos": "47",
+                      "show": "0",
+                      "value": "0",
+                      "unmaskedvalue": "18"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "tcp.flags.fin",
+                      "showname": ".... .... ...0 = Fin: Not set",
+                      "size": "1",
+                      "pos": "47",
+                      "show": "0",
+                      "value": "0",
+                      "unmaskedvalue": "18"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "tcp.flags.str",
+                      "showname": "TCP Flags: \\\\xc2\\\\xb7\\\\xc2\\\\xb7\\\\xc2\\\\xb7\\\\xc2\\\\xb7\\\\xc2\\\\xb7\\\\xc2\\\\xb7\\\\xc2\\\\xb7AP\\\\xc2\\\\xb7\\\\xc2\\\\xb7\\\\xc2\\\\xb7",
+                      "size": "2",
+                      "pos": "46",
+                      "show": "\\\\xc2\\\\xb7\\\\xc2\\\\xb7\\\\xc2\\\\xb7\\\\xc2\\\\xb7\\\\xc2\\\\xb7\\\\xc2\\\\xb7\\\\xc2\\\\xb7AP\\\\xc2\\\\xb7\\\\xc2\\\\xb7\\\\xc2\\\\xb7",
+                      "value": "8018"
+                    }
+                  }
+                ]
+              },
+              {
+                "$": {
+                  "name": "tcp.window_size_value",
+                  "showname": "Window size value: 7240",
+                  "size": "2",
+                  "pos": "48",
+                  "show": "7240",
+                  "value": "1c48"
+                }
+              },
+              {
+                "$": {
+                  "name": "tcp.window_size",
+                  "showname": "Calculated window size: 7240",
+                  "size": "2",
+                  "pos": "48",
+                  "show": "7240",
+                  "value": "1c48"
+                }
+              },
+              {
+                "$": {
+                  "name": "tcp.window_size_scalefactor",
+                  "showname": "Window size scaling factor: -1 (unknown)",
+                  "size": "2",
+                  "pos": "48",
+                  "show": "-1",
+                  "value": "1c48"
+                }
+              },
+              {
+                "$": {
+                  "name": "tcp.checksum",
+                  "showname": "Checksum: 0x681f [unverified]",
+                  "size": "2",
+                  "pos": "50",
+                  "show": "0x0000681f",
+                  "value": "681f"
+                }
+              },
+              {
+                "$": {
+                  "name": "tcp.checksum.status",
+                  "showname": "Checksum Status: Unverified",
+                  "size": "0",
+                  "pos": "50",
+                  "show": "2"
+                }
+              },
+              {
+                "$": {
+                  "name": "tcp.urgent_pointer",
+                  "showname": "Urgent pointer: 0",
+                  "size": "2",
+                  "pos": "52",
+                  "show": "0",
+                  "value": "0000"
+                }
+              },
+              {
+                "$": {
+                  "name": "tcp.options",
+                  "showname": "Options: (12 bytes), No-Operation (NOP), No-Operation (NOP), Timestamps",
+                  "size": "12",
+                  "pos": "54",
+                  "show": "01:01:08:0a:eb:83:4b:08:e8:8c:de:cb",
+                  "value": "0101080aeb834b08e88cdecb"
+                },
+                "field": [
+                  {
+                    "$": {
+                      "name": "tcp.options.nop",
+                      "showname": "TCP Option - No-Operation (NOP)",
+                      "size": "1",
+                      "pos": "54",
+                      "show": "01",
+                      "value": "01"
+                    },
+                    "field": [
+                      {
+                        "$": {
+                          "name": "tcp.option_kind",
+                          "showname": "Kind: No-Operation (1)",
+                          "size": "1",
+                          "pos": "54",
+                          "show": "1",
+                          "value": "01"
+                        }
+                      }
+                    ]
+                  },
+                  {
+                    "$": {
+                      "name": "tcp.options.nop",
+                      "showname": "TCP Option - No-Operation (NOP)",
+                      "size": "1",
+                      "pos": "55",
+                      "show": "01",
+                      "value": "01"
+                    },
+                    "field": [
+                      {
+                        "$": {
+                          "name": "tcp.option_kind",
+                          "showname": "Kind: No-Operation (1)",
+                          "size": "1",
+                          "pos": "55",
+                          "show": "1",
+                          "value": "01"
+                        }
+                      }
+                    ]
+                  },
+                  {
+                    "$": {
+                      "name": "tcp.options.timestamp",
+                      "showname": "TCP Option - Timestamps: TSval 3951250184, TSecr 3901546187",
+                      "size": "10",
+                      "pos": "56",
+                      "show": "08:0a:eb:83:4b:08:e8:8c:de:cb",
+                      "value": "080aeb834b08e88cdecb"
+                    },
+                    "field": [
+                      {
+                        "$": {
+                          "name": "tcp.option_kind",
+                          "showname": "Kind: Time Stamp Option (8)",
+                          "size": "1",
+                          "pos": "56",
+                          "show": "8",
+                          "value": "08"
+                        }
+                      },
+                      {
+                        "$": {
+                          "name": "tcp.option_len",
+                          "showname": "Length: 10",
+                          "size": "1",
+                          "pos": "57",
+                          "show": "10",
+                          "value": "0a"
+                        }
+                      },
+                      {
+                        "$": {
+                          "name": "tcp.options.timestamp.tsval",
+                          "showname": "Timestamp value: 3951250184",
+                          "size": "4",
+                          "pos": "58",
+                          "show": "3951250184",
+                          "value": "eb834b08"
+                        }
+                      },
+                      {
+                        "$": {
+                          "name": "tcp.options.timestamp.tsecr",
+                          "showname": "Timestamp echo reply: 3901546187",
+                          "size": "4",
+                          "pos": "62",
+                          "show": "3901546187",
+                          "value": "e88cdecb"
+                        }
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "$": {
+                  "name": "tcp.analysis",
+                  "showname": "SEQ/ACK analysis",
+                  "size": "0",
+                  "pos": "34",
+                  "show": "",
+                  "value": ""
+                },
+                "field": [
+                  {
+                    "$": {
+                      "name": "tcp.analysis.bytes_in_flight",
+                      "showname": "Bytes in flight: 34",
+                      "size": "0",
+                      "pos": "34",
+                      "show": "34"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "tcp.analysis.push_bytes_sent",
+                      "showname": "Bytes sent since last PSH flag: 34",
+                      "size": "0",
+                      "pos": "34",
+                      "show": "34"
+                    }
+                  }
+                ]
+              },
+              {
+                "$": {
+                  "name": "tcp.payload",
+                  "showname": "TCP payload (34 bytes)",
+                  "size": "34",
+                  "pos": "66",
+                  "show": "45:48:4c:4f:20:63:6c:69:65:6e:74:2d:31:38:30:30:30:30:30:33:2e:65:78:61:6d:70:6c:65:2e:69:6e:74:0d:0a",
+                  "value": "45484c4f20636c69656e742d31383030303030332e6578616d706c652e696e740d0a"
+                }
+              }
+            ]
+          },
+          {
+            "$": {
+              "name": "smtp",
+              "showname": "Simple Mail Transfer Protocol",
+              "size": "34",
+              "pos": "66"
+            },
+            "field": [
+              {
+                "$": {
+                  "name": "smtp.req",
+                  "showname": "Request: True",
+                  "hide": "yes",
+                  "size": "0",
+                  "pos": "66",
+                  "show": "1"
+                }
+              },
+              {
+                "$": {
+                  "name": "smtp.command_line",
+                  "showname": "Command Line: EHLO client-18000003.example.int\\\\r\\\\n",
+                  "size": "34",
+                  "pos": "66",
+                  "show": "EHLO client-18000003.example.int\\\\xd\\\\xa",
+                  "value": "45484c4f20636c69656e742d31383030303030332e6578616d706c652e696e740d0a"
+                },
+                "field": [
+                  {
+                    "$": {
+                      "name": "smtp.req.command",
+                      "showname": "Command: EHLO",
+                      "size": "4",
+                      "pos": "66",
+                      "show": "EHLO",
+                      "value": "45484c4f"
+                    }
+                  },
+                  {
+                    "$": {
+                      "name": "smtp.req.parameter",
+                      "showname": "Request parameter: client-18000003.example.int",
+                      "size": "27",
+                      "pos": "71",
+                      "show": "client-18000003.example.int",
+                      "value": "636c69656e742d31383030303030332e6578616d706c652e696e74"
+                    }
+                  }
+                ]
+              }
+            ]
+          }
+        ]
+      }
+    ]
+  }
+}
+`
+}
+
+function pdml() {
+  return `<?xml version="1.0" encoding="utf-8"?>
+  <?xml-stylesheet type="text/xsl" href="pdml2html.xsl"?>
+  <!-- You can find pdml2html.xsl in /usr/share/wireshark or at https://code.wireshark.org/review/gitweb?p=wireshark.git;a=blob_plain;f=pdml2html.xsl. -->
+  <pdml version="0" creator="wireshark/2.4.2" time="Tue Mar 27 21:55:25 2018" capture_file="./metron-platform/metron-api/src/test/resources/test-tcp-packet.pcap">
+  <packet>
+    <proto name="geninfo" pos="0" showname="General information" size="104">
+      <field name="num" pos="0" show="1" showname="Number" value="1" size="104"/>
+      <field name="len" pos="0" show="104" showname="Frame Length" value="68" size="104"/>
+      <field name="caplen" pos="0" show="104" showname="Captured Length" value="68" size="104"/>
+      <field name="timestamp" pos="0" show="Mar 26, 2014 19:59:40.024362000 GMT" showname="Captured Time" value="1395863980.024362000" size="104"/>
+    </proto>
+    <proto name="frame" showname="Frame 1: 104 bytes on wire (832 bits), 104 bytes captured (832 bits)" size="104" pos="0">
+      <field name="frame.encap_type" showname="Encapsulation type: Ethernet (1)" size="0" pos="0" show="1"/>
+      <field name="frame.time" showname="Arrival Time: Mar 26, 2014 19:59:40.024362000 GMT" size="0" pos="0" show="Mar 26, 2014 19:59:40.024362000 GMT"/>
+      <field name="frame.offset_shift" showname="Time shift for this packet: 0.000000000 seconds" size="0" pos="0" show="0.000000000"/>
+      <field name="frame.time_epoch" showname="Epoch Time: 1395863980.024362000 seconds" size="0" pos="0" show="1395863980.024362000"/>
+      <field name="frame.time_delta" showname="Time delta from previous captured frame: 0.000000000 seconds" size="0" pos="0" show="0.000000000"/>
+      <field name="frame.time_delta_displayed" showname="Time delta from previous displayed frame: 0.000000000 seconds" size="0" pos="0" show="0.000000000"/>
+      <field name="frame.time_relative" showname="Time since reference or first frame: 0.000000000 seconds" size="0" pos="0" show="0.000000000"/>
+      <field name="frame.number" showname="Frame Number: 1" size="0" pos="0" show="1"/>
+      <field name="frame.len" showname="Frame Length: 104 bytes (832 bits)" size="0" pos="0" show="104"/>
+      <field name="frame.cap_len" showname="Capture Length: 104 bytes (832 bits)" size="0" pos="0" show="104"/>
+      <field name="frame.marked" showname="Frame is marked: False" size="0" pos="0" show="0"/>
+      <field name="frame.ignored" showname="Frame is ignored: False" size="0" pos="0" show="0"/>
+      <field name="frame.protocols" showname="Protocols in frame: eth:ethertype:ip:tcp:smtp" size="0" pos="0" show="eth:ethertype:ip:tcp:smtp"/>
+    </proto>
+    <proto name="eth" showname="Ethernet II, Src: MS-NLB-PhysServer-26_c5:01:00:02 (02:1a:c5:01:00:02), Dst: MS-NLB-PhysServer-26_c5:05:00:02 (02:1a:c5:05:00:02)" size="14" pos="0">
+      <field name="eth.dst" showname="Destination: MS-NLB-PhysServer-26_c5:05:00:02 (02:1a:c5:05:00:02)" size="6" pos="0" show="02:1a:c5:05:00:02" value="021ac5050002">
+        <field name="eth.dst_resolved" showname="Destination (resolved): MS-NLB-PhysServer-26_c5:05:00:02" hide="yes" size="6" pos="0" show="MS-NLB-PhysServer-26_c5:05:00:02" value="021ac5050002"/>
+        <field name="eth.addr" showname="Address: MS-NLB-PhysServer-26_c5:05:00:02 (02:1a:c5:05:00:02)" size="6" pos="0" show="02:1a:c5:05:00:02" value="021ac5050002"/>
+        <field name="eth.addr_resolved" showname="Address (resolved): MS-NLB-PhysServer-26_c5:05:00:02" hide="yes" size="6" pos="0" show="MS-NLB-PhysServer-26_c5:05:00:02" value="021ac5050002"/>
+        <field name="eth.lg" showname=".... ..1. .... .... .... .... = LG bit: Locally administered address (this is NOT the factory default)" size="3" pos="0" show="1" value="1" unmaskedvalue="021ac5"/>
+        <field name="eth.ig" showname=".... ...0 .... .... .... .... = IG bit: Individual address (unicast)" size="3" pos="0" show="0" value="0" unmaskedvalue="021ac5"/>
+      </field>
+      <field name="eth.src" showname="Source: MS-NLB-PhysServer-26_c5:01:00:02 (02:1a:c5:01:00:02)" size="6" pos="6" show="02:1a:c5:01:00:02" value="021ac5010002">
+        <field name="eth.src_resolved" showname="Source (resolved): MS-NLB-PhysServer-26_c5:01:00:02" hide="yes" size="6" pos="6" show="MS-NLB-PhysServer-26_c5:01:00:02" value="021ac5010002"/>
+        <field name="eth.addr" showname="Address: MS-NLB-PhysServer-26_c5:01:00:02 (02:1a:c5:01:00:02)" size="6" pos="6" show="02:1a:c5:01:00:02" value="021ac5010002"/>
+        <field name="eth.addr_resolved" showname="Address (resolved): MS-NLB-PhysServer-26_c5:01:00:02" hide="yes" size="6" pos="6" show="MS-NLB-PhysServer-26_c5:01:00:02" value="021ac5010002"/>
+        <field name="eth.lg" showname=".... ..1. .... .... .... .... = LG bit: Locally administered address (this is NOT the factory default)" size="3" pos="6" show="1" value="1" unmaskedvalue="021ac5"/>
+        <field name="eth.ig" showname=".... ...0 .... .... .... .... = IG bit: Individual address (unicast)" size="3" pos="6" show="0" value="0" unmaskedvalue="021ac5"/>
+      </field>
+      <field name="eth.type" showname="Type: IPv4 (0x0800)" size="2" pos="12" show="0x00000800" value="0800"/>
+      <field name="eth.fcs" showname="Frame check sequence: 0x26469e92 [correct]" size="4" pos="100" show="0x26469e92" value="26469e92"/>
+      <field name="eth.fcs.status" showname="FCS Status: Good" size="0" pos="100" show="1"/>
+    </proto>
+    <proto name="ip" showname="Internet Protocol Version 4, Src: 24.0.0.2, Dst: 24.128.0.2" size="20" pos="14">
+      <field name="ip.version" showname="0100 .... = Version: 4" size="1" pos="14" show="4" value="4" unmaskedvalue="45"/>
+      <field name="ip.hdr_len" showname=".... 0101 = Header Length: 20 bytes (5)" size="1" pos="14" show="20" value="45"/>
+      <field name="ip.dsfield" showname="Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)" size="1" pos="15" show="0x00000000" value="00">
+        <field name="ip.dsfield.dscp" showname="0000 00.. = Differentiated Services Codepoint: Default (0)" size="1" pos="15" show="0" value="0" unmaskedvalue="00"/>
+        <field name="ip.dsfield.ecn" showname=".... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)" size="1" pos="15" show="0" value="0" unmaskedvalue="00"/>
+      </field>
+      <field name="ip.len" showname="Total Length: 86" size="2" pos="16" show="86" value="0056"/>
+      <field name="ip.id" showname="Identification: 0xcff6 (53238)" size="2" pos="18" show="0x0000cff6" value="cff6"/>
+      <field name="ip.flags" showname="Flags: 0x02 (Don&#x27;t Fragment)" size="1" pos="20" show="0x00000002" value="40">
+        <field name="ip.flags.rb" showname="0... .... = Reserved bit: Not set" size="1" pos="20" show="0" value="40"/>
+        <field name="ip.flags.df" showname=".1.. .... = Don&#x27;t fragment: Set" size="1" pos="20" show="1" value="40"/>
+        <field name="ip.flags.mf" showname="..0. .... = More fragments: Not set" size="1" pos="20" show="0" value="40"/>
+      </field>
+      <field name="ip.frag_offset" showname="Fragment offset: 0" size="2" pos="20" show="0" value="4000"/>
+      <field name="ip.ttl" showname="Time to live: 32" size="1" pos="22" show="32" value="20"/>
+      <field name="ip.proto" showname="Protocol: TCP (6)" size="1" pos="23" show="6" value="06"/>
+      <field name="ip.checksum" showname="Header checksum: 0x5a28 [validation disabled]" size="2" pos="24" show="0x00005a28" value="5a28"/>
+      <field name="ip.checksum.status" showname="Header checksum status: Unverified" size="0" pos="24" show="2"/>
+      <field name="ip.src" showname="Source: 24.0.0.2" size="4" pos="26" show="24.0.0.2" value="18000002"/>
+      <field name="ip.addr" showname="Source or Destination Address: 24.0.0.2" hide="yes" size="4" pos="26" show="24.0.0.2" value="18000002"/>
+      <field name="ip.src_host" showname="Source Host: 24.0.0.2" hide="yes" size="4" pos="26" show="24.0.0.2" value="18000002"/>
+      <field name="ip.host" showname="Source or Destination Host: 24.0.0.2" hide="yes" size="4" pos="26" show="24.0.0.2" value="18000002"/>
+      <field name="ip.dst" showname="Destination: 24.128.0.2" size="4" pos="30" show="24.128.0.2" value="18800002"/>
+      <field name="ip.addr" showname="Source or Destination Address: 24.128.0.2" hide="yes" size="4" pos="30" show="24.128.0.2" value="18800002"/>
+      <field name="ip.dst_host" showname="Destination Host: 24.128.0.2" hide="yes" size="4" pos="30" show="24.128.0.2" value="18800002"/>
+      <field name="ip.host" showname="Source or Destination Host: 24.128.0.2" hide="yes" size="4" pos="30" show="24.128.0.2" value="18800002"/>
+      <field name="" show="Source GeoIP: United States, Woodbridge, NJ, AS7922 Comcast Cable Communications, LLC, United States, Woodbridge, NJ, AS7922 Comcast Cable Communications, LLC, 40.557598, -74.284599" size="4" pos="26" value="18000002">
+        <field name="ip.geoip.src_country" showname="Source GeoIP Country: United States" size="4" pos="26" show="United States" value="18000002"/>
+        <field name="ip.geoip.country" showname="Source or Destination GeoIP Country: United States" hide="yes" size="4" pos="26" show="United States" value="18000002"/>
+        <field name="ip.geoip.src_city" showname="Source GeoIP City: Woodbridge, NJ" size="4" pos="26" show="Woodbridge, NJ" value="18000002"/>
+        <field name="ip.geoip.city" showname="Source or Destination GeoIP City: Woodbridge, NJ" hide="yes" size="4" pos="26" show="Woodbridge, NJ" value="18000002"/>
+        <field name="ip.geoip.src_asnum" showname="Source GeoIP AS Number: AS7922 Comcast Cable Communications, LLC" size="4" pos="26" show="AS7922 Comcast Cable Communications, LLC" value="18000002"/>
+        <field name="ip.geoip.asnum" showname="Source or Destination GeoIP AS Number: AS7922 Comcast Cable Communications, LLC" hide="yes" size="4" pos="26" show="AS7922 Comcast Cable Communications, LLC" value="18000002"/>
+        <field name="ip.geoip.src_country" showname="Source GeoIP Country: United States" size="4" pos="26" show="United States" value="18000002"/>
+        <field name="ip.geoip.country" showname="Source or Destination GeoIP Country: United States" hide="yes" size="4" pos="26" show="United States" value="18000002"/>
+        <field name="ip.geoip.src_city" showname="Source GeoIP City: Woodbridge, NJ" size="4" pos="26" show="Woodbridge, NJ" value="18000002"/>
+        <field name="ip.geoip.city" showname="Source or Destination GeoIP City: Woodbridge, NJ" hide="yes" size="4" pos="26" show="Woodbridge, NJ" value="18000002"/>
+        <field name="ip.geoip.src_asnum" showname="Source GeoIP AS Number: AS7922 Comcast Cable Communications, LLC" size="4" pos="26" show="AS7922 Comcast Cable Communications, LLC" value="18000002"/>
+        <field name="ip.geoip.asnum" showname="Source or Destination GeoIP AS Number: AS7922 Comcast Cable Communications, LLC" hide="yes" size="4" pos="26" show="AS7922 Comcast Cable Communications, LLC" value="18000002"/>
+        <field name="ip.geoip.src_lat" showname="Source GeoIP Latitude: 40.557598" size="4" pos="26" show="40.557598" value="18000002"/>
+        <field name="ip.geoip.lat" showname="Source or Destination GeoIP Latitude: 40.557598" hide="yes" size="4" pos="26" show="40.557598" value="18000002"/>
+        <field name="ip.geoip.src_lon" showname="Source GeoIP Longitude: -74.284599" size="4" pos="26" show="-74.284599" value="18000002"/>
+        <field name="ip.geoip.lon" showname="Source or Destination GeoIP Longitude: -74.284599" hide="yes" size="4" pos="26" show="-74.284599" value="18000002"/>
+      </field>
+      <field name="" show="Destination GeoIP: United States, Groton, CT, AS7922 Comcast Cable Communications, LLC, United States, Groton, CT, AS7922 Comcast Cable Communications, LLC, 41.353199, -72.038597" size="4" pos="30" value="18800002">
+        <field name="ip.geoip.dst_country" showname="Destination GeoIP Country: United States" size="4" pos="30" show="United States" value="18800002"/>
+        <field name="ip.geoip.country" showname="Source or Destination GeoIP Country: United States" hide="yes" size="4" pos="30" show="United States" value="18800002"/>
+        <field name="ip.geoip.dst_city" showname="Destination GeoIP City: Groton, CT" size="4" pos="30" show="Groton, CT" value="18800002"/>
+        <field name="ip.geoip.city" showname="Source or Destination GeoIP City: Groton, CT" hide="yes" size="4" pos="30" show="Groton, CT" value="18800002"/>
+        <field name="ip.geoip.dst_asnum" showname="Destination GeoIP AS Number: AS7922 Comcast Cable Communications, LLC" size="4" pos="30" show="AS7922 Comcast Cable Communications, LLC" value="18800002"/>
+        <field name="ip.geoip.asnum" showname="Source or Destination GeoIP AS Number: AS7922 Comcast Cable Communications, LLC" hide="yes" size="4" pos="30" show="AS7922 Comcast Cable Communications, LLC" value="18800002"/>
+        <field name="ip.geoip.dst_country" showname="Destination GeoIP Country: United States" size="4" pos="30" show="United States" value="18800002"/>
+        <field name="ip.geoip.country" showname="Source or Destination GeoIP Country: United States" hide="yes" size="4" pos="30" show="United States" value="18800002"/>
+        <field name="ip.geoip.dst_city" showname="Destination GeoIP City: Groton, CT" size="4" pos="30" show="Groton, CT" value="18800002"/>
+        <field name="ip.geoip.city" showname="Source or Destination GeoIP City: Groton, CT" hide="yes" size="4" pos="30" show="Groton, CT" value="18800002"/>
+        <field name="ip.geoip.dst_asnum" showname="Destination GeoIP AS Number: AS7922 Comcast Cable Communications, LLC" size="4" pos="30" show="AS7922 Comcast Cable Communications, LLC" value="18800002"/>
+        <field name="ip.geoip.asnum" showname="Source or Destination GeoIP AS Number: AS7922 Comcast Cable Communications, LLC" hide="yes" size="4" pos="30" show="AS7922 Comcast Cable Communications, LLC" value="18800002"/>
+        <field name="ip.geoip.dst_lat" showname="Destination GeoIP Latitude: 41.353199" size="4" pos="30" show="41.353199" value="18800002"/>
+        <field name="ip.geoip.lat" showname="Source or Destination GeoIP Latitude: 41.353199" hide="yes" size="4" pos="30" show="41.353199" value="18800002"/>
+        <field name="ip.geoip.dst_lon" showname="Destination GeoIP Longitude: -72.038597" size="4" pos="30" show="-72.038597" value="18800002"/>
+        <field name="ip.geoip.lon" showname="Source or Destination GeoIP Longitude: -72.038597" hide="yes" size="4" pos="30" show="-72.038597" value="18800002"/>
+      </field>
+    </proto>
+    <proto name="tcp" showname="Transmission Control Protocol, Src Port: 2137, Dst Port: 25, Seq: 1, Ack: 1, Len: 34" size="32" pos="34">
+      <field name="tcp.srcport" showname="Source Port: 2137" size="2" pos="34" show="2137" value="0859"/>
+      <field name="tcp.dstport" showname="Destination Port: 25" size="2" pos="36" show="25" value="0019"/>
+      <field name="tcp.port" showname="Source or Destination Port: 2137" hide="yes" size="2" pos="34" show="2137" value="0859"/>
+      <field name="tcp.port" showname="Source or Destination Port: 25" hide="yes" size="2" pos="36" show="25" value="0019"/>
+      <field name="tcp.stream" showname="Stream index: 0" size="0" pos="34" show="0"/>
+      <field name="tcp.len" showname="TCP Segment Len: 34" size="1" pos="46" show="34" value="80"/>
+      <field name="tcp.seq" showname="Sequence number: 1    (relative sequence number)" size="4" pos="38" show="1" value="f88900ce"/>
+      <field name="tcp.nxtseq" showname="Next sequence number: 35    (relative sequence number)" size="0" pos="34" show="35"/>
+      <field name="tcp.ack" showname="Acknowledgment number: 1    (relative ack number)" size="4" pos="42" show="1" value="365aa74f"/>
+      <field name="tcp.hdr_len" showname="1000 .... = Header Length: 32 bytes (8)" size="1" pos="46" show="32" value="80"/>
+      <field name="tcp.flags" showname="Flags: 0x018 (PSH, ACK)" size="2" pos="46" show="0x00000018" value="18" unmaskedvalue="8018">
+        <field name="tcp.flags.res" showname="000. .... .... = Reserved: Not set" size="1" pos="46" show="0" value="0" unmaskedvalue="80"/>
+        <field name="tcp.flags.ns" showname="...0 .... .... = Nonce: Not set" size="1" pos="46" show="0" value="0" unmaskedvalue="80"/>
+        <field name="tcp.flags.cwr" showname=".... 0... .... = Congestion Window Reduced (CWR): Not set" size="1" pos="47" show="0" value="0" unmaskedvalue="18"/>
+        <field name="tcp.flags.ecn" showname=".... .0.. .... = ECN-Echo: Not set" size="1" pos="47" show="0" value="0" unmaskedvalue="18"/>
+        <field name="tcp.flags.urg" showname=".... ..0. .... = Urgent: Not set" size="1" pos="47" show="0" value="0" unmaskedvalue="18"/>
+        <field name="tcp.flags.ack" showname=".... ...1 .... = Acknowledgment: Set" size="1" pos="47" show="1" value="1" unmaskedvalue="18"/>
+        <field name="tcp.flags.push" showname=".... .... 1... = Push: Set" size="1" pos="47" show="1" value="1" unmaskedvalue="18"/>
+        <field name="tcp.flags.reset" showname=".... .... .0.. = Reset: Not set" size="1" pos="47" show="0" value="0" unmaskedvalue="18"/>
+        <field name="tcp.flags.syn" showname=".... .... ..0. = Syn: Not set" size="1" pos="47" show="0" value="0" unmaskedvalue="18"/>
+        <field name="tcp.flags.fin" showname=".... .... ...0 = Fin: Not set" size="1" pos="47" show="0" value="0" unmaskedvalue="18"/>
+        <field name="tcp.flags.str" showname="TCP Flags: \\xc2\\xb7\\xc2\\xb7\\xc2\\xb7\\xc2\\xb7\\xc2\\xb7\\xc2\\xb7\\xc2\\xb7AP\\xc2\\xb7\\xc2\\xb7\\xc2\\xb7" size="2" pos="46" show="\\xc2\\xb7\\xc2\\xb7\\xc2\\xb7\\xc2\\xb7\\xc2\\xb7\\xc2\\xb7\\xc2\\xb7AP\\xc2\\xb7\\xc2\\xb7\\xc2\\xb7" value="8018"/>
+      </field>
+      <field name="tcp.window_size_value" showname="Window size value: 7240" size="2" pos="48" show="7240" value="1c48"/>
+      <field name="tcp.window_size" showname="Calculated window size: 7240" size="2" pos="48" show="7240" value="1c48"/>
+      <field name="tcp.window_size_scalefactor" showname="Window size scaling factor: -1 (unknown)" size="2" pos="48" show="-1" value="1c48"/>
+      <field name="tcp.checksum" showname="Checksum: 0x681f [unverified]" size="2" pos="50" show="0x0000681f" value="681f"/>
+      <field name="tcp.checksum.status" showname="Checksum Status: Unverified" size="0" pos="50" show="2"/>
+      <field name="tcp.urgent_pointer" showname="Urgent pointer: 0" size="2" pos="52" show="0" value="0000"/>
+      <field name="tcp.options" showname="Options: (12 bytes), No-Operation (NOP), No-Operation (NOP), Timestamps" size="12" pos="54" show="01:01:08:0a:eb:83:4b:08:e8:8c:de:cb" value="0101080aeb834b08e88cdecb">
+        <field name="tcp.options.nop" showname="TCP Option - No-Operation (NOP)" size="1" pos="54" show="01" value="01">
+          <field name="tcp.option_kind" showname="Kind: No-Operation (1)" size="1" pos="54" show="1" value="01"/>
+        </field>
+        <field name="tcp.options.nop" showname="TCP Option - No-Operation (NOP)" size="1" pos="55" show="01" value="01">
+          <field name="tcp.option_kind" showname="Kind: No-Operation (1)" size="1" pos="55" show="1" value="01"/>
+        </field>
+        <field name="tcp.options.timestamp" showname="TCP Option - Timestamps: TSval 3951250184, TSecr 3901546187" size="10" pos="56" show="08:0a:eb:83:4b:08:e8:8c:de:cb" value="080aeb834b08e88cdecb">
+          <field name="tcp.option_kind" showname="Kind: Time Stamp Option (8)" size="1" pos="56" show="8" value="08"/>
+          <field name="tcp.option_len" showname="Length: 10" size="1" pos="57" show="10" value="0a"/>
+          <field name="tcp.options.timestamp.tsval" showname="Timestamp value: 3951250184" size="4" pos="58" show="3951250184" value="eb834b08"/>
+          <field name="tcp.options.timestamp.tsecr" showname="Timestamp echo reply: 3901546187" size="4" pos="62" show="3901546187" value="e88cdecb"/>
+        </field>
+      </field>
+      <field name="tcp.analysis" showname="SEQ/ACK analysis" size="0" pos="34" show="" value="">
+        <field name="tcp.analysis.bytes_in_flight" showname="Bytes in flight: 34" size="0" pos="34" show="34"/>
+        <field name="tcp.analysis.push_bytes_sent" showname="Bytes sent since last PSH flag: 34" size="0" pos="34" show="34"/>
+      </field>
+      <field name="tcp.payload" showname="TCP payload (34 bytes)" size="34" pos="66" show="45:48:4c:4f:20:63:6c:69:65:6e:74:2d:31:38:30:30:30:30:30:33:2e:65:78:61:6d:70:6c:65:2e:69:6e:74:0d:0a" value="45484c4f20636c69656e742d31383030303030332e6578616d706c652e696e740d0a"/>
+    </proto>
+    <proto name="smtp" showname="Simple Mail Transfer Protocol" size="34" pos="66">
+      <field name="smtp.req" showname="Request: True" hide="yes" size="0" pos="66" show="1"/>
+      <field name="smtp.command_line" showname="Command Line: EHLO client-18000003.example.int\\r\\n" size="34" pos="66" show="EHLO client-18000003.example.int\\xd\\xa" value="45484c4f20636c69656e742d31383030303030332e6578616d706c652e696e740d0a">
+        <field name="smtp.req.command" showname="Command: EHLO" size="4" pos="66" show="EHLO" value="45484c4f"/>
+        <field name="smtp.req.parameter" showname="Request parameter: client-18000003.example.int" size="27" pos="71" show="client-18000003.example.int" value="636c69656e742d31383030303030332e6578616d706c652e696e74"/>
+      </field>
+    </proto>
+  </packet>
+
+
+  </pdml>`
+}

http://git-wip-us.apache.org/repos/asf/metron/blob/d5eb56a9/metron-interface/metron-alerts/src/app/pcap/service/pcap.service.ts
----------------------------------------------------------------------
diff --git a/metron-interface/metron-alerts/src/app/pcap/service/pcap.service.ts b/metron-interface/metron-alerts/src/app/pcap/service/pcap.service.ts
new file mode 100644
index 0000000..5f6f33c
--- /dev/null
+++ b/metron-interface/metron-alerts/src/app/pcap/service/pcap.service.ts
@@ -0,0 +1,68 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import {Injectable, NgZone} from '@angular/core';
+import {Observable, Subject} from 'rxjs/Rx';
+import {Http, Headers, RequestOptions, Response} from '@angular/http';
+import {HttpUtil} from '../../utils/httpUtil';
+
+import 'rxjs/add/operator/map';
+
+import {PcapRequest} from '../model/pcap.request';
+import {Pdml} from '../model/pdml';
+
+export class PcapStatusResponse {
+  jobStatus: string;
+  percentComplete: number;
+  pageTotal: number;
+}
+
+@Injectable()
+export class PcapService {
+
+    private statusInterval = 4;
+    defaultHeaders = {'Content-Type': 'application/json', 'X-Requested-With': 'XMLHttpRequest'};
+
+    constructor(private http: Http, private ngZone: NgZone) {
+    }
+
+    public pollStatus(id: string): Observable<{}> {
+      return Observable.interval(this.statusInterval * 1000).switchMap(() => {
+        return this.getStatus(id);
+      });
+    }
+
+    public submitRequest(pcapRequest: PcapRequest): Observable<string> {
+      return this.http.post('/api/v1/pcap/fixed', pcapRequest, new RequestOptions({headers: new Headers(this.defaultHeaders)}))
+          .map(result => JSON.parse(result.text()).jobId)
+          .catch(HttpUtil.handleError)
+          .onErrorResumeNext();
+    }
+
+    public getStatus(id: string): Observable<PcapStatusResponse> {
+      return this.http.get(`/api/v1/pcap/${id}`,
+          new RequestOptions({headers: new Headers(this.defaultHeaders)}))
+          .map(HttpUtil.extractData)
+          .catch(HttpUtil.handleError);
+  }
+    public getPackets(id: string, pageId: number): Observable<Pdml> {
+        return this.http.get(`/api/v1/pcap/${id}/pdml?page=${pageId}`, new RequestOptions({headers: new Headers(this.defaultHeaders)}))
+            .map(HttpUtil.extractData)
+            .catch(HttpUtil.handleError)
+            .onErrorResumeNext();
+    }
+}


[2/5] metron git commit: METRON-1671 Create PCAP UI (tiborm via merrimanr) closes apache/metron#1103

Posted by rm...@apache.org.
http://git-wip-us.apache.org/repos/asf/metron/blob/d5eb56a9/metron-interface/metron-alerts/src/app/pcap/pcap-packet/pcap-packet.component.spec.ts
----------------------------------------------------------------------
diff --git a/metron-interface/metron-alerts/src/app/pcap/pcap-packet/pcap-packet.component.spec.ts b/metron-interface/metron-alerts/src/app/pcap/pcap-packet/pcap-packet.component.spec.ts
new file mode 100644
index 0000000..155e1f8
--- /dev/null
+++ b/metron-interface/metron-alerts/src/app/pcap/pcap-packet/pcap-packet.component.spec.ts
@@ -0,0 +1,1283 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { PcapPacketComponent } from './pcap-packet.component';
+import { PdmlPacket } from '../model/pdml';
+
+describe('PcapPacketComponent', () => {
+  let component: PcapPacketComponent;
+  let fixture: ComponentFixture<PcapPacketComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ PcapPacketComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(PcapPacketComponent);
+    component = fixture.componentInstance;
+    component.packet = fakePacket as PdmlPacket;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
+
+const fakePacket = {
+  name: "something",
+  expanded: false,
+  protos: [
+    {
+      "name": "geninfo",
+      "pos": "0",
+      "showname": "General information",
+      "size": "722",
+      "hide": null,
+      "fields": [
+        {
+          "name": "num",
+          "pos": "0",
+          "showname": "Number",
+          "size": "722",
+          "value": "1",
+          "show": "1",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "len",
+          "pos": "0",
+          "showname": "Frame Length",
+          "size": "722",
+          "value": "2d2",
+          "show": "722",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "caplen",
+          "pos": "0",
+          "showname": "Captured Length",
+          "size": "722",
+          "value": "2d2",
+          "show": "722",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "timestamp",
+          "pos": "0",
+          "showname": "Captured Time",
+          "size": "722",
+          "value": "1458240269.373968000",
+          "show": "Mar 17, 2016 18:44:29.373968000 UTC",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        }
+      ]
+    },
+    {
+      "name": "frame",
+      "pos": "0",
+      "showname": "Frame 1: 722 bytes on wire (5776 bits), 722 bytes captured (5776 bits)",
+      "size": "722",
+      "hide": null,
+      "fields": [
+        {
+          "name": "frame.dlt",
+          "pos": "0",
+          "showname": "WTAP_ENCAP: 1",
+          "size": "0",
+          "value": null,
+          "show": "1",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "frame.time",
+          "pos": "0",
+          "showname": "Arrival Time: Mar 17, 2016 18:44:29.373968000 UTC",
+          "size": "0",
+          "value": null,
+          "show": "Mar 17, 2016 18:44:29.373968000",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "frame.offset_shift",
+          "pos": "0",
+          "showname": "Time shift for this packet: 0.000000000 seconds",
+          "size": "0",
+          "value": null,
+          "show": "0.000000000",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "frame.time_epoch",
+          "pos": "0",
+          "showname": "Epoch Time: 1458240269.373968000 seconds",
+          "size": "0",
+          "value": null,
+          "show": "1458240269.373968000",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "frame.time_delta",
+          "pos": "0",
+          "showname": "Time delta from previous captured frame: 0.000000000 seconds",
+          "size": "0",
+          "value": null,
+          "show": "0.000000000",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "frame.time_delta_displayed",
+          "pos": "0",
+          "showname": "Time delta from previous displayed frame: 0.000000000 seconds",
+          "size": "0",
+          "value": null,
+          "show": "0.000000000",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "frame.time_relative",
+          "pos": "0",
+          "showname": "Time since reference or first frame: 0.000000000 seconds",
+          "size": "0",
+          "value": null,
+          "show": "0.000000000",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "frame.number",
+          "pos": "0",
+          "showname": "Frame Number: 1",
+          "size": "0",
+          "value": null,
+          "show": "1",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "frame.len",
+          "pos": "0",
+          "showname": "Frame Length: 722 bytes (5776 bits)",
+          "size": "0",
+          "value": null,
+          "show": "722",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "frame.cap_len",
+          "pos": "0",
+          "showname": "Capture Length: 722 bytes (5776 bits)",
+          "size": "0",
+          "value": null,
+          "show": "722",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "frame.marked",
+          "pos": "0",
+          "showname": "Frame is marked: False",
+          "size": "0",
+          "value": null,
+          "show": "0",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "frame.ignored",
+          "pos": "0",
+          "showname": "Frame is ignored: False",
+          "size": "0",
+          "value": null,
+          "show": "0",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "frame.protocols",
+          "pos": "0",
+          "showname": "Protocols in frame: eth:ip:tcp:ssh",
+          "size": "0",
+          "value": null,
+          "show": "eth:ip:tcp:ssh",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        }
+      ]
+    },
+    {
+      "name": "eth",
+      "pos": "0",
+      "showname": "Ethernet II, Src: CadmusCo_96:a4:7a (08:00:27:96:a4:7a), Dst: 0a:00:27:00:00:00 (0a:00:27:00:00:00)",
+      "size": "14",
+      "hide": null,
+      "fields": [
+        {
+          "name": "eth.dst",
+          "pos": "0",
+          "showname": "Destination: 0a:00:27:00:00:00 (0a:00:27:00:00:00)",
+          "size": "6",
+          "value": "0a0027000000",
+          "show": "0a:00:27:00:00:00",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": [
+            {
+              "name": "eth.addr",
+              "pos": "0",
+              "showname": "Address: 0a:00:27:00:00:00 (0a:00:27:00:00:00)",
+              "size": "6",
+              "value": "0a0027000000",
+              "show": "0a:00:27:00:00:00",
+              "unmaskedvalue": null,
+              "hide": null,
+              "fields": null,
+              "protos": null
+            },
+            {
+              "name": "eth.lg",
+              "pos": "0",
+              "showname": ".... ..1. .... .... .... .... = LG bit: Locally administered address (this is NOT the factory default)",
+              "size": "3",
+              "value": "1",
+              "show": "1",
+              "unmaskedvalue": "0a0027",
+              "hide": null,
+              "fields": null,
+              "protos": null
+            },
+            {
+              "name": "eth.ig",
+              "pos": "0",
+              "showname": ".... ...0 .... .... .... .... = IG bit: Individual address (unicast)",
+              "size": "3",
+              "value": "0",
+              "show": "0",
+              "unmaskedvalue": "0a0027",
+              "hide": null,
+              "fields": null,
+              "protos": null
+            }
+          ],
+          "protos": null
+        },
+        {
+          "name": "eth.src",
+          "pos": "6",
+          "showname": "Source: CadmusCo_96:a4:7a (08:00:27:96:a4:7a)",
+          "size": "6",
+          "value": "08002796a47a",
+          "show": "08:00:27:96:a4:7a",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": [
+            {
+              "name": "eth.addr",
+              "pos": "6",
+              "showname": "Address: CadmusCo_96:a4:7a (08:00:27:96:a4:7a)",
+              "size": "6",
+              "value": "08002796a47a",
+              "show": "08:00:27:96:a4:7a",
+              "unmaskedvalue": null,
+              "hide": null,
+              "fields": null,
+              "protos": null
+            },
+            {
+              "name": "eth.lg",
+              "pos": "6",
+              "showname": ".... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)",
+              "size": "3",
+              "value": "0",
+              "show": "0",
+              "unmaskedvalue": "080027",
+              "hide": null,
+              "fields": null,
+              "protos": null
+            },
+            {
+              "name": "eth.ig",
+              "pos": "6",
+              "showname": ".... ...0 .... .... .... .... = IG bit: Individual address (unicast)",
+              "size": "3",
+              "value": "0",
+              "show": "0",
+              "unmaskedvalue": "080027",
+              "hide": null,
+              "fields": null,
+              "protos": null
+            }
+          ],
+          "protos": null
+        },
+        {
+          "name": "eth.type",
+          "pos": "12",
+          "showname": "Type: IP (0x0800)",
+          "size": "2",
+          "value": "0800",
+          "show": "0x0800",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        }
+      ]
+    },
+    {
+      "name": "ip",
+      "pos": "14",
+      "showname": "Internet Protocol Version 4, Src: 192.168.66.121 (192.168.66.121), Dst: 192.168.66.1 (192.168.66.1)",
+      "size": "20",
+      "hide": null,
+      "fields": [
+        {
+          "name": "ip.version",
+          "pos": "14",
+          "showname": "Version: 4",
+          "size": "1",
+          "value": "45",
+          "show": "4",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "ip.hdr_len",
+          "pos": "14",
+          "showname": "Header length: 20 bytes",
+          "size": "1",
+          "value": "45",
+          "show": "20",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "ip.dsfield",
+          "pos": "15",
+          "showname": "Differentiated Services Field: 0x10 (DSCP 0x04: Unknown DSCP; ECN: 0x00: Not-ECT (Not ECN-Capable Transport))",
+          "size": "1",
+          "value": "10",
+          "show": "16",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": [
+            {
+              "name": "ip.dsfield.dscp",
+              "pos": "15",
+              "showname": "0001 00.. = Differentiated Services Codepoint: Unknown (0x04)",
+              "size": "1",
+              "value": "4",
+              "show": "0x04",
+              "unmaskedvalue": "10",
+              "hide": null,
+              "fields": null,
+              "protos": null
+            },
+            {
+              "name": "ip.dsfield.ecn",
+              "pos": "15",
+              "showname": ".... ..00 = Explicit Congestion Notification: Not-ECT (Not ECN-Capable Transport) (0x00)",
+              "size": "1",
+              "value": "0",
+              "show": "0x00",
+              "unmaskedvalue": "10",
+              "hide": null,
+              "fields": null,
+              "protos": null
+            }
+          ],
+          "protos": null
+        },
+        {
+          "name": "ip.len",
+          "pos": "16",
+          "showname": "Total Length: 708",
+          "size": "2",
+          "value": "02c4",
+          "show": "708",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "ip.id",
+          "pos": "18",
+          "showname": "Identification: 0x7cd9 (31961)",
+          "size": "2",
+          "value": "7cd9",
+          "show": "0x7cd9",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "ip.flags",
+          "pos": "20",
+          "showname": "Flags: 0x02 (Don't Fragment)",
+          "size": "1",
+          "value": "40",
+          "show": "0x02",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": [
+            {
+              "name": "ip.flags.rb",
+              "pos": "20",
+              "showname": "0... .... = Reserved bit: Not set",
+              "size": "1",
+              "value": "40",
+              "show": "0",
+              "unmaskedvalue": null,
+              "hide": null,
+              "fields": null,
+              "protos": null
+            },
+            {
+              "name": "ip.flags.df",
+              "pos": "20",
+              "showname": ".1.. .... = Don't fragment: Set",
+              "size": "1",
+              "value": "40",
+              "show": "1",
+              "unmaskedvalue": null,
+              "hide": null,
+              "fields": null,
+              "protos": null
+            },
+            {
+              "name": "ip.flags.mf",
+              "pos": "20",
+              "showname": "..0. .... = More fragments: Not set",
+              "size": "1",
+              "value": "40",
+              "show": "0",
+              "unmaskedvalue": null,
+              "hide": null,
+              "fields": null,
+              "protos": null
+            }
+          ],
+          "protos": null
+        },
+        {
+          "name": "ip.frag_offset",
+          "pos": "20",
+          "showname": "Fragment offset: 0",
+          "size": "2",
+          "value": "4000",
+          "show": "0",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "ip.ttl",
+          "pos": "22",
+          "showname": "Time to live: 64",
+          "size": "1",
+          "value": "40",
+          "show": "64",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "ip.proto",
+          "pos": "23",
+          "showname": "Protocol: TCP (6)",
+          "size": "1",
+          "value": "06",
+          "show": "6",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "ip.checksum",
+          "pos": "24",
+          "showname": "Header checksum: 0xb57f [correct]",
+          "size": "2",
+          "value": "b57f",
+          "show": "0xb57f",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": [
+            {
+              "name": "ip.checksum_good",
+              "pos": "24",
+              "showname": "Good: True",
+              "size": "2",
+              "value": "b57f",
+              "show": "1",
+              "unmaskedvalue": null,
+              "hide": null,
+              "fields": null,
+              "protos": null
+            },
+            {
+              "name": "ip.checksum_bad",
+              "pos": "24",
+              "showname": "Bad: False",
+              "size": "2",
+              "value": "b57f",
+              "show": "0",
+              "unmaskedvalue": null,
+              "hide": null,
+              "fields": null,
+              "protos": null
+            }
+          ],
+          "protos": null
+        },
+        {
+          "name": "ip.src",
+          "pos": "26",
+          "showname": "Source: 192.168.66.121 (192.168.66.121)",
+          "size": "4",
+          "value": "c0a84279",
+          "show": "192.168.66.121",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "ip.addr",
+          "pos": "26",
+          "showname": "Source or Destination Address: 192.168.66.121 (192.168.66.121)",
+          "size": "4",
+          "value": "c0a84279",
+          "show": "192.168.66.121",
+          "unmaskedvalue": null,
+          "hide": "yes",
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "ip.src_host",
+          "pos": "26",
+          "showname": "Source Host: 192.168.66.121",
+          "size": "4",
+          "value": "c0a84279",
+          "show": "192.168.66.121",
+          "unmaskedvalue": null,
+          "hide": "yes",
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "ip.host",
+          "pos": "26",
+          "showname": "Source or Destination Host: 192.168.66.121",
+          "size": "4",
+          "value": "c0a84279",
+          "show": "192.168.66.121",
+          "unmaskedvalue": null,
+          "hide": "yes",
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "ip.dst",
+          "pos": "30",
+          "showname": "Destination: 192.168.66.1 (192.168.66.1)",
+          "size": "4",
+          "value": "c0a84201",
+          "show": "192.168.66.1",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "ip.addr",
+          "pos": "30",
+          "showname": "Source or Destination Address: 192.168.66.1 (192.168.66.1)",
+          "size": "4",
+          "value": "c0a84201",
+          "show": "192.168.66.1",
+          "unmaskedvalue": null,
+          "hide": "yes",
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "ip.dst_host",
+          "pos": "30",
+          "showname": "Destination Host: 192.168.66.1",
+          "size": "4",
+          "value": "c0a84201",
+          "show": "192.168.66.1",
+          "unmaskedvalue": null,
+          "hide": "yes",
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "ip.host",
+          "pos": "30",
+          "showname": "Source or Destination Host: 192.168.66.1",
+          "size": "4",
+          "value": "c0a84201",
+          "show": "192.168.66.1",
+          "unmaskedvalue": null,
+          "hide": "yes",
+          "fields": null,
+          "protos": null
+        }
+      ]
+    },
+    {
+      "name": "tcp",
+      "pos": "34",
+      "showname": "Transmission Control Protocol, Src Port: ssh (22), Dst Port: 55791 (55791), Seq: 1, Ack: 1, Len: 656",
+      "size": "32",
+      "hide": null,
+      "fields": [
+        {
+          "name": "tcp.srcport",
+          "pos": "34",
+          "showname": "Source port: ssh (22)",
+          "size": "2",
+          "value": "0016",
+          "show": "22",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "tcp.dstport",
+          "pos": "36",
+          "showname": "Destination port: 55791 (55791)",
+          "size": "2",
+          "value": "d9ef",
+          "show": "55791",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "tcp.port",
+          "pos": "34",
+          "showname": "Source or Destination Port: 22",
+          "size": "2",
+          "value": "0016",
+          "show": "22",
+          "unmaskedvalue": null,
+          "hide": "yes",
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "tcp.port",
+          "pos": "36",
+          "showname": "Source or Destination Port: 55791",
+          "size": "2",
+          "value": "d9ef",
+          "show": "55791",
+          "unmaskedvalue": null,
+          "hide": "yes",
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "tcp.stream",
+          "pos": "34",
+          "showname": "Stream index: 0",
+          "size": "0",
+          "value": null,
+          "show": "0",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "tcp.len",
+          "pos": "46",
+          "showname": "TCP Segment Len: 656",
+          "size": "1",
+          "value": "80",
+          "show": "656",
+          "unmaskedvalue": null,
+          "hide": "yes",
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "tcp.seq",
+          "pos": "38",
+          "showname": "Sequence number: 1    (relative sequence number)",
+          "size": "4",
+          "value": "12903044",
+          "show": "1",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "tcp.nxtseq",
+          "pos": "34",
+          "showname": "Next sequence number: 657    (relative sequence number)",
+          "size": "0",
+          "value": null,
+          "show": "657",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "tcp.ack",
+          "pos": "42",
+          "showname": "Acknowledgment number: 1    (relative ack number)",
+          "size": "4",
+          "value": "8b92f3e7",
+          "show": "1",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "tcp.hdr_len",
+          "pos": "46",
+          "showname": "Header length: 32 bytes",
+          "size": "1",
+          "value": "80",
+          "show": "32",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "tcp.flags",
+          "pos": "46",
+          "showname": "Flags: 0x018 (PSH, ACK)",
+          "size": "2",
+          "value": "18",
+          "show": "0x0018",
+          "unmaskedvalue": "8018",
+          "hide": null,
+          "fields": [
+            {
+              "name": "tcp.flags.res",
+              "pos": "46",
+              "showname": "000. .... .... = Reserved: Not set",
+              "size": "1",
+              "value": "0",
+              "show": "0",
+              "unmaskedvalue": "80",
+              "hide": null,
+              "fields": null,
+              "protos": null
+            },
+            {
+              "name": "tcp.flags.ns",
+              "pos": "46",
+              "showname": "...0 .... .... = Nonce: Not set",
+              "size": "1",
+              "value": "0",
+              "show": "0",
+              "unmaskedvalue": "80",
+              "hide": null,
+              "fields": null,
+              "protos": null
+            },
+            {
+              "name": "tcp.flags.cwr",
+              "pos": "47",
+              "showname": ".... 0... .... = Congestion Window Reduced (CWR): Not set",
+              "size": "1",
+              "value": "0",
+              "show": "0",
+              "unmaskedvalue": "18",
+              "hide": null,
+              "fields": null,
+              "protos": null
+            },
+            {
+              "name": "tcp.flags.ecn",
+              "pos": "47",
+              "showname": ".... .0.. .... = ECN-Echo: Not set",
+              "size": "1",
+              "value": "0",
+              "show": "0",
+              "unmaskedvalue": "18",
+              "hide": null,
+              "fields": null,
+              "protos": null
+            },
+            {
+              "name": "tcp.flags.urg",
+              "pos": "47",
+              "showname": ".... ..0. .... = Urgent: Not set",
+              "size": "1",
+              "value": "0",
+              "show": "0",
+              "unmaskedvalue": "18",
+              "hide": null,
+              "fields": null,
+              "protos": null
+            },
+            {
+              "name": "tcp.flags.ack",
+              "pos": "47",
+              "showname": ".... ...1 .... = Acknowledgment: Set",
+              "size": "1",
+              "value": "1",
+              "show": "1",
+              "unmaskedvalue": "18",
+              "hide": null,
+              "fields": null,
+              "protos": null
+            },
+            {
+              "name": "tcp.flags.push",
+              "pos": "47",
+              "showname": ".... .... 1... = Push: Set",
+              "size": "1",
+              "value": "1",
+              "show": "1",
+              "unmaskedvalue": "18",
+              "hide": null,
+              "fields": null,
+              "protos": null
+            },
+            {
+              "name": "tcp.flags.reset",
+              "pos": "47",
+              "showname": ".... .... .0.. = Reset: Not set",
+              "size": "1",
+              "value": "0",
+              "show": "0",
+              "unmaskedvalue": "18",
+              "hide": null,
+              "fields": null,
+              "protos": null
+            },
+            {
+              "name": "tcp.flags.syn",
+              "pos": "47",
+              "showname": ".... .... ..0. = Syn: Not set",
+              "size": "1",
+              "value": "0",
+              "show": "0",
+              "unmaskedvalue": "18",
+              "hide": null,
+              "fields": null,
+              "protos": null
+            },
+            {
+              "name": "tcp.flags.fin",
+              "pos": "47",
+              "showname": ".... .... ...0 = Fin: Not set",
+              "size": "1",
+              "value": "0",
+              "show": "0",
+              "unmaskedvalue": "18",
+              "hide": null,
+              "fields": null,
+              "protos": null
+            }
+          ],
+          "protos": null
+        },
+        {
+          "name": "tcp.window_size_value",
+          "pos": "48",
+          "showname": "Window size value: 501",
+          "size": "2",
+          "value": "01f5",
+          "show": "501",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "tcp.window_size",
+          "pos": "48",
+          "showname": "Calculated window size: 501",
+          "size": "2",
+          "value": "01f5",
+          "show": "501",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "tcp.window_size_scalefactor",
+          "pos": "48",
+          "showname": "Window size scaling factor: -1 (unknown)",
+          "size": "2",
+          "value": "01f5",
+          "show": "-1",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "tcp.checksum",
+          "pos": "50",
+          "showname": "Checksum: 0x0882 [validation disabled]",
+          "size": "2",
+          "value": "0882",
+          "show": "0x0882",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": [
+            {
+              "name": "tcp.checksum_good",
+              "pos": "50",
+              "showname": "Good Checksum: False",
+              "size": "2",
+              "value": "0882",
+              "show": "0",
+              "unmaskedvalue": null,
+              "hide": null,
+              "fields": null,
+              "protos": null
+            },
+            {
+              "name": "tcp.checksum_bad",
+              "pos": "50",
+              "showname": "Bad Checksum: False",
+              "size": "2",
+              "value": "0882",
+              "show": "0",
+              "unmaskedvalue": null,
+              "hide": null,
+              "fields": null,
+              "protos": null
+            }
+          ],
+          "protos": null
+        },
+        {
+          "name": "tcp.options",
+          "pos": "54",
+          "showname": "Options: (12 bytes), No-Operation (NOP), No-Operation (NOP), Timestamps",
+          "size": "12",
+          "value": "0101080a0014f4f811bdb98f",
+          "show": "01:01:08:0a:00:14:f4:f8:11:bd:b9:8f",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": [
+            {
+              "name": "",
+              "pos": "54",
+              "showname": null,
+              "size": "1",
+              "value": "01",
+              "show": "No-Operation (NOP)",
+              "unmaskedvalue": null,
+              "hide": null,
+              "fields": [
+                {
+                  "name": "ip.opt.type",
+                  "pos": "54",
+                  "showname": "Type: 1",
+                  "size": "1",
+                  "value": "01",
+                  "show": "1",
+                  "unmaskedvalue": null,
+                  "hide": null,
+                  "fields": [
+                    {
+                      "name": "ip.opt.type.copy",
+                      "pos": "54",
+                      "showname": "0... .... = Copy on fragmentation: No",
+                      "size": "1",
+                      "value": "0",
+                      "show": "0",
+                      "unmaskedvalue": "01",
+                      "hide": null,
+                      "fields": null,
+                      "protos": null
+                    },
+                    {
+                      "name": "ip.opt.type.class",
+                      "pos": "54",
+                      "showname": ".00. .... = Class: Control (0)",
+                      "size": "1",
+                      "value": "0",
+                      "show": "0",
+                      "unmaskedvalue": "01",
+                      "hide": null,
+                      "fields": null,
+                      "protos": null
+                    },
+                    {
+                      "name": "ip.opt.type.number",
+                      "pos": "54",
+                      "showname": "...0 0001 = Number: No-Operation (NOP) (1)",
+                      "size": "1",
+                      "value": "1",
+                      "show": "1",
+                      "unmaskedvalue": "01",
+                      "hide": null,
+                      "fields": null,
+                      "protos": null
+                    }
+                  ],
+                  "protos": null
+                }
+              ],
+              "protos": null
+            },
+            {
+              "name": "",
+              "pos": "55",
+              "showname": null,
+              "size": "1",
+              "value": "01",
+              "show": "No-Operation (NOP)",
+              "unmaskedvalue": null,
+              "hide": null,
+              "fields": [
+                {
+                  "name": "ip.opt.type",
+                  "pos": "55",
+                  "showname": "Type: 1",
+                  "size": "1",
+                  "value": "01",
+                  "show": "1",
+                  "unmaskedvalue": null,
+                  "hide": null,
+                  "fields": [
+                    {
+                      "name": "ip.opt.type.copy",
+                      "pos": "55",
+                      "showname": "0... .... = Copy on fragmentation: No",
+                      "size": "1",
+                      "value": "0",
+                      "show": "0",
+                      "unmaskedvalue": "01",
+                      "hide": null,
+                      "fields": null,
+                      "protos": null
+                    },
+                    {
+                      "name": "ip.opt.type.class",
+                      "pos": "55",
+                      "showname": ".00. .... = Class: Control (0)",
+                      "size": "1",
+                      "value": "0",
+                      "show": "0",
+                      "unmaskedvalue": "01",
+                      "hide": null,
+                      "fields": null,
+                      "protos": null
+                    },
+                    {
+                      "name": "ip.opt.type.number",
+                      "pos": "55",
+                      "showname": "...0 0001 = Number: No-Operation (NOP) (1)",
+                      "size": "1",
+                      "value": "1",
+                      "show": "1",
+                      "unmaskedvalue": "01",
+                      "hide": null,
+                      "fields": null,
+                      "protos": null
+                    }
+                  ],
+                  "protos": null
+                }
+              ],
+              "protos": null
+            },
+            {
+              "name": "",
+              "pos": "56",
+              "showname": null,
+              "size": "10",
+              "value": "080a0014f4f811bdb98f",
+              "show": "Timestamps: TSval 1373432, TSecr 297646479",
+              "unmaskedvalue": null,
+              "hide": null,
+              "fields": [
+                {
+                  "name": "tcp.option_kind",
+                  "pos": "56",
+                  "showname": "Kind: Timestamp (8)",
+                  "size": "1",
+                  "value": "08",
+                  "show": "8",
+                  "unmaskedvalue": null,
+                  "hide": null,
+                  "fields": null,
+                  "protos": null
+                },
+                {
+                  "name": "tcp.option_len",
+                  "pos": "57",
+                  "showname": "Length: 10",
+                  "size": "1",
+                  "value": "0a",
+                  "show": "10",
+                  "unmaskedvalue": null,
+                  "hide": null,
+                  "fields": null,
+                  "protos": null
+                },
+                {
+                  "name": "tcp.options.timestamp.tsval",
+                  "pos": "58",
+                  "showname": "Timestamp value: 1373432",
+                  "size": "4",
+                  "value": "0014f4f8",
+                  "show": "1373432",
+                  "unmaskedvalue": null,
+                  "hide": null,
+                  "fields": null,
+                  "protos": null
+                },
+                {
+                  "name": "tcp.options.timestamp.tsecr",
+                  "pos": "62",
+                  "showname": "Timestamp echo reply: 297646479",
+                  "size": "4",
+                  "value": "11bdb98f",
+                  "show": "297646479",
+                  "unmaskedvalue": null,
+                  "hide": null,
+                  "fields": null,
+                  "protos": null
+                }
+              ],
+              "protos": null
+            }
+          ],
+          "protos": null
+        },
+        {
+          "name": "tcp.analysis",
+          "pos": "34",
+          "showname": "SEQ/ACK analysis",
+          "size": "0",
+          "value": "",
+          "show": "",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": [
+            {
+              "name": "tcp.analysis.bytes_in_flight",
+              "pos": "34",
+              "showname": "Bytes in flight: 656",
+              "size": "0",
+              "value": null,
+              "show": "656",
+              "unmaskedvalue": null,
+              "hide": null,
+              "fields": null,
+              "protos": null
+            }
+          ],
+          "protos": null
+        }
+      ]
+    },
+    {
+      "name": "ssh",
+      "pos": "66",
+      "showname": "SSH Protocol",
+      "size": "656",
+      "hide": null,
+      "fields": [
+        {
+          "name": "ssh.encrypted_packet",
+          "pos": "66",
+          "showname": "Encrypted Packet: 5b2bfe1fa006867834412184af9f5b239737763adead7140...",
+          "size": "656",
+          "value": "5b2bfe1fa006867834412184af9f5b239737763adead71408fc01b88e548b2cc86f341a39771c6ed16f2b0bb3e6ab6109e73c7d68ca7545852f91930e4633c17fb9dc7aa794b0d820d0fa3ac65bf0f013e5449d5953d2943506657e2b76b548e67f5c9ce1a4c53db1b52465bde7208baf11f3fe01975418b4db186a38ad32947d1908b62e532da4b729353a932423d25f5f734484076aa4143c6a74937a4ea49448e261ae1ecb6b07bbdf5c98d0855940a19018c88263b8936f7b3e9a4b6cd98090fa10a10e37ad20fe5d833071ad6d5b2886ba85ec72affb83e316443dbe29dbf643e6aa05595c90765cf85f6da55cc1c09d8dccc7d05da022429ad602a559a044b7e2663b0c153a3011bf824ef8d1fa56cba957c5f5d2276a1c9e92de65782f406848c6e20f634c5d1fea843a8bf1a4058e85553f5838f7299958fbf54be84e46c5a3c3965f8bed7fe03a9a1168a892e0073adeb54deca171a318d11fc1a8179f91632310213da327965a40bc6fe18eae55e8da6b57d7ef9f3a05b42381bcb3db8f8efd6d0c638a2cdd46efb0b8f1274e98672f644b2275947e626b02e5166f86c2dd4a67b81e213f8c064927a396815db589f10e5e521ffedb13f8edbe2de01c6fc8bf0e12c82212e497794aa045e9b6fcca83b4cad0a3b5e6ca2d1feaf8887b4d64f22989396e
 cfa8f7f1835eed422580505109fed36797bdc10a9168d5148daef6a8710c3df1d6366c9763ab4ebd359d86a8ea14819252fb52ba423422d1f60b0179316b3729e479ba07e88cb886938c8daae65d470dde91e5336e0fc4221a72cc49057d878aa5924875d097483e94bc44a4ea93aee8780e56c50a405932841f50da156e1f90559a7c4f76999442fb433a26fc703dea656bbe03790ac3c9c5318ff5f81d87d483524bbfe7ff167",
+          "show": "5b:2b:fe:1f:a0:06:86:78:34:41:21:84:af:9f:5b:23:97:37:76:3a:de:ad:71:40:8f:c0:1b:88:e5:48:b2:cc:86:f3:41:a3:97:71:c6:ed:16:f2:b0:bb:3e:6a:b6:10:9e:73:c7:d6:8c:a7:54:58:52:f9:19:30:e4:63:3c:17:fb:9d:c7:aa:79:4b:0d:82:0d:0f:a3:ac:65:bf:0f:01:3e:54:49:d5:95:3d:29:43:50:66:57:e2:b7:6b:54:8e:67:f5:c9:ce:1a:4c:53:db:1b:52:46:5b:de:72:08:ba:f1:1f:3f:e0:19:75:41:8b:4d:b1:86:a3:8a:d3:29:47:d1:90:8b:62:e5:32:da:4b:72:93:53:a9:32:42:3d:25:f5:f7:34:48:40:76:aa:41:43:c6:a7:49:37:a4:ea:49:44:8e:26:1a:e1:ec:b6:b0:7b:bd:f5:c9:8d:08:55:94:0a:19:01:8c:88:26:3b:89:36:f7:b3:e9:a4:b6:cd:98:09:0f:a1:0a:10:e3:7a:d2:0f:e5:d8:33:07:1a:d6:d5:b2:88:6b:a8:5e:c7:2a:ff:b8:3e:31:64:43:db:e2:9d:bf:64:3e:6a:a0:55:95:c9:07:65:cf:85:f6:da:55:cc:1c:09:d8:dc:cc:7d:05:da:02:24:29:ad:60:2a:55:9a:04:4b:7e:26:63:b0:c1:53:a3:01:1b:f8:24:ef:8d:1f:a5:6c:ba:95:7c:5f:5d:22:76:a1:c9:e9:2d:e6:57:82:f4:06:84:8c:6e:20:f6:34:c5:d1:fe:a8:43:a8:bf:1a:40:58:e8:55:53:f5:83:8f:72:99:95:8f:bf:54:be:84:e4:6c:5a:3c:39:65:
 f8:be:d7:fe:03:a9:a1:16:8a:89:2e:00:73:ad:eb:54:de:ca:17:1a:31:8d:11:fc:1a:81:79:f9:16:32:31:02:13:da:32:79:65:a4:0b:c6:fe:18:ea:e5:5e:8d:a6:b5:7d:7e:f9:f3:a0:5b:42:38:1b:cb:3d:b8:f8:ef:d6:d0:c6:38:a2:cd:d4:6e:fb:0b:8f:12:74:e9:86:72:f6:44:b2:27:59:47:e6:26:b0:2e:51:66:f8:6c:2d:d4:a6:7b:81:e2:13:f8:c0:64:92:7a:39:68:15:db:58:9f:10:e5:e5:21:ff:ed:b1:3f:8e:db:e2:de:01:c6:fc:8b:f0:e1:2c:82:21:2e:49:77:94:aa:04:5e:9b:6f:cc:a8:3b:4c:ad:0a:3b:5e:6c:a2:d1:fe:af:88:87:b4:d6:4f:22:98:93:96:ec:fa:8f:7f:18:35:ee:d4:22:58:05:05:10:9f:ed:36:79:7b:dc:10:a9:16:8d:51:48:da:ef:6a:87:10:c3:df:1d:63:66:c9:76:3a:b4:eb:d3:59:d8:6a:8e:a1:48:19:25:2f:b5:2b:a4:23:42:2d:1f:60:b0:17:93:16:b3:72:9e:47:9b:a0:7e:88:cb:88:69:38:c8:da:ae:65:d4:70:dd:e9:1e:53:36:e0:fc:42:21:a7:2c:c4:90:57:d8:78:aa:59:24:87:5d:09:74:83:e9:4b:c4:4a:4e:a9:3a:ee:87:80:e5:6c:50:a4:05:93:28:41:f5:0d:a1:56:e1:f9:05:59:a7:c4:f7:69:99:44:2f:b4:33:a2:6f:c7:03:de:a6:56:bb:e0:37:90:ac:3c:9c:53:18:ff:5f:81:d8:7d:48:35:24:bb:fe:7f:f1:67",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        }
+      ]
+    }
+  ]
+};

http://git-wip-us.apache.org/repos/asf/metron/blob/d5eb56a9/metron-interface/metron-alerts/src/app/pcap/pcap-packet/pcap-packet.component.ts
----------------------------------------------------------------------
diff --git a/metron-interface/metron-alerts/src/app/pcap/pcap-packet/pcap-packet.component.ts b/metron-interface/metron-alerts/src/app/pcap/pcap-packet/pcap-packet.component.ts
new file mode 100644
index 0000000..f1bbe2d
--- /dev/null
+++ b/metron-interface/metron-alerts/src/app/pcap/pcap-packet/pcap-packet.component.ts
@@ -0,0 +1,39 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { Component, OnInit, Input } from '@angular/core';
+
+import { PdmlPacket } from '../model/pdml'
+
+@Component({
+  selector: 'app-pcap-packet',
+  templateUrl: './pcap-packet.component.html',
+  styleUrls: ['./pcap-packet.component.scss']
+})
+export class PcapPacketComponent implements OnInit {
+  @Input() packet: PdmlPacket
+
+  constructor() { }
+
+  ngOnInit() {
+  }
+
+  toggle() {
+    this.packet.expanded = !this.packet.expanded
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/metron/blob/d5eb56a9/metron-interface/metron-alerts/src/app/pcap/pcap-panel/pcap-panel.component.html
----------------------------------------------------------------------
diff --git a/metron-interface/metron-alerts/src/app/pcap/pcap-panel/pcap-panel.component.html b/metron-interface/metron-alerts/src/app/pcap/pcap-panel/pcap-panel.component.html
new file mode 100644
index 0000000..b373914
--- /dev/null
+++ b/metron-interface/metron-alerts/src/app/pcap/pcap-panel/pcap-panel.component.html
@@ -0,0 +1,31 @@
+<!--
+  Licensed to the Apache Software
+	Foundation (ASF) under one or more contributor license agreements. See the
+	NOTICE file distributed with this work for additional information regarding
+	copyright ownership. The ASF licenses this file to You under the Apache License,
+	Version 2.0 (the "License"); you may not use this file except in compliance
+	with the License. You may obtain a copy of the License at
+  http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing, software distributed
+	under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
+	OR CONDITIONS OF ANY KIND, either express or implied. See the License for
+  the specific language governing permissions and limitations under the License.
+  -->
+<div class="panel my-4">
+  <div class="panel-header">
+    <app-pcap-filters [queryRunning]="queryRunning" (search)="onSearch($event)"></app-pcap-filters>
+  </div>
+
+  <div *ngIf="queryRunning" class="progress pcap-progress-background">
+      <div class="progress-bar progress-bar-animated pcap-progress" role="progressbar" attr.aria-valuenow="{{progressWidth}}" aria-valuemin="0" aria-valuemax="100" [ngStyle]="{'max-width': progressWidth + '%', 'transition-duration':'1000ms'}">{{progressWidth}}%</div>
+  </div>
+  
+  <div *ngIf="errorMsg" class="alert alert-danger" role="alert">
+    {{ errorMsg }}
+  </div>
+
+  <div class="panel-body" *ngIf="pdml">
+    <app-pcap-list [packets]="pdml.packets"></app-pcap-list>
+  </div>
+
+</div>

http://git-wip-us.apache.org/repos/asf/metron/blob/d5eb56a9/metron-interface/metron-alerts/src/app/pcap/pcap-panel/pcap-panel.component.scss
----------------------------------------------------------------------
diff --git a/metron-interface/metron-alerts/src/app/pcap/pcap-panel/pcap-panel.component.scss b/metron-interface/metron-alerts/src/app/pcap/pcap-panel/pcap-panel.component.scss
new file mode 100644
index 0000000..a8cc2ce
--- /dev/null
+++ b/metron-interface/metron-alerts/src/app/pcap/pcap-panel/pcap-panel.component.scss
@@ -0,0 +1,52 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+@import "../../../vendor.scss";
+@import "../../../styles.scss";
+@import "../../../variables.scss";
+
+.pcap-progress-background {
+  background-color: #2E2E2E;
+}
+
+.pcap-progress {
+  background-color: #0F6F9E;
+  transition-duration:2s;
+  animation-duration: 2s;
+}
+
+.progress-bar {
+  width: 0;
+  animation: progress 1.5s ease-in-out forwards;
+}
+
+@keyframes progress {
+  from {
+    width: 0;
+  }
+  to {
+    width: 100%;
+  }
+}
+@keyframes show  {
+  from {
+    opacity: 0;
+  }
+  to {
+    opacity: 1;
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/metron/blob/d5eb56a9/metron-interface/metron-alerts/src/app/pcap/pcap-panel/pcap-panel.component.spec.ts
----------------------------------------------------------------------
diff --git a/metron-interface/metron-alerts/src/app/pcap/pcap-panel/pcap-panel.component.spec.ts b/metron-interface/metron-alerts/src/app/pcap/pcap-panel/pcap-panel.component.spec.ts
new file mode 100644
index 0000000..82b29f2
--- /dev/null
+++ b/metron-interface/metron-alerts/src/app/pcap/pcap-panel/pcap-panel.component.spec.ts
@@ -0,0 +1,68 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { PcapPanelComponent } from './pcap-panel.component';
+import { Component, Input } from '../../../../node_modules/@angular/core';
+import { PdmlPacket } from '../model/pdml';
+import { PcapService } from '../service/pcap.service';
+
+@Component({
+  selector: 'app-pcap-filters',
+  template: '',
+})
+class FakeFilterComponent {
+  @Input() queryRunning: boolean;
+}
+
+@Component({
+  selector: 'app-pcap-list',
+  template: '',
+})
+class FakePcapListComponent {
+  @Input() packets: PdmlPacket[];
+}
+
+describe('PcapPanelComponent', () => {
+  let component: PcapPanelComponent;
+  let fixture: ComponentFixture<PcapPanelComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [
+        FakeFilterComponent,
+        FakePcapListComponent,
+        PcapPanelComponent,
+      ],
+      providers: [
+        { provide: PcapService, useValue: {} },
+      ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(PcapPanelComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});

http://git-wip-us.apache.org/repos/asf/metron/blob/d5eb56a9/metron-interface/metron-alerts/src/app/pcap/pcap-panel/pcap-panel.component.ts
----------------------------------------------------------------------
diff --git a/metron-interface/metron-alerts/src/app/pcap/pcap-panel/pcap-panel.component.ts b/metron-interface/metron-alerts/src/app/pcap/pcap-panel/pcap-panel.component.ts
new file mode 100644
index 0000000..fd49ec7
--- /dev/null
+++ b/metron-interface/metron-alerts/src/app/pcap/pcap-panel/pcap-panel.component.ts
@@ -0,0 +1,75 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { Component, OnInit, Input } from '@angular/core';
+
+import { PcapService, PcapStatusResponse } from '../service/pcap.service'
+import { PcapRequest } from '../model/pcap.request'
+import { Pdml } from '../model/pdml'
+import {Subscription} from "rxjs/Rx";
+
+@Component({
+  selector: 'app-pcap-panel',
+  templateUrl: './pcap-panel.component.html',
+  styleUrls: ['./pcap-panel.component.scss']
+})
+export class PcapPanelComponent implements OnInit {
+
+  @Input() pdml: Pdml = null;
+
+  @Input() pcapRequest: PcapRequest;
+
+  statusSubscription: Subscription;
+  queryRunning: boolean = false;
+  progressWidth: number = 0;
+  selectedPage: number = 1;
+  errorMsg: string;
+
+  constructor(private pcapService: PcapService ) { }
+
+  ngOnInit() {
+  }
+
+  onSearch(pcapRequest) {
+    console.log(pcapRequest);
+    this.pdml = null;
+    this.progressWidth = 0;
+    this.pcapService.submitRequest(pcapRequest).subscribe(id => {
+      this.queryRunning = true;
+      this.errorMsg = null;
+      this.statusSubscription = this.pcapService.pollStatus(id).subscribe((statusResponse: PcapStatusResponse) => {
+        if ('SUCCEEDED' === statusResponse.jobStatus) {
+          this.statusSubscription.unsubscribe();
+          this.queryRunning = false;
+          this.pcapService.getPackets(id, this.selectedPage).toPromise().then(pdml => {
+            this.pdml = pdml;
+          });
+        } else if ('FAILED' === statusResponse.jobStatus) {
+          this.statusSubscription.unsubscribe();
+          this.queryRunning = false;
+          this.errorMsg = `Query status: ${statusResponse.jobStatus}. Check your filter criteria and try again!`;
+        } else if (this.progressWidth < 100) {
+          this.progressWidth = Math.trunc(statusResponse.percentComplete);
+        }
+      }, (error: any) => {
+        this.statusSubscription.unsubscribe();
+        this.queryRunning = false;
+        this.errorMsg = `Response status: ${error.responseCode}. Something went wrong with your status request!`;
+      });
+    });
+  }
+}

http://git-wip-us.apache.org/repos/asf/metron/blob/d5eb56a9/metron-interface/metron-alerts/src/app/pcap/pcap.module.ts
----------------------------------------------------------------------
diff --git a/metron-interface/metron-alerts/src/app/pcap/pcap.module.ts b/metron-interface/metron-alerts/src/app/pcap/pcap.module.ts
new file mode 100644
index 0000000..c66b965
--- /dev/null
+++ b/metron-interface/metron-alerts/src/app/pcap/pcap.module.ts
@@ -0,0 +1,50 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import {NgModule} from '@angular/core';
+import { CommonModule } from '@angular/common';  
+import { FormsModule } from '@angular/forms';
+import { HttpModule } from '@angular/http';
+
+import { routing } from './pcap.routing';
+
+import { PcapListComponent } from './pcap-list/pcap-list.component';
+import { PcapPacketComponent } from './pcap-packet/pcap-packet.component';
+import { PcapFiltersComponent } from './pcap-filters/pcap-filters.component';
+import { PcapPanelComponent } from './pcap-panel/pcap-panel.component';
+import { PcapPacketLineComponent } from './pcap-packet-line/pcap-packet-line.component';
+
+import { PcapService } from './service/pcap.service'
+ 
+@NgModule({
+  imports: [
+    routing,
+    CommonModule,
+    FormsModule,
+    HttpModule    
+  ],
+  declarations: [
+    PcapListComponent,
+    PcapPacketComponent,
+    PcapFiltersComponent,
+    PcapPanelComponent,
+    PcapPacketLineComponent
+  ],
+  exports: [ PcapPanelComponent ],
+  providers: [ PcapService ]
+})
+export class PcapModule {}

http://git-wip-us.apache.org/repos/asf/metron/blob/d5eb56a9/metron-interface/metron-alerts/src/app/pcap/pcap.routing.ts
----------------------------------------------------------------------
diff --git a/metron-interface/metron-alerts/src/app/pcap/pcap.routing.ts b/metron-interface/metron-alerts/src/app/pcap/pcap.routing.ts
new file mode 100644
index 0000000..25ee0ed
--- /dev/null
+++ b/metron-interface/metron-alerts/src/app/pcap/pcap.routing.ts
@@ -0,0 +1,27 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { Routes, RouterModule } from '@angular/router';
+import { ModuleWithProviders }  from '@angular/core';
+
+import {PcapPanelComponent} from './pcap-panel/pcap-panel.component';
+
+export const routes: Routes = [
+    {path: '', component: PcapPanelComponent},
+];
+
+export const routing: ModuleWithProviders = RouterModule.forChild(routes);


[4/5] metron git commit: METRON-1671 Create PCAP UI (tiborm via merrimanr) closes apache/metron#1103

Posted by rm...@apache.org.
http://git-wip-us.apache.org/repos/asf/metron/blob/d5eb56a9/metron-interface/metron-alerts/package-lock.json
----------------------------------------------------------------------
diff --git a/metron-interface/metron-alerts/package-lock.json b/metron-interface/metron-alerts/package-lock.json
index 3ace2b7..7d3ad99 100644
--- a/metron-interface/metron-alerts/package-lock.json
+++ b/metron-interface/metron-alerts/package-lock.json
@@ -1,6 +1,6 @@
 {
   "name": "metron-alerts",
-  "version": "0.4.3",
+  "version": "0.5.1",
   "lockfileVersion": 1,
   "requires": true,
   "dependencies": {
@@ -12,66 +12,66 @@
       "requires": {
         "@ngtools/json-schema": "1.1.0",
         "@ngtools/webpack": "1.5.3",
-        "autoprefixer": "6.7.7",
-        "chalk": "2.3.0",
-        "circular-dependency-plugin": "3.0.0",
-        "common-tags": "1.5.1",
-        "core-object": "3.1.5",
-        "css-loader": "0.28.7",
-        "cssnano": "3.10.0",
-        "denodeify": "1.2.1",
-        "diff": "3.2.0",
-        "ember-cli-normalize-entity-name": "1.0.0",
-        "ember-cli-string-utils": "1.1.0",
-        "exports-loader": "0.6.4",
-        "extract-text-webpack-plugin": "2.1.2",
-        "file-loader": "0.10.1",
-        "fs-extra": "4.0.2",
-        "get-caller-file": "1.0.2",
-        "glob": "7.1.2",
-        "heimdalljs": "0.2.5",
-        "heimdalljs-logger": "0.1.9",
-        "html-webpack-plugin": "2.30.1",
-        "inflection": "1.12.0",
-        "inquirer": "3.3.0",
-        "isbinaryfile": "3.0.2",
-        "istanbul-instrumenter-loader": "2.0.0",
-        "json-loader": "0.5.7",
-        "karma-source-map-support": "1.2.0",
-        "less": "2.7.3",
-        "less-loader": "4.0.5",
-        "license-webpack-plugin": "0.4.3",
-        "lodash": "4.17.4",
-        "memory-fs": "0.4.1",
-        "minimatch": "3.0.4",
-        "node-modules-path": "1.0.1",
-        "node-sass": "4.5.3",
-        "nopt": "4.0.1",
-        "opn": "5.1.0",
-        "portfinder": "1.0.13",
-        "postcss-loader": "1.3.3",
-        "postcss-url": "5.1.2",
-        "raw-loader": "0.5.1",
-        "resolve": "1.3.3",
-        "rsvp": "3.6.2",
-        "rxjs": "5.4.0",
-        "sass-loader": "6.0.6",
-        "script-loader": "0.7.2",
-        "semver": "5.3.0",
-        "silent-error": "1.1.0",
-        "source-map-loader": "0.2.3",
-        "style-loader": "0.13.2",
-        "stylus": "0.54.5",
-        "stylus-loader": "3.0.1",
+        "autoprefixer": "^6.5.3",
+        "chalk": "^2.0.1",
+        "circular-dependency-plugin": "^3.0.0",
+        "common-tags": "^1.3.1",
+        "core-object": "^3.1.0",
+        "css-loader": "^0.28.1",
+        "cssnano": "^3.10.0",
+        "denodeify": "^1.2.1",
+        "diff": "^3.1.0",
+        "ember-cli-normalize-entity-name": "^1.0.0",
+        "ember-cli-string-utils": "^1.0.0",
+        "exports-loader": "^0.6.3",
+        "extract-text-webpack-plugin": "^2.1.0",
+        "file-loader": "^0.10.0",
+        "fs-extra": "^4.0.0",
+        "get-caller-file": "^1.0.0",
+        "glob": "^7.0.3",
+        "heimdalljs": "^0.2.4",
+        "heimdalljs-logger": "^0.1.9",
+        "html-webpack-plugin": "^2.19.0",
+        "inflection": "^1.7.0",
+        "inquirer": "^3.0.0",
+        "isbinaryfile": "^3.0.0",
+        "istanbul-instrumenter-loader": "^2.0.0",
+        "json-loader": "^0.5.4",
+        "karma-source-map-support": "^1.2.0",
+        "less": "^2.7.2",
+        "less-loader": "^4.0.2",
+        "license-webpack-plugin": "^0.4.2",
+        "lodash": "^4.11.1",
+        "memory-fs": "^0.4.1",
+        "minimatch": "^3.0.3",
+        "node-modules-path": "^1.0.0",
+        "node-sass": "^4.3.0",
+        "nopt": "^4.0.1",
+        "opn": "~5.1.0",
+        "portfinder": "~1.0.12",
+        "postcss-loader": "^1.3.3",
+        "postcss-url": "^5.1.2",
+        "raw-loader": "^0.5.1",
+        "resolve": "^1.1.7",
+        "rsvp": "^3.0.17",
+        "rxjs": "^5.0.1",
+        "sass-loader": "^6.0.3",
+        "script-loader": "^0.7.0",
+        "semver": "^5.1.0",
+        "silent-error": "^1.0.0",
+        "source-map-loader": "^0.2.0",
+        "style-loader": "^0.13.1",
+        "stylus": "^0.54.5",
+        "stylus-loader": "^3.0.1",
         "temp": "0.8.3",
-        "typescript": "2.2.2",
-        "url-loader": "0.5.9",
-        "walk-sync": "0.3.2",
-        "webpack": "2.4.1",
-        "webpack-dev-middleware": "1.12.2",
-        "webpack-dev-server": "2.4.5",
-        "webpack-merge": "2.6.1",
-        "zone.js": "0.8.18"
+        "typescript": ">=2.0.0 <2.4.0",
+        "url-loader": "^0.5.7",
+        "walk-sync": "^0.3.1",
+        "webpack": "~2.4.0",
+        "webpack-dev-middleware": "^1.10.2",
+        "webpack-dev-server": "~2.4.5",
+        "webpack-merge": "^2.4.0",
+        "zone.js": "^0.8.14"
       },
       "dependencies": {
         "ansi-styles": {
@@ -80,7 +80,7 @@
           "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
           "dev": true,
           "requires": {
-            "color-convert": "1.9.1"
+            "color-convert": "^1.9.0"
           }
         },
         "chalk": {
@@ -89,9 +89,9 @@
           "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
           "dev": true,
           "requires": {
-            "ansi-styles": "3.2.0",
-            "escape-string-regexp": "1.0.5",
-            "supports-color": "4.5.0"
+            "ansi-styles": "^3.1.0",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^4.0.0"
           }
         },
         "has-flag": {
@@ -106,7 +106,7 @@
           "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
           "dev": true,
           "requires": {
-            "has-flag": "2.0.0"
+            "has-flag": "^2.0.0"
           }
         },
         "zone.js": {
@@ -134,8 +134,8 @@
       "dev": true,
       "requires": {
         "@angular/tsc-wrapped": "4.1.3",
-        "minimist": "1.2.0",
-        "reflect-metadata": "0.1.10"
+        "minimist": "^1.2.0",
+        "reflect-metadata": "^0.1.2"
       },
       "dependencies": {
         "minimist": {
@@ -182,7 +182,7 @@
       "integrity": "sha1-LWNyyRh78WIerNlguUs5xPlSk80=",
       "dev": true,
       "requires": {
-        "tsickle": "0.21.6"
+        "tsickle": "^0.21.0"
       }
     },
     "@ngtools/json-schema": {
@@ -198,9 +198,9 @@
       "dev": true,
       "requires": {
         "enhanced-resolve": "3.3.0",
-        "loader-utils": "1.1.0",
-        "magic-string": "0.22.4",
-        "source-map": "0.5.6"
+        "loader-utils": "^1.0.2",
+        "magic-string": "^0.22.3",
+        "source-map": "^0.5.6"
       }
     },
     "@types/ace": {
@@ -227,7 +227,7 @@
       "integrity": "sha1-YE69GJvDvDShVIaJQE5hoqSqyJY=",
       "dev": true,
       "requires": {
-        "moment": "2.19.2"
+        "moment": "*"
       }
     },
     "@types/node": {
@@ -242,7 +242,7 @@
       "integrity": "sha1-040HYaJnOzjAjgULvQieYcw8LRc=",
       "dev": true,
       "requires": {
-        "moment": "2.19.2"
+        "moment": ">=2.14.0"
       }
     },
     "@types/q": {
@@ -269,7 +269,7 @@
       "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=",
       "dev": true,
       "requires": {
-        "mime-types": "2.1.15",
+        "mime-types": "~2.1.11",
         "negotiator": "0.6.1"
       }
     },
@@ -290,7 +290,7 @@
       "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=",
       "dev": true,
       "requires": {
-        "acorn": "4.0.13"
+        "acorn": "^4.0.3"
       },
       "dependencies": {
         "acorn": {
@@ -319,8 +319,8 @@
       "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=",
       "dev": true,
       "requires": {
-        "extend": "3.0.1",
-        "semver": "5.0.3"
+        "extend": "~3.0.0",
+        "semver": "~5.0.1"
       },
       "dependencies": {
         "semver": {
@@ -337,8 +337,8 @@
       "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=",
       "dev": true,
       "requires": {
-        "co": "4.6.0",
-        "json-stable-stringify": "1.0.1"
+        "co": "^4.6.0",
+        "json-stable-stringify": "^1.0.1"
       }
     },
     "ajv-keywords": {
@@ -353,9 +353,9 @@
       "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
       "dev": true,
       "requires": {
-        "kind-of": "3.2.2",
-        "longest": "1.0.1",
-        "repeat-string": "1.6.1"
+        "kind-of": "^3.0.2",
+        "longest": "^1.0.1",
+        "repeat-string": "^1.5.2"
       }
     },
     "alphanum-sort": {
@@ -376,7 +376,7 @@
       "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=",
       "dev": true,
       "requires": {
-        "string-width": "2.0.0"
+        "string-width": "^2.0.0"
       }
     },
     "ansi-escapes": {
@@ -415,8 +415,8 @@
       "integrity": "sha1-o+Uvo5FoyCX/V7AkgSbOWo/5VQc=",
       "dev": true,
       "requires": {
-        "arrify": "1.0.1",
-        "micromatch": "2.3.11"
+        "arrify": "^1.0.0",
+        "micromatch": "^2.1.5"
       }
     },
     "app-root-path": {
@@ -431,7 +431,7 @@
       "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=",
       "dev": true,
       "requires": {
-        "default-require-extensions": "1.0.0"
+        "default-require-extensions": "^1.0.0"
       }
     },
     "aproba": {
@@ -446,8 +446,8 @@
       "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=",
       "dev": true,
       "requires": {
-        "delegates": "1.0.0",
-        "readable-stream": "2.2.11"
+        "delegates": "^1.0.0",
+        "readable-stream": "^2.0.6"
       }
     },
     "argparse": {
@@ -456,7 +456,7 @@
       "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=",
       "dev": true,
       "requires": {
-        "sprintf-js": "1.0.3"
+        "sprintf-js": "~1.0.2"
       }
     },
     "arr-diff": {
@@ -465,7 +465,7 @@
       "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
       "dev": true,
       "requires": {
-        "arr-flatten": "1.0.3"
+        "arr-flatten": "^1.0.1"
       }
     },
     "arr-flatten": {
@@ -498,7 +498,7 @@
       "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
       "dev": true,
       "requires": {
-        "array-uniq": "1.0.3"
+        "array-uniq": "^1.0.1"
       }
     },
     "array-uniq": {
@@ -544,9 +544,9 @@
       "integrity": "sha1-gRfvT37YfNj4kES1v/l6wkOhbJo=",
       "dev": true,
       "requires": {
-        "bn.js": "4.11.8",
-        "inherits": "2.0.3",
-        "minimalistic-assert": "1.0.0"
+        "bn.js": "^4.0.0",
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0"
       }
     },
     "assert": {
@@ -570,7 +570,7 @@
       "integrity": "sha1-YqVrJ5yYoR0JhwlqAcw+6463u9c=",
       "dev": true,
       "requires": {
-        "lodash": "4.17.4"
+        "lodash": "^4.14.0"
       }
     },
     "async-each": {
@@ -585,6 +585,12 @@
       "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=",
       "dev": true
     },
+    "async-limiter": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
+      "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==",
+      "dev": true
+    },
     "asynckit": {
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@@ -602,12 +608,12 @@
       "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=",
       "dev": true,
       "requires": {
-        "browserslist": "1.7.7",
-        "caniuse-db": "1.0.30000772",
-        "normalize-range": "0.1.2",
-        "num2fraction": "1.2.2",
-        "postcss": "5.2.18",
-        "postcss-value-parser": "3.3.0"
+        "browserslist": "^1.7.6",
+        "caniuse-db": "^1.0.30000634",
+        "normalize-range": "^0.1.2",
+        "num2fraction": "^1.2.2",
+        "postcss": "^5.2.16",
+        "postcss-value-parser": "^3.2.3"
       }
     },
     "aws-sign2": {
@@ -628,9 +634,9 @@
       "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=",
       "dev": true,
       "requires": {
-        "chalk": "1.1.3",
-        "esutils": "2.0.2",
-        "js-tokens": "3.0.1"
+        "chalk": "^1.1.0",
+        "esutils": "^2.0.2",
+        "js-tokens": "^3.0.0"
       }
     },
     "babel-generator": {
@@ -639,14 +645,14 @@
       "integrity": "sha1-5xX0hsWN7SVknYiJRNUqoHxdlJc=",
       "dev": true,
       "requires": {
-        "babel-messages": "6.23.0",
-        "babel-runtime": "6.23.0",
-        "babel-types": "6.24.1",
-        "detect-indent": "4.0.0",
-        "jsesc": "1.3.0",
-        "lodash": "4.17.4",
-        "source-map": "0.5.6",
-        "trim-right": "1.0.1"
+        "babel-messages": "^6.23.0",
+        "babel-runtime": "^6.22.0",
+        "babel-types": "^6.24.1",
+        "detect-indent": "^4.0.0",
+        "jsesc": "^1.3.0",
+        "lodash": "^4.2.0",
+        "source-map": "^0.5.0",
+        "trim-right": "^1.0.1"
       },
       "dependencies": {
         "jsesc": {
@@ -663,7 +669,7 @@
       "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
       "dev": true,
       "requires": {
-        "babel-runtime": "6.23.0"
+        "babel-runtime": "^6.22.0"
       }
     },
     "babel-runtime": {
@@ -672,8 +678,8 @@
       "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=",
       "dev": true,
       "requires": {
-        "core-js": "2.4.1",
-        "regenerator-runtime": "0.10.5"
+        "core-js": "^2.4.0",
+        "regenerator-runtime": "^0.10.0"
       }
     },
     "babel-template": {
@@ -682,11 +688,11 @@
       "integrity": "sha1-BK5RTx+Ts6JTfyoPYKWkX7gwgzM=",
       "dev": true,
       "requires": {
-        "babel-runtime": "6.23.0",
-        "babel-traverse": "6.24.1",
-        "babel-types": "6.24.1",
-        "babylon": "6.17.2",
-        "lodash": "4.17.4"
+        "babel-runtime": "^6.22.0",
+        "babel-traverse": "^6.24.1",
+        "babel-types": "^6.24.1",
+        "babylon": "^6.11.0",
+        "lodash": "^4.2.0"
       }
     },
     "babel-traverse": {
@@ -695,15 +701,15 @@
       "integrity": "sha1-qzZnP9NW+aCUhlnnszjV/q2zFpU=",
       "dev": true,
       "requires": {
-        "babel-code-frame": "6.22.0",
-        "babel-messages": "6.23.0",
-        "babel-runtime": "6.23.0",
-        "babel-types": "6.24.1",
-        "babylon": "6.17.2",
-        "debug": "2.6.8",
-        "globals": "9.18.0",
-        "invariant": "2.2.2",
-        "lodash": "4.17.4"
+        "babel-code-frame": "^6.22.0",
+        "babel-messages": "^6.23.0",
+        "babel-runtime": "^6.22.0",
+        "babel-types": "^6.24.1",
+        "babylon": "^6.15.0",
+        "debug": "^2.2.0",
+        "globals": "^9.0.0",
+        "invariant": "^2.2.0",
+        "lodash": "^4.2.0"
       }
     },
     "babel-types": {
@@ -712,10 +718,10 @@
       "integrity": "sha1-oTaHncFbNga9oNkMH8dDBML/CXU=",
       "dev": true,
       "requires": {
-        "babel-runtime": "6.23.0",
-        "esutils": "2.0.2",
-        "lodash": "4.17.4",
-        "to-fast-properties": "1.0.3"
+        "babel-runtime": "^6.22.0",
+        "esutils": "^2.0.2",
+        "lodash": "^4.2.0",
+        "to-fast-properties": "^1.0.1"
       }
     },
     "babylon": {
@@ -767,7 +773,7 @@
       "dev": true,
       "optional": true,
       "requires": {
-        "tweetnacl": "0.14.5"
+        "tweetnacl": "^0.14.3"
       }
     },
     "better-assert": {
@@ -803,7 +809,7 @@
       "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
       "dev": true,
       "requires": {
-        "inherits": "2.0.3"
+        "inherits": "~2.0.0"
       }
     },
     "blocking-proxy": {
@@ -812,7 +818,7 @@
       "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==",
       "dev": true,
       "requires": {
-        "minimist": "1.2.0"
+        "minimist": "^1.2.0"
       },
       "dependencies": {
         "minimist": {
@@ -842,15 +848,15 @@
       "dev": true,
       "requires": {
         "bytes": "2.4.0",
-        "content-type": "1.0.2",
+        "content-type": "~1.0.2",
         "debug": "2.6.7",
-        "depd": "1.1.0",
-        "http-errors": "1.6.1",
+        "depd": "~1.1.0",
+        "http-errors": "~1.6.1",
         "iconv-lite": "0.4.15",
-        "on-finished": "2.3.0",
+        "on-finished": "~2.3.0",
         "qs": "6.4.0",
-        "raw-body": "2.2.0",
-        "type-is": "1.6.15"
+        "raw-body": "~2.2.0",
+        "type-is": "~1.6.15"
       },
       "dependencies": {
         "bytes": {
@@ -888,7 +894,7 @@
       "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
       "dev": true,
       "requires": {
-        "hoek": "2.16.3"
+        "hoek": "2.x.x"
       }
     },
     "bootstrap": {
@@ -896,8 +902,8 @@
       "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.0.0-alpha.6.tgz",
       "integrity": "sha1-T1TdM6wN6sOyhAe8LffsYIhpycg=",
       "requires": {
-        "jquery": "3.2.1",
-        "tether": "1.4.0"
+        "jquery": ">=1.9.1",
+        "tether": "^1.4.0"
       }
     },
     "boxen": {
@@ -906,13 +912,13 @@
       "integrity": "sha1-sbad1SIwXoB6md7ud329blFnsQI=",
       "dev": true,
       "requires": {
-        "ansi-align": "2.0.0",
-        "camelcase": "4.1.0",
-        "chalk": "1.1.3",
-        "cli-boxes": "1.0.0",
-        "string-width": "2.0.0",
-        "term-size": "0.1.1",
-        "widest-line": "1.0.0"
+        "ansi-align": "^2.0.0",
+        "camelcase": "^4.0.0",
+        "chalk": "^1.1.1",
+        "cli-boxes": "^1.0.0",
+        "string-width": "^2.0.0",
+        "term-size": "^0.1.0",
+        "widest-line": "^1.0.0"
       },
       "dependencies": {
         "camelcase": {
@@ -929,7 +935,7 @@
       "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=",
       "dev": true,
       "requires": {
-        "balanced-match": "0.4.2",
+        "balanced-match": "^0.4.1",
         "concat-map": "0.0.1"
       }
     },
@@ -939,9 +945,9 @@
       "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
       "dev": true,
       "requires": {
-        "expand-range": "1.8.2",
-        "preserve": "0.2.0",
-        "repeat-element": "1.1.2"
+        "expand-range": "^1.8.1",
+        "preserve": "^0.2.0",
+        "repeat-element": "^1.1.2"
       }
     },
     "brorand": {
@@ -956,12 +962,12 @@
       "integrity": "sha1-OLerVe24Bv8tzaGn8WIHc6R3xJ8=",
       "dev": true,
       "requires": {
-        "buffer-xor": "1.0.3",
-        "cipher-base": "1.0.4",
-        "create-hash": "1.1.3",
-        "evp_bytestokey": "1.0.3",
-        "inherits": "2.0.3",
-        "safe-buffer": "5.0.1"
+        "buffer-xor": "^1.0.3",
+        "cipher-base": "^1.0.0",
+        "create-hash": "^1.1.0",
+        "evp_bytestokey": "^1.0.3",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
       }
     },
     "browserify-cipher": {
@@ -970,9 +976,9 @@
       "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=",
       "dev": true,
       "requires": {
-        "browserify-aes": "1.1.1",
-        "browserify-des": "1.0.0",
-        "evp_bytestokey": "1.0.3"
+        "browserify-aes": "^1.0.4",
+        "browserify-des": "^1.0.0",
+        "evp_bytestokey": "^1.0.0"
       }
     },
     "browserify-des": {
@@ -981,9 +987,9 @@
       "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=",
       "dev": true,
       "requires": {
-        "cipher-base": "1.0.4",
-        "des.js": "1.0.0",
-        "inherits": "2.0.3"
+        "cipher-base": "^1.0.1",
+        "des.js": "^1.0.0",
+        "inherits": "^2.0.1"
       }
     },
     "browserify-rsa": {
@@ -992,8 +998,8 @@
       "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
       "dev": true,
       "requires": {
-        "bn.js": "4.11.8",
-        "randombytes": "2.0.5"
+        "bn.js": "^4.1.0",
+        "randombytes": "^2.0.1"
       }
     },
     "browserify-sign": {
@@ -1002,13 +1008,13 @@
       "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
       "dev": true,
       "requires": {
-        "bn.js": "4.11.8",
-        "browserify-rsa": "4.0.1",
-        "create-hash": "1.1.3",
-        "create-hmac": "1.1.6",
-        "elliptic": "6.4.0",
-        "inherits": "2.0.3",
-        "parse-asn1": "5.1.0"
+        "bn.js": "^4.1.1",
+        "browserify-rsa": "^4.0.0",
+        "create-hash": "^1.1.0",
+        "create-hmac": "^1.1.2",
+        "elliptic": "^6.0.0",
+        "inherits": "^2.0.1",
+        "parse-asn1": "^5.0.0"
       }
     },
     "browserify-zlib": {
@@ -1017,7 +1023,7 @@
       "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=",
       "dev": true,
       "requires": {
-        "pako": "1.0.6"
+        "pako": "~1.0.5"
       }
     },
     "browserslist": {
@@ -1026,8 +1032,8 @@
       "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=",
       "dev": true,
       "requires": {
-        "caniuse-db": "1.0.30000772",
-        "electron-to-chromium": "1.3.27"
+        "caniuse-db": "^1.0.30000639",
+        "electron-to-chromium": "^1.2.7"
       }
     },
     "buffer": {
@@ -1036,11 +1042,17 @@
       "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
       "dev": true,
       "requires": {
-        "base64-js": "1.2.1",
-        "ieee754": "1.1.8",
-        "isarray": "1.0.0"
+        "base64-js": "^1.0.2",
+        "ieee754": "^1.1.4",
+        "isarray": "^1.0.0"
       }
     },
+    "buffer-from": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz",
+      "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==",
+      "dev": true
+    },
     "buffer-xor": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
@@ -1077,8 +1089,8 @@
       "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
       "dev": true,
       "requires": {
-        "no-case": "2.3.2",
-        "upper-case": "1.1.3"
+        "no-case": "^2.2.0",
+        "upper-case": "^1.1.1"
       }
     },
     "camelcase": {
@@ -1093,8 +1105,8 @@
       "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
       "dev": true,
       "requires": {
-        "camelcase": "2.1.1",
-        "map-obj": "1.0.1"
+        "camelcase": "^2.0.0",
+        "map-obj": "^1.0.0"
       }
     },
     "caniuse-api": {
@@ -1103,10 +1115,10 @@
       "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=",
       "dev": true,
       "requires": {
-        "browserslist": "1.7.7",
-        "caniuse-db": "1.0.30000772",
-        "lodash.memoize": "4.1.2",
-        "lodash.uniq": "4.5.0"
+        "browserslist": "^1.3.6",
+        "caniuse-db": "^1.0.30000529",
+        "lodash.memoize": "^4.1.2",
+        "lodash.uniq": "^4.5.0"
       }
     },
     "caniuse-db": {
@@ -1133,8 +1145,8 @@
       "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
       "dev": true,
       "requires": {
-        "align-text": "0.1.4",
-        "lazy-cache": "1.0.4"
+        "align-text": "^0.1.3",
+        "lazy-cache": "^1.0.3"
       }
     },
     "chalk": {
@@ -1143,11 +1155,11 @@
       "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
       "dev": true,
       "requires": {
-        "ansi-styles": "2.2.1",
-        "escape-string-regexp": "1.0.5",
-        "has-ansi": "2.0.0",
-        "strip-ansi": "3.0.1",
-        "supports-color": "2.0.0"
+        "ansi-styles": "^2.2.1",
+        "escape-string-regexp": "^1.0.2",
+        "has-ansi": "^2.0.0",
+        "strip-ansi": "^3.0.0",
+        "supports-color": "^2.0.0"
       },
       "dependencies": {
         "supports-color": {
@@ -1170,15 +1182,15 @@
       "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
       "dev": true,
       "requires": {
-        "anymatch": "1.3.0",
-        "async-each": "1.0.1",
-        "fsevents": "1.1.1",
-        "glob-parent": "2.0.0",
-        "inherits": "2.0.3",
-        "is-binary-path": "1.0.1",
-        "is-glob": "2.0.1",
-        "path-is-absolute": "1.0.1",
-        "readdirp": "2.1.0"
+        "anymatch": "^1.3.0",
+        "async-each": "^1.0.0",
+        "fsevents": "^1.0.0",
+        "glob-parent": "^2.0.0",
+        "inherits": "^2.0.1",
+        "is-binary-path": "^1.0.0",
+        "is-glob": "^2.0.0",
+        "path-is-absolute": "^1.0.0",
+        "readdirp": "^2.0.0"
       }
     },
     "cipher-base": {
@@ -1187,8 +1199,8 @@
       "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=",
       "dev": true,
       "requires": {
-        "inherits": "2.0.3",
-        "safe-buffer": "5.0.1"
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
       }
     },
     "circular-dependency-plugin": {
@@ -1203,7 +1215,7 @@
       "integrity": "sha1-TzZ0WzIAhJJVf0ZBLWbVDLmbzlE=",
       "dev": true,
       "requires": {
-        "chalk": "1.1.3"
+        "chalk": "^1.1.3"
       }
     },
     "clean-css": {
@@ -1212,7 +1224,7 @@
       "integrity": "sha1-Nc7ornaHpJuYA09w3gDE7dOCYwE=",
       "dev": true,
       "requires": {
-        "source-map": "0.5.6"
+        "source-map": "0.5.x"
       }
     },
     "cli-boxes": {
@@ -1227,7 +1239,7 @@
       "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
       "dev": true,
       "requires": {
-        "restore-cursor": "2.0.0"
+        "restore-cursor": "^2.0.0"
       }
     },
     "cli-width": {
@@ -1242,9 +1254,9 @@
       "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
       "dev": true,
       "requires": {
-        "string-width": "1.0.2",
-        "strip-ansi": "3.0.1",
-        "wrap-ansi": "2.1.0"
+        "string-width": "^1.0.1",
+        "strip-ansi": "^3.0.1",
+        "wrap-ansi": "^2.0.0"
       },
       "dependencies": {
         "is-fullwidth-code-point": {
@@ -1253,7 +1265,7 @@
           "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
           "dev": true,
           "requires": {
-            "number-is-nan": "1.0.1"
+            "number-is-nan": "^1.0.0"
           }
         },
         "string-width": {
@@ -1262,9 +1274,9 @@
           "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
           "dev": true,
           "requires": {
-            "code-point-at": "1.1.0",
-            "is-fullwidth-code-point": "1.0.0",
-            "strip-ansi": "3.0.1"
+            "code-point-at": "^1.0.0",
+            "is-fullwidth-code-point": "^1.0.0",
+            "strip-ansi": "^3.0.0"
           }
         }
       }
@@ -1281,10 +1293,10 @@
       "integrity": "sha1-NIxhrpzb4O3+BT2R/0zFIdeQ7eg=",
       "dev": true,
       "requires": {
-        "for-own": "1.0.0",
-        "is-plain-object": "2.0.4",
-        "kind-of": "3.2.2",
-        "shallow-clone": "0.1.2"
+        "for-own": "^1.0.0",
+        "is-plain-object": "^2.0.1",
+        "kind-of": "^3.2.2",
+        "shallow-clone": "^0.1.2"
       },
       "dependencies": {
         "for-own": {
@@ -1293,7 +1305,7 @@
           "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
           "dev": true,
           "requires": {
-            "for-in": "1.0.2"
+            "for-in": "^1.0.1"
           }
         }
       }
@@ -1310,7 +1322,7 @@
       "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=",
       "dev": true,
       "requires": {
-        "q": "1.5.0"
+        "q": "^1.1.2"
       }
     },
     "code-point-at": {
@@ -1325,12 +1337,12 @@
       "integrity": "sha1-0PcSH2eoQkyS0h07MfNkC4Pe+e0=",
       "dev": true,
       "requires": {
-        "app-root-path": "2.0.1",
-        "css-selector-tokenizer": "0.7.0",
-        "cssauron": "1.4.0",
-        "semver-dsl": "1.0.1",
-        "source-map": "0.5.6",
-        "sprintf-js": "1.0.3"
+        "app-root-path": "^2.0.1",
+        "css-selector-tokenizer": "^0.7.0",
+        "cssauron": "^1.4.0",
+        "semver-dsl": "^1.0.1",
+        "source-map": "^0.5.6",
+        "sprintf-js": "^1.0.3"
       }
     },
     "color": {
@@ -1339,9 +1351,9 @@
       "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=",
       "dev": true,
       "requires": {
-        "clone": "1.0.3",
-        "color-convert": "1.9.1",
-        "color-string": "0.3.0"
+        "clone": "^1.0.2",
+        "color-convert": "^1.3.0",
+        "color-string": "^0.3.0"
       }
     },
     "color-convert": {
@@ -1350,7 +1362,7 @@
       "integrity": "sha1-wSYRB66y8pTr/+ye2eytUppgl+0=",
       "dev": true,
       "requires": {
-        "color-name": "1.1.3"
+        "color-name": "^1.1.1"
       }
     },
     "color-name": {
@@ -1365,7 +1377,7 @@
       "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=",
       "dev": true,
       "requires": {
-        "color-name": "1.1.3"
+        "color-name": "^1.0.0"
       }
     },
     "colormin": {
@@ -1374,9 +1386,9 @@
       "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=",
       "dev": true,
       "requires": {
-        "color": "0.11.4",
+        "color": "^0.11.0",
         "css-color-names": "0.0.4",
-        "has": "1.0.1"
+        "has": "^1.0.1"
       }
     },
     "colors": {
@@ -1391,7 +1403,7 @@
       "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=",
       "dev": true,
       "requires": {
-        "lodash": "4.17.4"
+        "lodash": "^4.5.0"
       }
     },
     "combined-stream": {
@@ -1400,7 +1412,7 @@
       "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=",
       "dev": true,
       "requires": {
-        "delayed-stream": "1.0.0"
+        "delayed-stream": "~1.0.0"
       }
     },
     "commander": {
@@ -1415,7 +1427,7 @@
       "integrity": "sha1-4uOZMaATzQIlPe/u2Joa1hWifwc=",
       "dev": true,
       "requires": {
-        "babel-runtime": "6.26.0"
+        "babel-runtime": "^6.26.0"
       },
       "dependencies": {
         "babel-runtime": {
@@ -1424,8 +1436,8 @@
           "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
           "dev": true,
           "requires": {
-            "core-js": "2.4.1",
-            "regenerator-runtime": "0.11.0"
+            "core-js": "^2.4.0",
+            "regenerator-runtime": "^0.11.0"
           }
         },
         "regenerator-runtime": {
@@ -1460,7 +1472,7 @@
       "integrity": "sha1-/tocf3YXkScyspv4zyYlKiC57s0=",
       "dev": true,
       "requires": {
-        "mime-db": "1.27.0"
+        "mime-db": ">= 1.27.0 < 2"
       }
     },
     "compression": {
@@ -1469,12 +1481,12 @@
       "integrity": "sha1-zOsSHsydCcUtetDDNQ6pPd1AK8M=",
       "dev": true,
       "requires": {
-        "accepts": "1.3.3",
+        "accepts": "~1.3.3",
         "bytes": "2.3.0",
-        "compressible": "2.0.10",
-        "debug": "2.2.0",
-        "on-headers": "1.0.1",
-        "vary": "1.1.1"
+        "compressible": "~2.0.8",
+        "debug": "~2.2.0",
+        "on-headers": "~1.0.1",
+        "vary": "~1.1.0"
       },
       "dependencies": {
         "debug": {
@@ -1500,18 +1512,30 @@
       "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
       "dev": true
     },
+    "concat-stream": {
+      "version": "1.6.2",
+      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+      "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+      "dev": true,
+      "requires": {
+        "buffer-from": "^1.0.0",
+        "inherits": "^2.0.3",
+        "readable-stream": "^2.2.2",
+        "typedarray": "^0.0.6"
+      }
+    },
     "configstore": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.0.tgz",
       "integrity": "sha1-Rd+QcHPibfoc9LLVL1tgVF6qEdE=",
       "dev": true,
       "requires": {
-        "dot-prop": "4.1.1",
-        "graceful-fs": "4.1.11",
-        "make-dir": "1.0.0",
-        "unique-string": "1.0.0",
-        "write-file-atomic": "2.1.0",
-        "xdg-basedir": "3.0.0"
+        "dot-prop": "^4.1.0",
+        "graceful-fs": "^4.1.2",
+        "make-dir": "^1.0.0",
+        "unique-string": "^1.0.0",
+        "write-file-atomic": "^2.0.0",
+        "xdg-basedir": "^3.0.0"
       }
     },
     "connect": {
@@ -1522,7 +1546,7 @@
       "requires": {
         "debug": "2.6.7",
         "finalhandler": "1.0.3",
-        "parseurl": "1.3.1",
+        "parseurl": "~1.3.1",
         "utils-merge": "1.0.0"
       },
       "dependencies": {
@@ -1549,7 +1573,7 @@
       "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
       "dev": true,
       "requires": {
-        "date-now": "0.1.4"
+        "date-now": "^0.1.4"
       }
     },
     "console-control-strings": {
@@ -1614,7 +1638,7 @@
       "integrity": "sha1-+mJ7h1Aq3JgEXkRnjpqOw7nA0qk=",
       "dev": true,
       "requires": {
-        "chalk": "2.3.0"
+        "chalk": "^2.0.0"
       },
       "dependencies": {
         "ansi-styles": {
@@ -1623,7 +1647,7 @@
           "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
           "dev": true,
           "requires": {
-            "color-convert": "1.9.1"
+            "color-convert": "^1.9.0"
           }
         },
         "chalk": {
@@ -1632,9 +1656,9 @@
           "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
           "dev": true,
           "requires": {
-            "ansi-styles": "3.2.0",
-            "escape-string-regexp": "1.0.5",
-            "supports-color": "4.5.0"
+            "ansi-styles": "^3.1.0",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^4.0.0"
           }
         },
         "has-flag": {
@@ -1649,7 +1673,7 @@
           "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
           "dev": true,
           "requires": {
-            "has-flag": "2.0.0"
+            "has-flag": "^2.0.0"
           }
         }
       }
@@ -1666,13 +1690,13 @@
       "integrity": "sha1-YXPOvVb6wELB9DkO33r2wHx8uJI=",
       "dev": true,
       "requires": {
-        "is-directory": "0.3.1",
-        "js-yaml": "3.7.0",
-        "minimist": "1.2.0",
-        "object-assign": "4.1.1",
-        "os-homedir": "1.0.2",
-        "parse-json": "2.2.0",
-        "require-from-string": "1.2.1"
+        "is-directory": "^0.3.1",
+        "js-yaml": "^3.4.3",
+        "minimist": "^1.2.0",
+        "object-assign": "^4.1.0",
+        "os-homedir": "^1.0.1",
+        "parse-json": "^2.2.0",
+        "require-from-string": "^1.1.0"
       },
       "dependencies": {
         "minimist": {
@@ -1689,8 +1713,8 @@
       "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=",
       "dev": true,
       "requires": {
-        "bn.js": "4.11.8",
-        "elliptic": "6.4.0"
+        "bn.js": "^4.1.0",
+        "elliptic": "^6.0.0"
       }
     },
     "create-error-class": {
@@ -1699,7 +1723,7 @@
       "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
       "dev": true,
       "requires": {
-        "capture-stack-trace": "1.0.0"
+        "capture-stack-trace": "^1.0.0"
       }
     },
     "create-hash": {
@@ -1708,10 +1732,10 @@
       "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=",
       "dev": true,
       "requires": {
-        "cipher-base": "1.0.4",
-        "inherits": "2.0.3",
-        "ripemd160": "2.0.1",
-        "sha.js": "2.4.9"
+        "cipher-base": "^1.0.1",
+        "inherits": "^2.0.1",
+        "ripemd160": "^2.0.0",
+        "sha.js": "^2.4.0"
       }
     },
     "create-hmac": {
@@ -1720,12 +1744,12 @@
       "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=",
       "dev": true,
       "requires": {
-        "cipher-base": "1.0.4",
-        "create-hash": "1.1.3",
-        "inherits": "2.0.3",
-        "ripemd160": "2.0.1",
-        "safe-buffer": "5.0.1",
-        "sha.js": "2.4.9"
+        "cipher-base": "^1.0.3",
+        "create-hash": "^1.1.0",
+        "inherits": "^2.0.1",
+        "ripemd160": "^2.0.0",
+        "safe-buffer": "^5.0.1",
+        "sha.js": "^2.4.8"
       }
     },
     "cross-spawn": {
@@ -1734,8 +1758,8 @@
       "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=",
       "dev": true,
       "requires": {
-        "lru-cache": "4.1.0",
-        "which": "1.2.14"
+        "lru-cache": "^4.0.1",
+        "which": "^1.2.9"
       }
     },
     "cross-spawn-async": {
@@ -1744,8 +1768,8 @@
       "integrity": "sha1-hF/wwINKPe2dFg2sptOQkGuyiMw=",
       "dev": true,
       "requires": {
-        "lru-cache": "4.1.0",
-        "which": "1.2.14"
+        "lru-cache": "^4.0.0",
+        "which": "^1.2.8"
       }
     },
     "crossvent": {
@@ -1753,7 +1777,7 @@
       "resolved": "https://registry.npmjs.org/crossvent/-/crossvent-1.5.4.tgz",
       "integrity": "sha1-2ixPj0DJR4JRe/K+7BBEFIGUq5I=",
       "requires": {
-        "custom-event": "1.0.1"
+        "custom-event": "1.0.0"
       }
     },
     "cryptiles": {
@@ -1762,7 +1786,7 @@
       "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=",
       "dev": true,
       "requires": {
-        "boom": "2.10.1"
+        "boom": "2.x.x"
       }
     },
     "crypto-browserify": {
@@ -1771,17 +1795,17 @@
       "integrity": "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=",
       "dev": true,
       "requires": {
-        "browserify-cipher": "1.0.0",
-        "browserify-sign": "4.0.4",
-        "create-ecdh": "4.0.0",
-        "create-hash": "1.1.3",
-        "create-hmac": "1.1.6",
-        "diffie-hellman": "5.0.2",
-        "inherits": "2.0.3",
-        "pbkdf2": "3.0.14",
-        "public-encrypt": "4.0.0",
-        "randombytes": "2.0.5",
-        "randomfill": "1.0.3"
+        "browserify-cipher": "^1.0.0",
+        "browserify-sign": "^4.0.0",
+        "create-ecdh": "^4.0.0",
+        "create-hash": "^1.1.0",
+        "create-hmac": "^1.1.0",
+        "diffie-hellman": "^5.0.0",
+        "inherits": "^2.0.1",
+        "pbkdf2": "^3.0.3",
+        "public-encrypt": "^4.0.0",
+        "randombytes": "^2.0.0",
+        "randomfill": "^1.0.3"
       }
     },
     "crypto-random-string": {
@@ -1802,20 +1826,20 @@
       "integrity": "sha1-Xy7pid0y7dkHcX+VMxdlYWCZnBs=",
       "dev": true,
       "requires": {
-        "babel-code-frame": "6.22.0",
-        "css-selector-tokenizer": "0.7.0",
-        "cssnano": "3.10.0",
-        "icss-utils": "2.1.0",
-        "loader-utils": "1.1.0",
-        "lodash.camelcase": "4.3.0",
-        "object-assign": "4.1.1",
-        "postcss": "5.2.18",
-        "postcss-modules-extract-imports": "1.1.0",
-        "postcss-modules-local-by-default": "1.2.0",
-        "postcss-modules-scope": "1.1.0",
-        "postcss-modules-values": "1.3.0",
-        "postcss-value-parser": "3.3.0",
-        "source-list-map": "2.0.0"
+        "babel-code-frame": "^6.11.0",
+        "css-selector-tokenizer": "^0.7.0",
+        "cssnano": ">=2.6.1 <4",
+        "icss-utils": "^2.1.0",
+        "loader-utils": "^1.0.2",
+        "lodash.camelcase": "^4.3.0",
+        "object-assign": "^4.0.1",
+        "postcss": "^5.0.6",
+        "postcss-modules-extract-imports": "^1.0.0",
+        "postcss-modules-local-by-default": "^1.0.1",
+        "postcss-modules-scope": "^1.0.0",
+        "postcss-modules-values": "^1.1.0",
+        "postcss-value-parser": "^3.3.0",
+        "source-list-map": "^2.0.0"
       }
     },
     "css-parse": {
@@ -1830,10 +1854,10 @@
       "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
       "dev": true,
       "requires": {
-        "boolbase": "1.0.0",
-        "css-what": "2.1.0",
+        "boolbase": "~1.0.0",
+        "css-what": "2.1",
         "domutils": "1.5.1",
-        "nth-check": "1.0.1"
+        "nth-check": "~1.0.1"
       }
     },
     "css-selector-tokenizer": {
@@ -1842,9 +1866,9 @@
       "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=",
       "dev": true,
       "requires": {
-        "cssesc": "0.1.0",
-        "fastparse": "1.1.1",
-        "regexpu-core": "1.0.0"
+        "cssesc": "^0.1.0",
+        "fastparse": "^1.1.1",
+        "regexpu-core": "^1.0.0"
       }
     },
     "css-what": {
@@ -1859,7 +1883,7 @@
       "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=",
       "dev": true,
       "requires": {
-        "through": "2.3.8"
+        "through": "X.X.X"
       }
     },
     "cssesc": {
@@ -1874,38 +1898,38 @@
       "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=",
       "dev": true,
       "requires": {
-        "autoprefixer": "6.7.7",
-        "decamelize": "1.2.0",
-        "defined": "1.0.0",
-        "has": "1.0.1",
-        "object-assign": "4.1.1",
-        "postcss": "5.2.18",
-        "postcss-calc": "5.3.1",
-        "postcss-colormin": "2.2.2",
-        "postcss-convert-values": "2.6.1",
-        "postcss-discard-comments": "2.0.4",
-        "postcss-discard-duplicates": "2.1.0",
-        "postcss-discard-empty": "2.1.0",
-        "postcss-discard-overridden": "0.1.1",
-        "postcss-discard-unused": "2.2.3",
-        "postcss-filter-plugins": "2.0.2",
-        "postcss-merge-idents": "2.1.7",
-        "postcss-merge-longhand": "2.0.2",
-        "postcss-merge-rules": "2.1.2",
-        "postcss-minify-font-values": "1.0.5",
-        "postcss-minify-gradients": "1.0.5",
-        "postcss-minify-params": "1.2.2",
-        "postcss-minify-selectors": "2.1.1",
-        "postcss-normalize-charset": "1.1.1",
-        "postcss-normalize-url": "3.0.8",
-        "postcss-ordered-values": "2.2.3",
-        "postcss-reduce-idents": "2.4.0",
-        "postcss-reduce-initial": "1.0.1",
-        "postcss-reduce-transforms": "1.0.4",
-        "postcss-svgo": "2.1.6",
-        "postcss-unique-selectors": "2.0.2",
-        "postcss-value-parser": "3.3.0",
-        "postcss-zindex": "2.2.0"
+        "autoprefixer": "^6.3.1",
+        "decamelize": "^1.1.2",
+        "defined": "^1.0.0",
+        "has": "^1.0.1",
+        "object-assign": "^4.0.1",
+        "postcss": "^5.0.14",
+        "postcss-calc": "^5.2.0",
+        "postcss-colormin": "^2.1.8",
+        "postcss-convert-values": "^2.3.4",
+        "postcss-discard-comments": "^2.0.4",
+        "postcss-discard-duplicates": "^2.0.1",
+        "postcss-discard-empty": "^2.0.1",
+        "postcss-discard-overridden": "^0.1.1",
+        "postcss-discard-unused": "^2.2.1",
+        "postcss-filter-plugins": "^2.0.0",
+        "postcss-merge-idents": "^2.1.5",
+        "postcss-merge-longhand": "^2.0.1",
+        "postcss-merge-rules": "^2.0.3",
+        "postcss-minify-font-values": "^1.0.2",
+        "postcss-minify-gradients": "^1.0.1",
+        "postcss-minify-params": "^1.0.4",
+        "postcss-minify-selectors": "^2.0.4",
+        "postcss-normalize-charset": "^1.1.0",
+        "postcss-normalize-url": "^3.0.7",
+        "postcss-ordered-values": "^2.1.0",
+        "postcss-reduce-idents": "^2.2.2",
+        "postcss-reduce-initial": "^1.0.0",
+        "postcss-reduce-transforms": "^1.0.3",
+        "postcss-svgo": "^2.1.1",
+        "postcss-unique-selectors": "^2.0.2",
+        "postcss-value-parser": "^3.2.3",
+        "postcss-zindex": "^2.0.1"
       }
     },
     "csso": {
@@ -1914,8 +1938,8 @@
       "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=",
       "dev": true,
       "requires": {
-        "clap": "1.2.3",
-        "source-map": "0.5.6"
+        "clap": "^1.0.9",
+        "source-map": "^0.5.3"
       }
     },
     "currently-unhandled": {
@@ -1924,7 +1948,7 @@
       "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
       "dev": true,
       "requires": {
-        "array-find-index": "1.0.2"
+        "array-find-index": "^1.0.1"
       }
     },
     "custom-event": {
@@ -1938,7 +1962,7 @@
       "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
       "dev": true,
       "requires": {
-        "assert-plus": "1.0.0"
+        "assert-plus": "^1.0.0"
       },
       "dependencies": {
         "assert-plus": {
@@ -1982,7 +2006,7 @@
       "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=",
       "dev": true,
       "requires": {
-        "strip-bom": "2.0.0"
+        "strip-bom": "^2.0.0"
       }
     },
     "defined": {
@@ -1997,13 +2021,13 @@
       "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
       "dev": true,
       "requires": {
-        "globby": "5.0.0",
-        "is-path-cwd": "1.0.0",
-        "is-path-in-cwd": "1.0.0",
-        "object-assign": "4.1.1",
-        "pify": "2.3.0",
-        "pinkie-promise": "2.0.1",
-        "rimraf": "2.6.1"
+        "globby": "^5.0.0",
+        "is-path-cwd": "^1.0.0",
+        "is-path-in-cwd": "^1.0.0",
+        "object-assign": "^4.0.1",
+        "pify": "^2.0.0",
+        "pinkie-promise": "^2.0.0",
+        "rimraf": "^2.2.8"
       }
     },
     "delayed-stream": {
@@ -2036,8 +2060,8 @@
       "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
       "dev": true,
       "requires": {
-        "inherits": "2.0.3",
-        "minimalistic-assert": "1.0.0"
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0"
       }
     },
     "destroy": {
@@ -2052,7 +2076,7 @@
       "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
       "dev": true,
       "requires": {
-        "repeating": "2.0.1"
+        "repeating": "^2.0.0"
       }
     },
     "detect-node": {
@@ -2079,9 +2103,9 @@
       "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=",
       "dev": true,
       "requires": {
-        "bn.js": "4.11.8",
-        "miller-rabin": "4.0.1",
-        "randombytes": "2.0.5"
+        "bn.js": "^4.1.0",
+        "miller-rabin": "^4.0.0",
+        "randombytes": "^2.0.0"
       }
     },
     "directory-encoder": {
@@ -2090,9 +2114,9 @@
       "integrity": "sha1-WbTiqk8lQi9sY7UntGL14tDdLFg=",
       "dev": true,
       "requires": {
-        "fs-extra": "0.23.1",
-        "handlebars": "1.3.0",
-        "img-stats": "0.5.2"
+        "fs-extra": "^0.23.1",
+        "handlebars": "^1.3.0",
+        "img-stats": "^0.5.2"
       },
       "dependencies": {
         "fs-extra": {
@@ -2101,10 +2125,10 @@
           "integrity": "sha1-ZhHbpq3yq43Jxp+rN83fiBgVfj0=",
           "dev": true,
           "requires": {
-            "graceful-fs": "4.1.11",
-            "jsonfile": "2.4.0",
-            "path-is-absolute": "1.0.1",
-            "rimraf": "2.6.1"
+            "graceful-fs": "^4.1.2",
+            "jsonfile": "^2.1.0",
+            "path-is-absolute": "^1.0.0",
+            "rimraf": "^2.2.8"
           }
         },
         "jsonfile": {
@@ -2113,7 +2137,7 @@
           "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=",
           "dev": true,
           "requires": {
-            "graceful-fs": "4.1.11"
+            "graceful-fs": "^4.1.6"
           }
         }
       }
@@ -2124,7 +2148,7 @@
       "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=",
       "dev": true,
       "requires": {
-        "utila": "0.3.3"
+        "utila": "~0.3"
       },
       "dependencies": {
         "utila": {
@@ -2141,10 +2165,10 @@
       "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=",
       "dev": true,
       "requires": {
-        "custom-event": "1.0.1",
-        "ent": "2.2.0",
-        "extend": "3.0.1",
-        "void-elements": "2.0.1"
+        "custom-event": "~1.0.0",
+        "ent": "~2.2.0",
+        "extend": "^3.0.0",
+        "void-elements": "^2.0.0"
       }
     },
     "dom-serializer": {
@@ -2153,8 +2177,8 @@
       "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=",
       "dev": true,
       "requires": {
-        "domelementtype": "1.1.3",
-        "entities": "1.1.1"
+        "domelementtype": "~1.1.1",
+        "entities": "~1.1.1"
       },
       "dependencies": {
         "domelementtype": {
@@ -2183,7 +2207,7 @@
       "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=",
       "dev": true,
       "requires": {
-        "domelementtype": "1.3.0"
+        "domelementtype": "1"
       }
     },
     "domutils": {
@@ -2192,8 +2216,8 @@
       "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
       "dev": true,
       "requires": {
-        "dom-serializer": "0.1.0",
-        "domelementtype": "1.3.0"
+        "dom-serializer": "0",
+        "domelementtype": "1"
       }
     },
     "dot-prop": {
@@ -2202,7 +2226,7 @@
       "integrity": "sha1-qEk/C3te7sglJbXHWH+n3nyoWcE=",
       "dev": true,
       "requires": {
-        "is-obj": "1.0.1"
+        "is-obj": "^1.0.0"
       }
     },
     "dragula": {
@@ -2227,7 +2251,7 @@
       "dev": true,
       "optional": true,
       "requires": {
-        "jsbn": "0.1.1"
+        "jsbn": "~0.1.0"
       }
     },
     "ee-first": {
@@ -2248,13 +2272,13 @@
       "integrity": "sha1-ELbxOHwDL+9gzFPlIRq/rim0L90=",
       "dev": true,
       "requires": {
-        "body-parser": "1.17.2",
-        "chalk": "1.1.3",
+        "body-parser": "1.15.2",
+        "chalk": "^1.1.3",
         "express": "5.0.0-alpha.2",
-        "lodash": "4.17.4",
-        "minimist": "0.0.8",
-        "protractor": "4.0.14",
-        "q": "1.5.0",
+        "lodash": "4.16.4",
+        "minimist": "^1.2.0",
+        "protractor": "^4.0.9",
+        "q": "2.0.3",
         "temp": "0.8.3"
       },
       "dependencies": {
@@ -2264,7 +2288,7 @@
           "integrity": "sha1-5fHzkoxtlf2WVYw27D2dDeSm7Oo=",
           "dev": true,
           "requires": {
-            "mime-types": "2.1.15",
+            "mime-types": "~2.1.6",
             "negotiator": "0.5.3"
           }
         },
@@ -2319,33 +2343,33 @@
           "integrity": "sha1-/VQXf2V7akxFQHJ3Au3Ry6o6asU=",
           "dev": true,
           "requires": {
-            "accepts": "1.2.13",
+            "accepts": "~1.2.10",
             "array-flatten": "1.1.0",
             "content-disposition": "0.5.0",
-            "content-type": "1.0.2",
+            "content-type": "~1.0.1",
             "cookie": "0.1.3",
             "cookie-signature": "1.0.6",
-            "debug": "2.2.0",
-            "depd": "1.0.1",
+            "debug": "~2.2.0",
+            "depd": "~1.0.1",
             "escape-html": "1.0.2",
-            "etag": "1.7.0",
+            "etag": "~1.7.0",
             "finalhandler": "0.4.0",
             "fresh": "0.3.0",
             "merge-descriptors": "1.0.0",
-            "methods": "1.1.2",
-            "on-finished": "2.3.0",
-            "parseurl": "1.3.1",
+            "methods": "~1.1.1",
+            "on-finished": "~2.3.0",
+            "parseurl": "~1.3.0",
             "path-is-absolute": "1.0.0",
             "path-to-regexp": "0.1.6",
-            "proxy-addr": "1.0.10",
+            "proxy-addr": "~1.0.8",
             "qs": "4.0.0",
-            "range-parser": "1.0.3",
-            "router": "1.1.5",
+            "range-parser": "~1.0.2",
+            "router": "~1.1.2",
             "send": "0.13.0",
-            "serve-static": "1.10.3",
-            "type-is": "1.6.15",
+            "serve-static": "~1.10.0",
+            "type-is": "~1.6.4",
             "utils-merge": "1.0.0",
-            "vary": "1.0.1"
+            "vary": "~1.0.0"
           }
         },
         "finalhandler": {
@@ -2354,10 +2378,10 @@
           "integrity": "sha1-llpS2ejQXSuFdUhUH7ibU6JJfZs=",
           "dev": true,
           "requires": {
-            "debug": "2.2.0",
+            "debug": "~2.2.0",
             "escape-html": "1.0.2",
-            "on-finished": "2.3.0",
-            "unpipe": "1.0.0"
+            "on-finished": "~2.3.0",
+            "unpipe": "~1.0.0"
           }
         },
         "fresh": {
@@ -2372,8 +2396,8 @@
           "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=",
           "dev": true,
           "requires": {
-            "inherits": "2.0.3",
-            "statuses": "1.2.1"
+            "inherits": "~2.0.1",
+            "statuses": "1"
           }
         },
         "ipaddr.js": {
@@ -2424,21 +2448,21 @@
           "integrity": "sha1-78Sod/rDoYKp3e0mzVhp9HYv0XI=",
           "dev": true,
           "requires": {
-            "@types/jasmine": "2.5.38",
-            "@types/node": "6.0.78",
-            "@types/q": "0.0.32",
+            "@types/jasmine": "^2.5.36",
+            "@types/node": "^6.0.46",
+            "@types/q": "^0.0.32",
             "@types/selenium-webdriver": "2.53.37",
             "adm-zip": "0.4.7",
-            "chalk": "1.1.3",
-            "glob": "7.1.2",
+            "chalk": "^1.1.3",
+            "glob": "^7.0.3",
             "jasmine": "2.4.1",
             "jasminewd2": "0.0.10",
-            "optimist": "0.6.1",
+            "optimist": "~0.6.0",
             "q": "1.4.1",
-            "saucelabs": "1.3.0",
+            "saucelabs": "~1.3.0",
             "selenium-webdriver": "2.53.3",
-            "source-map-support": "0.4.15",
-            "webdriver-manager": "10.3.0"
+            "source-map-support": "~0.4.0",
+            "webdriver-manager": "^10.3.0"
           },
           "dependencies": {
             "minimist": {
@@ -2459,16 +2483,16 @@
               "integrity": "sha1-mTFFiKCx2+aIxEHXQojGyxh1+os=",
               "dev": true,
               "requires": {
-                "adm-zip": "0.4.7",
-                "chalk": "1.1.3",
-                "del": "2.2.2",
-                "glob": "7.1.2",
-                "ini": "1.3.4",
-                "minimist": "1.2.0",
-                "q": "1.4.1",
-                "request": "2.81.0",
-                "rimraf": "2.6.1",
-                "semver": "5.3.0"
+                "adm-zip": "^0.4.7",
+                "chalk": "^1.1.1",
+                "del": "^2.2.0",
+                "glob": "^7.0.3",
+                "ini": "^1.3.4",
+                "minimist": "^1.2.0",
+                "q": "^1.4.1",
+                "request": "^2.78.0",
+                "rimraf": "^2.5.2",
+                "semver": "^5.3.0"
               }
             }
           }
@@ -2479,7 +2503,7 @@
           "integrity": "sha1-DUCoL4Afw1VWfS7LZe/j8HfxIcU=",
           "dev": true,
           "requires": {
-            "forwarded": "0.1.0",
+            "forwarded": "~0.1.0",
             "ipaddr.js": "1.0.5"
           }
         },
@@ -2501,8 +2525,8 @@
           "integrity": "sha1-zlpuzTEB/tXsCYJ9rCKpwpv7BTU=",
           "dev": true,
           "requires": {
-            "escape-html": "1.0.3",
-            "parseurl": "1.3.1",
+            "escape-html": "~1.0.3",
+            "parseurl": "~1.3.1",
             "send": "0.13.2"
           },
           "dependencies": {
@@ -2524,18 +2548,18 @@
               "integrity": "sha1-dl52B8gFVFK7pvCwUllTUJhgNt4=",
               "dev": true,
               "requires": {
-                "debug": "2.2.0",
-                "depd": "1.1.1",
-                "destroy": "1.0.4",
-                "escape-html": "1.0.3",
-                "etag": "1.7.0",
+                "debug": "~2.2.0",
+                "depd": "~1.1.0",
+                "destroy": "~1.0.4",
+                "escape-html": "~1.0.3",
+                "etag": "~1.7.0",
                 "fresh": "0.3.0",
-                "http-errors": "1.3.1",
+                "http-errors": "~1.3.1",
                 "mime": "1.3.4",
                 "ms": "0.7.1",
-                "on-finished": "2.3.0",
-                "range-parser": "1.0.3",
-                "statuses": "1.2.1"
+                "on-finished": "~2.3.0",
+                "range-parser": "~1.0.3",
+                "statuses": "~1.2.1"
               }
             }
           }
@@ -2560,13 +2584,13 @@
       "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=",
       "dev": true,
       "requires": {
-        "bn.js": "4.11.8",
-        "brorand": "1.1.0",
-        "hash.js": "1.1.3",
-        "hmac-drbg": "1.0.1",
-        "inherits": "2.0.3",
-        "minimalistic-assert": "1.0.0",
-        "minimalistic-crypto-utils": "1.0.1"
+        "bn.js": "^4.4.0",
+        "brorand": "^1.0.1",
+        "hash.js": "^1.0.0",
+        "hmac-drbg": "^1.0.0",
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0",
+        "minimalistic-crypto-utils": "^1.0.0"
       }
     },
     "ember-cli-normalize-entity-name": {
@@ -2575,7 +2599,7 @@
       "integrity": "sha1-CxT3vLxZmqEXtf3cgeT9A8S61bc=",
       "dev": true,
       "requires": {
-        "silent-error": "1.1.0"
+        "silent-error": "^1.0.0"
       }
     },
     "ember-cli-string-utils": {
@@ -2690,10 +2714,10 @@
       "integrity": "sha1-lQlk7MfwMypCMhtnOzjcj/FVNbM=",
       "dev": true,
       "requires": {
-        "graceful-fs": "4.1.11",
-        "memory-fs": "0.4.1",
-        "object-assign": "4.1.1",
-        "tapable": "0.2.8"
+        "graceful-fs": "^4.1.2",
+        "memory-fs": "^0.4.0",
+        "object-assign": "^4.0.1",
+        "tapable": "^0.2.5"
       }
     },
     "ensure-posix-path": {
@@ -2720,7 +2744,7 @@
       "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=",
       "dev": true,
       "requires": {
-        "prr": "0.0.0"
+        "prr": "~0.0.0"
       }
     },
     "error-ex": {
@@ -2729,7 +2753,7 @@
       "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
       "dev": true,
       "requires": {
-        "is-arrayish": "0.2.1"
+        "is-arrayish": "^0.2.1"
       }
     },
     "es6-promise": {
@@ -2738,6 +2762,23 @@
       "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=",
       "dev": true
     },
+    "es6-promisify": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
+      "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
+      "dev": true,
+      "requires": {
+        "es6-promise": "^4.0.3"
+      },
+      "dependencies": {
+        "es6-promise": {
+          "version": "4.2.4",
+          "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz",
+          "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==",
+          "dev": true
+        }
+      }
+    },
     "escape-html": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@@ -2786,7 +2827,7 @@
       "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=",
       "dev": true,
       "requires": {
-        "original": "1.0.0"
+        "original": ">=0.0.5"
       }
     },
     "evp_bytestokey": {
@@ -2795,8 +2836,8 @@
       "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=",
       "dev": true,
       "requires": {
-        "md5.js": "1.3.4",
-        "safe-buffer": "5.1.1"
+        "md5.js": "^1.3.4",
+        "safe-buffer": "^5.1.1"
       },
       "dependencies": {
         "safe-buffer": {
@@ -2813,12 +2854,12 @@
       "integrity": "sha1-TrZGejaglfq7KXD/nV4/t7zm68M=",
       "dev": true,
       "requires": {
-        "cross-spawn-async": "2.2.5",
-        "is-stream": "1.1.0",
-        "npm-run-path": "1.0.0",
-        "object-assign": "4.1.1",
-        "path-key": "1.0.0",
-        "strip-eof": "1.0.0"
+        "cross-spawn-async": "^2.1.1",
+        "is-stream": "^1.1.0",
+        "npm-run-path": "^1.0.0",
+        "object-assign": "^4.0.1",
+        "path-key": "^1.0.0",
+        "strip-eof": "^1.0.0"
       }
     },
     "exit": {
@@ -2833,9 +2874,9 @@
       "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=",
       "dev": true,
       "requires": {
-        "array-slice": "0.2.3",
-        "array-unique": "0.2.1",
-        "braces": "0.1.5"
+        "array-slice": "^0.2.3",
+        "array-unique": "^0.2.1",
+        "braces": "^0.1.2"
       },
       "dependencies": {
         "braces": {
@@ -2844,7 +2885,7 @@
           "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=",
           "dev": true,
           "requires": {
-            "expand-range": "0.1.1"
+            "expand-range": "^0.1.0"
           }
         },
         "expand-range": {
@@ -2853,8 +2894,8 @@
           "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=",
           "dev": true,
           "requires": {
-            "is-number": "0.1.1",
-            "repeat-string": "0.2.2"
+            "is-number": "^0.1.1",
+            "repeat-string": "^0.2.2"
           }
         },
         "is-number": {
@@ -2877,7 +2918,7 @@
       "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
       "dev": true,
       "requires": {
-        "is-posix-bracket": "0.1.1"
+        "is-posix-bracket": "^0.1.0"
       }
     },
     "expand-range": {
@@ -2886,7 +2927,7 @@
       "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
       "dev": true,
       "requires": {
-        "fill-range": "2.2.3"
+        "fill-range": "^2.1.0"
       }
     },
     "exports-loader": {
@@ -2895,8 +2936,8 @@
       "integrity": "sha1-1w/GEhl1s1/BKDDPUnVL4nQPyIY=",
       "dev": true,
       "requires": {
-        "loader-utils": "1.1.0",
-        "source-map": "0.5.6"
+        "loader-utils": "^1.0.2",
+        "source-map": "0.5.x"
       }
     },
     "express": {
@@ -2905,34 +2946,34 @@
       "integrity": "sha1-rxB/wUhQRFfy3Kmm8lcdcSm5ezU=",
       "dev": true,
       "requires": {
-        "accepts": "1.3.3",
+        "accepts": "~1.3.3",
         "array-flatten": "1.1.1",
         "content-disposition": "0.5.2",
-        "content-type": "1.0.2",
+        "content-type": "~1.0.2",
         "cookie": "0.3.1",
         "cookie-signature": "1.0.6",
         "debug": "2.6.1",
-        "depd": "1.1.0",
-        "encodeurl": "1.0.1",
-        "escape-html": "1.0.3",
-        "etag": "1.8.0",
-        "finalhandler": "1.0.3",
+        "depd": "~1.1.0",
+        "encodeurl": "~1.0.1",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.0",
+        "finalhandler": "~1.0.0",
         "fresh": "0.5.0",
         "merge-descriptors": "1.0.1",
-        "methods": "1.1.2",
-        "on-finished": "2.3.0",
-        "parseurl": "1.3.1",
+        "methods": "~1.1.2",
+        "on-finished": "~2.3.0",
+        "parseurl": "~1.3.1",
         "path-to-regexp": "0.1.7",
-        "proxy-addr": "1.1.4",
+        "proxy-addr": "~1.1.3",
         "qs": "6.4.0",
-        "range-parser": "1.2.0",
+        "range-parser": "~1.2.0",
         "send": "0.15.1",
         "serve-static": "1.12.1",
         "setprototypeof": "1.0.3",
-        "statuses": "1.3.1",
-        "type-is": "1.6.15",
+        "statuses": "~1.3.1",
+        "type-is": "~1.6.14",
         "utils-merge": "1.0.0",
-        "vary": "1.1.1"
+        "vary": "~1.1.0"
       },
       "dependencies": {
         "debug": {
@@ -2963,18 +3004,18 @@
           "dev": true,
           "requires": {
             "debug": "2.6.1",
-            "depd": "1.1.0",
-            "destroy": "1.0.4",
-            "encodeurl": "1.0.1",
-            "escape-html": "1.0.3",
-            "etag": "1.8.0",
+            "depd": "~1.1.0",
+            "destroy": "~1.0.4",
+            "encodeurl": "~1.0.1",
+            "escape-html": "~1.0.3",
+            "etag": "~1.8.0",
             "fresh": "0.5.0",
-            "http-errors": "1.6.1",
+            "http-errors": "~1.6.1",
             "mime": "1.3.4",
             "ms": "0.7.2",
-            "on-finished": "2.3.0",
-            "range-parser": "1.2.0",
-            "statuses": "1.3.1"
+            "on-finished": "~2.3.0",
+            "range-parser": "~1.2.0",
+            "statuses": "~1.3.1"
           }
         }
       }
@@ -2991,9 +3032,9 @@
       "integrity": "sha1-PQJqIbf5W1cmOH1CAKwWDTcsO0g=",
       "dev": true,
       "requires": {
-        "chardet": "0.4.2",
-        "iconv-lite": "0.4.19",
-        "tmp": "0.0.33"
+        "chardet": "^0.4.0",
+        "iconv-lite": "^0.4.17",
+        "tmp": "^0.0.33"
       },
       "dependencies": {
         "tmp": {
@@ -3002,7 +3043,7 @@
           "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
           "dev": true,
           "requires": {
-            "os-tmpdir": "1.0.2"
+            "os-tmpdir": "~1.0.2"
           }
         }
       }
@@ -3013,7 +3054,7 @@
       "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
       "dev": true,
       "requires": {
-        "is-extglob": "1.0.0"
+        "is-extglob": "^1.0.0"
       }
     },
     "extract-text-webpack-plugin": {
@@ -3022,10 +3063,33 @@
       "integrity": "sha1-dW7076gVXDaBgz+8NNpTuUF0bWw=",
       "dev": true,
       "requires": {
-        "async": "2.4.1",
-        "loader-utils": "1.1.0",
-        "schema-utils": "0.3.0",
-        "webpack-sources": "1.1.0"
+        "async": "^2.1.2",
+        "loader-utils": "^1.0.2",
+        "schema-utils": "^0.3.0",
+        "webpack-sources": "^1.0.1"
+      }
+    },
+    "extract-zip": {
+      "version": "1.6.7",
+      "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz",
+      "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=",
+      "dev": true,
+      "requires": {
+        "concat-stream": "1.6.2",
+        "debug": "2.6.9",
+        "mkdirp": "0.5.1",
+        "yauzl": "2.4.1"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        }
       }
     },
     "extsprintf": {
@@ -3058,7 +3122,16 @@
       "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
       "dev": true,
       "requires": {
-        "websocket-driver": "0.7.0"
+        "websocket-driver": ">=0.5.1"
+      }
+    },
+    "fd-slicer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz",
+      "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=",
+      "dev": true,
+      "requires": {
+        "pend": "~1.2.0"
       }
     },
     "figures": {
@@ -3067,7 +3140,7 @@
       "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
       "dev": true,
       "requires": {
-        "escape-string-regexp": "1.0.5"
+        "escape-string-regexp": "^1.0.5"
       }
     },
     "file-loader": {
@@ -3076,7 +3149,7 @@
       "integrity": "sha1-gVA0EZiR/GRB+1pkwRvJPCLd2EI=",
       "dev": true,
       "requires": {
-        "loader-utils": "1.1.0"
+        "loader-utils": "^1.0.2"
       }
     },
     "filename-regex": {
@@ -3091,8 +3164,8 @@
       "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=",
       "dev": true,
       "requires": {
-        "glob": "7.1.2",
-        "minimatch": "3.0.4"
+        "glob": "^7.0.3",
+        "minimatch": "^3.0.3"
       }
     },
     "fill-range": {
@@ -3101,11 +3174,11 @@
       "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=",
       "dev": true,
       "requires": {
-        "is-number": "2.1.0",
-        "isobject": "2.1.0",
-        "randomatic": "1.1.6",
-        "repeat-element": "1.1.2",
-        "repeat-string": "1.6.1"
+        "is-number": "^2.1.0",
+        "isobject": "^2.0.0",
+        "randomatic": "^1.1.3",
+        "repeat-element": "^1.1.2",
+        "repeat-string": "^1.5.2"
       }
     },
     "finalhandler": {
@@ -3115,12 +3188,12 @@
       "dev": true,
       "requires": {
         "debug": "2.6.7",
-        "encodeurl": "1.0.1",
-        "escape-html": "1.0.3",
-        "on-finished": "2.3.0",
-        "parseurl": "1.3.1",
-        "statuses": "1.3.1",
-        "unpipe": "1.0.0"
+        "encodeurl": "~1.0.1",
+        "escape-html": "~1.0.3",
+        "on-finished": "~2.3.0",
+        "parseurl": "~1.3.1",
+        "statuses": "~1.3.1",
+        "unpipe": "~1.0.0"
       },
       "dependencies": {
         "debug": {
@@ -3140,8 +3213,8 @@
       "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
       "dev": true,
       "requires": {
-        "path-exists": "2.1.0",
-        "pinkie-promise": "2.0.1"
+        "path-exists": "^2.0.0",
+        "pinkie-promise": "^2.0.0"
       }
     },
     "findup-sync": {
@@ -3150,7 +3223,7 @@
       "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=",
       "dev": true,
       "requires": {
-        "glob": "5.0.15"
+        "glob": "~5.0.0"
       },
       "dependencies": {
         "glob": {
@@ -3159,11 +3232,11 @@
           "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
           "dev": true,
           "requires": {
-            "inflight": "1.0.6",
-            "inherits": "2.0.3",
-            "minimatch": "3.0.4",
-            "once": "1.4.0",
-            "path-is-absolute": "1.0.1"
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "2 || 3",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
           }
         }
       }
@@ -3191,7 +3264,7 @@
       "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
       "dev": true,
       "requires": {
-        "for-in": "1.0.2"
+        "for-in": "^1.0.1"
       }
     },
     "forever-agent": {
@@ -3206,9 +3279,9 @@
       "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=",
       "dev": true,
       "requires": {
-        "asynckit": "0.4.0",
-        "combined-stream": "1.0.5",
-        "mime-types": "2.1.15"
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.5",
+        "mime-types": "^2.1.12"
       }
     },
     "forwarded": {
@@ -3229,7 +3302,7 @@
       "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=",
       "dev": true,
       "requires": {
-        "null-check": "1.0.0"
+        "null-check": "^1.0.0"
       }
     },
     "fs-extra": {
@@ -3238,9 +3311,9 @@
       "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=",
       "dev": true,
       "requires": {
-        "graceful-fs": "4.1.11",
-        "jsonfile": "4.0.0",
-        "universalify": "0.1.1"
+        "graceful-fs": "^4.1.2",
+        "jsonfile": "^4.0.0",
+        "universalify": "^0.1.0"
       }
     },
     "fs.realpath": {
@@ -3256,8 +3329,8 @@
       "dev": true,
       "optional": true,
       "requires": {
-        "nan": "2.6.2",
-        "node-pre-gyp": "0.6.33"
+        "nan": "^2.3.0",
+        "node-pre-gyp": "^0.6.29"
       },
       "dependencies": {
         "abbrev": {
@@ -3289,8 +3362,8 @@
           "dev": true,
           "optional": true,
           "requires": {
-            "delegates": "1.0.0",
-            "readable-stream": "2.2.2"
+            "delegates": "^1.0.0",
+            "readable-stream": "^2.0.0 || ^1.1.13"
           }
         },
         "asn1": {
@@ -3334,7 +3407,7 @@
           "dev": true,
           "optional": true,
           "requires": {
-            "tweetnacl": "0.14.5"
+            "tweetnacl": "^0.14.3"
           }
         },
         "block-stream": {
@@ -3342,7 +3415,7 @@
           "bundled": true,
           "dev": true,
           "requires": {
-            "inherits": "2.0.3"
+            "inherits": "~2.0.0"
           }
         },
         "boom": {
@@ -3350,7 +3423,7 @@
           "bundled": true,
           "dev": true,
           "requires": {
-            "hoek": "2.16.3"
+            "hoek": "2.x.x"
           }
         },
         "brace-expansion": {
@@ -3358,7 +3431,7 @@
           "bundled": true,
           "dev": true,
           "requires": {
-            "balanced-match": "0.4.2",
+            "balanced-match": "^0.4.1",
             "concat-map": "0.0.1"
           }
         },
@@ -3379,11 +3452,11 @@
           "dev": true,
           "optional": true,
           "requires": {
-            "ansi-styles": "2.2.1",
-            "escape-string-regexp": "1.0.5",
-            "has-ansi": "2.0.0",
-            "strip-ansi": "3.0.1",
-            "supports-color": "2.0.0"
+            "ansi-styles": "^2.2.1",
+            "escape-string-regexp": "^1.0.2",
+            "has-ansi": "^2.0.0",
+            "strip-ansi": "^3.0.0",
+            "supports-color": "^2.0.0"
           }
         },
         "code-point-at": {
@@ -3396,7 +3469,7 @@
           "bundled": true,
           "dev": true,
           "requires": {
-            "delayed-stream": "1.0.0"
+            "delayed-stream": "~1.0.0"
           }
         },
         "commander": {
@@ -3405,7 +3478,7 @@
           "dev": true,
           "optional": true,
           "requires": {
-            "graceful-readlink": "1.0.1"
+            "graceful-readlink": ">= 1.0.0"
           }
         },
         "concat-map": {
@@ -3429,7 +3502,7 @@
           "dev": true,
           "optional": true,
           "requires": {
-            "boom": "2.10.1"
+            "boom": "2.x.x"
           }
         },
         "dashdash": {
@@ -3438,7 +3511,7 @@
           "dev": true,
           "optional": true,
           "requires": {
-            "assert-plus": "1.0.0"
+            "assert-plus": "^1.0.0"
           },
           "dependencies": {
             "assert-plus": {
@@ -3481,7 +3554,7 @@
           "dev": true,
           "optional": true,
           "requires": {
-            "jsbn": "0.1.1"
+            "jsbn": "~0.1.0"
           }
         },
         "escape-string-regexp": {
@@ -3513,9 +3586,9 @@
           "dev": true,
           "optional": true,
           "requires": {
-            "asynckit": "0.4.0",
-            "combined-stream": "1.0.5",
-            "mime-types": "2.1.14"
+            "asynckit": "^0.4.0",
+            "combined-stream": "^1.0.5",
+            "mime-types": "^2.1.12"
           }
         },
         "fs.realpath": {
@@ -3528,10 +3601,10 @@
           "bundled": true,
           "dev": true,
           "requires": {
-            "graceful-fs": "4.1.11",
-            "inherits": "2.0.3",
-            "mkdirp": "0.5.1",
-            "rimraf": "2.5.4"
+            "graceful-fs": "^4.1.2",
+            "inherits": "~2.0.0",
+            "mkdirp": ">=0.5 0",
+            "rimraf": "2"
           }
         },
         "fstream-ignore": {
@@ -3540,9 +3613,9 @@
           "dev": true,
           "optional": true,
           "requires": {
-            "fstream": "1.0.10",
-            "inherits": "2.0.3",
-            "minimatch": "3.0.3"
+            "fstream": "^1.0.0",
+            "inherits": "2",
+            "minimatch": "^3.0.0"
           }
         },
         "gauge": {
@@ -3551,14 +3624,14 @@
           "dev": true,
           "optional": true,
           "requires": {
-            "aproba": "1.1.1",
-            "console-control-strings": "1.1.0",
-            "has-unicode": "2.0.1",
-            "object-assign": "4.1.1",
-            "signal-exit": "3.0.2",
-            "string-width": "1.0.2",
-            "strip-ansi": "3.0.1",
-            "wide-align": "1.1.0"
+            "aproba": "^1.0.3",
+            "console-control-strings": "^1.0.0",
+            "has-unicode": "^2.0.0",
+            "object-assign": "^4.1.0",
+            "signal-exit": "^3.0.0",
+            "string-width": "^1.0.1",
+            "strip-ansi": "^3.0.1",
+            "wide-align": "^1.1.0"
           }
         },
         "generate-function": {
@@ -3573,7 +3646,7 @@
           "dev": true,
           "optional": true,
           "requires": {
-            "is-property": "1.0.2"
+            "is-property": "^1.0.0"
           }
         },
         "getpass": {
@@ -3582,7 +3655,7 @@
           "dev": true,
           "optional": true,
           "requires": {
-            "assert-plus": "1.0.0"
+            "assert-plus": "^1.0.0"
           },
           "dependencies": {
             "assert-plus": {
@@ -3598,12 +3671,12 @@
           "bundled": true,
           "dev": true,
           "requires": {
-            "fs.realpath": "1.0.0",
-            "inflight": "1.0.6",
-            "inherits": "2.0.3",
-            "minimatch": "3.0.3",
-            "once": "1.4.0",
-            "path-is-absolute": "1.0.1"
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.2",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
           }
         },
         "graceful-fs": {
@@ -3623,10 +3696,10 @@
           "dev": true,
           "optional": true,
           "requires": {
-            "chalk": "1.1.3",
-            "commander": "2.9.0",
-            "is-my-json-valid": "2.15.0",
-            "pinkie-promise": "2.0.1"
+            "chalk": "^1.1.1",
+            "commander": "^2.9.0",
+            "is-my-json-valid": "^2.12.4",
+            "pinkie-promise": "^2.0.0"
           }
         },
         "has-ansi": {
@@ -3635,7 +3708,7 @@
           "dev": true,
           "optional": true,
           "requires": {
-            "ansi-regex": "2.1.1"
+            "ansi-regex": "^2.0.0"
           }
         },
         "has-unicode": {
@@ -3650,10 +3723,10 @@
           "dev": true,
           "optional": true,
           "requires": {
-            "boom": "2.10.1",
-            "cryptiles": "2.0.5",
-            "hoek": "2.16.3",
-            "sntp": "1.0.9"
+            "boom": "2.x.x",
+            "cryptiles": "2.x.x",
+            "hoek": "2.x.x",
+            "sntp": "1.x.x"
           }
         },
         "hoek": {
@@ -3667,9 +3740,9 @@
           "dev": true,
           "optional": true,
           "requires": {
-            "assert-plus": "0.2.0",
-            "jsprim": "1.3.1",
-            "sshpk": "1.10.2"
+            "assert-plus": "^0.2.0",
+            "jsprim": "^1.2.2",
+            "sshpk": "^1.7.0"
           }
         },
         "inflight": {
@@ -3677,8 +3750,8 @@
           "bundled": true,
           "dev": true,
           "requires": {
-            "once": "1.4.0",
-            "wrappy": "1.0.2"
+            "once": "^1.3.0",
+            "wrappy": "1"
           }
         },
         "inherits": {
@@ -3697,7 +3770,7 @@
           "bundled": true,
           "dev": true,
           "requires": {
-            "number-is-nan": "1.0.1"
+            "number-is-nan": "^1.0.0"
           }
         },
         "is-my-json-valid": {
@@ -3706,10 +3779,10 @@
           "dev": true,
           "optional": true,
           "requires": {
-            "generate-function": "2.0.0",
-            "generate-object-property": "1.2.0",
-            "jsonpointer": "4.0.1",
-            "xtend": "4.0.1"
+            "generate-function": "^2.0.0",
+            "generate-object-property": "^1.1.0",
+            "jsonpointer": "^4.0.0",
+            "xtend": "^4.0.0"
           }
         },
         "is-property": {
@@ -3741,7 +3814,7 @@
           "dev": true,
           "optional": true,
           "requires": {
-            "jsbn": "0.1.1"
+            "jsbn": "~0.1.0"
           }
         },
         "jsbn": {
@@ -3789,7 +3862,7 @@
           "bundled": true,
           "dev": true,
           "requires": {
-            "mime-db": "1.26.0"
+            "mime-db": "~1.26.0"
           }
         },
         "minimatch": {
@@ -3797,7 +3870,7 @@
           "bundled": true,
           "dev": true,
           "requires": {
-            "brace-expansion": "1.1.6"
+            "brace-expansion": "^1.0.0"
           }
         },
         "minimist": {
@@ -3825,15 +3898,15 @@
           "dev": true,
           "optional": true,
           "requires": {
-            "mkdirp": "0.5.1",
-            "nopt": "3.0.6",
-            "npmlog": "4.0.2",
-            "rc": "1.1.7",
-            "request": "2.79.0",
-            "rimraf": "2.5.4",
-            "semver": "5.3.0",
-            "tar": "2.2.1",
-            "tar-pack": "3.3.0"
+            "mkdirp": "~0.5.1",
+            "nopt": "~3.0.6",
+            "npmlog": "^4.0.1",
+            "rc": "~1.1.6",
+            "request": "^2.79.0",
+            "rimraf": "~2.5.4",
+            "semver": "~5.3.0",
+            "tar": "~2.2.1",
+            "tar-pack": "~3.3.0"
           }
         },
         "nopt": {
@@ -3842,7 +3915,7 @@
           "dev": true,
           "optional": true,
           "requires": {
-            "abbrev": "1.1.0"
+            "abbrev": "1"
           }
         },
         "npmlog": {
@@ -3851,10 +3924,10 @@
           "dev": true,
           "optional": true,
           "requires": {
-            "are-we-there-yet": "1.1.2",
-            "console-control-strings": "1.1.0",
-            "gauge": "2.7.3",
-            "set-blocking": "2.0.0"
+            "are-we-there-yet": "~1.1.2",
+            "console-control-strings": "~1.1.0",
+            "gauge": "~2.7.1",
+            "set-blocking": "~2.0.0"
           }
         },
         "number-is-nan": {
@@ -3879,7 +3952,7 @@
           "bundled": true,
           "dev": true,
           "requires": {
-            "wrappy": "1.0.2"
+            "wrappy": "1"
           }
         },
         "path-is-absolute": {
@@ -3899,7 +3972,7 @@
           "dev": true,
           "optional": true,
           "requires": {
-            "pinkie": "2.0.4"
+            "pinkie": "^2.0.0"
           }
         },
         "process-nextick-args": {
@@ -3925,10 +3998,10 @@
           "dev": true,
           "optional": true,
           "requires": {
-            "deep-extend": "0.4.1",
-            "ini": "1.3.4",
-            "minimist": "1.2.0",
-            "strip-json-comments": "2.0.1"
+            "deep-extend": "~0.4.0",
+            "ini": "~1.3.0",
+            "minimist": "^1.2.0",
+            "strip-json-comments": "~2.0.1"
           },
           "dependencies": {
             "minimist": {
@@ -3945,13 +4018,13 @@
           "dev": true,
           "optional": true,
           "requires": {
-            "buffer-shims": "1.0.0",
-            "core-util-is": "1.0.2",
-            "inherits": "2.0.3",
-            "isarray": "1.0.0",
-            "process-nextick-args": "1.0.7",
-            "string_decoder": "0.10.31",
-            "util-deprecate": "1.0.2"
+            "buffer-shims": "^1.0.0",
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.1",
+            "isarray": "~1.0.0",
+            "process-nextick-args": "~1.0.6",
+            "string_decoder": "~0.10.x",
+            "util-deprecate": "~1.0.1"
           }
         },
         "request": {
@@ -3960,26 +4033,26 @@
           "dev": true,
           "optional": true,
           "requires": {
-            "aws-sign2": "0.6.0",
-            "aws4": "1.6.0",
-            "caseless": "0.11.0",
-            "combined-stream": "1.0.5",
-            "extend": "3.0.0",
-            "forever-agent": "0.6.1",
-            "form-data": "2.1.2",
-            "har-validator": "2.0.6",
-            "hawk": "3.1.3",
-            "http-signature": "1.1.1",
-            "is-typedarray": "1.0.0",
-            "isstream": "0.1.2",
-            "json-stringify-safe": "5.0.1",
-            "mime-types": "2.1.14",
-            "oauth-sign": "0.8.2",
-            "qs": "6.3.1",
-            "stringstream": "0.0.5",
-            "tough-cookie": "2.3.2",
-            "tunnel-agent": "0.4.3",
-            "uuid": "3.0.1"
+            "aws-sign2": "~0.6.0",
+            "aws4": "^1.2.1",
+            "caseless": "~0.11.0",
+            "combined-stream": "~1.0.5",
+            "extend": "~3.0.0",
+            "forever-agent": "~0.6.1",
+            "form-data": "~2.1.1",
+            "har-validator": "~2.0.6",
+            "hawk": "~3.1.3",
+            "http-signature": "~1.1.0",
+            "is-typedarray": "~1.0.0",
+            "isstream": "~0.1.2",
+            "json-stringify-safe": "~5.0.1",
+            "mime-types": "~2.1.7",
+            "oauth-sign": "~0.8.1",
+            "qs": "~6.3.0",
+            "stringstream": "~0.0.4",
+            "tough-cookie": "~2.3.0",
+            "tunnel-agent": "~0.4.1",
+            "uuid": "^3.0.0"
           }
         },
         "rimraf": {
@@ -3987,7 +4060,7 @@
           "bundled": true,
           "dev": true,
           "requires": {
-            "glob": "7.1.1"
+            "glob": "^7.0.5"
           }
         },
         "semver": {
@@ -4014,7 +4087,7 @@
           "dev": true,
           "optional": true,
           "requires": {
-            "hoek": "2.16.3"
+            "hoek": "2.x.x"
           }
         },
         "sshpk": {
@@ -4023,15 +4096,15 @@
           "dev": true,
           "optional": true,
           "requires": {
-            "asn1": "0.2.3",
-            "assert-plus": "1.0.0",
-            "bcrypt-pbkdf": "1.0.1",
-            "dashdash": "1.14.1",
-            "ecc-jsbn": "0.1.1",
-            "getpass": "0.1.6",
-            "jodid25519": "1.0.2",
-            "jsbn": "0.1.1",
-            "tweetnacl": "0.14.5"
+            "asn1": "~0.2.3",
+            "assert-plus": "^1.0.0",
+            "bcrypt-pbkdf": "^1.0.0",
+            "dashdash": "^1.12.0",
+            "ecc-jsbn": "~0.1.1",
+            "getpass": "^0.1.1",
+            "jodid25519": "^1.0.0",
+            "jsbn": "~0.1.0",
+            "tweetnacl": "~0.14.0"
           },
           "dependencies": {
             "assert-plus": {
@@ -4047,9 +4120,9 @@
           "bundled": true,
           "dev": true,
           "requires": {
-            "code-point-at": "1.1.0",
-            "is-fullwidth-code-point": "1.0.0",
-            "strip-ansi": "3.0.1"
+            "code-point-at": "^1.0.0",
+            "is-fullwidth-code-point": "^1.0.0",
+            "strip-ansi": "^3.0.0"
           }
         },
         "string_decoder": {
@@ -4068,7 +4141,7 @@
           "bundled": true,
           "dev": true,
           "requires": {
-            "ansi-regex": "2.1.1"
+            "ansi-regex": "^2.0.0"
           }
         },
         "strip-json-comments": {
@@ -4088,9 +4161,9 @@
           "bundled": true,
           "dev": true,
           "requires": {
-            "block-stream": "0.0.9",
-            "fstream": "1.0.10",
-            "inherits": "2.0.3"
+            "block-stream": "*",
+            "fstream": "^1.0.2",
+            "inherits": "2"
           }
         },
         "tar-pack": {
@@ -4099,14 +4172,14 @@
           "dev": true,
           "optional": true,
           "requires": {
-            "debug": "2.2.0",
-            "fstream": "1.0.10",
-            "fstream-ignore": "1.0.5",
-            "once": "1.3.3",
-            "readable-stream": "2.1.5",
-            "rimraf": "2.5.4",
-            "tar": "2.2.1",
-            "uid-number": "0.0.6"
+            "debug": "~2.2.0",
+            "fstream": "~1.0.10",
+            "fstream-ignore": "~1.0.5",
+            "once": "~1.3.3",
+            "readable-stream": "~2.1.4",
+            "rimraf": "~2.5.1",
+            "tar": "~2.2.1",
+            "uid-number": "~0.0.6"
           },
           "dependencies": {
             "once": {
@@ -4115,7 +4188,7 @@
               "dev": true,
               "optional": true,
               "requires": {
-                "wrappy": "1.0.2"
+                "wrappy": "1"
               }
             },
             "readable-stream": {
@@ -4124,13 +4197,13 @@
               "dev": true,
               "optional": true,
               "requires": {
-                "buffer-shims": "1.0.0",
-                "core-util-is": "1.0.2",
-                "inherits": "2.0.3",
-                "isarray": "1.0.0",
-                "process-nextick-args": "1.0.7",
-                "string_decoder": "0.10.31",
-                "util-deprecate": "1.0.2"
+                "buffer-shims": "^1.0.0",
+                "core-util-is": "~1.0.0",
+                "inherits": "~2.0.1",
+                "isarray": "~1.0.0",
+                "process-nextick-args": "~1.0.6",
+                "string_decoder": "~0.10.x",
+                "util-deprecate": "~1.0.1"
               }
             }
           }
@@ -4141,7 +4214,7 @@
           "dev": true,
           "optional": true,
           "requires": {
-            "punycode": "1.4.1"
+            "punycode": "^1.4.1"
           }
         },
         "tunnel-agent": {
@@ -4188,7 +4261,7 @@
           "dev": true,
           "optional": true,
           "requires": {
-            "string-width": "1.0.2"
+            "string-width": "^1.0.1"
           }
         },
         "wrappy": {
@@ -4210,10 +4283,10 @@
       "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
       "dev": true,
       "requires": {
-        "graceful-fs": "4.1.11",
-        "inherits": "2.0.3",
-        "mkdirp": "0.5.1",
-        "rimraf": "2.6.1"
+        "graceful-fs": "^4.1.2",
+        "inherits": "~2.0.0",
+        "mkdirp": ">=0.5 0",
+        "rimraf": "2"
       }
     },
     "function-bind": {
@@ -4228,14 +4301,14 @@
       "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
       "dev": true,
       "requires": {
-        "aproba": "1.1.2",
-        "console-control-strings": "1.1.0",
-        "has-unicode": "2.0.1",
-        "object-assign": "4.1.1",
-        "signal-exit": "3.0.2",
-        "string-width": "1.0.2",
-        "strip-ansi": "3.0.1",
-        "wide-align": "1.1.2"
+        "aproba": "^1.0.3",
+        "console-control-strings": "^1.0.0",
+        "has-unicode": "^2.0.0",
+        "object-assign": "^4.1.0",
+        "signal-exit": "^3.0.0",
+        "string-width": "^1.0.1",
+        "strip-ansi": "^3.0.1",
+        "wide-align": "^1.1.0"
       },
       "dependencies": {
         "is-fullwidth-code-point": {
@@ -4244,7 +4317,7 @@
           "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
           "dev": true,
           "requires": {
-            "number-is-nan": "1.0.1"
+            "number-is-nan": "^1.0.0"
           }
         },
         "string-width": {
@@ -4253,9 +4326,9 @@
           "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
           "dev": true,
           "requires": {
-            "code-point-at": "1.1.0",
-            "is-fullwidth-code-point": "1.0.0",
-            "strip-ansi": "3.0.1"
+            "code-point-at": "^1.0.0",
+            "is-fullwidth-code-point": "^1.0.0",
+            "strip-ansi": "^3.0.0"
           }
         }
       }
@@ -4266,7 +4339,7 @@
       "integrity": "sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU=",
       "dev": true,
       "requires": {
-        "globule": "1.1.0"
+        "globule": "^1.0.0"
       }
     },
     "get-caller-file": {
@@ -4293,7 +4366,7 @@
       "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
       "dev": true,
       "requires": {
-        "assert-plus": "1.0.0"
+        "assert-plus"

<TRUNCATED>

[3/5] metron git commit: METRON-1671 Create PCAP UI (tiborm via merrimanr) closes apache/metron#1103

Posted by rm...@apache.org.
http://git-wip-us.apache.org/repos/asf/metron/blob/d5eb56a9/metron-interface/metron-alerts/src/app/app-routing.module.ts
----------------------------------------------------------------------
diff --git a/metron-interface/metron-alerts/src/app/app-routing.module.ts b/metron-interface/metron-alerts/src/app/app-routing.module.ts
index 8357d66..56ad41c 100644
--- a/metron-interface/metron-alerts/src/app/app-routing.module.ts
+++ b/metron-interface/metron-alerts/src/app/app-routing.module.ts
@@ -26,7 +26,8 @@ const routes: Routes = [
   { path: 'alerts-list', loadChildren: 'app/alerts/alerts-list/alerts-list.module#AlertsListModule', canActivate: [AuthGuard]},
   { path: 'save-search', loadChildren: 'app/alerts/save-search/save-search.module#SaveSearchModule', canActivate: [AuthGuard]},
   { path: 'saved-searches', loadChildren: 'app/alerts/saved-searches/saved-searches.module.ts#SavedSearchesModule',
-      canActivate: [AuthGuard]}
+      canActivate: [AuthGuard]},
+  { path: 'pcap', loadChildren: 'app/pcap/pcap.module#PcapModule', canActivate: [AuthGuard] }
 ];
 
 @NgModule({

http://git-wip-us.apache.org/repos/asf/metron/blob/d5eb56a9/metron-interface/metron-alerts/src/app/app.component.html
----------------------------------------------------------------------
diff --git a/metron-interface/metron-alerts/src/app/app.component.html b/metron-interface/metron-alerts/src/app/app.component.html
index 8867a9b..1b992ca 100644
--- a/metron-interface/metron-alerts/src/app/app.component.html
+++ b/metron-interface/metron-alerts/src/app/app.component.html
@@ -16,6 +16,14 @@
         <a class="" href="#">
             <img alt="" src="../assets/images/logo.png" width="135" height="45">
         </a>
+        <ul class="nav ml-4">
+            <li class="nav-item" routerLinkActive="active">
+                <a class="nav-link " routerLink="/alerts-list" routerLinkActive="active">Alerts</a>
+            </li>
+            <li class="nav-item" routerLinkActive="active">
+                <a class="nav-link" routerLink="/pcap" routerLinkActive="active">PCAP</a>
+            </li>
+        </ul>
         <div class="logout ml-auto">Logged in as {{authService.currentUser}} - <span class="logout-link" (click)="authService.logout()">Logout</span></div>
     </nav>
     <div class="container-fluid">

http://git-wip-us.apache.org/repos/asf/metron/blob/d5eb56a9/metron-interface/metron-alerts/src/app/app.component.scss
----------------------------------------------------------------------
diff --git a/metron-interface/metron-alerts/src/app/app.component.scss b/metron-interface/metron-alerts/src/app/app.component.scss
index 8358e7f..8505ee8 100644
--- a/metron-interface/metron-alerts/src/app/app.component.scss
+++ b/metron-interface/metron-alerts/src/app/app.component.scss
@@ -27,6 +27,24 @@
   max-height: 50px;
 }
 
+.nav-link
+{
+  padding-bottom: 0;
+  padding-top: 0;
+  color: inherit;
+}
+
+.nav-item.active
+{
+  border-bottom: 3px solid #32abe2;
+  margin-bottom: 5px;
+}
+
+.nav-link.active
+{
+  color: #ffffff;
+}
+
 .logout {
   padding-left: 10px;
 }

http://git-wip-us.apache.org/repos/asf/metron/blob/d5eb56a9/metron-interface/metron-alerts/src/app/app.module.ts
----------------------------------------------------------------------
diff --git a/metron-interface/metron-alerts/src/app/app.module.ts b/metron-interface/metron-alerts/src/app/app.module.ts
index 227eaab..82b4970 100644
--- a/metron-interface/metron-alerts/src/app/app.module.ts
+++ b/metron-interface/metron-alerts/src/app/app.module.ts
@@ -46,8 +46,7 @@ import {MetaAlertService} from './service/meta-alert.service';
 import {MetaAlertsModule} from './alerts/meta-alerts/meta-alerts.module';
 import {SearchService} from './service/search.service';
 import { GlobalConfigService } from './service/global-config.service';
-
-
+import {PcapModule} from './pcap/pcap.module';
 
 export function initConfig(config: ColumnNamesService) {
   return () => config.list();
@@ -70,7 +69,8 @@ export function initConfig(config: ColumnNamesService) {
     ConfigureRowsModule,
     SaveSearchModule,
     SavedSearchesModule,
-    SwitchModule
+    SwitchModule,
+    PcapModule
   ],
   providers: [{ provide: APP_INITIALIZER, useFactory: initConfig, deps: [ColumnNamesService], multi: true },
               { provide: DataSource, useClass: ElasticSearchLocalstorageImpl },

http://git-wip-us.apache.org/repos/asf/metron/blob/d5eb56a9/metron-interface/metron-alerts/src/app/pcap/model/pcap.request.ts
----------------------------------------------------------------------
diff --git a/metron-interface/metron-alerts/src/app/pcap/model/pcap.request.ts b/metron-interface/metron-alerts/src/app/pcap/model/pcap.request.ts
new file mode 100644
index 0000000..3a27714
--- /dev/null
+++ b/metron-interface/metron-alerts/src/app/pcap/model/pcap.request.ts
@@ -0,0 +1,29 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing software
+ * distributed under the License is distributed on an "AS IS" BASIS
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export class PcapRequest {
+  startTimeMs: number = 0;
+  endTimeMs: number = 150000000000000000;
+  ipSrcAddr: string = '';
+  ipSrcPort: string = '';
+  ipDstAddr: string = '';
+  ipDstPort: string = '';
+  protocol: string = '';
+  packetFilter: string = '';
+  includeReverse: boolean = false;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/metron/blob/d5eb56a9/metron-interface/metron-alerts/src/app/pcap/model/pdml.ts
----------------------------------------------------------------------
diff --git a/metron-interface/metron-alerts/src/app/pcap/model/pdml.ts b/metron-interface/metron-alerts/src/app/pcap/model/pdml.ts
new file mode 100644
index 0000000..97fc347
--- /dev/null
+++ b/metron-interface/metron-alerts/src/app/pcap/model/pdml.ts
@@ -0,0 +1,50 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing software
+ * distributed under the License is distributed on an "AS IS" BASIS
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+ export class PdmlField {
+  //public $: any[]
+    public name: string;
+  public fields?: PdmlField[]
+  public show: string;
+  public value: string;
+  public showname: string;
+}
+
+export class PdmlProto {
+  //public $: any
+    public name: string;
+    public showname: string;
+  public fields: PdmlField[]
+  
+  public static findField(p: PdmlProto, name: string): PdmlField {
+    return p.fields.find(f => f['name'] == name)
+  }
+}
+
+
+export class PdmlPacket {
+  //public $: any
+    public name: string;
+  public protos: PdmlProto[]
+  public expanded: boolean = false
+}
+
+export class Pdml {
+  public name: string;
+  public packets: PdmlPacket[];
+}

http://git-wip-us.apache.org/repos/asf/metron/blob/d5eb56a9/metron-interface/metron-alerts/src/app/pcap/pcap-filters/pcap-filters.component.html
----------------------------------------------------------------------
diff --git a/metron-interface/metron-alerts/src/app/pcap/pcap-filters/pcap-filters.component.html b/metron-interface/metron-alerts/src/app/pcap/pcap-filters/pcap-filters.component.html
new file mode 100644
index 0000000..abc4cf0
--- /dev/null
+++ b/metron-interface/metron-alerts/src/app/pcap/pcap-filters/pcap-filters.component.html
@@ -0,0 +1,52 @@
+<!--
+  Licensed to the Apache Software
+	Foundation (ASF) under one or more contributor license agreements. See the
+	NOTICE file distributed with this work for additional information regarding
+	copyright ownership. The ASF licenses this file to You under the Apache License,
+	Version 2.0 (the "License"); you may not use this file except in compliance
+	with the License. You may obtain a copy of the License at
+  http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing, software distributed
+	under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
+	OR CONDITIONS OF ANY KIND, either express or implied. See the License for
+  the specific language governing permissions and limitations under the License.
+  -->
+<form (ngSubmit)="onSubmit()" #f="ngForm" class="form-inline pcap-search">
+  <div class="form-group">
+    <label for="ip_src_addr">IP Source Address</label>
+    <input name="ip_src_addr" #ip_src_addr="ngModel" class="form-control" pattern="^(?:\d{1,3}\.){3}\d{1,3}(.\d{1,2})?$" [(ngModel)]="model.ipSrcAddr">
+  </div>
+  
+  <div class="form-group">
+    <label for="ip_src_port">IP Source Port</label>
+    <input name="ip_src_port" #ip_src_port="ngModel" class="form-control" type="number" [(ngModel)]="model.ipSrcPort">
+  </div>
+
+  <div class="form-group"><label for="ip_dest_addr">IP Dest Address</label>
+    <input name="ip_dest_addr" #ip_dest_addr="ngModel" class="form-control" pattern="^(?:\d{1,3}\.){3}\d{1,3}(.\d{1,2})?$" [(ngModel)]="model.ipDstAddr">
+  </div>
+
+  <div class="form-group">
+    <label for="ip_dest_port">IP Dest Port</label>
+    <input id="ip_dest_port" name="ip_dest_port" #ip_dest_port="ngModel" class="form-control" type="number" [(ngModel)]="model.ipDstPort">
+  </div>
+
+    <div class="form-group">
+        <label for="protocol">Protocol</label>
+        <input id="protocol" name="protocol" #protocol="ngModel" class="form-control" [(ngModel)]="model.protocol">
+    </div>
+
+    <div class="form-group">
+        <label for="includeReverseTraffic">Include Reverse Traffic</label>
+        <input id="includeReverseTraffic" name="includeReverseTraffic" #includeReverseTraffic="ngModel" class="form-control" type="checkbox" [(ngModel)]="model.includeReverse">
+    </div>
+
+  <div class="form-group">
+    <label for="filter">Filter</label>
+    <input id="filter" name="filter" #filter="ngModel" class="form-control" [(ngModel)]="model.packetFilter">
+  </div>
+
+  <div class="form-group">
+    <button type="submit" [ngClass]="{'disabled':!f.form.valid || queryRunning}" class="btn btn-primary btn-search" [disabled]="!f.form.valid || queryRunning"></button>
+  </div>
+</form>

http://git-wip-us.apache.org/repos/asf/metron/blob/d5eb56a9/metron-interface/metron-alerts/src/app/pcap/pcap-filters/pcap-filters.component.scss
----------------------------------------------------------------------
diff --git a/metron-interface/metron-alerts/src/app/pcap/pcap-filters/pcap-filters.component.scss b/metron-interface/metron-alerts/src/app/pcap/pcap-filters/pcap-filters.component.scss
new file mode 100644
index 0000000..80bac08
--- /dev/null
+++ b/metron-interface/metron-alerts/src/app/pcap/pcap-filters/pcap-filters.component.scss
@@ -0,0 +1,69 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+@import "../../../vendor.scss";
+@import "../../../styles.scss";
+@import "../../../variables.scss";
+
+.ng-valid[required], .ng-valid.required  {
+  
+}
+
+.ng-invalid:not(form)  {
+  border-left: 5px solid #a94442; /* red */
+}
+
+.form-group {
+  padding-right: 0.75em;
+  label {
+    margin-right: 1em;
+  }
+}
+
+.btn-search {
+
+  min-width: 42px;
+  padding-left: 0;
+  padding-right: 0;
+  border: 1px solid $blue-chill !important;
+  cursor: pointer;
+
+  &:focus {
+    box-shadow: none;
+  }
+
+  &::before {
+    font-family: "FontAwesome";
+    content: '\f002';
+    color: $piction-blue;
+  }
+}
+
+.pcap-search {
+
+  padding-bottom: 15px;
+
+  label {
+    font-size: 15px;
+  }
+
+  button {
+    padding-top: 6px;
+    padding-bottom: 6px;
+    background: $icon-button-background;
+  }
+}

http://git-wip-us.apache.org/repos/asf/metron/blob/d5eb56a9/metron-interface/metron-alerts/src/app/pcap/pcap-filters/pcap-filters.component.spec.ts
----------------------------------------------------------------------
diff --git a/metron-interface/metron-alerts/src/app/pcap/pcap-filters/pcap-filters.component.spec.ts b/metron-interface/metron-alerts/src/app/pcap/pcap-filters/pcap-filters.component.spec.ts
new file mode 100644
index 0000000..8134f1d
--- /dev/null
+++ b/metron-interface/metron-alerts/src/app/pcap/pcap-filters/pcap-filters.component.spec.ts
@@ -0,0 +1,46 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { PcapFiltersComponent } from './pcap-filters.component';
+import { FormsModule } from '../../../../node_modules/@angular/forms';
+
+describe('PcapFiltersComponent', () => {
+  let component: PcapFiltersComponent;
+  let fixture: ComponentFixture<PcapFiltersComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      imports: [
+        FormsModule
+      ],
+      declarations: [ PcapFiltersComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(PcapFiltersComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});

http://git-wip-us.apache.org/repos/asf/metron/blob/d5eb56a9/metron-interface/metron-alerts/src/app/pcap/pcap-filters/pcap-filters.component.ts
----------------------------------------------------------------------
diff --git a/metron-interface/metron-alerts/src/app/pcap/pcap-filters/pcap-filters.component.ts b/metron-interface/metron-alerts/src/app/pcap/pcap-filters/pcap-filters.component.ts
new file mode 100644
index 0000000..e16d71b
--- /dev/null
+++ b/metron-interface/metron-alerts/src/app/pcap/pcap-filters/pcap-filters.component.ts
@@ -0,0 +1,41 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
+import { PcapRequest } from '../model/pcap.request'
+
+@Component({
+  selector: 'app-pcap-filters',
+  templateUrl: './pcap-filters.component.html',
+  styleUrls: ['./pcap-filters.component.scss']
+})
+export class PcapFiltersComponent implements OnInit {
+
+  @Input() queryRunning: boolean = true;
+  @Output() search: EventEmitter<PcapRequest> = new EventEmitter<PcapRequest>();
+
+  model = new PcapRequest();
+
+  constructor() { }
+
+  ngOnInit() {
+  }
+
+  onSubmit() {
+    this.search.emit(this.model)
+  }
+}

http://git-wip-us.apache.org/repos/asf/metron/blob/d5eb56a9/metron-interface/metron-alerts/src/app/pcap/pcap-list/pcap-list.component.html
----------------------------------------------------------------------
diff --git a/metron-interface/metron-alerts/src/app/pcap/pcap-list/pcap-list.component.html b/metron-interface/metron-alerts/src/app/pcap/pcap-list/pcap-list.component.html
new file mode 100644
index 0000000..92dfb1d
--- /dev/null
+++ b/metron-interface/metron-alerts/src/app/pcap/pcap-list/pcap-list.component.html
@@ -0,0 +1,37 @@
+<!--
+  Licensed to the Apache Software
+	Foundation (ASF) under one or more contributor license agreements. See the
+	NOTICE file distributed with this work for additional information regarding
+	copyright ownership. The ASF licenses this file to You under the Apache License,
+	Version 2.0 (the "License"); you may not use this file except in compliance
+	with the License. You may obtain a copy of the License at
+  http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing, software distributed
+	under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
+	OR CONDITIONS OF ANY KIND, either express or implied. See the License for
+  the specific language governing permissions and limitations under the License.
+  -->
+<div class="table-wrapper">
+  <table class="table table-sm">
+    <thead>
+      <tr>
+        <th scope="col">Timestamp</th>
+        <th scope="col">Source Addr</th>
+        <th scope="col">Source Port</th>
+        <th scope="col">Dest Addr</th>
+        <th scope="col">Dest Port</th>
+        <th scope="col">Protocol</th>
+      </tr>
+    </thead>
+    <tbody>
+      <ng-container *ngFor="let packet of packets">
+        <tr (click)="toggle(packet)" app-pcap-packet-line [packet]="packet"></tr>
+        <tr *ngIf="packet.expanded">
+          <td colspan="6" class="pcap-packet">
+            <app-pcap-packet [packet]="packet"></app-pcap-packet>
+          </td>
+        </tr>
+      </ng-container>
+    </tbody>
+  </table>
+</div>

http://git-wip-us.apache.org/repos/asf/metron/blob/d5eb56a9/metron-interface/metron-alerts/src/app/pcap/pcap-list/pcap-list.component.scss
----------------------------------------------------------------------
diff --git a/metron-interface/metron-alerts/src/app/pcap/pcap-list/pcap-list.component.scss b/metron-interface/metron-alerts/src/app/pcap/pcap-list/pcap-list.component.scss
new file mode 100644
index 0000000..b724782
--- /dev/null
+++ b/metron-interface/metron-alerts/src/app/pcap/pcap-list/pcap-list.component.scss
@@ -0,0 +1,21 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+.pcap-packet {
+  padding-top: 0;
+  border-top: none;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/metron/blob/d5eb56a9/metron-interface/metron-alerts/src/app/pcap/pcap-list/pcap-list.component.spec.ts
----------------------------------------------------------------------
diff --git a/metron-interface/metron-alerts/src/app/pcap/pcap-list/pcap-list.component.spec.ts b/metron-interface/metron-alerts/src/app/pcap/pcap-list/pcap-list.component.spec.ts
new file mode 100644
index 0000000..1ac8c70
--- /dev/null
+++ b/metron-interface/metron-alerts/src/app/pcap/pcap-list/pcap-list.component.spec.ts
@@ -0,0 +1,70 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { PcapListComponent } from './pcap-list.component';
+import { FormsModule } from '../../../../node_modules/@angular/forms';
+import { PdmlPacket } from '../model/pdml';
+import { Component, Input } from '@angular/core';
+import { PcapPacketLineComponent } from '../pcap-packet-line/pcap-packet-line.component';
+import { PcapPacketComponent } from '../pcap-packet/pcap-packet.component';
+
+@Component({
+  selector: '[app-pcap-packet-line]',
+  template: ``,
+})
+class FakePcapPacketLineComponent {
+  @Input() packet: PdmlPacket;
+}
+
+@Component({
+  selector: 'app-pcap-packet',
+  template: ``,
+})
+class FakePcapPacketComponent {
+  @Input() packet: PdmlPacket;
+}
+
+describe('PcapListComponent', () => {
+  let component: PcapListComponent;
+  let fixture: ComponentFixture<PcapListComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      imports: [
+        FormsModule
+      ],
+      declarations: [
+        FakePcapPacketLineComponent,
+        FakePcapPacketComponent,
+        PcapListComponent,
+      ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(PcapListComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});

http://git-wip-us.apache.org/repos/asf/metron/blob/d5eb56a9/metron-interface/metron-alerts/src/app/pcap/pcap-list/pcap-list.component.ts
----------------------------------------------------------------------
diff --git a/metron-interface/metron-alerts/src/app/pcap/pcap-list/pcap-list.component.ts b/metron-interface/metron-alerts/src/app/pcap/pcap-list/pcap-list.component.ts
new file mode 100644
index 0000000..fbc1aec
--- /dev/null
+++ b/metron-interface/metron-alerts/src/app/pcap/pcap-list/pcap-list.component.ts
@@ -0,0 +1,39 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { Component, OnInit, Input } from '@angular/core';
+import { Pdml,PdmlPacket } from '../model/pdml'
+
+@Component({
+  selector: 'app-pcap-list',
+  templateUrl: './pcap-list.component.html',
+  styleUrls: ['./pcap-list.component.scss']
+})
+export class PcapListComponent implements OnInit {
+
+  @Input() packets: PdmlPacket[]
+
+  constructor() { }
+
+  ngOnInit() {
+  }
+
+  toggle(packet) {
+    packet.expanded= !packet.expanded
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/metron/blob/d5eb56a9/metron-interface/metron-alerts/src/app/pcap/pcap-packet-line/pcap-packet-line.component.html
----------------------------------------------------------------------
diff --git a/metron-interface/metron-alerts/src/app/pcap/pcap-packet-line/pcap-packet-line.component.html b/metron-interface/metron-alerts/src/app/pcap/pcap-packet-line/pcap-packet-line.component.html
new file mode 100644
index 0000000..25724ee
--- /dev/null
+++ b/metron-interface/metron-alerts/src/app/pcap/pcap-packet-line/pcap-packet-line.component.html
@@ -0,0 +1,19 @@
+<!--
+  Licensed to the Apache Software
+	Foundation (ASF) under one or more contributor license agreements. See the
+	NOTICE file distributed with this work for additional information regarding
+	copyright ownership. The ASF licenses this file to You under the Apache License,
+	Version 2.0 (the "License"); you may not use this file except in compliance
+	with the License. You may obtain a copy of the License at
+  http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing, software distributed
+	under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
+	OR CONDITIONS OF ANY KIND, either express or implied. See the License for
+  the specific language governing permissions and limitations under the License.
+  -->
+<td class="timestamp">{{ip.timestamp.value}} <span class="date">{{ip.timestamp.show}}</span></td>
+<td class="ip-addr">{{ip.ipSrcAddr.show}}</td>
+<td class="ip-port">{{ip.ipSrcPort.show}}</td>
+<td class="ip-addr">{{ip.ipDestAddr.show}}</td>
+<td class="ip-port">{{ip.ipDestPort.show}}</td>
+<td class="ip-protocol">{{ip.protocol.showname}}</td>

http://git-wip-us.apache.org/repos/asf/metron/blob/d5eb56a9/metron-interface/metron-alerts/src/app/pcap/pcap-packet-line/pcap-packet-line.component.scss
----------------------------------------------------------------------
diff --git a/metron-interface/metron-alerts/src/app/pcap/pcap-packet-line/pcap-packet-line.component.scss b/metron-interface/metron-alerts/src/app/pcap/pcap-packet-line/pcap-packet-line.component.scss
new file mode 100644
index 0000000..a3f036c
--- /dev/null
+++ b/metron-interface/metron-alerts/src/app/pcap/pcap-packet-line/pcap-packet-line.component.scss
@@ -0,0 +1,17 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/metron/blob/d5eb56a9/metron-interface/metron-alerts/src/app/pcap/pcap-packet-line/pcap-packet-line.component.spec.ts
----------------------------------------------------------------------
diff --git a/metron-interface/metron-alerts/src/app/pcap/pcap-packet-line/pcap-packet-line.component.spec.ts b/metron-interface/metron-alerts/src/app/pcap/pcap-packet-line/pcap-packet-line.component.spec.ts
new file mode 100644
index 0000000..e01f9c6
--- /dev/null
+++ b/metron-interface/metron-alerts/src/app/pcap/pcap-packet-line/pcap-packet-line.component.spec.ts
@@ -0,0 +1,1283 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { PcapPacketLineComponent } from './pcap-packet-line.component';
+import { PdmlPacket } from '../model/pdml';
+
+describe('PcapPacketLineComponent', () => {
+  let component: PcapPacketLineComponent;
+  let fixture: ComponentFixture<PcapPacketLineComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ PcapPacketLineComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(PcapPacketLineComponent);
+    component = fixture.componentInstance;
+    component.packet = fakePacket as PdmlPacket;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
+
+const fakePacket = {
+  name: "something",
+  expanded: false,
+  protos: [
+    {
+      "name": "geninfo",
+      "pos": "0",
+      "showname": "General information",
+      "size": "722",
+      "hide": null,
+      "fields": [
+        {
+          "name": "num",
+          "pos": "0",
+          "showname": "Number",
+          "size": "722",
+          "value": "1",
+          "show": "1",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "len",
+          "pos": "0",
+          "showname": "Frame Length",
+          "size": "722",
+          "value": "2d2",
+          "show": "722",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "caplen",
+          "pos": "0",
+          "showname": "Captured Length",
+          "size": "722",
+          "value": "2d2",
+          "show": "722",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "timestamp",
+          "pos": "0",
+          "showname": "Captured Time",
+          "size": "722",
+          "value": "1458240269.373968000",
+          "show": "Mar 17, 2016 18:44:29.373968000 UTC",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        }
+      ]
+    },
+    {
+      "name": "frame",
+      "pos": "0",
+      "showname": "Frame 1: 722 bytes on wire (5776 bits), 722 bytes captured (5776 bits)",
+      "size": "722",
+      "hide": null,
+      "fields": [
+        {
+          "name": "frame.dlt",
+          "pos": "0",
+          "showname": "WTAP_ENCAP: 1",
+          "size": "0",
+          "value": null,
+          "show": "1",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "frame.time",
+          "pos": "0",
+          "showname": "Arrival Time: Mar 17, 2016 18:44:29.373968000 UTC",
+          "size": "0",
+          "value": null,
+          "show": "Mar 17, 2016 18:44:29.373968000",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "frame.offset_shift",
+          "pos": "0",
+          "showname": "Time shift for this packet: 0.000000000 seconds",
+          "size": "0",
+          "value": null,
+          "show": "0.000000000",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "frame.time_epoch",
+          "pos": "0",
+          "showname": "Epoch Time: 1458240269.373968000 seconds",
+          "size": "0",
+          "value": null,
+          "show": "1458240269.373968000",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "frame.time_delta",
+          "pos": "0",
+          "showname": "Time delta from previous captured frame: 0.000000000 seconds",
+          "size": "0",
+          "value": null,
+          "show": "0.000000000",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "frame.time_delta_displayed",
+          "pos": "0",
+          "showname": "Time delta from previous displayed frame: 0.000000000 seconds",
+          "size": "0",
+          "value": null,
+          "show": "0.000000000",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "frame.time_relative",
+          "pos": "0",
+          "showname": "Time since reference or first frame: 0.000000000 seconds",
+          "size": "0",
+          "value": null,
+          "show": "0.000000000",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "frame.number",
+          "pos": "0",
+          "showname": "Frame Number: 1",
+          "size": "0",
+          "value": null,
+          "show": "1",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "frame.len",
+          "pos": "0",
+          "showname": "Frame Length: 722 bytes (5776 bits)",
+          "size": "0",
+          "value": null,
+          "show": "722",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "frame.cap_len",
+          "pos": "0",
+          "showname": "Capture Length: 722 bytes (5776 bits)",
+          "size": "0",
+          "value": null,
+          "show": "722",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "frame.marked",
+          "pos": "0",
+          "showname": "Frame is marked: False",
+          "size": "0",
+          "value": null,
+          "show": "0",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "frame.ignored",
+          "pos": "0",
+          "showname": "Frame is ignored: False",
+          "size": "0",
+          "value": null,
+          "show": "0",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "frame.protocols",
+          "pos": "0",
+          "showname": "Protocols in frame: eth:ip:tcp:ssh",
+          "size": "0",
+          "value": null,
+          "show": "eth:ip:tcp:ssh",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        }
+      ]
+    },
+    {
+      "name": "eth",
+      "pos": "0",
+      "showname": "Ethernet II, Src: CadmusCo_96:a4:7a (08:00:27:96:a4:7a), Dst: 0a:00:27:00:00:00 (0a:00:27:00:00:00)",
+      "size": "14",
+      "hide": null,
+      "fields": [
+        {
+          "name": "eth.dst",
+          "pos": "0",
+          "showname": "Destination: 0a:00:27:00:00:00 (0a:00:27:00:00:00)",
+          "size": "6",
+          "value": "0a0027000000",
+          "show": "0a:00:27:00:00:00",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": [
+            {
+              "name": "eth.addr",
+              "pos": "0",
+              "showname": "Address: 0a:00:27:00:00:00 (0a:00:27:00:00:00)",
+              "size": "6",
+              "value": "0a0027000000",
+              "show": "0a:00:27:00:00:00",
+              "unmaskedvalue": null,
+              "hide": null,
+              "fields": null,
+              "protos": null
+            },
+            {
+              "name": "eth.lg",
+              "pos": "0",
+              "showname": ".... ..1. .... .... .... .... = LG bit: Locally administered address (this is NOT the factory default)",
+              "size": "3",
+              "value": "1",
+              "show": "1",
+              "unmaskedvalue": "0a0027",
+              "hide": null,
+              "fields": null,
+              "protos": null
+            },
+            {
+              "name": "eth.ig",
+              "pos": "0",
+              "showname": ".... ...0 .... .... .... .... = IG bit: Individual address (unicast)",
+              "size": "3",
+              "value": "0",
+              "show": "0",
+              "unmaskedvalue": "0a0027",
+              "hide": null,
+              "fields": null,
+              "protos": null
+            }
+          ],
+          "protos": null
+        },
+        {
+          "name": "eth.src",
+          "pos": "6",
+          "showname": "Source: CadmusCo_96:a4:7a (08:00:27:96:a4:7a)",
+          "size": "6",
+          "value": "08002796a47a",
+          "show": "08:00:27:96:a4:7a",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": [
+            {
+              "name": "eth.addr",
+              "pos": "6",
+              "showname": "Address: CadmusCo_96:a4:7a (08:00:27:96:a4:7a)",
+              "size": "6",
+              "value": "08002796a47a",
+              "show": "08:00:27:96:a4:7a",
+              "unmaskedvalue": null,
+              "hide": null,
+              "fields": null,
+              "protos": null
+            },
+            {
+              "name": "eth.lg",
+              "pos": "6",
+              "showname": ".... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)",
+              "size": "3",
+              "value": "0",
+              "show": "0",
+              "unmaskedvalue": "080027",
+              "hide": null,
+              "fields": null,
+              "protos": null
+            },
+            {
+              "name": "eth.ig",
+              "pos": "6",
+              "showname": ".... ...0 .... .... .... .... = IG bit: Individual address (unicast)",
+              "size": "3",
+              "value": "0",
+              "show": "0",
+              "unmaskedvalue": "080027",
+              "hide": null,
+              "fields": null,
+              "protos": null
+            }
+          ],
+          "protos": null
+        },
+        {
+          "name": "eth.type",
+          "pos": "12",
+          "showname": "Type: IP (0x0800)",
+          "size": "2",
+          "value": "0800",
+          "show": "0x0800",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        }
+      ]
+    },
+    {
+      "name": "ip",
+      "pos": "14",
+      "showname": "Internet Protocol Version 4, Src: 192.168.66.121 (192.168.66.121), Dst: 192.168.66.1 (192.168.66.1)",
+      "size": "20",
+      "hide": null,
+      "fields": [
+        {
+          "name": "ip.version",
+          "pos": "14",
+          "showname": "Version: 4",
+          "size": "1",
+          "value": "45",
+          "show": "4",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "ip.hdr_len",
+          "pos": "14",
+          "showname": "Header length: 20 bytes",
+          "size": "1",
+          "value": "45",
+          "show": "20",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "ip.dsfield",
+          "pos": "15",
+          "showname": "Differentiated Services Field: 0x10 (DSCP 0x04: Unknown DSCP; ECN: 0x00: Not-ECT (Not ECN-Capable Transport))",
+          "size": "1",
+          "value": "10",
+          "show": "16",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": [
+            {
+              "name": "ip.dsfield.dscp",
+              "pos": "15",
+              "showname": "0001 00.. = Differentiated Services Codepoint: Unknown (0x04)",
+              "size": "1",
+              "value": "4",
+              "show": "0x04",
+              "unmaskedvalue": "10",
+              "hide": null,
+              "fields": null,
+              "protos": null
+            },
+            {
+              "name": "ip.dsfield.ecn",
+              "pos": "15",
+              "showname": ".... ..00 = Explicit Congestion Notification: Not-ECT (Not ECN-Capable Transport) (0x00)",
+              "size": "1",
+              "value": "0",
+              "show": "0x00",
+              "unmaskedvalue": "10",
+              "hide": null,
+              "fields": null,
+              "protos": null
+            }
+          ],
+          "protos": null
+        },
+        {
+          "name": "ip.len",
+          "pos": "16",
+          "showname": "Total Length: 708",
+          "size": "2",
+          "value": "02c4",
+          "show": "708",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "ip.id",
+          "pos": "18",
+          "showname": "Identification: 0x7cd9 (31961)",
+          "size": "2",
+          "value": "7cd9",
+          "show": "0x7cd9",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "ip.flags",
+          "pos": "20",
+          "showname": "Flags: 0x02 (Don't Fragment)",
+          "size": "1",
+          "value": "40",
+          "show": "0x02",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": [
+            {
+              "name": "ip.flags.rb",
+              "pos": "20",
+              "showname": "0... .... = Reserved bit: Not set",
+              "size": "1",
+              "value": "40",
+              "show": "0",
+              "unmaskedvalue": null,
+              "hide": null,
+              "fields": null,
+              "protos": null
+            },
+            {
+              "name": "ip.flags.df",
+              "pos": "20",
+              "showname": ".1.. .... = Don't fragment: Set",
+              "size": "1",
+              "value": "40",
+              "show": "1",
+              "unmaskedvalue": null,
+              "hide": null,
+              "fields": null,
+              "protos": null
+            },
+            {
+              "name": "ip.flags.mf",
+              "pos": "20",
+              "showname": "..0. .... = More fragments: Not set",
+              "size": "1",
+              "value": "40",
+              "show": "0",
+              "unmaskedvalue": null,
+              "hide": null,
+              "fields": null,
+              "protos": null
+            }
+          ],
+          "protos": null
+        },
+        {
+          "name": "ip.frag_offset",
+          "pos": "20",
+          "showname": "Fragment offset: 0",
+          "size": "2",
+          "value": "4000",
+          "show": "0",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "ip.ttl",
+          "pos": "22",
+          "showname": "Time to live: 64",
+          "size": "1",
+          "value": "40",
+          "show": "64",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "ip.proto",
+          "pos": "23",
+          "showname": "Protocol: TCP (6)",
+          "size": "1",
+          "value": "06",
+          "show": "6",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "ip.checksum",
+          "pos": "24",
+          "showname": "Header checksum: 0xb57f [correct]",
+          "size": "2",
+          "value": "b57f",
+          "show": "0xb57f",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": [
+            {
+              "name": "ip.checksum_good",
+              "pos": "24",
+              "showname": "Good: True",
+              "size": "2",
+              "value": "b57f",
+              "show": "1",
+              "unmaskedvalue": null,
+              "hide": null,
+              "fields": null,
+              "protos": null
+            },
+            {
+              "name": "ip.checksum_bad",
+              "pos": "24",
+              "showname": "Bad: False",
+              "size": "2",
+              "value": "b57f",
+              "show": "0",
+              "unmaskedvalue": null,
+              "hide": null,
+              "fields": null,
+              "protos": null
+            }
+          ],
+          "protos": null
+        },
+        {
+          "name": "ip.src",
+          "pos": "26",
+          "showname": "Source: 192.168.66.121 (192.168.66.121)",
+          "size": "4",
+          "value": "c0a84279",
+          "show": "192.168.66.121",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "ip.addr",
+          "pos": "26",
+          "showname": "Source or Destination Address: 192.168.66.121 (192.168.66.121)",
+          "size": "4",
+          "value": "c0a84279",
+          "show": "192.168.66.121",
+          "unmaskedvalue": null,
+          "hide": "yes",
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "ip.src_host",
+          "pos": "26",
+          "showname": "Source Host: 192.168.66.121",
+          "size": "4",
+          "value": "c0a84279",
+          "show": "192.168.66.121",
+          "unmaskedvalue": null,
+          "hide": "yes",
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "ip.host",
+          "pos": "26",
+          "showname": "Source or Destination Host: 192.168.66.121",
+          "size": "4",
+          "value": "c0a84279",
+          "show": "192.168.66.121",
+          "unmaskedvalue": null,
+          "hide": "yes",
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "ip.dst",
+          "pos": "30",
+          "showname": "Destination: 192.168.66.1 (192.168.66.1)",
+          "size": "4",
+          "value": "c0a84201",
+          "show": "192.168.66.1",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "ip.addr",
+          "pos": "30",
+          "showname": "Source or Destination Address: 192.168.66.1 (192.168.66.1)",
+          "size": "4",
+          "value": "c0a84201",
+          "show": "192.168.66.1",
+          "unmaskedvalue": null,
+          "hide": "yes",
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "ip.dst_host",
+          "pos": "30",
+          "showname": "Destination Host: 192.168.66.1",
+          "size": "4",
+          "value": "c0a84201",
+          "show": "192.168.66.1",
+          "unmaskedvalue": null,
+          "hide": "yes",
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "ip.host",
+          "pos": "30",
+          "showname": "Source or Destination Host: 192.168.66.1",
+          "size": "4",
+          "value": "c0a84201",
+          "show": "192.168.66.1",
+          "unmaskedvalue": null,
+          "hide": "yes",
+          "fields": null,
+          "protos": null
+        }
+      ]
+    },
+    {
+      "name": "tcp",
+      "pos": "34",
+      "showname": "Transmission Control Protocol, Src Port: ssh (22), Dst Port: 55791 (55791), Seq: 1, Ack: 1, Len: 656",
+      "size": "32",
+      "hide": null,
+      "fields": [
+        {
+          "name": "tcp.srcport",
+          "pos": "34",
+          "showname": "Source port: ssh (22)",
+          "size": "2",
+          "value": "0016",
+          "show": "22",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "tcp.dstport",
+          "pos": "36",
+          "showname": "Destination port: 55791 (55791)",
+          "size": "2",
+          "value": "d9ef",
+          "show": "55791",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "tcp.port",
+          "pos": "34",
+          "showname": "Source or Destination Port: 22",
+          "size": "2",
+          "value": "0016",
+          "show": "22",
+          "unmaskedvalue": null,
+          "hide": "yes",
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "tcp.port",
+          "pos": "36",
+          "showname": "Source or Destination Port: 55791",
+          "size": "2",
+          "value": "d9ef",
+          "show": "55791",
+          "unmaskedvalue": null,
+          "hide": "yes",
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "tcp.stream",
+          "pos": "34",
+          "showname": "Stream index: 0",
+          "size": "0",
+          "value": null,
+          "show": "0",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "tcp.len",
+          "pos": "46",
+          "showname": "TCP Segment Len: 656",
+          "size": "1",
+          "value": "80",
+          "show": "656",
+          "unmaskedvalue": null,
+          "hide": "yes",
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "tcp.seq",
+          "pos": "38",
+          "showname": "Sequence number: 1    (relative sequence number)",
+          "size": "4",
+          "value": "12903044",
+          "show": "1",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "tcp.nxtseq",
+          "pos": "34",
+          "showname": "Next sequence number: 657    (relative sequence number)",
+          "size": "0",
+          "value": null,
+          "show": "657",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "tcp.ack",
+          "pos": "42",
+          "showname": "Acknowledgment number: 1    (relative ack number)",
+          "size": "4",
+          "value": "8b92f3e7",
+          "show": "1",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "tcp.hdr_len",
+          "pos": "46",
+          "showname": "Header length: 32 bytes",
+          "size": "1",
+          "value": "80",
+          "show": "32",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "tcp.flags",
+          "pos": "46",
+          "showname": "Flags: 0x018 (PSH, ACK)",
+          "size": "2",
+          "value": "18",
+          "show": "0x0018",
+          "unmaskedvalue": "8018",
+          "hide": null,
+          "fields": [
+            {
+              "name": "tcp.flags.res",
+              "pos": "46",
+              "showname": "000. .... .... = Reserved: Not set",
+              "size": "1",
+              "value": "0",
+              "show": "0",
+              "unmaskedvalue": "80",
+              "hide": null,
+              "fields": null,
+              "protos": null
+            },
+            {
+              "name": "tcp.flags.ns",
+              "pos": "46",
+              "showname": "...0 .... .... = Nonce: Not set",
+              "size": "1",
+              "value": "0",
+              "show": "0",
+              "unmaskedvalue": "80",
+              "hide": null,
+              "fields": null,
+              "protos": null
+            },
+            {
+              "name": "tcp.flags.cwr",
+              "pos": "47",
+              "showname": ".... 0... .... = Congestion Window Reduced (CWR): Not set",
+              "size": "1",
+              "value": "0",
+              "show": "0",
+              "unmaskedvalue": "18",
+              "hide": null,
+              "fields": null,
+              "protos": null
+            },
+            {
+              "name": "tcp.flags.ecn",
+              "pos": "47",
+              "showname": ".... .0.. .... = ECN-Echo: Not set",
+              "size": "1",
+              "value": "0",
+              "show": "0",
+              "unmaskedvalue": "18",
+              "hide": null,
+              "fields": null,
+              "protos": null
+            },
+            {
+              "name": "tcp.flags.urg",
+              "pos": "47",
+              "showname": ".... ..0. .... = Urgent: Not set",
+              "size": "1",
+              "value": "0",
+              "show": "0",
+              "unmaskedvalue": "18",
+              "hide": null,
+              "fields": null,
+              "protos": null
+            },
+            {
+              "name": "tcp.flags.ack",
+              "pos": "47",
+              "showname": ".... ...1 .... = Acknowledgment: Set",
+              "size": "1",
+              "value": "1",
+              "show": "1",
+              "unmaskedvalue": "18",
+              "hide": null,
+              "fields": null,
+              "protos": null
+            },
+            {
+              "name": "tcp.flags.push",
+              "pos": "47",
+              "showname": ".... .... 1... = Push: Set",
+              "size": "1",
+              "value": "1",
+              "show": "1",
+              "unmaskedvalue": "18",
+              "hide": null,
+              "fields": null,
+              "protos": null
+            },
+            {
+              "name": "tcp.flags.reset",
+              "pos": "47",
+              "showname": ".... .... .0.. = Reset: Not set",
+              "size": "1",
+              "value": "0",
+              "show": "0",
+              "unmaskedvalue": "18",
+              "hide": null,
+              "fields": null,
+              "protos": null
+            },
+            {
+              "name": "tcp.flags.syn",
+              "pos": "47",
+              "showname": ".... .... ..0. = Syn: Not set",
+              "size": "1",
+              "value": "0",
+              "show": "0",
+              "unmaskedvalue": "18",
+              "hide": null,
+              "fields": null,
+              "protos": null
+            },
+            {
+              "name": "tcp.flags.fin",
+              "pos": "47",
+              "showname": ".... .... ...0 = Fin: Not set",
+              "size": "1",
+              "value": "0",
+              "show": "0",
+              "unmaskedvalue": "18",
+              "hide": null,
+              "fields": null,
+              "protos": null
+            }
+          ],
+          "protos": null
+        },
+        {
+          "name": "tcp.window_size_value",
+          "pos": "48",
+          "showname": "Window size value: 501",
+          "size": "2",
+          "value": "01f5",
+          "show": "501",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "tcp.window_size",
+          "pos": "48",
+          "showname": "Calculated window size: 501",
+          "size": "2",
+          "value": "01f5",
+          "show": "501",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "tcp.window_size_scalefactor",
+          "pos": "48",
+          "showname": "Window size scaling factor: -1 (unknown)",
+          "size": "2",
+          "value": "01f5",
+          "show": "-1",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        },
+        {
+          "name": "tcp.checksum",
+          "pos": "50",
+          "showname": "Checksum: 0x0882 [validation disabled]",
+          "size": "2",
+          "value": "0882",
+          "show": "0x0882",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": [
+            {
+              "name": "tcp.checksum_good",
+              "pos": "50",
+              "showname": "Good Checksum: False",
+              "size": "2",
+              "value": "0882",
+              "show": "0",
+              "unmaskedvalue": null,
+              "hide": null,
+              "fields": null,
+              "protos": null
+            },
+            {
+              "name": "tcp.checksum_bad",
+              "pos": "50",
+              "showname": "Bad Checksum: False",
+              "size": "2",
+              "value": "0882",
+              "show": "0",
+              "unmaskedvalue": null,
+              "hide": null,
+              "fields": null,
+              "protos": null
+            }
+          ],
+          "protos": null
+        },
+        {
+          "name": "tcp.options",
+          "pos": "54",
+          "showname": "Options: (12 bytes), No-Operation (NOP), No-Operation (NOP), Timestamps",
+          "size": "12",
+          "value": "0101080a0014f4f811bdb98f",
+          "show": "01:01:08:0a:00:14:f4:f8:11:bd:b9:8f",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": [
+            {
+              "name": "",
+              "pos": "54",
+              "showname": null,
+              "size": "1",
+              "value": "01",
+              "show": "No-Operation (NOP)",
+              "unmaskedvalue": null,
+              "hide": null,
+              "fields": [
+                {
+                  "name": "ip.opt.type",
+                  "pos": "54",
+                  "showname": "Type: 1",
+                  "size": "1",
+                  "value": "01",
+                  "show": "1",
+                  "unmaskedvalue": null,
+                  "hide": null,
+                  "fields": [
+                    {
+                      "name": "ip.opt.type.copy",
+                      "pos": "54",
+                      "showname": "0... .... = Copy on fragmentation: No",
+                      "size": "1",
+                      "value": "0",
+                      "show": "0",
+                      "unmaskedvalue": "01",
+                      "hide": null,
+                      "fields": null,
+                      "protos": null
+                    },
+                    {
+                      "name": "ip.opt.type.class",
+                      "pos": "54",
+                      "showname": ".00. .... = Class: Control (0)",
+                      "size": "1",
+                      "value": "0",
+                      "show": "0",
+                      "unmaskedvalue": "01",
+                      "hide": null,
+                      "fields": null,
+                      "protos": null
+                    },
+                    {
+                      "name": "ip.opt.type.number",
+                      "pos": "54",
+                      "showname": "...0 0001 = Number: No-Operation (NOP) (1)",
+                      "size": "1",
+                      "value": "1",
+                      "show": "1",
+                      "unmaskedvalue": "01",
+                      "hide": null,
+                      "fields": null,
+                      "protos": null
+                    }
+                  ],
+                  "protos": null
+                }
+              ],
+              "protos": null
+            },
+            {
+              "name": "",
+              "pos": "55",
+              "showname": null,
+              "size": "1",
+              "value": "01",
+              "show": "No-Operation (NOP)",
+              "unmaskedvalue": null,
+              "hide": null,
+              "fields": [
+                {
+                  "name": "ip.opt.type",
+                  "pos": "55",
+                  "showname": "Type: 1",
+                  "size": "1",
+                  "value": "01",
+                  "show": "1",
+                  "unmaskedvalue": null,
+                  "hide": null,
+                  "fields": [
+                    {
+                      "name": "ip.opt.type.copy",
+                      "pos": "55",
+                      "showname": "0... .... = Copy on fragmentation: No",
+                      "size": "1",
+                      "value": "0",
+                      "show": "0",
+                      "unmaskedvalue": "01",
+                      "hide": null,
+                      "fields": null,
+                      "protos": null
+                    },
+                    {
+                      "name": "ip.opt.type.class",
+                      "pos": "55",
+                      "showname": ".00. .... = Class: Control (0)",
+                      "size": "1",
+                      "value": "0",
+                      "show": "0",
+                      "unmaskedvalue": "01",
+                      "hide": null,
+                      "fields": null,
+                      "protos": null
+                    },
+                    {
+                      "name": "ip.opt.type.number",
+                      "pos": "55",
+                      "showname": "...0 0001 = Number: No-Operation (NOP) (1)",
+                      "size": "1",
+                      "value": "1",
+                      "show": "1",
+                      "unmaskedvalue": "01",
+                      "hide": null,
+                      "fields": null,
+                      "protos": null
+                    }
+                  ],
+                  "protos": null
+                }
+              ],
+              "protos": null
+            },
+            {
+              "name": "",
+              "pos": "56",
+              "showname": null,
+              "size": "10",
+              "value": "080a0014f4f811bdb98f",
+              "show": "Timestamps: TSval 1373432, TSecr 297646479",
+              "unmaskedvalue": null,
+              "hide": null,
+              "fields": [
+                {
+                  "name": "tcp.option_kind",
+                  "pos": "56",
+                  "showname": "Kind: Timestamp (8)",
+                  "size": "1",
+                  "value": "08",
+                  "show": "8",
+                  "unmaskedvalue": null,
+                  "hide": null,
+                  "fields": null,
+                  "protos": null
+                },
+                {
+                  "name": "tcp.option_len",
+                  "pos": "57",
+                  "showname": "Length: 10",
+                  "size": "1",
+                  "value": "0a",
+                  "show": "10",
+                  "unmaskedvalue": null,
+                  "hide": null,
+                  "fields": null,
+                  "protos": null
+                },
+                {
+                  "name": "tcp.options.timestamp.tsval",
+                  "pos": "58",
+                  "showname": "Timestamp value: 1373432",
+                  "size": "4",
+                  "value": "0014f4f8",
+                  "show": "1373432",
+                  "unmaskedvalue": null,
+                  "hide": null,
+                  "fields": null,
+                  "protos": null
+                },
+                {
+                  "name": "tcp.options.timestamp.tsecr",
+                  "pos": "62",
+                  "showname": "Timestamp echo reply: 297646479",
+                  "size": "4",
+                  "value": "11bdb98f",
+                  "show": "297646479",
+                  "unmaskedvalue": null,
+                  "hide": null,
+                  "fields": null,
+                  "protos": null
+                }
+              ],
+              "protos": null
+            }
+          ],
+          "protos": null
+        },
+        {
+          "name": "tcp.analysis",
+          "pos": "34",
+          "showname": "SEQ/ACK analysis",
+          "size": "0",
+          "value": "",
+          "show": "",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": [
+            {
+              "name": "tcp.analysis.bytes_in_flight",
+              "pos": "34",
+              "showname": "Bytes in flight: 656",
+              "size": "0",
+              "value": null,
+              "show": "656",
+              "unmaskedvalue": null,
+              "hide": null,
+              "fields": null,
+              "protos": null
+            }
+          ],
+          "protos": null
+        }
+      ]
+    },
+    {
+      "name": "ssh",
+      "pos": "66",
+      "showname": "SSH Protocol",
+      "size": "656",
+      "hide": null,
+      "fields": [
+        {
+          "name": "ssh.encrypted_packet",
+          "pos": "66",
+          "showname": "Encrypted Packet: 5b2bfe1fa006867834412184af9f5b239737763adead7140...",
+          "size": "656",
+          "value": "5b2bfe1fa006867834412184af9f5b239737763adead71408fc01b88e548b2cc86f341a39771c6ed16f2b0bb3e6ab6109e73c7d68ca7545852f91930e4633c17fb9dc7aa794b0d820d0fa3ac65bf0f013e5449d5953d2943506657e2b76b548e67f5c9ce1a4c53db1b52465bde7208baf11f3fe01975418b4db186a38ad32947d1908b62e532da4b729353a932423d25f5f734484076aa4143c6a74937a4ea49448e261ae1ecb6b07bbdf5c98d0855940a19018c88263b8936f7b3e9a4b6cd98090fa10a10e37ad20fe5d833071ad6d5b2886ba85ec72affb83e316443dbe29dbf643e6aa05595c90765cf85f6da55cc1c09d8dccc7d05da022429ad602a559a044b7e2663b0c153a3011bf824ef8d1fa56cba957c5f5d2276a1c9e92de65782f406848c6e20f634c5d1fea843a8bf1a4058e85553f5838f7299958fbf54be84e46c5a3c3965f8bed7fe03a9a1168a892e0073adeb54deca171a318d11fc1a8179f91632310213da327965a40bc6fe18eae55e8da6b57d7ef9f3a05b42381bcb3db8f8efd6d0c638a2cdd46efb0b8f1274e98672f644b2275947e626b02e5166f86c2dd4a67b81e213f8c064927a396815db589f10e5e521ffedb13f8edbe2de01c6fc8bf0e12c82212e497794aa045e9b6fcca83b4cad0a3b5e6ca2d1feaf8887b4d64f22989396e
 cfa8f7f1835eed422580505109fed36797bdc10a9168d5148daef6a8710c3df1d6366c9763ab4ebd359d86a8ea14819252fb52ba423422d1f60b0179316b3729e479ba07e88cb886938c8daae65d470dde91e5336e0fc4221a72cc49057d878aa5924875d097483e94bc44a4ea93aee8780e56c50a405932841f50da156e1f90559a7c4f76999442fb433a26fc703dea656bbe03790ac3c9c5318ff5f81d87d483524bbfe7ff167",
+          "show": "5b:2b:fe:1f:a0:06:86:78:34:41:21:84:af:9f:5b:23:97:37:76:3a:de:ad:71:40:8f:c0:1b:88:e5:48:b2:cc:86:f3:41:a3:97:71:c6:ed:16:f2:b0:bb:3e:6a:b6:10:9e:73:c7:d6:8c:a7:54:58:52:f9:19:30:e4:63:3c:17:fb:9d:c7:aa:79:4b:0d:82:0d:0f:a3:ac:65:bf:0f:01:3e:54:49:d5:95:3d:29:43:50:66:57:e2:b7:6b:54:8e:67:f5:c9:ce:1a:4c:53:db:1b:52:46:5b:de:72:08:ba:f1:1f:3f:e0:19:75:41:8b:4d:b1:86:a3:8a:d3:29:47:d1:90:8b:62:e5:32:da:4b:72:93:53:a9:32:42:3d:25:f5:f7:34:48:40:76:aa:41:43:c6:a7:49:37:a4:ea:49:44:8e:26:1a:e1:ec:b6:b0:7b:bd:f5:c9:8d:08:55:94:0a:19:01:8c:88:26:3b:89:36:f7:b3:e9:a4:b6:cd:98:09:0f:a1:0a:10:e3:7a:d2:0f:e5:d8:33:07:1a:d6:d5:b2:88:6b:a8:5e:c7:2a:ff:b8:3e:31:64:43:db:e2:9d:bf:64:3e:6a:a0:55:95:c9:07:65:cf:85:f6:da:55:cc:1c:09:d8:dc:cc:7d:05:da:02:24:29:ad:60:2a:55:9a:04:4b:7e:26:63:b0:c1:53:a3:01:1b:f8:24:ef:8d:1f:a5:6c:ba:95:7c:5f:5d:22:76:a1:c9:e9:2d:e6:57:82:f4:06:84:8c:6e:20:f6:34:c5:d1:fe:a8:43:a8:bf:1a:40:58:e8:55:53:f5:83:8f:72:99:95:8f:bf:54:be:84:e4:6c:5a:3c:39:65:
 f8:be:d7:fe:03:a9:a1:16:8a:89:2e:00:73:ad:eb:54:de:ca:17:1a:31:8d:11:fc:1a:81:79:f9:16:32:31:02:13:da:32:79:65:a4:0b:c6:fe:18:ea:e5:5e:8d:a6:b5:7d:7e:f9:f3:a0:5b:42:38:1b:cb:3d:b8:f8:ef:d6:d0:c6:38:a2:cd:d4:6e:fb:0b:8f:12:74:e9:86:72:f6:44:b2:27:59:47:e6:26:b0:2e:51:66:f8:6c:2d:d4:a6:7b:81:e2:13:f8:c0:64:92:7a:39:68:15:db:58:9f:10:e5:e5:21:ff:ed:b1:3f:8e:db:e2:de:01:c6:fc:8b:f0:e1:2c:82:21:2e:49:77:94:aa:04:5e:9b:6f:cc:a8:3b:4c:ad:0a:3b:5e:6c:a2:d1:fe:af:88:87:b4:d6:4f:22:98:93:96:ec:fa:8f:7f:18:35:ee:d4:22:58:05:05:10:9f:ed:36:79:7b:dc:10:a9:16:8d:51:48:da:ef:6a:87:10:c3:df:1d:63:66:c9:76:3a:b4:eb:d3:59:d8:6a:8e:a1:48:19:25:2f:b5:2b:a4:23:42:2d:1f:60:b0:17:93:16:b3:72:9e:47:9b:a0:7e:88:cb:88:69:38:c8:da:ae:65:d4:70:dd:e9:1e:53:36:e0:fc:42:21:a7:2c:c4:90:57:d8:78:aa:59:24:87:5d:09:74:83:e9:4b:c4:4a:4e:a9:3a:ee:87:80:e5:6c:50:a4:05:93:28:41:f5:0d:a1:56:e1:f9:05:59:a7:c4:f7:69:99:44:2f:b4:33:a2:6f:c7:03:de:a6:56:bb:e0:37:90:ac:3c:9c:53:18:ff:5f:81:d8:7d:48:35:24:bb:fe:7f:f1:67",
+          "unmaskedvalue": null,
+          "hide": null,
+          "fields": null,
+          "protos": null
+        }
+      ]
+    }
+  ]
+};

http://git-wip-us.apache.org/repos/asf/metron/blob/d5eb56a9/metron-interface/metron-alerts/src/app/pcap/pcap-packet-line/pcap-packet-line.component.ts
----------------------------------------------------------------------
diff --git a/metron-interface/metron-alerts/src/app/pcap/pcap-packet-line/pcap-packet-line.component.ts b/metron-interface/metron-alerts/src/app/pcap/pcap-packet-line/pcap-packet-line.component.ts
new file mode 100644
index 0000000..bb160a0
--- /dev/null
+++ b/metron-interface/metron-alerts/src/app/pcap/pcap-packet-line/pcap-packet-line.component.ts
@@ -0,0 +1,55 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { Component, OnInit, Input } from '@angular/core';
+import { PdmlPacket, PdmlProto, PdmlField } from '../model/pdml'
+
+@Component({
+  selector: '[app-pcap-packet-line]',
+  templateUrl: './pcap-packet-line.component.html',
+  styleUrls: ['./pcap-packet-line.component.scss']
+})
+export class PcapPacketLineComponent implements OnInit {
+
+  @Input() packet: PdmlPacket
+
+  ip: {
+    timestamp: PdmlField,
+    ipSrcAddr: PdmlField, ipSrcPort: PdmlField,
+    ipDestAddr: PdmlField, ipDestPort: PdmlField,
+    protocol: PdmlField
+  }
+
+  constructor() { }
+
+  ngOnInit() {
+    const genProto: PdmlProto = this.packet.protos.filter(p => p.name == "geninfo")[0]
+    const ipProto: PdmlProto = this.packet.protos.filter(p => p.name == "ip")[0]
+    const tcpProto: PdmlProto = this.packet.protos.filter(p => p.name == "tcp")[0]
+
+    this.ip = {
+      timestamp: PdmlProto.findField(genProto,'timestamp'),
+      ipSrcAddr: PdmlProto.findField(ipProto,'ip.src'),
+      ipSrcPort: PdmlProto.findField(tcpProto,'tcp.srcport'),
+      ipDestAddr: PdmlProto.findField(ipProto,'ip.dst'),
+      ipDestPort: PdmlProto.findField(tcpProto,'tcp.dstport'),
+      protocol: PdmlProto.findField(ipProto,'ip.proto')
+    };
+  }
+
+
+}

http://git-wip-us.apache.org/repos/asf/metron/blob/d5eb56a9/metron-interface/metron-alerts/src/app/pcap/pcap-packet/pcap-packet.component.html
----------------------------------------------------------------------
diff --git a/metron-interface/metron-alerts/src/app/pcap/pcap-packet/pcap-packet.component.html b/metron-interface/metron-alerts/src/app/pcap/pcap-packet/pcap-packet.component.html
new file mode 100644
index 0000000..750c315
--- /dev/null
+++ b/metron-interface/metron-alerts/src/app/pcap/pcap-packet/pcap-packet.component.html
@@ -0,0 +1,21 @@
+<!--
+  Licensed to the Apache Software
+	Foundation (ASF) under one or more contributor license agreements. See the
+	NOTICE file distributed with this work for additional information regarding
+	copyright ownership. The ASF licenses this file to You under the Apache License,
+	Version 2.0 (the "License"); you may not use this file except in compliance
+	with the License. You may obtain a copy of the License at
+  http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing, software distributed
+	under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
+	OR CONDITIONS OF ANY KIND, either express or implied. See the License for
+  the specific language governing permissions and limitations under the License.
+  -->
+<div class="proto" *ngFor="let proto of packet.protos" (click)="proto.expanded = !proto.expanded">
+  <div class="proto-header">{{ proto.showname }}</div>
+  <div class="proto-fields" *ngIf="proto.expanded">
+    <div *ngFor="let field of proto.fields">
+      <span class="field-name">{{ field.name}}</span> {{ field.showname}}
+    </div>
+  </div>
+</div>

http://git-wip-us.apache.org/repos/asf/metron/blob/d5eb56a9/metron-interface/metron-alerts/src/app/pcap/pcap-packet/pcap-packet.component.scss
----------------------------------------------------------------------
diff --git a/metron-interface/metron-alerts/src/app/pcap/pcap-packet/pcap-packet.component.scss b/metron-interface/metron-alerts/src/app/pcap/pcap-packet/pcap-packet.component.scss
new file mode 100644
index 0000000..e9d4662
--- /dev/null
+++ b/metron-interface/metron-alerts/src/app/pcap/pcap-packet/pcap-packet.component.scss
@@ -0,0 +1,36 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+@import "../../../_variables.scss";
+
+.proto-header {
+  font-weight: bold;
+  border-top: 1px solid $table-border-color;
+}
+
+.proto {
+  margin-left: 1em;
+}
+
+.proto-fields {
+  margin-left: 1em;
+}
+
+
+.field-name {
+  display: none
+}


[5/5] metron git commit: METRON-1671 Create PCAP UI (tiborm via merrimanr) closes apache/metron#1103

Posted by rm...@apache.org.
METRON-1671 Create PCAP UI (tiborm via merrimanr) closes apache/metron#1103


Project: http://git-wip-us.apache.org/repos/asf/metron/repo
Commit: http://git-wip-us.apache.org/repos/asf/metron/commit/d5eb56a9
Tree: http://git-wip-us.apache.org/repos/asf/metron/tree/d5eb56a9
Diff: http://git-wip-us.apache.org/repos/asf/metron/diff/d5eb56a9

Branch: refs/heads/feature/METRON-1554-pcap-query-panel
Commit: d5eb56a967ac7b925d0a843c027a2b0dde66de06
Parents: 7dff4de
Author: tiborm <ti...@gmail.com>
Authored: Wed Aug 1 11:31:50 2018 -0500
Committer: rmerriman <me...@gmail.com>
Committed: Wed Aug 1 11:31:50 2018 -0500

----------------------------------------------------------------------
 .../metron-alerts/package-lock.json             | 3719 +++++++++---------
 .../metron-alerts/src/app/app-routing.module.ts |    3 +-
 .../metron-alerts/src/app/app.component.html    |    8 +
 .../metron-alerts/src/app/app.component.scss    |   18 +
 .../metron-alerts/src/app/app.module.ts         |    6 +-
 .../src/app/pcap/model/pcap.request.ts          |   29 +
 .../metron-alerts/src/app/pcap/model/pdml.ts    |   50 +
 .../pcap-filters/pcap-filters.component.html    |   52 +
 .../pcap-filters/pcap-filters.component.scss    |   69 +
 .../pcap-filters/pcap-filters.component.spec.ts |   46 +
 .../pcap/pcap-filters/pcap-filters.component.ts |   41 +
 .../app/pcap/pcap-list/pcap-list.component.html |   37 +
 .../app/pcap/pcap-list/pcap-list.component.scss |   21 +
 .../pcap/pcap-list/pcap-list.component.spec.ts  |   70 +
 .../app/pcap/pcap-list/pcap-list.component.ts   |   39 +
 .../pcap-packet-line.component.html             |   19 +
 .../pcap-packet-line.component.scss             |   17 +
 .../pcap-packet-line.component.spec.ts          | 1283 ++++++
 .../pcap-packet-line.component.ts               |   55 +
 .../pcap/pcap-packet/pcap-packet.component.html |   21 +
 .../pcap/pcap-packet/pcap-packet.component.scss |   36 +
 .../pcap-packet/pcap-packet.component.spec.ts   | 1283 ++++++
 .../pcap/pcap-packet/pcap-packet.component.ts   |   39 +
 .../pcap/pcap-panel/pcap-panel.component.html   |   31 +
 .../pcap/pcap-panel/pcap-panel.component.scss   |   52 +
 .../pcap-panel/pcap-panel.component.spec.ts     |   68 +
 .../app/pcap/pcap-panel/pcap-panel.component.ts |   75 +
 .../metron-alerts/src/app/pcap/pcap.module.ts   |   50 +
 .../metron-alerts/src/app/pcap/pcap.routing.ts  |   27 +
 .../src/app/pcap/service/pcap.service.spec.ts   | 1752 +++++++++
 .../src/app/pcap/service/pcap.service.ts        |   68 +
 31 files changed, 7304 insertions(+), 1780 deletions(-)
----------------------------------------------------------------------