UNPKG

ddb-table

Version:

Strongly typed library for querying and modeling DynamoDB documents.

185 lines (184 loc) 19.6 kB
"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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