emailjs-imap-client
Version:
JavaScript IMAP client
764 lines (642 loc) • 101 kB
JavaScript
"use strict";
var _imap = _interopRequireDefault(require("./imap"));
var _common = require("./common");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/* eslint-disable no-unused-expressions */
const host = 'localhost';
const port = 10000;
describe('browserbox imap unit tests', () => {
var client, socketStub;
/* jshint indent:false */
beforeEach(() => {
client = new _imap.default(host, port);
expect(client).to.exist;
client.logger = {
debug: () => {},
error: () => {}
};
var Socket = function () {};
Socket.open = () => {};
Socket.prototype.close = () => {};
Socket.prototype.send = () => {};
Socket.prototype.suspend = () => {};
Socket.prototype.resume = () => {};
Socket.prototype.upgradeToSecure = () => {};
socketStub = sinon.createStubInstance(Socket);
sinon.stub(Socket, 'open').withArgs(host, port).returns(socketStub);
var promise = client.connect(Socket).then(() => {
expect(Socket.open.callCount).to.equal(1);
expect(socketStub.onerror).to.exist;
expect(socketStub.onopen).to.exist;
expect(socketStub.onclose).to.exist;
expect(socketStub.ondata).to.exist;
});
setTimeout(() => socketStub.onopen(), 10);
return promise;
});
describe.skip('#close', () => {
it('should call socket.close', () => {
client.socket.readyState = 'open';
setTimeout(() => socketStub.onclose(), 10);
return client.close().then(() => {
expect(socketStub.close.callCount).to.equal(1);
});
});
it('should not call socket.close', () => {
client.socket.readyState = 'not open. duh.';
setTimeout(() => socketStub.onclose(), 10);
return client.close().then(() => {
expect(socketStub.close.called).to.be.false;
});
});
});
describe('#upgrade', () => {
it('should upgrade socket', () => {
client.secureMode = false;
client.upgrade();
});
it('should not upgrade socket', () => {
client.secureMode = true;
client.upgrade();
});
});
describe('#setHandler', () => {
it('should set global handler for keyword', () => {
var handler = () => {};
client.setHandler('fetch', handler);
expect(client._globalAcceptUntagged.FETCH).to.equal(handler);
});
});
describe('#socket.onerror', () => {
it('should emit error and close connection', done => {
client.socket.onerror({
data: new Error('err')
});
client.onerror = () => {
done();
};
});
});
describe('#socket.onclose', () => {
it('should emit error ', done => {
client.socket.onclose();
client.onerror = () => {
done();
};
});
});
describe('#_onData', () => {
it('should process input', () => {
sinon.stub(client, '_parseIncomingCommands');
sinon.stub(client, '_iterateIncomingBuffer');
client._onData({
data: (0, _common.toTypedArray)('foobar').buffer
});
expect(client._parseIncomingCommands.calledOnce).to.be.true;
expect(client._iterateIncomingBuffer.calledOnce).to.be.true;
});
});
describe('rateIncomingBuffer', () => {
it('should iterate chunked input', () => {
appendIncomingBuffer('* 1 FETCH (UID 1)\r\n* 2 FETCH (UID 2)\r\n* 3 FETCH (UID 3)\r\n');
var iterator = client._iterateIncomingBuffer();
expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 1 FETCH (UID 1)');
expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 2 FETCH (UID 2)');
expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 3 FETCH (UID 3)');
expect(iterator.next().value).to.be.undefined;
});
it('should process chunked literals', () => {
appendIncomingBuffer('* 1 FETCH (UID {1}\r\n1)\r\n* 2 FETCH (UID {4}\r\n2345)\r\n* 3 FETCH (UID {4}\r\n3789)\r\n');
var iterator = client._iterateIncomingBuffer();
expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 1 FETCH (UID {1}\r\n1)');
expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 2 FETCH (UID {4}\r\n2345)');
expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 3 FETCH (UID {4}\r\n3789)');
expect(iterator.next().value).to.be.undefined;
});
it('should process chunked literals 2', () => {
appendIncomingBuffer('* 1 FETCH (UID 1)\r\n* 2 FETCH (UID {4}\r\n2345)\r\n');
var iterator = client._iterateIncomingBuffer();
expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 1 FETCH (UID 1)');
expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 2 FETCH (UID {4}\r\n2345)');
expect(iterator.next().value).to.be.undefined;
});
it('should process chunked literals 3', () => {
appendIncomingBuffer('* 1 FETCH (UID {1}\r\n1)\r\n* 2 FETCH (UID 4)\r\n');
var iterator = client._iterateIncomingBuffer();
expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 1 FETCH (UID {1}\r\n1)');
expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 2 FETCH (UID 4)');
expect(iterator.next().value).to.be.undefined;
});
it('should process chunked literals 4', () => {
appendIncomingBuffer('* SEARCH {1}\r\n1 {1}\r\n2\r\n');
var iterator = client._iterateIncomingBuffer();
expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* SEARCH {1}\r\n1 {1}\r\n2');
});
it('should process CRLF literal', () => {
appendIncomingBuffer('* 1 FETCH (UID 20 BODY[HEADER.FIELDS (REFERENCES LIST-ID)] {2}\r\n\r\n)\r\n');
var iterator = client._iterateIncomingBuffer();
expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 1 FETCH (UID 20 BODY[HEADER.FIELDS (REFERENCES LIST-ID)] {2}\r\n\r\n)');
});
it('should process CRLF literal 2', () => {
appendIncomingBuffer('* 1 FETCH (UID 1 ENVELOPE ("string with {parenthesis}") BODY[HEADER.FIELDS (REFERENCES LIST-ID)] {2}\r\n\r\n)\r\n');
var iterator = client._iterateIncomingBuffer();
expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 1 FETCH (UID 1 ENVELOPE ("string with {parenthesis}") BODY[HEADER.FIELDS (REFERENCES LIST-ID)] {2}\r\n\r\n)');
});
it('should parse multiple zero-length literals', () => {
appendIncomingBuffer('* 126015 FETCH (UID 585599 BODY[1.2] {0}\r\n BODY[1.1] {0}\r\n)\r\n');
var iterator = client._iterateIncomingBuffer();
expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 126015 FETCH (UID 585599 BODY[1.2] {0}\r\n BODY[1.1] {0}\r\n)');
});
it('should process two commands when CRLF arrives in 2 parts', () => {
appendIncomingBuffer('* 1 FETCH (UID 1)\r');
var iterator1 = client._iterateIncomingBuffer();
expect(iterator1.next().value).to.be.undefined;
appendIncomingBuffer('\n* 2 FETCH (UID 2)\r\n');
var iterator2 = client._iterateIncomingBuffer();
expect(String.fromCharCode.apply(null, iterator2.next().value)).to.equal('* 1 FETCH (UID 1)');
expect(String.fromCharCode.apply(null, iterator2.next().value)).to.equal('* 2 FETCH (UID 2)');
expect(iterator2.next().value).to.be.undefined;
});
it('should process literal when literal count arrives in 2 parts', () => {
appendIncomingBuffer('* 1 FETCH (UID {');
var iterator1 = client._iterateIncomingBuffer();
expect(iterator1.next().value).to.be.undefined;
appendIncomingBuffer('2}\r\n12)\r\n');
var iterator2 = client._iterateIncomingBuffer();
expect(String.fromCharCode.apply(null, iterator2.next().value)).to.equal('* 1 FETCH (UID {2}\r\n12)');
expect(iterator2.next().value).to.be.undefined;
});
it('should process literal when literal count arrives in 2 parts 2', () => {
appendIncomingBuffer('* 1 FETCH (UID {1');
var iterator1 = client._iterateIncomingBuffer();
expect(iterator1.next().value).to.be.undefined;
appendIncomingBuffer('0}\r\n0123456789)\r\n');
var iterator2 = client._iterateIncomingBuffer();
expect(String.fromCharCode.apply(null, iterator2.next().value)).to.equal('* 1 FETCH (UID {10}\r\n0123456789)');
expect(iterator2.next().value).to.be.undefined;
});
it('should process literal when literal count arrives in 2 parts 3', () => {
appendIncomingBuffer('* 1 FETCH (UID {');
var iterator1 = client._iterateIncomingBuffer();
expect(iterator1.next().value).to.be.undefined;
appendIncomingBuffer('10}\r\n1234567890)\r\n');
var iterator2 = client._iterateIncomingBuffer();
expect(String.fromCharCode.apply(null, iterator2.next().value)).to.equal('* 1 FETCH (UID {10}\r\n1234567890)');
expect(iterator2.next().value).to.be.undefined;
});
it('should process literal when literal count arrives in 2 parts 4', () => {
appendIncomingBuffer('* 1 FETCH (UID 1 BODY[HEADER.FIELDS (REFERENCES LIST-ID)] {2}\r');
var iterator1 = client._iterateIncomingBuffer();
expect(iterator1.next().value).to.be.undefined;
appendIncomingBuffer('\nXX)\r\n');
var iterator2 = client._iterateIncomingBuffer();
expect(String.fromCharCode.apply(null, iterator2.next().value)).to.equal('* 1 FETCH (UID 1 BODY[HEADER.FIELDS (REFERENCES LIST-ID)] {2}\r\nXX)');
});
it('should process literal when literal count arrives in 3 parts', () => {
appendIncomingBuffer('* 1 FETCH (UID {');
var iterator1 = client._iterateIncomingBuffer();
expect(iterator1.next().value).to.be.undefined;
appendIncomingBuffer('1');
var iterator2 = client._iterateIncomingBuffer();
expect(iterator2.next().value).to.be.undefined;
appendIncomingBuffer('}\r\n1)\r\n');
var iterator3 = client._iterateIncomingBuffer();
expect(String.fromCharCode.apply(null, iterator3.next().value)).to.equal('* 1 FETCH (UID {1}\r\n1)');
expect(iterator3.next().value).to.be.undefined;
});
it('should process SEARCH response when it arrives in 2 parts', () => {
appendIncomingBuffer('* SEARCH 1 2');
var iterator1 = client._iterateIncomingBuffer();
expect(iterator1.next().value).to.be.undefined;
appendIncomingBuffer(' 3 4\r\n');
var iterator2 = client._iterateIncomingBuffer();
expect(String.fromCharCode.apply(null, iterator2.next().value)).to.equal('* SEARCH 1 2 3 4');
expect(iterator2.next().value).to.be.undefined;
});
it('should not process {} in string as literal 1', () => {
appendIncomingBuffer('* 1 FETCH (UID 1 ENVELOPE ("string with {parenthesis}"))\r\n');
var iterator = client._iterateIncomingBuffer();
expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 1 FETCH (UID 1 ENVELOPE ("string with {parenthesis}"))');
});
it('should not process {} in string as literal 2', () => {
appendIncomingBuffer('* 1 FETCH (UID 1 ENVELOPE ("string with number in parenthesis {123}"))\r\n');
var iterator = client._iterateIncomingBuffer();
expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 1 FETCH (UID 1 ENVELOPE ("string with number in parenthesis {123}"))');
});
function appendIncomingBuffer(content) {
client._incomingBuffers.push((0, _common.toTypedArray)(content));
}
});
describe('#_parseIncomingCommands', () => {
it('should process a tagged item from the queue', () => {
client.onready = sinon.stub();
sinon.stub(client, '_handleResponse');
function* gen() {
yield (0, _common.toTypedArray)('OK Hello world!');
}
client._parseIncomingCommands(gen());
expect(client.onready.callCount).to.equal(1);
expect(client._handleResponse.withArgs({
tag: 'OK',
command: 'Hello',
attributes: [{
type: 'ATOM',
value: 'world!'
}]
}).calledOnce).to.be.true;
});
it('should process an untagged item from the queue', () => {
sinon.stub(client, '_handleResponse');
function* gen() {
yield (0, _common.toTypedArray)('* 1 EXISTS');
}
client._parseIncomingCommands(gen());
expect(client._handleResponse.withArgs({
tag: '*',
command: 'EXISTS',
attributes: [],
nr: 1
}).calledOnce).to.be.true;
});
it('should process a plus tagged item from the queue', () => {
sinon.stub(client, 'send');
function* gen() {
yield (0, _common.toTypedArray)('+ Please continue');
}
client._currentCommand = {
data: ['literal data']
};
client._parseIncomingCommands(gen());
expect(client.send.withArgs('literal data\r\n').callCount).to.equal(1);
});
it('should process an XOAUTH2 error challenge', () => {
sinon.stub(client, 'send');
function* gen() {
yield (0, _common.toTypedArray)('+ FOOBAR');
}
client._currentCommand = {
data: [],
errorResponseExpectsEmptyLine: true
};
client._parseIncomingCommands(gen());
expect(client.send.withArgs('\r\n').callCount).to.equal(1);
});
});
describe('#_handleResponse', () => {
it('should invoke global handler by default', () => {
sinon.stub(client, '_processResponse');
sinon.stub(client, '_sendRequest');
client._globalAcceptUntagged.TEST = () => {};
sinon.stub(client._globalAcceptUntagged, 'TEST');
client._currentCommand = false;
client._handleResponse({
tag: '*',
command: 'test'
});
expect(client._sendRequest.callCount).to.equal(1);
expect(client._globalAcceptUntagged.TEST.withArgs({
tag: '*',
command: 'test'
}).callCount).to.equal(1);
});
it('should invoke global handler if needed', () => {
sinon.stub(client, '_processResponse');
client._globalAcceptUntagged.TEST = () => {};
sinon.stub(client._globalAcceptUntagged, 'TEST');
sinon.stub(client, '_sendRequest');
client._currentCommand = {
payload: {}
};
client._handleResponse({
tag: '*',
command: 'test'
});
expect(client._sendRequest.callCount).to.equal(0);
expect(client._globalAcceptUntagged.TEST.withArgs({
tag: '*',
command: 'test'
}).callCount).to.equal(1);
});
it('should push to payload', () => {
sinon.stub(client, '_processResponse');
client._globalAcceptUntagged.TEST = () => {};
sinon.stub(client._globalAcceptUntagged, 'TEST');
client._currentCommand = {
payload: {
TEST: []
}
};
client._handleResponse({
tag: '*',
command: 'test'
});
expect(client._globalAcceptUntagged.TEST.callCount).to.equal(0);
expect(client._currentCommand.payload.TEST).to.deep.equal([{
tag: '*',
command: 'test'
}]);
});
it('should invoke command callback', () => {
sinon.stub(client, '_processResponse');
sinon.stub(client, '_sendRequest');
client._globalAcceptUntagged.TEST = () => {};
sinon.stub(client._globalAcceptUntagged, 'TEST');
client._currentCommand = {
tag: 'A',
callback: response => {
expect(response).to.deep.equal({
tag: 'A',
command: 'test',
payload: {
TEST: 'abc'
}
});
},
payload: {
TEST: 'abc'
}
};
client._handleResponse({
tag: 'A',
command: 'test'
});
expect(client._sendRequest.callCount).to.equal(1);
expect(client._globalAcceptUntagged.TEST.callCount).to.equal(0);
});
});
describe('#enqueueCommand', () => {
it('should reject on NO/BAD', () => {
sinon.stub(client, '_sendRequest').callsFake(() => {
client._clientQueue[0].callback({
command: 'NO'
});
});
client._tagCounter = 100;
client._clientQueue = [];
client._canSend = true;
return client.enqueueCommand({
command: 'abc'
}, ['def'], {
t: 1
}).catch(err => {
expect(err).to.exist;
});
});
it('should invoke sending', () => {
sinon.stub(client, '_sendRequest').callsFake(() => {
client._clientQueue[0].callback({});
});
client._tagCounter = 100;
client._clientQueue = [];
client._canSend = true;
return client.enqueueCommand({
command: 'abc'
}, ['def'], {
t: 1
}).then(() => {
expect(client._sendRequest.callCount).to.equal(1);
expect(client._clientQueue.length).to.equal(1);
expect(client._clientQueue[0].tag).to.equal('W101');
expect(client._clientQueue[0].request).to.deep.equal({
command: 'abc',
tag: 'W101'
});
expect(client._clientQueue[0].t).to.equal(1);
});
});
it('should only queue', () => {
sinon.stub(client, '_sendRequest');
client._tagCounter = 100;
client._clientQueue = [];
client._canSend = false;
setTimeout(() => {
client._clientQueue[0].callback({});
}, 0);
return client.enqueueCommand({
command: 'abc'
}, ['def'], {
t: 1
}).then(() => {
expect(client._sendRequest.callCount).to.equal(0);
expect(client._clientQueue.length).to.equal(1);
expect(client._clientQueue[0].tag).to.equal('W101');
});
});
it('should store valueAsString option in the command', () => {
sinon.stub(client, '_sendRequest');
client._tagCounter = 100;
client._clientQueue = [];
client._canSend = false;
setTimeout(() => {
client._clientQueue[0].callback({});
}, 0);
return client.enqueueCommand({
command: 'abc',
valueAsString: false
}, ['def'], {
t: 1
}).then(() => {
expect(client._clientQueue[0].request.valueAsString).to.equal(false);
});
});
});
describe('#_sendRequest', () => {
it('should enter idle if nothing is to process', () => {
sinon.stub(client, '_enterIdle');
client._clientQueue = [];
client._sendRequest();
expect(client._enterIdle.callCount).to.equal(1);
});
it('should send data', () => {
sinon.stub(client, '_clearIdle');
sinon.stub(client, 'send');
client._clientQueue = [{
request: {
tag: 'W101',
command: 'TEST'
}
}];
client._sendRequest();
expect(client._clearIdle.callCount).to.equal(1);
expect(client.send.args[0][0]).to.equal('W101 TEST\r\n');
});
it('should send partial data', () => {
sinon.stub(client, '_clearIdle');
sinon.stub(client, 'send');
client._clientQueue = [{
request: {
tag: 'W101',
command: 'TEST',
attributes: [{
type: 'LITERAL',
value: 'abc'
}]
}
}];
client._sendRequest();
expect(client._clearIdle.callCount).to.equal(1);
expect(client.send.args[0][0]).to.equal('W101 TEST {3}\r\n');
expect(client._currentCommand.data).to.deep.equal(['abc']);
});
it('should run precheck', done => {
sinon.stub(client, '_clearIdle');
client._canSend = true;
client._clientQueue = [{
request: {
tag: 'W101',
command: 'TEST',
attributes: [{
type: 'LITERAL',
value: 'abc'
}]
},
precheck: ctx => {
expect(ctx).to.exist;
expect(client._canSend).to.be.true;
client._sendRequest = () => {
expect(client._clientQueue.length).to.equal(2);
expect(client._clientQueue[0].tag).to.include('.p');
expect(client._clientQueue[0].request.tag).to.include('.p');
client._clearIdle.restore();
done();
};
client.enqueueCommand({}, undefined, {
ctx: ctx
});
return Promise.resolve();
}
}];
client._sendRequest();
});
});
describe('#_enterIdle', () => {
it('should set idle timer', done => {
client.onidle = () => {
done();
};
client.timeoutEnterIdle = 1;
client._enterIdle();
});
});
describe('#_processResponse', () => {
it('should set humanReadable', () => {
var response = {
tag: '*',
command: 'OK',
attributes: [{
type: 'TEXT',
value: 'Some random text'
}]
};
client._processResponse(response);
expect(response.humanReadable).to.equal('Some random text');
});
it('should set response code', () => {
var response = {
tag: '*',
command: 'OK',
attributes: [{
type: 'ATOM',
section: [{
type: 'ATOM',
value: 'CAPABILITY'
}, {
type: 'ATOM',
value: 'IMAP4REV1'
}, {
type: 'ATOM',
value: 'UIDPLUS'
}]
}, {
type: 'TEXT',
value: 'Some random text'
}]
};
client._processResponse(response);
expect(response.code).to.equal('CAPABILITY');
expect(response.capability).to.deep.equal(['IMAP4REV1', 'UIDPLUS']);
});
});
describe('#isError', () => {
it('should detect if an object is an error', () => {
expect(client.isError(new RangeError('abc'))).to.be.true;
expect(client.isError('abc')).to.be.false;
});
});
describe('#enableCompression', () => {
it('should create inflater and deflater streams', () => {
client.socket.ondata = () => {};
sinon.stub(client.socket, 'ondata');
expect(client.compressed).to.be.false;
client.enableCompression();
expect(client.compressed).to.be.true;
const payload = 'asdasd';
const expected = payload.split('').map(char => char.charCodeAt(0));
client.send(payload);
const actualOut = socketStub.send.args[0][0];
client.socket.ondata({
data: actualOut
});
expect(Buffer.from(client._socketOnData.args[0][0].data)).to.deep.equal(Buffer.from(expected));
});
});
describe('#getPreviouslyQueued', () => {
const ctx = {};
it('should return undefined with empty queue and no current command', () => {
client._currentCommand = undefined;
client._clientQueue = [];
expect(testAndGetAttribute()).to.be.undefined;
});
it('should return undefined with empty queue and non-SELECT current command', () => {
client._currentCommand = createCommand('TEST');
client._clientQueue = [];
expect(testAndGetAttribute()).to.be.undefined;
});
it('should return current command with empty queue and SELECT current command', () => {
client._currentCommand = createCommand('SELECT', 'ATTR');
client._clientQueue = [];
expect(testAndGetAttribute()).to.equal('ATTR');
});
it('should return current command with non-SELECT commands in queue and SELECT current command', () => {
client._currentCommand = createCommand('SELECT', 'ATTR');
client._clientQueue = [createCommand('TEST01'), createCommand('TEST02')];
expect(testAndGetAttribute()).to.equal('ATTR');
});
it('should return last SELECT before ctx with multiple SELECT commands in queue (1)', () => {
client._currentCommand = createCommand('SELECT', 'ATTR01');
client._clientQueue = [createCommand('SELECT', 'ATTR'), createCommand('TEST'), ctx, createCommand('SELECT', 'ATTR03')];
expect(testAndGetAttribute()).to.equal('ATTR');
});
it('should return last SELECT before ctx with multiple SELECT commands in queue (2)', () => {
client._clientQueue = [createCommand('SELECT', 'ATTR02'), createCommand('SELECT', 'ATTR'), ctx, createCommand('SELECT', 'ATTR03')];
expect(testAndGetAttribute()).to.equal('ATTR');
});
it('should return last SELECT before ctx with multiple SELECT commands in queue (3)', () => {
client._clientQueue = [createCommand('SELECT', 'ATTR02'), createCommand('SELECT', 'ATTR'), createCommand('TEST'), ctx, createCommand('SELECT', 'ATTR03')];
expect(testAndGetAttribute()).to.equal('ATTR');
});
function testAndGetAttribute() {
const data = client.getPreviouslyQueued(['SELECT'], ctx);
if (data) {
return data.request.attributes[0].value;
}
}
function createCommand(command, attribute) {
const attributes = [];
const data = {
request: {
command,
attributes
}
};
if (attribute) {
data.request.attributes.push({
type: 'STRING',
value: attribute
});
}
return data;
}
});
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbWFwLXVuaXQuanMiXSwibmFtZXMiOlsiaG9zdCIsInBvcnQiLCJkZXNjcmliZSIsImNsaWVudCIsInNvY2tldFN0dWIiLCJiZWZvcmVFYWNoIiwiSW1hcENsaWVudCIsImV4cGVjdCIsInRvIiwiZXhpc3QiLCJsb2dnZXIiLCJkZWJ1ZyIsImVycm9yIiwiU29ja2V0Iiwib3BlbiIsInByb3RvdHlwZSIsImNsb3NlIiwic2VuZCIsInN1c3BlbmQiLCJyZXN1bWUiLCJ1cGdyYWRlVG9TZWN1cmUiLCJzaW5vbiIsImNyZWF0ZVN0dWJJbnN0YW5jZSIsInN0dWIiLCJ3aXRoQXJncyIsInJldHVybnMiLCJwcm9taXNlIiwiY29ubmVjdCIsInRoZW4iLCJjYWxsQ291bnQiLCJlcXVhbCIsIm9uZXJyb3IiLCJvbm9wZW4iLCJvbmNsb3NlIiwib25kYXRhIiwic2V0VGltZW91dCIsInNraXAiLCJpdCIsInNvY2tldCIsInJlYWR5U3RhdGUiLCJjYWxsZWQiLCJiZSIsImZhbHNlIiwic2VjdXJlTW9kZSIsInVwZ3JhZGUiLCJoYW5kbGVyIiwic2V0SGFuZGxlciIsIl9nbG9iYWxBY2NlcHRVbnRhZ2dlZCIsIkZFVENIIiwiZG9uZSIsImRhdGEiLCJFcnJvciIsIl9vbkRhdGEiLCJidWZmZXIiLCJfcGFyc2VJbmNvbWluZ0NvbW1hbmRzIiwiY2FsbGVkT25jZSIsInRydWUiLCJfaXRlcmF0ZUluY29taW5nQnVmZmVyIiwiYXBwZW5kSW5jb21pbmdCdWZmZXIiLCJpdGVyYXRvciIsIlN0cmluZyIsImZyb21DaGFyQ29kZSIsImFwcGx5IiwibmV4dCIsInZhbHVlIiwidW5kZWZpbmVkIiwiaXRlcmF0b3IxIiwiaXRlcmF0b3IyIiwiaXRlcmF0b3IzIiwiY29udGVudCIsIl9pbmNvbWluZ0J1ZmZlcnMiLCJwdXNoIiwib25yZWFkeSIsImdlbiIsIl9oYW5kbGVSZXNwb25zZSIsInRhZyIsImNvbW1hbmQiLCJhdHRyaWJ1dGVzIiwidHlwZSIsIm5yIiwiX2N1cnJlbnRDb21tYW5kIiwiZXJyb3JSZXNwb25zZUV4cGVjdHNFbXB0eUxpbmUiLCJURVNUIiwiX3NlbmRSZXF1ZXN0IiwicGF5bG9hZCIsImRlZXAiLCJjYWxsYmFjayIsInJlc3BvbnNlIiwiY2FsbHNGYWtlIiwiX2NsaWVudFF1ZXVlIiwiX3RhZ0NvdW50ZXIiLCJfY2FuU2VuZCIsImVucXVldWVDb21tYW5kIiwidCIsImNhdGNoIiwiZXJyIiwibGVuZ3RoIiwicmVxdWVzdCIsInZhbHVlQXNTdHJpbmciLCJfZW50ZXJJZGxlIiwiX2NsZWFySWRsZSIsImFyZ3MiLCJwcmVjaGVjayIsImN0eCIsImluY2x1ZGUiLCJyZXN0b3JlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJvbmlkbGUiLCJ0aW1lb3V0RW50ZXJJZGxlIiwiX3Byb2Nlc3NSZXNwb25zZSIsImh1bWFuUmVhZGFibGUiLCJzZWN0aW9uIiwiY29kZSIsImNhcGFiaWxpdHkiLCJpc0Vycm9yIiwiUmFuZ2VFcnJvciIsImNvbXByZXNzZWQiLCJlbmFibGVDb21wcmVzc2lvbiIsImV4cGVjdGVkIiwic3BsaXQiLCJtYXAiLCJjaGFyIiwiY2hhckNvZGVBdCIsImFjdHVhbE91dCIsIkJ1ZmZlciIsImZyb20iLCJfc29ja2V0T25EYXRhIiwidGVzdEFuZEdldEF0dHJpYnV0ZSIsImNyZWF0ZUNvbW1hbmQiLCJnZXRQcmV2aW91c2x5UXVldWVkIiwiYXR0cmlidXRlIl0sIm1hcHBpbmdzIjoiOztBQUVBOztBQUNBOzs7O0FBSEE7QUFLQSxNQUFNQSxJQUFJLEdBQUcsV0FBYjtBQUNBLE1BQU1DLElBQUksR0FBRyxLQUFiO0FBRUFDLFFBQVEsQ0FBQyw0QkFBRCxFQUErQixNQUFNO0FBQzNDLE1BQUlDLE1BQUosRUFBWUMsVUFBWjtBQUVBOztBQUVBQyxFQUFBQSxVQUFVLENBQUMsTUFBTTtBQUNmRixJQUFBQSxNQUFNLEdBQUcsSUFBSUcsYUFBSixDQUFlTixJQUFmLEVBQXFCQyxJQUFyQixDQUFUO0FBQ0FNLElBQUFBLE1BQU0sQ0FBQ0osTUFBRCxD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