Skip to content

Instantly share code, notes, and snippets.

@tdhsmith
Last active January 18, 2017 17:44
Show Gist options
  • Save tdhsmith/8e71aba02c684f549cdec05761e6e87b to your computer and use it in GitHub Desktop.
Save tdhsmith/8e71aba02c684f549cdec05761e6e87b to your computer and use it in GitHub Desktop.
websocket-monitor opcode test server
const http = require('http');
const WebSocket = require('ws');
// you'll need to npm install ws (tested on v1.1.1, which was the default as of this writing)
const wss = new WebSocket.Server({
port: 3001
});
wss.on('error', console.error);
wss.on('listening', () => console.log("* WS server ready"));
wss.on('connection', function connection(ws) {
console.log("* client WS connected\n");
let messageCounter = 0;
ws.on('message', function incoming(data, flags) {
if (flags.binary) {
console.log(
"-> BINARY (0x2); "
+ (flags.masked ? "MASKED" : "unmasked")
);
} else {
console.log(
"-> TEXT (0x1); "
+ (flags.masked ? "MASKED" : "unmasked")
);
}
if (++messageCounter == 2)
{
beginServerTest(ws);
}
});
ws.on('ping', function incoming(data, flags) {
console.log(
"-> PING (0x9); "
+ (flags.masked ? "MASKED" : "unmasked")
);
});
ws.on('pong', function incoming(data, flags) {
console.log(
"-> PONG (0xA); "
+ (flags.masked ? "MASKED" : "unmasked")
);
});
ws.on('close', function close(code, message) {
console.log("-> CLOSE (0x8)");
process.exit();
})
});
function beginServerTest(ws) {
var i = 0;
function multipart (err, send)
{
if (err) return console.error(err);
if (i % 2 == 0) {
send("start of text...", false);
} else {
send("...end of text", true);
process.nextTick(() => {
ws.close(1000, "done");
console.info("<- CLOSE (0x8)");
});
}
i++;
}
ws.send(Buffer.from("61626364", "hex"), {binary: true});
console.info("<- BINARY (0x2); unmasked");
ws.ping("PING");
console.info("<- PING (0x9); unmasked");
ws.pong("PONG");
console.info("<- PONG (0xA); unmasked");
ws.stream(multipart);
console.info("<- TEXT (0x1); unmasked");
console.info("<- CONTINUATION (0x0); unmasked");
}
const clientContent = `
<html>
<head><title>WS test</title></head>
<body>
<h1>Testing websockets</h1>
<script type="text/javascript">
const ws = new WebSocket('ws://localhost:3001');
ws.onopen = () => {
console.log("ws open!");
ws.send("text frame");
ws.send(new Uint8Array([1, 2, 3]));
}
ws.onerror = console.error;
ws.onclose = console.error;
</script>
</body>
</html>
`
http.createServer(function(request, response) {
response.writeHead(200, {"Content-Type": "text/html; charset=utf-8"});
response.write(clientContent, "utf-8");
response.end();
console.log("* served static html");
}).listen(3000);
console.log("* server started");
�M<+��������/Mac OS X 10.11.6, build 15G1212 (Darwin 15.6.0)-Dumpcap (Wireshark) 2.2.3 (v2.2.3-0-g57531cd)�dlo0  tcp /Mac OS X 10.11.6, build 15G1212 (Darwin 15.6.0)ddaF{��AAE=v?@@͜#R�_q��4x� �1
 d����dXaFD{��88E4ܰ@@#R͜�4x�_q��)��(
 d� d�XdaFE{��AAE=�@@͝#R-��ױ�r(�-S�1
 d���LdXaFU{��88E4�@@#R͝��r(-����*��(
 d� d�X�aF�{��uuEq�@@#R͜�4x�_q��)��e
 d� d���4 COMPRESSIONsnappylz4 CQL_VERSION3.4.2��aF�{��uuEq�@@#R͝��r(-����*��e
 d� d��L4 COMPRESSIONsnappylz4 CQL_VERSION3.4.2�XaF |��88E4${@@͜#R�_q��4�� �(
 d� d�XXaF|��88E4�@@͝#R-��౬re�-Q�(
 d� d�XdaF�D��AAE=�@@͜#R�_q��4�� �1
 �g d��ddaFE��AAE=�@@͝#R-��౬re�-Q�1
 �g d�MdXaFE��88E4�!@@#R͜�4��_q��)��(
 �g �gXXaF(E��88E44@@#R͝��re-����*��(
 �g �gX�aF�E��uuEq��@@#R͝��re-����*��e
 �g �g�M4 COMPRESSIONsnappylz4 CQL_VERSION3.4.2��aF�E��uuEq��@@#R͜�4��_q��)��e
 �g �g��4 COMPRESSIONsnappylz4 CQL_VERSION3.4.2�XaF�E��88E4֥@@͝#R-��鱬r��-O�(
 �g �gXXaF�E��88E4_A@@͜#R�_q��4�� �(
 �g �gXdaFz���DDE@�@@���Ki�������4?�
!:ddaF����DDE@�@@�K���I�Oi�溰���4?�
!:!:dXaF����88E4a�@@���Ki����I�P�1��(
!:!:XXaFɛ��88E4��@@�K���I�Pi�満1��(
!:!:X`aF���??E;
�@@���Ki����I�P�1��/
!:!:JRMIK`XaF*���88E4B@@�K���I�Pi����1��(
!:!:XhaF����HHED�@@�K���I�Pi����1��8
!:!:N 127.0.0.1��hXaF���88E4-f@@���Ki����I�`�1��(
!:!:XhaF(���GGEC��@@���Ki����I�`�1��7
!:!: 127.0.0.1hXaFT���88E4b3@@�K���I�`i��Ѐ1��(
!:!:X�aF`��٢�E��@@���Ki����I�`�1���
!:!:P��w"�������Cur[Ljava.rmi.server.ObjID;���,d~pxpw��srjava.rmi.dgc.Lease���f J�4JvalueLvmidtLjava/rmi/dgc/VMID;pxp '�srjava.rmi.dgc.VMID��[���m�[addrt[BLuidtLjava/rmi/server/UID;pxpur[B���T�pxp�n;POS:srjava.rmi.server.UIDp
�6OScountJtimeIuniquepxp�Y" ѻ�1p�XaFn���88E46�@@�K���I�`i��:�1��(
!:!:XxaF9���WWES)�@@�K���I�`i��:�1��G
!:!:Q��w�1pY" ѻ��srjava.rmi.dgc.Lease���f J�4JvalueLvmidtLjava/rmi/dgc/VMID;pxp '�srjava.rmi.dgc.VMID��[���m�[addrt[BLuidtLjava/rmi/server/UID;pxpur[B���T�pxp�n;POS:srjava.rmi.server.UIDp
�6OScountJtimeIuniquepxp�Y" ѻ�1pxXaFS���88E4 �@@���Ki��:�I��1��(
!:!:XdaFY`�AAE=��@@͜#R�_q��4�� �1
!N` �g�ddaF|`�AAE=�@@͝#R-��鱬r��-O�1
!N` �gQdXaF`�88E4_�@@#R͜�4��_q��)��(
!N`!N`XXaF�`�88E4T&@@#R͝��r�-����*��(
!N`!N`X�aF)`�uuEq��@@#R͝��r�-����*��e
!N`!N`�Q4 COMPRESSIONsnappylz4 CQL_VERSION3.4.2��aF4`�uuEq"�@@#R͜�4��_q��)��e
!N`!N`��4 COMPRESSIONsnappylz4 CQL_VERSION3.4.2�XaFC`�88E4��@@͝#R-�����r߀-M�(
!N`!N`XXaFO`�88E4!�@@͜#R�_q��5/� �(
!N`!N`XXaF+�e�88E4��@@���Ki��:�I��1��(
!O�!:XXaFQ�e�88E4b�@@�K���I�i��;�1��(
!O�!O�XXaFZ�e�88E4��@@���Ki��;�I��1��(
!O�!O�XXaFf�e�88E4�@@�K���I�i��;�1��(
!O�!O�XXaF��e�88E4FW@@���Ki��;�Iɀ�1��(
!O�!O�XdaF��)�AAE=C@@͜#R�_q��5/� �1
!��!N`�dXaF��)�88E4�5@@#R͜�5/�_q��)��(
!��!��XdaF��)�AAE=T+@@͝#R-�����r߀-M�1
!��!N`RdXaF��)�88E4T@@#R͝��r�-����*��(
!��!��X�aFu�)�uuEq �@@#R͜�5/�_q��)��e
!��!����4 COMPRESSIONsnappylz4 CQL_VERSION3.4.2��aF��)�uuEq��@@#R͝��r�-����*��e
!��!���R4 COMPRESSIONsnappylz4 CQL_VERSION3.4.2�XaF��)�88E4��@@͜#R�_q��5l� �(
!��!��XXaF��)�88E4׬@@͝#R-�����s�-K�(
!��!��XdaF;���AAE=$�@@͜#R�_q��5l� �1
"64!���ddaF^���AAE=[@@͝#R-�����s�-K�1
"64!��SdXaFh���88E4�@@#R͜�5l�_q��)��(
"64"64XXaFr���88E4�*@@#R͝��s-���*��(
"64"64X�aF���uuEq��@@#R͝��s-���*��e
"64"64�S4 COMPRESSIONsnappylz4 CQL_VERSION3.4.2��aF%���uuEq��@@#R͜�5l�_q��)��e
"64"64��4 COMPRESSIONsnappylz4 CQL_VERSION3.4.2�XaF1���88E4�@@͝#R-����sY�-I�(
"64"64XXaF;���88E4 w@@͜#R�_q��5�� �(
"64"64XdaF�~��AAE=�?@@͜#R�_q��5�� �1
"�"64�ddaF�~��AAE=D@@͝#R-����sY�-I�1
"�"64VdXaF�~��88E4 \@@#R͜�5��_qŀ)��(
"�"�XXaF�~��88E4L�@@#R͝��sY-��
�*��(
"�"�X�aFa��uuEqI�@@#R͜�5��_qŀ)��e
"�"���4 COMPRESSIONsnappylz4 CQL_VERSION3.4.2��aFb��uuEq%-@@#R͝��sY-��
�*��e
"�"��V4 COMPRESSIONsnappylz4 CQL_VERSION3.4.2�XaF~��88E4�]@@͜#R�_q��5�� �(
"�"�XXaF���88E4��@@͝#R-��
��s��-H�(
"�"�XdaF�S��AAE=@@͜#R�_q��5�� �1
#"��ddaF�S��AAE={�@@͝#R-��
��s��-H�1
#"�WdXaF�S��88E4'@@#R͜�5��_q΀)��(
##XXaF�S��88E4ۣ@@#R͝��s�-���*��(
##X�aFlT��uuEqd�@@#R͜�5��_q΀)��e
##��4 COMPRESSIONsnappylz4 CQL_VERSION3.4.2��aFqT��uuEq@@#R͝��s�-���*��e
##�W4 COMPRESSIONsnappylz4 CQL_VERSION3.4.2�XaF�T��88E4��@@͜#R�_q��6#�
�(
##XXaF�T��88E4"@@͝#R-����sӀ-F�(
##XdaF--Q�AAE=w�@@͜#R�_q��6#�
�1
#�#�dXaF]-Q�88E4�@@#R͜�6#�_q׀)��(
#�#�XdaFh-Q�AAE=P�@@͝#R-����sӀ-F�1
#�#XdXaFz-Q�88E4k�@@#R͝��s�-���*��(
#�#�X�aF/.Q�uuEqS$@@#R͝��s�-���*��e
#�#��X4 COMPRESSIONsnappylz4 CQL_VERSION3.4.2��aF1.Q�uuEq��@@#R͜�6#�_q׀)��e
#�#���4 COMPRESSIONsnappylz4 CQL_VERSION3.4.2�XaFK.Q�88E4:J@@͝#R-����t�-D�(
#�#�XXaFQ.Q�88E4�r@@͜#R�_q��6`� �(
#�#�XdaFQ��AAE=��@@͜#R�_q��6`� �1
$#��dXaF���88E4ag@@#R͜�6`�_q��)��(
$$XdaF���AAE=��@@͝#R-����t�-D�1
$#�UdXaF���88E4-�@@#R͝��t-��(�*��(
$$X�aF`��uuEqՉ@@#R͝��t-��(�*��e
$$�U4 COMPRESSIONsnappylz4 CQL_VERSION3.4.2��aFd��uuEq��@@#R͜�6`�_q��)��e
$$��4 COMPRESSIONsnappylz4 CQL_VERSION3.4.2�XaF���88E4��@@͝#R-��(��tM�-B�(
$$XXaF���88E4#�@@͜#R�_q��6�� �(
$$XdaFh���AAE=�t@@͜#R�_q��6�� �1
$|+$�dXaF����88E4��@@#R͜�6��_q��)��(
$|+$|+XdaF����AAE=�@@͝#R-��(��tM�-B�1
$|+$TdXaF����88E4� @@#R͝��tM-��1�*��(
$|+$|+X�aFh���uuEq �@@#R͝��tM-��1�*��e
$|+$|+�T4 COMPRESSIONsnappylz4 CQL_VERSION3.4.2��aFj���uuEq7�@@#R͜�6��_q��)��e
$|+$|+��4 COMPRESSIONsnappylz4 CQL_VERSION3.4.2�XaF����88E4�@@͝#R-��1��t��-@�(
$|+$|+XXaF����88E4@@͜#R�_q��6ڀ �(
$|+$|+XdaF3{��AAE=c@@͜#R�_q��6ڀ �1
$�'$|+�dXaFr{��88E4��@@#R͜�6��_q��)��(
$�'$�'XdaFy{��AAE=��@@͝#R-��1��t��-@�1
$�'$|+YdXaF�{��88E4Ϩ@@#R͝��t�-��:�*��(
$�'$�'X�aFD|��uuEqߜ@@#R͜�6��_q��)��e
$�'$�'��4 COMPRESSIONsnappylz4 CQL_VERSION3.4.2��aFN|��uuEqӑ@@#R͝��t�-��:�*��e
$�'$�'�Y4 COMPRESSIONsnappylz4 CQL_VERSION3.4.2�XaFZ|��88E4#@@͜#R�_q��7� �(
$�'$�'XXaFg|��88E4%�@@͝#R-��:��tǀ->�(
$�'$�'XdaF�Bx�AAE=��@@͜#R�_q��7� �1
%f;$�'�ddaFCx�AAE=L@@͝#R-��:��tǀ->�1
%f;$�'ZdXaF Cx�88E4L
@@#R͜�7�_q��)��(
%f;%f;XXaFCx�88E4��@@#R͝��t�-��C�*��(
%f;%f;X�aF�Cx�uuEq^�@@#R͜�7�_q��)��e
%f;%f;��4 COMPRESSIONsnappylz4 CQL_VERSION3.4.2��aF�Cx�uuEq��@@#R͝��t�-��C�*��e
%f;%f;�Z4 COMPRESSIONsnappylz4 CQL_VERSION3.4.2�XaF�Cx�88E4�B@@͜#R�_q��7T� �(
%f;%f;XXaF�Cx�88E4!�@@͝#R-��C��u�-<�(
%f;%f;XdaF,Eb�DDE@�@@���K�������4?�
%�ddaF_Eb�DDE@|'@@�K��$�C���߰���4?�
%�%�dXaFgEb�88E4`o@@���K���$�C��1��(
%�%�XXaFoEb�88E4��@@�K��$�C���߀1��(
%�%�X`aF�Eb�??E;�}@@���K���$�C��1��/
%�%�JRMIK`XaF�Eb�88E4:�@@�K��$�C�����1��(
%�%�XhaF�Fb�HHED�Z@@�K��$�C�����1��8
%�%�N 127.0.0.1��hXaF�Fb�88E4VQ@@���K���$�D�1��(
%�%�XhaF�Fb�GGEC��@@���K���$�D�1��7
%�%� 127.0.0.1hXaF�Fb�88E4��@@�K��$�D����1��(
%�%�X�aF�Fb���E�4�@@���K���$�D�1���
%�%�P��w"�������Cur[Ljava.rmi.server.ObjID;���,d~pxpw��srjava.rmi.dgc.Lease���f J�4JvalueLvmidtLjava/rmi/dgc/VMID;pxp '�srjava.rmi.dgc.VMID��[���m�[addrt[BLuidtLjava/rmi/server/UID;pxpur[B���T�pxp�n;POS:srjava.rmi.server.UIDp
�6OScountJtimeIuniquepxp�Y" ѻ�1p�XaF�Fb�88E4�@@�K��$�D��_�1��(
%�%�XxaF�Gb�WWESS�@@�K��$�D��_�1��G
%�%�Q��w�1pY" ѻ��srjava.rmi.dgc.Lease���f J�4JvalueLvmidtLjava/rmi/dgc/VMID;pxp '�srjava.rmi.dgc.VMID��[���m�[addrt[BLuidtLjava/rmi/server/UID;pxpur[B���T�pxp�n;POS:srjava.rmi.server.UIDp
�6OScountJtimeIuniquepxp�Y" ѻ�1pxXaF�Gb�88E4s@@���K��_$�E$�1��(
%�%�XdaF/B�AAE=�D@@͜#R�_q��7T� �1
%�F%f;�ddaFWB�AAE=5�@@͝#R-��C��u�-<�1
%�F%f;[dXaFYB�88E4�@@#R͜�7T�_r�)��(
%�F%�FXXaFhB�88E4�Z@@#R͝��u-��L�*��(
%�F%�FX�aF&B�uuEq� @@#R͜�7T�_r�)��e
%�F%�F��4 COMPRESSIONsnappylz4 CQL_VERSION3.4.2��aF8B�uuEqeq@@#R͝��u-��L�*��e
%�F%�F�[4 COMPRESSIONsnappylz4 CQL_VERSION3.4.2�XaFSB�88E4��@@͜#R�_r�7����(
%�F%�FXXaF`B�88E4�@@͝#R-��L��uA�-:�(
%�F%�FXXaF�2G�88E4@P@@���K��_$�E$�1��(
%ܔ%�XXaF�2G�88E4S_@@�K��$�E$��`�1��(
%ܔ%ܔXXaF�2G�88E4-�@@���K��`$�E$�1��(
%ܔ%ܔXXaF�2G�88E4�@@�K��$�E$��`�1��(
%ܔ%ܔXXaFl3G�88E4�P@@���K��`$�E%�1��(
%ܔ%ܔXdaFW���DDE@�x@@�� �K��-����4?�
&F}ddaF����DDE@��@@ ������K��.����4?�
&F}&F}dXaF����88E4a�@@�� �K��.����1��(
&F}&F}XXaF����88E4�h@@ ������K��.�1��(
&F}&F}X�aF�����E|J�@@�� �K��.����1��p
&F}&F}GET / HTTP/1.1
Host: localhost:3000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
�XaF2���88E4m�@@ ������K��v�1��(
&F}&F}XhaF$���EEEA�)@@ ������K��v�1�6
&F�&F}HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Date: Wed, 18 Jan 2017 17:41:40 GMT
Connection: keep-alive
Transfer-Encoding: chunked
172
<html>
<head><title>WS test</title></head>
<body>
<h1>Testing websockets</h1>
<script type="text/javascript">
const ws = new WebSocket('ws://localhost:3001');
ws.onopen = () => {
console.log("ws open!");
ws.send("text frame");
ws.send(new Uint8Array([1, 2, 3]));
}
ws.onerror = console.error;
ws.onclose = console.error;
</script>
</body>
</html>
hXaFD���88E4
�@@�� �K��v��ˀ1��(
&F�&F�X`aF����==E9]@@ ������K��v�1��-
&F�&F�0
`XaF����88E4�@@�� �K��v��Ѐ1��(
&F�&F�XdaF���DDE@�O@@�� ��W�����4?�
&F�ddaF ���DDE@n�@@ ���B���W�����4?�
&F�&F�dXaF���88E4�@@�� ��W�B���1��(
&F�&F�XXaF���88E4P@@ ���B���W��1��(
&F�&F�X`aF����??E;�@@�� ��W�B���1�0
&F�&F�GET / HTTP/1.1
Host: localhost:3001
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Sec-WebSocket-Version: 13
origin: http://localhost:3000
Sec-WebSocket-Extensions: permessage-deflate
Sec-WebSocket-Key: ce4ioogX/3PDSLQh8Dht5A==
Connection: keep-alive, Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
`XaF����88E4ʚ@@ ���B���W��1��(
&F�&F�XaFֻ����E��Z@@ ���B���W��1���
&F�&F�HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: RnEymY7yhbJlVlT/v/adgTX7gbs=
Sec-WebSocket-Extensions: permessage-deflate
XaF ���88E4��@@�� ��W�B���1��(
&F�&F�XlaF����JJEF^�@@�� ��W�B���1��:
&F�&F�������JFȁK��N��lXaF����88E4`r@@ ���B���W�(�1��(
&F�&F�XdaF����CCE?�@@�� ��W�(B���1��3
&F�&F�…ts�`�tdXaF����88E4��@@ ���B���W�3�1��(
&F�&F�XhaF���EEEA��@@ ���B���W�3�1��5
&F�&F�� JLJN��hXaF3��88E4��@@�� ��W�3B���1��(
&F�&F�X`aF ��>>E:C�@@ ���B���W�3�1��.
&F�&FĉPING`XaF8 ��88E4�8@@�� ��W�3B���1��(
&F�&F�X`aFm ��>>E:�B@@ ���B���W�3�1��.
&F�&FĊPONG`XaF� ��88E4�@@�� ��W�3B���1��(
&F�&F�XdaF� ��BBE>��@@�� ��W�3B���1��2
&F�&FĊ�ђ4ց�z�dXaF� ��88E4Њ@@ ���B���W�=�1��(
&F�&F�XxaF| ��UUEQ9]@@ ���B���W�=�1��E
&F�&F�A*.I,*Q�OS(I�(�������xXaF� ��88E4u�@@�� ��W�=B�π1��(
&F�&F�XpaF!
��OOEK��@@ ���B���W�=�1��?
&F�&Fŀ���K�KQ�OS(I�(��pXaFE
��88E4��@@�� ��W�=B���1��(
&F�&F�X`aFz
��@@E<��@@ ���B���W�=�1��0
&F�&Fň�done`XaF�
��88E4h@@�� ��W�=B���1��(
&F�&F�XdaF��DDE@��@@�� ��W�=B���1��4
&F�&Fň��)o�� |�LdXaF��88E4|�@@ ���B���W�I�1��(
&F�&F�XXaF���88E4�W@@ ���B���W�I�1��(
&F�&F�XXaF���88E4�a@@�� ��W�IB���1��(
&F�&F�XXaF���88E4�W@@ ���B���W�I�1��(
&F�&F�XXaF$��88E4�7@@�� ��W�IB���1��(
&F�&F�XXaFn��88E4�@@ ���B���W�J�1��(
&F�&F�XXaF� ��88E4|�@@ ������K��v�1��(
&F�&F�XXaF� ��88E4Ѐ@@�� �K��v��р1��(
&F�&F�XXaF� ��88E4$�@@ ������K��v�1��(
&F�&F�XXaF!��88E4�@@�� �K��v��р1��(
&F�&F�XXaF,!��88E4�O@@ ������K��w�1��(
&F�&F�XdaF�� �AAE=0:@@͜#R�_r�7����1
&P,%�F�dXaF� �88E4{�@@#R͜�7��_r
�)��(
&P,&P,XdaF
� �AAE=`V@@͝#R-��L��uA�-:�1
&P,%�F_dXaF� �88E4��@@#R͝��uA-��U�*��(
&P,&P,X�aF�� �uuEq�@@#R͜�7��_r
�)��e
&P,&P,��4 COMPRESSIONsnappylz4 CQL_VERSION3.4.2��aF�� �uuEq��@@#R͝��uA-��U�*��e
&P,&P,�_4 COMPRESSIONsnappylz4 CQL_VERSION3.4.2�XaF�� �88E4w�@@͜#R�_r
�7΀��(
&P,&P,XXaF�� �88E4a@@͝#R-��U��u~�-8�(
&P,&P,XlaF�9��Counters provided by dumpcapaF��7�aF�9���l
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment