asmimproved-dbgmits
Version:
Provides the ability to control GDB and LLDB programmatically via GDB/MI.
355 lines • 48 kB
JavaScript
// Copyright (c) 2015 Vadim Macagon
// MIT License, see LICENSE file for full terms.
;
require('source-map-support').install();
var chai = require('chai');
var chaiAsPromised = require('chai-as-promised');
var dbgmits = require('../lib/index');
var test_utils_1 = require('./test_utils');
chai.use(chaiAsPromised);
// aliases
var expect = chai.expect;
// the directory in which Gruntfile.js resides is also Mocha's working directory,
// so any relative paths will be relative to that directory
var localTargetExe = './build/Debug/stack_tests_target';
test_utils_1.logSuite(describe("Debug Session", function () {
describe("Stack Inspection", function () {
var debugSession;
test_utils_1.beforeEachTestWithLogger(function (logger) {
debugSession = test_utils_1.startDebugSession(logger);
return debugSession.setExecutableFile(localTargetExe);
});
afterEach(function () {
return debugSession.end();
});
describe("#getStackFrame", function () {
it("gets the current stack frame", function () {
return test_utils_1.runToFunc(debugSession, 'funcAtFrameLevel0', function () {
return debugSession.getStackFrame()
.then(function (info) {
expect(info).to.have.property('func');
expect(info.func).match(/^funcAtFrameLevel0/);
});
});
});
// FIXME: re-enable on LLDB when it's fixed to handle --thread and --frame arguments
it("gets an outer stack frame @skipOnLLDB", function () {
return test_utils_1.runToFunc(debugSession, 'funcAtFrameLevel0', function () {
return debugSession.getStackFrame({ threadId: 1, frameLevel: 1 })
.then(function (info) {
expect(info).to.have.property('func');
expect(info.func).match(/^funcAtFrameLevel1/);
});
});
});
}); // #getStackFrame
it("#getStackDepth", function () {
var initialStackDepth = -1;
// GDB and LLDB report stack depth a bit differently, LLDB adds a couple of frames from
// libc to the count, but GDB does not. So instead of checking the absolute stack depth
// we check the relative stack depth (starting from main()).
var onBreakpointCheckStackDepth = new Promise(function (resolve, reject) {
debugSession.on(dbgmits.EVENT_BREAKPOINT_HIT, function (breakNotify) {
switch (breakNotify.breakpointId) {
case 1:
debugSession.getStackDepth()
.then(function (stackDepth) { initialStackDepth = stackDepth; })
.then(function () { return debugSession.addBreakpoint('funcAtFrameLevel0'); })
.then(function () { return debugSession.resumeInferior(); })
.catch(reject);
break;
case 2:
debugSession.getStackDepth()
.then(function (stackDepth) {
// the stack should be 2 levels deep counting from main():
// funcAtFrameLevel1()->funcAtFrameLevel0()
expect(stackDepth - initialStackDepth).to.equal(2);
})
.then(resolve)
.catch(reject);
break;
}
});
});
return debugSession.addBreakpoint('main')
.then(function () {
return Promise.all([
onBreakpointCheckStackDepth,
debugSession.startInferior()
]);
});
}); // #getStackDepth
describe("#getStackFrames", function () {
it("gets a list of stack frames", function () {
return test_utils_1.runToFunc(debugSession, 'funcAtFrameLevel0', function () {
var expectedStackDepth = -1;
return debugSession.getStackDepth()
.then(function (stackDepth) { expectedStackDepth = stackDepth; })
.then(function () { return debugSession.getStackFrames(); })
.then(function (frames) {
expect(frames.length).to.equal(expectedStackDepth);
for (var i = 0; i < frames.length; ++i) {
expect(frames[i].level).to.equal(i);
}
expect(frames[0].func).match(/^funcAtFrameLevel0/);
expect(frames[1].func).match(/^funcAtFrameLevel1/);
expect(frames[2].func).match(/^main/);
});
});
});
it("gets a list of stack frames within a certain level range", function () {
return test_utils_1.runToFunc(debugSession, 'funcAtFrameLevel0', function () {
return debugSession.getStackFrames({ lowFrame: 0, highFrame: 1 })
.then(function (frames) {
expect(frames.length).to.equal(2);
for (var i = 0; i < frames.length; ++i) {
expect(frames[i].level).to.equal(i);
}
expect(frames[0].func).match(/^funcAtFrameLevel0/);
expect(frames[1].func).match(/^funcAtFrameLevel1/);
});
});
});
it("gets a stack frame for a specific level", function () {
return test_utils_1.runToFunc(debugSession, 'funcAtFrameLevel0', function () {
return debugSession.getStackFrames({ highFrame: 1 })
.then(function (frames) {
expect(frames.length).to.equal(1);
expect(frames[0].level).to.equal(1);
expect(frames[0].func).match(/^funcAtFrameLevel1/);
});
});
});
}); // #getStackFrames
describe("#getStackFrameArgs", function () {
it("gets frame arguments for a number of frames", function () {
return test_utils_1.runToFunc(debugSession, 'funcWithNoArgs', function () {
// FIXME: should switch to simple detail level so we get type information,
// but the LLDB MI driver needs to be fixed to support that detail level
// first
return debugSession.getStackFrameArgs(dbgmits.VariableDetailLevel.All, { lowFrame: 0, highFrame: 3 })
.then(function (frames) {
expect(frames).to.have.property('length', 4);
expect(frames[0]).to.have.property('level', 0);
expect(frames[0]).to.have.property('args').that.has.property('length', 0);
expect(frames[1]).to.have.property('level', 1);
expect(frames[1]).to.have.property('args').that.has.property('length', 1);
expect(frames[1].args[0]).to.have.property('name', 'a');
expect(frames[1].args[0]).to.have.property('value', '5');
expect(frames[2].level).to.equal(2);
expect(frames[2].args.length).to.equal(2);
expect(frames[2].args[0].name).to.equal('b');
expect(frames[2].args[0].value).to.equal('7');
expect(frames[2].args[1].name).to.equal('c');
expect(frames[2].args[1]).to.have.property('value');
expect(frames[3].level).to.equal(3);
expect(frames[3].args.length).to.equal(3);
expect(frames[3].args[0].name).to.equal('d');
expect(frames[3].args[0].value).to.equal('300');
expect(frames[3].args[1].name).to.equal('e');
expect(frames[3].args[1]).to.have.property('value');
expect(frames[3].args[2].name).to.equal('f');
expect(frames[3].args[2]).to.have.property('value');
});
});
});
}); // #getStackFrameArgs
describe("#getStackFrameVariables", function () {
it("gets a single simple local variable (name only) for a frame", function () {
return test_utils_1.runToFunc(debugSession, 'funcWithOneSimpleLocalVariable_Inner', function () {
// get the variables for the previous frame
return debugSession.getStackFrameVariables(dbgmits.VariableDetailLevel.None, { threadId: 1, frameLevel: 1 })
.then(function (variables) {
var locals = variables.locals;
expect(locals.length).to.equal(1);
expect(locals[0]).to.have.property('name', 'a');
expect(locals[0]).to.have.property('value').that.is.undefined;
expect(locals[0]).to.have.property('type').that.is.undefined;
});
});
});
// FIXME: re-enable on LLDB when it correctly supports 'simple' mode (as in outputs types)
it("gets a single simple local variable (name, value, and type) for a frame @skipOnLLDB", function () {
return test_utils_1.runToFunc(debugSession, 'funcWithOneSimpleLocalVariable_Inner', function () {
// get the locals for the previous frame
return debugSession.getStackFrameVariables(dbgmits.VariableDetailLevel.Simple, { threadId: 1, frameLevel: 1 })
.then(function (variables) {
var locals = variables.locals;
expect(locals.length).to.equal(1);
expect(locals[0]).to.have.property('name', 'a');
expect(locals[0]).to.have.property('value', '5');
expect(locals[0]).to.have.property('type', 'int');
});
});
});
it("gets a single simple local variable (name and value) for a frame", function () {
return test_utils_1.runToFunc(debugSession, 'funcWithOneSimpleLocalVariable_Inner', function () {
// get the locals for the previous frame
return debugSession.getStackFrameVariables(dbgmits.VariableDetailLevel.All, { threadId: 1, frameLevel: 1 })
.then(function (variables) {
var locals = variables.locals;
expect(locals.length).to.equal(1);
expect(locals[0]).to.have.property('name', 'a');
expect(locals[0]).to.have.property('value', '5');
expect(locals[0]).to.have.property('type').that.is.undefined;
});
});
});
// FIXME: re-enable on LLDB when it correctly supports 'simple' mode (as in outputs types)
it("gets a single complex local variable (name and type) for the current frame @skipOnLLDB", function () {
return test_utils_1.runToFunc(debugSession, 'funcWithOneComplexLocalVariable_Inner', function () {
// get the locals for the current frame
return debugSession.getStackFrameVariables(dbgmits.VariableDetailLevel.Simple, { threadId: 1, frameLevel: 1 })
.then(function (variables) {
var locals = variables.locals;
expect(locals.length).to.equal(1);
expect(locals[0]).to.have.property('name', 'b');
expect(locals[0]).to.have.property('value').that.is.undefined;
expect(locals[0]).to.have.property('type', 'int [3]');
});
});
});
// FIXME: re-enable on LLDB when it correctly supports 'simple' mode (as in outputs types)
it("gets two local variables (name, value, and type) for a frame @skipOnLLDB", function () {
return test_utils_1.runToFunc(debugSession, 'funcWithTwoLocalVariables_Inner', function () {
// get the locals for the current frame
return debugSession.getStackFrameVariables(dbgmits.VariableDetailLevel.Simple, { threadId: 1, frameLevel: 1 })
.then(function (variables) {
var locals = variables.locals;
expect(locals.length).to.equal(2);
expect(locals[0]).to.have.property('name', 'c');
expect(locals[0]).to.have.property('value', 'true');
expect(locals[0]).to.have.property('type', 'bool');
expect(locals[1]).to.have.property('name', 'd');
expect(locals[1]).to.have.property('value').that.is.undefined;
expect(locals[1]).to.have.property('type', 'const char *[3]');
});
});
});
it("gets two local variables (name and value) for a frame", function () {
return test_utils_1.runToFunc(debugSession, 'funcWithTwoLocalVariables_Inner', function () {
// get the locals for the current frame
return debugSession.getStackFrameVariables(dbgmits.VariableDetailLevel.All, { threadId: 1, frameLevel: 1 })
.then(function (variables) {
var locals = variables.locals;
expect(locals.length).to.equal(2);
expect(locals[0]).to.have.property('name', 'c');
expect(locals[0]).to.have.property('value', 'true');
expect(locals[0]).to.have.property('type').that.is.undefined;
expect(locals[1]).to.have.property('name', 'd');
expect(locals[1]).to.have.property('value');
expect(locals[1]).to.have.property('type').that.is.undefined;
});
});
});
// FIXME: re-enable on LLDB when it correctly supports 'simple' mode (as in outputs types)
it("gets three local variables (name, value, and type) for a frame @skipOnLLDB", function () {
return test_utils_1.runToFunc(debugSession, 'funcWithThreeLocalVariables_Inner', function () {
// get the locals for the current frame
return debugSession.getStackFrameVariables(dbgmits.VariableDetailLevel.Simple, { threadId: 1, frameLevel: 1 })
.then(function (variables) {
var locals = variables.locals;
expect(locals.length).to.equal(3);
expect(locals[0]).to.have.property('name', 'e');
expect(locals[0]).to.have.property('value');
expect(locals[0]).to.have.property('type', 'Point');
expect(locals[1]).to.have.property('name', 'f');
expect(locals[1]).to.have.property('value', '9.5');
expect(locals[1]).to.have.property('type', 'float');
expect(locals[2]).to.have.property('name', 'g');
expect(locals[2]).to.have.property('value', '300');
expect(locals[2]).to.have.property('type', 'long');
});
});
});
it("gets three local variables (name and value) for a frame", function () {
return test_utils_1.runToFunc(debugSession, 'funcWithThreeLocalVariables_Inner', function () {
// get the locals for the current frame
return debugSession.getStackFrameVariables(dbgmits.VariableDetailLevel.All, { threadId: 1, frameLevel: 1 })
.then(function (variables) {
var locals = variables.locals;
expect(locals.length).to.equal(3);
expect(locals[0]).to.have.property('name', 'e');
expect(locals[0]).to.have.property('value');
expect(locals[0]).to.have.property('type').that.is.undefined;
expect(locals[1]).to.have.property('name', 'f');
expect(locals[1]).to.have.property('value', '9.5');
expect(locals[1]).to.have.property('type').that.is.undefined;
expect(locals[2]).to.have.property('name', 'g');
expect(locals[2]).to.have.property('value', '300');
expect(locals[2]).to.have.property('type').that.is.undefined;
});
});
});
it("gets no frame arguments for a function with no arguments", function () {
return test_utils_1.runToFunc(debugSession, 'funcWithNoArgs', function () {
return debugSession.getStackFrameVariables(dbgmits.VariableDetailLevel.None)
.then(function (variables) {
var args = variables.args;
expect(args.length).to.equal(0);
});
});
});
// FIXME: re-enable on LLDB when it correctly supports 'simple' mode (as in outputs types)
it("gets one simple function argument (name, value, and type) @skipOnLLDB", function () {
return test_utils_1.runToFunc(debugSession, 'funcWithOneSimpleArg', function () {
return debugSession.getStackFrameVariables(dbgmits.VariableDetailLevel.Simple)
.then(function (variables) {
var args = variables.args;
expect(args.length).to.equal(1);
expect(args[0]).to.have.property('name', 'a');
expect(args[0]).to.have.property('value', '5');
expect(args[0]).to.have.property('type', 'int');
});
});
});
it("gets one simple function argument (name and value)", function () {
return test_utils_1.runToFunc(debugSession, 'funcWithOneSimpleArg', function () {
return debugSession.getStackFrameVariables(dbgmits.VariableDetailLevel.All)
.then(function (variables) {
var args = variables.args;
expect(args.length).to.equal(1);
expect(args[0]).to.have.property('name', 'a');
expect(args[0]).to.have.property('value', '5');
expect(args[0]).to.have.property('type').that.is.undefined;
});
});
});
// FIXME: re-enable on LLDB when it correctly supports 'simple' mode (as in outputs types)
it("gets two function arguments (name, value, and type) @skipOnLLDB", function () {
return test_utils_1.runToFunc(debugSession, 'funcWithTwoArgs', function () {
return debugSession.getStackFrameVariables(dbgmits.VariableDetailLevel.Simple)
.then(function (variables) {
var args = variables.args;
expect(args.length).to.equal(2);
expect(args[0]).to.have.property('name', 'b');
expect(args[0]).to.have.property('value', '7');
expect(args[0]).to.have.property('type', 'float');
expect(args[1]).to.have.property('name', 'c');
expect(args[1]).to.have.property('value').that.is.undefined;
expect(args[1]).to.have.property('type', 'Point');
});
});
});
// FIXME: re-enable on LLDB when it correctly supports 'simple' mode (as in outputs types)
it("gets three function arguments (name, value, and type) @skipOnLLDB", function () {
return test_utils_1.runToFunc(debugSession, 'funcWithThreeArgs', function () {
return debugSession.getStackFrameVariables(dbgmits.VariableDetailLevel.Simple)
.then(function (variables) {
var args = variables.args;
expect(args.length).to.equal(3);
expect(args[0]).to.have.property('name', 'd');
expect(args[0]).to.have.property('value', '300');
expect(args[0]).to.have.property('type', 'long');
expect(args[1]).to.have.property('name', 'e');
expect(args[1]).to.have.property('value');
expect(args[1]).to.have.property('type', 'const char *');
expect(args[2]).to.have.property('name', 'f');
expect(args[2]).to.have.property('type', 'int *');
});
});
});
}); // #getStackFrameVariables
});
}));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2tfdGVzdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90ZXN0L3N0YWNrX3Rlc3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG1DQUFtQztBQUNuQyxnREFBZ0Q7O0FBRWhELE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBRXhDLElBQVksSUFBSSxXQUFNLE1BQU0sQ0FBQyxDQUFBO0FBQzdCLElBQU8sY0FBYyxXQUFXLGtCQUFrQixDQUFDLENBQUM7QUFFcEQsSUFBWSxPQUFPLFdBQU0sY0FBYyxDQUFDLENBQUE7QUFDeEMsMkJBRU8sY0FBYyxDQUFDLENBQUE7QUFFdEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUV6QixVQUFVO0FBQ1YsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUd6QixpRkFBaUY7QUFDakYsMkRBQTJEO0FBQzNELElBQUksY0FBYyxHQUFXLGtDQUFrQyxDQUFDO0FBRWhFLHFCQUFHLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRTtJQUM1QixRQUFRLENBQUMsa0JBQWtCLEVBQUU7UUFDM0IsSUFBSSxZQUEwQixDQUFDO1FBRS9CLHFDQUF3QixDQUFDLFVBQUMsTUFBcUI7WUFDN0MsWUFBWSxHQUFHLDhCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDeEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxTQUFTLENBQUM7WUFDUixNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO1FBRUgsUUFBUSxDQUFDLGdCQUFnQixFQUFFO1lBQ3pCLEVBQUUsQ0FBQyw4QkFBOEIsRUFBRTtnQkFDakMsTUFBTSxDQUFDLHNCQUFTLENBQUMsWUFBWSxFQUFFLG1CQUFtQixFQUFFO29CQUNsRCxNQUFNLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRTt5QkFDbEMsSUFBSSxDQUFDLFVBQUMsSUFBNkI7d0JBQ2xDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFDdEMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztvQkFDaEQsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUVILG9GQUFvRjtZQUNwRixFQUFFLENBQUMsdUNBQXVDLEVBQUU7Z0JBQzFDLE1BQU0sQ0FBQyxzQkFBUyxDQUFDLFlBQVksRUFBRSxtQkFBbUIsRUFBRTtvQkFDbEQsTUFBTSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQzt5QkFDaEUsSUFBSSxDQUFDLFVBQUMsSUFBNkI7d0JBQ2xDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFDdEMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztvQkFDaEQsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCO1FBRXJCLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRTtZQUNuQixJQUFJLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzNCLHVGQUF1RjtZQUN2Rix1RkFBdUY7WUFDdkYsNERBQTREO1lBQzVELElBQUksMkJBQTJCLEdBQUcsSUFBSSxPQUFPLENBQU8sVUFBQyxPQUFPLEVBQUUsTUFBTTtnQkFDbEUsWUFBWSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLEVBQzFDLFVBQUMsV0FBd0M7b0JBQ3ZDLE1BQU0sQ0FBQyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO3dCQUNqQyxLQUFLLENBQUM7NEJBQ0osWUFBWSxDQUFDLGFBQWEsRUFBRTtpQ0FDM0IsSUFBSSxDQUFDLFVBQUMsVUFBa0IsSUFBTyxpQkFBaUIsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7aUNBQ2pFLElBQUksQ0FBQyxjQUFRLE1BQU0sQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUNBQ3ZFLElBQUksQ0FBQyxjQUFRLE1BQU0sQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7aUNBQ3JELEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQzs0QkFDZixLQUFLLENBQUM7d0JBRVIsS0FBSyxDQUFDOzRCQUNKLFlBQVksQ0FBQyxhQUFhLEVBQUU7aUNBQzNCLElBQUksQ0FBQyxVQUFDLFVBQWtCO2dDQUN2QiwwREFBMEQ7Z0NBQzFELDJDQUEyQztnQ0FDM0MsTUFBTSxDQUFDLFVBQVUsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQ3JELENBQUMsQ0FBQztpQ0FDRCxJQUFJLENBQUMsT0FBTyxDQUFDO2lDQUNiLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQzs0QkFDZixLQUFLLENBQUM7b0JBQ1YsQ0FBQztnQkFDSCxDQUFDLENBQ0YsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO2lCQUN4QyxJQUFJLENBQUM7Z0JBQ0osTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7b0JBQ2pCLDJCQUEyQjtvQkFDM0IsWUFBWSxDQUFDLGFBQWEsRUFBRTtpQkFDN0IsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQjtRQUVyQixRQUFRLENBQUMsaUJBQWlCLEVBQUU7WUFDMUIsRUFBRSxDQUFDLDZCQUE2QixFQUFFO2dCQUNoQyxNQUFNLENBQUMsc0JBQVMsQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLEVBQUU7b0JBQ2xELElBQUksa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQzVCLE1BQU0sQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFO3lCQUNsQyxJQUFJLENBQUMsVUFBQyxVQUFrQixJQUFPLGtCQUFrQixHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt5QkFDbEUsSUFBSSxDQUFDLGNBQVEsTUFBTSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt5QkFDckQsSUFBSSxDQUFDLFVBQUMsTUFBaUM7d0JBQ3RDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO3dCQUNuRCxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQzs0QkFDdkMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUN0QyxDQUFDO3dCQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7d0JBQ25ELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7d0JBQ25ELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUN4QyxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLDBEQUEwRCxFQUFFO2dCQUM3RCxNQUFNLENBQUMsc0JBQVMsQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLEVBQUU7b0JBQ2xELE1BQU0sQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUM7eUJBQ2hFLElBQUksQ0FBQyxVQUFDLE1BQWlDO3dCQUN0QyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ2xDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDOzRCQUN2QyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ3RDLENBQUM7d0JBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQzt3QkFDbkQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztvQkFDckQsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUVILEVBQUUsQ0FBQyx5Q0FBeUMsRUFBRTtnQkFDNUMsTUFBTSxDQUFDLHNCQUFTLENBQUMsWUFBWSxFQUFFLG1CQUFtQixFQUFFO29CQUNsRCxNQUFNLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQzt5QkFDbkQsSUFBSSxDQUFDLFVBQUMsTUFBaUM7d0JBQ3RDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDbEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNwQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO29CQUNyRCxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0I7UUFFdEIsUUFBUSxDQUFDLG9CQUFvQixFQUFFO1lBQzdCLEVBQUUsQ0FBQyw2Q0FBNkMsRUFBRTtnQkFDaEQsTUFBTSxDQUFDLHNCQUFTLENBQUMsWUFBWSxFQUFFLGdCQUFnQixFQUFFO29CQUMvQywwRUFBMEU7b0JBQzFFLCtFQUErRTtvQkFDL0UsZUFBZTtvQkFDZixNQUFNLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQzt5QkFDcEcsSUFBSSxDQUFDLFVBQUMsTUFBcUM7d0JBQzFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBRTdDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQy9DLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBRTFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQy9DLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQzFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO3dCQUN4RCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQzt3QkFFekQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNwQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUMxQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUM3QyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUM5QyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUM3QyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUVwRCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ3BDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQzFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQzdDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ2hELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVB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VSxFQUFFLENBQUMsRUFBRSxDQUNoRTt5QkFDQSxJQUFJLENBQUMsVUFBQyxTQUEyQzt3QkFDaEQsSUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQzt3QkFDaEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUVsQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO3dCQUNoRCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQzVDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQzt3QkFFN0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQzt3QkFDaEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQzt3QkFDbkQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDO3dCQUU3RCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEdB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