ddb-table
Version:
Strongly typed library for querying and modeling DynamoDB documents.
185 lines (184 loc) • 19.6 kB
JavaScript
"use strict";
require("mocha");
var _chai = require("chai");
var _Table = _interopRequireDefault(require("./Table"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
describe('Table', () => {
describe('.index()', () => {
it('Basic Usage', () => {
const table = new _Table.default({
tableName: 'MyTable',
primaryKey: 'Id',
sortKey: 'Ver',
documentClient: {
scan: () => null
}
});
const index = table.index('Id-foo', 'Id', 'foo');
_chai.assert.deepEqual(index.scan().serialize(), {
TableName: 'MyTable',
IndexName: 'Id-foo'
});
});
});
describe('.put()', () => {
it('Basic Usage', () => {
const table = new _Table.default({
tableName: 'MyTable',
primaryKey: 'Id',
sortKey: 'Ver',
documentClient: {
put: () => null
}
});
_chai.assert.deepEqual(table.put({
Id: '12',
Ver: 2,
foo: 12.33,
inner: {
obj: 'foo'
},
hidden: false
}).condition(cn => cn.attributeNotExists('Id')).return('NONE').serialize(), {
TableName: 'MyTable',
ConditionExpression: 'attribute_not_exists(#Id)',
ExpressionAttributeNames: {
'#Id': 'Id'
},
Item: {
Id: '12',
Ver: 2,
foo: 12.33,
inner: {
obj: 'foo'
},
hidden: false
},
ReturnValues: 'NONE'
});
});
});
describe('.get()', () => {
it('Basic Usage', () => {
const table = new _Table.default({
tableName: 'MyTable',
primaryKey: 'Id',
sortKey: 'Ver',
documentClient: {
get: () => null
}
});
_chai.assert.deepEqual(table.get('ss', 1).project({
foo: false,
maybe: 1
}).serialize(), {
TableName: 'MyTable',
Key: {
Id: 'ss',
Ver: 1
},
ProjectionExpression: '#maybe',
ExpressionAttributeNames: {
'#maybe': 'maybe'
}
});
});
it('project(fields) type', () => {
const table = new _Table.default({
tableName: 'MyTable',
primaryKey: 'Id',
sortKey: 'Ver',
documentClient: {
get: () => null
}
});
const query = table.get('ss', 1).project({
foo: false,
maybe: 1
});
_chai.assert.ok(query);
});
it('project(fields) query', () => {
const table = new _Table.default({
tableName: 'MyTable',
primaryKey: 'Id',
sortKey: 'Ver',
documentClient: {
get: () => null
}
});
const query = table.get('ss', 1);
_chai.assert.ok({
foo: 1,
// Id2kk: true,
maybe: true,
hidden: false,
set: false,
inner: {
obj: false
}
});
});
});
describe('.update()', () => {
it('Basic Usage', () => {
const table = new _Table.default({
tableName: 'MyTable',
primaryKey: 'Id',
sortKey: 'Ver',
documentClient: {
update: () => null
}
});
_chai.assert.deepEqual(table.update('12', 2).condition(cn => cn.attributeExists('Id')).set(['inner', 'obj'], 'hello').add('foo', 5).delete('set', new Set(['del'])).remove('hidden').serialize(), {
TableName: 'MyTable',
Key: {
Id: '12',
Ver: 2
},
UpdateExpression: 'SET #inner.#obj = :obj REMOVE #hidden ADD #foo :foo DELETE #set :set',
ConditionExpression: 'attribute_exists(#Id)',
ExpressionAttributeNames: {
'#Id': 'Id',
'#foo': 'foo',
'#hidden': 'hidden',
'#inner': 'inner',
'#obj': 'obj',
'#set': 'set'
},
ExpressionAttributeValues: {
':foo': 5,
':obj': 'hello',
':set': new Set(['del'])
}
});
});
});
describe('.delete()', () => {
it('Basic Usage', () => {
const table = new _Table.default({
tableName: 'MyTable',
primaryKey: 'Id',
sortKey: 'Ver',
documentClient: {
delete: () => null
}
});
_chai.assert.deepEqual(table.delete('12', 2).condition(cn => cn.eq('foo', 12)).serialize(), {
TableName: 'MyTable',
Key: {
Id: '12',
Ver: 2
},
ConditionExpression: '#foo = :foo',
ExpressionAttributeNames: {
'#foo': 'foo'
},
ExpressionAttributeValues: {
':foo': 12
}
});
});
});
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZXF1aXJlIiwiX2NoYWkiLCJfVGFibGUiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0Iiwib2JqIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJkZXNjcmliZSIsIml0IiwidGFibGUiLCJUYWJsZSIsInRhYmxlTmFtZSIsInByaW1hcnlLZXkiLCJzb3J0S2V5IiwiZG9jdW1lbnRDbGllbnQiLCJzY2FuIiwiaW5kZXgiLCJhc3NlcnQiLCJkZWVwRXF1YWwiLCJzZXJpYWxpemUiLCJUYWJsZU5hbWUiLCJJbmRleE5hbWUiLCJwdXQiLCJJZCIsIlZlciIsImZvbyIsImlubmVyIiwiaGlkZGVuIiwiY29uZGl0aW9uIiwiY24iLCJhdHRyaWJ1dGVOb3RFeGlzdHMiLCJyZXR1cm4iLCJDb25kaXRpb25FeHByZXNzaW9uIiwiRXhwcmVzc2lvbkF0dHJpYnV0ZU5hbWVzIiwiSXRlbSIsIlJldHVyblZhbHVlcyIsImdldCIsInByb2plY3QiLCJtYXliZSIsIktleSIsIlByb2plY3Rpb25FeHByZXNzaW9uIiwicXVlcnkiLCJvayIsInNldCIsInVwZGF0ZSIsImF0dHJpYnV0ZUV4aXN0cyIsImFkZCIsImRlbGV0ZSIsIlNldCIsInJlbW92ZSIsIlVwZGF0ZUV4cHJlc3Npb24iLCJFeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzIiwiZXEiXSwic291cmNlcyI6WyIuLi9zcmMvVGFibGUudGVzdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ21vY2hhJztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJ2NoYWknO1xuaW1wb3J0IFRhYmxlIGZyb20gJy4vVGFibGUnO1xuaW1wb3J0IHsgR2V0UXVlcnkgfSBmcm9tICcuL3F1ZXJpZXMnO1xuaW1wb3J0IHsgVGFibGVLZXkgfSBmcm9tICcuL1RhYmxlSW5kZXgnO1xuXG5pbnRlcmZhY2UgRGVtb0l0ZW0ge1xuICBJZDogc3RyaW5nO1xuICBWZXI6IG51bWJlcjtcbiAgZm9vOiBudW1iZXI7XG4gIGlubmVyOiB7XG4gICAgb2JqOiBzdHJpbmc7XG4gIH07XG4gIHNldD86IFNldDxzdHJpbmc+O1xuICBtYXliZT86IGJvb2xlYW47XG4gIGhpZGRlbjogYm9vbGVhbjtcbn1cblxudHlwZSBEZW1vSW5kZXggPSBQaWNrPERlbW9JdGVtLCAnSWQnIHwgJ2ZvbycgfCAnbWF5YmUnPjtcblxuZGVzY3JpYmUoJ1RhYmxlJywgKCkgPT4ge1xuICBkZXNjcmliZSgnLmluZGV4KCknLCAoKSA9PiB7XG4gICAgaXQoJ0Jhc2ljIFVzYWdlJywgKCkgPT4ge1xuICAgICAgY29uc3QgdGFibGUgPSBuZXcgVGFibGU8RGVtb0l0ZW0sICdJZCcsICdWZXInPih7XG4gICAgICAgIHRhYmxlTmFtZTogJ015VGFibGUnLFxuICAgICAgICBwcmltYXJ5S2V5OiAnSWQnLFxuICAgICAgICBzb3J0S2V5OiAnVmVyJyxcbiAgICAgICAgZG9jdW1lbnRDbGllbnQ6IHsgc2NhbjogKCkgPT4gbnVsbCB9IGFzIG5ldmVyLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGluZGV4ID0gdGFibGUuaW5kZXg8RGVtb0luZGV4LCAnSWQnLCAnZm9vJz4oJ0lkLWZvbycsICdJZCcsICdmb28nKTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChpbmRleC5zY2FuKCkuc2VyaWFsaXplKCksIHtcbiAgICAgICAgVGFibGVOYW1lOiAnTXlUYWJsZScsXG4gICAgICAgIEluZGV4TmFtZTogJ0lkLWZvbycsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5wdXQoKScsICgpID0+IHtcbiAgICBpdCgnQmFzaWMgVXNhZ2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZSA9IG5ldyBUYWJsZTxEZW1vSXRlbSwgJ0lkJywgJ1Zlcic+KHtcbiAgICAgICAgdGFibGVOYW1lOiAnTXlUYWJsZScsXG4gICAgICAgIHByaW1hcnlLZXk6ICdJZCcsXG4gICAgICAgIHNvcnRLZXk6ICdWZXInLFxuICAgICAgICBkb2N1bWVudENsaWVudDogeyBwdXQ6ICgpID0+IG51bGwgfSBhcyBuZXZlcixcbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKFxuICAgICAgICB0YWJsZVxuICAgICAgICAgIC5wdXQoe1xuICAgICAgICAgICAgSWQ6ICcxMicsXG4gICAgICAgICAgICBWZXI6IDIsXG4gICAgICAgICAgICBmb286IDEyLjMzLFxuICAgICAgICAgICAgaW5uZXI6IHtcbiAgICAgICAgICAgICAgb2JqOiAnZm9vJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBoaWRkZW46IGZhbHNlLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNvbmRpdGlvbigoY24pID0+IGNuLmF0dHJpYnV0ZU5vdEV4aXN0cygnSWQnKSlcbiAgICAgICAgICAucmV0dXJuKCdOT05FJylcbiAgICAgICAgICAuc2VyaWFsaXplKCksXG4gICAgICAgIHtcbiAgICAgICAgICBUYWJsZU5hbWU6ICdNeVRhYmxlJyxcbiAgICAgICAgICBDb25kaXRpb25FeHByZXNzaW9uOiAnYXR0cmlidXRlX25vdF9leGlzdHMoI0lkKScsXG4gICAgICAgICAgRXhwcmVzc2lvbkF0dHJpYnV0ZU5hbWVzOiB7XG4gICAgICAgICAgICAnI0lkJzogJ0lkJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIEl0ZW06IHtcbiAgICAgICAgICAgIElkOiAnMTInLFxuICAgICAgICAgICAgVmVyOiAyLFxuICAgICAgICAgICAgZm9vOiAxMi4zMyxcbiAgICAgICAgICAgIGlubmVyOiB7XG4gICAgICAgICAgICAgIG9iajogJ2ZvbycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaGlkZGVuOiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFJldHVyblZhbHVlczogJ05PTkUnLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5nZXQoKScsICgpID0+IHtcbiAgICBpdCgnQmFzaWMgVXNhZ2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZSA9IG5ldyBUYWJsZTxEZW1vSXRlbSwgJ0lkJywgJ1Zlcic+KHtcbiAgICAgICAgdGFibGVOYW1lOiAnTXlUYWJsZScsXG4gICAgICAgIHByaW1hcnlLZXk6ICdJZCcsXG4gICAgICAgIHNvcnRLZXk6ICdWZXInLFxuICAgICAgICBkb2N1bWVudENsaWVudDogeyBnZXQ6ICgpID0+IG51bGwgfSBhcyBuZXZlcixcbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKFxuICAgICAgICB0YWJsZVxuICAgICAgICAgIC5nZXQoJ3NzJywgMSlcbiAgICAgICAgICAucHJvamVjdCh7IGZvbzogZmFsc2UgYXMgYm9vbGVhbiwgbWF5YmU6IDEgfSlcbiAgICAgICAgICAuc2VyaWFsaXplKCksXG4gICAgICAgIHtcbiAgICAgICAgICBUYWJsZU5hbWU6ICdNeVRhYmxlJyxcbiAgICAgICAgICBLZXk6IHtcbiAgICAgICAgICAgIElkOiAnc3MnLFxuICAgICAgICAgICAgVmVyOiAxLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgUHJvamVjdGlvbkV4cHJlc3Npb246ICcjbWF5YmUnLFxuICAgICAgICAgIEV4cHJlc3Npb25BdHRyaWJ1dGVOYW1lczoge1xuICAgICAgICAgICAgJyNtYXliZSc6ICdtYXliZScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgncHJvamVjdChmaWVsZHMpIHR5cGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZSA9IG5ldyBUYWJsZTxEZW1vSXRlbSwgJ0lkJywgJ1Zlcic+KHtcbiAgICAgICAgdGFibGVOYW1lOiAnTXlUYWJsZScsXG4gICAgICAgIHByaW1hcnlLZXk6ICdJZCcsXG4gICAgICAgIHNvcnRLZXk6ICdWZXInLFxuICAgICAgICBkb2N1bWVudENsaWVudDogeyBnZXQ6ICgpID0+IG51bGwgfSBhcyBuZXZlcixcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBxdWVyeSA9IHRhYmxlXG4gICAgICAgIC5nZXQoJ3NzJywgMSlcbiAgICAgICAgLnByb2plY3QoeyBmb286IGZhbHNlIGFzIGJvb2xlYW4sIG1heWJlOiAxIH0pO1xuXG4gICAgICBhc3NlcnQub2s8XG4gICAgICAgIEdldFF1ZXJ5PFxuICAgICAgICAgIE9taXQ8RGVtb0l0ZW0sICdmb28nIHwgJ2hpZGRlbicgfCAnaW5uZXInPiAmIHsgZm9vPzogbnVtYmVyIH0sXG4gICAgICAgICAgVGFibGVLZXk8RGVtb0l0ZW0sICdJZCcsICdWZXInPlxuICAgICAgICA+XG4gICAgICA+KHF1ZXJ5KTtcbiAgICB9KTtcblxuICAgIGl0KCdwcm9qZWN0KGZpZWxkcykgcXVlcnknLCAoKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZSA9IG5ldyBUYWJsZTxEZW1vSXRlbSwgJ0lkJywgJ1Zlcic+KHtcbiAgICAgICAgdGFibGVOYW1lOiAnTXlUYWJsZScsXG4gICAgICAgIHByaW1hcnlLZXk6ICdJZCcsXG4gICAgICAgIHNvcnRLZXk6ICdWZXInLFxuICAgICAgICBkb2N1bWVudENsaWVudDogeyBnZXQ6ICgpID0+IG51bGwgfSBhcyBuZXZlcixcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBxdWVyeSA9IHRhYmxlLmdldCgnc3MnLCAxKTtcblxuICAgICAgYXNzZXJ0Lm9rPFJlcXVpcmVkPFBhcmFtZXRlcnM8dHlwZW9mIHF1ZXJ5LnByb2plY3Q+WzBdPj4oe1xuICAgICAgICBmb286IDEsXG4gICAgICAgIC8vIElkMmtrOiB0cnVlLFxuICAgICAgICBtYXliZTogdHJ1ZSxcbiAgICAgICAgaGlkZGVuOiBmYWxzZSxcbiAgICAgICAgc2V0OiBmYWxzZSxcbiAgICAgICAgaW5uZXI6IHtcbiAgICAgICAgICBvYmo6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcudXBkYXRlKCknLCAoKSA9PiB7XG4gICAgaXQoJ0Jhc2ljIFVzYWdlJywgKCkgPT4ge1xuICAgICAgY29uc3QgdGFibGUgPSBuZXcgVGFibGU8RGVtb0l0ZW0sICdJZCcsICdWZXInPih7XG4gICAgICAgIHRhYmxlTmFtZTogJ015VGFibGUnLFxuICAgICAgICBwcmltYXJ5S2V5OiAnSWQnLFxuICAgICAgICBzb3J0S2V5OiAnVmVyJyxcbiAgICAgICAgZG9jdW1lbnRDbGllbnQ6IHsgdXBkYXRlOiAoKSA9PiBudWxsIH0gYXMgbmV2ZXIsXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChcbiAgICAgICAgdGFibGVcbiAgICAgICAgICAudXBkYXRlKCcxMicsIDIpXG4gICAgICAgICAgLmNvbmRpdGlvbigoY24pID0+IGNuLmF0dHJpYnV0ZUV4aXN0cygnSWQnKSlcbiAgICAgICAgICAuc2V0KFsnaW5uZXInLCAnb2JqJ10sICdoZWxsbycpXG4gICAgICAgICAgLmFkZCgnZm9vJywgNSlcbiAgICAgICAgICAuZGVsZXRlKCdzZXQnLCBuZXcgU2V0KFsnZGVsJ10pKVxuICAgICAgICAgIC5yZW1vdmUoJ2hpZGRlbicpXG4gICAgICAgICAgLnNlcmlhbGl6ZSgpLFxuICAgICAgICB7XG4gICAgICAgICAgVGFibGVOYW1lOiAnTXlUYWJsZScsXG4gICAgICAgICAgS2V5OiB7XG4gICAgICAgICAgICBJZDogJzEyJyxcbiAgICAgICAgICAgIFZlcjogMixcbiAgICAgICAgICB9LFxuICAgICAgICAgIFVwZGF0ZUV4cHJlc3Npb246XG4gICAgICAgICAgICAnU0VUICNpbm5lci4jb2JqID0gOm9iaiBSRU1PVkUgI2hpZGRlbiBBREQgI2ZvbyA6Zm9vIERFTEVURSAjc2V0IDpzZXQnLFxuICAgICAgICAgIENvbmRpdGlvbkV4cHJlc3Npb246ICdhdHRyaWJ1dGVfZXhpc3RzKCNJZCknLFxuICAgICAgICAgIEV4cHJlc3Npb25BdHRyaWJ1dGVOYW1lczoge1xuICAgICAgICAgICAgJyNJZCc6ICdJZCcsXG4gICAgICAgICAgICAnI2Zvbyc6ICdmb28nLFxuICAgICAgICAgICAgJyNoaWRkZW4nOiAnaGlkZGVuJyxcbiAgICAgICAgICAgICcjaW5uZXInOiAnaW5uZXInLFxuICAgICAgICAgICAgJyNvYmonOiAnb2JqJyxcbiAgICAgICAgICAgICcjc2V0JzogJ3NldCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBFeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzOiB7XG4gICAgICAgICAgICAnOmZvbyc6IDUsXG4gICAgICAgICAgICAnOm9iaic6ICdoZWxsbycsXG4gICAgICAgICAgICAnOnNldCc6IG5ldyBTZXQoWydkZWwnXSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcuZGVsZXRlKCknLCAoKSA9PiB7XG4gICAgaXQoJ0Jhc2ljIFVzYWdlJywgKCkgPT4ge1xuICAgICAgY29uc3QgdGFibGUgPSBuZXcgVGFibGU8RGVtb0l0ZW0sICdJZCcsICdWZXInPih7XG4gICAgICAgIHRhYmxlTmFtZTogJ015VGFibGUnLFxuICAgICAgICBwcmltYXJ5S2V5OiAnSWQnLFxuICAgICAgICBzb3J0S2V5OiAnVmVyJyxcbiAgICAgICAgZG9jdW1lbnRDbGllbnQ6IHsgZGVsZXRlOiAoKSA9PiBudWxsIH0gYXMgbmV2ZXIsXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChcbiAgICAgICAgdGFibGVcbiAgICAgICAgICAuZGVsZXRlKCcxMicsIDIpXG4gICAgICAgICAgLmNvbmRpdGlvbigoY24pID0+IGNuLmVxKCdmb28nLCAxMikpXG4gICAgICAgICAgLnNlcmlhbGl6ZSgpLFxuICAgICAgICB7XG4gICAgICAgICAgVGFibGVOYW1lOiAnTXlUYWJsZScsXG4gICAgICAgICAgS2V5OiB7XG4gICAgICAgICAgICBJZDogJzEyJyxcbiAgICAgICAgICAgIFZlcjogMixcbiAgICAgICAgICB9LFxuICAgICAgICAgIENvbmRpdGlvbkV4cHJlc3Npb246ICcjZm9vID0gOmZvbycsXG4gICAgICAgICAgRXhwcmVzc2lvbkF0dHJpYnV0ZU5hbWVzOiB7XG4gICAgICAgICAgICAnI2Zvbyc6ICdmb28nLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgRXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlczoge1xuICAgICAgICAgICAgJzpmb28nOiAxMixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQUEsT0FBQTtBQUNBLElBQUFDLEtBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUgsT0FBQTtBQUE0QixTQUFBRyx1QkFBQUMsR0FBQSxXQUFBQSxHQUFBLElBQUFBLEdBQUEsQ0FBQUMsVUFBQSxHQUFBRCxHQUFBLEtBQUFFLE9BQUEsRUFBQUYsR0FBQTtBQWtCNUJHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsTUFBTTtFQUN0QkEsUUFBUSxDQUFDLFVBQVUsRUFBRSxNQUFNO0lBQ3pCQyxFQUFFLENBQUMsYUFBYSxFQUFFLE1BQU07TUFDdEIsTUFBTUMsS0FBSyxHQUFHLElBQUlDLGNBQUssQ0FBd0I7UUFDN0NDLFNBQVMsRUFBRSxTQUFTO1FBQ3BCQyxVQUFVLEVBQUUsSUFBSTtRQUNoQkMsT0FBTyxFQUFFLEtBQUs7UUFDZEMsY0FBYyxFQUFFO1VBQUVDLElBQUksRUFBRUEsQ0FBQSxLQUFNO1FBQUs7TUFDckMsQ0FBQyxDQUFDO01BRUYsTUFBTUMsS0FBSyxHQUFHUCxLQUFLLENBQUNPLEtBQUssQ0FBeUIsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUM7TUFFeEVDLFlBQU0sQ0FBQ0MsU0FBUyxDQUFDRixLQUFLLENBQUNELElBQUksRUFBRSxDQUFDSSxTQUFTLEVBQUUsRUFBRTtRQUN6Q0MsU0FBUyxFQUFFLFNBQVM7UUFDcEJDLFNBQVMsRUFBRTtNQUNiLENBQUMsQ0FBQztJQUNKLENBQUMsQ0FBQztFQUNKLENBQUMsQ0FBQztFQUVGZCxRQUFRLENBQUMsUUFBUSxFQUFFLE1BQU07SUFDdkJD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