You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@metron.apache.org by mm...@apache.org on 2017/01/27 16:36:11 UTC

[1/3] incubator-metron git commit: METRON-627: Add HyperLogLogPlus implementation to Stellar (mmiklavc) closes apache/incubator-metron#397

Repository: incubator-metron
Updated Branches:
  refs/heads/master 9890018af -> f3ca3c05e


http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/f3ca3c05/metron-platform/metron-integration-test/src/main/sample/data/SampleInput/PaloaltoOutput
----------------------------------------------------------------------
diff --git a/metron-platform/metron-integration-test/src/main/sample/data/SampleInput/PaloaltoOutput b/metron-platform/metron-integration-test/src/main/sample/data/SampleInput/PaloaltoOutput
index 16793a2..d4f02e2 100644
--- a/metron-platform/metron-integration-test/src/main/sample/data/SampleInput/PaloaltoOutput
+++ b/metron-platform/metron-integration-test/src/main/sample/data/SampleInput/PaloaltoOutput
@@ -15,7 +15,7 @@
 <11>Jan  5 05:48:38 PAN1.exampleCustomer.com 1,2015/01/05 05:48:38,0006C110285,THREAT,vulnerability,1,2015/01/05 05:48:38,10.0.0.115,216.0.10.198,0.0.0.0,0.0.0.0,EX-Allow,example\user.name,,web-browsing,vsys1,internal,external,ethernet1/2,ethernet1/1,LOG-Default,2015/01/05 05:48:38,48136,1,54557,80,0,0,0x80004000,tcp,reset-both,"ad.aspx?f=300x250&id=12;tile=1;ord=EDD821C39BC0A49777874E02F7FA",HTTP: IIS Denial Of Service Attempt(40019),any,high,client-to-server,347373997,0x0,10.0.0.0-10.255.255.255,US,0,,1200568889751109676,, 
 <11>Jan  5 05:39:01 PAN1.exampleCustomer.com 1,2015/01/05 05:39:00,0006C110285,THREAT,vulnerability,1,2015/01/05 05:39:00,10.0.0.115,216.0.10.198,0.0.0.0,0.0.0.0,EX-Allow,example\user.name,,web-browsing,vsys1,internal,external,ethernet1/2,ethernet1/1,LOG-Default,2015/01/05 05:39:00,60649,1,54209,80,0,0,0x80004000,tcp,reset-both,"ad.aspx?f=728x90&id=1;tile=1;ord=6510BF66C3B427ED44AC521752E695",HTTP: IIS Denial Of Service Attempt(40019),any,high,client-to-server,347368140,0x0,10.0.0.0-10.255.255.255,US,0,,1200568889751109674,, 
 <12>Jan  5 06:41:35 PAN1.exampleCustomer.com 1,2015/01/05 06:41:34,0006C113118,THREAT,virus,1,2015/01/05 06:41:34,94.0.0.3,10.0.0.208,94.0.0.3,211.0.10.226,EX-Allow,,example\user.name,web-browsing,vsys1,untrust,trust,ethernet1/1,ethernet1/2,LOG-Default,2015/01/05 06:41:34,16864,2,80,60194,80,56595,0x404000,tcp,deny,"FreemakeVideoConverterSetup.exe",Virus/Win32.WGeneric.dyxeh(2367869),any,medium,server-to-client,40462931,0x0,GB,10.0.0.0-10.255.255.255,0,,0,, 
-<10>Jan  5 05:58:47 PAN1 1,2015/01/05 05:58:46,009401011564,THREAT,vulnerability,1,2015/01/05 05:58:46,10.0.0.38,10.3.0.31,0.0.0.0,0.0.0.0,INT_out,,,ms-ds-smb,vsys1,v_internal,v_external,ethernet1/4,ethernet1/3,LOG-Default,2015/01/05 05:58:46,44183,1,60510,445,0,0,0x80004000,tcp,reset-both,"",Microsoft Windows SMBv2 Remote Code Execution Vulnerability(32541),any,critical,client-to-server,724178,0x0,Unknown,Unknown,0,,1200515273392656547,, 
+<10>Jan  5 05:58:47 PAN1 1,2015/01/05 05:58:46,009401011564,THREAT,vulnerability,1,2015/01/05 05:58:46,10.0.0.38,10.3.0.31,0.0.0.0,0.0.0.0,INT_out,,,ms-stats-smb,vsys1,v_internal,v_external,ethernet1/4,ethernet1/3,LOG-Default,2015/01/05 05:58:46,44183,1,60510,445,0,0,0x80004000,tcp,reset-both,"",Microsoft Windows SMBv2 Remote Code Execution Vulnerability(32541),any,critical,client-to-server,724178,0x0,Unknown,Unknown,0,,1200515273392656547,,
 <11>Jan  5 07:41:48 PAN1.exampleCustomer.com 1,2015/01/05 07:41:47,0006C110285,THREAT,vulnerability,1,2015/01/05 07:41:47,10.0.0.115,216.0.10.230,0.0.0.0,0.0.0.0,EX-Allow,example\user.name,,web-browsing,vsys1,internal,external,ethernet1/2,ethernet1/1,LOG-Default,2015/01/05 07:41:47,20240,1,65530,80,0,0,0x80004000,tcp,reset-both,"ad.aspx?f=300x250&id=12;tile=1;ord=9944D12C8FB4EB798036CAD371C6",HTTP: IIS Denial Of Service Attempt(40019),any,high,client-to-server,347454781,0x0,10.0.0.0-10.255.255.255,US,0,,1200568889751109719,, 
 <11>Jan  5 07:41:48 PAN1.exampleCustomer.com 1,2015/01/05 07:41:47,0006C110285,THREAT,vulnerability,1,2015/01/05 07:41:47,10.0.0.115,216.0.10.230,0.0.0.0,0.0.0.0,EX-Allow,example\user.name,,web-browsing,vsys1,internal,external,ethernet1/2,ethernet1/1,LOG-Default,2015/01/05 07:41:47,2518,1,65531,80,0,0,0x80004000,tcp,reset-both,"ad.aspx?f=300x250&id=8;tile=1;ord=E0827A4B1C6179DF64205E13AECDF",HTTP: IIS Denial Of Service Attempt(40019),any,high,client-to-server,347454775,0x0,10.0.0.0-10.255.255.255,US,0,,1200568889751109715,, 
 <12>Jan  5 09:08:53 PAN1.exampleCustomer.com 1,2015/01/05 09:08:52,0011C103117,THREAT,virus,1,2015/01/05 09:08:52,61.0.0.202,10.0.0.81,0.0.0.0,0.0.0.0,EX-Allow,,example\user.name,web-browsing,vsys1,v_external,v_internal,ethernet1/2,ethernet1/1,LOG-Default,2015/01/05 09:08:52,72686,1,80,60538,0,0,0x4000,tcp,deny,"haozip_v5.0_up6.exe",Virus/Win32.WGeneric.dpqqf(2516743),any,medium,server-to-client,3422073984,0x0,CN,10.0.0.0-10.255.255.255,0,,0,, 
@@ -23,17 +23,17 @@
 <11>Jan  5 09:10:37 PAN1 1,2015/01/05 09:10:36,0003C105690,THREAT,vulnerability,1,2015/01/05 09:10:36,10.0.0.222,95.0.0.154,192.168.100.11,95.0.0.154,Guest_to_Internet,,,web-browsing,vsys1,GuestAccess,untrust,vlan.84,vlan.200,LOG-Default,2015/01/05 09:10:36,97395,1,59784,80,46548,80,0x80400000,tcp,reset-both,"8-134.0-87.0.zip",HTTP Unauthorized Brute-force Attack(40031),any,high,client-to-server,247195018,0x0,10.0.0.0-10.255.255.255,IT,0,,1200340530903386781,, 
 <11>Jan  5 09:02:24 PAN1 1,2015/01/05 09:02:24,0003C105690,THREAT,vulnerability,1,2015/01/05 09:02:24,10.0.0.222,95.0.0.154,192.168.100.11,95.0.0.154,Guest_to_Internet,,,web-browsing,vsys1,GuestAccess,untrust,vlan.84,vlan.200,LOG-Default,2015/01/05 09:02:24,137904,1,59762,80,7021,80,0x80400000,tcp,reset-both,"8-136.0-83.0.zip",HTTP Unauthorized Brute-force Attack(40031),any,high,client-to-server,247188168,0x0,10.0.0.0-10.255.255.255,IT,0,,1200340530903386777,, 
 <11>Jan  5 09:23:52 PAN1 1,2015/01/05 09:23:51,009401011564,THREAT,vulnerability,1,2015/01/05 09:23:51,10.0.0.135,10.1.0.42,0.0.0.0,0.0.0.0,INT_out,,,sccp,vsys1,v_internal,v_external,ethernet1/4,ethernet1/3,LOG-Default,2015/01/05 09:23:51,15299,1,49643,2000,0,0,0x80004000,tcp,reset-both,"",Digium Asterisk Skinny Channel NULL-Pointer Dereference Vulnerability(35378),any,high,client-to-server,732393,0x0,Unknown,Unknown,0,,1200515273392656561,, 
-<10>Jan  5 10:03:58 PAN1 1,2015/01/05 10:03:58,009401011564,THREAT,vulnerability,1,2015/01/05 10:03:58,10.0.0.38,10.3.0.37,0.0.0.0,0.0.0.0,INT_out,,,ms-ds-smb,vsys1,v_internal,v_external,ethernet1/4,ethernet1/3,LOG-Default,2015/01/05 10:03:58,57935,1,11648,445,0,0,0x80004000,tcp,reset-both,"",Microsoft Windows SMBv2 Remote Code Execution Vulnerability(32541),any,critical,client-to-server,733522,0x0,Unknown,Unknown,0,,1200515273392656570,, 
+<10>Jan  5 10:03:58 PAN1 1,2015/01/05 10:03:58,009401011564,THREAT,vulnerability,1,2015/01/05 10:03:58,10.0.0.38,10.3.0.37,0.0.0.0,0.0.0.0,INT_out,,,ms-stats-smb,vsys1,v_internal,v_external,ethernet1/4,ethernet1/3,LOG-Default,2015/01/05 10:03:58,57935,1,11648,445,0,0,0x80004000,tcp,reset-both,"",Microsoft Windows SMBv2 Remote Code Execution Vulnerability(32541),any,critical,client-to-server,733522,0x0,Unknown,Unknown,0,,1200515273392656570,,
 <11>Jan  5 07:19:09 PAN1 1,2015/01/05 07:19:08,009401011564,THREAT,vulnerability,1,2015/01/05 07:19:08,10.0.0.135,10.1.0.42,0.0.0.0,0.0.0.0,INT_out,,,sccp,vsys1,v_internal,v_external,ethernet1/4,ethernet1/3,LOG-Default,2015/01/05 07:19:08,22557,1,49638,2000,0,0,0x80004000,tcp,reset-both,"",Digium Asterisk Skinny Channel NULL-Pointer Dereference Vulnerability(35378),any,high,client-to-server,727520,0x0,Unknown,Unknown,0,,1200515273392656555,, 
-<10>Jan  5 10:04:00 PAN1 1,2015/01/05 10:04:00,009401011564,THREAT,vulnerability,1,2015/01/05 10:04:00,10.0.0.38,10.2.0.40,0.0.0.0,0.0.0.0,INT_out,,,ms-ds-smb,vsys1,v_internal,v_external,ethernet1/4,ethernet1/3,LOG-Default,2015/01/05 10:04:00,37972,1,43861,445,0,0,0x80004000,tcp,reset-both,"",Microsoft Windows SMBv2 Remote Code Execution Vulnerability(32541),any,critical,client-to-server,733536,0x0,Unknown,Unknown,0,,1200515273392656584,, 
-<10>Jan  5 10:04:01 PAN1 1,2015/01/05 10:04:01,009401011564,THREAT,vulnerability,1,2015/01/05 10:04:01,10.0.0.38,172.13.0.68,0.0.0.0,0.0.0.0,INT_out,,,ms-ds-smb,vsys1,v_internal,v_external,ethernet1/4,ethernet1/3,LOG-Default,2015/01/05 10:04:01,49163,1,43869,445,0,0,0x80004000,tcp,reset-both,"",Microsoft Windows SMBv2 Remote Code Execution Vulnerability(32541),any,critical,client-to-server,733543,0x0,Unknown,US,0,,1200515273392656591,, 
+<10>Jan  5 10:04:00 PAN1 1,2015/01/05 10:04:00,009401011564,THREAT,vulnerability,1,2015/01/05 10:04:00,10.0.0.38,10.2.0.40,0.0.0.0,0.0.0.0,INT_out,,,ms-stats-smb,vsys1,v_internal,v_external,ethernet1/4,ethernet1/3,LOG-Default,2015/01/05 10:04:00,37972,1,43861,445,0,0,0x80004000,tcp,reset-both,"",Microsoft Windows SMBv2 Remote Code Execution Vulnerability(32541),any,critical,client-to-server,733536,0x0,Unknown,Unknown,0,,1200515273392656584,,
+<10>Jan  5 10:04:01 PAN1 1,2015/01/05 10:04:01,009401011564,THREAT,vulnerability,1,2015/01/05 10:04:01,10.0.0.38,172.13.0.68,0.0.0.0,0.0.0.0,INT_out,,,ms-stats-smb,vsys1,v_internal,v_external,ethernet1/4,ethernet1/3,LOG-Default,2015/01/05 10:04:01,49163,1,43869,445,0,0,0x80004000,tcp,reset-both,"",Microsoft Windows SMBv2 Remote Code Execution Vulnerability(32541),any,critical,client-to-server,733543,0x0,Unknown,US,0,,1200515273392656591,,
 <10>Jan  5 02:16:00 PAN1.exampleCustomer.com 1,2015/01/05 02:16:00,009401009421,THREAT,spyware,1,2015/01/05 02:16:00,10.0.0.67,54.0.0.140,68.1.100.154,54.0.0.140,EX-Allow,,,web-browsing,vsys1,internal,external,ethernet1/1,ethernet1/2,LOG-Default,2015/01/05 02:16:00,2898,1,50429,80,13954,80,0x400000,tcp,reset-both,"install.ashx",WGeneric.Gen Command and Control Traffic(13600),any,critical,client-to-server,3841944,0x0,10.0.0.0-10.255.255.255,US,0,,0,, 
 <10>Jan  5 02:16:17 PAN1.exampleCustomer.com 1,2015/01/05 02:16:17,009401009421,THREAT,spyware,1,2015/01/05 02:16:17,10.0.0.67,54.0.0.140,68.1.100.154,54.0.0.140,EX-Allow,,,web-browsing,vsys1,internal,external,ethernet1/1,ethernet1/2,LOG-Default,2015/01/05 02:16:17,21959,1,50459,80,45933,80,0x400000,tcp,reset-both,"install.ashx",WGeneric.Gen Command and Control Traffic(13600),any,critical,client-to-server,3842040,0x0,10.0.0.0-10.255.255.255,US,0,,0,, 
 <10>Jan  5 10:55:21 PAN1.exampleCustomer.com 1,2015/01/05 10:55:21,0011C103117,THREAT,vulnerability,1,2015/01/05 10:55:21,172.13.0.44,10.0.0.48,0.0.0.0,0.0.0.0,EX-Allow,,,ssl,vsys1,v_dmz-external,v_dmz-internal,ethernet1/3,ethernet1/4,LOG-Default,2015/01/05 10:55:21,116502,1,55910,443,0,0,0x80004000,tcp,reset-both,"bar.exampleCustomer.com/",OpenSSL SSL/TLS MITM vulnerability(36485),any,critical,client-to-server,3422361316,0x0,NO,10.0.0.0-10.255.255.255,0,,1200269920802300348,, 
 <12>Jan  5 11:31:36 PAN1.exampleCustomer.com 1,2015/01/05 11:31:36,0011C103117,THREAT,vulnerability,1,2015/01/05 11:31:36,31.0.0.198,10.0.0.210,0.0.0.0,0.0.0.0,EX-Allow,,,twitter-base,vsys1,v_dmz-external,v_dmz-internal,ethernet1/3,ethernet1/4,LOG-Default,2015/01/05 11:31:36,181928,1,55325,443,0,0,0x80004000,tcp,alert,"foo.exampleCustomer.com/",OpenSSL TLS Malformed Heartbeat Request Found - Heartbleed(36397),any,medium,client-to-server,3422463820,0x0,CH,10.0.0.0-10.255.255.255,0,,1200269920802300355,, 
 <12>Jan  5 11:31:17 PAN1.exampleCustomer.com 1,2015/01/05 11:31:17,0011C103117,THREAT,vulnerability,1,2015/01/05 11:31:17,31.0.0.198,10.0.0.56,0.0.0.0,0.0.0.0,EX-Allow,,,twitter-base,vsys1,v_dmz-external,v_dmz-internal,ethernet1/3,ethernet1/4,LOG-Default,2015/01/05 11:31:17,33936654,1,55325,443,0,0,0x80004000,tcp,alert,"*.exampleCustomer.com/",OpenSSL TLS Malformed Heartbeat Request Found - Heartbleed(36397),any,medium,client-to-server,3422463061,0x0,CH,10.0.0.0-10.255.255.255,0,,1344385108878191554,, 
 <12>Jan  5 11:07:20 PAN1.exampleCustomer.com 1,2015/01/05 11:07:20,0011C103117,THREAT,vulnerability,1,2015/01/05 11:07:20,31.0.0.198,10.0.0.70,0.0.0.0,0.0.0.0,EX-EasyAV,,,twitter-base,vsys1,v_dmz-external,v_dmz-internal,ethernet1/3,ethernet1/4,LOG-Default,2015/01/05 11:07:20,142520,1,55325,443,0,0,0x4000,tcp,alert,"fizzbuzz.exampleCustomer.com/",OpenSSL TLS Malformed Heartbeat Request Found - Heartbleed(36397),any,medium,client-to-server,3422395620,0x0,CH,10.0.0.0-10.255.255.255,0,,0,, 
-<10>Jan  5 10:04:06 PAN1 1,2015/01/05 10:04:05,009401011564,THREAT,vulnerability,1,2015/01/05 10:04:05,10.0.0.38,10.2.0.20,0.0.0.0,0.0.0.0,INT_out,,,ms-ds-smb,vsys1,v_internal,v_external,ethernet1/4,ethernet1/3,LOG-Default,2015/01/05 10:04:05,58977,1,43882,445,0,0,0x80004000,tcp,reset-both,"",Microsoft Windows SMBv2 Remote Code Execution Vulnerability(32541),any,critical,client-to-server,733556,0x0,Unknown,Unknown,0,,1200515273392656603,, 
+<10>Jan  5 10:04:06 PAN1 1,2015/01/05 10:04:05,009401011564,THREAT,vulnerability,1,2015/01/05 10:04:05,10.0.0.38,10.2.0.20,0.0.0.0,0.0.0.0,INT_out,,,ms-stats-smb,vsys1,v_internal,v_external,ethernet1/4,ethernet1/3,LOG-Default,2015/01/05 10:04:05,58977,1,43882,445,0,0,0x80004000,tcp,reset-both,"",Microsoft Windows SMBv2 Remote Code Execution Vulnerability(32541),any,critical,client-to-server,733556,0x0,Unknown,Unknown,0,,1200515273392656603,,
 <11>Jan  5 11:20:02 PAN1 1,2015/01/05 11:20:02,009401011564,THREAT,vulnerability,1,2015/01/05 11:20:02,10.0.0.131,10.1.0.42,0.0.0.0,0.0.0.0,INT_out,,,sccp,vsys1,v_internal,v_external,ethernet1/4,ethernet1/3,LOG-Default,2015/01/05 11:20:02,25219,1,49569,2000,0,0,0x80004000,tcp,reset-both,"",Digium Asterisk Skinny Channel NULL-Pointer Dereference Vulnerability(35378),any,high,client-to-server,735575,0x0,Unknown,Unknown,0,,1200515273392656605,, 
 <11>Jan  5 12:31:01 PAN1.exampleCustomer.com 1,2015/01/05 12:31:01,0006C110285,THREAT,vulnerability,1,2015/01/05 12:31:01,10.0.0.115,216.0.10.198,0.0.0.0,0.0.0.0,EX-Allow,example\user.name,,web-browsing,vsys1,internal,external,ethernet1/2,ethernet1/1,LOG-Default,2015/01/05 12:31:01,12971,1,56879,80,0,0,0x80004000,tcp,reset-both,"ad.aspx?f=160x600&id=14;tile=1;ord=339DEA400FDFBF9127DA196347F1",HTTP: IIS Denial Of Service Attempt(40019),any,high,client-to-server,347631498,0x0,10.0.0.0-10.255.255.255,US,0,,1200568889751109742,, 
 <11>Jan  5 12:31:01 PAN1.exampleCustomer.com 1,2015/01/05 12:31:01,0006C110285,THREAT,vulnerability,1,2015/01/05 12:31:01,10.0.0.115,216.0.10.198,0.0.0.0,0.0.0.0,EX-Allow,example\user.name,,web-browsing,vsys1,internal,external,ethernet1/2,ethernet1/1,LOG-Default,2015/01/05 12:31:01,52846,1,56881,80,0,0,0x80004000,tcp,reset-both,"ad.aspx?f=160x600&id=14;tile=1;ord=A501E1CAA93F3B256222F902C051",HTTP: IIS Denial Of Service Attempt(40019),any,high,client-to-server,347631499,0x0,10.0.0.0-10.255.255.255,US,0,,1200568889751109743,, 
@@ -53,10 +53,10 @@
 <14>Jan  5 12:51:34 PAN1.exampleCustomer.com 1,2015/01/05 12:51:33,0011C103117,TRAFFIC,end,1,2015/01/05 12:51:33,172.13.0.2,10.0.0.32,0.0.0.0,0.0.0.0,EX-Allow,,,dns,vsys1,v_dmz-external,v_dmz-internal,ethernet1/3,ethernet1/4,LOG-Default,2015/01/05 12:51:33,33841444,1,17294,53,0,0,0x4019,udp,allow,94,94,0,1,2015/01/05 12:51:01,30,any,0,17754932054,0x0,US,10.0.0.0-10.255.255.255,0,1,0 
 <14>Jan  5 12:51:34 PAN1.exampleCustomer.com 1,2015/01/05 12:51:33,0011C103117,TRAFFIC,end,1,2015/01/05 12:51:33,71.0.0.174,10.0.0.32,0.0.0.0,0.0.0.0,EX-Allow,,,dns,vsys1,v_dmz-external,v_dmz-internal,ethernet1/3,ethernet1/4,LOG-Default,2015/01/05 12:51:33,33992062,1,57783,53,0,0,0x4019,udp,allow,247,86,161,2,2015/01/05 12:51:01,30,any,0,17754932055,0x0,US,10.0.0.0-10.255.255.255,0,1,1 
 <14>Jan  5 12:51:34 PAN1.exampleCustomer.com 1,2015/01/05 12:51:33,0011C103117,TRAFFIC,end,1,2015/01/05 12:51:33,58.0.0.196,10.0.0.17,0.0.0.0,0.0.0.0,EX-Allow,,,ssl,vsys1,v_dmz-external,v_dmz-internal,ethernet1/3,ethernet1/4,LOG-Default,2015/01/05 12:51:33,34310602,1,25678,443,0,0,0x4053,tcp,allow,21935,11456,10479,44,2015/01/05 12:48:44,167,EX-Allowed,0,17754932059,0x0,IN,10.0.0.0-10.255.255.255,0,20,24 
-<14>Jan  5 12:51:34 PAN1.exampleCustomer.com 1,2015/01/05 12:51:33,0011C103117,TRAFFIC,end,1,2015/01/05 12:51:33,10.0.0.39,10.1.0.163,0.0.0.0,0.0.0.0,EX-Allow,,example\user.name,ms-ds-smb,vsys1,v_external,v_internal,ethernet1/2,ethernet1/1,LOG-Default,2015/01/05 12:51:33,33760927,1,52688,445,0,0,0x401a,tcp,allow,2229,1287,942,10,2015/01/05 12:51:01,30,any,0,17754932062,0x0,10.0.0.0-10.255.255.255,10.0.0.0-10.255.255.255,0,6,4 
-<14>Jan  5 12:51:34 PAN1.exampleCustomer.com 1,2015/01/05 12:51:33,0011C103117,TRAFFIC,end,1,2015/01/05 12:51:33,10.0.0.39,10.1.0.163,0.0.0.0,0.0.0.0,EX-Allow,,example\user.name,ms-ds-smb,vsys1,v_external,v_internal,ethernet1/2,ethernet1/1,LOG-Default,2015/01/05 12:51:33,33595018,1,52689,445,0,0,0x401a,tcp,allow,2229,1287,942,10,2015/01/05 12:51:01,30,any,0,17754932064,0x0,10.0.0.0-10.255.255.255,10.0.0.0-10.255.255.255,0,6,4 
+<14>Jan  5 12:51:34 PAN1.exampleCustomer.com 1,2015/01/05 12:51:33,0011C103117,TRAFFIC,end,1,2015/01/05 12:51:33,10.0.0.39,10.1.0.163,0.0.0.0,0.0.0.0,EX-Allow,,example\user.name,ms-stats-smb,vsys1,v_external,v_internal,ethernet1/2,ethernet1/1,LOG-Default,2015/01/05 12:51:33,33760927,1,52688,445,0,0,0x401a,tcp,allow,2229,1287,942,10,2015/01/05 12:51:01,30,any,0,17754932062,0x0,10.0.0.0-10.255.255.255,10.0.0.0-10.255.255.255,0,6,4
+<14>Jan  5 12:51:34 PAN1.exampleCustomer.com 1,2015/01/05 12:51:33,0011C103117,TRAFFIC,end,1,2015/01/05 12:51:33,10.0.0.39,10.1.0.163,0.0.0.0,0.0.0.0,EX-Allow,,example\user.name,ms-stats-smb,vsys1,v_external,v_internal,ethernet1/2,ethernet1/1,LOG-Default,2015/01/05 12:51:33,33595018,1,52689,445,0,0,0x401a,tcp,allow,2229,1287,942,10,2015/01/05 12:51:01,30,any,0,17754932064,0x0,10.0.0.0-10.255.255.255,10.0.0.0-10.255.255.255,0,6,4
 <14>Jan  5 12:51:34 PAN1.exampleCustomer.com 1,2015/01/05 12:51:33,0011C103117,TRAFFIC,end,1,2015/01/05 12:51:33,10.0.0.7,10.1.0.81,0.0.0.0,0.0.0.0,EX-Allow,,,netbios-ns,vsys1,v_external,v_internal,ethernet1/2,ethernet1/1,LOG-Default,2015/01/05 12:51:33,34098107,1,137,137,0,0,0x4019,udp,allow,532,220,312,6,2015/01/05 12:51:01,30,any,0,17754932070,0x0,10.0.0.0-10.255.255.255,10.0.0.0-10.255.255.255,0,3,3 
-<14>Jan  5 12:51:34 PAN1.exampleCustomer.com 1,2015/01/05 12:51:33,0011C103117,TRAFFIC,end,1,2015/01/05 12:51:33,10.0.0.39,10.1.0.163,0.0.0.0,0.0.0.0,EX-Allow,,example\user.name,ms-ds-smb,vsys1,v_external,v_internal,ethernet1/2,ethernet1/1,LOG-Default,2015/01/05 12:51:33,34326343,1,52690,445,0,0,0x401a,tcp,allow,2229,1287,942,10,2015/01/05 12:51:01,30,any,0,17754932071,0x0,10.0.0.0-10.255.255.255,10.0.0.0-10.255.255.255,0,6,4 
+<14>Jan  5 12:51:34 PAN1.exampleCustomer.com 1,2015/01/05 12:51:33,0011C103117,TRAFFIC,end,1,2015/01/05 12:51:33,10.0.0.39,10.1.0.163,0.0.0.0,0.0.0.0,EX-Allow,,example\user.name,ms-stats-smb,vsys1,v_external,v_internal,ethernet1/2,ethernet1/1,LOG-Default,2015/01/05 12:51:33,34326343,1,52690,445,0,0,0x401a,tcp,allow,2229,1287,942,10,2015/01/05 12:51:01,30,any,0,17754932071,0x0,10.0.0.0-10.255.255.255,10.0.0.0-10.255.255.255,0,6,4
 <14>Jan  5 12:51:34 PAN1.exampleCustomer.com 1,2015/01/05 12:51:33,0011C103117,TRAFFIC,end,1,2015/01/05 12:51:33,172.13.0.15,10.0.0.53,0.0.0.0,0.0.0.0,EX-EasyAV,,,eset-remote-admin,vsys1,v_dmz-external,v_dmz-internal,ethernet1/3,ethernet1/4,LOG-Default,2015/01/05 12:51:33,33859365,1,23390,443,0,0,0x405e,tcp,allow,725,405,320,11,2015/01/05 12:51:01,30,any,0,17754932073,0x0,US,10.0.0.0-10.255.255.255,0,6,5 
 <14>Jan  5 12:51:34 PAN1.exampleCustomer.com 1,2015/01/05 12:51:33,0011C103117,TRAFFIC,end,1,2015/01/05 12:51:33,10.0.0.53,10.1.0.174,0.0.0.0,0.0.0.0,EX-EasyAV2,,,mssql-db,vsys1,v_external,v_internal,ethernet1/2,ethernet1/1,LOG-Default,2015/01/05 12:51:33,33621086,1,54266,40004,0,0,0x401c,tcp,allow,5325,3299,2026,25,2015/01/05 12:51:01,30,any,0,17754932075,0x0,10.0.0.0-10.255.255.255,10.0.0.0-10.255.255.255,0,11,14 
 <14>Jan  5 12:51:34 PAN1.exampleCustomer.com 1,2015/01/05 12:51:33,0011C103117,TRAFFIC,end,1,2015/01/05 12:51:33,96.0.0.102,10.0.0.57,0.0.0.0,0.0.0.0,EX-Allow,,,ssl,vsys1,v_dmz-external,v_dmz-internal,ethernet1/3,ethernet1/4,LOG-Default,2015/01/05 12:51:33,33924142,1,51230,443,0,0,0x4053,tcp,allow,18350,9280,9070,41,2015/01/05 12:51:01,30,EX-Allowed,0,17754932080,0x0,US,10.0.0.0-10.255.255.255,0,19,22 

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/f3ca3c05/metron-platform/metron-solr/pom.xml
----------------------------------------------------------------------
diff --git a/metron-platform/metron-solr/pom.xml b/metron-platform/metron-solr/pom.xml
index 7431041..86a23c4 100644
--- a/metron-platform/metron-solr/pom.xml
+++ b/metron-platform/metron-solr/pom.xml
@@ -56,6 +56,12 @@
             <artifactId>solr-test-framework</artifactId>
             <version>${global_solr_version}</version>
             <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <artifactId>fastutil</artifactId>
+                    <groupId>it.unimi.dsi</groupId>
+                </exclusion>
+            </exclusions>
         </dependency>
         <dependency>
             <groupId>org.apache.storm</groupId>

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/f3ca3c05/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 215333b..29fd8e0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -237,7 +237,7 @@
                 <configuration>
                   <excludes>
                         <exclude>dependencies_with_url.csv</exclude>
-                        <exclude>**/README.md</exclude>
+                        <exclude>**/*.md</exclude>
                         <exclude>**/VERSION</exclude>
                         <exclude>**/*.json</exclude>
                         <exclude>**/*.tokens</exclude>


[3/3] incubator-metron git commit: METRON-627: Add HyperLogLogPlus implementation to Stellar (mmiklavc) closes apache/incubator-metron#397

Posted by mm...@apache.org.
METRON-627: Add HyperLogLogPlus implementation to Stellar (mmiklavc) closes apache/incubator-metron#397


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

Branch: refs/heads/master
Commit: f3ca3c05ef6d95a6f3bc5123e4dc07482c3e2752
Parents: 9890018
Author: mmiklavc <mi...@gmail.com>
Authored: Fri Jan 27 09:35:13 2017 -0700
Committer: Michael Miklavcic <mi...@gmail.com>
Committed: Fri Jan 27 09:35:13 2017 -0700

----------------------------------------------------------------------
 dependencies_with_url.csv                       |   2 +
 metron-analytics/metron-statistics/HLLP.md      | 646 +++++++++++++++++++
 metron-analytics/metron-statistics/README.md    |  28 +
 metron-analytics/metron-statistics/pom.xml      |   7 +
 .../approximation/HLLPMeasurement.java          | 413 ++++++++++++
 .../approximation/HyperLogLogPlus.java          | 133 ++++
 .../approximation/HyperLogLogPlusFunctions.java | 150 +++++
 ...HyperLogLogPlusFunctionsIntegrationTest.java | 120 ++++
 .../HyperLogLogPlusFunctionsTest.java           | 142 ++++
 metron-platform/metron-common/README.md         |  41 +-
 metron-platform/metron-common/pom.xml           |   6 +-
 .../metron/common/stellar/generated/Stellar.g4  |   2 +-
 .../metron-common/src/main/java/Stellar.tokens  | 116 ++--
 .../src/main/java/StellarLexer.tokens           | 116 ++--
 .../common/stellar/generated/StellarLexer.java  | 281 ++++----
 .../common/stellar/generated/StellarParser.java | 111 ++--
 .../metron/common/utils/ConversionUtils.java    |  24 +-
 .../stellar/DocumentationGenerator.java         |   3 +-
 .../main/sample/data/SampleInput/PaloaltoOutput |  16 +-
 metron-platform/metron-solr/pom.xml             |   6 +
 pom.xml                                         |   2 +-
 21 files changed, 2017 insertions(+), 348 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/f3ca3c05/dependencies_with_url.csv
----------------------------------------------------------------------
diff --git a/dependencies_with_url.csv b/dependencies_with_url.csv
index ca8fe12..3640b14 100644
--- a/dependencies_with_url.csv
+++ b/dependencies_with_url.csv
@@ -23,6 +23,7 @@ com.maxmind.geoip2:geoip2:jar:2.8.0:compile,Apache v2,https://github.com/maxmind
 com.sun.xml.bind:jaxb-impl:jar:2.2.3-1:compile,CDDL,http://jaxb.java.net/
 com.sun.xml.bind:jaxb-impl:jar:2.2.5-2:compile,CDDL,http://jaxb.java.net/
 com.twitter:jsr166e:jar:1.1.0:compile,CC0 1.0 Universal,http://github.com/twitter/jsr166e
+it.unimi.dsi:fastutil:jar:7.0.6:compile,ASLv2,https://github.com/vigna/fastutil
 javassist:javassist:jar:3.12.1.GA:compile,Apache v2,http://www.javassist.org/
 javax.activation:activation:jar:1.1:compile,Common Development and Distribution License (CDDL) v1.0,http://java.sun.com/products/javabeans/jaf/index.jsp
 javax.annotation:jsr250-api:jar:1.0:compile,COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0,http://jcp.org/aboutJava/communityprocess/final/jsr250/index.html
@@ -91,6 +92,7 @@ com.github.tony19:named-regexp:jar:0.2.3:compile,Apache License, Version 2.0,
 com.google.code.findbugs:jsr305:jar:1.3.9:compile,The Apache Software License, Version 2.0,http://findbugs.sourceforge.net/
 com.google.code.findbugs:jsr305:jar:3.0.0:compile,The Apache Software License, Version 2.0,http://findbugs.sourceforge.net/
 com.carrotsearch:hppc:jar:0.7.1:compile,ASLv2,
+com.clearspring.analytics:stream:jar:2.9.5:compile,ASLv2,https://github.com/addthis/stream-lib
 com.codahale.metrics:metrics-core:jar:3.0.2:compile,MIT,https://github.com/codahale/metrics
 com.codahale.metrics:metrics-graphite:jar:3.0.2:compile,MIT,https://github.com/codahale/metrics
 com.esotericsoftware.reflectasm:reflectasm:jar:shaded:1.07:compile,BSD,https://github.com/EsotericSoftware/reflectasm

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/f3ca3c05/metron-analytics/metron-statistics/HLLP.md
----------------------------------------------------------------------
diff --git a/metron-analytics/metron-statistics/HLLP.md b/metron-analytics/metron-statistics/HLLP.md
new file mode 100644
index 0000000..a34e542
--- /dev/null
+++ b/metron-analytics/metron-statistics/HLLP.md
@@ -0,0 +1,646 @@
+# HyperLogLogPlus
+
+## Preliminaries - Distinct Value (cardinality) Estimation
+
+Calculating the number of distinct values (DV) in a specific finite-sized list of values using brute force (e.g. a HashSet) techniques is fairly straight forward provided
+that linear scaling to your number of values fits within your memory constraints. For many cases, the simple calculation serves just fine. However,
+in many other instances the simple linear approach simply will not scale as well as we would like, and a more
+robust algorithm is desirable. Enter probabilistic distinct value estimation algorithms: k-minimum-values (KMV), LogLog, HyperLogLog (HLL), and most recently HyperLogLog++ (HLLP).
+As data volume grows it becomes impractical to store all values in memory in order to reasonably calculate set cardinality. This is where probabilistic estimation algorithms
+become extremely useful. Often, we are happy to trade a handful of memory and better performance in exchange for an inexact,
+yet reasonably close approximation of the actual cardinality.
+
+
+## The Case For An Improvement
+
+HyperLogLogPlus is an algorithm introduced by Google that builds on the DV estimation capabilities of HLL and improves on accuracy as well as scalability.
+HLLP not only works well with *extremely* large data sets (think *trillion*), but with smaller cardinality
+sets as well. HyperLogLog is simply not as accurate on the lower end of the cardinality spectrum. In addition, HLLP provides the ability
+to easily merge estimation sets. Although a data stream may not initially require high cardinality estimates as afforded by HLLP, it
+will still work accurately and efficiently on the smaller volumes without the need to rewrite code if data volume begins to surpass memory
+constraints. The paper describing the algorithm can be found here - https://research.google.com/pubs/pub40671.html
+
+## Performance Metrics
+
+### Overview
+
+Below is a table detailing the performance characteristics when running HLLP over multiple data set sizes. There are three primary variables
+manipulated during the test: cardinality, sparse set precision, and normal set precision. Each of these values will have an impact on error rates, execution time, and total memory consumption.
+
+### Choosing p, sp
+There is a tradeoff when choosing values for p and sp. A higher value for sp means a lower error rate for instances when the sparse set is being used. However, a higher value for sp also requires
+more memory, which means the algorithm will cut over to the dense representation more quickly. The Google paper (listed above) recommends settings of p=25, sp=14 for optimal memory use and
+algorithm accuracy, and these are the defaults provided by the Apache Metron (Incubating) implementation in Stellar. You'll notice in the tests below, memory consumption tops out around 12KB
+for this setting, regardless of cardinality size.
+
+### Key
+---
+```
+card: cardinality<br>
+sp: sparse precision value<br>
+p: normal (dense) precision value<br>
+err: error as a percent of the expected cardinality<br>
+time: total time to add values to the hllp estimator and calculate a cardinality estimate<br>
+size: size of the hllp set in bytes once all values have been added for the specified cardinality<br>
+l=low, m=mid(based on percentile chosen), h=high, std=standard deviation<br>
+```
+
+### Table Cardinality 200-1000, step by 200
+---------------------------------------
+
+#### Options Used
+```
+num trials: 5000
+card min: 200
+card max: 1000
+card step: 200
+card start: 200
+sp min: 4
+sp max: 32
+sp step: 4
+error percentile: 50.0
+time percentile: 50.0
+size percentile: 50.0
+format err as %: true
+```
+
+
+|card      |sp        |p         |err l/m/h/std (% of actual)             |time l/m/h/std (ms)                     |size l/m/h/std (b)            |
+|----------|----------|----------|----------------------------------------|----------------------------------------|------------------------------|
+|200       |4         |4         |0.000 / 17.000 / 180.000 / 17.470       |0.070 / 0.118 / 10.092 / 0.204          |218 / 220 / 220 / 1           |
+|200       |8         |4         |0.000 / 17.000 / 209.500 / 18.060       |0.071 / 0.085 / 8.786 / 0.128           |219 / 221 / 221 / 1           |
+|200       |8         |8         |0.000 / 3.500 / 21.500 / 3.185          |0.082 / 0.085 / 8.375 / 0.119           |531 / 587 / 637 / 14          |
+|200       |12        |4         |0.000 / 17.000 / 174.000 / 17.376       |0.070 / 0.085 / 8.708 / 0.128           |219 / 221 / 221 / 1           |
+|200       |12        |8         |0.000 / 3.000 / 25.500 / 2.847          |0.086 / 0.119 / 8.984 / 0.151           |353 / 372 / 627 / 74          |
+|200       |12        |12        |0.000 / 0.500 / 5.500 / 0.659           |0.082 / 0.096 / 17.208 / 0.243          |775 / 816 / 834 / 9           |
+|200       |16        |4         |0.000 / 17.500 / 172.000 / 16.622       |0.068 / 0.075 / 9.553 / 0.137           |220 / 222 / 222 / 1           |
+|200       |16        |8         |0.000 / 3.500 / 18.000 / 2.899          |0.095 / 0.118 / 0.663 / 0.031           |354 / 373 / 390 / 5           |
+|200       |16        |12        |0.000 / 0.000 / 1.500 / 0.276           |0.085 / 0.108 / 13.977 / 0.199          |802 / 833 / 852 / 6           |
+|200       |16        |16        |0.000 / 0.000 / 2.500 / 0.279           |0.079 / 0.085 / 0.271 / 0.017           |990 / 1027 / 1044 / 6         |
+|200       |20        |4         |0.000 / 17.000 / 209.500 / 17.424       |0.068 / 0.072 / 0.250 / 0.014           |221 / 223 / 223 / 1           |
+|200       |20        |8         |0.000 / 3.500 / 18.000 / 2.944          |0.096 / 0.106 / 13.581 / 0.192          |357 / 374 / 388 / 5           |
+|200       |20        |12        |0.000 / 0.000 / 1.000 / 0.066           |0.084 / 0.088 / 1.096 / 0.019           |915 / 945 / 972 / 8           |
+|200       |20        |16        |0.000 / 0.000 / 0.500 / 0.070           |0.083 / 0.087 / 10.272 / 0.145          |912 / 953 / 982 / 8           |
+|200       |20        |20        |0.000 / 0.000 / 1.000 / 0.069           |0.079 / 0.081 / 0.210 / 0.017           |1028 / 1056 / 1058 / 2        |
+|200       |24        |4         |0.000 / 17.500 / 136.000 / 16.589       |0.068 / 0.071 / 0.952 / 0.025           |221 / 223 / 223 / 1           |
+|200       |24        |8         |0.000 / 3.500 / 18.000 / 2.955          |0.095 / 0.106 / 10.387 / 0.148          |353 / 373 / 390 / 5           |
+|200       |24        |12        |0.000 / 0.000 / 0.500 / 0.016           |0.082 / 0.083 / 0.235 / 0.014           |1035 / 1048 / 1056 / 3        |
+|200       |24        |16        |0.000 / 0.000 / 0.500 / 0.012           |0.082 / 0.084 / 10.904 / 0.154          |1038 / 1051 / 1059 / 3        |
+|200       |24        |20        |0.000 / 0.000 / 0.500 / 0.010           |0.082 / 0.085 / 0.410 / 0.019           |1049 / 1064 / 1082 / 5        |
+|200       |24        |24        |0.000 / 0.000 / 0.500 / 0.023           |0.079 / 0.084 / 11.926 / 0.168          |1247 / 1264 / 1275 / 4        |
+|200       |28        |4         |0.000 / 17.500 / 229.000 / 17.294       |0.068 / 0.072 / 0.369 / 0.015           |222 / 224 / 224 / 1           |
+|200       |28        |8         |83.000 / 83.000 / 84.000 / 0.118        |0.093 / 0.098 / 10.918 / 0.157          |272 / 276 / 278 / 1           |
+|200       |28        |12        |0.000 / 0.000 / 0.500 / 0.016           |0.082 / 0.083 / 10.157 / 0.143          |1032 / 1067 / 1075 / 3        |
+|200       |28        |16        |0.000 / 0.000 / 0.500 / 0.007           |0.082 / 0.083 / 0.617 / 0.020           |1058 / 1069 / 1077 / 3        |
+|200       |28        |20        |0.000 / 0.000 / 0.500 / 0.010           |0.082 / 0.085 / 11.619 / 0.165          |1060 / 1071 / 1080 / 3        |
+|200       |28        |24        |0.000 / 0.000 / 0.500 / 0.007           |0.083 / 0.085 / 0.516 / 0.022           |1065 / 1083 / 1100 / 4        |
+|200       |28        |28        |0.000 / 0.000 / 0.500 / 0.019           |0.080 / 0.087 / 11.278 / 0.160          |1250 / 1267 / 1278 / 4        |
+|200       |32        |4         |0.000 / 18.000 / 175.500 / 17.157       |0.068 / 0.078 / 0.223 / 0.019           |222 / 224 / 224 / 1           |
+|200       |32        |8         |99.000 / 99.000 / 99.000 / 0.000        |0.093 / 0.107 / 11.695 / 0.167          |258 / 258 / 258 / 0           |
+|200       |32        |12        |0.000 / 0.000 / 0.500 / 0.014           |0.081 / 0.084 / 8.906 / 0.126           |1060 / 1071 / 1075 / 2        |
+|200       |32        |16        |0.000 / 0.000 / 0.500 / 0.010           |0.082 / 0.085 / 1.458 / 0.027           |1061 / 1073 / 1077 / 2        |
+|200       |32        |20        |0.000 / 0.000 / 0.500 / 0.012           |0.082 / 0.084 / 10.499 / 0.148          |1065 / 1074 / 1079 / 2        |
+|200       |32        |24        |0.000 / 0.000 / 0.500 / 0.012           |0.082 / 0.085 / 0.420 / 0.020           |1066 / 1075 / 1082 / 2        |
+|200       |32        |28        |0.000 / 0.000 / 0.500 / 0.016           |0.082 / 0.086 / 8.753 / 0.124           |1076 / 1088 / 1102 / 4        |
+|200       |32        |32        |0.000 / 0.000 / 0.500 / 0.010           |0.080 / 0.081 / 13.248 / 0.188          |1249 / 1268 / 1279 / 4        |
+|400       |4         |4         |0.000 / 17.500 / 175.250 / 17.530       |0.136 / 0.142 / 0.591 / 0.035           |218 / 220 / 220 / 0           |
+|400       |8         |4         |0.000 / 17.000 / 148.500 / 17.174       |0.136 / 0.156 / 12.882 / 0.241          |219 / 221 / 221 / 0           |
+|400       |8         |8         |0.000 / 3.500 / 21.250 / 3.215          |0.159 / 0.186 / 10.396 / 0.151          |375 / 387 / 802 / 62          |
+|400       |12        |4         |0.000 / 17.750 / 166.000 / 17.363       |0.135 / 0.142 / 11.607 / 0.165          |219 / 221 / 221 / 0           |
+|400       |12        |8         |0.000 / 3.250 / 23.750 / 3.133          |0.166 / 0.179 / 8.713 / 0.130           |376 / 387 / 401 / 3           |
+|400       |12        |12        |0.000 / 0.750 / 4.250 / 0.706           |0.159 / 0.163 / 10.537 / 0.189          |1334 / 1387 / 1434 / 14       |
+|400       |16        |4         |0.000 / 17.125 / 163.250 / 17.208       |0.135 / 0.138 / 12.403 / 0.178          |220 / 222 / 222 / 0           |
+|400       |16        |8         |0.000 / 3.250 / 23.500 / 3.126          |0.165 / 0.179 / 9.985 / 0.147           |378 / 388 / 401 / 3           |
+|400       |16        |12        |0.000 / 0.250 / 1.500 / 0.195           |0.166 / 0.173 / 10.434 / 0.150          |1414 / 1446 / 1475 / 8        |
+|400       |16        |16        |0.000 / 0.250 / 1.750 / 0.194           |0.160 / 0.177 / 1.300 / 0.048           |1761 / 1798 / 1825 / 8        |
+|400       |20        |4         |0.000 / 17.750 / 270.750 / 17.592       |0.135 / 0.149 / 8.814 / 0.128           |221 / 223 / 223 / 0           |
+|400       |20        |8         |0.000 / 3.500 / 23.000 / 3.103          |0.165 / 0.183 / 9.271 / 0.139           |379 / 389 / 398 / 3           |
+|400       |20        |12        |0.000 / 0.000 / 0.500 / 0.066           |0.164 / 0.182 / 11.093 / 0.162          |1617 / 1652 / 1683 / 10       |
+|400       |20        |16        |0.000 / 0.000 / 0.500 / 0.070           |0.166 / 0.170 / 8.676 / 0.128           |1624 / 1665 / 1706 / 10       |
+|400       |20        |20        |0.000 / 0.000 / 0.750 / 0.069           |0.159 / 0.162 / 12.846 / 0.183          |1840 / 1853 / 1856 / 2        |
+|400       |24        |4         |0.000 / 16.750 / 174.750 / 16.786       |0.135 / 0.145 / 8.586 / 0.128           |221 / 223 / 223 / 0           |
+|400       |24        |8         |0.000 / 3.500 / 24.500 / 3.090          |0.165 / 0.179 / 11.344 / 0.164          |377 / 389 / 399 / 3           |
+|400       |24        |12        |0.000 / 0.000 / 0.250 / 0.016           |0.164 / 0.183 / 10.708 / 0.159          |1828 / 1841 / 1852 / 4        |
+|400       |24        |16        |0.000 / 0.000 / 0.250 / 0.017           |0.164 / 0.172 / 11.180 / 0.161          |1830 / 1844 / 1855 / 4        |
+|400       |24        |20        |0.000 / 0.000 / 0.250 / 0.015           |0.166 / 0.170 / 9.589 / 0.140           |1843 / 1868 / 1890 / 6        |
+|400       |24        |24        |0.000 / 0.000 / 0.250 / 0.022           |0.160 / 0.162 / 9.137 / 0.134           |2213 / 2232 / 2247 / 5        |
+|400       |28        |4         |0.000 / 18.250 / 164.000 / 16.587       |0.135 / 0.144 / 14.520 / 0.209          |222 / 224 / 224 / 0           |
+|400       |28        |8         |33.000 / 47.750 / 56.750 / 3.588        |0.164 / 0.168 / 1.305 / 0.052           |355 / 375 / 394 / 5           |
+|400       |28        |12        |0.000 / 0.000 / 0.250 / 0.006           |0.165 / 0.178 / 11.264 / 0.167          |1837 / 1848 / 1854 / 3        |
+|400       |28        |16        |0.000 / 0.000 / 0.250 / 0.014           |0.164 / 0.167 / 8.689 / 0.130           |1838 / 1850 / 1857 / 3        |
+|400       |28        |20        |0.000 / 0.000 / 0.250 / 0.011           |0.164 / 0.167 / 10.679 / 0.159          |1839 / 1852 / 1863 / 3        |
+|400       |28        |24        |0.000 / 0.000 / 0.250 / 0.011           |0.166 / 0.175 / 12.887 / 0.190          |1857 / 1875 / 1896 / 5        |
+|400       |28        |28        |0.000 / 0.000 / 0.250 / 0.015           |0.160 / 0.196 / 1.478 / 0.071           |2217 / 2235 / 2252 / 5        |
+|400       |32        |4         |0.000 / 17.500 / 183.750 / 19.308       |0.135 / 0.142 / 9.949 / 0.148           |222 / 224 / 224 / 0           |
+|400       |32        |8         |46.500 / 56.250 / 63.250 / 2.194        |0.164 / 0.181 / 1.209 / 0.063           |349 / 370 / 390 / 5           |
+|400       |32        |12        |0.000 / 0.000 / 0.250 / 0.012           |0.164 / 0.171 / 11.529 / 0.170          |1837 / 1848 / 1854 / 3        |
+|400       |32        |16        |0.000 / 0.000 / 0.250 / 0.016           |0.164 / 0.167 / 10.276 / 0.154          |1836 / 1850 / 1856 / 3        |
+|400       |32        |20        |0.000 / 0.000 / 0.250 / 0.015           |0.164 / 0.184 / 11.611 / 0.227          |1839 / 1851 / 1858 / 3        |
+|400       |32        |24        |0.000 / 0.000 / 0.250 / 0.012           |0.165 / 0.171 / 9.313 / 0.143           |1842 / 1853 / 1862 / 3        |
+|400       |32        |28        |0.000 / 0.000 / 0.250 / 0.013           |0.166 / 0.180 / 10.708 / 0.162          |1860 / 1877 / 1900 / 5        |
+|400       |32        |32        |0.000 / 0.000 / 0.250 / 0.014           |0.160 / 0.166 / 1.205 / 0.057           |2217 / 2235 / 2249 / 5        |
+|600       |4         |4         |0.000 / 17.333 / 219.667 / 17.222       |0.202 / 0.240 / 13.390 / 0.237          |218 / 220 / 220 / 0           |
+|600       |8         |4         |0.000 / 17.417 / 231.333 / 17.340       |0.202 / 0.224 / 9.662 / 0.150           |220 / 221 / 221 / 0           |
+|600       |8         |8         |0.000 / 3.500 / 24.333 / 3.240          |0.234 / 0.271 / 11.443 / 0.216          |382 / 392 / 403 / 3           |
+|600       |12        |4         |0.000 / 17.167 / 188.167 / 17.324       |0.202 / 0.210 / 1.320 / 0.055           |219 / 221 / 221 / 0           |
+|600       |12        |8         |0.000 / 3.500 / 23.833 / 3.243          |0.235 / 0.246 / 10.821 / 0.164          |382 / 392 / 403 / 3           |
+|600       |12        |12        |0.000 / 0.667 / 4.500 / 0.694           |0.240 / 0.259 / 12.004 / 0.183          |2015 / 2101 / 2178 / 21       |
+|600       |16        |4         |0.000 / 17.500 / 170.000 / 17.882       |0.202 / 0.218 / 9.208 / 0.140           |221 / 222 / 222 / 0           |
+|600       |16        |8         |0.000 / 3.667 / 22.667 / 3.276          |0.234 / 0.251 / 12.301 / 0.237          |383 / 393 / 408 / 3           |
+|600       |16        |12        |0.000 / 0.167 / 1.000 / 0.170           |0.250 / 0.284 / 12.000 / 0.180          |2199 / 2243 / 2282 / 12       |
+|600       |16        |16        |0.000 / 0.167 / 1.167 / 0.171           |0.239 / 0.291 / 21.163 / 0.333          |2811 / 2859 / 2901 / 13       |
+|600       |20        |4         |0.000 / 17.667 / 176.667 / 18.162       |0.202 / 0.223 / 16.405 / 0.275          |221 / 223 / 223 / 0           |
+|600       |20        |8         |0.000 / 3.500 / 20.833 / 3.180          |0.234 / 0.243 / 5.621 / 0.104           |385 / 394 / 405 / 3           |
+|600       |20        |12        |0.000 / 0.000 / 0.500 / 0.066           |0.246 / 0.281 / 19.279 / 0.390          |2541 / 2604 / 2663 / 15       |
+|600       |20        |16        |0.000 / 0.000 / 0.667 / 0.071           |0.248 / 0.258 / 24.627 / 0.387          |2569 / 2627 / 2682 / 15       |
+|600       |20        |20        |0.000 / 0.000 / 0.500 / 0.069           |0.239 / 0.246 / 13.606 / 0.248          |2938 / 2954 / 2972 / 3        |
+|600       |24        |4         |0.000 / 17.333 / 210.333 / 18.157       |0.202 / 0.218 / 11.991 / 0.180          |222 / 223 / 223 / 0           |
+|600       |24        |8         |0.000 / 3.667 / 21.167 / 3.184          |0.234 / 0.258 / 11.130 / 0.238          |385 / 394 / 406 / 3           |
+|600       |24        |12        |0.000 / 0.000 / 0.167 / 0.017           |0.246 / 0.272 / 12.032 / 0.191          |2912 / 2935 / 2954 / 5        |
+|600       |24        |16        |0.000 / 0.000 / 0.167 / 0.019           |0.246 / 0.268 / 19.358 / 0.282          |2916 / 2940 / 2959 / 6        |
+|600       |24        |20        |0.000 / 0.000 / 0.167 / 0.015           |0.248 / 0.259 / 20.293 / 0.343          |2948 / 2980 / 3009 / 9        |
+|600       |24        |24        |0.000 / 0.000 / 0.167 / 0.017           |0.239 / 0.252 / 11.721 / 0.230          |3586 / 3618 / 3643 / 7        |
+|600       |28        |4         |0.000 / 17.667 / 182.667 / 17.309       |0.202 / 0.210 / 11.957 / 0.177          |223 / 224 / 224 / 0           |
+|600       |28        |8         |10.333 / 28.000 / 42.833 / 3.687        |0.233 / 0.238 / 10.166 / 0.210          |377 / 392 / 403 / 3           |
+|600       |28        |12        |0.000 / 0.000 / 0.333 / 0.013           |0.246 / 0.252 / 9.907 / 0.158           |3005 / 3024 / 3041 / 5        |
+|600       |28        |16        |0.000 / 0.000 / 0.167 / 0.012           |0.246 / 0.256 / 18.673 / 0.273          |3007 / 3026 / 3045 / 5        |
+|600       |28        |20        |0.000 / 0.000 / 0.167 / 0.011           |0.246 / 0.283 / 17.762 / 0.355          |3005 / 3029 / 3047 / 6        |
+|600       |28        |24        |0.000 / 0.000 / 0.167 / 0.011           |0.248 / 0.254 / 8.821 / 0.138           |3035 / 3065 / 3098 / 8        |
+|600       |28        |28        |0.000 / 0.000 / 0.167 / 0.011           |0.239 / 0.242 / 12.171 / 0.177          |3589 / 3621 / 3646 / 7        |
+|600       |32        |4         |0.000 / 17.333 / 200.000 / 18.294       |0.202 / 0.205 / 9.036 / 0.138           |223 / 224 / 224 / 0           |
+|600       |32        |8         |25.167 / 37.167 / 46.833 / 3.185        |0.232 / 0.236 / 9.061 / 0.144           |377 / 389 / 403 / 3           |
+|600       |32        |12        |0.000 / 0.000 / 0.167 / 0.013           |0.246 / 0.256 / 11.119 / 0.169          |3028 / 3043 / 3055 / 4        |
+|600       |32        |16        |0.000 / 0.000 / 0.167 / 0.010           |0.246 / 0.257 / 11.557 / 0.213          |3030 / 3045 / 3057 / 4        |
+|600       |32        |20        |0.000 / 0.000 / 0.167 / 0.011           |0.246 / 0.266 / 20.353 / 0.295          |3030 / 3047 / 3071 / 4        |
+|600       |32        |24        |0.000 / 0.000 / 0.167 / 0.012           |0.246 / 0.270 / 11.461 / 0.183          |3035 / 3050 / 3073 / 4        |
+|600       |32        |28        |0.000 / 0.000 / 0.167 / 0.013           |0.248 / 0.260 / 11.755 / 0.242          |3060 / 3085 / 3108 / 7        |
+|600       |32        |32        |0.000 / 0.000 / 0.167 / 0.012           |0.239 / 0.248 / 10.380 / 0.157          |3593 / 3621 / 3645 / 7        |
+|800       |4         |4         |0.000 / 17.250 / 188.250 / 17.248       |0.269 / 0.280 / 10.818 / 0.212          |219 / 220 / 220 / 0           |
+|800       |8         |4         |0.000 / 17.875 / 184.125 / 17.721       |0.270 / 0.298 / 16.706 / 0.252          |220 / 221 / 221 / 0           |
+|800       |8         |8         |0.000 / 3.625 / 22.000 / 3.420          |0.303 / 0.315 / 12.489 / 0.243          |386 / 395 / 406 / 3           |
+|800       |12        |4         |0.000 / 17.750 / 196.500 / 16.870       |0.269 / 0.289 / 13.533 / 0.235          |220 / 221 / 221 / 0           |
+|800       |12        |8         |0.000 / 3.750 / 25.875 / 3.359          |0.303 / 0.330 / 18.306 / 0.365          |386 / 395 / 408 / 3           |
+|800       |12        |12        |0.000 / 0.750 / 4.375 / 0.677           |0.322 / 0.357 / 20.131 / 0.350          |2449 / 2603 / 2694 / 27       |
+|800       |16        |4         |0.000 / 17.750 / 195.250 / 17.455       |0.269 / 0.274 / 10.472 / 0.205          |221 / 222 / 222 / 0           |
+|800       |16        |8         |0.000 / 3.750 / 20.375 / 3.357          |0.302 / 0.308 / 10.637 / 0.165          |386 / 396 / 409 / 3           |
+|800       |16        |12        |0.000 / 0.125 / 1.375 / 0.170           |0.334 / 0.344 / 10.745 / 0.221          |2712 / 2836 / 2882 / 15       |
+|800       |16        |16        |0.000 / 0.250 / 1.375 / 0.169           |0.321 / 0.334 / 13.979 / 0.252          |3390 / 3625 / 3668 / 19       |
+|800       |20        |4         |0.000 / 17.750 / 220.750 / 17.953       |0.269 / 0.281 / 9.422 / 0.148           |222 / 223 / 223 / 0           |
+|800       |20        |8         |0.000 / 3.750 / 21.875 / 3.305          |0.302 / 0.358 / 24.073 / 0.435          |387 / 397 / 408 / 3           |
+|800       |20        |12        |0.000 / 0.000 / 0.500 / 0.067           |0.331 / 0.345 / 13.461 / 0.211          |3249 / 3304 / 3360 / 17       |
+|800       |20        |16        |0.000 / 0.000 / 0.500 / 0.069           |0.333 / 0.349 / 8.271 / 0.146           |3190 / 3331 / 3392 / 17       |
+|800       |20        |20        |0.000 / 0.000 / 0.375 / 0.069           |0.320 / 0.335 / 11.307 / 0.239          |3539 / 3752 / 3771 / 5        |
+|800       |24        |4         |0.000 / 17.125 / 184.500 / 18.184       |0.269 / 0.283 / 1.541 / 0.079           |222 / 223 / 223 / 0           |
+|800       |24        |8         |0.000 / 3.625 / 23.125 / 3.301          |0.302 / 0.317 / 10.845 / 0.169          |388 / 397 / 409 / 3           |
+|800       |24        |12        |0.000 / 0.000 / 0.250 / 0.017           |0.330 / 0.352 / 10.221 / 0.244          |3703 / 3729 / 3749 / 6        |
+|800       |24        |16        |0.000 / 0.000 / 0.250 / 0.018           |0.330 / 0.344 / 13.454 / 0.239          |3711 / 3734 / 3753 / 6        |
+|800       |24        |20        |0.000 / 0.000 / 0.250 / 0.018           |0.333 / 0.348 / 16.987 / 0.374          |3751 / 3786 / 3826 / 10       |
+|800       |24        |24        |0.000 / 0.000 / 0.250 / 0.018           |0.320 / 0.333 / 17.097 / 0.288          |4567 / 4605 / 4630 / 8        |
+|800       |28        |4         |0.000 / 17.375 / 326.125 / 18.121       |0.269 / 0.274 / 9.600 / 0.149           |223 / 224 / 224 / 0           |
+|800       |28        |8         |0.375 / 19.875 / 34.500 / 4.445         |0.302 / 0.313 / 10.025 / 0.181          |387 / 397 / 409 / 3           |
+|800       |28        |12        |0.000 / 0.000 / 0.125 / 0.011           |0.330 / 0.343 / 11.347 / 0.216          |3797 / 3821 / 3839 / 6        |
+|800       |28        |16        |0.000 / 0.000 / 0.125 / 0.010           |0.330 / 0.344 / 10.748 / 0.219          |3801 / 3823 / 3843 / 6        |
+|800       |28        |20        |0.000 / 0.000 / 0.125 / 0.011           |0.330 / 0.355 / 15.268 / 0.314          |3802 / 3827 / 3845 / 6        |
+|800       |28        |24        |0.000 / 0.000 / 0.125 / 0.011           |0.334 / 0.360 / 11.192 / 0.243          |3841 / 3874 / 3905 / 9        |
+|800       |28        |28        |0.000 / 0.000 / 0.250 / 0.011           |0.321 / 0.334 / 1.757 / 0.095           |4575 / 4609 / 4635 / 8        |
+|800       |32        |4         |0.000 / 17.125 / 161.000 / 18.370       |0.269 / 0.279 / 20.700 / 0.344          |223 / 224 / 224 / 0           |
+|800       |32        |8         |10.500 / 27.750 / 39.500 / 3.883        |0.301 / 0.333 / 18.781 / 0.332          |385 / 395 / 406 / 3           |
+|800       |32        |12        |0.000 / 0.000 / 0.250 / 0.011           |0.330 / 0.371 / 18.883 / 0.317          |3823 / 3840 / 3853 / 4        |
+|800       |32        |16        |0.000 / 0.000 / 0.125 / 0.011           |0.330 / 0.353 / 9.319 / 0.195           |3824 / 3842 / 3855 / 4        |
+|800       |32        |20        |0.000 / 0.000 / 0.125 / 0.012           |0.330 / 0.353 / 15.582 / 0.305          |3826 / 3843 / 3859 / 4        |
+|800       |32        |24        |0.000 / 0.000 / 0.125 / 0.013           |0.330 / 0.349 / 11.346 / 0.234          |3830 / 3847 / 3862 / 5        |
+|800       |32        |28        |0.000 / 0.000 / 0.250 / 0.013           |0.333 / 0.368 / 14.482 / 0.309          |3866 / 3894 / 3925 / 8        |
+|800       |32        |32        |0.000 / 0.000 / 0.125 / 0.012           |0.320 / 0.335 / 17.771 / 0.295          |4576 / 4608 / 4633 / 8        |
+|1000      |4         |4         |0.000 / 17.800 / 187.500 / 18.576       |0.337 / 0.374 / 10.384 / 0.179          |219 / 220 / 220 / 0           |
+|1000      |8         |4         |0.000 / 17.600 / 181.100 / 18.035       |0.336 / 0.372 / 13.220 / 0.262          |220 / 221 / 221 / 0           |
+|1000      |8         |8         |0.000 / 3.900 / 23.100 / 3.425          |0.371 / 0.398 / 9.495 / 0.175           |386 / 398 / 409 / 3           |
+|1000      |12        |4         |0.000 / 17.600 / 178.900 / 17.559       |0.336 / 0.351 / 11.176 / 0.265          |220 / 221 / 221 / 0           |
+|1000      |12        |8         |0.000 / 3.800 / 22.700 / 3.438          |0.371 / 0.392 / 10.942 / 0.188          |387 / 398 / 411 / 3           |
+|1000      |12        |12        |0.000 / 0.800 / 4.200 / 0.684           |0.403 / 0.443 / 11.219 / 0.279          |2971 / 3242 / 3364 / 39       |
+|1000      |16        |4         |0.000 / 17.600 / 184.300 / 17.148       |0.336 / 0.368 / 21.656 / 0.350          |221 / 222 / 222 / 0           |
+|1000      |16        |8         |0.000 / 3.800 / 21.900 / 3.350          |0.369 / 0.385 / 15.840 / 0.277          |388 / 399 / 412 / 3           |
+|1000      |16        |12        |0.000 / 0.200 / 1.200 / 0.174           |0.422 / 0.438 / 16.035 / 0.335          |3428 / 3530 / 3628 / 16       |
+|1000      |16        |16        |0.000 / 0.200 / 1.200 / 0.173           |0.405 / 0.420 / 13.370 / 0.305          |4314 / 4484 / 4573 / 20       |
+|1000      |20        |4         |0.000 / 17.600 / 223.000 / 16.968       |0.336 / 0.372 / 17.746 / 0.392          |222 / 223 / 223 / 0           |
+|1000      |20        |8         |0.000 / 3.800 / 21.400 / 3.384          |0.369 / 0.419 / 16.486 / 0.257          |389 / 400 / 412 / 3           |
+|1000      |20        |12        |0.000 / 0.000 / 0.400 / 0.068           |0.417 / 0.446 / 12.313 / 0.265          |3954 / 4099 / 4158 / 18       |
+|1000      |20        |16        |0.000 / 0.000 / 0.500 / 0.069           |0.422 / 0.439 / 11.284 / 0.262          |4016 / 4134 / 4211 / 19       |
+|1000      |20        |20        |0.000 / 0.000 / 0.600 / 0.069           |0.404 / 0.429 / 16.987 / 0.335          |4517 / 4641 / 4651 / 5        |
+|1000      |24        |4         |0.000 / 17.600 / 226.700 / 17.761       |0.339 / 0.351 / 12.804 / 0.275          |222 / 223 / 223 / 0           |
+|1000      |24        |8         |0.000 / 3.800 / 24.100 / 3.403          |0.371 / 0.406 / 15.710 / 0.298          |390 / 400 / 412 / 3           |
+|1000      |24        |12        |0.000 / 0.000 / 0.200 / 0.018           |0.417 / 0.449 / 12.253 / 0.294          |4494 / 4614 / 4636 / 7        |
+|1000      |24        |16        |0.000 / 0.000 / 0.100 / 0.018           |0.417 / 0.434 / 11.046 / 0.254          |4594 / 4620 / 4641 / 7        |
+|1000      |24        |20        |0.000 / 0.000 / 0.200 / 0.019           |0.422 / 0.458 / 13.433 / 0.270          |4645 / 4682 / 4722 / 11       |
+|1000      |24        |24        |0.000 / 0.000 / 0.200 / 0.016           |0.405 / 0.435 / 11.470 / 0.189          |5635 / 5672 / 5703 / 9        |
+|1000      |28        |4         |0.000 / 17.200 / 148.500 / 17.046       |0.338 / 0.363 / 20.446 / 0.380          |224 / 224 / 224 / 0           |
+|1000      |28        |8         |0.000 / 15.100 / 30.700 / 4.794         |0.371 / 0.389 / 18.272 / 0.359          |390 / 400 / 411 / 3           |
+|1000      |28        |12        |0.000 / 0.000 / 0.100 / 0.013           |0.417 / 0.432 / 13.575 / 0.264          |4677 / 4700 / 4719 / 6        |
+|1000      |28        |16        |0.000 / 0.000 / 0.200 / 0.013           |0.417 / 0.435 / 18.060 / 0.381          |4545 / 4702 / 4723 / 6        |
+|1000      |28        |20        |0.000 / 0.000 / 0.200 / 0.013           |0.417 / 0.448 / 17.596 / 0.344          |4679 / 4707 / 4728 / 6        |
+|1000      |28        |24        |0.000 / 0.000 / 0.200 / 0.012           |0.421 / 0.454 / 13.807 / 0.297          |4733 / 4764 / 4801 / 10       |
+|1000      |28        |28        |0.000 / 0.000 / 0.200 / 0.013           |0.406 / 0.456 / 20.533 / 0.353          |5646 / 5675 / 5704 / 9        |
+|1000      |32        |4         |0.000 / 18.150 / 177.600 / 19.537       |0.338 / 0.352 / 12.293 / 0.252          |223 / 224 / 224 / 0           |
+|1000      |32        |8         |1.500 / 22.100 / 35.100 / 4.399         |0.371 / 0.407 / 17.782 / 0.386          |388 / 398 / 412 / 3           |
+|1000      |32        |12        |0.000 / 0.000 / 0.200 / 0.011           |0.417 / 0.435 / 11.830 / 0.247          |4698 / 4717 / 4730 / 5        |
+|1000      |32        |16        |0.000 / 0.000 / 0.200 / 0.013           |0.417 / 0.443 / 18.214 / 0.276          |4700 / 4719 / 4733 / 5        |
+|1000      |32        |20        |0.000 / 0.000 / 0.200 / 0.012           |0.417 / 0.437 / 11.208 / 0.232          |4703 / 4720 / 4737 / 5        |
+|1000      |32        |24        |0.000 / 0.000 / 0.200 / 0.013           |0.417 / 0.448 / 18.288 / 0.405          |4706 / 4724 / 4740 / 5        |
+|1000      |32        |28        |0.000 / 0.000 / 0.200 / 0.011           |0.420 / 0.437 / 13.389 / 0.245          |4613 / 4782 / 4814 / 9        |
+|1000      |32        |32        |0.000 / 0.000 / 0.100 / 0.012           |0.406 / 0.424 / 12.513 / 0.232          |5641 / 5675 / 5704 / 9        |
+
+
+Table Cardinality 1500-5000, step by 500
+----------------------------------------
+
+#### Options Used
+```
+num trials: 5000
+card min: 1500
+card max: 5000
+card step: 500
+card start: 1500
+sp min: 4
+sp max: 32
+sp step: 4
+error percentile: 50.0
+time percentile: 50.0
+size percentile: 50.0
+format err as %: true
+```
+
+|card      |sp        |p         |err l/m/h/std (% of actual)             |time l/m/h/std (ms)                     |size l/m/h/std (b)            |
+|----------|----------|----------|----------------------------------------|----------------------------------------|------------------------------|
+|1500      |4         |4         |0.000 / 17.600 / 254.400 / 17.627       |0.501 / 0.612 / 19.629 / 0.593          |220 / 220 / 220 / 0           |
+|1500      |8         |4         |0.000 / 17.600 / 158.133 / 16.980       |0.506 / 0.594 / 16.843 / 0.493          |221 / 221 / 221 / 0           |
+|1500      |8         |8         |0.000 / 4.000 / 23.933 / 3.590          |0.533 / 0.567 / 11.059 / 0.259          |392 / 404 / 416 / 3           |
+|1500      |12        |4         |0.000 / 18.067 / 208.733 / 17.934       |0.505 / 0.531 / 20.544 / 0.368          |221 / 221 / 221 / 0           |
+|1500      |12        |8         |0.000 / 4.067 / 22.133 / 3.579          |0.529 / 0.576 / 22.421 / 0.453          |391 / 404 / 416 / 3           |
+|1500      |12        |12        |0.000 / 0.800 / 4.133 / 0.707           |0.607 / 0.638 / 15.124 / 0.329          |4338 / 4489 / 4656 / 43       |
+|1500      |16        |4         |0.000 / 17.200 / 167.333 / 17.918       |0.508 / 0.546 / 17.715 / 0.381          |221 / 222 / 222 / 0           |
+|1500      |16        |8         |0.000 / 3.933 / 23.667 / 3.605          |0.530 / 0.564 / 18.635 / 0.407          |393 / 405 / 417 / 3           |
+|1500      |16        |12        |0.000 / 0.200 / 1.067 / 0.166           |0.621 / 0.689 / 17.660 / 0.364          |5177 / 5271 / 5341 / 21       |
+|1500      |16        |16        |0.000 / 0.200 / 0.933 / 0.165           |0.612 / 0.654 / 19.700 / 0.419          |6688 / 6775 / 6855 / 23       |
+|1500      |20        |4         |0.000 / 17.600 / 231.333 / 17.757       |0.509 / 0.544 / 20.194 / 0.369          |223 / 223 / 223 / 0           |
+|1500      |20        |8         |0.000 / 3.933 / 25.600 / 3.728          |0.529 / 0.570 / 15.702 / 0.372          |395 / 406 / 417 / 3           |
+|1500      |20        |12        |0.000 / 0.067 / 0.333 / 0.047           |0.612 / 0.659 / 12.620 / 0.343          |6097 / 6191 / 6281 / 24       |
+|1500      |20        |16        |0.000 / 0.067 / 0.400 / 0.047           |0.619 / 0.648 / 13.508 / 0.300          |6163 / 6244 / 6344 / 24       |
+|1500      |20        |20        |0.000 / 0.067 / 0.333 / 0.047           |0.610 / 0.650 / 12.478 / 0.323          |7019 / 7048 / 7093 / 6        |
+|1500      |24        |4         |0.000 / 17.467 / 156.333 / 18.009       |0.508 / 0.569 / 17.878 / 0.386          |223 / 223 / 223 / 0           |
+|1500      |24        |8         |0.000 / 4.067 / 27.400 / 3.599          |0.529 / 0.564 / 21.583 / 0.397          |394 / 406 / 416 / 3           |
+|1500      |24        |12        |0.000 / 0.000 / 0.133 / 0.017           |0.611 / 0.655 / 16.659 / 0.383          |6974 / 7008 / 7039 / 8        |
+|1500      |24        |16        |0.000 / 0.000 / 0.133 / 0.017           |0.612 / 0.644 / 10.934 / 0.313          |6981 / 7016 / 7048 / 9        |
+|1500      |24        |20        |0.000 / 0.000 / 0.133 / 0.017           |0.620 / 0.683 / 21.873 / 0.512          |7064 / 7115 / 7167 / 14       |
+|1500      |24        |24        |0.000 / 0.000 / 0.133 / 0.017           |0.609 / 0.634 / 13.249 / 0.315          |8645 / 8684 / 8722 / 11       |
+|1500      |28        |4         |0.000 / 17.467 / 157.067 / 17.312       |0.508 / 0.529 / 14.149 / 0.336          |224 / 224 / 224 / 0           |
+|1500      |28        |8         |0.000 / 8.533 / 25.933 / 4.865          |0.529 / 0.561 / 15.511 / 0.380          |396 / 406 / 419 / 3           |
+|1500      |28        |12        |0.000 / 0.000 / 0.133 / 0.012           |0.611 / 0.657 / 10.977 / 0.294          |7178 / 7209 / 7239 / 8        |
+|1500      |28        |16        |0.000 / 0.000 / 0.133 / 0.013           |0.611 / 0.636 / 12.958 / 0.319          |7177 / 7211 / 7240 / 8        |
+|1500      |28        |20        |0.000 / 0.000 / 0.133 / 0.012           |0.612 / 0.646 / 13.818 / 0.327          |7185 / 7218 / 7248 / 9        |
+|1500      |28        |24        |0.000 / 0.000 / 0.133 / 0.012           |0.619 / 0.662 / 11.359 / 0.279          |7258 / 7305 / 7354 / 13       |
+|1500      |28        |28        |0.000 / 0.000 / 0.133 / 0.012           |0.609 / 0.648 / 12.260 / 0.300          |8643 / 8687 / 8732 / 12       |
+|1500      |32        |4         |0.000 / 17.267 / 175.933 / 18.415       |0.508 / 0.529 / 11.408 / 0.321          |224 / 224 / 224 / 0           |
+|1500      |32        |8         |0.000 / 14.667 / 29.200 / 4.897         |0.529 / 0.563 / 11.784 / 0.278          |393 / 404 / 416 / 3           |
+|1500      |32        |12        |0.000 / 0.000 / 0.133 / 0.012           |0.611 / 0.668 / 13.335 / 0.342          |7226 / 7252 / 7273 / 6        |
+|1500      |32        |16        |0.000 / 0.000 / 0.133 / 0.012           |0.611 / 0.655 / 19.309 / 0.454          |7230 / 7254 / 7276 / 6        |
+|1500      |32        |20        |0.000 / 0.000 / 0.133 / 0.012           |0.612 / 0.643 / 12.975 / 0.314          |7231 / 7256 / 7277 / 6        |
+|1500      |32        |24        |0.000 / 0.000 / 0.067 / 0.013           |0.612 / 0.666 / 12.496 / 0.357          |7236 / 7262 / 7286 / 7        |
+|1500      |32        |28        |0.000 / 0.000 / 0.133 / 0.013           |0.625 / 0.657 / 21.381 / 0.401          |7305 / 7347 / 7383 / 11       |
+|1500      |32        |32        |0.000 / 0.000 / 0.133 / 0.012           |0.609 / 0.652 / 19.148 / 0.387          |8643 / 8687 / 8724 / 12       |
+|2000      |4         |4         |0.050 / 17.950 / 200.300 / 17.701       |0.678 / 0.712 / 13.274 / 0.370          |220 / 220 / 220 / 0           |
+|2000      |8         |4         |0.050 / 17.200 / 227.450 / 17.112       |0.678 / 0.706 / 12.428 / 0.357          |221 / 221 / 221 / 0           |
+|2000      |8         |8         |0.000 / 4.150 / 28.100 / 3.687          |0.705 / 0.746 / 11.845 / 0.297          |397 / 408 / 418 / 3           |
+|2000      |12        |4         |0.050 / 17.075 / 166.300 / 17.289       |0.679 / 0.746 / 19.810 / 0.436          |221 / 221 / 221 / 0           |
+|2000      |12        |8         |0.000 / 4.050 / 26.000 / 3.697          |0.700 / 0.772 / 19.166 / 0.385          |396 / 408 / 419 / 3           |
+|2000      |12        |12        |0.050 / 0.850 / 4.150 / 0.733           |0.818 / 0.904 / 20.237 / 0.460          |5109 / 5354 / 5633 / 103      |
+|2000      |16        |4         |0.050 / 17.650 / 196.200 / 17.539       |0.678 / 0.747 / 17.211 / 0.435          |222 / 222 / 222 / 0           |
+|2000      |16        |8         |0.000 / 4.100 / 23.650 / 3.720          |0.699 / 0.770 / 17.887 / 0.378          |397 / 409 / 420 / 3           |
+|2000      |16        |12        |0.000 / 0.200 / 1.100 / 0.163           |0.835 / 0.915 / 24.825 / 0.515          |6456 / 6547 / 6647 / 23       |
+|2000      |16        |16        |0.000 / 0.200 / 1.100 / 0.167           |0.820 / 0.906 / 15.149 / 0.427          |8177 / 8278 / 8384 / 27       |
+|2000      |20        |4         |0.050 / 17.650 / 184.550 / 17.468       |0.678 / 0.742 / 19.468 / 0.449          |223 / 223 / 223 / 0           |
+|2000      |20        |8         |0.000 / 4.150 / 27.500 / 3.693          |0.700 / 0.756 / 12.525 / 0.289          |399 / 410 / 420 / 3           |
+|2000      |20        |12        |0.000 / 0.050 / 0.350 / 0.044           |0.830 / 0.921 / 19.963 / 0.553          |7551 / 7643 / 7742 / 23       |
+|2000      |20        |16        |0.000 / 0.050 / 0.300 / 0.044           |0.840 / 0.916 / 16.698 / 0.448          |7615 / 7702 / 7789 / 23       |
+|2000      |20        |20        |0.000 / 0.050 / 0.300 / 0.044           |0.824 / 0.909 / 23.619 / 0.600          |8602 / 8633 / 8652 / 7        |
+|2000      |24        |4         |0.050 / 17.600 / 249.350 / 17.740       |0.675 / 0.754 / 18.418 / 0.431          |223 / 223 / 223 / 0           |
+|2000      |24        |8         |0.000 / 4.150 / 24.700 / 3.663          |0.697 / 0.753 / 24.521 / 0.466          |398 / 410 / 421 / 3           |
+|2000      |24        |12        |0.000 / 0.000 / 0.150 / 0.017           |0.825 / 0.907 / 16.320 / 0.373          |8559 / 8591 / 8621 / 8        |
+|2000      |24        |16        |0.000 / 0.000 / 0.100 / 0.017           |0.826 / 0.876 / 20.177 / 0.403          |8567 / 8600 / 8630 / 9        |
+|2000      |24        |20        |0.000 / 0.000 / 0.100 / 0.017           |0.836 / 0.891 / 18.865 / 0.429          |8670 / 8715 / 8762 / 13       |
+|2000      |24        |24        |0.000 / 0.000 / 0.150 / 0.017           |0.823 / 0.874 / 13.270 / 0.398          |10491 / 10531 / 10569 / 11    |
+|2000      |28        |4         |0.050 / 17.600 / 206.800 / 17.750       |0.675 / 0.726 / 18.063 / 0.424          |224 / 224 / 224 / 0           |
+|2000      |28        |8         |0.000 / 6.050 / 23.850 / 4.359          |0.698 / 0.752 / 24.616 / 0.531          |400 / 411 / 421 / 3           |
+|2000      |28        |12        |0.000 / 0.000 / 0.100 / 0.013           |0.826 / 0.879 / 16.497 / 0.458          |8600 / 8623 / 8641 / 6        |
+|2000      |28        |16        |0.000 / 0.000 / 0.100 / 0.012           |0.826 / 0.898 / 16.948 / 0.417          |8602 / 8626 / 8645 / 6        |
+|2000      |28        |20        |0.000 / 0.000 / 0.150 / 0.013           |0.826 / 0.876 / 21.015 / 0.435          |8609 / 8634 / 8656 / 6        |
+|2000      |28        |24        |0.000 / 0.000 / 0.100 / 0.012           |0.836 / 0.878 / 19.773 / 0.462          |8704 / 8746 / 8791 / 12       |
+|2000      |28        |28        |0.000 / 0.000 / 0.100 / 0.012           |0.823 / 0.877 / 14.429 / 0.366          |10489 / 10535 / 10573 / 11    |
+|2000      |32        |4         |0.050 / 18.300 / 180.850 / 18.635       |0.676 / 0.723 / 18.331 / 0.431          |224 / 224 / 224 / 0           |
+|2000      |32        |8         |0.000 / 10.900 / 26.400 / 5.122         |0.698 / 0.742 / 18.170 / 0.443          |397 / 409 / 420 / 3           |
+|2000      |32        |12        |0.000 / 0.000 / 0.100 / 0.013           |0.825 / 0.869 / 12.927 / 0.376          |8603 / 8623 / 8642 / 6        |
+|2000      |32        |16        |0.000 / 0.000 / 0.100 / 0.012           |0.826 / 0.876 / 12.052 / 0.376          |8601 / 8625 / 8644 / 6        |
+|2000      |32        |20        |0.000 / 0.000 / 0.100 / 0.012           |0.824 / 0.883 / 19.872 / 0.492          |8602 / 8627 / 8644 / 6        |
+|2000      |32        |24        |0.000 / 0.000 / 0.100 / 0.012           |0.826 / 0.879 / 21.842 / 0.509          |8610 / 8635 / 8654 / 6        |
+|2000      |32        |28        |0.000 / 0.000 / 0.150 / 0.012           |0.836 / 0.894 / 18.071 / 0.448          |8707 / 8748 / 8791 / 12       |
+|2000      |32        |32        |0.000 / 0.000 / 0.100 / 0.012           |0.823 / 0.870 / 13.917 / 0.398          |10491 / 10535 / 10575 / 11    |
+|2500      |4         |4         |0.000 / 17.480 / 215.840 / 18.035       |0.844 / 0.896 / 17.723 / 0.444          |220 / 220 / 220 / 0           |
+|2500      |8         |4         |0.000 / 17.960 / 369.960 / 18.503       |0.844 / 0.897 / 20.260 / 0.542          |221 / 221 / 221 / 0           |
+|2500      |8         |8         |0.000 / 4.080 / 23.280 / 3.639          |0.874 / 0.928 / 21.505 / 0.472          |399 / 412 / 420 / 3           |
+|2500      |12        |4         |0.000 / 17.520 / 204.760 / 17.973       |0.845 / 0.963 / 21.008 / 0.499          |221 / 221 / 221 / 0           |
+|2500      |12        |8         |0.000 / 4.080 / 30.120 / 3.683          |0.869 / 0.946 / 18.277 / 0.488          |400 / 412 / 421 / 3           |
+|2500      |12        |12        |0.000 / 0.880 / 4.600 / 0.747           |1.025 / 1.134 / 20.157 / 0.532          |6140 / 6934 / 7154 / 78       |
+|2500      |16        |4         |0.000 / 17.240 / 173.400 / 17.729       |0.845 / 0.902 / 15.768 / 0.421          |222 / 222 / 222 / 0           |
+|2500      |16        |8         |0.000 / 4.160 / 25.520 / 3.846          |0.868 / 0.929 / 11.497 / 0.362          |401 / 413 / 422 / 3           |
+|2500      |16        |12        |0.000 / 0.200 / 1.080 / 0.164           |1.048 / 1.156 / 20.371 / 0.514          |8704 / 8924 / 9057 / 33       |
+|2500      |16        |16        |0.000 / 0.200 / 1.000 / 0.166           |1.031 / 1.108 / 13.336 / 0.432          |11159 / 11486 / 11633 / 42    |
+|2500      |20        |4         |0.000 / 17.600 / 154.600 / 17.373       |0.845 / 0.951 / 14.707 / 0.424          |223 / 223 / 223 / 0           |
+|2500      |20        |8         |0.000 / 4.200 / 23.720 / 3.781          |0.868 / 0.932 / 20.062 / 0.477          |397 / 414 / 424 / 3           |
+|2500      |20        |12        |0.000 / 0.040 / 0.320 / 0.044           |1.032 / 1.119 / 17.855 / 0.560          |10273 / 10533 / 10639 / 33    |
+|2500      |20        |16        |0.000 / 0.040 / 0.320 / 0.043           |1.045 / 1.107 / 16.834 / 0.461          |10370 / 10621 / 10730 / 33    |
+|2500      |20        |20        |0.000 / 0.040 / 0.400 / 0.044           |1.028 / 1.087 / 22.330 / 0.536          |11718 / 11995 / 12020 / 12    |
+|2500      |24        |4         |0.000 / 17.480 / 156.160 / 17.171       |0.844 / 0.890 / 18.096 / 0.406          |223 / 223 / 223 / 0           |
+|2500      |24        |8         |0.000 / 4.140 / 22.280 / 3.716          |0.868 / 0.915 / 19.031 / 0.458          |403 / 414 / 423 / 3           |
+|2500      |24        |12        |0.000 / 0.000 / 0.160 / 0.017           |1.030 / 1.088 / 22.283 / 0.500          |11894 / 11934 / 11971 / 11    |
+|2500      |24        |16        |0.000 / 0.000 / 0.120 / 0.017           |1.032 / 1.090 / 18.220 / 0.547          |11896 / 11947 / 11990 / 12    |
+|2500      |24        |20        |0.000 / 0.000 / 0.120 / 0.018           |1.043 / 1.101 / 17.194 / 0.516          |12056 / 12115 / 12187 / 18    |
+|2500      |24        |24        |0.000 / 0.000 / 0.120 / 0.018           |1.027 / 1.098 / 21.530 / 0.547          |14736 / 14798 / 14849 / 15    |
+|2500      |28        |4         |0.000 / 17.720 / 199.480 / 17.641       |0.845 / 0.900 / 20.585 / 0.511          |224 / 224 / 224 / 0           |
+|2500      |28        |8         |0.000 / 5.200 / 22.920 / 4.106          |0.869 / 0.914 / 12.212 / 0.359          |403 / 414 / 425 / 3           |
+|2500      |28        |12        |0.000 / 0.000 / 0.080 / 0.012           |1.031 / 1.085 / 17.978 / 0.500          |12267 / 12329 / 12367 / 11    |
+|2500      |28        |16        |0.000 / 0.000 / 0.120 / 0.013           |1.030 / 1.094 / 18.134 / 0.519          |11986 / 12331 / 12372 / 13    |
+|2500      |28        |20        |0.000 / 0.000 / 0.120 / 0.011           |1.031 / 1.086 / 20.068 / 0.550          |12296 / 12341 / 12382 / 12    |
+|2500      |28        |24        |0.000 / 0.000 / 0.080 / 0.012           |1.043 / 1.121 / 21.095 / 0.587          |12117 / 12486 / 12547 / 17    |
+|2500      |28        |28        |0.000 / 0.000 / 0.080 / 0.012           |1.028 / 1.097 / 20.162 / 0.573          |14747 / 14802 / 14864 / 15    |
+|2500      |32        |4         |0.000 / 18.200 / 187.680 / 18.797       |0.844 / 0.889 / 20.143 / 0.460          |224 / 224 / 224 / 0           |
+|2500      |32        |8         |0.000 / 8.680 / 25.600 / 4.951          |0.868 / 0.923 / 20.998 / 0.525          |402 / 413 / 422 / 3           |
+|2500      |32        |12        |0.000 / 0.000 / 0.080 / 0.012           |1.030 / 1.130 / 24.624 / 0.666          |12378 / 12414 / 12443 / 8     |
+|2500      |32        |16        |0.000 / 0.000 / 0.080 / 0.012           |1.030 / 1.090 / 17.364 / 0.532          |12381 / 12416 / 12443 / 8     |
+|2500      |32        |20        |0.000 / 0.000 / 0.120 / 0.012           |1.029 / 1.152 / 27.049 / 0.647          |12386 / 12418 / 12444 / 8     |
+|2500      |32        |24        |0.000 / 0.000 / 0.080 / 0.013           |1.031 / 1.083 / 26.018 / 0.575          |12390 / 12427 / 12460 / 9     |
+|2500      |32        |28        |0.000 / 0.000 / 0.120 / 0.013           |1.042 / 1.102 / 18.739 / 0.486          |12513 / 12568 / 12621 / 14    |
+|2500      |32        |32        |0.000 / 0.000 / 0.120 / 0.012           |1.027 / 1.088 / 16.996 / 0.499          |14742 / 14802 / 14851 / 15    |
+|3000      |4         |4         |0.000 / 17.833 / 186.867 / 17.498       |1.013 / 1.080 / 18.433 / 0.461          |220 / 220 / 220 / 0           |
+|3000      |8         |4         |0.033 / 17.600 / 201.567 / 17.855       |1.013 / 1.074 / 19.563 / 0.528          |221 / 221 / 221 / 0           |
+|3000      |8         |8         |0.000 / 4.300 / 26.467 / 3.786          |1.042 / 1.101 / 13.911 / 0.435          |403 / 414 / 422 / 3           |
+|3000      |12        |4         |0.000 / 17.467 / 212.600 / 18.720       |1.014 / 1.070 / 21.257 / 0.509          |221 / 221 / 221 / 0           |
+|3000      |12        |8         |0.000 / 4.167 / 30.600 / 3.794          |1.039 / 1.104 / 20.074 / 0.553          |405 / 414 / 422 / 3           |
+|3000      |12        |12        |0.000 / 0.833 / 4.833 / 0.745           |1.233 / 1.322 / 20.558 / 0.638          |7453 / 7706 / 7923 / 67       |
+|3000      |16        |4         |0.000 / 18.117 / 152.933 / 17.161       |1.013 / 1.101 / 21.535 / 0.564          |222 / 222 / 222 / 0           |
+|3000      |16        |8         |0.000 / 4.200 / 25.633 / 3.817          |1.037 / 1.100 / 18.806 / 0.554          |405 / 415 / 423 / 3           |
+|3000      |16        |12        |0.000 / 0.200 / 1.033 / 0.169           |1.258 / 1.331 / 22.352 / 0.682          |10292 / 10439 / 10570 / 37    |
+|3000      |16        |16        |0.000 / 0.200 / 0.967 / 0.166           |1.238 / 1.317 / 18.279 / 0.589          |13313 / 13458 / 13612 / 43    |
+|3000      |20        |4         |0.000 / 17.467 / 164.967 / 17.757       |1.013 / 1.113 / 19.652 / 0.508          |223 / 223 / 223 / 0           |
+|3000      |20        |8         |0.000 / 4.167 / 24.267 / 3.743          |1.038 / 1.092 / 18.642 / 0.554          |405 / 416 / 425 / 3           |
+|3000      |20        |12        |0.000 / 0.033 / 0.400 / 0.045           |1.240 / 1.303 / 14.404 / 0.517          |12293 / 12419 / 12571 / 35    |
+|3000      |20        |16        |0.000 / 0.033 / 0.300 / 0.045           |1.256 / 1.327 / 17.597 / 0.537          |12406 / 12522 / 12655 / 35    |
+|3000      |20        |20        |0.000 / 0.033 / 0.333 / 0.044           |1.237 / 1.308 / 20.509 / 0.558          |14100 / 14156 / 14250 / 11    |
+|3000      |24        |4         |0.000 / 17.417 / 215.733 / 18.149       |1.013 / 1.091 / 21.116 / 0.517          |223 / 223 / 223 / 0           |
+|3000      |24        |8         |0.000 / 4.233 / 21.767 / 3.773          |1.036 / 1.092 / 11.990 / 0.434          |406 / 416 / 426 / 3           |
+|3000      |24        |12        |0.000 / 0.000 / 0.100 / 0.017           |1.239 / 1.343 / 19.689 / 0.541          |14036 / 14088 / 14126 / 12    |
+|3000      |24        |16        |0.000 / 0.000 / 0.133 / 0.017           |1.239 / 1.311 / 14.029 / 0.532          |14050 / 14102 / 14146 / 13    |
+|3000      |24        |20        |0.000 / 0.000 / 0.133 / 0.017           |1.255 / 1.327 / 25.879 / 0.611          |14218 / 14302 / 14381 / 20    |
+|3000      |24        |24        |0.000 / 0.000 / 0.133 / 0.017           |1.233 / 1.299 / 20.804 / 0.615          |17434 / 17491 / 17548 / 17    |
+|3000      |28        |4         |0.000 / 17.467 / 160.633 / 17.603       |1.014 / 1.069 / 15.224 / 0.466          |224 / 224 / 224 / 0           |
+|3000      |28        |8         |0.000 / 4.733 / 22.600 / 3.937          |1.037 / 1.099 / 17.982 / 0.528          |407 / 417 / 426 / 3           |
+|3000      |28        |12        |0.000 / 0.000 / 0.100 / 0.013           |1.239 / 1.301 / 20.579 / 0.688          |14494 / 14534 / 14579 / 12    |
+|3000      |28        |16        |0.000 / 0.000 / 0.100 / 0.012           |1.237 / 1.299 / 16.532 / 0.499          |14490 / 14536 / 14575 / 12    |
+|3000      |28        |20        |0.000 / 0.000 / 0.100 / 0.013           |1.239 / 1.337 / 19.234 / 0.591          |14503 / 14548 / 14594 / 13    |
+|3000      |28        |24        |0.000 / 0.000 / 0.100 / 0.012           |1.254 / 1.328 / 17.902 / 0.580          |14666 / 14722 / 14789 / 18    |
+|3000      |28        |28        |0.000 / 0.000 / 0.100 / 0.013           |1.234 / 1.300 / 20.500 / 0.552          |17439 / 17495 / 17558 / 17    |
+|3000      |32        |4         |0.000 / 17.600 / 205.500 / 18.233       |1.012 / 1.059 / 11.735 / 0.414          |224 / 224 / 224 / 0           |
+|3000      |32        |8         |0.000 / 7.450 / 23.967 / 4.786          |1.038 / 1.102 / 15.705 / 0.478          |405 / 416 / 424 / 3           |
+|3000      |32        |12        |0.000 / 0.000 / 0.133 / 0.013           |1.238 / 1.335 / 18.066 / 0.600          |14599 / 14630 / 14661 / 9     |
+|3000      |32        |16        |0.000 / 0.000 / 0.100 / 0.012           |1.238 / 1.324 / 20.202 / 0.642          |14596 / 14632 / 14662 / 9     |
+|3000      |32        |20        |0.000 / 0.000 / 0.100 / 0.013           |1.238 / 1.313 / 17.383 / 0.513          |14601 / 14634 / 14663 / 9     |
+|3000      |32        |24        |0.000 / 0.000 / 0.100 / 0.012           |1.239 / 1.300 / 19.292 / 0.560          |14607 / 14646 / 14677 / 10    |
+|3000      |32        |28        |0.000 / 0.000 / 0.100 / 0.012           |1.254 / 1.332 / 20.109 / 0.578          |14761 / 14815 / 14872 / 16    |
+|3000      |32        |32        |0.000 / 0.000 / 0.067 / 0.012           |1.234 / 1.304 / 18.132 / 0.537          |17436 / 17495 / 17546 / 17    |
+|3500      |4         |4         |0.057 / 17.843 / 154.429 / 17.131       |1.183 / 1.241 / 18.127 / 0.543          |220 / 220 / 220 / 0           |
+|3500      |8         |4         |0.000 / 18.057 / 187.514 / 17.697       |1.182 / 1.250 / 20.428 / 0.564          |221 / 221 / 221 / 0           |
+|3500      |8         |8         |0.000 / 4.314 / 28.257 / 3.833          |1.213 / 1.299 / 20.333 / 0.672          |405 / 416 / 424 / 2           |
+|3500      |12        |4         |0.057 / 17.571 / 161.857 / 17.664       |1.181 / 1.252 / 20.923 / 0.569          |221 / 221 / 221 / 0           |
+|3500      |12        |8         |0.000 / 4.229 / 24.943 / 3.759          |1.208 / 1.275 / 22.113 / 0.543          |406 / 416 / 424 / 3           |
+|3500      |12        |12        |0.000 / 0.871 / 4.657 / 0.786           |1.442 / 1.523 / 18.288 / 0.590          |8126 / 8383 / 8643 / 70       |
+|3500      |16        |4         |0.000 / 18.114 / 163.343 / 17.771       |1.183 / 1.253 / 20.723 / 0.585          |222 / 222 / 222 / 0           |
+|3500      |16        |8         |0.000 / 4.286 / 30.143 / 3.812          |1.207 / 1.298 / 20.047 / 0.593          |406 / 418 / 424 / 2           |
+|3500      |16        |12        |0.000 / 1.057 / 5.457 / 0.698           |1.528 / 1.659 / 22.643 / 0.768          |2763 / 2824 / 2893 / 18       |
+|3500      |16        |16        |0.000 / 0.200 / 1.029 / 0.166           |1.450 / 1.558 / 20.879 / 0.642          |15119 / 15300 / 15466 / 46    |
+|3500      |20        |4         |0.057 / 18.029 / 156.029 / 17.445       |1.183 / 1.247 / 13.857 / 0.462          |223 / 223 / 223 / 0           |
+|3500      |20        |8         |0.000 / 4.314 / 26.371 / 3.859          |1.206 / 1.311 / 22.816 / 0.630          |408 / 419 / 426 / 3           |
+|3500      |20        |12        |0.000 / 1.057 / 4.771 / 0.694           |1.537 / 1.636 / 23.911 / 0.753          |2760 / 2824 / 2883 / 18       |
+|3500      |20        |16        |0.000 / 0.057 / 0.343 / 0.042           |1.472 / 1.571 / 20.930 / 0.676          |14140 / 14282 / 14406 / 38    |
+|3500      |20        |20        |0.000 / 0.057 / 0.257 / 0.043           |1.447 / 1.526 / 15.232 / 0.536          |16096 / 16146 / 16234 / 13    |
+|3500      |24        |4         |0.057 / 17.029 / 212.571 / 17.691       |1.183 / 1.254 / 17.746 / 0.583          |223 / 223 / 223 / 0           |
+|3500      |24        |8         |0.000 / 4.271 / 23.257 / 3.762          |1.207 / 1.268 / 15.615 / 0.492          |409 / 418 / 426 / 2           |
+|3500      |24        |12        |0.000 / 1.057 / 6.229 / 0.706           |1.533 / 1.653 / 22.778 / 0.677          |2760 / 2824 / 2888 / 18       |
+|3500      |24        |16        |0.000 / 0.000 / 0.114 / 0.017           |1.451 / 1.588 / 18.966 / 0.697          |16029 / 16088 / 16131 / 13    |
+|3500      |24        |20        |0.000 / 0.000 / 0.114 / 0.017           |1.469 / 1.573 / 16.584 / 0.477          |16233 / 16316 / 16395 / 22    |
+|3500      |24        |24        |0.000 / 0.000 / 0.114 / 0.017           |1.443 / 1.545 / 14.326 / 0.523          |19883 / 19959 / 20026 / 18    |
+|3500      |28        |4         |0.029 / 17.371 / 256.857 / 18.779       |1.182 / 1.254 / 13.532 / 0.445          |224 / 224 / 224 / 0           |
+|3500      |28        |8         |0.000 / 4.543 / 28.200 / 3.934          |1.208 / 1.317 / 22.788 / 0.594          |408 / 419 / 427 / 3           |
+|3500      |28        |12        |84.371 / 84.371 / 84.514 / 0.021        |1.511 / 1.626 / 15.627 / 0.572          |1188 / 1204 / 1220 / 4        |
+|3500      |28        |16        |0.000 / 0.000 / 0.086 / 0.012           |1.449 / 1.530 / 13.406 / 0.526          |16477 / 16528 / 16572 / 12    |
+|3500      |28        |20        |0.000 / 0.000 / 0.114 / 0.012           |1.451 / 1.539 / 16.128 / 0.543          |16495 / 16542 / 16587 / 13    |
+|3500      |28        |24        |0.000 / 0.000 / 0.086 / 0.012           |1.469 / 1.551 / 15.112 / 0.554          |16679 / 16744 / 16813 / 19    |
+|3500      |28        |28        |0.000 / 0.000 / 0.086 / 0.012           |1.445 / 1.545 / 15.241 / 0.543          |19879 / 19962 / 20018 / 17    |
+|3500      |32        |4         |0.057 / 17.371 / 188.286 / 17.775       |1.183 / 1.258 / 13.408 / 0.468          |224 / 224 / 224 / 0           |
+|3500      |32        |8         |0.000 / 6.400 / 25.629 / 4.553          |1.207 / 1.271 / 12.497 / 0.443          |409 / 418 / 427 / 3           |
+|3500      |32        |12        |99.086 / 99.086 / 99.086 / 0.000        |1.506 / 1.646 / 14.954 / 0.571          |920 / 920 / 920 / 0           |
+|3500      |32        |16        |0.000 / 0.000 / 0.086 / 0.012           |1.449 / 1.537 / 15.306 / 0.511          |16582 / 16624 / 16657 / 10    |
+|3500      |32        |20        |0.000 / 0.000 / 0.114 / 0.013           |1.450 / 1.558 / 15.277 / 0.547          |16587 / 16626 / 16657 / 10    |
+|3500      |32        |24        |0.000 / 0.000 / 0.086 / 0.013           |1.451 / 1.555 / 20.496 / 0.661          |16604 / 16639 / 16678 / 10    |
+|3500      |32        |28        |0.000 / 0.000 / 0.114 / 0.012           |1.468 / 1.554 / 15.893 / 0.489          |16768 / 16836 / 16895 / 17    |
+|3500      |32        |32        |0.000 / 0.000 / 0.086 / 0.012           |1.445 / 1.548 / 20.310 / 0.537          |19889 / 19962 / 20025 / 17    |
+|4000      |4         |4         |0.025 / 17.950 / 203.200 / 17.860       |1.351 / 1.431 / 14.530 / 0.524          |220 / 220 / 220 / 0           |
+|4000      |8         |4         |0.050 / 17.175 / 216.800 / 17.734       |1.351 / 1.421 / 19.692 / 0.620          |221 / 221 / 221 / 0           |
+|4000      |8         |8         |0.000 / 4.325 / 24.925 / 3.817          |1.382 / 1.475 / 19.092 / 0.560          |408 / 418 / 424 / 2           |
+|4000      |12        |4         |0.025 / 17.538 / 175.650 / 18.066       |1.352 / 1.437 / 19.980 / 0.590          |221 / 221 / 221 / 0           |
+|4000      |12        |8         |0.000 / 4.400 / 29.450 / 3.863          |1.378 / 1.477 / 22.190 / 0.643          |410 / 418 / 424 / 2           |
+|4000      |12        |12        |0.025 / 0.900 / 5.775 / 0.799           |1.648 / 1.764 / 19.034 / 0.720          |8718 / 8981 / 9265 / 70       |
+|4000      |16        |4         |0.050 / 17.575 / 176.200 / 17.005       |1.350 / 1.429 / 18.900 / 0.549          |222 / 222 / 222 / 0           |
+|4000      |16        |8         |0.000 / 4.250 / 26.400 / 3.828          |1.376 / 1.451 / 18.224 / 0.601          |410 / 419 / 425 / 2           |
+|4000      |16        |12        |0.275 / 0.950 / 4.275 / 0.615           |1.697 / 1.867 / 21.027 / 0.759          |2813 / 2882 / 2951 / 17       |
+|4000      |16        |16        |0.000 / 0.200 / 1.075 / 0.168           |1.660 / 1.801 / 17.255 / 0.650          |16124 / 17130 / 17352 / 55    |
+|4000      |20        |4         |0.050 / 18.325 / 148.475 / 17.187       |1.351 / 1.479 / 18.402 / 0.524          |223 / 223 / 223 / 0           |
+|4000      |20        |8         |0.000 / 4.350 / 25.750 / 3.871          |1.375 / 1.446 / 24.560 / 0.671          |410 / 420 / 426 / 2           |
+|4000      |20        |12        |0.275 / 0.975 / 4.400 / 0.635           |1.680 / 1.805 / 23.306 / 0.729          |2821 / 2883 / 2951 / 17       |
+|4000      |20        |16        |0.000 / 0.050 / 0.325 / 0.042           |1.684 / 1.783 / 20.501 / 0.699          |15888 / 16038 / 16188 / 39    |
+|4000      |20        |20        |0.000 / 0.050 / 0.325 / 0.042           |1.658 / 1.759 / 19.013 / 0.689          |18077 / 18134 / 18240 / 14    |
+|4000      |24        |4         |0.000 / 17.625 / 164.300 / 17.292       |1.351 / 1.427 / 19.917 / 0.579          |223 / 223 / 223 / 0           |
+|4000      |24        |8         |0.000 / 4.125 / 26.750 / 3.905          |1.375 / 1.442 / 18.641 / 0.557          |410 / 420 / 426 / 2           |
+|4000      |24        |12        |0.275 / 0.975 / 4.275 / 0.610           |1.703 / 1.810 / 22.554 / 0.826          |2825 / 2883 / 2942 / 16       |
+|4000      |24        |16        |0.000 / 0.000 / 0.100 / 0.017           |1.659 / 1.752 / 17.914 / 0.612          |18021 / 18073 / 18152 / 14    |
+|4000      |24        |20        |0.000 / 0.000 / 0.125 / 0.017           |1.681 / 1.789 / 20.884 / 0.743          |18241 / 18331 / 18404 / 22    |
+|4000      |24        |24        |0.000 / 0.000 / 0.150 / 0.017           |1.653 / 1.725 / 16.967 / 0.604          |22355 / 22426 / 22594 / 19    |
+|4000      |28        |4         |0.050 / 18.125 / 167.050 / 17.329       |1.348 / 1.501 / 23.889 / 0.758          |224 / 224 / 224 / 0           |
+|4000      |28        |8         |0.000 / 4.475 / 23.700 / 3.835          |1.374 / 1.588 / 21.053 / 0.732          |411 / 421 / 427 / 2           |
+|4000      |28        |12        |67.225 / 75.800 / 76.550 / 0.261        |1.691 / 1.936 / 17.278 / 0.667          |1620 / 1704 / 2001 / 23       |
+|4000      |28        |16        |0.000 / 0.000 / 0.100 / 0.012           |1.707 / 1.932 / 16.598 / 0.577          |18470 / 18520 / 18569 / 13    |
+|4000      |28        |20        |0.000 / 0.000 / 0.075 / 0.012           |1.732 / 1.984 / 20.429 / 0.752          |18482 / 18536 / 18582 / 14    |
+|4000      |28        |24        |0.000 / 0.000 / 0.075 / 0.012           |1.739 / 1.993 / 21.507 / 0.670          |18690 / 18766 / 18838 / 20    |
+|4000      |28        |28        |0.000 / 0.000 / 0.100 / 0.012           |1.658 / 1.939 / 14.211 / 0.594          |22364 / 22431 / 22489 / 18    |
+|4000      |32        |4         |0.000 / 17.950 / 206.150 / 18.020       |1.386 / 1.567 / 14.368 / 0.550          |224 / 224 / 224 / 0           |
+|4000      |32        |8         |0.000 / 5.925 / 22.650 / 4.366          |1.395 / 1.594 / 16.171 / 0.515          |412 / 421 / 427 / 2           |
+|4000      |32        |12        |88.250 / 88.675 / 89.125 / 0.127        |1.732 / 1.985 / 23.129 / 0.774          |1408 / 1486 / 1563 / 22       |
+|4000      |32        |16        |0.000 / 0.000 / 0.100 / 0.012           |1.709 / 1.935 / 28.713 / 0.675          |18577 / 18616 / 18647 / 10    |
+|4000      |32        |20        |0.000 / 0.000 / 0.100 / 0.012           |1.711 / 1.925 / 20.065 / 0.653          |18583 / 18618 / 18653 / 10    |
+|4000      |32        |24        |0.000 / 0.000 / 0.100 / 0.013           |1.699 / 1.917 / 20.723 / 0.617          |18589 / 18633 / 18664 / 10    |
+|4000      |32        |28        |0.000 / 0.000 / 0.075 / 0.012           |1.734 / 1.977 / 27.269 / 0.753          |18792 / 18858 / 18921 / 18    |
+|4000      |32        |32        |0.000 / 0.000 / 0.100 / 0.012           |1.704 / 1.921 / 14.253 / 0.553          |22343 / 22431 / 22575 / 19    |
+|4500      |4         |4         |0.044 / 17.911 / 173.911 / 18.150       |1.550 / 1.758 / 15.086 / 0.501          |220 / 220 / 220 / 0           |
+|4500      |8         |4         |0.044 / 17.800 / 206.000 / 17.391       |1.551 / 1.768 / 13.653 / 0.545          |221 / 221 / 221 / 0           |
+|4500      |8         |8         |0.000 / 4.222 / 26.378 / 3.844          |1.595 / 1.838 / 20.724 / 0.697          |411 / 419 / 424 / 2           |
+|4500      |12        |4         |0.000 / 17.689 / 172.667 / 17.123       |1.561 / 1.751 / 15.085 / 0.578          |221 / 221 / 221 / 0           |
+|4500      |12        |8         |0.000 / 4.300 / 24.644 / 3.826          |1.588 / 1.791 / 20.054 / 0.593          |410 / 419 / 424 / 2           |
+|4500      |12        |12        |0.022 / 0.911 / 4.956 / 0.805           |1.915 / 2.172 / 19.644 / 0.615          |9234 / 9507 / 9768 / 70       |
+|4500      |16        |4         |0.000 / 18.244 / 258.444 / 17.967       |1.526 / 1.758 / 15.643 / 0.552          |222 / 222 / 222 / 0           |
+|4500      |16        |8         |0.000 / 4.200 / 26.978 / 3.931          |1.563 / 1.786 / 15.151 / 0.572          |413 / 420 / 425 / 2           |
+|4500      |16        |12        |0.133 / 0.933 / 5.044 / 0.687           |1.972 / 2.210 / 22.173 / 0.741          |2864 / 2927 / 2980 / 15       |
+|4500      |16        |16        |0.000 / 0.200 / 0.978 / 0.166           |1.947 / 2.221 / 21.386 / 0.766          |17912 / 18092 / 18533 / 55    |
+|4500      |20        |4         |0.044 / 17.478 / 185.133 / 17.498       |1.561 / 1.765 / 13.399 / 0.524          |223 / 223 / 223 / 0           |
+|4500      |20        |8         |0.000 / 4.333 / 29.822 / 3.854          |1.590 / 1.787 / 17.447 / 0.612          |412 / 421 / 426 / 2           |
+|4500      |20        |12        |0.133 / 0.911 / 4.778 / 0.683           |1.953 / 2.210 / 24.534 / 0.768          |2875 / 2928 / 2982 / 15       |
+|4500      |20        |16        |0.000 / 0.044 / 0.311 / 0.042           |1.987 / 2.216 / 14.466 / 0.611          |16982 / 17116 / 17239 / 36    |
+|4500      |20        |20        |0.000 / 0.044 / 0.244 / 0.042           |1.944 / 2.176 / 20.109 / 0.655          |19151 / 19206 / 19254 / 15    |
+|4500      |24        |4         |0.044 / 17.644 / 191.756 / 18.124       |1.562 / 1.747 / 15.134 / 0.531          |223 / 223 / 223 / 0           |
+|4500      |24        |8         |0.000 / 4.178 / 28.111 / 3.838          |1.553 / 1.804 / 23.164 / 0.670          |413 / 421 / 426 / 2           |
+|4500      |24        |12        |0.133 / 0.933 / 4.156 / 0.663           |1.951 / 2.182 / 18.935 / 0.663          |2869 / 2928 / 2982 / 16       |
+|4500      |24        |16        |0.000 / 0.022 / 0.067 / 0.012           |1.943 / 2.170 / 17.937 / 0.713          |19107 / 19153 / 19196 / 13    |
+|4500      |24        |20        |0.000 / 0.022 / 0.089 / 0.011           |1.977 / 2.262 / 24.969 / 0.761          |19338 / 19410 / 19500 / 20    |
+|4500      |24        |24        |0.000 / 0.022 / 0.089 / 0.012           |1.929 / 2.189 / 18.456 / 0.712          |23435 / 23497 / 23550 / 17    |
+|4500      |28        |4         |0.044 / 17.133 / 288.400 / 17.897       |1.563 / 1.759 / 19.175 / 0.641          |224 / 224 / 224 / 0           |
+|4500      |28        |8         |0.000 / 4.378 / 24.867 / 3.803          |1.572 / 1.769 / 21.643 / 0.634          |415 / 422 / 427 / 2           |
+|4500      |28        |12        |66.089 / 67.400 / 68.667 / 0.359        |1.930 / 2.183 / 28.176 / 0.759          |2026 / 2113 / 2214 / 27       |
+|4500      |28        |16        |0.000 / 0.000 / 0.089 / 0.012           |1.954 / 2.170 / 20.834 / 0.751          |19176 / 19211 / 19240 / 9     |
+|4500      |28        |20        |0.000 / 0.000 / 0.089 / 0.012           |1.942 / 2.170 / 21.282 / 0.708          |19191 / 19228 / 19261 / 10    |
+|4500      |28        |24        |0.000 / 0.000 / 0.067 / 0.012           |1.982 / 2.234 / 29.563 / 0.905          |19410 / 19480 / 19557 / 18    |
+|4500      |28        |28        |0.000 / 0.000 / 0.089 / 0.012           |1.944 / 2.180 / 21.368 / 0.749          |23437 / 23501 / 23562 / 17    |
+|4500      |32        |4         |0.044 / 17.778 / 204.511 / 18.488       |1.564 / 1.801 / 23.871 / 0.680          |224 / 224 / 224 / 0           |
+|4500      |32        |8         |0.000 / 5.489 / 22.289 / 4.225          |1.588 / 1.786 / 19.144 / 0.592          |413 / 422 / 427 / 2           |
+|4500      |32        |12        |77.822 / 78.800 / 79.689 / 0.242        |1.926 / 2.172 / 21.370 / 0.726          |1838 / 1948 / 2039 / 26       |
+|4500      |32        |16        |0.000 / 0.000 / 0.089 / 0.012           |1.955 / 2.213 / 24.360 / 0.725          |19171 / 19210 / 19238 / 9     |
+|4500      |32        |20        |0.000 / 0.000 / 0.089 / 0.012           |1.949 / 2.186 / 17.274 / 0.660          |19179 / 19212 / 19241 / 9     |
+|4500      |32        |24        |0.000 / 0.000 / 0.089 / 0.012           |1.889 / 2.182 / 28.660 / 0.825          |19192 / 19228 / 19262 / 10    |
+|4500      |32        |28        |0.000 / 0.000 / 0.089 / 0.012           |1.903 / 2.039 / 21.219 / 0.700          |19423 / 19482 / 19549 / 18    |
+|4500      |32        |32        |0.000 / 0.000 / 0.089 / 0.012           |1.870 / 2.004 / 20.273 / 0.742          |23437 / 23501 / 23566 / 17    |
+|5000      |4         |4         |0.000 / 17.720 / 192.140 / 17.740       |1.684 / 1.829 / 14.606 / 0.612          |220 / 220 / 220 / 0           |
+|5000      |8         |4         |0.060 / 17.700 / 186.580 / 17.279       |1.683 / 1.818 / 15.426 / 0.599          |221 / 221 / 221 / 0           |
+|5000      |8         |8         |0.000 / 4.300 / 27.780 / 3.783          |1.715 / 1.913 / 20.698 / 0.741          |412 / 420 / 424 / 2           |
+|5000      |12        |4         |0.000 / 17.040 / 206.400 / 18.593       |1.683 / 1.809 / 17.501 / 0.622          |221 / 221 / 221 / 0           |
+|5000      |12        |8         |0.000 / 4.300 / 25.740 / 3.805          |1.710 / 1.811 / 19.765 / 0.670          |413 / 421 / 424 / 2           |
+|5000      |12        |12        |0.020 / 0.920 / 5.200 / 0.842           |2.066 / 2.203 / 25.912 / 0.840          |9696 / 9977 / 10220 / 71      |
+|5000      |16        |4         |0.000 / 17.700 / 190.640 / 16.754       |1.682 / 1.765 / 21.803 / 0.664          |222 / 222 / 222 / 0           |
+|5000      |16        |8         |0.000 / 4.300 / 30.580 / 3.861          |1.709 / 1.813 / 20.311 / 0.618          |414 / 422 / 425 / 2           |
+|5000      |16        |12        |0.000 / 0.880 / 5.140 / 0.747           |2.037 / 2.178 / 23.255 / 0.740          |2911 / 2962 / 3013 / 14       |
+|5000      |16        |16        |0.000 / 0.200 / 1.120 / 0.171           |2.094 / 2.204 / 20.890 / 0.784          |20566 / 21208 / 21872 / 88    |
+|5000      |20        |4         |0.000 / 17.620 / 127.520 / 17.257       |1.687 / 1.927 / 26.894 / 0.816          |223 / 223 / 223 / 0           |
+|5000      |20        |8         |0.000 / 4.330 / 28.580 / 3.861          |1.710 / 1.909 / 18.186 / 0.643          |415 / 423 / 426 / 2           |
+|5000      |20        |12        |0.000 / 0.900 / 5.340 / 0.743           |2.055 / 2.302 / 22.473 / 0.763          |2905 / 2963 / 3013 / 14       |
+|5000      |20        |16        |0.000 / 0.040 / 0.320 / 0.043           |2.137 / 2.410 / 24.675 / 0.864          |19509 / 19910 / 20058 / 42    |
+|5000      |20        |20        |0.000 / 0.040 / 0.280 / 0.042           |2.097 / 2.369 / 25.517 / 0.830          |21768 / 22416 / 22538 / 26    |
+|5000      |24        |4         |0.040 / 17.450 / 201.900 / 17.504       |1.686 / 1.861 / 18.820 / 0.618          |223 / 223 / 223 / 0           |
+|5000      |24        |8         |0.000 / 4.200 / 28.260 / 3.839          |1.713 / 1.923 / 19.929 / 0.679          |415 / 422 / 426 / 2           |
+|5000      |24        |12        |0.000 / 0.900 / 4.780 / 0.766           |2.047 / 2.287 / 15.684 / 0.699          |2912 / 2963 / 3016 / 14       |
+|5000      |24        |16        |0.000 / 0.020 / 0.100 / 0.012           |2.102 / 2.375 / 21.730 / 0.818          |22296 / 22351 / 22415 / 15    |
+|5000      |24        |20        |0.000 / 0.020 / 0.080 / 0.012           |2.128 / 2.397 / 24.851 / 0.845          |22577 / 22658 / 22745 / 23    |
+|5000      |24        |24        |0.000 / 0.020 / 0.080 / 0.012           |2.092 / 2.377 / 22.543 / 0.800          |27480 / 27560 / 27624 / 20    |
+|5000      |28        |4         |0.000 / 17.860 / 158.380 / 17.534       |1.686 / 1.875 / 17.770 / 0.647          |224 / 224 / 224 / 0           |
+|5000      |28        |8         |0.000 / 4.380 / 22.440 / 3.886          |1.712 / 1.969 / 22.211 / 0.772          |416 / 423 / 427 / 2           |
+|5000      |28        |12        |59.020 / 60.660 / 62.740 / 0.463        |2.037 / 2.288 / 20.272 / 0.652          |2300 / 2388 / 2487 / 26       |
+|5000      |28        |16        |0.000 / 0.000 / 0.100 / 0.012           |2.099 / 2.378 / 23.672 / 0.868          |22667 / 22723 / 22765 / 13    |
+|5000      |28        |20        |0.000 / 0.000 / 0.080 / 0.012           |2.100 / 2.389 / 21.719 / 0.838          |22687 / 22742 / 22788 / 14    |
+|5000      |28        |24        |0.000 / 0.000 / 0.080 / 0.012           |2.132 / 2.393 / 23.989 / 0.763          |22950 / 23027 / 23106 / 21    |
+|5000      |28        |28        |0.000 / 0.000 / 0.080 / 0.012           |2.094 / 2.386 / 24.741 / 0.892          |27502 / 27565 / 27637 / 20    |
+|5000      |32        |4         |0.000 / 18.060 / 189.520 / 18.378       |1.686 / 1.919 / 26.851 / 0.838          |224 / 224 / 224 / 0           |
+|5000      |32        |8         |0.000 / 5.280 / 26.500 / 4.157          |1.714 / 1.930 / 21.178 / 0.750          |416 / 423 / 427 / 2           |
+|5000      |32        |12        |69.800 / 70.920 / 72.440 / 0.341        |2.034 / 2.293 / 21.420 / 0.754          |2160 / 2261 / 2356 / 27       |
+|5000      |32        |16        |0.000 / 0.000 / 0.080 / 0.012           |2.099 / 2.387 / 25.364 / 0.794          |21966 / 22798 / 22832 / 16    |
+|5000      |32        |20        |0.000 / 0.000 / 0.080 / 0.012           |2.095 / 2.410 / 41.338 / 1.022          |22759 / 22800 / 22839 / 11    |
+|5000      |32        |24        |0.000 / 0.000 / 0.100 / 0.012           |2.100 / 2.277 / 23.671 / 0.742          |22773 / 22818 / 22856 / 11    |
+|5000      |32        |28        |0.000 / 0.000 / 0.100 / 0.012           |2.125 / 2.435 / 20.889 / 0.961          |22274 / 23099 / 23169 / 23    |
+|5000      |32        |32        |0.000 / 0.000 / 0.060 / 0.012           |2.088 / 2.280 / 16.157 / 0.705          |27494 / 27565 / 27640 / 19    |
+
+Higher Cardinalities - sp=25, p=12,14,16
+----------------------------------------
+
+|card      |sp        |p         |err l/m/h/std (% of actual)             |time l/m/h/std (ms)                     |size l/m/h/std (b)            |
+|----------|----------|----------|----------------------------------------|----------------------------------------|------------------------------|
+|55000     |25        |12        |0.000 / 1.031 / 5.431 / 0.928           |19.336 / 22.410 / 83.150 / 3.282        |3467 / 3501 / 3538 / 10       |
+|55000     |25        |14        |0.000 / 0.470 / 2.525 / 0.428           |21.031 / 24.079 / 58.355 / 3.192        |11981 / 12073 / 12166 / 25    |
+|55000     |25        |16        |0.000 / 0.140 / 0.751 / 0.124           |25.372 / 29.282 / 99.309 / 3.888        |41546 / 41834 / 42083 / 74    |
+|60000     |25        |12        |0.002 / 1.080 / 5.500 / 0.936           |21.866 / 25.060 / 83.602 / 3.563        |3486 / 3519 / 3552 / 9        |
+|60000     |25        |14        |0.002 / 0.483 / 2.762 / 0.432           |23.089 / 26.556 / 56.951 / 3.455        |12056 / 12141 / 12233 / 25    |
+|60000     |25        |16        |0.000 / 0.145 / 1.552 / 0.135           |27.680 / 31.433 / 99.324 / 3.967        |42217 / 42469 / 42714 / 70    |
+|65000     |25        |12        |0.000 / 1.053 / 5.968 / 0.927           |23.661 / 26.901 / 59.004 / 3.475        |3499 / 3534 / 3565 / 9        |
+|65000     |25        |14        |0.000 / 0.483 / 2.517 / 0.431           |24.753 / 28.293 / 60.108 / 3.483        |12120 / 12206 / 12299 / 25    |
+|65000     |25        |16        |0.000 / 0.158 / 1.455 / 0.158           |29.270 / 33.727 / 75.299 / 4.108        |42757 / 43002 / 43219 / 66    |
+|100000    |25        |14        |0.001 / 0.520 / 2.814 / 0.451           |35.787 / 41.099 / 197.958 / 7.919       |12510 / 12598 / 12685 / 26    |
+
+**HLLPMeasurement tool usage**
+
+```
+usage: HLLPMeasurement
+ -cd,--chart_delim <CHART_DELIM>                    Column delimiter for
+                                                    the chart. Default is
+                                                    pipe '|'
+ -cmn,--card_min <CARD_MIN>                         Lowest cardinality to
+                                                    start running trials
+                                                    from. Default 100
+ -cmx,--card_max <CARD_MAX>                         Max cardinality to run
+                                                    trials up to. Default
+                                                    1000
+ -cp,--chart_padding <CHART_PADDING>                Amount of padding to
+                                                    use for each column.
+                                                    Default 20
+ -cs,--card_step <CARD_STEP>                        Quantity to increment
+                                                    cardinality by for
+                                                    each successive
+                                                    measurement up until
+                                                    the cardinality high
+                                                    value. Default 100
+ -efp,--error_format_percent <ERR_FORMAT_PERCENT>   Format error in
+                                                    percent instead of
+                                                    absolute terms.
+                                                    Default true.
+ -ep,--error_percentile <ERR_PERCENTILE>            What percentile to
+                                                    calculate between
+                                                    min/max for error.
+                                                    Default is the median
+                                                    (50th percentile)
+ -h,--help                                          This screen
+ -nt,--num_trials <NUM_TRIALS>                      Number of trials to
+                                                    run. Default 1000
+ -pmn,--p_min <P_MIN>                               Minimum sparse
+                                                    precision to get
+                                                    measurements for.
+                                                    Default 4
+ -pmx,--p_max <P_MAX>                               Maximum sparse
+                                                    precision to get
+                                                    measurements for.
+                                                    Default 32
+ -ps,--p_step <P_STEP>                              Increment precision
+                                                    values by this step
+                                                    amount when running
+                                                    trials. Default 4
+ -spmn,--sp_min <SP_MIN>                            Minimum sparse
+                                                    precision to get
+                                                    measurements for.
+                                                    Default 4
+ -spmx,--sp_max <SP_MAX>                            Maximum sparse
+                                                    precision to get
+                                                    measurements for.
+                                                    Default 32
+ -sps,--sp_step <SP_STEP>                           Increment precision
+                                                    values by this step
+                                                    amount when running
+                                                    trials. Default 4
+ -spt,--size_percentile <SIZE_PERCENTILE>           What percentile to
+                                                    calculate between
+                                                    min/max for size.
+                                                    Default is the median
+                                                    (50th percentile)
+ -tp,--time_percentile <ERR_PERCENTILE>             What percentile to
+                                                    calculate between
+                                                    min/max for time.
+                                                    Default is the median
+                                                    (50th percentile)
+```

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/f3ca3c05/metron-analytics/metron-statistics/README.md
----------------------------------------------------------------------
diff --git a/metron-analytics/metron-statistics/README.md b/metron-analytics/metron-statistics/README.md
index e654097..7b26c33 100644
--- a/metron-analytics/metron-statistics/README.md
+++ b/metron-analytics/metron-statistics/README.md
@@ -10,6 +10,34 @@ functions can be used from everywhere where Stellar is used.
 
 ## Stellar Functions
 
+### Approximation Statistics
+
+### `HLLP_ADD`
+  * Description: Add value to the HyperLogLogPlus estimator set. See [HLLP README](HLLP.md)
+  * Input:
+    * hyperLogLogPlus - the hllp estimator to add a value to
+    * value+ - value to add to the set. Takes a single item or a list.
+  * Returns: The HyperLogLogPlus set with a new value added
+
+### `HLLP_CARDINALITY`
+  * Description: Returns HyperLogLogPlus-estimated cardinality for this set. See [HLLP README](HLLP.md)
+  * Input:
+    * hyperLogLogPlus - the hllp set
+  * Returns: Long value representing the cardinality for this set
+
+### `HLLP_INIT`
+  * Description: Initializes the HyperLogLogPlus estimator set. p must be a value between 4 and sp and sp must be less than 32 and greater than 4. See [HLLP README](HLLP.md)
+  * Input:
+    * p - the precision value for the normal set
+    * sp - the precision value for the sparse set. If p is set, but sp is 0 or not specified, the sparse set will be disabled.
+  * Returns: A new HyperLogLogPlus set
+
+### `HLLP_MERGE`
+  * Description: Merge hllp sets together. The resulting estimator is initialized with p and sp precision values from the first provided hllp estimator set. See [HLLP README](HLLP.md)
+  * Input:
+    * hllp - List of hllp estimators to merge. Takes a single hllp set or a list.
+  * Returns: A new merged HyperLogLogPlus estimator set
+
 ### Mathematical Functions
 
 #### `ABS`

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/f3ca3c05/metron-analytics/metron-statistics/pom.xml
----------------------------------------------------------------------
diff --git a/metron-analytics/metron-statistics/pom.xml b/metron-analytics/metron-statistics/pom.xml
index 9291747..b720b37 100644
--- a/metron-analytics/metron-statistics/pom.xml
+++ b/metron-analytics/metron-statistics/pom.xml
@@ -37,6 +37,13 @@
             <version>${project.parent.version}</version>
         </dependency>
         <dependency>
+            <groupId>org.apache.metron</groupId>
+            <artifactId>metron-common</artifactId>
+            <version>${project.parent.version}</version>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-math3</artifactId>
             <version>3.6.1</version>


[2/3] incubator-metron git commit: METRON-627: Add HyperLogLogPlus implementation to Stellar (mmiklavc) closes apache/incubator-metron#397

Posted by mm...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/f3ca3c05/metron-analytics/metron-statistics/src/main/java/org/apache/metron/statistics/approximation/HLLPMeasurement.java
----------------------------------------------------------------------
diff --git a/metron-analytics/metron-statistics/src/main/java/org/apache/metron/statistics/approximation/HLLPMeasurement.java b/metron-analytics/metron-statistics/src/main/java/org/apache/metron/statistics/approximation/HLLPMeasurement.java
new file mode 100644
index 0000000..ee0f565
--- /dev/null
+++ b/metron-analytics/metron-statistics/src/main/java/org/apache/metron/statistics/approximation/HLLPMeasurement.java
@@ -0,0 +1,413 @@
+/**
+ * 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.
+ */
+package org.apache.metron.statistics.approximation;
+
+import com.google.common.base.Joiner;
+import org.apache.commons.cli.*;
+import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
+import org.apache.metron.common.utils.SerDeUtils;
+
+import java.text.DecimalFormat;
+import java.text.NumberFormat;
+import java.util.*;
+import java.util.function.Function;
+
+/**
+ * Measure HLLP performance given variable cardinality and precision values
+ */
+public class HLLPMeasurement {
+  public static final double NANO_TO_MILLIS = 1e6;
+  public static final NumberFormat ERR_FORMAT = new DecimalFormat("#0.000");
+  public static final NumberFormat TIME_FORMAT = new DecimalFormat("#0.000");
+  public static final NumberFormat SIZE_FORMAT = new DecimalFormat("#0");
+  public static final String CHART_SPACER = "-";
+
+  public static void main(String[] args) {
+    Options options = new Options();
+
+    try {
+      CommandLineParser parser = new PosixParser();
+      CommandLine cmd = null;
+      try {
+        cmd = ParserOptions.parse(parser, args);
+      } catch (ParseException pe) {
+        pe.printStackTrace();
+        final HelpFormatter usageFormatter = new HelpFormatter();
+        usageFormatter.printHelp("HLLPMeasurement", null, options, null, true);
+        System.exit(-1);
+      }
+      if (cmd.hasOption("h")) {
+        final HelpFormatter usageFormatter = new HelpFormatter();
+        usageFormatter.printHelp("HLLPMeasurement", null, options, null, true);
+        System.exit(0);
+      }
+      final String chartDelim = ParserOptions.CHART_DELIM.get(cmd, "|");
+
+      final int numTrials = Integer.parseInt(ParserOptions.NUM_TRIALS.get(cmd, "5000"));
+      final int cardMin = Integer.parseInt(ParserOptions.CARD_MIN.get(cmd, "200"));
+      final int cardMax = Integer.parseInt(ParserOptions.CARD_MAX.get(cmd, "1000"));
+      final int cardStep = Integer.parseInt(ParserOptions.CARD_STEP.get(cmd, "200"));
+      final int cardStart = (((cardMin - 1) / cardStep) * cardStep) + cardStep;
+      final int spMin = Integer.parseInt(ParserOptions.SP_MIN.get(cmd, "4"));
+      final int spMax = Integer.parseInt(ParserOptions.SP_MAX.get(cmd, "32"));
+      final int spStep = Integer.parseInt(ParserOptions.SP_STEP.get(cmd, "4"));
+      final int pMin = Integer.parseInt(ParserOptions.P_MIN.get(cmd, "4"));
+      final int pMax = Integer.parseInt(ParserOptions.P_MAX.get(cmd, "32"));
+      final int pStep = Integer.parseInt(ParserOptions.P_STEP.get(cmd, "4"));
+      final double errorPercentile = Double.parseDouble(ParserOptions.ERR_PERCENTILE.get(cmd, "50"));
+      final double timePercentile = Double.parseDouble(ParserOptions.TIME_PERCENTILE.get(cmd, "50"));
+      final double sizePercentile = Double.parseDouble(ParserOptions.SIZE_PERCENTILE.get(cmd, "50"));
+      final boolean formatErrPercent = Boolean.parseBoolean(ParserOptions.ERR_FORMAT_PERCENT.get(cmd, "true"));
+      final int errMultiplier = formatErrPercent ? 100 : 1;
+      final Function<Double, String> errorFormatter = (v -> ERR_FORMAT.format(v * errMultiplier));
+      final Function<Double, String> timeFormatter = (v -> TIME_FORMAT.format(v / NANO_TO_MILLIS));
+      final Function<Double, String> sizeFormatter = (v -> SIZE_FORMAT.format(v));
+      final String[] chartKey = new String[]{
+              "card: cardinality",
+              "sp: sparse precision value",
+              "p: normal precision value",
+              "err: error as a percent of the expected cardinality; ",
+              "time: total time to add all values to the hllp estimator and calculate a cardinality estimate",
+              "size: size of the hllp set in bytes once all values have been added for the specified cardinality",
+              "l=low, m=mid(based on percentile chosen), h=high, std=standard deviation"};
+      final String[] chartHeader = new String[]{"card", "sp", "p", "err l/m/h/std (% of actual)", "time l/m/h/std (ms)", "size l/m/h/std (b)"};
+      final int[] chartPadding = new int[]{10, 10, 10, 40, 40, 30};
+      if (spMin < pMin) {
+        throw new IllegalArgumentException("p must be <= sp");
+      }
+      if (spMax < pMax) {
+        throw new IllegalArgumentException("p must be <= sp");
+      }
+      println("Options Used");
+      println("------------");
+      println("num trials: " + numTrials);
+      println("card min: " + cardMin);
+      println("card max: " + cardMax);
+      println("card step: " + cardStep);
+      println("card start: " + cardStart);
+      println("sp min: " + spMin);
+      println("sp max: " + spMax);
+      println("sp step: " + spStep);
+      println("p min: " + pMin);
+      println("p max: " + pMax);
+      println("p step: " + pStep);
+      println("error percentile: " + errorPercentile);
+      println("time percentile: " + timePercentile);
+      println("size percentile: " + sizePercentile);
+      println("format err as %: " + formatErrPercent);
+      println("");
+      printHeading(chartKey, chartHeader, chartPadding, chartDelim);
+
+      for (int c = cardStart; c <= cardMax; c += cardStep) {
+        for (int sp = spMin; sp <= spMax; sp += spStep) {
+          for (int p = pMin; p <= pMax; p += pStep) {
+            DescriptiveStatistics errorStats = new DescriptiveStatistics();
+            DescriptiveStatistics timeStats = new DescriptiveStatistics();
+            DescriptiveStatistics sizeStats = new DescriptiveStatistics();
+            for (int i = 0; i < numTrials; i++) {
+              List<Object> trialSet = buildTrialSet(c);
+              Set unique = new HashSet();
+              unique.addAll(trialSet);
+              long distinctVals = unique.size();
+              HyperLogLogPlus hllp = new HyperLogLogPlus(p, sp);
+              long timeStart = System.nanoTime();
+              hllp.addAll(trialSet);
+              long dvEstimate = hllp.cardinality();
+              long timeEnd = System.nanoTime();
+              long timeElapsed = timeEnd - timeStart;
+              double rawError = Math.abs(dvEstimate - distinctVals) / (double) distinctVals;
+              errorStats.addValue(rawError);
+              timeStats.addValue(timeElapsed);
+              sizeStats.addValue(SerDeUtils.toBytes(hllp).length);
+            }
+            MeasureResultFormatter errorRF = new MeasureResultFormatter(errorStats, errorFormatter, errorPercentile);
+            MeasureResultFormatter timeRF = new MeasureResultFormatter(timeStats, timeFormatter, timePercentile);
+            MeasureResultFormatter sizeRF = new MeasureResultFormatter(sizeStats, sizeFormatter, sizePercentile);
+
+            println(formatWithPadding(new String[]{"" + c, "" + sp, "" + p, errorRF.getFormattedResults(), timeRF.getFormattedResults(), sizeRF.getFormattedResults()}, chartPadding, chartDelim));
+          }
+        }
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      System.exit(-1);
+    }
+  }
+
+  private static void printHeading(String[] key, String[] header, int[] chartPadding, String chartDelim) {
+    printHeadingKey(key);
+    printDescription();
+    printHeaderRow(header, chartPadding, chartDelim);
+    printChartSpacer(header.length, chartPadding, chartDelim, CHART_SPACER);
+  }
+
+  private static void printHeadingKey(String[] key) {
+    println("Table Key");
+    println("---------");
+    for (String v : key) {
+      println(v);
+    }
+    println("");
+  }
+
+  private static void printDescription() {
+    println("Metrics Table");
+    println("-------------");
+  }
+
+  private static void printHeaderRow(String[] header, int[] padding, String delim) {
+    String headerPadded = formatWithPadding(header, padding, delim);
+    println(headerPadded);
+  }
+
+  private static void printChartSpacer(int totlength, int[] padding, String delim, String spacerStr) {
+    String[] spacer = new String[totlength];
+    Arrays.fill(spacer, spacerStr);
+    String spacerPadded = formatWithPadding(spacer, padding, delim, spacerStr);
+    println(spacerPadded);
+  }
+
+  private static void println(String val) {
+    System.out.println(val);
+  }
+
+  private static String formatWithPadding(String[] columns, int[] padding, String delim) {
+    return formatWithPadding(columns, padding, delim, " ");
+  }
+
+  private static String formatWithPadding(String[] columns, int[] padding, String delim, String paddingStr) {
+    StringBuilder sb = new StringBuilder();
+    sb.append(delim);
+    for (int i = 0; i < columns.length; i++) {
+      sb.append(org.apache.commons.lang.StringUtils.rightPad(columns[i], padding[i], paddingStr));
+      sb.append(delim);
+    }
+    return sb.toString();
+  }
+
+  private static class MeasureResultFormatter {
+    private DescriptiveStatistics stats;
+    private Function<Double, String> formatter;
+    private double percentile;
+    private String delim;
+    private boolean showStd;
+    private String std;
+
+    private MeasureResultFormatter(DescriptiveStatistics stats, Function<Double, String> formatter, double percentile) {
+      this(stats, formatter, percentile, true, " / ");
+    }
+
+    private MeasureResultFormatter(DescriptiveStatistics stats, Function<Double, String> formatter, double percentile, boolean showStd, String delim) {
+      this.stats = stats;
+      this.formatter = formatter;
+      this.percentile = percentile;
+      this.showStd = showStd;
+      this.delim = delim;
+    }
+
+    public String getMin() {
+      return formatter.apply(stats.getMin());
+    }
+
+    public String getPercentile() {
+      return formatter.apply(stats.getPercentile(percentile));
+    }
+
+    public String getMax() {
+      return formatter.apply(stats.getMax());
+    }
+
+    public MeasureResultFormatter showStandardDeviation(boolean showStd) {
+      this.showStd = showStd;
+      return this;
+    }
+
+    public String getFormattedResults() {
+      if (showStd) {
+        return Joiner.on(delim).join(getMin(), getPercentile(), getMax(), getStd());
+      } else {
+        return Joiner.on(delim).join(getMin(), getPercentile(), getMax());
+      }
+    }
+
+    public String getStd() {
+      return formatter.apply(stats.getStandardDeviation());
+    }
+  }
+
+  private static List<Object> buildTrialSet(int cardinality) {
+    List<Object> trialSet = new ArrayList(cardinality);
+    for (int i = 0; i < cardinality; i++) {
+      trialSet.add(Math.random());
+    }
+    return trialSet;
+  }
+
+  public enum ParserOptions {
+    HELP("h", code -> {
+      Option o = new Option(code, "help", false, "This screen");
+      o.setRequired(false);
+      return o;
+    }),
+    NUM_TRIALS("nt", code -> {
+      Option o = new Option(code, "num_trials", true, "Number of trials to run. Default 1000");
+      o.setArgName("NUM_TRIALS");
+      o.setRequired(false);
+      return o;
+    }),
+    CARD_MIN("cmn", code -> {
+      Option o = new Option(code, "card_min", true, "Lowest cardinality to start running trials from. Default 100");
+      o.setArgName("CARD_MIN");
+      o.setRequired(false);
+      return o;
+    }),
+    CARD_MAX("cmx", code -> {
+      Option o = new Option(code, "card_max", true, "Max cardinality to run trials up to. Default 1000");
+      o.setArgName("CARD_MAX");
+      o.setRequired(false);
+      return o;
+    }),
+    CARD_STEP("cs", code -> {
+      Option o = new Option(code, "card_step", true, "Quantity to increment cardinality by for each successive measurement up until the cardinality high value. Default 100");
+      o.setArgName("CARD_STEP");
+      o.setRequired(false);
+      return o;
+    }),
+    SP_MIN("spmn", code -> {
+      Option o = new Option(code, "sp_min", true, "Minimum sparse precision to get measurements for. Default 4");
+      o.setArgName("SP_MIN");
+      o.setRequired(false);
+      return o;
+    }),
+    SP_MAX("spmx", code -> {
+      Option o = new Option(code, "sp_max", true, "Maximum sparse precision to get measurements for. Default 32");
+      o.setArgName("SP_MAX");
+      o.setRequired(false);
+      return o;
+    }),
+    SP_STEP("sps", code -> {
+      Option o = new Option(code, "sp_step", true, "Increment precision values by this step amount when running trials. Default 4");
+      o.setArgName("SP_STEP");
+      o.setRequired(false);
+      return o;
+    }),
+    P_MIN("pmn", code -> {
+      Option o = new Option(code, "p_min", true, "Minimum sparse precision to get measurements for. Default 4");
+      o.setArgName("P_MIN");
+      o.setRequired(false);
+      return o;
+    }),
+    P_MAX("pmx", code -> {
+      Option o = new Option(code, "p_max", true, "Maximum sparse precision to get measurements for. Default 32");
+      o.setArgName("P_MAX");
+      o.setRequired(false);
+      return o;
+    }),
+    P_STEP("ps", code -> {
+      Option o = new Option(code, "p_step", true, "Increment precision values by this step amount when running trials. Default 4");
+      o.setArgName("P_STEP");
+      o.setRequired(false);
+      return o;
+    }),
+    CHART_DELIM("cd", code -> {
+      Option o = new Option(code, "chart_delim", true, "Column delimiter for the chart. Default is pipe '|'");
+      o.setArgName("CHART_DELIM");
+      o.setRequired(false);
+      return o;
+    }),
+    CHART_PADDING("cp", code -> {
+      Option o = new Option(code, "chart_padding", true, "Amount of padding to use for each column. Default 20");
+      o.setArgName("CHART_PADDING");
+      o.setRequired(false);
+      return o;
+    }),
+    ERR_PERCENTILE("ep", code -> {
+      Option o = new Option(code, "error_percentile", true, "What percentile to calculate between min/max for error. Default is the median (50th percentile)");
+      o.setArgName("ERR_PERCENTILE");
+      o.setRequired(false);
+      return o;
+    }),
+    TIME_PERCENTILE("tp", code -> {
+      Option o = new Option(code, "time_percentile", true, "What percentile to calculate between min/max for time. Default is the median (50th percentile)");
+      o.setArgName("ERR_PERCENTILE");
+      o.setRequired(false);
+      return o;
+    }),
+    SIZE_PERCENTILE("spt", code -> {
+      Option o = new Option(code, "size_percentile", true, "What percentile to calculate between min/max for size. Default is the median (50th percentile)");
+      o.setArgName("SIZE_PERCENTILE");
+      o.setRequired(false);
+      return o;
+    }),
+    ERR_FORMAT_PERCENT("efp", code -> {
+      Option o = new Option(code, "error_format_percent", true, "Format error in percent instead of absolute terms. Default true.");
+      o.setArgName("ERR_FORMAT_PERCENT");
+      o.setRequired(false);
+      return o;
+    });
+
+    Option option;
+    String shortCode;
+
+    ParserOptions(String shortCode, Function<String, Option> optionHandler) {
+      this.shortCode = shortCode;
+      this.option = optionHandler.apply(shortCode);
+    }
+
+    public boolean has(CommandLine cli) {
+      return cli.hasOption(shortCode);
+    }
+
+    public String get(CommandLine cli) {
+      return cli.getOptionValue(shortCode);
+    }
+
+    public String get(CommandLine cli, String defaultVal) {
+      return has(cli) ? cli.getOptionValue(shortCode) : defaultVal;
+    }
+
+    public static CommandLine parse(CommandLineParser parser, String[] args) throws ParseException {
+      try {
+        CommandLine cli = parser.parse(getOptions(), args);
+        if (HELP.has(cli)) {
+          printHelp();
+          System.exit(0);
+        }
+        return cli;
+      } catch (ParseException e) {
+        System.err.println("Unable to parse args: " + Joiner.on(' ').join(args));
+        e.printStackTrace(System.err);
+        printHelp();
+        throw e;
+      }
+    }
+
+    public static void printHelp() {
+      HelpFormatter formatter = new HelpFormatter();
+      formatter.printHelp("HLLPMeasurement", getOptions());
+    }
+
+    public static Options getOptions() {
+      Options ret = new Options();
+      for (ParserOptions o : ParserOptions.values()) {
+        ret.addOption(o.option);
+      }
+      return ret;
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/f3ca3c05/metron-analytics/metron-statistics/src/main/java/org/apache/metron/statistics/approximation/HyperLogLogPlus.java
----------------------------------------------------------------------
diff --git a/metron-analytics/metron-statistics/src/main/java/org/apache/metron/statistics/approximation/HyperLogLogPlus.java b/metron-analytics/metron-statistics/src/main/java/org/apache/metron/statistics/approximation/HyperLogLogPlus.java
new file mode 100644
index 0000000..22960ea
--- /dev/null
+++ b/metron-analytics/metron-statistics/src/main/java/org/apache/metron/statistics/approximation/HyperLogLogPlus.java
@@ -0,0 +1,133 @@
+/**
+ * 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.
+ */
+package org.apache.metron.statistics.approximation;
+
+import com.clearspring.analytics.stream.cardinality.CardinalityMergeException;
+import com.clearspring.analytics.stream.cardinality.ICardinality;
+import com.google.common.collect.Lists;
+
+import java.io.Serializable;
+import java.util.List;
+
+public class HyperLogLogPlus implements Serializable {
+  private final com.clearspring.analytics.stream.cardinality.HyperLogLogPlus hllp;
+  private final int p;
+  private final int sp;
+
+  /**
+   * Construct HLLP with default precisions for normal and sparse sets. Defaults are
+   * p=14, sp=25
+   */
+  public HyperLogLogPlus() {
+    this(14, 25);
+  }
+
+  /**
+   * Construct HLLP with precision for normal sets. This constructor disables the sparse set.
+   *
+   * @param p Normal set precision
+   */
+  public HyperLogLogPlus(int p) {
+    this(p, 0);
+  }
+
+  /**
+   * Construct HLLP with precision for both normal and sparse sets.
+   * p must be a value between 4 and sp (inclusive) and sp must be less than 32 and greater than or equal to 4.
+   *
+   * @param p Normal set precision
+   * @param sp Sparse set precision
+   */
+  public HyperLogLogPlus(int p, int sp) {
+    this(p, sp, new com.clearspring.analytics.stream.cardinality.HyperLogLogPlus(p, sp));
+  }
+
+  private HyperLogLogPlus(int p, int sp, com.clearspring.analytics.stream.cardinality.HyperLogLogPlus hllp) {
+    this.p = p;
+    this.sp = sp;
+    this.hllp = hllp;
+  }
+
+  public int getSp() {
+    return sp;
+  }
+
+  public int getP() {
+    return p;
+  }
+
+  /**
+   * Adds items to the estimator set
+   *
+   * @param objects Items to add
+   * @return True if the internal set is updated when the items are added
+   */
+  public boolean addAll(List<Object> objects) {
+    boolean updated = false;
+    for (Object o : objects) {
+      updated |= add(o);
+    }
+    return updated;
+  }
+
+  /**
+   * Adds item to the estimator set
+   *
+   * @param o Item to add
+   * @return True if the internal set is updated when this item is added
+   */
+  public boolean add(Object o) {
+    return hllp.offer(o);
+  }
+
+  public long cardinality() {
+    return hllp.cardinality();
+  }
+
+  /**
+   * Merges hllp sets and returns new merged set. Does not modify original sets.
+   *
+   * @param estimators hllp sets to merge
+   * @return New merged hllp set
+   */
+  public HyperLogLogPlus merge(List<HyperLogLogPlus> estimators) {
+    List<com.clearspring.analytics.stream.cardinality.HyperLogLogPlus> converted = Lists.transform(estimators, s -> s.hllp);
+    ICardinality merged = null;
+    try {
+      merged = hllp.merge(converted.toArray(new com.clearspring.analytics.stream.cardinality.HyperLogLogPlus[]{}));
+    } catch (CardinalityMergeException e) {
+      throw new IllegalArgumentException("Unable to merge estimators", e);
+    }
+    return new HyperLogLogPlus(p, sp, (com.clearspring.analytics.stream.cardinality.HyperLogLogPlus) merged);
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o == null || getClass() != o.getClass()) return false;
+
+    HyperLogLogPlus that = (HyperLogLogPlus) o;
+    return hllp.equals(that.hllp);
+  }
+
+  @Override
+  public int hashCode() {
+    return hllp.hashCode();
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/f3ca3c05/metron-analytics/metron-statistics/src/main/java/org/apache/metron/statistics/approximation/HyperLogLogPlusFunctions.java
----------------------------------------------------------------------
diff --git a/metron-analytics/metron-statistics/src/main/java/org/apache/metron/statistics/approximation/HyperLogLogPlusFunctions.java b/metron-analytics/metron-statistics/src/main/java/org/apache/metron/statistics/approximation/HyperLogLogPlusFunctions.java
new file mode 100644
index 0000000..7578403
--- /dev/null
+++ b/metron-analytics/metron-statistics/src/main/java/org/apache/metron/statistics/approximation/HyperLogLogPlusFunctions.java
@@ -0,0 +1,150 @@
+/**
+ * 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.
+ */
+package org.apache.metron.statistics.approximation;
+
+import org.apache.metron.common.dsl.BaseStellarFunction;
+import org.apache.metron.common.dsl.Stellar;
+import org.apache.metron.common.utils.ConversionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class HyperLogLogPlusFunctions {
+
+  @Stellar(namespace = "HLLP"
+          , name = "ADD"
+          , description = "Add value to the HyperLogLogPlus estimator set. See [HLLP README](HLLP.md)"
+          , params = {
+            "hyperLogLogPlus - the hllp estimator to add a value to"
+          , "value+ - value to add to the set. Takes a single item or a list."
+  }
+          , returns = "The HyperLogLogPlus set with a new value added"
+  )
+  public static class HLLPAdd extends BaseStellarFunction {
+
+    @Override
+    public Object apply(List<Object> args) {
+      if (args.size() < 2) {
+        throw new IllegalArgumentException("Must pass an hllp estimator set and at least one value to add to the set");
+      } else {
+        HyperLogLogPlus hllp = ConversionUtils.convert(args.get(0), HyperLogLogPlus.class);
+        if (hllp == null) {
+          hllp = new HyperLogLogPlus();
+        }
+        Object secondArg = args.get(1);
+        if (secondArg instanceof List) {
+          hllp.addAll((List) secondArg);
+        } else {
+          hllp.add(secondArg);
+        }
+        return hllp;
+      }
+    }
+  }
+
+  @Stellar(namespace = "HLLP"
+          , name = "CARDINALITY"
+          , description = "Returns HyperLogLogPlus-estimated cardinality for this set. See [HLLP README](HLLP.md)"
+          , params = {"hyperLogLogPlus - the hllp set"}
+          , returns = "Long value representing the cardinality for this set"
+  )
+  public static class HLLPCardinality extends BaseStellarFunction {
+
+    @Override
+    public Object apply(List<Object> args) {
+      if (args.size() < 1) {
+        throw new IllegalArgumentException("Must pass an hllp set to get the cardinality for");
+      }
+      return ((HyperLogLogPlus) args.get(0)).cardinality();
+    }
+  }
+
+  @Stellar(namespace = "HLLP"
+          , name = "INIT"
+          , description = "Initializes the HyperLogLogPlus estimator set. p must be a value between 4 and sp and sp must be less than 32 and greater than 4. The no-arg constructor defaults to sp=25, p=14. See [HLLP README](HLLP.md)"
+          , params = {
+            "p  - the precision value for the normal set"
+          , "sp - the precision value for the sparse set. If p is set, but sp is 0 or not specified, the sparse set will be disabled."
+  }
+          , returns = "A new HyperLogLogPlus set"
+  )
+  public static class HLLPInit extends BaseStellarFunction {
+
+    @Override
+    public Object apply(List<Object> args) {
+      if (args.size() == 0) {
+        return new HyperLogLogPlus();
+      } else if (args.size() == 1) {
+        Integer p = ConversionUtils.convert(args.get(0), Integer.class);
+        if (p == null) {
+          throw new IllegalArgumentException(String.format("Unable to get p value from '%s'", args.get(0)));
+        }
+        return new HyperLogLogPlus(p);
+      } else {
+        Integer p = ConversionUtils.convert(args.get(0), Integer.class);
+        Integer sp = ConversionUtils.convert(args.get(1), Integer.class);
+        if (p == null) {
+          throw new IllegalArgumentException(String.format("Unable to get p value from '%s'", args.get(0)));
+        }
+        if (sp == null) {
+          throw new IllegalArgumentException(String.format("Unable to get sp value from '%s'", args.get(1)));
+        }
+        return new HyperLogLogPlus(p, sp);
+      }
+    }
+  }
+
+  @Stellar(namespace = "HLLP"
+          , name = "MERGE"
+          , description = "Merge hllp sets together. The resulting estimator is initialized with p and sp precision values from the first provided hllp estimator set. See [HLLP README](HLLP.md)"
+          , params = {"hllp - List of hllp estimators to merge. Takes a single hllp set or a list."}
+          , returns = "A new merged HyperLogLogPlus estimator set"
+  )
+  public static class HLLPMerge extends BaseStellarFunction {
+
+    @Override
+    public Object apply(List<Object> args) {
+      if (args.size() != 1) {
+        throw new IllegalArgumentException("Must pass single list of hllp sets to merge");
+      } else {
+        List<Object> estimators = new ArrayList();
+        if (args.get(0) instanceof List) {
+          estimators = (List) args.get(0);
+        } else {
+          estimators.add(args.get(0));
+        }
+        if (estimators.size() < 1) {
+          throw new IllegalArgumentException("Must pass 1..n hllp sets to merge");
+        }
+        HyperLogLogPlus hllp = ConversionUtils.convert(estimators.get(0), HyperLogLogPlus.class);
+        if (estimators.size() > 1) {
+          hllp = hllp.merge(getEstimatorsFromIndex(estimators, 1));
+        }
+        return hllp;
+      }
+    }
+
+    /**
+     * Get sublist starting at index and convert types
+     */
+    private List<HyperLogLogPlus> getEstimatorsFromIndex(List<Object> args, int index) {
+      return ConversionUtils.convertList(args.subList(index, args.size()), HyperLogLogPlus.class);
+    }
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/f3ca3c05/metron-analytics/metron-statistics/src/test/java/org/apache/metron/statistics/approximation/HyperLogLogPlusFunctionsIntegrationTest.java
----------------------------------------------------------------------
diff --git a/metron-analytics/metron-statistics/src/test/java/org/apache/metron/statistics/approximation/HyperLogLogPlusFunctionsIntegrationTest.java b/metron-analytics/metron-statistics/src/test/java/org/apache/metron/statistics/approximation/HyperLogLogPlusFunctionsIntegrationTest.java
new file mode 100644
index 0000000..85e938a
--- /dev/null
+++ b/metron-analytics/metron-statistics/src/test/java/org/apache/metron/statistics/approximation/HyperLogLogPlusFunctionsIntegrationTest.java
@@ -0,0 +1,120 @@
+/**
+ * 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.
+ */
+package org.apache.metron.statistics.approximation;
+
+import org.adrianwalker.multilinestring.Multiline;
+import org.apache.metron.common.utils.StellarProcessorUtils;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+
+public class HyperLogLogPlusFunctionsIntegrationTest {
+
+  private Map<String, Object> values = new HashMap<String, Object>() {{
+    put("val1", "mike");
+    put("val2", "miklavcic");
+    put("val3", "metron");
+    put("val4", "batman");
+  }};
+
+  /**
+   *HLLP_CARDINALITY(
+   *  HLLP_ADD(
+   *    HLLP_ADD(
+   *      HLLP_INIT(),
+   *      val1
+   *    ),
+   *    val2
+   *  )
+   *)
+   */
+  @Multiline
+  private static String hllpDefaultConstructorRule;
+
+  @Test
+  public void cardinality_gives_distinct_value_estimate_for_default_constructor() {
+    Long estimate = (Long) StellarProcessorUtils.run(hllpDefaultConstructorRule, values);
+    Assert.assertThat("Incorrect cardinality returned", estimate, equalTo(2L));
+  }
+
+  /**
+   *HLLP_CARDINALITY(
+   *  HLLP_ADD(
+   *    HLLP_ADD(
+   *      HLLP_INIT(5, 6),
+   *      val1
+   *    ),
+   *    val2
+   *  )
+   *)
+   */
+  @Multiline
+  private static String hllpBasicRule;
+
+  @Test
+  public void cardinality_gives_distinct_value_estimate_with_precisions_set() {
+    Long estimate = (Long) StellarProcessorUtils.run(hllpBasicRule, values);
+    Assert.assertThat("Incorrect cardinality returned", estimate, equalTo(2L));
+  }
+
+  /**
+   *HLLP_CARDINALITY(
+   *  HLLP_ADD(
+   *    HLLP_INIT(5, 6),
+   *    [
+   *      val1,
+   *      val2,
+   *      val3,
+   *      val4
+   *    ]
+   *  )
+   *)
+   */
+  @Multiline
+  private static String hllpMultipleAddItems;
+
+  @Test
+  public void hllp_add_accepts_multiple_items() {
+    Long estimate = (Long) StellarProcessorUtils.run(hllpMultipleAddItems, values);
+    Assert.assertThat("Incorrect cardinality returned", estimate, equalTo(4L));
+  }
+
+  /**
+   *HLLP_CARDINALITY(
+   *  HLLP_MERGE(
+   *    [
+   *      HLLP_ADD(HLLP_ADD(HLLP_INIT(5, 6), val1), val2),
+   *      HLLP_ADD(HLLP_ADD(HLLP_INIT(5, 6), val3), val4)
+   *    ]
+   *  )
+   *)
+   */
+  @Multiline
+  private static String hllpMergeRule;
+
+  @Test
+  public void merges_estimators() {
+    Long estimate = (Long) StellarProcessorUtils.run(hllpMergeRule, values);
+    Assert.assertThat("Incorrect cardinality returned", estimate, equalTo(4L));
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/f3ca3c05/metron-analytics/metron-statistics/src/test/java/org/apache/metron/statistics/approximation/HyperLogLogPlusFunctionsTest.java
----------------------------------------------------------------------
diff --git a/metron-analytics/metron-statistics/src/test/java/org/apache/metron/statistics/approximation/HyperLogLogPlusFunctionsTest.java b/metron-analytics/metron-statistics/src/test/java/org/apache/metron/statistics/approximation/HyperLogLogPlusFunctionsTest.java
new file mode 100644
index 0000000..20be8e4
--- /dev/null
+++ b/metron-analytics/metron-statistics/src/test/java/org/apache/metron/statistics/approximation/HyperLogLogPlusFunctionsTest.java
@@ -0,0 +1,142 @@
+/**
+ * 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.
+ */
+package org.apache.metron.statistics.approximation;
+
+import com.google.common.collect.ImmutableList;
+import org.junit.Assert;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+import java.util.Arrays;
+
+import static org.hamcrest.CoreMatchers.*;
+
+public class HyperLogLogPlusFunctionsTest {
+
+  @Test
+  public void hllp_init_creates_HyperLogLogPlus_set() {
+    HyperLogLogPlus hllp = (HyperLogLogPlus) new HyperLogLogPlusFunctions.HLLPInit().apply(ImmutableList.of());
+    Assert.assertThat(hllp.getSp(), equalTo(25));
+    Assert.assertThat(hllp.getP(), equalTo(14));
+    Assert.assertThat("instance types should match for constructor with default precision values", new HyperLogLogPlusFunctions.HLLPInit().apply(ImmutableList.of(5)), instanceOf(HyperLogLogPlus.class));
+    Assert.assertThat("instance types should match for constructor with sparse set disabled", new HyperLogLogPlusFunctions.HLLPInit().apply(ImmutableList.of(5)), instanceOf(HyperLogLogPlus.class));
+    Assert.assertThat("instance types should match for full constructor", new HyperLogLogPlusFunctions.HLLPInit().apply(ImmutableList.of(5, 6)), instanceOf(HyperLogLogPlus.class));
+  }
+
+  @Rule
+  public ExpectedException thrown = ExpectedException.none();
+
+  @Test
+  public void hllp_init_with_incorrect_args_throws_exception() {
+    thrown.expect(IllegalArgumentException.class);
+    thrown.expectMessage("Unable to get p value from 'turkey'");
+    new HyperLogLogPlusFunctions.HLLPInit().apply(ImmutableList.of("turkey"));
+  }
+
+  @Test
+  public void hllp_add_returns_hllp_with_item_added_to_set() {
+    HyperLogLogPlus actual = (HyperLogLogPlus) new HyperLogLogPlusFunctions.HLLPInit().apply(ImmutableList.of(5, 6));
+    actual = (HyperLogLogPlus) new HyperLogLogPlusFunctions.HLLPAdd().apply(ImmutableList.of(actual, "item-1"));
+    actual = (HyperLogLogPlus) new HyperLogLogPlusFunctions.HLLPAdd().apply(ImmutableList.of(actual, "item-2"));
+    HyperLogLogPlus expected = new HyperLogLogPlus(5, 6);
+    expected.add("item-1");
+    expected.add("item-2");
+    Assert.assertThat("hllp set should have cardinality based on added values", actual.cardinality(), equalTo(2L));
+    Assert.assertThat("estimators should be equal", actual, equalTo(expected));
+  }
+
+  @Test
+  public void hllp_add_with_null_set_inits_and_returns_new_hllp_with_item_added_to_set() {
+    HyperLogLogPlus actual = (HyperLogLogPlus) new HyperLogLogPlusFunctions.HLLPAdd().apply(Arrays.asList(null, "item-1"));
+    Assert.assertThat(actual, notNullValue());
+  }
+
+  @Test
+  public void hllp_add_throws_exception_with_incorrect_args() {
+    thrown.expect(IllegalArgumentException.class);
+    thrown.expectMessage("Must pass an hllp estimator set and at least one value to add to the set");
+    new HyperLogLogPlusFunctions.HLLPAdd().apply(ImmutableList.of(new HyperLogLogPlusFunctions.HLLPInit().apply(ImmutableList.of(5, 6))));
+  }
+
+  @Test
+  public void hllp_cardinality_returns_number_of_distinct_values() {
+    HyperLogLogPlus hllp = (HyperLogLogPlus) new HyperLogLogPlusFunctions.HLLPInit().apply(ImmutableList.of(5, 6));
+    hllp = (HyperLogLogPlus) new HyperLogLogPlusFunctions.HLLPAdd().apply(ImmutableList.of(hllp, "item-1"));
+    hllp = (HyperLogLogPlus) new HyperLogLogPlusFunctions.HLLPAdd().apply(ImmutableList.of(hllp, "item-2"));
+    hllp = (HyperLogLogPlus) new HyperLogLogPlusFunctions.HLLPAdd().apply(ImmutableList.of(hllp, "item-3"));
+    Assert.assertThat("cardinality not expected value", new HyperLogLogPlusFunctions.HLLPCardinality().apply(ImmutableList.of(hllp)), equalTo(3L));
+  }
+
+  @Test
+  public void hllp_cardinality_with_invalid_arguments_throws_exception() {
+    thrown.expect(IllegalArgumentException.class);
+    thrown.expectMessage("Must pass an hllp set to get the cardinality for");
+    new HyperLogLogPlusFunctions.HLLPCardinality().apply(ImmutableList.of());
+  }
+
+  @Test
+  public void hllp_merge_combines_hllp_sets() {
+    HyperLogLogPlus hllp1 = (HyperLogLogPlus) new HyperLogLogPlusFunctions.HLLPInit().apply(ImmutableList.of(5, 6));
+    hllp1 = (HyperLogLogPlus) new HyperLogLogPlusFunctions.HLLPAdd().apply(ImmutableList.of(hllp1, "item-1"));
+    hllp1 = (HyperLogLogPlus) new HyperLogLogPlusFunctions.HLLPAdd().apply(ImmutableList.of(hllp1, "item-2"));
+
+    HyperLogLogPlus hllp2 = (HyperLogLogPlus) new HyperLogLogPlusFunctions.HLLPInit().apply(ImmutableList.of(5, 6));
+    hllp2 = (HyperLogLogPlus) new HyperLogLogPlusFunctions.HLLPAdd().apply(ImmutableList.of(hllp2, "item-3"));
+    HyperLogLogPlus merged = (HyperLogLogPlus) new HyperLogLogPlusFunctions.HLLPMerge().apply(ImmutableList.of(ImmutableList.of(hllp1, hllp2)));
+
+    Long actual = (Long) new HyperLogLogPlusFunctions.HLLPCardinality().apply(ImmutableList.of(merged));
+    Assert.assertThat("cardinality should match merged set", actual, equalTo(3L));
+
+    HyperLogLogPlus hllp3 = (HyperLogLogPlus) new HyperLogLogPlusFunctions.HLLPInit().apply(ImmutableList.of(5, 6));
+    hllp3 = (HyperLogLogPlus) new HyperLogLogPlusFunctions.HLLPAdd().apply(ImmutableList.of(hllp3, "item-4"));
+    merged = (HyperLogLogPlus) new HyperLogLogPlusFunctions.HLLPMerge().apply(ImmutableList.of(ImmutableList.of(hllp1, hllp2, hllp3)));
+
+    actual = (Long) new HyperLogLogPlusFunctions.HLLPCardinality().apply(ImmutableList.of(merged));
+    Assert.assertThat("cardinality should match merged set", actual, equalTo(4L));
+  }
+
+  @Test
+  public void hllp_merge_with_single_estimator_acts_as_identity_function() {
+    HyperLogLogPlus hllp1 = (HyperLogLogPlus) new HyperLogLogPlusFunctions.HLLPInit().apply(ImmutableList.of(5, 6));
+    hllp1 = (HyperLogLogPlus) new HyperLogLogPlusFunctions.HLLPAdd().apply(ImmutableList.of(hllp1, "item-1"));
+    hllp1 = (HyperLogLogPlus) new HyperLogLogPlusFunctions.HLLPAdd().apply(ImmutableList.of(hllp1, "item-2"));
+
+    HyperLogLogPlus merged = (HyperLogLogPlus) new HyperLogLogPlusFunctions.HLLPMerge().apply(ImmutableList.of(hllp1));
+
+    Long actual = (Long) new HyperLogLogPlusFunctions.HLLPCardinality().apply(ImmutableList.of(merged));
+    Assert.assertThat("cardinality should match merged set", actual, equalTo(2L));
+  }
+
+  @Test
+  public void hllp_merge_throws_exception_with_no_arguments() {
+    thrown.expect(IllegalArgumentException.class);
+    thrown.expectMessage("Must pass single list of hllp sets to merge");
+    new HyperLogLogPlusFunctions.HLLPMerge().apply(ImmutableList.of());
+  }
+
+  @Test
+  public void hllp_merge_throws_exception_on_invalid_arguments() {
+    thrown.expect(IllegalArgumentException.class);
+    thrown.expectMessage("Must pass single list of hllp sets to merge");
+    HyperLogLogPlus hllp1 = (HyperLogLogPlus) new HyperLogLogPlusFunctions.HLLPInit().apply(ImmutableList.of());
+    HyperLogLogPlus hllp2 = (HyperLogLogPlus) new HyperLogLogPlusFunctions.HLLPInit().apply(ImmutableList.of());
+    new HyperLogLogPlusFunctions.HLLPMerge().apply(ImmutableList.of(hllp1, hllp2));
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/f3ca3c05/metron-platform/metron-common/README.md
----------------------------------------------------------------------
diff --git a/metron-platform/metron-common/README.md b/metron-platform/metron-common/README.md
index 56932f3..ace1a0c 100644
--- a/metron-platform/metron-common/README.md
+++ b/metron-platform/metron-common/README.md
@@ -96,7 +96,11 @@ The `!=` operator is the negation of the above.
 | [ `ENRICHMENT_GET`](#enrichment_get)                                                               |
 | [ `FILL_LEFT`](#fill_left)                                                                         |
 | [ `FILL_RIGHT`](#fill_right)                                                                       |
-| [ `GEO_GET`](#geo_get)                                                                          |
+| [ `HLLP_CARDINALITY`](../../metron-analytics/metron-statistics#hllp_cardinality)                   |
+| [ `HLLP_INIT`](../../metron-analytics/metron-statistics#hllp_init)                                 |
+| [ `HLLP_MERGE`](../../metron-analytics/metron-statistics#hllp_merge)                               |
+| [ `HLLP_OFFER`](../../metron-analytics/metron-statistics#hllp_offer)                               |
+| [ `GEO_GET`](#geo_get)                                                                             |
 | [ `GET`](#get)                                                                                     |
 | [ `GET_FIRST`](#get_first)                                                                         |
 | [ `GET_LAST`](#get_last)                                                                           |
@@ -250,6 +254,22 @@ The `!=` operator is the negation of the above.
     * column_family - The Column Family to use
   * Returns: A Map associated with the indicator and enrichment type.  Empty otherwise.
 
+### `FILL_LEFT`
+  * Description: Fills or pads a given string with a given character, to a given length on the left
+  * Input:
+    * input - string
+    * fill - the fill character
+    * len - the required length
+  * Returns: the filled string
+
+### `FILL_RIGHT`
+  * Description: Fills or pads a given string with a given character, to a given length on the right
+  * Input:
+    * input - string
+    * fill - the fill character string
+    * len - the required length
+  * Returns: Last element of the list
+
 ### `GEO_GET`
   * Description: Look up an IPV4 address and returns geographic information about it
   * Input:
@@ -276,22 +296,6 @@ The `!=` operator is the negation of the above.
     * input - List
   * Returns: Last element of the list
 
-### `FILL_LEFT`
-  * Description: Fills or pads a given string with a given character, to a given length on the left
-  * Input:
-    * input - string
-    * fill - the fill character
-    * len - the required length
-  * Returns: the filled string
-
-### `FILL_RIGHT`
-  * Description: Fills or pads a given string with a given character, to a given length on the right
-  * Input:
-    * input - string
-    * fill - the fill character string
-    * len - the required length
-  * Returns: Last element of the list
-
 ### `IN_SUBNET`
   * Description: Returns true if an IP is within a subnet range.
   * Input:
@@ -407,7 +411,8 @@ The `!=` operator is the negation of the above.
     * key - The key to check for existence
     * map - The map to check for existence of the key
   * Returns: True if the key is found in the map and false if otherwise.
-MAP_GET`
+
+### `MAP_GET`
   * Description: Gets the value associated with a key from a map
   * Input:
     * key - The key

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/f3ca3c05/metron-platform/metron-common/pom.xml
----------------------------------------------------------------------
diff --git a/metron-platform/metron-common/pom.xml b/metron-platform/metron-common/pom.xml
index 0332ddf..9b833c2 100644
--- a/metron-platform/metron-common/pom.xml
+++ b/metron-platform/metron-common/pom.xml
@@ -326,7 +326,11 @@
             <artifactId>aesh</artifactId>
             <version>0.66.8</version>
         </dependency>
-
+        <dependency>
+            <groupId>com.clearspring.analytics</groupId>
+            <artifactId>stream</artifactId>
+            <version>2.9.5</version>
+        </dependency>
     </dependencies>
 
     <reporting>

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/f3ca3c05/metron-platform/metron-common/src/main/antlr4/org/apache/metron/common/stellar/generated/Stellar.g4
----------------------------------------------------------------------
diff --git a/metron-platform/metron-common/src/main/antlr4/org/apache/metron/common/stellar/generated/Stellar.g4 b/metron-platform/metron-common/src/main/antlr4/org/apache/metron/common/stellar/generated/Stellar.g4
index 7bdc3a7..98af17f 100644
--- a/metron-platform/metron-common/src/main/antlr4/org/apache/metron/common/stellar/generated/Stellar.g4
+++ b/metron-platform/metron-common/src/main/antlr4/org/apache/metron/common/stellar/generated/Stellar.g4
@@ -45,7 +45,7 @@ DOUBLE_QUOTE : '"';
 SINGLE_QUOTE : '\'';
 COMMA : ',';
 PERIOD : '.';
-EOL : '\n';
+fragment EOL : '\n';
 
 AND : 'and' | '&&' | 'AND';
 OR : 'or' | '||' | 'OR';

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/f3ca3c05/metron-platform/metron-common/src/main/java/Stellar.tokens
----------------------------------------------------------------------
diff --git a/metron-platform/metron-common/src/main/java/Stellar.tokens b/metron-platform/metron-common/src/main/java/Stellar.tokens
index cbc9c0e..06884b8 100644
--- a/metron-platform/metron-common/src/main/java/Stellar.tokens
+++ b/metron-platform/metron-common/src/main/java/Stellar.tokens
@@ -2,66 +2,64 @@ DOUBLE_QUOTE=1
 SINGLE_QUOTE=2
 COMMA=3
 PERIOD=4
-EOL=5
-AND=6
-OR=7
-NOT=8
-TRUE=9
-FALSE=10
-EQ=11
-NEQ=12
-LT=13
-LTE=14
-GT=15
-GTE=16
-QUESTION=17
-COLON=18
-IF=19
-THEN=20
-ELSE=21
-NULL=22
-MINUS=23
-PLUS=24
-DIV=25
-MUL=26
-LBRACE=27
-RBRACE=28
-LBRACKET=29
-RBRACKET=30
-LPAREN=31
-RPAREN=32
-IN=33
-NIN=34
-EXISTS=35
-EXPONENT=36
-INT_LITERAL=37
-DOUBLE_LITERAL=38
-FLOAT_LITERAL=39
-LONG_LITERAL=40
-IDENTIFIER=41
-STRING_LITERAL=42
-COMMENT=43
-WS=44
+AND=5
+OR=6
+NOT=7
+TRUE=8
+FALSE=9
+EQ=10
+NEQ=11
+LT=12
+LTE=13
+GT=14
+GTE=15
+QUESTION=16
+COLON=17
+IF=18
+THEN=19
+ELSE=20
+NULL=21
+MINUS=22
+PLUS=23
+DIV=24
+MUL=25
+LBRACE=26
+RBRACE=27
+LBRACKET=28
+RBRACKET=29
+LPAREN=30
+RPAREN=31
+IN=32
+NIN=33
+EXISTS=34
+EXPONENT=35
+INT_LITERAL=36
+DOUBLE_LITERAL=37
+FLOAT_LITERAL=38
+LONG_LITERAL=39
+IDENTIFIER=40
+STRING_LITERAL=41
+COMMENT=42
+WS=43
 '"'=1
 '\''=2
 ','=3
 '.'=4
-'\n'=5
-'=='=11
-'!='=12
-'<'=13
-'<='=14
-'>'=15
-'>='=16
-'?'=17
-':'=18
-'-'=23
-'+'=24
-'/'=25
-'*'=26
-'{'=27
-'}'=28
-'['=29
-']'=30
-'('=31
-')'=32
+'=='=10
+'!='=11
+'<'=12
+'<='=13
+'>'=14
+'>='=15
+'?'=16
+':'=17
+'-'=22
+'+'=23
+'/'=24
+'*'=25
+'{'=26
+'}'=27
+'['=28
+']'=29
+'('=30
+')'=31

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/f3ca3c05/metron-platform/metron-common/src/main/java/StellarLexer.tokens
----------------------------------------------------------------------
diff --git a/metron-platform/metron-common/src/main/java/StellarLexer.tokens b/metron-platform/metron-common/src/main/java/StellarLexer.tokens
index cbc9c0e..06884b8 100644
--- a/metron-platform/metron-common/src/main/java/StellarLexer.tokens
+++ b/metron-platform/metron-common/src/main/java/StellarLexer.tokens
@@ -2,66 +2,64 @@ DOUBLE_QUOTE=1
 SINGLE_QUOTE=2
 COMMA=3
 PERIOD=4
-EOL=5
-AND=6
-OR=7
-NOT=8
-TRUE=9
-FALSE=10
-EQ=11
-NEQ=12
-LT=13
-LTE=14
-GT=15
-GTE=16
-QUESTION=17
-COLON=18
-IF=19
-THEN=20
-ELSE=21
-NULL=22
-MINUS=23
-PLUS=24
-DIV=25
-MUL=26
-LBRACE=27
-RBRACE=28
-LBRACKET=29
-RBRACKET=30
-LPAREN=31
-RPAREN=32
-IN=33
-NIN=34
-EXISTS=35
-EXPONENT=36
-INT_LITERAL=37
-DOUBLE_LITERAL=38
-FLOAT_LITERAL=39
-LONG_LITERAL=40
-IDENTIFIER=41
-STRING_LITERAL=42
-COMMENT=43
-WS=44
+AND=5
+OR=6
+NOT=7
+TRUE=8
+FALSE=9
+EQ=10
+NEQ=11
+LT=12
+LTE=13
+GT=14
+GTE=15
+QUESTION=16
+COLON=17
+IF=18
+THEN=19
+ELSE=20
+NULL=21
+MINUS=22
+PLUS=23
+DIV=24
+MUL=25
+LBRACE=26
+RBRACE=27
+LBRACKET=28
+RBRACKET=29
+LPAREN=30
+RPAREN=31
+IN=32
+NIN=33
+EXISTS=34
+EXPONENT=35
+INT_LITERAL=36
+DOUBLE_LITERAL=37
+FLOAT_LITERAL=38
+LONG_LITERAL=39
+IDENTIFIER=40
+STRING_LITERAL=41
+COMMENT=42
+WS=43
 '"'=1
 '\''=2
 ','=3
 '.'=4
-'\n'=5
-'=='=11
-'!='=12
-'<'=13
-'<='=14
-'>'=15
-'>='=16
-'?'=17
-':'=18
-'-'=23
-'+'=24
-'/'=25
-'*'=26
-'{'=27
-'}'=28
-'['=29
-']'=30
-'('=31
-')'=32
+'=='=10
+'!='=11
+'<'=12
+'<='=13
+'>'=14
+'>='=15
+'?'=16
+':'=17
+'-'=22
+'+'=23
+'/'=24
+'*'=25
+'{'=26
+'}'=27
+'['=28
+']'=29
+'('=30
+')'=31

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/f3ca3c05/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/generated/StellarLexer.java
----------------------------------------------------------------------
diff --git a/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/generated/StellarLexer.java b/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/generated/StellarLexer.java
index 62e1683..83e6434 100644
--- a/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/generated/StellarLexer.java
+++ b/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/generated/StellarLexer.java
@@ -37,13 +37,13 @@ public class StellarLexer extends Lexer {
 	protected static final PredictionContextCache _sharedContextCache =
 		new PredictionContextCache();
 	public static final int
-		DOUBLE_QUOTE=1, SINGLE_QUOTE=2, COMMA=3, PERIOD=4, EOL=5, AND=6, OR=7, 
-		NOT=8, TRUE=9, FALSE=10, EQ=11, NEQ=12, LT=13, LTE=14, GT=15, GTE=16, 
-		QUESTION=17, COLON=18, IF=19, THEN=20, ELSE=21, NULL=22, MINUS=23, PLUS=24, 
-		DIV=25, MUL=26, LBRACE=27, RBRACE=28, LBRACKET=29, RBRACKET=30, LPAREN=31, 
-		RPAREN=32, IN=33, NIN=34, EXISTS=35, EXPONENT=36, INT_LITERAL=37, DOUBLE_LITERAL=38, 
-		FLOAT_LITERAL=39, LONG_LITERAL=40, IDENTIFIER=41, STRING_LITERAL=42, COMMENT=43, 
-		WS=44;
+		DOUBLE_QUOTE=1, SINGLE_QUOTE=2, COMMA=3, PERIOD=4, AND=5, OR=6, NOT=7, 
+		TRUE=8, FALSE=9, EQ=10, NEQ=11, LT=12, LTE=13, GT=14, GTE=15, QUESTION=16, 
+		COLON=17, IF=18, THEN=19, ELSE=20, NULL=21, MINUS=22, PLUS=23, DIV=24, 
+		MUL=25, LBRACE=26, RBRACE=27, LBRACKET=28, RBRACKET=29, LPAREN=30, RPAREN=31, 
+		IN=32, NIN=33, EXISTS=34, EXPONENT=35, INT_LITERAL=36, DOUBLE_LITERAL=37, 
+		FLOAT_LITERAL=38, LONG_LITERAL=39, IDENTIFIER=40, STRING_LITERAL=41, COMMENT=42, 
+		WS=43;
 	public static String[] modeNames = {
 		"DEFAULT_MODE"
 	};
@@ -59,14 +59,13 @@ public class StellarLexer extends Lexer {
 	};
 
 	private static final String[] _LITERAL_NAMES = {
-		null, "'\"'", "'''", "','", "'.'", "'\n'", null, null, null, null, null, 
-		"'=='", "'!='", "'<'", "'<='", "'>'", "'>='", "'?'", "':'", null, null, 
-		null, null, "'-'", "'+'", "'/'", "'*'", "'{'", "'}'", "'['", "']'", "'('", 
-		"')'"
+		null, "'\"'", "'''", "','", "'.'", null, null, null, null, null, "'=='", 
+		"'!='", "'<'", "'<='", "'>'", "'>='", "'?'", "':'", null, null, null, 
+		null, "'-'", "'+'", "'/'", "'*'", "'{'", "'}'", "'['", "']'", "'('", "')'"
 	};
 	private static final String[] _SYMBOLIC_NAMES = {
-		null, "DOUBLE_QUOTE", "SINGLE_QUOTE", "COMMA", "PERIOD", "EOL", "AND", 
-		"OR", "NOT", "TRUE", "FALSE", "EQ", "NEQ", "LT", "LTE", "GT", "GTE", "QUESTION", 
+		null, "DOUBLE_QUOTE", "SINGLE_QUOTE", "COMMA", "PERIOD", "AND", "OR", 
+		"NOT", "TRUE", "FALSE", "EQ", "NEQ", "LT", "LTE", "GT", "GTE", "QUESTION", 
 		"COLON", "IF", "THEN", "ELSE", "NULL", "MINUS", "PLUS", "DIV", "MUL", 
 		"LBRACE", "RBRACE", "LBRACKET", "RBRACKET", "LPAREN", "RPAREN", "IN", 
 		"NIN", "EXISTS", "EXPONENT", "INT_LITERAL", "DOUBLE_LITERAL", "FLOAT_LITERAL", 
@@ -127,7 +126,7 @@ public class StellarLexer extends Lexer {
 	public ATN getATN() { return _ATN; }
 
 	public static final String _serializedATN =
-		"\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\2.\u01ba\b\1\4\2\t"+
+		"\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\2-\u01ba\b\1\4\2\t"+
 		"\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+
 		"\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
 		"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
@@ -157,133 +156,133 @@ public class StellarLexer extends Lexer {
 		"\n+\f+\16+\u0190\13+\3+\3+\5+\u0194\n+\3,\3,\3,\3,\6,\u019a\n,\r,\16,"+
 		"\u019b\3,\3,\5,\u01a0\n,\3,\3,\3-\6-\u01a5\n-\r-\16-\u01a6\3-\3-\3.\3"+
 		".\3/\3/\3\60\3\60\3\61\3\61\3\62\3\62\3\63\3\63\3\64\3\64\3\65\3\65\3"+
-		"\u019b\2\66\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33"+
-		"\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67"+
-		"\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[\2]\2_\2a\2c\2e\2g\2i\2\3"+
-		"\2\n\5\2C\\aac|\b\2\60\60\62<C\\^^aac|\5\2\13\f\16\17\"\"\7\2\f\f\17\17"+
-		"$$))^^\4\2FFff\4\2GGgg\4\2HHhh\4\2NNnn\u01e0\2\3\3\2\2\2\2\5\3\2\2\2\2"+
-		"\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2"+
-		"\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2"+
-		"\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2"+
-		"\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2"+
-		"\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2"+
-		"\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2"+
-		"M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3"+
-		"\2\2\2\3k\3\2\2\2\5m\3\2\2\2\7o\3\2\2\2\tq\3\2\2\2\13s\3\2\2\2\r}\3\2"+
-		"\2\2\17\u0085\3\2\2\2\21\u008d\3\2\2\2\23\u0097\3\2\2\2\25\u00a3\3\2\2"+
-		"\2\27\u00a5\3\2\2\2\31\u00a8\3\2\2\2\33\u00ab\3\2\2\2\35\u00ad\3\2\2\2"+
-		"\37\u00b0\3\2\2\2!\u00b2\3\2\2\2#\u00b5\3\2\2\2%\u00b7\3\2\2\2\'\u00bd"+
-		"\3\2\2\2)\u00c7\3\2\2\2+\u00d1\3\2\2\2-\u00db\3\2\2\2/\u00dd\3\2\2\2\61"+
-		"\u00df\3\2\2\2\63\u00e1\3\2\2\2\65\u00e3\3\2\2\2\67\u00e5\3\2\2\29\u00e7"+
-		"\3\2\2\2;\u00e9\3\2\2\2=\u00eb\3\2\2\2?\u00ed\3\2\2\2A\u00ef\3\2\2\2C"+
-		"\u00f5\3\2\2\2E\u0103\3\2\2\2G\u0111\3\2\2\2I\u0113\3\2\2\2K\u012b\3\2"+
-		"\2\2M\u0152\3\2\2\2O\u0175\3\2\2\2Q\u0177\3\2\2\2S\u017a\3\2\2\2U\u0193"+
-		"\3\2\2\2W\u0195\3\2\2\2Y\u01a4\3\2\2\2[\u01aa\3\2\2\2]\u01ac\3\2\2\2_"+
-		"\u01ae\3\2\2\2a\u01b0\3\2\2\2c\u01b2\3\2\2\2e\u01b4\3\2\2\2g\u01b6\3\2"+
-		"\2\2i\u01b8\3\2\2\2kl\7$\2\2l\4\3\2\2\2mn\7)\2\2n\6\3\2\2\2op\7.\2\2p"+
-		"\b\3\2\2\2qr\7\60\2\2r\n\3\2\2\2st\7\f\2\2t\f\3\2\2\2uv\7c\2\2vw\7p\2"+
-		"\2w~\7f\2\2xy\7(\2\2y~\7(\2\2z{\7C\2\2{|\7P\2\2|~\7F\2\2}u\3\2\2\2}x\3"+
-		"\2\2\2}z\3\2\2\2~\16\3\2\2\2\177\u0080\7q\2\2\u0080\u0086\7t\2\2\u0081"+
-		"\u0082\7~\2\2\u0082\u0086\7~\2\2\u0083\u0084\7Q\2\2\u0084\u0086\7T\2\2"+
-		"\u0085\177\3\2\2\2\u0085\u0081\3\2\2\2\u0085\u0083\3\2\2\2\u0086\20\3"+
-		"\2\2\2\u0087\u0088\7p\2\2\u0088\u0089\7q\2\2\u0089\u008e\7v\2\2\u008a"+
-		"\u008b\7P\2\2\u008b\u008c\7Q\2\2\u008c\u008e\7V\2\2\u008d\u0087\3\2\2"+
-		"\2\u008d\u008a\3\2\2\2\u008e\22\3\2\2\2\u008f\u0090\7v\2\2\u0090\u0091"+
-		"\7t\2\2\u0091\u0092\7w\2\2\u0092\u0098\7g\2\2\u0093\u0094\7V\2\2\u0094"+
-		"\u0095\7T\2\2\u0095\u0096\7W\2\2\u0096\u0098\7G\2\2\u0097\u008f\3\2\2"+
-		"\2\u0097\u0093\3\2\2\2\u0098\24\3\2\2\2\u0099\u009a\7h\2\2\u009a\u009b"+
-		"\7c\2\2\u009b\u009c\7n\2\2\u009c\u009d\7u\2\2\u009d\u00a4\7g\2\2\u009e"+
-		"\u009f\7H\2\2\u009f\u00a0\7C\2\2\u00a0\u00a1\7N\2\2\u00a1\u00a2\7U\2\2"+
-		"\u00a2\u00a4\7G\2\2\u00a3\u0099\3\2\2\2\u00a3\u009e\3\2\2\2\u00a4\26\3"+
-		"\2\2\2\u00a5\u00a6\7?\2\2\u00a6\u00a7\7?\2\2\u00a7\30\3\2\2\2\u00a8\u00a9"+
-		"\7#\2\2\u00a9\u00aa\7?\2\2\u00aa\32\3\2\2\2\u00ab\u00ac\7>\2\2\u00ac\34"+
-		"\3\2\2\2\u00ad\u00ae\7>\2\2\u00ae\u00af\7?\2\2\u00af\36\3\2\2\2\u00b0"+
-		"\u00b1\7@\2\2\u00b1 \3\2\2\2\u00b2\u00b3\7@\2\2\u00b3\u00b4\7?\2\2\u00b4"+
-		"\"\3\2\2\2\u00b5\u00b6\7A\2\2\u00b6$\3\2\2\2\u00b7\u00b8\7<\2\2\u00b8"+
-		"&\3\2\2\2\u00b9\u00ba\7K\2\2\u00ba\u00be\7H\2\2\u00bb\u00bc\7k\2\2\u00bc"+
-		"\u00be\7h\2\2\u00bd\u00b9\3\2\2\2\u00bd\u00bb\3\2\2\2\u00be(\3\2\2\2\u00bf"+
-		"\u00c0\7V\2\2\u00c0\u00c1\7J\2\2\u00c1\u00c2\7G\2\2\u00c2\u00c8\7P\2\2"+
-		"\u00c3\u00c4\7v\2\2\u00c4\u00c5\7j\2\2\u00c5\u00c6\7g\2\2\u00c6\u00c8"+
-		"\7p\2\2\u00c7\u00bf\3\2\2\2\u00c7\u00c3\3\2\2\2\u00c8*\3\2\2\2\u00c9\u00ca"+
-		"\7G\2\2\u00ca\u00cb\7N\2\2\u00cb\u00cc\7U\2\2\u00cc\u00d2\7G\2\2\u00cd"+
-		"\u00ce\7g\2\2\u00ce\u00cf\7n\2\2\u00cf\u00d0\7u\2\2\u00d0\u00d2\7g\2\2"+
-		"\u00d1\u00c9\3\2\2\2\u00d1\u00cd\3\2\2\2\u00d2,\3\2\2\2\u00d3\u00d4\7"+
-		"p\2\2\u00d4\u00d5\7w\2\2\u00d5\u00d6\7n\2\2\u00d6\u00dc\7n\2\2\u00d7\u00d8"+
-		"\7P\2\2\u00d8\u00d9\7W\2\2\u00d9\u00da\7N\2\2\u00da\u00dc\7N\2\2\u00db"+
-		"\u00d3\3\2\2\2\u00db\u00d7\3\2\2\2\u00dc.\3\2\2\2\u00dd\u00de\7/\2\2\u00de"+
-		"\60\3\2\2\2\u00df\u00e0\7-\2\2\u00e0\62\3\2\2\2\u00e1\u00e2\7\61\2\2\u00e2"+
-		"\64\3\2\2\2\u00e3\u00e4\7,\2\2\u00e4\66\3\2\2\2\u00e5\u00e6\7}\2\2\u00e6"+
-		"8\3\2\2\2\u00e7\u00e8\7\177\2\2\u00e8:\3\2\2\2\u00e9\u00ea\7]\2\2\u00ea"+
-		"<\3\2\2\2\u00eb\u00ec\7_\2\2\u00ec>\3\2\2\2\u00ed\u00ee\7*\2\2\u00ee@"+
-		"\3\2\2\2\u00ef\u00f0\7+\2\2\u00f0B\3\2\2\2\u00f1\u00f2\7k\2\2\u00f2\u00f6"+
-		"\7p\2\2\u00f3\u00f4\7K\2\2\u00f4\u00f6\7P\2\2\u00f5\u00f1\3\2\2\2\u00f5"+
-		"\u00f3\3\2\2\2\u00f6D\3\2\2\2\u00f7\u00f8\7p\2\2\u00f8\u00f9\7q\2\2\u00f9"+
-		"\u00fa\7v\2\2\u00fa\u00fb\7\"\2\2\u00fb\u00fc\7k\2\2\u00fc\u0104\7p\2"+
-		"\2\u00fd\u00fe\7P\2\2\u00fe\u00ff\7Q\2\2\u00ff\u0100\7V\2\2\u0100\u0101"+
-		"\7\"\2\2\u0101\u0102\7K\2\2\u0102\u0104\7P\2\2\u0103\u00f7\3\2\2\2\u0103"+
-		"\u00fd\3\2\2\2\u0104F\3\2\2\2\u0105\u0106\7g\2\2\u0106\u0107\7z\2\2\u0107"+
-		"\u0108\7k\2\2\u0108\u0109\7u\2\2\u0109\u010a\7v\2\2\u010a\u0112\7u\2\2"+
-		"\u010b\u010c\7G\2\2\u010c\u010d\7Z\2\2\u010d\u010e\7K\2\2\u010e\u010f"+
-		"\7U\2\2\u010f\u0110\7V\2\2\u0110\u0112\7U\2\2\u0111\u0105\3\2\2\2\u0111"+
-		"\u010b\3\2\2\2\u0112H\3\2\2\2\u0113\u0116\5e\63\2\u0114\u0117\5\61\31"+
-		"\2\u0115\u0117\5/\30\2\u0116\u0114\3\2\2\2\u0116\u0115\3\2\2\2\u0116\u0117"+
-		"\3\2\2\2\u0117\u0119\3\2\2\2\u0118\u011a\5_\60\2\u0119\u0118\3\2\2\2\u011a"+
-		"\u011b\3\2\2\2\u011b\u0119\3\2\2\2\u011b\u011c\3\2\2\2\u011cJ\3\2\2\2"+
-		"\u011d\u011f\5/\30\2\u011e\u011d\3\2\2\2\u011e\u011f\3\2\2\2\u011f\u0120"+
-		"\3\2\2\2\u0120\u012c\5[.\2\u0121\u0123\5/\30\2\u0122\u0121\3\2\2\2\u0122"+
-		"\u0123\3\2\2\2\u0123\u0124\3\2\2\2\u0124\u0128\5]/\2\u0125\u0127\5_\60"+
-		"\2\u0126\u0125\3\2\2\2\u0127\u012a\3\2\2\2\u0128\u0126\3\2\2\2\u0128\u0129"+
-		"\3\2\2\2\u0129\u012c\3\2\2\2\u012a\u0128\3\2\2\2\u012b\u011e\3\2\2\2\u012b"+
-		"\u0122\3\2\2\2\u012cL\3\2\2\2\u012d\u012e\5K&\2\u012e\u0132\5\t\5\2\u012f"+
-		"\u0131\5_\60\2\u0130\u012f\3\2\2\2\u0131\u0134\3\2\2\2\u0132\u0130\3\2"+
-		"\2\2\u0132\u0133\3\2\2\2\u0133\u0136\3\2\2\2\u0134\u0132\3\2\2\2\u0135"+
-		"\u0137\5I%\2\u0136\u0135\3\2\2\2\u0136\u0137\3\2\2\2\u0137\u0139\3\2\2"+
-		"\2\u0138\u013a\5c\62\2\u0139\u0138\3\2\2\2\u0139\u013a\3\2\2\2\u013a\u0153"+
-		"\3\2\2\2\u013b\u013d\5\t\5\2\u013c\u013e\5_\60\2\u013d\u013c\3\2\2\2\u013e"+
-		"\u013f\3\2\2\2\u013f\u013d\3\2\2\2\u013f\u0140\3\2\2\2\u0140\u0142\3\2"+
-		"\2\2\u0141\u0143\5I%\2\u0142\u0141\3\2\2\2\u0142\u0143\3\2\2\2\u0143\u0145"+
-		"\3\2\2\2\u0144\u0146\5c\62\2\u0145\u0144\3\2\2\2\u0145\u0146\3\2\2\2\u0146"+
-		"\u0153\3\2\2\2\u0147\u0148\5K&\2\u0148\u014a\5I%\2\u0149\u014b\5c\62\2"+
-		"\u014a\u0149\3\2\2\2\u014a\u014b\3\2\2\2\u014b\u0153\3\2\2\2\u014c\u014e"+
-		"\5K&\2\u014d\u014f\5I%\2\u014e\u014d\3\2\2\2\u014e\u014f\3\2\2\2\u014f"+
-		"\u0150\3\2\2\2\u0150\u0151\5c\62\2\u0151\u0153\3\2\2\2\u0152\u012d\3\2"+
-		"\2\2\u0152\u013b\3\2\2\2\u0152\u0147\3\2\2\2\u0152\u014c\3\2\2\2\u0153"+
-		"N\3\2\2\2\u0154\u0155\5K&\2\u0155\u0159\5\t\5\2\u0156\u0158\5_\60\2\u0157"+
-		"\u0156\3\2\2\2\u0158\u015b\3\2\2\2\u0159\u0157\3\2\2\2\u0159\u015a\3\2"+
-		"\2\2\u015a\u015d\3\2\2\2\u015b\u0159\3\2\2\2\u015c\u015e\5I%\2\u015d\u015c"+
-		"\3\2\2\2\u015d\u015e\3\2\2\2\u015e\u015f\3\2\2\2\u015f\u0160\5g\64\2\u0160"+
-		"\u0176\3\2\2\2\u0161\u0163\5/\30\2\u0162\u0161\3\2\2\2\u0162\u0163\3\2"+
-		"\2\2\u0163\u0164\3\2\2\2\u0164\u0166\5\t\5\2\u0165\u0167\5_\60\2\u0166"+
-		"\u0165\3\2\2\2\u0167\u0168\3\2\2\2\u0168\u0166\3\2\2\2\u0168\u0169\3\2"+
-		"\2\2\u0169\u016b\3\2\2\2\u016a\u016c\5I%\2\u016b\u016a\3\2\2\2\u016b\u016c"+
-		"\3\2\2\2\u016c\u016d\3\2\2\2\u016d\u016e\5g\64\2\u016e\u0176\3\2\2\2\u016f"+
-		"\u0171\5K&\2\u0170\u0172\5I%\2\u0171\u0170\3\2\2\2\u0171\u0172\3\2\2\2"+
-		"\u0172\u0173\3\2\2\2\u0173\u0174\5g\64\2\u0174\u0176\3\2\2\2\u0175\u0154"+
-		"\3\2\2\2\u0175\u0162\3\2\2\2\u0175\u016f\3\2\2\2\u0176P\3\2\2\2\u0177"+
-		"\u0178\5K&\2\u0178\u0179\5i\65\2\u0179R\3\2\2\2\u017a\u017e\t\2\2\2\u017b"+
-		"\u017d\t\3\2\2\u017c\u017b\3\2\2\2\u017d\u0180\3\2\2\2\u017e\u017c\3\2"+
-		"\2\2\u017e\u017f\3\2\2\2\u017fT\3\2\2\2\u0180\u017e\3\2\2\2\u0181\u0185"+
-		"\5\3\2\2\u0182\u0184\5a\61\2\u0183\u0182\3\2\2\2\u0184\u0187\3\2\2\2\u0185"+
-		"\u0183\3\2\2\2\u0185\u0186\3\2\2\2\u0186\u0188\3\2\2\2\u0187\u0185\3\2"+
-		"\2\2\u0188\u0189\5\3\2\2\u0189\u0194\3\2\2\2\u018a\u018e\5\5\3\2\u018b"+
-		"\u018d\5a\61\2\u018c\u018b\3\2\2\2\u018d\u0190\3\2\2\2\u018e\u018c\3\2"+
-		"\2\2\u018e\u018f\3\2\2\2\u018f\u0191\3\2\2\2\u0190\u018e\3\2\2\2\u0191"+
-		"\u0192\5\5\3\2\u0192\u0194\3\2\2\2\u0193\u0181\3\2\2\2\u0193\u018a\3\2"+
-		"\2\2\u0194V\3\2\2\2\u0195\u0196\7\61\2\2\u0196\u0197\7\61\2\2\u0197\u0199"+
-		"\3\2\2\2\u0198\u019a\13\2\2\2\u0199\u0198\3\2\2\2\u019a\u019b\3\2\2\2"+
-		"\u019b\u019c\3\2\2\2\u019b\u0199\3\2\2\2\u019c\u019f\3\2\2\2\u019d\u01a0"+
-		"\5\13\6\2\u019e\u01a0\7\2\2\3\u019f\u019d\3\2\2\2\u019f\u019e\3\2\2\2"+
-		"\u01a0\u01a1\3\2\2\2\u01a1\u01a2\b,\2\2\u01a2X\3\2\2\2\u01a3\u01a5\t\4"+
-		"\2\2\u01a4\u01a3\3\2\2\2\u01a5\u01a6\3\2\2\2\u01a6\u01a4\3\2\2\2\u01a6"+
-		"\u01a7\3\2\2\2\u01a7\u01a8\3\2\2\2\u01a8\u01a9\b-\2\2\u01a9Z\3\2\2\2\u01aa"+
-		"\u01ab\7\62\2\2\u01ab\\\3\2\2\2\u01ac\u01ad\4\63;\2\u01ad^\3\2\2\2\u01ae"+
-		"\u01af\4\62;\2\u01af`\3\2\2\2\u01b0\u01b1\n\5\2\2\u01b1b\3\2\2\2\u01b2"+
-		"\u01b3\t\6\2\2\u01b3d\3\2\2\2\u01b4\u01b5\t\7\2\2\u01b5f\3\2\2\2\u01b6"+
-		"\u01b7\t\b\2\2\u01b7h\3\2\2\2\u01b8\u01b9\t\t\2\2\u01b9j\3\2\2\2,\2}\u0085"+
-		"\u008d\u0097\u00a3\u00bd\u00c7\u00d1\u00db\u00f5\u0103\u0111\u0116\u011b"+
-		"\u011e\u0122\u0128\u012b\u0132\u0136\u0139\u013f\u0142\u0145\u014a\u014e"+
-		"\u0152\u0159\u015d\u0162\u0168\u016b\u0171\u0175\u017e\u0185\u018e\u0193"+
-		"\u019b\u019f\u01a6\3\b\2\2";
+		"\u019b\2\66\3\3\5\4\7\5\t\6\13\2\r\7\17\b\21\t\23\n\25\13\27\f\31\r\33"+
+		"\16\35\17\37\20!\21#\22%\23\'\24)\25+\26-\27/\30\61\31\63\32\65\33\67"+
+		"\349\35;\36=\37? A!C\"E#G$I%K&M\'O(Q)S*U+W,Y-[\2]\2_\2a\2c\2e\2g\2i\2"+
+		"\3\2\n\5\2C\\aac|\b\2\60\60\62<C\\^^aac|\5\2\13\f\16\17\"\"\7\2\f\f\17"+
+		"\17$$))^^\4\2FFff\4\2GGgg\4\2HHhh\4\2NNnn\u01df\2\3\3\2\2\2\2\5\3\2\2"+
+		"\2\2\7\3\2\2\2\2\t\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23"+
+		"\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2"+
+		"\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2"+
+		"\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3"+
+		"\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2"+
+		"\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2"+
+		"\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\3k"+
+		"\3\2\2\2\5m\3\2\2\2\7o\3\2\2\2\tq\3\2\2\2\13s\3\2\2\2\r}\3\2\2\2\17\u0085"+
+		"\3\2\2\2\21\u008d\3\2\2\2\23\u0097\3\2\2\2\25\u00a3\3\2\2\2\27\u00a5\3"+
+		"\2\2\2\31\u00a8\3\2\2\2\33\u00ab\3\2\2\2\35\u00ad\3\2\2\2\37\u00b0\3\2"+
+		"\2\2!\u00b2\3\2\2\2#\u00b5\3\2\2\2%\u00b7\3\2\2\2\'\u00bd\3\2\2\2)\u00c7"+
+		"\3\2\2\2+\u00d1\3\2\2\2-\u00db\3\2\2\2/\u00dd\3\2\2\2\61\u00df\3\2\2\2"+
+		"\63\u00e1\3\2\2\2\65\u00e3\3\2\2\2\67\u00e5\3\2\2\29\u00e7\3\2\2\2;\u00e9"+
+		"\3\2\2\2=\u00eb\3\2\2\2?\u00ed\3\2\2\2A\u00ef\3\2\2\2C\u00f5\3\2\2\2E"+
+		"\u0103\3\2\2\2G\u0111\3\2\2\2I\u0113\3\2\2\2K\u012b\3\2\2\2M\u0152\3\2"+
+		"\2\2O\u0175\3\2\2\2Q\u0177\3\2\2\2S\u017a\3\2\2\2U\u0193\3\2\2\2W\u0195"+
+		"\3\2\2\2Y\u01a4\3\2\2\2[\u01aa\3\2\2\2]\u01ac\3\2\2\2_\u01ae\3\2\2\2a"+
+		"\u01b0\3\2\2\2c\u01b2\3\2\2\2e\u01b4\3\2\2\2g\u01b6\3\2\2\2i\u01b8\3\2"+
+		"\2\2kl\7$\2\2l\4\3\2\2\2mn\7)\2\2n\6\3\2\2\2op\7.\2\2p\b\3\2\2\2qr\7\60"+
+		"\2\2r\n\3\2\2\2st\7\f\2\2t\f\3\2\2\2uv\7c\2\2vw\7p\2\2w~\7f\2\2xy\7(\2"+
+		"\2y~\7(\2\2z{\7C\2\2{|\7P\2\2|~\7F\2\2}u\3\2\2\2}x\3\2\2\2}z\3\2\2\2~"+
+		"\16\3\2\2\2\177\u0080\7q\2\2\u0080\u0086\7t\2\2\u0081\u0082\7~\2\2\u0082"+
+		"\u0086\7~\2\2\u0083\u0084\7Q\2\2\u0084\u0086\7T\2\2\u0085\177\3\2\2\2"+
+		"\u0085\u0081\3\2\2\2\u0085\u0083\3\2\2\2\u0086\20\3\2\2\2\u0087\u0088"+
+		"\7p\2\2\u0088\u0089\7q\2\2\u0089\u008e\7v\2\2\u008a\u008b\7P\2\2\u008b"+
+		"\u008c\7Q\2\2\u008c\u008e\7V\2\2\u008d\u0087\3\2\2\2\u008d\u008a\3\2\2"+
+		"\2\u008e\22\3\2\2\2\u008f\u0090\7v\2\2\u0090\u0091\7t\2\2\u0091\u0092"+
+		"\7w\2\2\u0092\u0098\7g\2\2\u0093\u0094\7V\2\2\u0094\u0095\7T\2\2\u0095"+
+		"\u0096\7W\2\2\u0096\u0098\7G\2\2\u0097\u008f\3\2\2\2\u0097\u0093\3\2\2"+
+		"\2\u0098\24\3\2\2\2\u0099\u009a\7h\2\2\u009a\u009b\7c\2\2\u009b\u009c"+
+		"\7n\2\2\u009c\u009d\7u\2\2\u009d\u00a4\7g\2\2\u009e\u009f\7H\2\2\u009f"+
+		"\u00a0\7C\2\2\u00a0\u00a1\7N\2\2\u00a1\u00a2\7U\2\2\u00a2\u00a4\7G\2\2"+
+		"\u00a3\u0099\3\2\2\2\u00a3\u009e\3\2\2\2\u00a4\26\3\2\2\2\u00a5\u00a6"+
+		"\7?\2\2\u00a6\u00a7\7?\2\2\u00a7\30\3\2\2\2\u00a8\u00a9\7#\2\2\u00a9\u00aa"+
+		"\7?\2\2\u00aa\32\3\2\2\2\u00ab\u00ac\7>\2\2\u00ac\34\3\2\2\2\u00ad\u00ae"+
+		"\7>\2\2\u00ae\u00af\7?\2\2\u00af\36\3\2\2\2\u00b0\u00b1\7@\2\2\u00b1 "+
+		"\3\2\2\2\u00b2\u00b3\7@\2\2\u00b3\u00b4\7?\2\2\u00b4\"\3\2\2\2\u00b5\u00b6"+
+		"\7A\2\2\u00b6$\3\2\2\2\u00b7\u00b8\7<\2\2\u00b8&\3\2\2\2\u00b9\u00ba\7"+
+		"K\2\2\u00ba\u00be\7H\2\2\u00bb\u00bc\7k\2\2\u00bc\u00be\7h\2\2\u00bd\u00b9"+
+		"\3\2\2\2\u00bd\u00bb\3\2\2\2\u00be(\3\2\2\2\u00bf\u00c0\7V\2\2\u00c0\u00c1"+
+		"\7J\2\2\u00c1\u00c2\7G\2\2\u00c2\u00c8\7P\2\2\u00c3\u00c4\7v\2\2\u00c4"+
+		"\u00c5\7j\2\2\u00c5\u00c6\7g\2\2\u00c6\u00c8\7p\2\2\u00c7\u00bf\3\2\2"+
+		"\2\u00c7\u00c3\3\2\2\2\u00c8*\3\2\2\2\u00c9\u00ca\7G\2\2\u00ca\u00cb\7"+
+		"N\2\2\u00cb\u00cc\7U\2\2\u00cc\u00d2\7G\2\2\u00cd\u00ce\7g\2\2\u00ce\u00cf"+
+		"\7n\2\2\u00cf\u00d0\7u\2\2\u00d0\u00d2\7g\2\2\u00d1\u00c9\3\2\2\2\u00d1"+
+		"\u00cd\3\2\2\2\u00d2,\3\2\2\2\u00d3\u00d4\7p\2\2\u00d4\u00d5\7w\2\2\u00d5"+
+		"\u00d6\7n\2\2\u00d6\u00dc\7n\2\2\u00d7\u00d8\7P\2\2\u00d8\u00d9\7W\2\2"+
+		"\u00d9\u00da\7N\2\2\u00da\u00dc\7N\2\2\u00db\u00d3\3\2\2\2\u00db\u00d7"+
+		"\3\2\2\2\u00dc.\3\2\2\2\u00dd\u00de\7/\2\2\u00de\60\3\2\2\2\u00df\u00e0"+
+		"\7-\2\2\u00e0\62\3\2\2\2\u00e1\u00e2\7\61\2\2\u00e2\64\3\2\2\2\u00e3\u00e4"+
+		"\7,\2\2\u00e4\66\3\2\2\2\u00e5\u00e6\7}\2\2\u00e68\3\2\2\2\u00e7\u00e8"+
+		"\7\177\2\2\u00e8:\3\2\2\2\u00e9\u00ea\7]\2\2\u00ea<\3\2\2\2\u00eb\u00ec"+
+		"\7_\2\2\u00ec>\3\2\2\2\u00ed\u00ee\7*\2\2\u00ee@\3\2\2\2\u00ef\u00f0\7"+
+		"+\2\2\u00f0B\3\2\2\2\u00f1\u00f2\7k\2\2\u00f2\u00f6\7p\2\2\u00f3\u00f4"+
+		"\7K\2\2\u00f4\u00f6\7P\2\2\u00f5\u00f1\3\2\2\2\u00f5\u00f3\3\2\2\2\u00f6"+
+		"D\3\2\2\2\u00f7\u00f8\7p\2\2\u00f8\u00f9\7q\2\2\u00f9\u00fa\7v\2\2\u00fa"+
+		"\u00fb\7\"\2\2\u00fb\u00fc\7k\2\2\u00fc\u0104\7p\2\2\u00fd\u00fe\7P\2"+
+		"\2\u00fe\u00ff\7Q\2\2\u00ff\u0100\7V\2\2\u0100\u0101\7\"\2\2\u0101\u0102"+
+		"\7K\2\2\u0102\u0104\7P\2\2\u0103\u00f7\3\2\2\2\u0103\u00fd\3\2\2\2\u0104"+
+		"F\3\2\2\2\u0105\u0106\7g\2\2\u0106\u0107\7z\2\2\u0107\u0108\7k\2\2\u0108"+
+		"\u0109\7u\2\2\u0109\u010a\7v\2\2\u010a\u0112\7u\2\2\u010b\u010c\7G\2\2"+
+		"\u010c\u010d\7Z\2\2\u010d\u010e\7K\2\2\u010e\u010f\7U\2\2\u010f\u0110"+
+		"\7V\2\2\u0110\u0112\7U\2\2\u0111\u0105\3\2\2\2\u0111\u010b\3\2\2\2\u0112"+
+		"H\3\2\2\2\u0113\u0116\5e\63\2\u0114\u0117\5\61\31\2\u0115\u0117\5/\30"+
+		"\2\u0116\u0114\3\2\2\2\u0116\u0115\3\2\2\2\u0116\u0117\3\2\2\2\u0117\u0119"+
+		"\3\2\2\2\u0118\u011a\5_\60\2\u0119\u0118\3\2\2\2\u011a\u011b\3\2\2\2\u011b"+
+		"\u0119\3\2\2\2\u011b\u011c\3\2\2\2\u011cJ\3\2\2\2\u011d\u011f\5/\30\2"+
+		"\u011e\u011d\3\2\2\2\u011e\u011f\3\2\2\2\u011f\u0120\3\2\2\2\u0120\u012c"+
+		"\5[.\2\u0121\u0123\5/\30\2\u0122\u0121\3\2\2\2\u0122\u0123\3\2\2\2\u0123"+
+		"\u0124\3\2\2\2\u0124\u0128\5]/\2\u0125\u0127\5_\60\2\u0126\u0125\3\2\2"+
+		"\2\u0127\u012a\3\2\2\2\u0128\u0126\3\2\2\2\u0128\u0129\3\2\2\2\u0129\u012c"+
+		"\3\2\2\2\u012a\u0128\3\2\2\2\u012b\u011e\3\2\2\2\u012b\u0122\3\2\2\2\u012c"+
+		"L\3\2\2\2\u012d\u012e\5K&\2\u012e\u0132\5\t\5\2\u012f\u0131\5_\60\2\u0130"+
+		"\u012f\3\2\2\2\u0131\u0134\3\2\2\2\u0132\u0130\3\2\2\2\u0132\u0133\3\2"+
+		"\2\2\u0133\u0136\3\2\2\2\u0134\u0132\3\2\2\2\u0135\u0137\5I%\2\u0136\u0135"+
+		"\3\2\2\2\u0136\u0137\3\2\2\2\u0137\u0139\3\2\2\2\u0138\u013a\5c\62\2\u0139"+
+		"\u0138\3\2\2\2\u0139\u013a\3\2\2\2\u013a\u0153\3\2\2\2\u013b\u013d\5\t"+
+		"\5\2\u013c\u013e\5_\60\2\u013d\u013c\3\2\2\2\u013e\u013f\3\2\2\2\u013f"+
+		"\u013d\3\2\2\2\u013f\u0140\3\2\2\2\u0140\u0142\3\2\2\2\u0141\u0143\5I"+
+		"%\2\u0142\u0141\3\2\2\2\u0142\u0143\3\2\2\2\u0143\u0145\3\2\2\2\u0144"+
+		"\u0146\5c\62\2\u0145\u0144\3\2\2\2\u0145\u0146\3\2\2\2\u0146\u0153\3\2"+
+		"\2\2\u0147\u0148\5K&\2\u0148\u014a\5I%\2\u0149\u014b\5c\62\2\u014a\u0149"+
+		"\3\2\2\2\u014a\u014b\3\2\2\2\u014b\u0153\3\2\2\2\u014c\u014e\5K&\2\u014d"+
+		"\u014f\5I%\2\u014e\u014d\3\2\2\2\u014e\u014f\3\2\2\2\u014f\u0150\3\2\2"+
+		"\2\u0150\u0151\5c\62\2\u0151\u0153\3\2\2\2\u0152\u012d\3\2\2\2\u0152\u013b"+
+		"\3\2\2\2\u0152\u0147\3\2\2\2\u0152\u014c\3\2\2\2\u0153N\3\2\2\2\u0154"+
+		"\u0155\5K&\2\u0155\u0159\5\t\5\2\u0156\u0158\5_\60\2\u0157\u0156\3\2\2"+
+		"\2\u0158\u015b\3\2\2\2\u0159\u0157\3\2\2\2\u0159\u015a\3\2\2\2\u015a\u015d"+
+		"\3\2\2\2\u015b\u0159\3\2\2\2\u015c\u015e\5I%\2\u015d\u015c\3\2\2\2\u015d"+
+		"\u015e\3\2\2\2\u015e\u015f\3\2\2\2\u015f\u0160\5g\64\2\u0160\u0176\3\2"+
+		"\2\2\u0161\u0163\5/\30\2\u0162\u0161\3\2\2\2\u0162\u0163\3\2\2\2\u0163"+
+		"\u0164\3\2\2\2\u0164\u0166\5\t\5\2\u0165\u0167\5_\60\2\u0166\u0165\3\2"+
+		"\2\2\u0167\u0168\3\2\2\2\u0168\u0166\3\2\2\2\u0168\u0169\3\2\2\2\u0169"+
+		"\u016b\3\2\2\2\u016a\u016c\5I%\2\u016b\u016a\3\2\2\2\u016b\u016c\3\2\2"+
+		"\2\u016c\u016d\3\2\2\2\u016d\u016e\5g\64\2\u016e\u0176\3\2\2\2\u016f\u0171"+
+		"\5K&\2\u0170\u0172\5I%\2\u0171\u0170\3\2\2\2\u0171\u0172\3\2\2\2\u0172"+
+		"\u0173\3\2\2\2\u0173\u0174\5g\64\2\u0174\u0176\3\2\2\2\u0175\u0154\3\2"+
+		"\2\2\u0175\u0162\3\2\2\2\u0175\u016f\3\2\2\2\u0176P\3\2\2\2\u0177\u0178"+
+		"\5K&\2\u0178\u0179\5i\65\2\u0179R\3\2\2\2\u017a\u017e\t\2\2\2\u017b\u017d"+
+		"\t\3\2\2\u017c\u017b\3\2\2\2\u017d\u0180\3\2\2\2\u017e\u017c\3\2\2\2\u017e"+
+		"\u017f\3\2\2\2\u017fT\3\2\2\2\u0180\u017e\3\2\2\2\u0181\u0185\5\3\2\2"+
+		"\u0182\u0184\5a\61\2\u0183\u0182\3\2\2\2\u0184\u0187\3\2\2\2\u0185\u0183"+
+		"\3\2\2\2\u0185\u0186\3\2\2\2\u0186\u0188\3\2\2\2\u0187\u0185\3\2\2\2\u0188"+
+		"\u0189\5\3\2\2\u0189\u0194\3\2\2\2\u018a\u018e\5\5\3\2\u018b\u018d\5a"+
+		"\61\2\u018c\u018b\3\2\2\2\u018d\u0190\3\2\2\2\u018e\u018c\3\2\2\2\u018e"+
+		"\u018f\3\2\2\2\u018f\u0191\3\2\2\2\u0190\u018e\3\2\2\2\u0191\u0192\5\5"+
+		"\3\2\u0192\u0194\3\2\2\2\u0193\u0181\3\2\2\2\u0193\u018a\3\2\2\2\u0194"+
+		"V\3\2\2\2\u0195\u0196\7\61\2\2\u0196\u0197\7\61\2\2\u0197\u0199\3\2\2"+
+		"\2\u0198\u019a\13\2\2\2\u0199\u0198\3\2\2\2\u019a\u019b\3\2\2\2\u019b"+
+		"\u019c\3\2\2\2\u019b\u0199\3\2\2\2\u019c\u019f\3\2\2\2\u019d\u01a0\5\13"+
+		"\6\2\u019e\u01a0\7\2\2\3\u019f\u019d\3\2\2\2\u019f\u019e\3\2\2\2\u01a0"+
+		"\u01a1\3\2\2\2\u01a1\u01a2\b,\2\2\u01a2X\3\2\2\2\u01a3\u01a5\t\4\2\2\u01a4"+
+		"\u01a3\3\2\2\2\u01a5\u01a6\3\2\2\2\u01a6\u01a4\3\2\2\2\u01a6\u01a7\3\2"+
+		"\2\2\u01a7\u01a8\3\2\2\2\u01a8\u01a9\b-\2\2\u01a9Z\3\2\2\2\u01aa\u01ab"+
+		"\7\62\2\2\u01ab\\\3\2\2\2\u01ac\u01ad\4\63;\2\u01ad^\3\2\2\2\u01ae\u01af"+
+		"\4\62;\2\u01af`\3\2\2\2\u01b0\u01b1\n\5\2\2\u01b1b\3\2\2\2\u01b2\u01b3"+
+		"\t\6\2\2\u01b3d\3\2\2\2\u01b4\u01b5\t\7\2\2\u01b5f\3\2\2\2\u01b6\u01b7"+
+		"\t\b\2\2\u01b7h\3\2\2\2\u01b8\u01b9\t\t\2\2\u01b9j\3\2\2\2,\2}\u0085\u008d"+
+		"\u0097\u00a3\u00bd\u00c7\u00d1\u00db\u00f5\u0103\u0111\u0116\u011b\u011e"+
+		"\u0122\u0128\u012b\u0132\u0136\u0139\u013f\u0142\u0145\u014a\u014e\u0152"+
+		"\u0159\u015d\u0162\u0168\u016b\u0171\u0175\u017e\u0185\u018e\u0193\u019b"+
+		"\u019f\u01a6\3\b\2\2";
 	public static final ATN _ATN =
 		new ATNDeserializer().deserialize(_serializedATN.toCharArray());
 	static {

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/f3ca3c05/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/generated/StellarParser.java
----------------------------------------------------------------------
diff --git a/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/generated/StellarParser.java b/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/generated/StellarParser.java
index 98c65b3..4043601 100644
--- a/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/generated/StellarParser.java
+++ b/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/generated/StellarParser.java
@@ -37,13 +37,13 @@ public class StellarParser extends Parser {
 	protected static final PredictionContextCache _sharedContextCache =
 		new PredictionContextCache();
 	public static final int
-		DOUBLE_QUOTE=1, SINGLE_QUOTE=2, COMMA=3, PERIOD=4, EOL=5, AND=6, OR=7, 
-		NOT=8, TRUE=9, FALSE=10, EQ=11, NEQ=12, LT=13, LTE=14, GT=15, GTE=16, 
-		QUESTION=17, COLON=18, IF=19, THEN=20, ELSE=21, NULL=22, MINUS=23, PLUS=24, 
-		DIV=25, MUL=26, LBRACE=27, RBRACE=28, LBRACKET=29, RBRACKET=30, LPAREN=31, 
-		RPAREN=32, IN=33, NIN=34, EXISTS=35, EXPONENT=36, INT_LITERAL=37, DOUBLE_LITERAL=38, 
-		FLOAT_LITERAL=39, LONG_LITERAL=40, IDENTIFIER=41, STRING_LITERAL=42, COMMENT=43, 
-		WS=44;
+		DOUBLE_QUOTE=1, SINGLE_QUOTE=2, COMMA=3, PERIOD=4, AND=5, OR=6, NOT=7, 
+		TRUE=8, FALSE=9, EQ=10, NEQ=11, LT=12, LTE=13, GT=14, GTE=15, QUESTION=16, 
+		COLON=17, IF=18, THEN=19, ELSE=20, NULL=21, MINUS=22, PLUS=23, DIV=24, 
+		MUL=25, LBRACE=26, RBRACE=27, LBRACKET=28, RBRACKET=29, LPAREN=30, RPAREN=31, 
+		IN=32, NIN=33, EXISTS=34, EXPONENT=35, INT_LITERAL=36, DOUBLE_LITERAL=37, 
+		FLOAT_LITERAL=38, LONG_LITERAL=39, IDENTIFIER=40, STRING_LITERAL=41, COMMENT=42, 
+		WS=43;
 	public static final int
 		RULE_transformation = 0, RULE_transformation_expr = 1, RULE_conditional_expr = 2, 
 		RULE_comparison_expr = 3, RULE_transformation_entity = 4, RULE_comp_operator = 5, 
@@ -59,14 +59,13 @@ public class StellarParser extends Parser {
 	};
 
 	private static final String[] _LITERAL_NAMES = {
-		null, "'\"'", "'''", "','", "'.'", "'\n'", null, null, null, null, null, 
-		"'=='", "'!='", "'<'", "'<='", "'>'", "'>='", "'?'", "':'", null, null, 
-		null, null, "'-'", "'+'", "'/'", "'*'", "'{'", "'}'", "'['", "']'", "'('", 
-		"')'"
+		null, "'\"'", "'''", "','", "'.'", null, null, null, null, null, "'=='", 
+		"'!='", "'<'", "'<='", "'>'", "'>='", "'?'", "':'", null, null, null, 
+		null, "'-'", "'+'", "'/'", "'*'", "'{'", "'}'", "'['", "']'", "'('", "')'"
 	};
 	private static final String[] _SYMBOLIC_NAMES = {
-		null, "DOUBLE_QUOTE", "SINGLE_QUOTE", "COMMA", "PERIOD", "EOL", "AND", 
-		"OR", "NOT", "TRUE", "FALSE", "EQ", "NEQ", "LT", "LTE", "GT", "GTE", "QUESTION", 
+		null, "DOUBLE_QUOTE", "SINGLE_QUOTE", "COMMA", "PERIOD", "AND", "OR", 
+		"NOT", "TRUE", "FALSE", "EQ", "NEQ", "LT", "LTE", "GT", "GTE", "QUESTION", 
 		"COLON", "IF", "THEN", "ELSE", "NULL", "MINUS", "PLUS", "DIV", "MUL", 
 		"LBRACE", "RBRACE", "LBRACKET", "RBRACKET", "LPAREN", "RPAREN", "IN", 
 		"NIN", "EXISTS", "EXPONENT", "INT_LITERAL", "DOUBLE_LITERAL", "FLOAT_LITERAL", 
@@ -2137,7 +2136,7 @@ public class StellarParser extends Parser {
 	}
 
 	public static final String _serializedATN =
-		"\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\3.\u00e6\4\2\t\2\4"+
+		"\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\3-\u00e6\4\2\t\2\4"+
 		"\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t"+
 		"\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
 		"\4\23\t\23\3\2\3\2\3\2\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\5\3\62\n\3\3\4"+
@@ -2154,60 +2153,60 @@ public class StellarParser extends Parser {
 		"\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22"+
 		"\3\22\3\22\3\22\5\22\u00d4\n\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23"+
 		"\3\23\3\23\3\23\3\23\3\23\3\23\5\23\u00e4\n\23\3\23\2\7\b\24\30\34\36"+
-		"\24\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$\2\6\3\2\r\22\3\2\31\32"+
-		"\3\2\33\34\3\2\13\f\u00f8\2&\3\2\2\2\4\61\3\2\2\2\6@\3\2\2\2\bY\3\2\2"+
+		"\24\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$\2\6\3\2\f\21\3\2\30\31"+
+		"\3\2\32\33\3\2\n\13\u00f8\2&\3\2\2\2\4\61\3\2\2\2\6@\3\2\2\2\bY\3\2\2"+
 		"\2\nf\3\2\2\2\fh\3\2\2\2\16j\3\2\2\2\20l\3\2\2\2\22t\3\2\2\2\24y\3\2\2"+
 		"\2\26\u008c\3\2\2\2\30\u008e\3\2\2\2\32\u00a4\3\2\2\2\34\u00a6\3\2\2\2"+
 		"\36\u00b4\3\2\2\2 \u00c2\3\2\2\2\"\u00d3\3\2\2\2$\u00e3\3\2\2\2&\'\5\4"+
-		"\3\2\'(\7\2\2\3(\3\3\2\2\2)\62\5\6\4\2*+\7!\2\2+,\5\4\3\2,-\7\"\2\2-\62"+
+		"\3\2\'(\7\2\2\3(\3\3\2\2\2)\62\5\6\4\2*+\7 \2\2+,\5\4\3\2,-\7!\2\2-\62"+
 		"\3\2\2\2.\62\5\34\17\2/\62\5\n\6\2\60\62\5\b\5\2\61)\3\2\2\2\61*\3\2\2"+
 		"\2\61.\3\2\2\2\61/\3\2\2\2\61\60\3\2\2\2\62\5\3\2\2\2\63\64\5\b\5\2\64"+
-		"\65\7\23\2\2\65\66\5\4\3\2\66\67\7\24\2\2\678\5\4\3\28A\3\2\2\29:\7\25"+
-		"\2\2:;\5\b\5\2;<\7\26\2\2<=\5\4\3\2=>\7\27\2\2>?\5\4\3\2?A\3\2\2\2@\63"+
+		"\65\7\22\2\2\65\66\5\4\3\2\66\67\7\23\2\2\678\5\4\3\28A\3\2\2\29:\7\24"+
+		"\2\2:;\5\b\5\2;<\7\25\2\2<=\5\4\3\2=>\7\26\2\2>?\5\4\3\2?A\3\2\2\2@\63"+
 		"\3\2\2\2@9\3\2\2\2A\7\3\2\2\2BC\b\5\1\2CD\5$\23\2DE\5\f\7\2EF\5$\23\2"+
-		"FZ\3\2\2\2GH\5$\23\2HI\7#\2\2IJ\5$\23\2JZ\3\2\2\2KL\5$\23\2LM\7$\2\2M"+
-		"N\5$\23\2NZ\3\2\2\2OP\7\n\2\2PQ\7!\2\2QR\5\b\5\2RS\7\"\2\2SZ\3\2\2\2T"+
-		"U\7!\2\2UV\5\b\5\2VW\7\"\2\2WZ\3\2\2\2XZ\5$\23\2YB\3\2\2\2YG\3\2\2\2Y"+
-		"K\3\2\2\2YO\3\2\2\2YT\3\2\2\2YX\3\2\2\2Zc\3\2\2\2[\\\f\7\2\2\\]\7\b\2"+
-		"\2]b\5\b\5\b^_\f\6\2\2_`\7\t\2\2`b\5\b\5\7a[\3\2\2\2a^\3\2\2\2be\3\2\2"+
-		"\2ca\3\2\2\2cd\3\2\2\2d\t\3\2\2\2ec\3\2\2\2fg\5$\23\2g\13\3\2\2\2hi\t"+
-		"\2\2\2i\r\3\2\2\2jk\t\3\2\2k\17\3\2\2\2lm\t\4\2\2m\21\3\2\2\2no\7!\2\2"+
-		"op\5\24\13\2pq\7\"\2\2qu\3\2\2\2rs\7!\2\2su\7\"\2\2tn\3\2\2\2tr\3\2\2"+
-		"\2u\23\3\2\2\2vw\b\13\1\2wz\5$\23\2xz\5\6\4\2yv\3\2\2\2yx\3\2\2\2z\u0083"+
+		"FZ\3\2\2\2GH\5$\23\2HI\7\"\2\2IJ\5$\23\2JZ\3\2\2\2KL\5$\23\2LM\7#\2\2"+
+		"MN\5$\23\2NZ\3\2\2\2OP\7\t\2\2PQ\7 \2\2QR\5\b\5\2RS\7!\2\2SZ\3\2\2\2T"+
+		"U\7 \2\2UV\5\b\5\2VW\7!\2\2WZ\3\2\2\2XZ\5$\23\2YB\3\2\2\2YG\3\2\2\2YK"+
+		"\3\2\2\2YO\3\2\2\2YT\3\2\2\2YX\3\2\2\2Zc\3\2\2\2[\\\f\7\2\2\\]\7\7\2\2"+
+		"]b\5\b\5\b^_\f\6\2\2_`\7\b\2\2`b\5\b\5\7a[\3\2\2\2a^\3\2\2\2be\3\2\2\2"+
+		"ca\3\2\2\2cd\3\2\2\2d\t\3\2\2\2ec\3\2\2\2fg\5$\23\2g\13\3\2\2\2hi\t\2"+
+		"\2\2i\r\3\2\2\2jk\t\3\2\2k\17\3\2\2\2lm\t\4\2\2m\21\3\2\2\2no\7 \2\2o"+
+		"p\5\24\13\2pq\7!\2\2qu\3\2\2\2rs\7 \2\2su\7!\2\2tn\3\2\2\2tr\3\2\2\2u"+
+		"\23\3\2\2\2vw\b\13\1\2wz\5$\23\2xz\5\6\4\2yv\3\2\2\2yx\3\2\2\2z\u0083"+
 		"\3\2\2\2{|\f\5\2\2|}\7\5\2\2}\u0082\5$\23\2~\177\f\3\2\2\177\u0080\7\5"+
 		"\2\2\u0080\u0082\5\6\4\2\u0081{\3\2\2\2\u0081~\3\2\2\2\u0082\u0085\3\2"+
 		"\2\2\u0083\u0081\3\2\2\2\u0083\u0084\3\2\2\2\u0084\25\3\2\2\2\u0085\u0083"+
-		"\3\2\2\2\u0086\u0087\7\37\2\2\u0087\u0088\5\24\13\2\u0088\u0089\7 \2\2"+
-		"\u0089\u008d\3\2\2\2\u008a\u008b\7\37\2\2\u008b\u008d\7 \2\2\u008c\u0086"+
-		"\3\2\2\2\u008c\u008a\3\2\2\2\u008d\27\3\2\2\2\u008e\u008f\b\r\1\2\u008f"+
-		"\u0090\5$\23\2\u0090\u0091\7\24\2\2\u0091\u0092\5\4\3\2\u0092\u009b\3"+
-		"\2\2\2\u0093\u0094\f\3\2\2\u0094\u0095\7\5\2\2\u0095\u0096\5$\23\2\u0096"+
-		"\u0097\7\24\2\2\u0097\u0098\5\4\3\2\u0098\u009a\3\2\2\2\u0099\u0093\3"+
-		"\2\2\2\u009a\u009d\3\2\2\2\u009b\u0099\3\2\2\2\u009b\u009c\3\2\2\2\u009c"+
-		"\31\3\2\2\2\u009d\u009b\3\2\2\2\u009e\u009f\7\35\2\2\u009f\u00a0\5\30"+
-		"\r\2\u00a0\u00a1\7\36\2\2\u00a1\u00a5\3\2\2\2\u00a2\u00a3\7\35\2\2\u00a3"+
-		"\u00a5\7\36\2\2\u00a4\u009e\3\2\2\2\u00a4\u00a2\3\2\2\2\u00a5\33\3\2\2"+
-		"\2\u00a6\u00a7\b\17\1\2\u00a7\u00a8\5\36\20\2\u00a8\u00b1\3\2\2\2\u00a9"+
-		"\u00aa\f\4\2\2\u00aa\u00ab\7\32\2\2\u00ab\u00b0\5\36\20\2\u00ac\u00ad"+
-		"\f\3\2\2\u00ad\u00ae\7\31\2\2\u00ae\u00b0\5\36\20\2\u00af\u00a9\3\2\2"+
-		"\2\u00af\u00ac\3\2\2\2\u00b0\u00b3\3\2\2\2\u00b1\u00af\3\2\2\2\u00b1\u00b2"+
-		"\3\2\2\2\u00b2\35\3\2\2\2\u00b3\u00b1\3\2\2\2\u00b4\u00b5\b\20\1\2\u00b5"+
-		"\u00b6\5\"\22\2\u00b6\u00bf\3\2\2\2\u00b7\u00b8\f\4\2\2\u00b8\u00b9\7"+
-		"\34\2\2\u00b9\u00be\5\36\20\5\u00ba\u00bb\f\3\2\2\u00bb\u00bc\7\33\2\2"+
-		"\u00bc\u00be\5\36\20\4\u00bd\u00b7\3\2\2\2\u00bd\u00ba\3\2\2\2\u00be\u00c1"+
-		"\3\2\2\2\u00bf\u00bd\3\2\2\2\u00bf\u00c0\3\2\2\2\u00c0\37\3\2\2\2\u00c1"+
-		"\u00bf\3\2\2\2\u00c2\u00c3\7+\2\2\u00c3\u00c4\5\22\n\2\u00c4!\3\2\2\2"+
-		"\u00c5\u00d4\5 \21\2\u00c6\u00d4\7(\2\2\u00c7\u00d4\7\'\2\2\u00c8\u00d4"+
-		"\7*\2\2\u00c9\u00d4\7)\2\2\u00ca\u00d4\7+\2\2\u00cb\u00cc\7!\2\2\u00cc"+
-		"\u00cd\5\34\17\2\u00cd\u00ce\7\"\2\2\u00ce\u00d4\3\2\2\2\u00cf\u00d0\7"+
-		"!\2\2\u00d0\u00d1\5\6\4\2\u00d1\u00d2\7\"\2\2\u00d2\u00d4\3\2\2\2\u00d3"+
+		"\3\2\2\2\u0086\u0087\7\36\2\2\u0087\u0088\5\24\13\2\u0088\u0089\7\37\2"+
+		"\2\u0089\u008d\3\2\2\2\u008a\u008b\7\36\2\2\u008b\u008d\7\37\2\2\u008c"+
+		"\u0086\3\2\2\2\u008c\u008a\3\2\2\2\u008d\27\3\2\2\2\u008e\u008f\b\r\1"+
+		"\2\u008f\u0090\5$\23\2\u0090\u0091\7\23\2\2\u0091\u0092\5\4\3\2\u0092"+
+		"\u009b\3\2\2\2\u0093\u0094\f\3\2\2\u0094\u0095\7\5\2\2\u0095\u0096\5$"+
+		"\23\2\u0096\u0097\7\23\2\2\u0097\u0098\5\4\3\2\u0098\u009a\3\2\2\2\u0099"+
+		"\u0093\3\2\2\2\u009a\u009d\3\2\2\2\u009b\u0099\3\2\2\2\u009b\u009c\3\2"+
+		"\2\2\u009c\31\3\2\2\2\u009d\u009b\3\2\2\2\u009e\u009f\7\34\2\2\u009f\u00a0"+
+		"\5\30\r\2\u00a0\u00a1\7\35\2\2\u00a1\u00a5\3\2\2\2\u00a2\u00a3\7\34\2"+
+		"\2\u00a3\u00a5\7\35\2\2\u00a4\u009e\3\2\2\2\u00a4\u00a2\3\2\2\2\u00a5"+
+		"\33\3\2\2\2\u00a6\u00a7\b\17\1\2\u00a7\u00a8\5\36\20\2\u00a8\u00b1\3\2"+
+		"\2\2\u00a9\u00aa\f\4\2\2\u00aa\u00ab\7\31\2\2\u00ab\u00b0\5\36\20\2\u00ac"+
+		"\u00ad\f\3\2\2\u00ad\u00ae\7\30\2\2\u00ae\u00b0\5\36\20\2\u00af\u00a9"+
+		"\3\2\2\2\u00af\u00ac\3\2\2\2\u00b0\u00b3\3\2\2\2\u00b1\u00af\3\2\2\2\u00b1"+
+		"\u00b2\3\2\2\2\u00b2\35\3\2\2\2\u00b3\u00b1\3\2\2\2\u00b4\u00b5\b\20\1"+
+		"\2\u00b5\u00b6\5\"\22\2\u00b6\u00bf\3\2\2\2\u00b7\u00b8\f\4\2\2\u00b8"+
+		"\u00b9\7\33\2\2\u00b9\u00be\5\36\20\5\u00ba\u00bb\f\3\2\2\u00bb\u00bc"+
+		"\7\32\2\2\u00bc\u00be\5\36\20\4\u00bd\u00b7\3\2\2\2\u00bd\u00ba\3\2\2"+
+		"\2\u00be\u00c1\3\2\2\2\u00bf\u00bd\3\2\2\2\u00bf\u00c0\3\2\2\2\u00c0\37"+
+		"\3\2\2\2\u00c1\u00bf\3\2\2\2\u00c2\u00c3\7*\2\2\u00c3\u00c4\5\22\n\2\u00c4"+
+		"!\3\2\2\2\u00c5\u00d4\5 \21\2\u00c6\u00d4\7\'\2\2\u00c7\u00d4\7&\2\2\u00c8"+
+		"\u00d4\7)\2\2\u00c9\u00d4\7(\2\2\u00ca\u00d4\7*\2\2\u00cb\u00cc\7 \2\2"+
+		"\u00cc\u00cd\5\34\17\2\u00cd\u00ce\7!\2\2\u00ce\u00d4\3\2\2\2\u00cf\u00d0"+
+		"\7 \2\2\u00d0\u00d1\5\6\4\2\u00d1\u00d2\7!\2\2\u00d2\u00d4\3\2\2\2\u00d3"+
 		"\u00c5\3\2\2\2\u00d3\u00c6\3\2\2\2\u00d3\u00c7\3\2\2\2\u00d3\u00c8\3\2"+
 		"\2\2\u00d3\u00c9\3\2\2\2\u00d3\u00ca\3\2\2\2\u00d3\u00cb\3\2\2\2\u00d3"+
 		"\u00cf\3\2\2\2\u00d4#\3\2\2\2\u00d5\u00e4\t\5\2\2\u00d6\u00e4\5\34\17"+
-		"\2\u00d7\u00e4\7,\2\2\u00d8\u00e4\5\26\f\2\u00d9\u00e4\5\32\16\2\u00da"+
-		"\u00e4\7\30\2\2\u00db\u00dc\7%\2\2\u00dc\u00dd\7!\2\2\u00dd\u00de\7+\2"+
-		"\2\u00de\u00e4\7\"\2\2\u00df\u00e0\7!\2\2\u00e0\u00e1\5\6\4\2\u00e1\u00e2"+
-		"\7\"\2\2\u00e2\u00e4\3\2\2\2\u00e3\u00d5\3\2\2\2\u00e3\u00d6\3\2\2\2\u00e3"+
+		"\2\u00d7\u00e4\7+\2\2\u00d8\u00e4\5\26\f\2\u00d9\u00e4\5\32\16\2\u00da"+
+		"\u00e4\7\27\2\2\u00db\u00dc\7$\2\2\u00dc\u00dd\7 \2\2\u00dd\u00de\7*\2"+
+		"\2\u00de\u00e4\7!\2\2\u00df\u00e0\7 \2\2\u00e0\u00e1\5\6\4\2\u00e1\u00e2"+
+		"\7!\2\2\u00e2\u00e4\3\2\2\2\u00e3\u00d5\3\2\2\2\u00e3\u00d6\3\2\2\2\u00e3"+
 		"\u00d7\3\2\2\2\u00e3\u00d8\3\2\2\2\u00e3\u00d9\3\2\2\2\u00e3\u00da\3\2"+
 		"\2\2\u00e3\u00db\3\2\2\2\u00e3\u00df\3\2\2\2\u00e4%\3\2\2\2\24\61@Yac"+
 		"ty\u0081\u0083\u008c\u009b\u00a4\u00af\u00b1\u00bd\u00bf\u00d3\u00e3";

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/f3ca3c05/metron-platform/metron-common/src/main/java/org/apache/metron/common/utils/ConversionUtils.java
----------------------------------------------------------------------
diff --git a/metron-platform/metron-common/src/main/java/org/apache/metron/common/utils/ConversionUtils.java b/metron-platform/metron-common/src/main/java/org/apache/metron/common/utils/ConversionUtils.java
index 29ec908..97b36ee 100644
--- a/metron-platform/metron-common/src/main/java/org/apache/metron/common/utils/ConversionUtils.java
+++ b/metron-platform/metron-common/src/main/java/org/apache/metron/common/utils/ConversionUtils.java
@@ -18,23 +18,41 @@
 
 package org.apache.metron.common.utils;
 
+import com.google.common.collect.Lists;
 import org.apache.commons.beanutils.BeanUtilsBean2;
 import org.apache.commons.beanutils.ConvertUtilsBean;
 
+import java.util.List;
+
 public class ConversionUtils {
-  private static ThreadLocal<ConvertUtilsBean> UTILS_BEAN  = new ThreadLocal<ConvertUtilsBean>() {
+  private static ThreadLocal<ConvertUtilsBean> UTILS_BEAN = new ThreadLocal<ConvertUtilsBean>() {
     @Override
     protected ConvertUtilsBean initialValue() {
       ConvertUtilsBean ret = BeanUtilsBean2.getInstance().getConvertUtils();
       ret.deregister();
-      ret.register(false,true, 1);
+      ret.register(false, true, 1);
       return ret;
     }
   };
+
   public static <T> T convert(Object o, Class<T> clazz) {
-    if(o == null) {
+    if (o == null) {
       return null;
     }
     return clazz.cast(UTILS_BEAN.get().convert(o, clazz));
   }
+
+  /**
+   * Performs naive List type conversion.
+   *
+   * @param from Source list
+   * @param clazz Class type to cast the List elements to
+   * @param <T> Source element type
+   * @param <U> Desired element type
+   * @return New List with the elements cast to the desired type
+   */
+  public static <T, U> List<U> convertList(List<T> from, Class<U> clazz) {
+    return Lists.transform(from, s -> convert(s, clazz));
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/f3ca3c05/metron-platform/metron-enrichment/src/test/java/org/apache/metron/enrichment/stellar/DocumentationGenerator.java
----------------------------------------------------------------------
diff --git a/metron-platform/metron-enrichment/src/test/java/org/apache/metron/enrichment/stellar/DocumentationGenerator.java b/metron-platform/metron-enrichment/src/test/java/org/apache/metron/enrichment/stellar/DocumentationGenerator.java
index e1223eb..ed371d0 100644
--- a/metron-platform/metron-enrichment/src/test/java/org/apache/metron/enrichment/stellar/DocumentationGenerator.java
+++ b/metron-platform/metron-enrichment/src/test/java/org/apache/metron/enrichment/stellar/DocumentationGenerator.java
@@ -30,13 +30,14 @@ public class DocumentationGenerator {
     List<StellarFunctionInfo> functions = Lists.newArrayList(SingletonFunctionResolver.getInstance().getFunctionInfo());
     Collections.sort(functions, (o1, o2) -> o1.getName().compareTo(o2.getName()));
     for(StellarFunctionInfo info: functions) {
-      System.out.println( "* `" + info.getName() + "`");
+      System.out.println( "### `" + info.getName() + "`");
       System.out.println( "  * Description: " + info.getDescription() );
       System.out.println( "  * Input:");
       for(String param :info.getParams()) {
         System.out.println( "    * " + param );
       }
       System.out.println( "  * Returns: " + info.getReturns() );
+      System.out.println("");
     }
   }