diff --git a/dist/client-integration.js b/dist/client-integration.js new file mode 100644 index 0000000..3ea639c --- /dev/null +++ b/dist/client-integration.js @@ -0,0 +1,466 @@ +"use strict"; + +var _hoodiecrowImap = _interopRequireDefault(require("hoodiecrow-imap")); + +var _ = _interopRequireWildcard(require("..")); + +var _commandParser = require("./command-parser"); + +var _commandBuilder = require("./command-builder"); + +function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/* eslint-disable no-unused-expressions */ +process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; +describe('browserbox integration tests', () => { + let imap; + const port = 10000; + let server; + beforeEach(done => { + // start imap test server + var options = { + // debug: true, + plugins: ['STARTTLS', 'X-GM-EXT-1'], + secureConnection: false, + storage: { + INBOX: { + messages: [{ + raw: 'Subject: hello 1\r\n\r\nWorld 1!' + }, { + raw: 'Subject: hello 2\r\n\r\nWorld 2!', + flags: ['\\Seen'] + }, { + raw: 'Subject: hello 3\r\n\r\nWorld 3!', + uid: 555 + }, { + raw: 'From: sender name \r\nTo: Receiver name \r\nSubject: hello 4\r\nMessage-Id: \r\nDate: Fri, 13 Sep 2013 15:01:00 +0300\r\n\r\nWorld 4!' + }, { + raw: 'Subject: hello 5\r\n\r\nWorld 5!', + flags: ['$MyFlag', '\\Deleted'], + uid: 557 + }, { + raw: 'Subject: hello 6\r\n\r\nWorld 6!' + }, { + raw: 'Subject: hello 7\r\n\r\nWorld 7!', + uid: 600 + }] + }, + '': { + separator: '/', + folders: { + '[Gmail]': { + flags: ['\\Noselect'], + folders: { + 'All Mail': { + 'special-use': '\\All' + }, + Drafts: { + 'special-use': '\\Drafts' + }, + Important: { + 'special-use': '\\Important' + }, + 'Sent Mail': { + 'special-use': '\\Sent' + }, + Spam: { + 'special-use': '\\Junk' + }, + Starred: { + 'special-use': '\\Flagged' + }, + Trash: { + 'special-use': '\\Trash' + }, + A: { + messages: [{}] + }, + B: { + messages: [{}] + } + } + } + } + } + } + }; + server = (0, _hoodiecrowImap.default)(options); + server.listen(port, done); + }); + afterEach(done => { + server.close(done); + }); + describe('Connection tests', () => { + var insecureServer; + beforeEach(done => { + // start imap test server + var options = { + // debug: true, + plugins: [], + secureConnection: false + }; + insecureServer = (0, _hoodiecrowImap.default)(options); + insecureServer.listen(port + 2, done); + }); + afterEach(done => { + insecureServer.close(done); + }); + it('should use STARTTLS by default', () => { + imap = new _.default('127.0.0.1', port, { + logLevel: _.LOG_LEVEL_NONE, + auth: { + user: 'testuser', + pass: 'testpass' + }, + useSecureTransport: false + }); + return imap.connect().then(() => { + expect(imap.client.secureMode).to.be.true; + }).then(() => { + return imap.close(); + }); + }); + it('should ignore STARTTLS', () => { + imap = new _.default('127.0.0.1', port, { + logLevel: _.LOG_LEVEL_NONE, + auth: { + user: 'testuser', + pass: 'testpass' + }, + useSecureTransport: false, + ignoreTLS: true + }); + return imap.connect().then(() => { + expect(imap.client.secureMode).to.be.false; + }).then(() => { + return imap.close(); + }); + }); + it('should fail connecting to non-STARTTLS host', () => { + imap = new _.default('127.0.0.1', port + 2, { + logLevel: _.LOG_LEVEL_NONE, + auth: { + user: 'testuser', + pass: 'testpass' + }, + useSecureTransport: false, + requireTLS: true + }); + return imap.connect().catch(err => { + expect(err).to.exist; + }); + }); + it('should connect to non secure host', () => { + imap = new _.default('127.0.0.1', port + 2, { + logLevel: _.LOG_LEVEL_NONE, + auth: { + user: 'testuser', + pass: 'testpass' + }, + useSecureTransport: false + }); + return imap.connect().then(() => { + expect(imap.client.secureMode).to.be.false; + }).then(() => { + return imap.close(); + }); + }); + it('should fail authentication', done => { + imap = new _.default('127.0.0.1', port + 2, { + logLevel: _.LOG_LEVEL_NONE, + auth: { + user: 'invalid', + pass: 'invalid' + }, + useSecureTransport: false + }); + imap.connect().then(() => { + expect(imap.client.secureMode).to.be.false; + }).catch(() => { + done(); + }); + }); + }); + describe('Post login tests', () => { + beforeEach(() => { + imap = new _.default('127.0.0.1', port, { + logLevel: _.LOG_LEVEL_NONE, + auth: { + user: 'testuser', + pass: 'testpass' + }, + useSecureTransport: false + }); + return imap.connect().then(() => { + return imap.selectMailbox('[Gmail]/Spam'); + }); + }); + afterEach(() => { + return imap.close(); + }); + describe('#listMailboxes', () => { + it('should succeed', () => { + return imap.listMailboxes().then(mailboxes => { + expect(mailboxes).to.exist; + }); + }); + }); + describe('#listMessages', () => { + it('should succeed', () => { + return imap.listMessages('inbox', '1:*', ['uid', 'flags', 'envelope', 'bodystructure', 'body.peek[]']).then(messages => { + expect(messages).to.not.be.empty; + }); + }); + }); + describe('#upload', () => { + it('should succeed', () => { + var msgCount; + return imap.listMessages('inbox', '1:*', ['uid', 'flags', 'envelope', 'bodystructure']).then(messages => { + expect(messages).to.not.be.empty; + msgCount = messages.length; + }).then(() => { + return imap.upload('inbox', 'MIME-Version: 1.0\r\nDate: Wed, 9 Jul 2014 15:07:47 +0200\r\nDelivered-To: test@test.com\r\nMessage-ID: \r\nSubject: test\r\nFrom: Test Test \r\nTo: Test Test \r\nContent-Type: text/plain; charset=UTF-8\r\n\r\ntest', { + flags: ['\\Seen', '\\Answered', '\\$MyFlag'] + }); + }).then(() => { + return imap.listMessages('inbox', '1:*', ['uid', 'flags', 'envelope', 'bodystructure']); + }).then(messages => { + expect(messages.length).to.equal(msgCount + 1); + }); + }); + }); + describe('#search', () => { + it('should return a sequence number', () => { + return imap.search('inbox', { + header: ['subject', 'hello 3'] + }).then(result => { + expect(result).to.deep.equal([3]); + }); + }); + it('should return an uid', () => { + return imap.search('inbox', { + header: ['subject', 'hello 3'] + }, { + byUid: true + }).then(result => { + expect(result).to.deep.equal([555]); + }); + }); + it('should work with complex queries', () => { + return imap.search('inbox', { + header: ['subject', 'hello'], + seen: true + }).then(result => { + expect(result).to.deep.equal([2]); + }); + }); + }); + describe('#setFlags', () => { + it('should set flags for a message', () => { + return imap.setFlags('inbox', '1', ['\\Seen', '$MyFlag']).then(result => { + expect(result).to.deep.equal([{ + '#': 1, + flags: ['\\Seen', '$MyFlag'] + }]); + }); + }); + it('should add flags to a message', () => { + return imap.setFlags('inbox', '2', { + add: ['$MyFlag'] + }).then(result => { + expect(result).to.deep.equal([{ + '#': 2, + flags: ['\\Seen', '$MyFlag'] + }]); + }); + }); + it('should remove flags from a message', () => { + return imap.setFlags('inbox', '557', { + remove: ['\\Deleted'] + }, { + byUid: true + }).then(result => { + expect(result).to.deep.equal([{ + '#': 5, + flags: ['$MyFlag'], + uid: 557 + }]); + }); + }); + it('should not return anything on silent mode', () => { + return imap.setFlags('inbox', '1', ['$MyFlag2'], { + silent: true + }).then(result => { + expect(result).to.deep.equal([]); + }); + }); + }); + describe('#store', () => { + it('should add labels for a message', () => { + return imap.store('inbox', '1', '+X-GM-LABELS', ['\\Sent', '\\Junk']).then(result => { + expect(result).to.deep.equal([{ + '#': 1, + 'x-gm-labels': ['\\Inbox', '\\Sent', '\\Junk'] + }]); + }); + }); + it('should set labels for a message', () => { + return imap.store('inbox', '1', 'X-GM-LABELS', ['\\Sent', '\\Junk']).then(result => { + expect(result).to.deep.equal([{ + '#': 1, + 'x-gm-labels': ['\\Sent', '\\Junk'] + }]); + }); + }); + it('should remove labels from a message', () => { + return imap.store('inbox', '1', '-X-GM-LABELS', ['\\Sent', '\\Inbox']).then(result => { + expect(result).to.deep.equal([{ + '#': 1, + 'x-gm-labels': [] + }]); + }); + }); + }); + describe('#deleteMessages', () => { + it('should delete a message', () => { + var initialInfo; + var expungeNotified = new Promise((resolve, reject) => { + imap.onupdate = function (mb, type + /*, data */ + ) { + try { + expect(mb).to.equal('inbox'); + expect(type).to.equal('expunge'); + resolve(); + } catch (err) { + reject(err); + } + }; + }); + return imap.selectMailbox('inbox').then(info => { + initialInfo = info; + return imap.deleteMessages('inbox', 557, { + byUid: true + }); + }).then(() => { + return imap.selectMailbox('inbox'); + }).then(resultInfo => { + expect(initialInfo.exists - 1 === resultInfo.exists).to.be.true; + }).then(() => expungeNotified); + }); + }); + describe('#copyMessages', () => { + it('should copy a message', () => { + return imap.copyMessages('inbox', 555, '[Gmail]/Trash', { + byUid: true + }).then(() => { + return imap.selectMailbox('[Gmail]/Trash'); + }).then(info => { + expect(info.exists).to.equal(1); + }); + }); + }); + describe('#moveMessages', () => { + it('should move a message', () => { + var initialInfo; + return imap.selectMailbox('inbox').then(info => { + initialInfo = info; + return imap.moveMessages('inbox', 555, '[Gmail]/Spam', { + byUid: true + }); + }).then(() => { + return imap.selectMailbox('[Gmail]/Spam'); + }).then(info => { + expect(info.exists).to.equal(1); + return imap.selectMailbox('inbox'); + }).then(resultInfo => { + expect(initialInfo.exists).to.not.equal(resultInfo.exists); + }); + }); + }); + describe('precheck', () => { + it('should handle precheck error correctly', () => { + // simulates a broken search command + var search = (query, options = {}) => { + var command = (0, _commandBuilder.buildSEARCHCommand)(query, options); + return imap.exec(command, 'SEARCH', { + precheck: () => Promise.reject(new Error('FOO')) + }).then(response => (0, _commandParser.parseSEARCH)(response)); + }; + + return imap.selectMailbox('inbox').then(() => search({ + header: ['subject', 'hello 3'] + })).catch(err => { + expect(err.message).to.equal('FOO'); + return imap.selectMailbox('[Gmail]/Spam'); + }); + }); + it('should select correct mailboxes in prechecks on concurrent calls', () => { + return imap.selectMailbox('[Gmail]/A').then(() => { + return Promise.all([imap.selectMailbox('[Gmail]/B'), imap.setFlags('[Gmail]/A', '1', ['\\Seen'])]); + }).then(() => { + return imap.listMessages('[Gmail]/A', '1:1', ['flags']); + }).then(messages => { + expect(messages.length).to.equal(1); + expect(messages[0].flags).to.deep.equal(['\\Seen']); + }); + }); + it('should send precheck commands in correct order on concurrent calls', () => { + return Promise.all([imap.setFlags('[Gmail]/A', '1', ['\\Seen']), imap.setFlags('[Gmail]/B', '1', ['\\Seen'])]).then(() => { + return imap.listMessages('[Gmail]/A', '1:1', ['flags']); + }).then(messages => { + expect(messages.length).to.equal(1); + expect(messages[0].flags).to.deep.equal(['\\Seen']); + }).then(() => { + return imap.listMessages('[Gmail]/B', '1:1', ['flags']); + }).then(messages => { + expect(messages.length).to.equal(1); + expect(messages[0].flags).to.deep.equal(['\\Seen']); + }); + }); + }); + }); + describe('Timeout', () => { + beforeEach(() => { + imap = new _.default('127.0.0.1', port, { + logLevel: _.LOG_LEVEL_NONE, + auth: { + user: 'testuser', + pass: 'testpass' + }, + useSecureTransport: false + }); + return imap.connect().then(() => { + // remove the ondata event to simulate 100% packet loss and make the socket time out after 10ms + imap.client.timeoutSocketLowerBound = 10; + imap.client.timeoutSocketMultiplier = 0; + + imap.client.socket.ondata = () => {}; + }); + }); + it('should timeout', done => { + imap.onerror = () => { + done(); + }; + + imap.selectMailbox('inbox').catch(() => {}); + }); + it('should reject all pending commands on timeout', () => { + let rejectionCount = 0; + return Promise.all([imap.selectMailbox('INBOX').catch(err => { + expect(err).to.exist; + rejectionCount++; + }), imap.listMessages('INBOX', '1:*', ['body.peek[]']).catch(err => { + expect(err).to.exist; + rejectionCount++; + })]).then(() => { + expect(rejectionCount).to.equal(2); + }); + }); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGllbnQtaW50ZWdyYXRpb24uanMiXSwibmFtZXMiOlsicHJvY2VzcyIsImVudiIsIk5PREVfVExTX1JFSkVDVF9VTkFVVEhPUklaRUQiLCJkZXNjcmliZSIsImltYXAiLCJwb3J0Iiwic2VydmVyIiwiYmVmb3JlRWFjaCIsImRvbmUiLCJvcHRpb25zIiwicGx1Z2lucyIsInNlY3VyZUNvbm5lY3Rpb24iLCJzdG9yYWdlIiwiSU5CT1giLCJtZXNzYWdlcyIsInJhdyIsImZsYWdzIiwidWlkIiwic2VwYXJhdG9yIiwiZm9sZGVycyIsIkRyYWZ0cyIsIkltcG9ydGFudCIsIlNwYW0iLCJTdGFycmVkIiwiVHJhc2giLCJBIiwiQiIsImxpc3RlbiIsImFmdGVyRWFjaCIsImNsb3NlIiwiaW5zZWN1cmVTZXJ2ZXIiLCJpdCIsIkltYXBDbGllbnQiLCJsb2dMZXZlbCIsImF1dGgiLCJ1c2VyIiwicGFzcyIsInVzZVNlY3VyZVRyYW5zcG9ydCIsImNvbm5lY3QiLCJ0aGVuIiwiZXhwZWN0IiwiY2xpZW50Iiwic2VjdXJlTW9kZSIsInRvIiwiYmUiLCJ0cnVlIiwiaWdub3JlVExTIiwiZmFsc2UiLCJyZXF1aXJlVExTIiwiY2F0Y2giLCJlcnIiLCJleGlzdCIsInNlbGVjdE1haWxib3giLCJsaXN0TWFpbGJveGVzIiwibWFpbGJveGVzIiwibGlzdE1lc3NhZ2VzIiwibm90IiwiZW1wdHkiLCJtc2dDb3VudCIsImxlbmd0aCIsInVwbG9hZCIsImVxdWFsIiwic2VhcmNoIiwiaGVhZGVyIiwicmVzdWx0IiwiZGVlcCIsImJ5VWlkIiwic2VlbiIsInNldEZsYWdzIiwiYWRkIiwicmVtb3ZlIiwic2lsZW50Iiwic3RvcmUiLCJpbml0aWFsSW5mbyIsImV4cHVuZ2VOb3RpZmllZCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0Iiwib251cGRhdGUiLCJtYiIsInR5cGUiLCJpbmZvIiwiZGVsZXRlTWVzc2FnZXMiLCJyZXN1bHRJbmZvIiwiZXhpc3RzIiwiY29weU1lc3NhZ2VzIiwibW92ZU1lc3NhZ2VzIiwicXVlcnkiLCJjb21tYW5kIiwiZXhlYyIsInByZWNoZWNrIiwiRXJyb3IiLCJyZXNwb25zZSIsIm1lc3NhZ2UiLCJhbGwiLCJ0aW1lb3V0U29ja2V0TG93ZXJCb3VuZCIsInRpbWVvdXRTb2NrZXRNdWx0aXBsaWVyIiwic29ja2V0Iiwib25kYXRhIiwib25lcnJvciIsInJlamVjdGlvbkNvdW50Il0sIm1hcHBpbmdzIjoiOztBQUVBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7OztBQUxBO0FBT0FBLE9BQU8sQ0FBQ0MsR0FBUixDQUFZQyw0QkFBWixHQUEyQyxHQUEzQztBQUVBQyxRQUFRLENBQUMsOEJBQUQsRUFBaUMsTUFBTTtBQUM3QyxNQUFJQyxJQUFKO0FBQ0EsUUFBTUMsSUFBSSxHQUFHLEtBQWI7QUFDQSxNQUFJQyxNQUFKO0FBRUFDLEVBQUFBLFVBQVUsQ0FBRUMsSUFBRCxJQUFVO0FBQ25CO0FBQ0EsUUFBSUMsT0FBTyxHQUFHO0FBQ1o7QUFDQUMsTUFBQUEsT0FBTyxFQUFFLENBQUMsVUFBRCxFQUFhLFlBQWIsQ0FGRztBQUdaQyxNQUFBQSxnQkFBZ0IsRUFBRSxLQUhOO0FBSVpDLE1BQUFBLE9BQU8sRUFBRTtBQUNQQyxRQUFBQSxLQUFLLEVBQUU7QUFDTEMsVUFBQUEsUUFBUSxFQUFFLENBQ1I7QUFBRUMsWUFBQUEsR0FBRyxFQUFFO0FBQVAsV0FEUSxFQUVSO0FBQUVBLFlBQUFBLEdBQUcsRUFBRSxrQ0FBUDtBQUEyQ0MsWUFBQUEsS0FBSyxFQUFFLENBQUMsUUFBRDtBQUFsRCxXQUZRLEVBR1I7QUFBRUQsWUFBQUEsR0FBRyxFQUFFLGtDQUFQO0FBQTJDRSxZQUFBQSxHQUFHLEVBQUU7QUFBaEQsV0FIUSxFQUlSO0FBQUVGLFlBQUFBLEdBQUcsRUFBRTtBQUFQLFdBSlEsRUFLUjtBQUFFQSxZQUFBQSxHQUFHLEVBQUUsa0NBQVA7QUFBMkNDLFlBQUFBLEtBQUssRUFBRSxDQUFDLFNBQUQsRUFBWSxXQUFaLENBQWxEO0FBQTRFQyxZQUFBQSxHQUFHLEVBQUU7QUFBakYsV0FMUSxFQU1SO0FBQUVGLFlBQUFBLEdBQUcsRUFBRTtBQUFQLFdBTlEsRUFPUjtBQUFFQSxZQUFBQSxHQUFHLEVBQUUsa0NBQVA7QUFBMkNFLFlBQUFBLEdBQUcsRUFBRTtBQUFoRCxXQVBRO0FBREwsU0FEQTtBQVlQLFlBQUk7QUFDRkMsVUFBQUEsU0FBUyxFQUFFLEdBRFQ7QUFFRkMsVUFBQUEsT0FBTyxFQUFFO0FBQ1AsdUJBQVc7QUFDVEgsY0FBQUEsS0FBSyxFQUFFLENBQUMsWUFBRCxDQURFO0FBRVRHLGNBQUFBLE9BQU8sRUFBRTtBQUNQLDRCQUFZO0FBQUUsaUNBQWU7QUFBakIsaUJBREw7QUFFUEMsZ0JBQUFBLE1BQU0sRUFBRTtBQUFFLGlDQUFlO0FBQWpCLGlCQUZEO0FBR1BDLGdCQUFBQSxTQUFTLEVBQUU7QUFBRSxpQ0FBZTtBQUFqQixpQkFISjtBQUlQLDZCQUFhO0FBQUUsaUNBQWU7QUFBakIsaUJBSk47QUFLUEMsZ0JBQUFBLElBQUksRUFBRTtBQUFFLGlDQUFlO0FBQWpCLGlCQUxDO0FBTVBDLGdCQUFBQSxPQUFPLEVBQUU7QUFBRSxpQ0FBZTtBQUFqQixpQkFORjtBQU9QQyxnQkFBQUEsS0FBSyxFQUFFO0FBQUUsaUNBQWU7QUFBakIsaUJBUEE7QUFRUEMsZ0JBQUFBLENBQUMsRUFBRTtBQUFFWCxrQkFBQUEsUUFBUSxFQUFFLENBQUMsRUFBRDtBQUFaLGlCQVJJO0FBU1BZLGdCQUFBQSxDQUFDLEVBQUU7QUFBRVosa0JBQUFBLFFBQVEsRUFBRSxDQUFDLEVBQUQ7QUFBWjtBQVRJO0FBRkE7QUFESjtBQUZQO0FBWkc7QUFKRyxLQUFkO0FBc0NBUixJQUFBQSxNQUFNLEdBQUcsNkJBQVdHLE9BQVgsQ0FBVDtBQUNBSCxJQUFBQSxNQUFNLENBQUNxQixNQUFQLENBQWN0QixJQUFkLEVBQW9CRyxJQUFwQjtBQUNELEdBMUNTLENBQVY7QUE0Q0FvQixFQUFBQSxTQUFTLENBQUVwQixJQUFELElBQVU7QUFDbEJGLElBQUFBLE1BQU0sQ0FBQ3VCLEtBQVAsQ0FBYXJCLElBQWI7QUFDRCxHQUZRLENBQVQ7QUFJQUwsRUFBQUEsUUFBUSxDQUFDLGtCQUFELEVBQXFCLE1BQU07QUFDakMsUUFBSTJCLGNBQUo7QUFFQXZCLElBQUFBLFVBQVUsQ0FBRUMsSUFBRCxJQUFVO0FBQ25CO0FBQ0EsVUFBSUMsT0FBTyxHQUFHO0FBQ1o7QUFDQUMsUUFBQUEsT0FBTyxFQUFFLEVBRkc7QUFHWkMsUUFBQUEsZ0JBQWdCLEVBQUU7QUFITixPQUFkO0FBTUFtQixNQUFBQSxjQUFjLEdBQUcsNkJBQVdyQixPQUFYLENBQWpCO0FBQ0FxQixNQUFBQSxjQUFjLENBQUNILE1BQWYsQ0FBc0J0QixJQUFJLEdBQUcsQ0FBN0IsRUFBZ0NHLElBQWhDO0FBQ0QsS0FWUyxDQUFWO0FBWUFvQixJQUFBQSxTQUFTLENBQUVwQixJQUFELElBQVU7QUFDbEJzQixNQUFBQSxjQUFjLENBQUNELEtBQWYsQ0FBcUJyQixJQUFyQjtBQUNELEtBRlEsQ0FBVDtBQUlBdUIsSUFBQUEsRUFBRSxDQUFDLGdDQUFELEVBQW1DLE1BQU07QUFDekMzQixNQUFBQSxJQUFJLEdBQUcsSUFBSTRCLFNBQUosQ0FBZSxXQUFmLEVBQTRCM0IsSUFBNUIsRUFBa0M7QUFDdkM0QixRQUFBQSxRQUFRLEVBQVJBLGdCQUR1QztBQUV2Q0MsUUFBQUEsSUFBSSxFQUFFO0FBQ0pDLFVBQUFBLElBQUksRUFBRSxVQURGO0FBRUpDLFVBQUFBLElBQUksRUFBRTtBQUZGLFNBRmlDO0FBTXZDQyxRQUFBQSxrQkFBa0IsRUFBRTtBQU5tQixPQUFsQyxDQUFQO0FBU0EsYUFBT2pDLElBQUksQ0FBQ2tDLE9BQUwsR0FBZUMsSUFBZixDQUFvQixNQUFNO0FBQy9CQyxRQUFBQSxNQUFNLENBQUNwQyxJQUFJLENBQUNxQyxNQUFMLENBQVlDLFVBQWIsQ0FBTixDQUErQkMsRUFBL0IsQ0FBa0NDLEVBQWxDLENBQXFDQyxJQUFyQztBQUNELE9BRk0sRUFFSk4sSUFGSSxDQUVDLE1BQU07QUFDWixlQUFPbkMsSUFBSSxDQUFDeUIsS0FBTCxFQUFQO0FBQ0QsT0FKTSxDQUFQO0FBS0QsS0FmQyxDQUFGO0FBaUJBRSxJQUFBQSxFQUFFLENBQUMsd0JBQUQsRUFBMkIsTUFBTTtBQUNqQzNCLE1BQUFBLElBQUksR0FBRyxJQUFJNEIsU0FBSixDQUFlLFdBQWYsRUFBNEIzQixJQUE1QixFQUFrQztBQUN2QzRCLFFBQUFBLFFBQVEsRUFBUkEsZ0JBRHVDO0FBRXZDQyxRQUFBQSxJQUFJLEVBQUU7QUFDSkMsVUFBQUEsSUFBSSxFQUFFLFVBREY7QUFFSkMsVUFBQUEsSUFBSSxFQUFFO0FBRkYsU0FGaUM7QUFNdkNDLFFBQUFBLGtCQUFrQixFQUFFLEtBTm1CO0FBT3ZDUyxRQUFBQSxTQUFTLEVBQUU7QUFQNEIsT0FBbEMsQ0FBUDtBQVVBLGFBQU8xQyxJQUFJLENBQUNrQyxPQUFMLEdBQWVDLElBQWYsQ0FBb0IsTUFBTTtBQUMvQkMsUUFBQUEsTUFBTSxDQUFDcEMsSUFBSSxDQUFDcUMsTUFBTCxDQUFZQyxVQUFiLENBQU4sQ0FBK0JDLEVBQS9CLENBQWtDQyxFQUFsQyxDQUFxQ0csS0FBckM7QUFDRCxPQUZNLEVBRUpSLElBRkksQ0FFQyxNQUFNO0FBQ1osZUFBT25DLElBQUksQ0FBQ3lCLEtBQUwsRUFBUDtBQUNELE9BSk0sQ0FBUDtBQUtELEtBaEJDLENBQUY7QUFrQkFFLElBQUFBLEVBQUUsQ0FBQyw2Q0FBRCxFQUFnRCxNQUFNO0FBQ3REM0IsTUFBQUEsSUFBSSxHQUFHLElBQUk0QixTQUFKLENBQWUsV0FBZixFQUE0QjNCLElBQUksR0FBRyxDQUFuQyxFQUFzQztBQUMzQzRCLFFBQUFBLFFBQVEsRUFBUkEsZ0JBRDJDO0FBRTNDQyxRQUFBQSxJQUFJLEVBQUU7QUFDSkMsVUFBQUEsSUFBSSxFQUFFLFVBREY7QUFFSkMsVUFBQUEsSUFBSSxFQUFFO0FBRkYsU0FGcUM7QUFNM0NDLFFBQUFBLGtCQUFrQixFQUFFLEtBTnVCO0FBTzNDVyxRQUFBQSxVQUFVLEVBQUU7QUFQK0IsT0FBdEMsQ0FBUDtBQVVBLGFBQU81QyxJQUFJLENBQUNrQyxPQUFMLEdBQWVXLEtBQWYsQ0FBc0JDLEdBQUQsSUFBUztBQUNuQ1YsUUFBQUEsTUFBTSxDQUFDVSxHQUFELENBQU4sQ0FBWVAsRUFBWixDQUFlUSxLQUFmO0FBQ0QsT0FGTSxDQUFQO0FBR0QsS0FkQyxDQUFGO0FBZ0JBcEIsSUFBQUEsRUFBRSxDQUFDLG1DQUFELEVBQXNDLE1BQU07QUFDNUMzQixNQUFBQSxJQUFJLEdBQUcsSUFBSTRCLFNBQUosQ0FBZSxXQUFmLEVBQTRCM0IsSUFBSSxHQUFHLENBQW5DLEVBQXNDO0FBQzNDNEIsUUFBQUEsUUFBUSxFQUFSQSxnQkFEMkM7QUFFM0NDLFFBQUFBLElBQUksRUFBRTtBQUNKQyxVQUFBQSxJQUFJLEVBQUUsVUFERjtBQUVKQyxVQUFBQSxJQUFJLEVBQUU7QUFGRixTQUZxQztBQU0zQ0MsUUFBQUEsa0JBQWtCLEVBQUU7QUFOdUIsT0FBdEMsQ0FBUDtBQVNBLGFBQU9qQyxJQUFJLENBQUNrQyxPQUFMLEdBQWVDLElBQWYsQ0FBb0IsTUFBTTtBQUMvQkMsUUFBQUEsTUFBTSxDQUFDcEMsSUFBSSxDQUFDcUMsTUFBTCxDQUFZQyxVQUFiLENBQU4sQ0FBK0JDLEVBQS9CLENBQWtDQyxFQUFsQyxDQUFxQ0csS0FBckM7QUFDRCxPQUZNLEVBRUpSLElBRkksQ0FFQyxNQUFNO0FBQ1osZUFBT25DLElBQUksQ0FBQ3lCLEtBQUwsRUFBUDtBQUNELE9BSk0sQ0FBUDtBQUtELEtBZkMsQ0FBRjtBQWlCQUUsSUFBQUEsRUFBRSxDQUFDLDRCQUFELEVBQWdDdkIsSUFBRCxJQUFVO0FBQ3pDSixNQUFBQSxJQUFJLEdBQUcsSUFBSTRCLFNBQUosQ0FBZSxXQUFmLEVBQTRCM0IsSUFBSSxHQUFHLENBQW5DLEVBQXNDO0FBQzNDNEIsUUFBQUEsUUFBUSxFQUFSQSxnQkFEMkM7QUFFM0NDLFFBQUFBLElBQUksRUFBRTtBQUNKQyxVQUFBQSxJQUFJLEVBQUUsU0FERjtBQUVKQyxVQUFBQSxJQUFJLEVBQUU7QUFGRixTQUZxQztBQU0zQ0MsUUFBQUEsa0JBQWtCLEVBQUU7QUFOdUIsT0FBdEMsQ0FBUDtBQVNBakMsTUFBQUEsSUFBSSxDQUFDa0MsT0FBTCxHQUFlQyxJQUFmLENBQW9CLE1BQU07QUFDeEJDLFFBQUFBLE1BQU0sQ0FBQ3BDLElBQUksQ0FBQ3FDLE1BQUwsQ0FBWUMsVUFBYixDQUFOLENBQStCQyxFQUEvQixDQUFrQ0MsRUFBbEMsQ0FBcUNHLEtBQXJDO0FBQ0QsT0FGRCxFQUVHRSxLQUZILENBRVMsTUFBTTtBQUFFekMsUUFBQUEsSUFBSTtBQUFJLE9BRnpCO0FBR0QsS0FiQyxDQUFGO0FBY0QsR0FyR08sQ0FBUjtBQXVHQUwsRUFBQUEsUUFBUSxDQUFDLGtCQUFELEVBQXFCLE1BQU07QUFDakNJLElBQUFBLFVBQVUsQ0FBQyxNQUFNO0FBQ2ZILE1BQUFBLElBQUksR0FBRyxJQUFJNEIsU0FBSixDQUFlLFdBQWYsRUFBNEIzQixJQUE1QixFQUFrQztBQUN2QzRCLFFBQUFBLFFBQVEsRUFBUkEsZ0JBRHVDO0FBRXZDQyxRQUFBQSxJQUFJLEVBQUU7QUFDSkMsVUFBQUEsSUFBSSxFQUFFLFVBREY7QUFFSkMsVUFBQUEsSUFBSSxFQUFFO0FBRkYsU0FGaUM7QUFNdkNDLFFBQUFBLGtCQUFrQixFQUFFO0FBTm1CLE9BQWxDLENBQVA7QUFTQSxhQUFPakMsSUFBSSxDQUFDa0MsT0FBTCxHQUFlQyxJQUFmLENBQW9CLE1BQU07QUFDL0IsZUFBT25DLElBQUksQ0FBQ2dELGFBQUwsQ0FBbUIsY0FBbkIsQ0FBUDtBQUNELE9BRk0sQ0FBUDtBQUdELEtBYlMsQ0FBVjtBQWVBeEIsSUFBQUEsU0FBUyxDQUFDLE1BQU07QUFDZCxhQUFPeEIsSUFBSSxDQUFDeUIsS0FBTCxFQUFQO0FBQ0QsS0FGUSxDQUFUO0FBSUExQixJQUFBQSxRQUFRLENBQUMsZ0JBQUQsRUFBbUIsTUFBTTtBQUMvQjRCLE1BQUFBLEVBQUUsQ0FBQyxnQkFBRCxFQUFtQixNQUFNO0FBQ3pCLGVBQU8zQixJQUFJLENBQUNpRCxhQUFMLEdBQXFCZCxJQUFyQixDQUEyQmUsU0FBRCxJQUFlO0FBQzlDZCxVQUFBQSxNQUFNLENBQUNjLFNBQUQsQ0FBTixDQUFrQlgsRUFBbEIsQ0FBcUJRLEtBQXJCO0FBQ0QsU0FGTSxDQUFQO0FBR0QsT0FKQyxDQUFGO0FBS0QsS0FOTyxDQUFSO0FBUUFoRCxJQUFBQSxRQUFRLENBQUMsZUFBRCxFQUFrQixNQUFNO0FBQzlCNEIsTUFBQUEsRUFBRSxDQUFDLGdCQUFELEVBQW1CLE1BQU07QUFDekIsZUFBTzNCLElBQUksQ0FBQ21ELFlBQUwsQ0FBa0IsT0FBbEIsRUFBMkIsS0FBM0IsRUFBa0MsQ0FBQyxLQUFELEVBQVEsT0FBUixFQUFpQixVQUFqQixFQUE2QixlQUE3QixFQUE4QyxhQUE5QyxDQUFsQyxFQUFnR2hCLElBQWhHLENBQXNHekIsUUFBRCxJQUFjO0FBQ3hIMEIsVUFBQUEsTUFBTSxDQUFDMUIsUUFBRCxDQUFOLENBQWlCNkIsRUFBakIsQ0FBb0JhLEdBQXBCLENBQXdCWixFQUF4QixDQUEyQmEsS0FBM0I7QUFDRCxTQUZNLENBQVA7QUFHRCxPQUpDLENBQUY7QUFLRCxLQU5PLENBQVI7QUFRQXRELElBQUFBLFFBQVEsQ0FBQyxTQUFELEVBQVksTUFBTTtBQUN4QjRCLE1BQUFBLEVBQUUsQ0FBQyxnQkFBRCxFQUFtQixNQUFNO0FBQ3pCLFlBQUkyQixRQUFKO0FBRUEsZUFBT3RELElBQUksQ0FBQ21ELFlBQUwsQ0FBa0IsT0FBbEIsRUFBMkIsS0FBM0IsRUFBa0MsQ0FBQyxLQUFELEVBQVEsT0FBUixFQUFpQixVQUFqQixFQUE2QixlQUE3QixDQUFsQyxFQUFpRmhCLElBQWpGLENBQXVGekIsUUFBRCxJQUFjO0FBQ3pHMEIsVUFBQUEsTUFBTSxDQUFDMUIsUUFBRCxDQUFOLENBQWlCNkIsRUFBakIsQ0FBb0JhLEdBQXBCLENBQXdCWixFQUF4QixDQUEyQmEsS0FBM0I7QUFDQUMsVUFBQUEsUUFBUSxHQUFHNUMsUUFBUSxDQUFDNkMsTUFBcEI7QUFDRCxTQUhNLEVBR0pwQixJQUhJLENBR0MsTUFBTTtBQUNaLGlCQUFPbkMsSUFBSSxDQUFDd0QsTUFBTCxDQUFZLE9BQVosRUFBcUIsMFRBQXJCLEVBQWlWO0FBQ3RWNUMsWUFBQUEsS0FBSyxFQUFFLENBQUMsUUFBRCxFQUFXLFlBQVgsRUFBeUIsV0FBekI7QUFEK1UsV0FBalYsQ0FBUDtBQUdELFNBUE0sRUFPSnVCLElBUEksQ0FPQyxNQUFNO0FBQ1osaUJBQU9uQyxJQUFJLENBQUNtRCxZQUFMLENBQWtCLE9BQWxCLEVBQTJCLEtBQTNCLEVBQWtDLENBQUMsS0FBRCxFQUFRLE9BQVIsRUFBaUIsVUFBakIsRUFBNkIsZUFBN0IsQ0FBbEMsQ0FBUDtBQUNELFNBVE0sRUFTSmhCLElBVEksQ0FTRXpCLFFBQUQsSUFBYztBQUNwQjBCLFVBQUFBLE1BQU0sQ0FBQzFCLFFBQVEsQ0FBQzZDLE1BQVYsQ0FBTixDQUF3QmhCLEVBQXhCLENBQTJCa0IsS0FBM0IsQ0FBaUNILFFBQVEsR0FBRyxDQUE1QztBQUNELFNBWE0sQ0FBUDtBQVlELE9BZkMsQ0FBRjtBQWdCRCxLQWpCTyxDQUFSO0FBbUJBdkQsSUFBQUEsUUFBUSxDQUFDLFNBQUQsRUFBWSxNQUFNO0FBQ3hCNEIsTUFBQUEsRUFBRSxDQUFDLGlDQUFELEVBQW9DLE1BQU07QUFDMUMsZUFBTzNCLElBQUksQ0FBQzBELE1BQUwsQ0FBWSxPQUFaLEVBQXFCO0FBQzFCQyxVQUFBQSxNQUFNLEVBQUUsQ0FBQyxTQUFELEVBQVksU0FBWjtBQURrQixTQUFyQixFQUVKeEIsSUFGSSxDQUVFeUIsTUFBRCxJQUFZO0FBQ2xCeEIsVUFBQUEsTUFBTSxDQUFDd0IsTUFBRCxDQUFOLENBQWVyQixFQUFmLENBQWtCc0IsSUFBbEIsQ0FBdUJKLEtBQXZCLENBQTZCLENBQUMsQ0FBRCxDQUE3QjtBQUNELFNBSk0sQ0FBUDtBQUtELE9BTkMsQ0FBRjtBQVFBOUIsTUFBQUEsRUFBRSxDQUFDLHNCQUFELEVBQXlCLE1BQU07QUFDL0IsZUFBTzNCLElBQUksQ0FBQzBELE1BQUwsQ0FBWSxPQUFaLEVBQXFCO0FBQzFCQyxVQUFBQSxNQUFNLEVBQUUsQ0FBQyxTQUFELEVBQVksU0FBWjtBQURrQixTQUFyQixFQUVKO0FBQ0RHLFVBQUFBLEtBQUssRUFBRTtBQUROLFNBRkksRUFJSjNCLElBSkksQ0FJRXlCLE1BQUQsSUFBWTtBQUNsQnhCLFVBQUFBLE1BQU0sQ0FBQ3dCLE1BQUQsQ0FBTixDQUFlckIsRUFBZixDQUFrQnNCLElBQWxCLENBQXVCSixLQUF2QixDQUE2QixDQUFDLEdBQUQsQ0FBN0I7QUFDRCxTQU5NLENBQVA7QUFPRCxPQVJDLENBQUY7QUFVQTlCLE1BQUFBLEVBQUUsQ0FBQyxrQ0FBRCxFQUFxQyxNQUFNO0FBQzNDLGVBQU8zQixJQUFJLENBQUMwRCxNQUFMLENBQVksT0FBWixFQUFxQjtBQUMxQkMsVUFBQUEsTUFBTSxFQUFFLENBQUMsU0FBRCxFQUFZLE9BQVosQ0FEa0I7QUFFMUJJLFVBQUFBLElBQUksRUFBRTtBQUZvQixTQUFyQixFQUdKNUIsSUFISSxDQUdFeUIsTUFBRCxJQUFZO0FBQ2xCeEIsVUFBQUEsTUFBTSxDQUFDd0IsTUFBRCxDQUFOLENBQWVyQixFQUFmLENBQWtCc0IsSUFBbEIsQ0FBdUJKLEtBQXZCLENBQTZCLENBQUMsQ0FBRCxDQUE3QjtBQUNELFNBTE0sQ0FBUDtBQU1ELE9BUEMsQ0FBRjtBQVFELEtBM0JPLENBQVI7QUE2QkExRCxJQUFBQSxRQUFRLENBQUMsV0FBRCxFQUFjLE1BQU07QUFDMUI0QixNQUFBQSxFQUFFLENBQUMsZ0NBQUQsRUFBbUMsTUFBTTtBQUN6QyxlQUFPM0IsSUFBSSxDQUFDZ0UsUUFBTCxDQUFjLE9BQWQsRUFBdUIsR0FBdkIsRUFBNEIsQ0FBQyxRQUFELEVBQVcsU0FBWCxDQUE1QixFQUFtRDdCLElBQW5ELENBQXlEeUIsTUFBRCxJQUFZO0FBQ3pFeEIsVUFBQUEsTUFBTSxDQUFDd0IsTUFBRCxDQUFOLENBQWVyQixFQUFmLENBQWtCc0IsSUFBbEIsQ0FBdUJKLEtBQXZCLENBQTZCLENBQUM7QUFDNUIsaUJBQUssQ0FEdUI7QUFFNUI3QyxZQUFBQSxLQUFLLEVBQUUsQ0FBQyxRQUFELEVBQVcsU0FBWDtBQUZxQixXQUFELENBQTdCO0FBSUQsU0FMTSxDQUFQO0FBTUQsT0FQQyxDQUFGO0FBU0FlLE1BQUFBLEVBQUUsQ0FBQywrQkFBRCxFQUFrQyxNQUFNO0FBQ3hDLGVBQU8zQixJQUFJLENBQUNnRSxRQUFMLENBQWMsT0FBZCxFQUF1QixHQUF2QixFQUE0QjtBQUNqQ0MsVUFBQUEsR0FBRyxFQUFFLENBQUMsU0FBRDtBQUQ0QixTQUE1QixFQUVKOUIsSUFGSSxDQUVFeUIsTUFBRCxJQUFZO0FBQ2xCeEIsVUFBQUEsTUFBTSxDQUFDd0IsTUFBRCxDQUFOLENBQWVyQixFQUFmLENBQWtCc0IsSUFBbEIsQ0FBdUJKLEtBQXZCLENBQTZCLENBQUM7QUFDNUIsaUJBQUssQ0FEdUI7QUFFNUI3QyxZQUFBQSxLQUFLLEVBQUUsQ0FBQyxRQUFELEVBQVcsU0FBWDtBQUZxQixXQUFELENBQTdCO0FBSUQsU0FQTSxDQUFQO0FBUUQsT0FUQyxDQUFGO0FBV0FlLE1BQUFBLEVBQUUsQ0FBQyxvQ0FBRCxFQUF1QyxNQUFNO0FBQzdDLGVBQU8zQixJQUFJLENBQUNnRSxRQUFMLENBQWMsT0FBZCxFQUF1QixLQUF2QixFQUE4QjtBQUNuQ0UsVUFBQUEsTUFBTSxFQUFFLENBQUMsV0FBRDtBQUQyQixTQUE5QixFQUVKO0FBQ0RKLFVBQUFBLEtBQUssRUFBRTtBQUROLFNBRkksRUFJSjNCLElBSkksQ0FJRXlCLE1BQUQsSUFBWTtBQUNsQnhCLFVBQUFBLE1BQU0sQ0FBQ3dCLE1BQUQsQ0FBTixDQUFlckIsRUFBZixDQUFrQnNCLElBQWxCLENBQXVCSixLQUF2QixDQUE2QixDQUFDO0FBQzVCLGlCQUFLLENBRHVCO0FBRTVCN0MsWUFBQUEsS0FBSyxFQUFFLENBQUMsU0FBRCxDQUZxQjtBQUc1QkMsWUFBQUEsR0FBRyxFQUFFO0FBSHVCLFdBQUQsQ0FBN0I7QUFLRCxTQVZNLENBQVA7QUFXRCxPQVpDLENBQUY7QUFjQWMsTUFBQUEsRUFBRSxDQUFDLDJDQUFELEVBQThDLE1BQU07QUFDcEQsZUFBTzNCLElBQUksQ0FBQ2dFLFFBQUwsQ0FBYyxPQUFkLEVBQXVCLEdBQXZCLEVBQTRCLENBQUMsVUFBRCxDQUE1QixFQUEwQztBQUMvQ0csVUFBQUEsTUFBTSxFQUFFO0FBRHVDLFNBQTFDLEVBRUpoQyxJQUZJLENBRUV5QixNQUFELElBQVk7QUFDbEJ4QixVQUFBQSxNQUFNLENBQUN3QixNQUFELENBQU4sQ0FBZXJCLEVBQWYsQ0FBa0JzQixJQUFsQixDQUF1QkosS0FBdkIsQ0FBNkIsRUFBN0I7QUFDRCxTQUpNLENBQVA7QUFLRCxPQU5DLENBQUY7QUFPRCxLQTFDTyxDQUFSO0FBNENBMUQsSUFBQUEsUUFBUSxDQUFDLFFBQUQsRUFBVyxNQUFNO0FBQ3ZCNEIsTUFBQUEsRUFBRSxDQUFDLGlDQUFELEVBQW9DLE1BQU07QUFDMUMsZUFBTzNCLElBQUksQ0FBQ29FLEtBQUwsQ0FBVyxPQUFYLEVBQW9CLEdBQXBCLEVBQXlCLGNBQXpCLEVBQXlDLENBQUMsUUFBRCxFQUFXLFFBQVgsQ0FBekMsRUFBK0RqQyxJQUEvRCxDQUFxRXlCLE1BQUQsSUFBWTtBQUNyRnhCLFVBQUFBLE1BQU0sQ0FBQ3dCLE1BQUQsQ0FBTixDQUFlckIsRUFBZixDQUFrQnNCLElBQWxCLENBQXVCSixLQUF2QixDQUE2QixDQUFDO0FBQzVCLGlCQUFLLENBRHVCO0FBRTVCLDJCQUFlLENBQUMsU0FBRCxFQUFZLFFBQVosRUFBc0IsUUFBdEI7QUFGYSxXQUFELENBQTdCO0FBSUQsU0FMTSxDQUFQO0FBTUQsT0FQQyxDQUFGO0FBU0E5QixNQUFBQSxFQUFFLENBQUMsaUNBQUQsRUFBb0MsTUFBTTtBQUMxQyxlQUFPM0IsSUFBSSxDQUFDb0UsS0FBTCxDQUFXLE9BQVgsRUFBb0IsR0FBcEIsRUFBeUIsYUFBekIsRUFBd0MsQ0FBQyxRQUFELEVBQVcsUUFBWCxDQUF4QyxFQUE4RGpDLElBQTlELENBQW9FeUIsTUFBRCxJQUFZO0FBQ3BGeEIsVUFBQUEsTUFBTSxDQUFDd0IsTUFBRCxDQUFOLENBQWVyQixFQUFmLENBQWtCc0IsSUFBbEIsQ0FBdUJKLEtBQXZCLENBQTZCLENBQUM7QUFDNUIsaUJBQUssQ0FEdUI7QUFFNUIsMkJBQWUsQ0FBQyxRQUFELEVBQVcsUUFBWDtBQUZhLFdBQUQsQ0FBN0I7QUFJRCxTQUxNLENBQVA7QUFNRCxPQVBDLENBQUY7QUFTQTlCLE1BQUFBLEVBQUUsQ0FBQyxxQ0FBRCxFQUF3QyxNQUFNO0FBQzlDLGVBQU8zQixJQUFJLENBQUNvRSxLQUFMLENBQVcsT0FBWCxFQUFvQixHQUFwQixFQUF5QixjQUF6QixFQUF5QyxDQUFDLFFBQUQsRUFBVyxTQUFYLENBQXpDLEVBQWdFakMsSUFBaEUsQ0FBc0V5QixNQUFELElBQVk7QUFDdEZ4QixVQUFBQSxNQUFNLENBQUN3QixNQUFELENBQU4sQ0FBZXJCLEVBQWYsQ0FBa0JzQixJQUFsQixDQUF1QkosS0FBdkIsQ0FBNkIsQ0FBQztBQUM1QixpQkFBSyxDQUR1QjtBQUU1QiwyQkFBZTtBQUZhLFdBQUQsQ0FBN0I7QUFJRCxTQUxNLENBQVA7QUFNRCxPQVBDLENBQUY7QUFRRCxLQTNCTyxDQUFSO0FBNkJBMUQsSUFBQUEsUUFBUSxDQUFDLGlCQUFELEVBQW9CLE1BQU07QUFDaEM0QixNQUFBQSxFQUFFLENBQUMseUJBQUQsRUFBNEIsTUFBTTtBQUNsQyxZQUFJMEMsV0FBSjtBQUVBLFlBQUlDLGVBQWUsR0FBRyxJQUFJQyxPQUFKLENBQVksQ0FBQ0MsT0FBRCxFQUFVQyxNQUFWLEtBQXFCO0FBQ3JEekUsVUFBQUEsSUFBSSxDQUFDMEUsUUFBTCxHQUFnQixVQUFVQyxFQUFWLEVBQWNDO0FBQUs7QUFBbkIsWUFBZ0M7QUFDOUMsZ0JBQUk7QUFDRnhDLGNBQUFBLE1BQU0sQ0FBQ3VDLEVBQUQsQ0FBTixDQUFXcEMsRUFBWCxDQUFja0IsS0FBZCxDQUFvQixPQUFwQjtBQUNBckIsY0FBQUEsTUFBTSxDQUFDd0MsSUFBRCxDQUFOLENBQWFyQyxFQUFiLENBQWdCa0IsS0FBaEIsQ0FBc0IsU0FBdEI7QUFDQWUsY0FBQUEsT0FBTztBQUNSLGFBSkQsQ0FJRSxPQUFPMUIsR0FBUCxFQUFZO0FBQ1oyQixjQUFBQSxNQUFNLENBQUMzQixHQUFELENBQU47QUFDRDtBQUNGLFdBUkQ7QUFTRCxTQVZxQixDQUF0QjtBQVlBLGVBQU85QyxJQUFJLENBQUNnRCxhQUFMLENBQW1CLE9BQW5CLEVBQTRCYixJQUE1QixDQUFrQzBDLElBQUQsSUFBVTtBQUNoRFIsVUFBQUEsV0FBVyxHQUFHUSxJQUFkO0FBQ0EsaUJBQU83RSxJQUFJLENBQUM4RSxjQUFMLENBQW9CLE9BQXBCLEVBQTZCLEdBQTdCLEVBQWtDO0FBQ3ZDaEIsWUFBQUEsS0FBSyxFQUFFO0FBRGdDLFdBQWxDLENBQVA7QUFHRCxTQUxNLEVBS0ozQixJQUxJLENBS0MsTUFBTTtBQUNaLGlCQUFPbkMsSUFBSSxDQUFDZ0QsYUFBTCxDQUFtQixPQUFuQixDQUFQO0FBQ0QsU0FQTSxFQU9KYixJQVBJLENBT0U0QyxVQUFELElBQWdCO0FBQ3RCM0MsVUFBQUEsTUFBTSxDQUFDaUMsV0FBVyxDQUFDVyxNQUFaLEdBQXFCLENBQXJCLEtBQTJCRCxVQUFVLENBQUNDLE1BQXZDLENBQU4sQ0FBcUR6QyxFQUFyRCxDQUF3REMsRUFBeEQsQ0FBMkRDLElBQTNEO0FBQ0QsU0FUTSxFQVNKTixJQVRJLENBU0MsTUFBTW1DLGVBVFAsQ0FBUDtBQVVELE9BekJDLENBQUY7QUEwQkQsS0EzQk8sQ0FBUjtBQTZCQXZFLElBQUFBLFFBQVEsQ0FBQyxlQUFELEVBQWtCLE1BQU07QUFDOUI0QixNQUFBQSxFQUFFLENBQUMsdUJBQUQsRUFBMEIsTUFBTTtBQUNoQyxlQUFPM0IsSUFBSSxDQUFDaUYsWUFBTCxDQUFrQixPQUFsQixFQUEyQixHQUEzQixFQUFnQyxlQUFoQyxFQUFpRDtBQUN0RG5CLFVBQUFBLEtBQUssRUFBRTtBQUQrQyxTQUFqRCxFQUVKM0IsSUFGSSxDQUVDLE1BQU07QUFDWixpQkFBT25DLElBQUksQ0FBQ2dELGFBQUwsQ0FBbUIsZUFBbkIsQ0FBUDtBQUNELFNBSk0sRUFJSmIsSUFKSSxDQUlFMEMsSUFBRCxJQUFVO0FBQ2hCekMsVUFBQUEsTUFBTSxDQUFDeUMsSUFBSSxDQUFDRyxNQUFOLENBQU4sQ0FBb0J6QyxFQUFwQixDQUF1QmtCLEtBQXZCLENBQTZCLENBQTdCO0FBQ0QsU0FOTSxDQUFQO0FBT0QsT0FSQyxDQUFGO0FBU0QsS0FWTyxDQUFSO0FBWUExRCxJQUFBQSxRQUFRLENBQUMsZUFBRCxFQUFrQixNQUFNO0FBQzlCNEIsTUFBQUEsRUFBRSxDQUFDLHVCQUFELEVBQTBCLE1BQU07QUFDaEMsWUFBSTBDLFdBQUo7QUFDQSxlQUFPckUsSUFBSSxDQUFDZ0QsYUFBTCxDQUFtQixPQUFuQixFQUE0QmIsSUFBNUIsQ0FBa0MwQyxJQUFELElBQVU7QUFDaERSLFVBQUFBLFdBQVcsR0FBR1EsSUFBZDtBQUNBLGlCQUFPN0UsSUFBSSxDQUFDa0YsWUFBTCxDQUFrQixPQUFsQixFQUEyQixHQUEzQixFQUFnQyxjQUFoQyxFQUFnRDtBQUNyRHBCLFlBQUFBLEtBQUssRUFBRTtBQUQ4QyxXQUFoRCxDQUFQO0FBR0QsU0FMTSxFQUtKM0IsSUFMSSxDQUtDLE1BQU07QUFDWixpQkFBT25DLElBQUksQ0FBQ2dELGFBQUwsQ0FBbUIsY0FBbkIsQ0FBUDtBQUNELFNBUE0sRUFPSmIsSUFQSSxDQU9FMEMsSUFBRCxJQUFVO0FBQ2hCekMsVUFBQUEsTUFBTSxDQUFDeUMsSUFBSSxDQUFDRyxNQUFOLENBQU4sQ0FBb0J6QyxFQUFwQixDQUF1QmtCLEtBQXZCLENBQTZCLENBQTdCO0FBQ0EsaUJBQU96RCxJQUFJLENBQUNnRCxhQUFMLENBQW1CLE9BQW5CLENBQVA7QUFDRCxTQVZNLEVBVUpiLElBVkksQ0FVRTRDLFVBQUQsSUFBZ0I7QUFDdEIzQyxVQUFBQSxNQUFNLENBQUNpQyxXQUFXLENBQUNXLE1BQWIsQ0FBTixDQUEyQnpDLEVBQTNCLENBQThCYSxHQUE5QixDQUFrQ0ssS0FBbEMsQ0FBd0NzQixVQUFVLENBQUNDLE1BQW5EO0FBQ0QsU0FaTSxDQUFQO0FBYUQsT0FmQyxDQUFGO0FBZ0JELEtBakJPLENBQVI7QUFtQkFqRixJQUFBQSxRQUFRLENBQUMsVUFBRCxFQUFhLE1BQU07QUFDekI0QixNQUFBQSxFQUFFLENBQUMsd0NBQUQsRUFBMkMsTUFBTTtBQUNqRDtBQUNBLFlBQUkrQixNQUFNLEdBQUcsQ0FBQ3lCLEtBQUQsRUFBUTlFLE9BQU8sR0FBRyxFQUFsQixLQUF5QjtBQUNwQyxjQUFJK0UsT0FBTyxHQUFHLHdDQUFtQkQsS0FBbkIsRUFBMEI5RSxPQUExQixDQUFkO0FBQ0EsaUJBQU9MLElBQUksQ0FBQ3FGLElBQUwsQ0FBVUQsT0FBVixFQUFtQixRQUFuQixFQUE2QjtBQUNsQ0UsWUFBQUEsUUFBUSxFQUFFLE1BQU1mLE9BQU8sQ0FBQ0UsTUFBUixDQUFlLElBQUljLEtBQUosQ0FBVSxLQUFWLENBQWY7QUFEa0IsV0FBN0IsRUFFSnBELElBRkksQ0FFRXFELFFBQUQsSUFBYyxnQ0FBWUEsUUFBWixDQUZmLENBQVA7QUFHRCxTQUxEOztBQU9BLGVBQU94RixJQUFJLENBQUNnRCxhQUFMLENBQW1CLE9BQW5CLEVBQ0piLElBREksQ0FDQyxNQUFNdUIsTUFBTSxDQUFDO0FBQUVDLFVBQUFBLE1BQU0sRUFBRSxDQUFDLFNBQUQsRUFBWSxTQUFaO0FBQVYsU0FBRCxDQURiLEVBRUpkLEtBRkksQ0FFR0MsR0FBRCxJQUFTO0FBQ2RWLFVBQUFBLE1BQU0sQ0FBQ1UsR0FBRyxDQUFDMkMsT0FBTCxDQUFOLENBQW9CbEQsRUFBcEIsQ0FBdUJrQixLQUF2QixDQUE2QixLQUE3QjtBQUNBLGlCQUFPekQsSUFBSSxDQUFDZ0QsYUFBTCxDQUFtQixjQUFuQixDQUFQO0FBQ0QsU0FMSSxDQUFQO0FBTUQsT0FmQyxDQUFGO0FBaUJBckIsTUFBQUEsRUFBRSxDQUFDLGtFQUFELEVBQXFFLE1BQU07QUFDM0UsZUFBTzNCLElBQUksQ0FBQ2dELGFBQUwsQ0FBbUIsV0FBbkIsRUFBZ0NiLElBQWhDLENBQXFDLE1BQU07QUFDaEQsaUJBQU9vQyxPQUFPLENBQUNtQixHQUFSLENBQVksQ0FDakIxRixJQUFJLENBQUNnRCxhQUFMLENBQW1CLFdBQW5CLENBRGlCLEVBRWpCaEQsSUFBSSxDQUFDZ0UsUUFBTCxDQUFjLFdBQWQsRUFBMkIsR0FBM0IsRUFBZ0MsQ0FBQyxRQUFELENBQWhDLENBRmlCLENBQVosQ0FBUDtBQUlELFNBTE0sRUFLSjdCLElBTEksQ0FLQyxNQUFNO0FBQ1osaUJBQU9uQyxJQUFJLENBQUNtRCxZQUFMLENBQWtCLFdBQWxCLEVBQStCLEtBQS9CLEVBQXNDLENBQUMsT0FBRCxDQUF0QyxDQUFQO0FBQ0QsU0FQTSxFQU9KaEIsSUFQSSxDQU9FekIsUUFBRCxJQUFjO0FBQ3BCMEIsVUFBQUEsTUFBTSxDQUFDMUIsUUFBUSxDQUFDNkMsTUFBVixDQUFOLENBQXdCaEIsRUFBeEIsQ0FBMkJrQixLQUEzQixDQUFpQyxDQUFqQztBQUNBckIsVUFBQUEsTUFBTSxDQUFDMUIsUUFBUSxDQUFDLENBQUQsQ0FBUixDQUFZRSxLQUFiLENBQU4sQ0FBMEIyQixFQUExQixDQUE2QnNCLElBQTdCLENBQWtDSixLQUFsQyxDQUF3QyxDQUFDLFFBQUQsQ0FBeEM7QUFDRCxTQVZNLENBQVA7QUFXRCxPQVpDLENBQUY7QUFjQTlCLE1BQUFBLEVBQUUsQ0FBQyxvRUFBRCxFQUF1RSxNQUFNO0FBQzdFLGVBQU80QyxPQUFPLENBQUNtQixHQUFSLENBQVksQ0FDakIxRixJQUFJLENBQUNnRSxRQUFMLENBQWMsV0FBZCxFQUEyQixHQUEzQixFQUFnQyxDQUFDLFFBQUQsQ0FBaEMsQ0FEaUIsRUFFakJoRSxJQUFJLENBQUNnRSxRQUFMLENBQWMsV0FBZCxFQUEyQixHQUEzQixFQUFnQyxDQUFDLFFBQUQsQ0FBaEMsQ0FGaUIsQ0FBWixFQUdKN0IsSUFISSxDQUdDLE1BQU07QUFDWixpQkFBT25DLElBQUksQ0FBQ21ELFlBQUwsQ0FBa0IsV0FBbEIsRUFBK0IsS0FBL0IsRUFBc0MsQ0FBQyxPQUFELENBQXRDLENBQVA7QUFDRCxTQUxNLEVBS0poQixJQUxJLENBS0V6QixRQUFELElBQWM7QUFDcEIwQixVQUFBQSxNQUFNLENBQUMxQixRQUFRLENBQUM2QyxNQUFWLENBQU4sQ0FBd0JoQixFQUF4QixDQUEyQmtCLEtBQTNCLENBQWlDLENBQWpDO0FBQ0FyQixVQUFBQSxNQUFNLENBQUMxQixRQUFRLENBQUMsQ0FBRCxDQUFSLENBQVlFLEtBQWIsQ0FBTixDQUEwQjJCLEVBQTFCLENBQTZCc0IsSUFBN0IsQ0FBa0NKLEtBQWxDLENBQXdDLENBQUMsUUFBRCxDQUF4QztBQUNELFNBUk0sRUFRSnRCLElBUkksQ0FRQyxNQUFNO0FBQ1osaUJBQU9uQyxJQUFJLENBQUNtRCxZQUFMLENBQWtCLFdBQWxCLEVBQStCLEtBQS9CLEVBQXNDLENBQUMsT0FBRCxDQUF0QyxDQUFQO0FBQ0QsU0FWTSxFQVVKaEIsSUFWSSxDQVVFekIsUUFBRCxJQUFjO0FBQ3BCMEIsVUFBQUEsTUFBTSxDQUFDMUIsUUFBUSxDQUFDNkMsTUFBVixDQUFOLENBQXdCaEIsRUFBeEIsQ0FBMkJrQixLQUEzQixDQUFpQyxDQUFqQztBQUNBckIsVUFBQUEsTUFBTSxDQUFDMUIsUUFBUSxDQUFDLENBQUQsQ0FBUixDQUFZRSxLQUFiLENBQU4sQ0FBMEIyQixFQUExQixDQUE2QnNCLElBQTdCLENBQWtDSixLQUFsQyxDQUF3QyxDQUFDLFFBQUQsQ0FBeEM7QUFDRCxTQWJNLENBQVA7QUFjRCxPQWZDLENBQUY7QUFnQkQsS0FoRE8sQ0FBUjtBQWlERCxHQTFRTyxDQUFSO0FBNFFBMUQsRUFBQUEsUUFBUSxDQUFDLFNBQUQsRUFBWSxNQUFNO0FBQ3hCSSxJQUFBQSxVQUFVLENBQUMsTUFBTTtBQUNmSCxNQUFBQSxJQUFJLEdBQUcsSUFBSTRCLFNBQUosQ0FBZSxXQUFmLEVBQTRCM0IsSUFBNUIsRUFBa0M7QUFDdkM0QixRQUFBQSxRQUFRLEVBQVJBLGdCQUR1QztBQUV2Q0MsUUFBQUEsSUFBSSxFQUFFO0FBQ0pDLFVBQUFBLElBQUksRUFBRSxVQURGO0FBRUpDLFVBQUFBLElBQUksRUFBRTtBQUZGLFNBRmlDO0FBTXZDQyxRQUFBQSxrQkFBa0IsRUFBRTtBQU5tQixPQUFsQyxDQUFQO0FBU0EsYUFBT2pDLElBQUksQ0FBQ2tDLE9BQUwsR0FDSkMsSUFESSxDQUNDLE1BQU07QUFDVjtBQUNBbkMsUUFBQUEsSUFBSSxDQUFDcUMsTUFBTCxDQUFZc0QsdUJBQVosR0FBc0MsRUFBdEM7QUFDQTNGLFFBQUFBLElBQUksQ0FBQ3FDLE1BQUwsQ0FBWXVELHVCQUFaLEdBQXNDLENBQXRDOztBQUNBNUYsUUFBQUEsSUFBSSxDQUFDcUMsTUFBTCxDQUFZd0QsTUFBWixDQUFtQkMsTUFBbkIsR0FBNEIsTUFBTSxDQUFHLENBQXJDO0FBQ0QsT0FOSSxDQUFQO0FBT0QsS0FqQlMsQ0FBVjtBQW1CQW5FLElBQUFBLEVBQUUsQ0FBQyxnQkFBRCxFQUFvQnZCLElBQUQsSUFBVTtBQUM3QkosTUFBQUEsSUFBSSxDQUFDK0YsT0FBTCxHQUFlLE1BQU07QUFBRTNGLFFBQUFBLElBQUk7QUFBSSxPQUEvQjs7QUFDQUosTUFBQUEsSUFBSSxDQUFDZ0QsYUFBTCxDQUFtQixPQUFuQixFQUE0QkgsS0FBNUIsQ0FBa0MsTUFBTSxDQUFFLENBQTFDO0FBQ0QsS0FIQyxDQUFGO0FBS0FsQixJQUFBQSxFQUFFLENBQUMsK0NBQUQsRUFBa0QsTUFBTTtBQUN4RCxVQUFJcUUsY0FBYyxHQUFHLENBQXJCO0FBQ0EsYUFBT3pCLE9BQU8sQ0FBQ21CLEdBQVIsQ0FBWSxDQUNqQjFGLElBQUksQ0FBQ2dELGFBQUwsQ0FBbUIsT0FBbkIsRUFDR0gsS0FESCxDQUNTQyxHQUFHLElBQUk7QUFDWlYsUUFBQUEsTUFBTSxDQUFDVSxHQUFELENBQU4sQ0FBWVAsRUFBWixDQUFlUSxLQUFmO0FBQ0FpRCxRQUFBQSxjQUFjO0FBQ2YsT0FKSCxDQURpQixFQU1qQmhHLElBQUksQ0FBQ21ELFlBQUwsQ0FBa0IsT0FBbEIsRUFBMkIsS0FBM0IsRUFBa0MsQ0FBQyxhQUFELENBQWxDLEVBQ0dOLEtBREgsQ0FDU0MsR0FBRyxJQUFJO0FBQ1pWLFFBQUFBLE1BQU0sQ0FBQ1UsR0FBRCxDQUFOLENBQVlQLEVBQVosQ0FBZVEsS0FBZjtBQUNBaUQsUUFBQUEsY0FBYztBQUNmLE9BSkgsQ0FOaUIsQ0FBWixFQVlKN0QsSUFaSSxDQVlDLE1BQU07QUFDWkMsUUFBQUEsTUFBTSxDQUFDNEQsY0FBRCxDQUFOLENBQXVCekQsRUFBdkIsQ0FBMEJrQixLQUExQixDQUFnQyxDQUFoQztBQUNELE9BZE0sQ0FBUDtBQWVELEtBakJDLENBQUY7QUFrQkQsR0EzQ08sQ0FBUjtBQTRDRCxDQXBkTyxDQUFSIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLWV4cHJlc3Npb25zICovXG5cbmltcG9ydCBob29kaWVjcm93IGZyb20gJ2hvb2RpZWNyb3ctaW1hcCdcbmltcG9ydCBJbWFwQ2xpZW50LCB7IExPR19MRVZFTF9OT05FIGFzIGxvZ0xldmVsIH0gZnJvbSAnLi4nXG5pbXBvcnQgeyBwYXJzZVNFQVJDSCB9IGZyb20gJy4vY29tbWFuZC1wYXJzZXInXG5pbXBvcnQgeyBidWlsZFNFQVJDSENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmQtYnVpbGRlcidcblxucHJvY2Vzcy5lbnYuTk9ERV9UTFNfUkVKRUNUX1VOQVVUSE9SSVpFRCA9ICcwJ1xuXG5kZXNjcmliZSgnYnJvd3NlcmJveCBpbnRlZ3JhdGlvbiB0ZXN0cycsICgpID0+IHtcbiAgbGV0IGltYXBcbiAgY29uc3QgcG9ydCA9IDEwMDAwXG4gIGxldCBzZXJ2ZXJcblxuICBiZWZvcmVFYWNoKChkb25lKSA9PiB7XG4gICAgLy8gc3RhcnQgaW1hcCB0ZXN0IHNlcnZlclxuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgLy8gZGVidWc6IHRydWUsXG4gICAgICBwbHVnaW5zOiBbJ1NUQVJUVExTJywgJ1gtR00tRVhULTEnXSxcbiAgICAgIHNlY3VyZUNvbm5lY3Rpb246IGZhbHNlLFxuICAgICAgc3RvcmFnZToge1xuICAgICAgICBJTkJPWDoge1xuICAgICAgICAgIG1lc3NhZ2VzOiBbXG4gICAgICAgICAgICB7IHJhdzogJ1N1YmplY3Q6IGhlbGxvIDFcXHJcXG5cXHJcXG5Xb3JsZCAxIScgfSxcbiAgICAgICAgICAgIHsgcmF3OiAnU3ViamVjdDogaGVsbG8gMlxcclxcblxcclxcbldvcmxkIDIhJywgZmxhZ3M6IFsnXFxcXFNlZW4nXSB9LFxuICAgICAgICAgICAgeyByYXc6ICdTdWJqZWN0OiBoZWxsbyAzXFxyXFxuXFxyXFxuV29ybGQgMyEnLCB1aWQ6IDU1NSB9LFxuICAgICAgICAgICAgeyByYXc6ICdGcm9tOiBzZW5kZXIgbmFtZSA8c2VuZGVyQGV4YW1wbGUuY29tPlxcclxcblRvOiBSZWNlaXZlciBuYW1lIDxyZWNlaXZlckBleGFtcGxlLmNvbT5cXHJcXG5TdWJqZWN0OiBoZWxsbyA0XFxyXFxuTWVzc2FnZS1JZDogPGFiY2RlPlxcclxcbkRhdGU6IEZyaSwgMTMgU2VwIDIwMTMgMTU6MDE6MDAgKzAzMDBcXHJcXG5cXHJcXG5Xb3JsZCA0IScgfSxcbiAgICAgICAgICAgIHsgcmF3OiAnU3ViamVjdDogaGVsbG8gNVxcclxcblxcclxcbldvcmxkIDUhJywgZmxhZ3M6IFsnJE15RmxhZycsICdcXFxcRGVsZXRlZCddLCB1aWQ6IDU1NyB9LFxuICAgICAgICAgICAgeyByYXc6ICdTdWJqZWN0OiBoZWxsbyA2XFxyXFxuXFxyXFxuV29ybGQgNiEnIH0sXG4gICAgICAgICAgICB7IHJhdzogJ1N1YmplY3Q6IGhlbGxvIDdcXHJcXG5cXHJcXG5Xb3JsZCA3IScsIHVpZDogNjAwIH1cbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgICcnOiB7XG4gICAgICAgICAgc2VwYXJhdG9yOiAnLycsXG4gICAgICAgICAgZm9sZGVyczoge1xuICAgICAgICAgICAgJ1tHbWFpbF0nOiB7XG4gICAgICAgICAgICAgIGZsYWdzOiBbJ1xcXFxOb3NlbGVjdCddLFxuICAgICAgICAgICAgICBmb2xkZXJzOiB7XG4gICAgICAgICAgICAgICAgJ0FsbCBNYWlsJzogeyAnc3BlY2lhbC11c2UnOiAnXFxcXEFsbCcgfSxcbiAgICAgICAgICAgICAgICBEcmFmdHM6IHsgJ3NwZWNpYWwtdXNlJzogJ1xcXFxEcmFmdHMnIH0sXG4gICAgICAgICAgICAgICAgSW1wb3J0YW50OiB7ICdzcGVjaWFsLXVzZSc6ICdcXFxcSW1wb3J0YW50JyB9LFxuICAgICAgICAgICAgICAgICdTZW50IE1haWwnOiB7ICdzcGVjaWFsLXVzZSc6ICdcXFxcU2VudCcgfSxcbiAgICAgICAgICAgICAgICBTcGFtOiB7ICdzcGVjaWFsLXVzZSc6ICdcXFxcSnVuaycgfSxcbiAgICAgICAgICAgICAgICBTdGFycmVkOiB7ICdzcGVjaWFsLXVzZSc6ICdcXFxcRmxhZ2dlZCcgfSxcbiAgICAgICAgICAgICAgICBUcmFzaDogeyAnc3BlY2lhbC11c2UnOiAnXFxcXFRyYXNoJyB9LFxuICAgICAgICAgICAgICAgIEE6IHsgbWVzc2FnZXM6IFt7fV0gfSxcbiAgICAgICAgICAgICAgICBCOiB7IG1lc3NhZ2VzOiBbe31dIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHNlcnZlciA9IGhvb2RpZWNyb3cob3B0aW9ucylcbiAgICBzZXJ2ZXIubGlzdGVuKHBvcnQsIGRvbmUpXG4gIH0pXG5cbiAgYWZ0ZXJFYWNoKChkb25lKSA9PiB7XG4gICAgc2VydmVyLmNsb3NlKGRvbmUpXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ0Nvbm5lY3Rpb24gdGVzdHMnLCAoKSA9PiB7XG4gICAgdmFyIGluc2VjdXJlU2VydmVyXG5cbiAgICBiZWZvcmVFYWNoKChkb25lKSA9PiB7XG4gICAgICAvLyBzdGFydCBpbWFwIHRlc3Qgc2VydmVyXG4gICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgLy8gZGVidWc6IHRydWUsXG4gICAgICAgIHBsdWdpbnM6IFtdLFxuICAgICAgICBzZWN1cmVDb25uZWN0aW9uOiBmYWxzZVxuICAgICAgfVxuXG4gICAgICBpbnNlY3VyZVNlcnZlciA9IGhvb2RpZWNyb3cob3B0aW9ucylcbiAgICAgIGluc2VjdXJlU2VydmVyLmxpc3Rlbihwb3J0ICsgMiwgZG9uZSlcbiAgICB9KVxuXG4gICAgYWZ0ZXJFYWNoKChkb25lKSA9PiB7XG4gICAgICBpbnNlY3VyZVNlcnZlci5jbG9zZShkb25lKVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIHVzZSBTVEFSVFRMUyBieSBkZWZhdWx0JywgKCkgPT4ge1xuICAgICAgaW1hcCA9IG5ldyBJbWFwQ2xpZW50KCcxMjcuMC4wLjEnLCBwb3J0LCB7XG4gICAgICAgIGxvZ0xldmVsLFxuICAgICAgICBhdXRoOiB7XG4gICAgICAgICAgdXNlcjogJ3Rlc3R1c2VyJyxcbiAgICAgICAgICBwYXNzOiAndGVzdHBhc3MnXG4gICAgICAgIH0sXG4gICAgICAgIHVzZVNlY3VyZVRyYW5zcG9ydDogZmFsc2VcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiBpbWFwLmNvbm5lY3QoKS50aGVuKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KGltYXAuY2xpZW50LnNlY3VyZU1vZGUpLnRvLmJlLnRydWVcbiAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gaW1hcC5jbG9zZSgpXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIGlnbm9yZSBTVEFSVFRMUycsICgpID0+IHtcbiAgICAgIGltYXAgPSBuZXcgSW1hcENsaWVudCgnMTI3LjAuMC4xJywgcG9ydCwge1xuICAgICAgICBsb2dMZXZlbCxcbiAgICAgICAgYXV0aDoge1xuICAgICAgICAgIHVzZXI6ICd0ZXN0dXNlcicsXG4gICAgICAgICAgcGFzczogJ3Rlc3RwYXNzJ1xuICAgICAgICB9LFxuICAgICAgICB1c2VTZWN1cmVUcmFuc3BvcnQ6IGZhbHNlLFxuICAgICAgICBpZ25vcmVUTFM6IHRydWVcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiBpbWFwLmNvbm5lY3QoKS50aGVuKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KGltYXAuY2xpZW50LnNlY3VyZU1vZGUpLnRvLmJlLmZhbHNlXG4gICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIGltYXAuY2xvc2UoKVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIGNvbm5lY3RpbmcgdG8gbm9uLVNUQVJUVExTIGhvc3QnLCAoKSA9PiB7XG4gICAgICBpbWFwID0gbmV3IEltYXBDbGllbnQoJzEyNy4wLjAuMScsIHBvcnQgKyAyLCB7XG4gICAgICAgIGxvZ0xldmVsLFxuICAgICAgICBhdXRoOiB7XG4gICAgICAgICAgdXNlcjogJ3Rlc3R1c2VyJyxcbiAgICAgICAgICBwYXNzOiAndGVzdHBhc3MnXG4gICAgICAgIH0sXG4gICAgICAgIHVzZVNlY3VyZVRyYW5zcG9ydDogZmFsc2UsXG4gICAgICAgIHJlcXVpcmVUTFM6IHRydWVcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiBpbWFwLmNvbm5lY3QoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIGV4cGVjdChlcnIpLnRvLmV4aXN0XG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIGNvbm5lY3QgdG8gbm9uIHNlY3VyZSBob3N0JywgKCkgPT4ge1xuICAgICAgaW1hcCA9IG5ldyBJbWFwQ2xpZW50KCcxMjcuMC4wLjEnLCBwb3J0ICsgMiwge1xuICAgICAgICBsb2dMZXZlbCxcbiAgICAgICAgYXV0aDoge1xuICAgICAgICAgIHVzZXI6ICd0ZXN0dXNlcicsXG4gICAgICAgICAgcGFzczogJ3Rlc3RwYXNzJ1xuICAgICAgICB9LFxuICAgICAgICB1c2VTZWN1cmVUcmFuc3BvcnQ6IGZhbHNlXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gaW1hcC5jb25uZWN0KCkudGhlbigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChpbWFwLmNsaWVudC5zZWN1cmVNb2RlKS50by5iZS5mYWxzZVxuICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgIHJldHVybiBpbWFwLmNsb3NlKClcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgZmFpbCBhdXRoZW50aWNhdGlvbicsIChkb25lKSA9PiB7XG4gICAgICBpbWFwID0gbmV3IEltYXBDbGllbnQoJzEyNy4wLjAuMScsIHBvcnQgKyAyLCB7XG4gICAgICAgIGxvZ0xldmVsLFxuICAgICAgICBhdXRoOiB7XG4gICAgICAgICAgdXNlcjogJ2ludmFsaWQnLFxuICAgICAgICAgIHBhc3M6ICdpbnZhbGlkJ1xuICAgICAgICB9LFxuICAgICAgICB1c2VTZWN1cmVUcmFuc3BvcnQ6IGZhbHNlXG4gICAgICB9KVxuXG4gICAgICBpbWFwLmNvbm5lY3QoKS50aGVuKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KGltYXAuY2xpZW50LnNlY3VyZU1vZGUpLnRvLmJlLmZhbHNlXG4gICAgICB9KS5jYXRjaCgoKSA9PiB7IGRvbmUoKSB9KVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ1Bvc3QgbG9naW4gdGVzdHMnLCAoKSA9PiB7XG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBpbWFwID0gbmV3IEltYXBDbGllbnQoJzEyNy4wLjAuMScsIHBvcnQsIHtcbiAgICAgICAgbG9nTGV2ZWwsXG4gICAgICAgIGF1dGg6IHtcbiAgICAgICAgICB1c2VyOiAndGVzdHVzZXInLFxuICAgICAgICAgIHBhc3M6ICd0ZXN0cGFzcydcbiAgICAgICAgfSxcbiAgICAgICAgdXNlU2VjdXJlVHJhbnNwb3J0OiBmYWxzZVxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIGltYXAuY29ubmVjdCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gaW1hcC5zZWxlY3RNYWlsYm94KCdbR21haWxdL1NwYW0nKVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgIHJldHVybiBpbWFwLmNsb3NlKClcbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJyNsaXN0TWFpbGJveGVzJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkJywgKCkgPT4ge1xuICAgICAgICByZXR1cm4gaW1hcC5saXN0TWFpbGJveGVzKCkudGhlbigobWFpbGJveGVzKSA9PiB7XG4gICAgICAgICAgZXhwZWN0KG1haWxib3hlcykudG8uZXhpc3RcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCcjbGlzdE1lc3NhZ2VzJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkJywgKCkgPT4ge1xuICAgICAgICByZXR1cm4gaW1hcC5saXN0TWVzc2FnZXMoJ2luYm94JywgJzE6KicsIFsndWlkJywgJ2ZsYWdzJywgJ2VudmVsb3BlJywgJ2JvZHlzdHJ1Y3R1cmUnLCAnYm9keS5wZWVrW10nXSkudGhlbigobWVzc2FnZXMpID0+IHtcbiAgICAgICAgICBleHBlY3QobWVzc2FnZXMpLnRvLm5vdC5iZS5lbXB0eVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJyN1cGxvYWQnLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIHN1Y2NlZWQnLCAoKSA9PiB7XG4gICAgICAgIHZhciBtc2dDb3VudFxuXG4gICAgICAgIHJldHVybiBpbWFwLmxpc3RNZXNzYWdlcygnaW5ib3gnLCAnMToqJywgWyd1aWQnLCAnZmxhZ3MnLCAnZW52ZWxvcGUnLCAnYm9keXN0cnVjdHVyZSddKS50aGVuKChtZXNzYWdlcykgPT4ge1xuICAgICAgICAgIGV4cGVjdChtZXNzYWdlcykudG8ubm90LmJlLmVtcHR5XG4gICAgICAgICAgbXNnQ291bnQgPSBtZXNzYWdlcy5sZW5ndGhcbiAgICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGltYXAudXBsb2FkKCdpbmJveCcsICdNSU1FLVZlcnNpb246IDEuMFxcclxcbkRhdGU6IFdlZCwgOSBKdWwgMjAxNCAxNTowNzo0NyArMDIwMFxcclxcbkRlbGl2ZXJlZC1UbzogdGVzdEB0ZXN0LmNvbVxcclxcbk1lc3NhZ2UtSUQ6IDxDQUhmdFlZUW89NWZxYnRudi1EYXpYaEwyajVBeFZQMW5XYXJqa3p0bi1OOVNWOTFaMndAbWFpbC5nbWFpbC5jb20+XFxyXFxuU3ViamVjdDogdGVzdFxcclxcbkZyb206IFRlc3QgVGVzdCA8dGVzdEB0ZXN0LmNvbT5cXHJcXG5UbzogVGVzdCBUZXN0IDx0ZXN0QHRlc3QuY29tPlxcclxcbkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxcclxcblxcclxcbnRlc3QnLCB7XG4gICAgICAgICAgICBmbGFnczogWydcXFxcU2VlbicsICdcXFxcQW5zd2VyZWQnLCAnXFxcXCRNeUZsYWcnXVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBpbWFwLmxpc3RNZXNzYWdlcygnaW5ib3gnLCAnMToqJywgWyd1aWQnLCAnZmxhZ3MnLCAnZW52ZWxvcGUnLCAnYm9keXN0cnVjdHVyZSddKVxuICAgICAgICB9KS50aGVuKChtZXNzYWdlcykgPT4ge1xuICAgICAgICAgIGV4cGVjdChtZXNzYWdlcy5sZW5ndGgpLnRvLmVxdWFsKG1zZ0NvdW50ICsgMSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCcjc2VhcmNoJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBzZXF1ZW5jZSBudW1iZXInLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBpbWFwLnNlYXJjaCgnaW5ib3gnLCB7XG4gICAgICAgICAgaGVhZGVyOiBbJ3N1YmplY3QnLCAnaGVsbG8gMyddXG4gICAgICAgIH0pLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmRlZXAuZXF1YWwoWzNdKVxuICAgICAgICB9KVxuICAgICAgfSlcblxuICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gdWlkJywgKCkgPT4ge1xuICAgICAgICByZXR1cm4gaW1hcC5zZWFyY2goJ2luYm94Jywge1xuICAgICAgICAgIGhlYWRlcjogWydzdWJqZWN0JywgJ2hlbGxvIDMnXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgYnlVaWQ6IHRydWVcbiAgICAgICAgfSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZGVlcC5lcXVhbChbNTU1XSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG5cbiAgICAgIGl0KCdzaG91bGQgd29yayB3aXRoIGNvbXBsZXggcXVlcmllcycsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGltYXAuc2VhcmNoKCdpbmJveCcsIHtcbiAgICAgICAgICBoZWFkZXI6IFsnc3ViamVjdCcsICdoZWxsbyddLFxuICAgICAgICAgIHNlZW46IHRydWVcbiAgICAgICAgfSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZGVlcC5lcXVhbChbMl0pXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnI3NldEZsYWdzJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCBzZXQgZmxhZ3MgZm9yIGEgbWVzc2FnZScsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGltYXAuc2V0RmxhZ3MoJ2luYm94JywgJzEnLCBbJ1xcXFxTZWVuJywgJyRNeUZsYWcnXSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZGVlcC5lcXVhbChbe1xuICAgICAgICAgICAgJyMnOiAxLFxuICAgICAgICAgICAgZmxhZ3M6IFsnXFxcXFNlZW4nLCAnJE15RmxhZyddXG4gICAgICAgICAgfV0pXG4gICAgICAgIH0pXG4gICAgICB9KVxuXG4gICAgICBpdCgnc2hvdWxkIGFkZCBmbGFncyB0byBhIG1lc3NhZ2UnLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBpbWFwLnNldEZsYWdzKCdpbmJveCcsICcyJywge1xuICAgICAgICAgIGFkZDogWyckTXlGbGFnJ11cbiAgICAgICAgfSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZGVlcC5lcXVhbChbe1xuICAgICAgICAgICAgJyMnOiAyLFxuICAgICAgICAgICAgZmxhZ3M6IFsnXFxcXFNlZW4nLCAnJE15RmxhZyddXG4gICAgICAgICAgfV0pXG4gICAgICAgIH0pXG4gICAgICB9KVxuXG4gICAgICBpdCgnc2hvdWxkIHJlbW92ZSBmbGFncyBmcm9tIGEgbWVzc2FnZScsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGltYXAuc2V0RmxhZ3MoJ2luYm94JywgJzU1NycsIHtcbiAgICAgICAgICByZW1vdmU6IFsnXFxcXERlbGV0ZWQnXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgYnlVaWQ6IHRydWVcbiAgICAgICAgfSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZGVlcC5lcXVhbChbe1xuICAgICAgICAgICAgJyMnOiA1LFxuICAgICAgICAgICAgZmxhZ3M6IFsnJE15RmxhZyddLFxuICAgICAgICAgICAgdWlkOiA1NTdcbiAgICAgICAgICB9XSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG5cbiAgICAgIGl0KCdzaG91bGQgbm90IHJldHVybiBhbnl0aGluZyBvbiBzaWxlbnQgbW9kZScsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGltYXAuc2V0RmxhZ3MoJ2luYm94JywgJzEnLCBbJyRNeUZsYWcyJ10sIHtcbiAgICAgICAgICBzaWxlbnQ6IHRydWVcbiAgICAgICAgfSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZGVlcC5lcXVhbChbXSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCcjc3RvcmUnLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIGFkZCBsYWJlbHMgZm9yIGEgbWVzc2FnZScsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGltYXAuc3RvcmUoJ2luYm94JywgJzEnLCAnK1gtR00tTEFCRUxTJywgWydcXFxcU2VudCcsICdcXFxcSnVuayddKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICBleHBlY3QocmVzdWx0KS50by5kZWVwLmVxdWFsKFt7XG4gICAgICAgICAgICAnIyc6IDEsXG4gICAgICAgICAgICAneC1nbS1sYWJlbHMnOiBbJ1xcXFxJbmJveCcsICdcXFxcU2VudCcsICdcXFxcSnVuayddXG4gICAgICAgICAgfV0pXG4gICAgICAgIH0pXG4gICAgICB9KVxuXG4gICAgICBpdCgnc2hvdWxkIHNldCBsYWJlbHMgZm9yIGEgbWVzc2FnZScsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGltYXAuc3RvcmUoJ2luYm94JywgJzEnLCAnWC1HTS1MQUJFTFMnLCBbJ1xcXFxTZW50JywgJ1xcXFxKdW5rJ10pLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmRlZXAuZXF1YWwoW3tcbiAgICAgICAgICAgICcjJzogMSxcbiAgICAgICAgICAgICd4LWdtLWxhYmVscyc6IFsnXFxcXFNlbnQnLCAnXFxcXEp1bmsnXVxuICAgICAgICAgIH1dKVxuICAgICAgICB9KVxuICAgICAgfSlcblxuICAgICAgaXQoJ3Nob3VsZCByZW1vdmUgbGFiZWxzIGZyb20gYSBtZXNzYWdlJywgKCkgPT4ge1xuICAgICAgICByZXR1cm4gaW1hcC5zdG9yZSgnaW5ib3gnLCAnMScsICctWC1HTS1MQUJFTFMnLCBbJ1xcXFxTZW50JywgJ1xcXFxJbmJveCddKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICBleHBlY3QocmVzdWx0KS50by5kZWVwLmVxdWFsKFt7XG4gICAgICAgICAgICAnIyc6IDEsXG4gICAgICAgICAgICAneC1nbS1sYWJlbHMnOiBbXVxuICAgICAgICAgIH1dKVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJyNkZWxldGVNZXNzYWdlcycsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgZGVsZXRlIGEgbWVzc2FnZScsICgpID0+IHtcbiAgICAgICAgdmFyIGluaXRpYWxJbmZvXG5cbiAgICAgICAgdmFyIGV4cHVuZ2VOb3RpZmllZCA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBpbWFwLm9udXBkYXRlID0gZnVuY3Rpb24gKG1iLCB0eXBlIC8qLCBkYXRhICovKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBleHBlY3QobWIpLnRvLmVxdWFsKCdpbmJveCcpXG4gICAgICAgICAgICAgIGV4cGVjdCh0eXBlKS50by5lcXVhbCgnZXhwdW5nZScpXG4gICAgICAgICAgICAgIHJlc29sdmUoKVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIHJlamVjdChlcnIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiBpbWFwLnNlbGVjdE1haWxib3goJ2luYm94JykudGhlbigoaW5mbykgPT4ge1xuICAgICAgICAgIGluaXRpYWxJbmZvID0gaW5mb1xuICAgICAgICAgIHJldHVybiBpbWFwLmRlbGV0ZU1lc3NhZ2VzKCdpbmJveCcsIDU1Nywge1xuICAgICAgICAgICAgYnlVaWQ6IHRydWVcbiAgICAgICAgICB9KVxuICAgICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gaW1hcC5zZWxlY3RNYWlsYm94KCdpbmJveCcpXG4gICAgICAgIH0pLnRoZW4oKHJlc3VsdEluZm8pID0+IHtcbiAgICAgICAgICBleHBlY3QoaW5pdGlhbEluZm8uZXhpc3RzIC0gMSA9PT0gcmVzdWx0SW5mby5leGlzdHMpLnRvLmJlLnRydWVcbiAgICAgICAgfSkudGhlbigoKSA9PiBleHB1bmdlTm90aWZpZWQpXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnI2NvcHlNZXNzYWdlcycsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgY29weSBhIG1lc3NhZ2UnLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBpbWFwLmNvcHlNZXNzYWdlcygnaW5ib3gnLCA1NTUsICdbR21haWxdL1RyYXNoJywge1xuICAgICAgICAgIGJ5VWlkOiB0cnVlXG4gICAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBpbWFwLnNlbGVjdE1haWxib3goJ1tHbWFpbF0vVHJhc2gnKVxuICAgICAgICB9KS50aGVuKChpbmZvKSA9PiB7XG4gICAgICAgICAgZXhwZWN0KGluZm8uZXhpc3RzKS50by5lcXVhbCgxKVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJyNtb3ZlTWVzc2FnZXMnLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIG1vdmUgYSBtZXNzYWdlJywgKCkgPT4ge1xuICAgICAgICB2YXIgaW5pdGlhbEluZm9cbiAgICAgICAgcmV0dXJuIGltYXAuc2VsZWN0TWFpbGJveCgnaW5ib3gnKS50aGVuKChpbmZvKSA9PiB7XG4gICAgICAgICAgaW5pdGlhbEluZm8gPSBpbmZvXG4gICAgICAgICAgcmV0dXJuIGltYXAubW92ZU1lc3NhZ2VzKCdpbmJveCcsIDU1NSwgJ1tHbWFpbF0vU3BhbScsIHtcbiAgICAgICAgICAgIGJ5VWlkOiB0cnVlXG4gICAgICAgICAgfSlcbiAgICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGltYXAuc2VsZWN0TWFpbGJveCgnW0dtYWlsXS9TcGFtJylcbiAgICAgICAgfSkudGhlbigoaW5mbykgPT4ge1xuICAgICAgICAgIGV4cGVjdChpbmZvLmV4aXN0cykudG8uZXF1YWwoMSlcbiAgICAgICAgICByZXR1cm4gaW1hcC5zZWxlY3RNYWlsYm94KCdpbmJveCcpXG4gICAgICAgIH0pLnRoZW4oKHJlc3VsdEluZm8pID0+IHtcbiAgICAgICAgICBleHBlY3QoaW5pdGlhbEluZm8uZXhpc3RzKS50by5ub3QuZXF1YWwocmVzdWx0SW5mby5leGlzdHMpXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBkZXNjcmliZSgncHJlY2hlY2snLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIGhhbmRsZSBwcmVjaGVjayBlcnJvciBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICAgIC8vIHNpbXVsYXRlcyBhIGJyb2tlbiBzZWFyY2ggY29tbWFuZFxuICAgICAgICB2YXIgc2VhcmNoID0gKHF1ZXJ5LCBvcHRpb25zID0ge30pID0+IHtcbiAgICAgICAgICB2YXIgY29tbWFuZCA9IGJ1aWxkU0VBUkNIQ29tbWFuZChxdWVyeSwgb3B0aW9ucylcbiAgICAgICAgICByZXR1cm4gaW1hcC5leGVjKGNvbW1hbmQsICdTRUFSQ0gnLCB7XG4gICAgICAgICAgICBwcmVjaGVjazogKCkgPT4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdGT08nKSlcbiAgICAgICAgICB9KS50aGVuKChyZXNwb25zZSkgPT4gcGFyc2VTRUFSQ0gocmVzcG9uc2UpKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGltYXAuc2VsZWN0TWFpbGJveCgnaW5ib3gnKVxuICAgICAgICAgIC50aGVuKCgpID0+IHNlYXJjaCh7IGhlYWRlcjogWydzdWJqZWN0JywgJ2hlbGxvIDMnXSB9KSlcbiAgICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgZXhwZWN0KGVyci5tZXNzYWdlKS50by5lcXVhbCgnRk9PJylcbiAgICAgICAgICAgIHJldHVybiBpbWFwLnNlbGVjdE1haWxib3goJ1tHbWFpbF0vU3BhbScpXG4gICAgICAgICAgfSlcbiAgICAgIH0pXG5cbiAgICAgIGl0KCdzaG91bGQgc2VsZWN0IGNvcnJlY3QgbWFpbGJveGVzIGluIHByZWNoZWNrcyBvbiBjb25jdXJyZW50IGNhbGxzJywgKCkgPT4ge1xuICAgICAgICByZXR1cm4gaW1hcC5zZWxlY3RNYWlsYm94KCdbR21haWxdL0EnKS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgaW1hcC5zZWxlY3RNYWlsYm94KCdbR21haWxdL0InKSxcbiAgICAgICAgICAgIGltYXAuc2V0RmxhZ3MoJ1tHbWFpbF0vQScsICcxJywgWydcXFxcU2VlbiddKVxuICAgICAgICAgIF0pXG4gICAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBpbWFwLmxpc3RNZXNzYWdlcygnW0dtYWlsXS9BJywgJzE6MScsIFsnZmxhZ3MnXSlcbiAgICAgICAgfSkudGhlbigobWVzc2FnZXMpID0+IHtcbiAgICAgICAgICBleHBlY3QobWVzc2FnZXMubGVuZ3RoKS50by5lcXVhbCgxKVxuICAgICAgICAgIGV4cGVjdChtZXNzYWdlc1swXS5mbGFncykudG8uZGVlcC5lcXVhbChbJ1xcXFxTZWVuJ10pXG4gICAgICAgIH0pXG4gICAgICB9KVxuXG4gICAgICBpdCgnc2hvdWxkIHNlbmQgcHJlY2hlY2sgY29tbWFuZHMgaW4gY29ycmVjdCBvcmRlciBvbiBjb25jdXJyZW50IGNhbGxzJywgKCkgPT4ge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW1xuICAgICAgICAgIGltYXAuc2V0RmxhZ3MoJ1tHbWFpbF0vQScsICcxJywgWydcXFxcU2VlbiddKSxcbiAgICAgICAgICBpbWFwLnNldEZsYWdzKCdbR21haWxdL0InLCAnMScsIFsnXFxcXFNlZW4nXSlcbiAgICAgICAgXSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGltYXAubGlzdE1lc3NhZ2VzKCdbR21haWxdL0EnLCAnMToxJywgWydmbGFncyddKVxuICAgICAgICB9KS50aGVuKChtZXNzYWdlcykgPT4ge1xuICAgICAgICAgIGV4cGVjdChtZXNzYWdlcy5sZW5ndGgpLnRvLmVxdWFsKDEpXG4gICAgICAgICAgZXhwZWN0KG1lc3NhZ2VzWzBdLmZsYWdzKS50by5kZWVwLmVxdWFsKFsnXFxcXFNlZW4nXSlcbiAgICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGltYXAubGlzdE1lc3NhZ2VzKCdbR21haWxdL0InLCAnMToxJywgWydmbGFncyddKVxuICAgICAgICB9KS50aGVuKChtZXNzYWdlcykgPT4ge1xuICAgICAgICAgIGV4cGVjdChtZXNzYWdlcy5sZW5ndGgpLnRvLmVxdWFsKDEpXG4gICAgICAgICAgZXhwZWN0KG1lc3NhZ2VzWzBdLmZsYWdzKS50by5kZWVwLmVxdWFsKFsnXFxcXFNlZW4nXSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnVGltZW91dCcsICgpID0+IHtcbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIGltYXAgPSBuZXcgSW1hcENsaWVudCgnMTI3LjAuMC4xJywgcG9ydCwge1xuICAgICAgICBsb2dMZXZlbCxcbiAgICAgICAgYXV0aDoge1xuICAgICAgICAgIHVzZXI6ICd0ZXN0dXNlcicsXG4gICAgICAgICAgcGFzczogJ3Rlc3RwYXNzJ1xuICAgICAgICB9LFxuICAgICAgICB1c2VTZWN1cmVUcmFuc3BvcnQ6IGZhbHNlXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gaW1hcC5jb25uZWN0KClcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIC8vIHJlbW92ZSB0aGUgb25kYXRhIGV2ZW50IHRvIHNpbXVsYXRlIDEwMCUgcGFja2V0IGxvc3MgYW5kIG1ha2UgdGhlIHNvY2tldCB0aW1lIG91dCBhZnRlciAxMG1zXG4gICAgICAgICAgaW1hcC5jbGllbnQudGltZW91dFNvY2tldExvd2VyQm91bmQgPSAxMFxuICAgICAgICAgIGltYXAuY2xpZW50LnRpbWVvdXRTb2NrZXRNdWx0aXBsaWVyID0gMFxuICAgICAgICAgIGltYXAuY2xpZW50LnNvY2tldC5vbmRhdGEgPSAoKSA9PiB7IH1cbiAgICAgICAgfSlcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCB0aW1lb3V0JywgKGRvbmUpID0+IHtcbiAgICAgIGltYXAub25lcnJvciA9ICgpID0+IHsgZG9uZSgpIH1cbiAgICAgIGltYXAuc2VsZWN0TWFpbGJveCgnaW5ib3gnKS5jYXRjaCgoKSA9PiB7fSlcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYWxsIHBlbmRpbmcgY29tbWFuZHMgb24gdGltZW91dCcsICgpID0+IHtcbiAgICAgIGxldCByZWplY3Rpb25Db3VudCA9IDBcbiAgICAgIHJldHVybiBQcm9taXNlLmFsbChbXG4gICAgICAgIGltYXAuc2VsZWN0TWFpbGJveCgnSU5CT1gnKVxuICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgZXhwZWN0KGVycikudG8uZXhpc3RcbiAgICAgICAgICAgIHJlamVjdGlvbkNvdW50KytcbiAgICAgICAgICB9KSxcbiAgICAgICAgaW1hcC5saXN0TWVzc2FnZXMoJ0lOQk9YJywgJzE6KicsIFsnYm9keS5wZWVrW10nXSlcbiAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgIGV4cGVjdChlcnIpLnRvLmV4aXN0XG4gICAgICAgICAgICByZWplY3Rpb25Db3VudCsrXG4gICAgICAgICAgfSlcblxuICAgICAgXSkudGhlbigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChyZWplY3Rpb25Db3VudCkudG8uZXF1YWwoMilcbiAgICAgIH0pXG4gICAgfSlcbiAgfSlcbn0pXG4iXX0= \ No newline at end of file diff --git a/dist/client-unit.js b/dist/client-unit.js new file mode 100644 index 0000000..c02a182 --- /dev/null +++ b/dist/client-unit.js @@ -0,0 +1,1105 @@ +"use strict"; + +var _client = _interopRequireWildcard(require("./client")); + +var _emailjsImapHandler = require("emailjs-imap-handler"); + +var _common = require("./common"); + +function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +/* eslint-disable no-unused-expressions */ +describe('browserbox unit tests', () => { + var br; + beforeEach(() => { + const auth = { + user: 'baldrian', + pass: 'sleeper.de' + }; + br = new _client.default('somehost', 1234, { + auth, + logLevel: _common.LOG_LEVEL_NONE + }); + br.client.socket = { + send: () => {}, + upgradeToSecure: () => {} + }; + }); + describe('#_onIdle', () => { + it('should call enterIdle', () => { + sinon.stub(br, 'enterIdle'); + br._authenticated = true; + br._enteredIdle = false; + + br._onIdle(); + + expect(br.enterIdle.callCount).to.equal(1); + }); + it('should not call enterIdle', () => { + sinon.stub(br, 'enterIdle'); + br._enteredIdle = true; + + br._onIdle(); + + expect(br.enterIdle.callCount).to.equal(0); + }); + }); + describe('#openConnection', () => { + beforeEach(() => { + sinon.stub(br.client, 'connect'); + sinon.stub(br.client, 'close'); + sinon.stub(br.client, 'enqueueCommand'); + }); + it('should open connection', () => { + br.client.connect.returns(Promise.resolve()); + br.client.enqueueCommand.returns(Promise.resolve({ + capability: ['capa1', 'capa2'] + })); + setTimeout(() => br.client.onready(), 0); + return br.openConnection().then(() => { + expect(br.client.connect.calledOnce).to.be.true; + expect(br.client.enqueueCommand.calledOnce).to.be.true; + expect(br._capability.length).to.equal(2); + expect(br._capability[0]).to.equal('capa1'); + expect(br._capability[1]).to.equal('capa2'); + }); + }); + }); + describe('#connect', () => { + beforeEach(() => { + sinon.stub(br.client, 'connect'); + sinon.stub(br.client, 'close'); + sinon.stub(br, 'updateCapability'); + sinon.stub(br, 'upgradeConnection'); + sinon.stub(br, 'updateId'); + sinon.stub(br, 'login'); + sinon.stub(br, 'compressConnection'); + }); + it('should connect', () => { + br.client.connect.returns(Promise.resolve()); + br.updateCapability.returns(Promise.resolve()); + br.upgradeConnection.returns(Promise.resolve()); + br.updateId.returns(Promise.resolve()); + br.login.returns(Promise.resolve()); + br.compressConnection.returns(Promise.resolve()); + setTimeout(() => br.client.onready(), 0); + return br.connect().then(() => { + expect(br.client.connect.calledOnce).to.be.true; + expect(br.updateCapability.calledOnce).to.be.true; + expect(br.upgradeConnection.calledOnce).to.be.true; + expect(br.updateId.calledOnce).to.be.true; + expect(br.login.calledOnce).to.be.true; + expect(br.compressConnection.calledOnce).to.be.true; + }); + }); + it('should fail to login', done => { + br.client.connect.returns(Promise.resolve()); + br.updateCapability.returns(Promise.resolve()); + br.upgradeConnection.returns(Promise.resolve()); + br.updateId.returns(Promise.resolve()); + br.login.throws(new Error()); + setTimeout(() => br.client.onready(), 0); + br.connect().catch(err => { + expect(err).to.exist; + expect(br.client.connect.calledOnce).to.be.true; + expect(br.client.close.calledOnce).to.be.true; + expect(br.updateCapability.calledOnce).to.be.true; + expect(br.upgradeConnection.calledOnce).to.be.true; + expect(br.updateId.calledOnce).to.be.true; + expect(br.login.calledOnce).to.be.true; + expect(br.compressConnection.called).to.be.false; + done(); + }); + }); + it('should timeout', done => { + br.client.connect.returns(Promise.resolve()); + br.timeoutConnection = 1; + br.connect().catch(err => { + expect(err).to.exist; + expect(br.client.connect.calledOnce).to.be.true; + expect(br.client.close.calledOnce).to.be.true; + expect(br.updateCapability.called).to.be.false; + expect(br.upgradeConnection.called).to.be.false; + expect(br.updateId.called).to.be.false; + expect(br.login.called).to.be.false; + expect(br.compressConnection.called).to.be.false; + done(); + }); + }); + }); + describe('#close', () => { + it('should force-close', () => { + sinon.stub(br.client, 'close').returns(Promise.resolve()); + return br.close().then(() => { + expect(br._state).to.equal(_client.STATE_LOGOUT); + expect(br.client.close.calledOnce).to.be.true; + }); + }); + }); + describe('#exec', () => { + beforeEach(() => { + sinon.stub(br, 'breakIdle'); + }); + it('should send string command', () => { + sinon.stub(br.client, 'enqueueCommand').returns(Promise.resolve({})); + return br.exec('TEST').then(res => { + expect(res).to.deep.equal({}); + expect(br.client.enqueueCommand.args[0][0]).to.equal('TEST'); + }); + }); + it('should update capability from response', () => { + sinon.stub(br.client, 'enqueueCommand').returns(Promise.resolve({ + capability: ['A', 'B'] + })); + return br.exec('TEST').then(res => { + expect(res).to.deep.equal({ + capability: ['A', 'B'] + }); + expect(br._capability).to.deep.equal(['A', 'B']); + }); + }); + }); + describe('#enterIdle', () => { + it('should periodically send NOOP if IDLE not supported', done => { + sinon.stub(br, 'exec').callsFake(command => { + expect(command).to.equal('NOOP'); + done(); + }); + br._capability = []; + br._selectedMailbox = 'FOO'; + br.timeoutNoop = 1; + br.enterIdle(); + }); + it('should periodically send NOOP if no mailbox selected', done => { + sinon.stub(br, 'exec').callsFake(command => { + expect(command).to.equal('NOOP'); + done(); + }); + br._capability = ['IDLE']; + br._selectedMailbox = undefined; + br.timeoutNoop = 1; + br.enterIdle(); + }); + it('should break IDLE after timeout', done => { + sinon.stub(br.client, 'enqueueCommand'); + sinon.stub(br.client.socket, 'send').callsFake(payload => { + expect(br.client.enqueueCommand.args[0][0].command).to.equal('IDLE'); + expect([].slice.call(new Uint8Array(payload))).to.deep.equal([0x44, 0x4f, 0x4e, 0x45, 0x0d, 0x0a]); + done(); + }); + br._capability = ['IDLE']; + br._selectedMailbox = 'FOO'; + br.timeoutIdle = 1; + br.enterIdle(); + }); + }); + describe('#breakIdle', () => { + it('should send DONE to socket', () => { + sinon.stub(br.client.socket, 'send'); + br._enteredIdle = 'IDLE'; + br.breakIdle(); + expect([].slice.call(new Uint8Array(br.client.socket.send.args[0][0]))).to.deep.equal([0x44, 0x4f, 0x4e, 0x45, 0x0d, 0x0a]); + }); + }); + describe('#upgradeConnection', () => { + it('should do nothing if already secured', () => { + br.client.secureMode = true; + br._capability = ['starttls']; + return br.upgradeConnection(); + }); + it('should do nothing if STARTTLS not available', () => { + br.client.secureMode = false; + br._capability = []; + return br.upgradeConnection(); + }); + it('should run STARTTLS', () => { + sinon.stub(br.client, 'upgrade'); + sinon.stub(br, 'exec').withArgs('STARTTLS').returns(Promise.resolve()); + sinon.stub(br, 'updateCapability').returns(Promise.resolve()); + br._capability = ['STARTTLS']; + return br.upgradeConnection().then(() => { + expect(br.client.upgrade.callCount).to.equal(1); + expect(br._capability.length).to.equal(0); + }); + }); + }); + describe('#updateCapability', () => { + beforeEach(() => { + sinon.stub(br, 'exec'); + }); + it('should do nothing if capability is set', () => { + br._capability = ['abc']; + return br.updateCapability(); + }); + it('should run CAPABILITY if capability not set', () => { + br.exec.returns(Promise.resolve()); + br._capability = []; + return br.updateCapability().then(() => { + expect(br.exec.args[0][0]).to.equal('CAPABILITY'); + }); + }); + it('should force run CAPABILITY', () => { + br.exec.returns(Promise.resolve()); + br._capability = ['abc']; + return br.updateCapability(true).then(() => { + expect(br.exec.args[0][0]).to.equal('CAPABILITY'); + }); + }); + it('should do nothing if connection is not yet upgraded', () => { + br._capability = []; + br.client.secureMode = false; + br._requireTLS = true; + br.updateCapability(); + }); + }); + describe('#listNamespaces', () => { + beforeEach(() => { + sinon.stub(br, 'exec'); + }); + it('should run NAMESPACE if supported', () => { + br.exec.returns(Promise.resolve({ + payload: { + NAMESPACE: [{ + attributes: [[[{ + type: 'STRING', + value: 'INBOX.' + }, { + type: 'STRING', + value: '.' + }]], null, null] + }] + } + })); + br._capability = ['NAMESPACE']; + return br.listNamespaces().then(namespaces => { + expect(namespaces).to.deep.equal({ + personal: [{ + prefix: 'INBOX.', + delimiter: '.' + }], + users: false, + shared: false + }); + expect(br.exec.args[0][0]).to.equal('NAMESPACE'); + expect(br.exec.args[0][1]).to.equal('NAMESPACE'); + }); + }); + it('should do nothing if not supported', () => { + br._capability = []; + return br.listNamespaces().then(namespaces => { + expect(namespaces).to.be.false; + expect(br.exec.callCount).to.equal(0); + }); + }); + }); + describe('#compressConnection', () => { + beforeEach(() => { + sinon.stub(br, 'exec'); + sinon.stub(br.client, 'enableCompression'); + }); + it('should run COMPRESS=DEFLATE if supported', () => { + br.exec.withArgs({ + command: 'COMPRESS', + attributes: [{ + type: 'ATOM', + value: 'DEFLATE' + }] + }).returns(Promise.resolve({})); + br._enableCompression = true; + br._capability = ['COMPRESS=DEFLATE']; + return br.compressConnection().then(() => { + expect(br.exec.callCount).to.equal(1); + expect(br.client.enableCompression.callCount).to.equal(1); + }); + }); + it('should do nothing if not supported', () => { + br._capability = []; + return br.compressConnection().then(() => { + expect(br.exec.callCount).to.equal(0); + }); + }); + it('should do nothing if not enabled', () => { + br._enableCompression = false; + br._capability = ['COMPRESS=DEFLATE']; + return br.compressConnection().then(() => { + expect(br.exec.callCount).to.equal(0); + }); + }); + }); + describe('#login', () => { + it('should call LOGIN', () => { + sinon.stub(br, 'exec').returns(Promise.resolve({})); + sinon.stub(br, 'updateCapability').returns(Promise.resolve(true)); + return br.login({ + user: 'u1', + pass: 'p1' + }).then(() => { + expect(br.exec.callCount).to.equal(1); + expect(br.exec.args[0][0]).to.deep.equal({ + command: 'login', + attributes: [{ + type: 'STRING', + value: 'u1' + }, { + type: 'STRING', + value: 'p1', + sensitive: true + }] + }); + }); + }); + it('should call XOAUTH2', () => { + sinon.stub(br, 'exec').returns(Promise.resolve({})); + sinon.stub(br, 'updateCapability').returns(Promise.resolve(true)); + br._capability = ['AUTH=XOAUTH2']; + br.login({ + user: 'u1', + xoauth2: 'abc' + }).then(() => { + expect(br.exec.callCount).to.equal(1); + expect(br.exec.args[0][0]).to.deep.equal({ + command: 'AUTHENTICATE', + attributes: [{ + type: 'ATOM', + value: 'XOAUTH2' + }, { + type: 'ATOM', + value: 'dXNlcj11MQFhdXRoPUJlYXJlciBhYmMBAQ==', + sensitive: true + }] + }); + }); + }); + }); + describe('#updateId', () => { + beforeEach(() => { + sinon.stub(br, 'exec'); + }); + it('should not nothing if not supported', () => { + br._capability = []; + return br.updateId({ + a: 'b', + c: 'd' + }).then(() => { + expect(br.serverId).to.be.false; + }); + }); + it('should send NIL', () => { + br.exec.withArgs({ + command: 'ID', + attributes: [null] + }).returns(Promise.resolve({ + payload: { + ID: [{ + attributes: [null] + }] + } + })); + br._capability = ['ID']; + return br.updateId(null).then(() => { + expect(br.serverId).to.deep.equal({}); + }); + }); + it('should exhange ID values', () => { + br.exec.withArgs({ + command: 'ID', + attributes: [['ckey1', 'cval1', 'ckey2', 'cval2']] + }).returns(Promise.resolve({ + payload: { + ID: [{ + attributes: [[{ + value: 'skey1' + }, { + value: 'sval1' + }, { + value: 'skey2' + }, { + value: 'sval2' + }]] + }] + } + })); + br._capability = ['ID']; + return br.updateId({ + ckey1: 'cval1', + ckey2: 'cval2' + }).then(() => { + expect(br.serverId).to.deep.equal({ + skey1: 'sval1', + skey2: 'sval2' + }); + }); + }); + }); + describe('#listMailboxes', () => { + beforeEach(() => { + sinon.stub(br, 'exec'); + }); + it('should call LIST and LSUB in sequence', () => { + br.exec.withArgs({ + command: 'LIST', + attributes: ['', '*'] + }).returns(Promise.resolve({ + payload: { + LIST: [false] + } + })); + br.exec.withArgs({ + command: 'LSUB', + attributes: ['', '*'] + }).returns(Promise.resolve({ + payload: { + LSUB: [false] + } + })); + return br.listMailboxes().then(tree => { + expect(tree).to.exist; + }); + }); + it('should not die on NIL separators', () => { + br.exec.withArgs({ + command: 'LIST', + attributes: ['', '*'] + }).returns(Promise.resolve({ + payload: { + LIST: [(0, _emailjsImapHandler.parser)((0, _common.toTypedArray)('* LIST (\\NoInferiors) NIL "INBOX"'))] + } + })); + br.exec.withArgs({ + command: 'LSUB', + attributes: ['', '*'] + }).returns(Promise.resolve({ + payload: { + LSUB: [(0, _emailjsImapHandler.parser)((0, _common.toTypedArray)('* LSUB (\\NoInferiors) NIL "INBOX"'))] + } + })); + return br.listMailboxes().then(tree => { + expect(tree).to.exist; + }); + }); + }); + describe('#createMailbox', () => { + beforeEach(() => { + sinon.stub(br, 'exec'); + }); + it('should call CREATE with a string payload', () => { + // The spec allows unquoted ATOM-style syntax too, but for + // simplicity we always generate a string even if it could be + // expressed as an atom. + br.exec.withArgs({ + command: 'CREATE', + attributes: ['mailboxname'] + }).returns(Promise.resolve()); + return br.createMailbox('mailboxname').then(() => { + expect(br.exec.callCount).to.equal(1); + }); + }); + it('should call mutf7 encode the argument', () => { + // From RFC 3501 + br.exec.withArgs({ + command: 'CREATE', + attributes: ['~peter/mail/&U,BTFw-/&ZeVnLIqe-'] + }).returns(Promise.resolve()); + return br.createMailbox('~peter/mail/\u53f0\u5317/\u65e5\u672c\u8a9e').then(() => { + expect(br.exec.callCount).to.equal(1); + }); + }); + it('should treat an ALREADYEXISTS response as success', () => { + var fakeErr = { + code: 'ALREADYEXISTS' + }; + br.exec.withArgs({ + command: 'CREATE', + attributes: ['mailboxname'] + }).returns(Promise.reject(fakeErr)); + return br.createMailbox('mailboxname').then(() => { + expect(br.exec.callCount).to.equal(1); + }); + }); + }); + describe('#deleteMailbox', () => { + beforeEach(() => { + sinon.stub(br, 'exec'); + }); + it('should call DELETE with a string payload', () => { + br.exec.withArgs({ + command: 'DELETE', + attributes: ['mailboxname'] + }).returns(Promise.resolve()); + return br.deleteMailbox('mailboxname').then(() => { + expect(br.exec.callCount).to.equal(1); + }); + }); + it('should call mutf7 encode the argument', () => { + // From RFC 3501 + br.exec.withArgs({ + command: 'DELETE', + attributes: ['~peter/mail/&U,BTFw-/&ZeVnLIqe-'] + }).returns(Promise.resolve()); + return br.deleteMailbox('~peter/mail/\u53f0\u5317/\u65e5\u672c\u8a9e').then(() => { + expect(br.exec.callCount).to.equal(1); + }); + }); + }); + describe.skip('#listMessages', () => { + beforeEach(() => { + sinon.stub(br, 'exec'); + sinon.stub(br, '_buildFETCHCommand'); + sinon.stub(br, '_parseFETCH'); + }); + it('should call FETCH', () => { + br.exec.returns(Promise.resolve('abc')); + + br._buildFETCHCommand.withArgs(['1:2', ['uid', 'flags'], { + byUid: true + }]).returns({}); + + return br.listMessages('INBOX', '1:2', ['uid', 'flags'], { + byUid: true + }).then(() => { + expect(br._buildFETCHCommand.callCount).to.equal(1); + expect(br._parseFETCH.withArgs('abc').callCount).to.equal(1); + }); + }); + }); + describe.skip('#search', () => { + beforeEach(() => { + sinon.stub(br, 'exec'); + sinon.stub(br, '_buildSEARCHCommand'); + sinon.stub(br, '_parseSEARCH'); + }); + it('should call SEARCH', () => { + br.exec.returns(Promise.resolve('abc')); + + br._buildSEARCHCommand.withArgs({ + uid: 1 + }, { + byUid: true + }).returns({}); + + return br.search('INBOX', { + uid: 1 + }, { + byUid: true + }).then(() => { + expect(br._buildSEARCHCommand.callCount).to.equal(1); + expect(br.exec.callCount).to.equal(1); + expect(br._parseSEARCH.withArgs('abc').callCount).to.equal(1); + }); + }); + }); + describe('#upload', () => { + beforeEach(() => { + sinon.stub(br, 'exec'); + }); + it('should call APPEND with custom flag', () => { + br.exec.returns(Promise.resolve()); + return br.upload('mailbox', 'this is a message', { + flags: ['\\$MyFlag'] + }).then(() => { + expect(br.exec.callCount).to.equal(1); + }); + }); + it('should call APPEND w/o flags', () => { + br.exec.returns(Promise.resolve()); + return br.upload('mailbox', 'this is a message').then(() => { + expect(br.exec.callCount).to.equal(1); + }); + }); + }); + describe.skip('#setFlags', () => { + beforeEach(() => { + sinon.stub(br, 'exec'); + sinon.stub(br, '_buildSTORECommand'); + sinon.stub(br, '_parseFETCH'); + }); + it('should call STORE', () => { + br.exec.returns(Promise.resolve('abc')); + + br._buildSTORECommand.withArgs('1:2', 'FLAGS', ['\\Seen', '$MyFlag'], { + byUid: true + }).returns({}); + + return br.setFlags('INBOX', '1:2', ['\\Seen', '$MyFlag'], { + byUid: true + }).then(() => { + expect(br.exec.callCount).to.equal(1); + expect(br._parseFETCH.withArgs('abc').callCount).to.equal(1); + }); + }); + }); + describe.skip('#store', () => { + beforeEach(() => { + sinon.stub(br, 'exec'); + sinon.stub(br, '_buildSTORECommand'); + sinon.stub(br, '_parseFETCH'); + }); + it('should call STORE', () => { + br.exec.returns(Promise.resolve('abc')); + + br._buildSTORECommand.withArgs('1:2', '+X-GM-LABELS', ['\\Sent', '\\Junk'], { + byUid: true + }).returns({}); + + return br.store('INBOX', '1:2', '+X-GM-LABELS', ['\\Sent', '\\Junk'], { + byUid: true + }).then(() => { + expect(br._buildSTORECommand.callCount).to.equal(1); + expect(br.exec.callCount).to.equal(1); + expect(br._parseFETCH.withArgs('abc').callCount).to.equal(1); + }); + }); + }); + describe('#deleteMessages', () => { + beforeEach(() => { + sinon.stub(br, 'setFlags'); + sinon.stub(br, 'exec'); + }); + it('should call UID EXPUNGE', () => { + br.exec.withArgs({ + command: 'UID EXPUNGE', + attributes: [{ + type: 'sequence', + value: '1:2' + }] + }).returns(Promise.resolve('abc')); + br.setFlags.withArgs('INBOX', '1:2', { + add: '\\Deleted' + }).returns(Promise.resolve()); + br._capability = ['UIDPLUS']; + return br.deleteMessages('INBOX', '1:2', { + byUid: true + }).then(() => { + expect(br.exec.callCount).to.equal(1); + }); + }); + it('should call EXPUNGE', () => { + br.exec.withArgs('EXPUNGE').returns(Promise.resolve('abc')); + br.setFlags.withArgs('INBOX', '1:2', { + add: '\\Deleted' + }).returns(Promise.resolve()); + br._capability = []; + return br.deleteMessages('INBOX', '1:2', { + byUid: true + }).then(() => { + expect(br.exec.callCount).to.equal(1); + }); + }); + }); + describe('#copyMessages', () => { + beforeEach(() => { + sinon.stub(br, 'exec'); + }); + it('should call COPY', () => { + br.exec.withArgs({ + command: 'UID COPY', + attributes: [{ + type: 'sequence', + value: '1:2' + }, { + type: 'atom', + value: '[Gmail]/Trash' + }] + }).returns(Promise.resolve({ + copyuid: ['1', '1:2', '4,3'] + })); + return br.copyMessages('INBOX', '1:2', '[Gmail]/Trash', { + byUid: true + }).then(response => { + expect(response).to.deep.equal({ + srcSeqSet: '1:2', + destSeqSet: '4,3' + }); + expect(br.exec.callCount).to.equal(1); + }); + }); + }); + describe('#moveMessages', () => { + beforeEach(() => { + sinon.stub(br, 'exec'); + sinon.stub(br, 'copyMessages'); + sinon.stub(br, 'deleteMessages'); + }); + it('should call MOVE if supported', () => { + br.exec.withArgs({ + command: 'UID MOVE', + attributes: [{ + type: 'sequence', + value: '1:2' + }, { + type: 'atom', + value: '[Gmail]/Trash' + }] + }, ['OK']).returns(Promise.resolve('abc')); + br._capability = ['MOVE']; + return br.moveMessages('INBOX', '1:2', '[Gmail]/Trash', { + byUid: true + }).then(() => { + expect(br.exec.callCount).to.equal(1); + }); + }); + it('should fallback to copy+expunge', () => { + br.copyMessages.withArgs('INBOX', '1:2', '[Gmail]/Trash', { + byUid: true + }).returns(Promise.resolve()); + br.deleteMessages.withArgs('1:2', { + byUid: true + }).returns(Promise.resolve()); + br._capability = []; + return br.moveMessages('INBOX', '1:2', '[Gmail]/Trash', { + byUid: true + }).then(() => { + expect(br.deleteMessages.callCount).to.equal(1); + }); + }); + }); + describe('#_shouldSelectMailbox', () => { + it('should return true when ctx is undefined', () => { + expect(br._shouldSelectMailbox('path')).to.be.true; + }); + it('should return true when a different path is queued', () => { + sinon.stub(br.client, 'getPreviouslyQueued').returns({ + request: { + command: 'SELECT', + attributes: [{ + type: 'STRING', + value: 'queued path' + }] + } + }); + expect(br._shouldSelectMailbox('path', {})).to.be.true; + }); + it('should return false when the same path is queued', () => { + sinon.stub(br.client, 'getPreviouslyQueued').returns({ + request: { + command: 'SELECT', + attributes: [{ + type: 'STRING', + value: 'queued path' + }] + } + }); + expect(br._shouldSelectMailbox('queued path', {})).to.be.false; + }); + }); + describe('#selectMailbox', () => { + const path = '[Gmail]/Trash'; + beforeEach(() => { + sinon.stub(br, 'exec'); + }); + it('should run SELECT', () => { + br.exec.withArgs({ + command: 'SELECT', + attributes: [{ + type: 'STRING', + value: path + }] + }).returns(Promise.resolve({ + code: 'READ-WRITE' + })); + return br.selectMailbox(path).then(() => { + expect(br.exec.callCount).to.equal(1); + expect(br._state).to.equal(_client.STATE_SELECTED); + }); + }); + it('should run SELECT with CONDSTORE', () => { + br.exec.withArgs({ + command: 'SELECT', + attributes: [{ + type: 'STRING', + value: path + }, [{ + type: 'ATOM', + value: 'CONDSTORE' + }]] + }).returns(Promise.resolve({ + code: 'READ-WRITE' + })); + br._capability = ['CONDSTORE']; + return br.selectMailbox(path, { + condstore: true + }).then(() => { + expect(br.exec.callCount).to.equal(1); + expect(br._state).to.equal(_client.STATE_SELECTED); + }); + }); + describe('should emit onselectmailbox before selectMailbox is resolved', () => { + beforeEach(() => { + br.exec.returns(Promise.resolve({ + code: 'READ-WRITE' + })); + }); + it('when it returns a promise', () => { + var promiseResolved = false; + + br.onselectmailbox = () => new Promise(resolve => { + resolve(); + promiseResolved = true; + }); + + var onselectmailboxSpy = sinon.spy(br, 'onselectmailbox'); + return br.selectMailbox(path).then(() => { + expect(onselectmailboxSpy.withArgs(path).callCount).to.equal(1); + expect(promiseResolved).to.equal(true); + }); + }); + it('when it does not return a promise', () => { + br.onselectmailbox = () => {}; + + var onselectmailboxSpy = sinon.spy(br, 'onselectmailbox'); + return br.selectMailbox(path).then(() => { + expect(onselectmailboxSpy.withArgs(path).callCount).to.equal(1); + }); + }); + }); + it('should emit onclosemailbox', () => { + let called = false; + br.exec.returns(Promise.resolve('abc')).returns(Promise.resolve({ + code: 'READ-WRITE' + })); + + br.onclosemailbox = path => { + expect(path).to.equal('yyy'); + called = true; + }; + + br._selectedMailbox = 'yyy'; + return br.selectMailbox(path).then(() => { + expect(called).to.be.true; + }); + }); + }); + describe('#hasCapability', () => { + it('should detect existing capability', () => { + br._capability = ['ZZZ']; + expect(br.hasCapability('zzz')).to.be.true; + }); + it('should detect non existing capability', () => { + br._capability = ['ZZZ']; + expect(br.hasCapability('ooo')).to.be.false; + expect(br.hasCapability()).to.be.false; + }); + }); + describe('#_untaggedOkHandler', () => { + it('should update capability if present', () => { + br._untaggedOkHandler({ + capability: ['abc'] + }, () => {}); + + expect(br._capability).to.deep.equal(['abc']); + }); + }); + describe('#_untaggedCapabilityHandler', () => { + it('should update capability', () => { + br._untaggedCapabilityHandler({ + attributes: [{ + value: 'abc' + }] + }, () => {}); + + expect(br._capability).to.deep.equal(['ABC']); + }); + }); + describe('#_untaggedExistsHandler', () => { + it('should emit onupdate', () => { + br.onupdate = sinon.stub(); + br._selectedMailbox = 'FOO'; + + br._untaggedExistsHandler({ + nr: 123 + }, () => {}); + + expect(br.onupdate.withArgs('FOO', 'exists', 123).callCount).to.equal(1); + }); + }); + describe('#_untaggedExpungeHandler', () => { + it('should emit onupdate', () => { + br.onupdate = sinon.stub(); + br._selectedMailbox = 'FOO'; + + br._untaggedExpungeHandler({ + nr: 123 + }, () => {}); + + expect(br.onupdate.withArgs('FOO', 'expunge', 123).callCount).to.equal(1); + }); + }); + describe.skip('#_untaggedFetchHandler', () => { + it('should emit onupdate', () => { + br.onupdate = sinon.stub(); + sinon.stub(br, '_parseFETCH').returns('abc'); + br._selectedMailbox = 'FOO'; + + br._untaggedFetchHandler({ + nr: 123 + }, () => {}); + + expect(br.onupdate.withArgs('FOO', 'fetch', 'abc').callCount).to.equal(1); + expect(br._parseFETCH.args[0][0]).to.deep.equal({ + payload: { + FETCH: [{ + nr: 123 + }] + } + }); + }); + }); + describe('#_changeState', () => { + it('should set the state value', () => { + br._changeState(12345); + + expect(br._state).to.equal(12345); + }); + it('should emit onclosemailbox if mailbox was closed', () => { + br.onclosemailbox = sinon.stub(); + br._state = _client.STATE_SELECTED; + br._selectedMailbox = 'aaa'; + + br._changeState(12345); + + expect(br._selectedMailbox).to.be.false; + expect(br.onclosemailbox.withArgs('aaa').callCount).to.equal(1); + }); + }); + describe('#_ensurePath', () => { + it('should create the path if not present', () => { + var tree = { + children: [] + }; + expect(br._ensurePath(tree, 'hello/world', '/')).to.deep.equal({ + name: 'world', + delimiter: '/', + path: 'hello/world', + children: [] + }); + expect(tree).to.deep.equal({ + children: [{ + name: 'hello', + delimiter: '/', + path: 'hello', + children: [{ + name: 'world', + delimiter: '/', + path: 'hello/world', + children: [] + }] + }] + }); + }); + it('should return existing path if possible', () => { + var tree = { + children: [{ + name: 'hello', + delimiter: '/', + path: 'hello', + children: [{ + name: 'world', + delimiter: '/', + path: 'hello/world', + children: [], + abc: 123 + }] + }] + }; + expect(br._ensurePath(tree, 'hello/world', '/')).to.deep.equal({ + name: 'world', + delimiter: '/', + path: 'hello/world', + children: [], + abc: 123 + }); + }); + it('should handle case insensitive Inbox', () => { + var tree = { + children: [] + }; + expect(br._ensurePath(tree, 'Inbox/world', '/')).to.deep.equal({ + name: 'world', + delimiter: '/', + path: 'Inbox/world', + children: [] + }); + expect(br._ensurePath(tree, 'INBOX/worlds', '/')).to.deep.equal({ + name: 'worlds', + delimiter: '/', + path: 'INBOX/worlds', + children: [] + }); + expect(tree).to.deep.equal({ + children: [{ + name: 'Inbox', + delimiter: '/', + path: 'Inbox', + children: [{ + name: 'world', + delimiter: '/', + path: 'Inbox/world', + children: [] + }, { + name: 'worlds', + delimiter: '/', + path: 'INBOX/worlds', + children: [] + }] + }] + }); + }); + }); + describe('untagged updates', () => { + it('should receive information about untagged exists', done => { + br.client._connectionReady = true; + br._selectedMailbox = 'FOO'; + + br.onupdate = (path, type, value) => { + expect(path).to.equal('FOO'); + expect(type).to.equal('exists'); + expect(value).to.equal(123); + done(); + }; + + br.client._onData({ + /* * 123 EXISTS\r\n */ + data: new Uint8Array([42, 32, 49, 50, 51, 32, 69, 88, 73, 83, 84, 83, 13, 10]).buffer + }); + }); + it('should receive information about untagged expunge', done => { + br.client._connectionReady = true; + br._selectedMailbox = 'FOO'; + + br.onupdate = (path, type, value) => { + expect(path).to.equal('FOO'); + expect(type).to.equal('expunge'); + expect(value).to.equal(456); + done(); + }; + + br.client._onData({ + /* * 456 EXPUNGE\r\n */ + data: new Uint8Array([42, 32, 52, 53, 54, 32, 69, 88, 80, 85, 78, 71, 69, 13, 10]).buffer + }); + }); + it('should receive information about untagged fetch', done => { + br.client._connectionReady = true; + br._selectedMailbox = 'FOO'; + + br.onupdate = (path, type, value) => { + expect(path).to.equal('FOO'); + expect(type).to.equal('fetch'); + expect(value).to.deep.equal({ + '#': 123, + flags: ['\\Seen'], + modseq: '4' + }); + done(); + }; + + br.client._onData({ + /* * 123 FETCH (FLAGS (\\Seen) MODSEQ (4))\r\n */ + data: new Uint8Array([42, 32, 49, 50, 51, 32, 70, 69, 84, 67, 72, 32, 40, 70, 76, 65, 71, 83, 32, 40, 92, 83, 101, 101, 110, 41, 32, 77, 79, 68, 83, 69, 81, 32, 40, 52, 41, 41, 13, 10]).buffer + }); + }); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGllbnQtdW5pdC5qcyJdLCJuYW1lcyI6WyJkZXNjcmliZSIsImJyIiwiYmVmb3JlRWFjaCIsImF1dGgiLCJ1c2VyIiwicGFzcyIsIkltYXBDbGllbnQiLCJsb2dMZXZlbCIsImNsaWVudCIsInNvY2tldCIsInNlbmQiLCJ1cGdyYWRlVG9TZWN1cmUiLCJpdCIsInNpbm9uIiwic3R1YiIsIl9hdXRoZW50aWNhdGVkIiwiX2VudGVyZWRJZGxlIiwiX29uSWRsZSIsImV4cGVjdCIsImVudGVySWRsZSIsImNhbGxDb3VudCIsInRvIiwiZXF1YWwiLCJjb25uZWN0IiwicmV0dXJucyIsIlByb21pc2UiLCJyZXNvbHZlIiwiZW5xdWV1ZUNvbW1hbmQiLCJjYXBhYmlsaXR5Iiwic2V0VGltZW91dCIsIm9ucmVhZHkiLCJvcGVuQ29ubmVjdGlvbiIsInRoZW4iLCJjYWxsZWRPbmNlIiwiYmUiLCJ0cnVlIiwiX2NhcGFiaWxpdHkiLCJsZW5ndGgiLCJ1cGRhdGVDYXBhYmlsaXR5IiwidXBncmFkZUNvbm5lY3Rpb24iLCJ1cGRhdGVJZCIsImxvZ2luIiwiY29tcHJlc3NDb25uZWN0aW9uIiwiZG9uZSIsInRocm93cyIsIkVycm9yIiwiY2F0Y2giLCJlcnIiLCJleGlzdCIsImNsb3NlIiwiY2FsbGVkIiwiZmFsc2UiLCJ0aW1lb3V0Q29ubmVjdGlvbiIsIl9zdGF0ZSIsIlNUQVRFX0xPR09VVCIsImV4ZWMiLCJyZXMiLCJkZWVwIiwiYXJncyIsImNhbGxzRmFrZSIsImNvbW1hbmQiLCJfc2VsZWN0ZWRNYWlsYm94IiwidGltZW91dE5vb3AiLCJ1bmRlZmluZWQiLCJwYXlsb2FkIiwic2xpY2UiLCJjYWxsIiwiVWludDhBcnJheSIsInRpbWVvdXRJZGxlIiwiYnJlYWtJZGxlIiwic2VjdXJlTW9kZSIsIndpdGhBcmdzIiwidXBncmFkZSIsIl9yZXF1aXJlVExTIiwiTkFNRVNQQUNFIiwiYXR0cmlidXRlcyIsInR5cGUiLCJ2YWx1ZSIsImxpc3ROYW1lc3BhY2VzIiwibmFtZXNwYWNlcyIsInBlcnNvbmFsIiwicHJlZml4IiwiZGVsaW1pdGVyIiwidXNlcnMiLCJzaGFyZWQiLCJfZW5hYmxlQ29tcHJlc3Npb24iLCJlbmFibGVDb21wcmVzc2lvbiIsInNlbnNpdGl2ZSIsInhvYXV0aDIiLCJhIiwiYyIsInNlcnZlcklkIiwiSUQiLCJja2V5MSIsImNrZXkyIiwic2tleTEiLCJza2V5MiIsIkxJU1QiLCJMU1VCIiwibGlzdE1haWxib3hlcyIsInRyZWUiLCJjcmVhdGVNYWlsYm94IiwiZmFrZUVyciIsImNvZGUiLCJyZWplY3QiLCJkZWxldGVNYWlsYm94Iiwic2tpcCIsIl9idWlsZEZFVENIQ29tbWFuZCIsImJ5VWlkIiwibGlzdE1lc3NhZ2VzIiwiX3BhcnNlRkVUQ0giLCJfYnVpbGRTRUFSQ0hDb21tYW5kIiwidWlkIiwic2VhcmNoIiwiX3BhcnNlU0VBUkNIIiwidXBsb2FkIiwiZmxhZ3MiLCJfYnVpbGRTVE9SRUNvbW1hbmQiLCJzZXRGbGFncyIsInN0b3JlIiwiYWRkIiwiZGVsZXRlTWVzc2FnZXMiLCJjb3B5dWlkIiwiY29weU1lc3NhZ2VzIiwicmVzcG9uc2UiLCJzcmNTZXFTZXQiLCJkZXN0U2VxU2V0IiwibW92ZU1lc3NhZ2VzIiwiX3Nob3VsZFNlbGVjdE1haWxib3giLCJyZXF1ZXN0IiwicGF0aCIsInNlbGVjdE1haWxib3giLCJTVEFURV9TRUxFQ1RFRCIsImNvbmRzdG9yZSIsInByb21pc2VSZXNvbHZlZCIsIm9uc2VsZWN0bWFpbGJveCIsIm9uc2VsZWN0bWFpbGJveFNweSIsInNweSIsIm9uY2xvc2VtYWlsYm94IiwiaGFzQ2FwYWJpbGl0eSIsIl91bnRhZ2dlZE9rSGFuZGxlciIsIl91bnRhZ2dlZENhcGFiaWxpdHlIYW5kbGVyIiwib251cGRhdGUiLCJfdW50YWdnZWRFeGlzdHNIYW5kbGVyIiwibnIiLCJfdW50YWdnZWRFeHB1bmdlSGFuZGxlciIsIl91bnRhZ2dlZEZldGNoSGFuZGxlciIsIkZFVENIIiwiX2NoYW5nZVN0YXRlIiwiY2hpbGRyZW4iLCJfZW5zdXJlUGF0aCIsIm5hbWUiLCJhYmMiLCJfY29ubmVjdGlvblJlYWR5IiwiX29uRGF0YSIsImRhdGEiLCJidWZmZXIiLCJtb2RzZXEiXSwibWFwcGluZ3MiOiI7O0FBRUE7O0FBQ0E7O0FBQ0E7Ozs7OztBQUpBO0FBU0FBLFFBQVEsQ0FBQyx1QkFBRCxFQUEwQixNQUFNO0FBQ3RDLE1BQUlDLEVBQUo7QUFFQUMsRUFBQUEsVUFBVSxDQUFDLE1BQU07QUFDZixVQUFNQyxJQUFJLEdBQUc7QUFBRUMsTUFBQUEsSUFBSSxFQUFFLFVBQVI7QUFBb0JDLE1BQUFBLElBQUksRUFBRTtBQUExQixLQUFiO0FBQ0FKLElBQUFBLEVBQUUsR0FBRyxJQUFJSyxlQUFKLENBQWUsVUFBZixFQUEyQixJQUEzQixFQUFpQztBQUFFSCxNQUFBQSxJQUFGO0FBQVFJLE1BQUFBLFFBQVEsRUFBUkE7QUFBUixLQUFqQyxDQUFMO0FBQ0FOLElBQUFBLEVBQUUsQ0FBQ08sTUFBSCxDQUFVQyxNQUFWLEdBQW1CO0FBQ2pCQyxNQUFBQSxJQUFJLEVBQUUsTUFBTSxDQUFHLENBREU7QUFFakJDLE1BQUFBLGVBQWUsRUFBRSxNQUFNLENBQUc7QUFGVCxLQUFuQjtBQUlELEdBUFMsQ0FBVjtBQVNBWCxFQUFBQSxRQUFRLENBQUMsVUFBRCxFQUFhLE1BQU07QUFDekJZLElBQUFBLEVBQUUsQ0FBQyx1QkFBRCxFQUEwQixNQUFNO0FBQ2hDQyxNQUFBQSxLQUFLLENBQUNDLElBQU4sQ0FBV2IsRUFBWCxFQUFlLFdBQWY7QUFFQUEsTUFBQUEsRUFBRSxDQUFDYyxjQUFILEdBQW9CLElBQXBCO0FBQ0FkLE1BQUFBLEVBQUUsQ0FBQ2UsWUFBSCxHQUFrQixLQUFsQjs7QUFDQWYsTUFBQUEsRUFBRSxDQUFDZ0IsT0FBSDs7QUFFQUMsTUFBQUEsTUFBTSxDQUFDakIsRUFBRSxDQUFDa0IsU0FBSCxDQUFhQyxTQUFkLENBQU4sQ0FBK0JDLEVBQS9CLENBQWtDQyxLQUFsQyxDQUF3QyxDQUF4QztBQUNELEtBUkMsQ0FBRjtBQVVBVixJQUFBQSxFQUFFLENBQUMsMkJBQUQsRUFBOEIsTUFBTTtBQUNwQ0MsTUFBQUEsS0FBSyxDQUFDQyxJQUFOLENBQVdiLEVBQVgsRUFBZSxXQUFmO0FBRUFBLE1BQUFBLEVBQUUsQ0FBQ2UsWUFBSCxHQUFrQixJQUFsQjs7QUFDQWYsTUFBQUEsRUFBRSxDQUFDZ0IsT0FBSDs7QUFFQUMsTUFBQUEsTUFBTSxDQUFDakIsRUFBRSxDQUFDa0IsU0FBSCxDQUFhQyxTQUFkLENBQU4sQ0FBK0JDLEVBQS9CLENBQWtDQyxLQUFsQyxDQUF3QyxDQUF4QztBQUNELEtBUEMsQ0FBRjtBQVFELEdBbkJPLENBQVI7QUFxQkF0QixFQUFBQSxRQUFRLENBQUMsaUJBQUQsRUFBb0IsTUFBTTtBQUNoQ0UsSUFBQUEsVUFBVSxDQUFDLE1BQU07QUFDZlcsTUFBQUEsS0FBSyxDQUFDQyxJQUFOLENBQVdiLEVBQUUsQ0FBQ08sTUFBZCxFQUFzQixTQUF0QjtBQUNBSyxNQUFBQSxLQUFLLENBQUNDLElBQU4sQ0FBV2IsRUFBRSxDQUFDTyxNQUFkLEVBQXNCLE9BQXRCO0FBQ0FLLE1BQUFBLEtBQUssQ0FBQ0MsSUFBTixDQUFXYixFQUFFLENBQUNPLE1BQWQsRUFBc0IsZ0JBQXRCO0FBQ0QsS0FKUyxDQUFWO0FBS0FJLElBQUFBLEVBQUUsQ0FBQyx3QkFBRCxFQUEyQixNQUFNO0FBQ2pDWCxNQUFBQSxFQUFFLENBQUNPLE1BQUgsQ0FBVWUsT0FBVixDQUFrQkMsT0FBbEIsQ0FBMEJDLE9BQU8sQ0FBQ0MsT0FBUixFQUExQjtBQUNBekIsTUFBQUEsRUFBRSxDQUFDTyxNQUFILENBQVVtQixjQUFWLENBQXlCSCxPQUF6QixDQUFpQ0MsT0FBTyxDQUFDQyxPQUFSLENBQWdCO0FBQy9DRSxRQUFBQSxVQUFVLEVBQUUsQ0FBQyxPQUFELEVBQVUsT0FBVjtBQURtQyxPQUFoQixDQUFqQztBQUdBQyxNQUFBQSxVQUFVLENBQUMsTUFBTTVCLEVBQUUsQ0FBQ08sTUFBSCxDQUFVc0IsT0FBVixFQUFQLEVBQTRCLENBQTVCLENBQVY7QUFDQSxhQUFPN0IsRUFBRSxDQUFDOEIsY0FBSCxHQUFvQkMsSUFBcEIsQ0FBeUIsTUFBTTtBQUNwQ2QsUUFBQUEsTUFBTSxDQUFDakIsRUFBRSxDQUFDTyxNQUFILENBQVVlLE9BQVYsQ0FBa0JVLFVBQW5CLENBQU4sQ0FBcUNaLEVBQXJDLENBQXdDYSxFQUF4QyxDQUEyQ0MsSUFBM0M7QUFDQWpCLFFBQUFBLE1BQU0sQ0FBQ2pCLEVBQUUsQ0FBQ08sTUFBSCxDQUFVbUIsY0FBVixDQUF5Qk0sVUFBMUIsQ0FBTixDQUE0Q1osRUFBNUMsQ0FBK0NhLEVBQS9DLENBQWtEQyxJQUFsRDtBQUNBakIsUUFBQUEsTUFBTSxDQUFDakIsRUFBRSxDQUFDbUMsV0FBSCxDQUFlQyxNQUFoQixDQUFOLENBQThCaEIsRUFBOUIsQ0FBaUNDLEtBQWpDLENBQXVDLENBQXZDO0FBQ0FKLFFBQUFBLE1BQU0sQ0FBQ2pCLEVBQUUsQ0FBQ21DLFdBQUgsQ0FBZSxDQUFmLENBQUQsQ0FBTixDQUEwQmYsRUFBMUIsQ0FBNkJDLEtBQTdCLENBQW1DLE9BQW5DO0FBQ0FKLFFBQUFBLE1BQU0sQ0FBQ2pCLEVBQUUsQ0FBQ21DLFdBQUgsQ0FBZSxDQUFmLENBQUQsQ0FBTixDQUEwQmYsRUFBMUIsQ0FBNkJDLEtBQTdCLENBQW1DLE9BQW5DO0FBQ0QsT0FOTSxDQUFQO0FBT0QsS0FiQyxDQUFGO0FBY0QsR0FwQk8sQ0FBUjtBQXNCQXRCLEVBQUFBLFFBQVEsQ0FBQyxVQUFELEVBQWEsTUFBTTtBQUN6QkUsSUFBQUEsVUFBVSxDQUFDLE1BQU07QUFDZlcsTUFBQUEsS0FBSyxDQUFDQyxJQUFOLENBQVdiLEVBQUUsQ0FBQ08sTUFBZCxFQUFzQixTQUF0QjtBQUNBSyxNQUFBQSxLQUFLLENBQUNDLElBQU4sQ0FBV2IsRUFBRSxDQUFDTyxNQUFkLEVBQXNCLE9BQXRCO0FBQ0FLLE1BQUFBLEtBQUssQ0FBQ0MsSUFBTixDQUFXYixFQUFYLEVBQWUsa0JBQWY7QUFDQVksTUFBQUEsS0FBSyxDQUFDQyxJQUFOLENBQVdiLEVBQVgsRUFBZSxtQkFBZjtBQUNBWSxNQUFBQSxLQUFLLENBQUNDLElBQU4sQ0FBV2IsRUFBWCxFQUFlLFVBQWY7QUFDQVksTUFBQUEsS0FBSyxDQUFDQyxJQUFOLENBQVdiLEVBQVgsRUFBZSxPQUFmO0FBQ0FZLE1BQUFBLEtBQUssQ0FBQ0MsSUFBTixDQUFXYixFQUFYLEVBQWUsb0JBQWY7QUFDRCxLQVJTLENBQVY7QUFVQVcsSUFBQUEsRUFBRSxDQUFDLGdCQUFELEVBQW1CLE1BQU07QUFDekJYLE1BQUFBLEVBQUUsQ0FBQ08sTUFBSCxDQUFVZSxPQUFWLENBQWtCQyxPQUFsQixDQUEwQkMsT0FBTyxDQUFDQyxPQUFSLEVBQTFCO0FBQ0F6QixNQUFBQSxFQUFFLENBQUNxQyxnQkFBSCxDQUFvQmQsT0FBcEIsQ0FBNEJDLE9BQU8sQ0FBQ0MsT0FBUixFQUE1QjtBQUNBekIsTUFBQUEsRUFBRSxDQUFDc0MsaUJBQUgsQ0FBcUJmLE9BQXJCLENBQTZCQyxPQUFPLENBQUNDLE9BQVIsRUFBN0I7QUFDQXpCLE1BQUFBLEVBQUUsQ0FBQ3VDLFFBQUgsQ0FBWWhCLE9BQVosQ0FBb0JDLE9BQU8sQ0FBQ0MsT0FBUixFQUFwQjtBQUNBekIsTUFBQUEsRUFBRSxDQUFDd0MsS0FBSCxDQUFTakIsT0FBVCxDQUFpQkMsT0FBTyxDQUFDQyxPQUFSLEVBQWpCO0FBQ0F6QixNQUFBQSxFQUFFLENBQUN5QyxrQkFBSCxDQUFzQmxCLE9BQXRCLENBQThCQyxPQUFPLENBQUNDLE9BQVIsRUFBOUI7QUFFQUcsTUFBQUEsVUFBVSxDQUFDLE1BQU01QixFQUFFLENBQUNPLE1BQUgsQ0FBVXNCLE9BQVYsRUFBUCxFQUE0QixDQUE1QixDQUFWO0FBQ0EsYUFBTzdCLEVBQUUsQ0FBQ3NCLE9BQUgsR0FBYVMsSUFBYixDQUFrQixNQUFNO0FBQzdCZCxRQUFBQSxNQUFNLENBQUNqQixFQUFFLENBQUNPLE1BQUgsQ0FBVWUsT0FBVixDQUFrQlUsVUFBbkIsQ0FBTixDQUFxQ1osRUFBckMsQ0FBd0NhLEVBQXhDLENBQTJDQyxJQUEzQztBQUNBakIsUUFBQUEsTUFBTSxDQUFDakIsRUFBRSxDQUFDcUMsZ0JBQUgsQ0FBb0JMLFVBQXJCLENBQU4sQ0FBdUNaLEVBQXZDLENBQTBDYSxFQUExQyxDQUE2Q0MsSUFBN0M7QUFDQWpCLFFBQUFBLE1BQU0sQ0FBQ2pCLEVBQUUsQ0FBQ3NDLGlCQUFILENBQXFCTixVQUF0QixDQUFOLENBQXdDWixFQUF4QyxDQUEyQ2EsRUFBM0MsQ0FBOENDLElBQTlDO0FBQ0FqQixRQUFBQSxNQUFNLENBQUNqQixFQUFFLENBQUN1QyxRQUFILENBQVlQLFVBQWIsQ0FBTixDQUErQlosRUFBL0IsQ0FBa0NhLEVBQWxDLENBQXFDQyxJQUFyQztBQUNBakIsUUFBQUEsTUFBTSxDQUFDakIsRUFBRSxDQUFDd0MsS0FBSCxDQUFTUixVQUFWLENBQU4sQ0FBNEJaLEVBQTVCLENBQStCYSxFQUEvQixDQUFrQ0MsSUFBbEM7QUFDQWpCLFFBQUFBLE1BQU0sQ0FBQ2pCLEVBQUUsQ0FBQ3lDLGtCQUFILENBQXNCVCxVQUF2QixDQUFOLENBQXlDWixFQUF6QyxDQUE0Q2EsRUFBNUMsQ0FBK0NDLElBQS9DO0FBQ0QsT0FQTSxDQUFQO0FBUUQsS0FqQkMsQ0FBRjtBQW1CQXZCLElBQUFBLEVBQUUsQ0FBQyxzQkFBRCxFQUEwQitCLElBQUQsSUFBVTtBQUNuQzFDLE1BQUFBLEVBQUUsQ0FBQ08sTUFBSCxDQUFVZSxPQUFWLENBQWtCQyxPQUFsQixDQUEwQkMsT0FBTyxDQUFDQyxPQUFSLEVBQTFCO0FBQ0F6QixNQUFBQSxFQUFFLENBQUNxQyxnQkFBSCxDQUFvQmQsT0FBcEIsQ0FBNEJDLE9BQU8sQ0FBQ0MsT0FBUixFQUE1QjtBQUNBekIsTUFBQUEsRUFBRSxDQUFDc0MsaUJBQUgsQ0FBcUJmLE9BQXJCLENBQTZCQyxPQUFPLENBQUNDLE9BQVIsRUFBN0I7QUFDQXpCLE1BQUFBLEVBQUUsQ0FBQ3VDLFFBQUgsQ0FBWWhCLE9BQVosQ0FBb0JDLE9BQU8sQ0FBQ0MsT0FBUixFQUFwQjtBQUNBekIsTUFBQUEsRUFBRSxDQUFDd0MsS0FBSCxDQUFTRyxNQUFULENBQWdCLElBQUlDLEtBQUosRUFBaEI7QUFFQWhCLE1BQUFBLFVBQVUsQ0FBQyxNQUFNNUIsRUFBRSxDQUFDTyxNQUFILENBQVVzQixPQUFWLEVBQVAsRUFBNEIsQ0FBNUIsQ0FBVjtBQUNBN0IsTUFBQUEsRUFBRSxDQUFDc0IsT0FBSCxHQUFhdUIsS0FBYixDQUFvQkMsR0FBRCxJQUFTO0FBQzFCN0IsUUFBQUEsTUFBTSxDQUFDNkIsR0FBRCxDQUFOLENBQVkxQixFQUFaLENBQWUyQixLQUFmO0FBRUE5QixRQUFBQSxNQUFNLENBQUNqQixFQUFFLENBQUNPLE1BQUgsQ0FBVWUsT0FBVixDQUFrQlUsVUFBbkIsQ0FBTixDQUFxQ1osRUFBckMsQ0FBd0NhLEVBQXhDLENBQTJDQyxJQUEzQztBQUNBakIsUUFBQUEsTUFBTSxDQUFDakIsRUFBRSxDQUFDTyxNQUFILENBQVV5QyxLQUFWLENBQWdCaEIsVUFBakIsQ0FBTixDQUFtQ1osRUFBbkMsQ0FBc0NhLEVBQXRDLENBQXlDQyxJQUF6QztBQUNBakIsUUFBQUEsTUFBTSxDQUFDakIsRUFBRSxDQUFDcUMsZ0JBQUgsQ0FBb0JMLFVBQXJCLENBQU4sQ0FBdUNaLEVBQXZDLENBQTBDYSxFQUExQyxDQUE2Q0MsSUFBN0M7QUFDQWpCLFFBQUFBLE1BQU0sQ0FBQ2pCLEVBQUUsQ0FBQ3NDLGlCQUFILENBQXFCTixVQUF0QixDQUFOLENBQXdDWixFQUF4QyxDQUEyQ2EsRUFBM0MsQ0FBOENDLElBQTlDO0FBQ0FqQixRQUFBQSxNQUFNLENBQUNqQixFQUFFLENBQUN1QyxRQUFILENBQVlQLFVBQWIsQ0FBTixDQUErQlosRUFBL0IsQ0FBa0NhLEVBQWxDLENBQXFDQyxJQUFyQztBQUNBakIsUUFBQUEsTUFBTSxDQUFDakIsRUFBRSxDQUFDd0MsS0FBSCxDQUFTUixVQUFWLENBQU4sQ0FBNEJaLEVBQTVCLENBQStCYSxFQUEvQixDQUFrQ0MsSUFBbEM7QUFFQWpCLFFBQUFBLE1BQU0sQ0FBQ2pCLEVBQUUsQ0FBQ3lDLGtCQUFILENBQXNCUSxNQUF2QixDQUFOLENBQXFDN0IsRUFBckMsQ0FBd0NhLEVBQXhDLENBQTJDaUIsS0FBM0M7QUFFQVIsUUFBQUEsSUFBSTtBQUNMLE9BYkQ7QUFjRCxLQXRCQyxDQUFGO0FBd0JBL0IsSUFBQUEsRUFBRSxDQUFDLGdCQUFELEVBQW9CK0IsSUFBRCxJQUFVO0FBQzdCMUMsTUFBQUEsRUFBRSxDQUFDTyxNQUFILENBQVVlLE9BQVYsQ0FBa0JDLE9BQWxCLENBQTBCQyxPQUFPLENBQUNDLE9BQVIsRUFBMUI7QUFDQXpCLE1BQUFBLEVBQUUsQ0FBQ21ELGlCQUFILEdBQXVCLENBQXZCO0FBRUFuRCxNQUFBQSxFQUFFLENBQUNzQixPQUFILEdBQWF1QixLQUFiLENBQW9CQyxHQUFELElBQVM7QUFDMUI3QixRQUFBQSxNQUFNLENBQUM2QixHQUFELENBQU4sQ0FBWTFCLEVBQVosQ0FBZTJCLEtBQWY7QUFFQTlCLFFBQUFBLE1BQU0sQ0FBQ2pCLEVBQUUsQ0FBQ08sTUFBSCxDQUFVZSxPQUFWLENBQWtCVSxVQUFuQixDQUFOLENBQXFDWixFQUFyQyxDQUF3Q2EsRUFBeEMsQ0FBMkNDLElBQTNDO0FBQ0FqQixRQUFBQSxNQUFNLENBQUNqQixFQUFFLENBQUNPLE1BQUgsQ0FBVXlDLEtBQVYsQ0FBZ0JoQixVQUFqQixDQUFOLENBQW1DWixFQUFuQyxDQUFzQ2EsRUFBdEMsQ0FBeUNDLElBQXpDO0FBRUFqQixRQUFBQSxNQUFNLENBQUNqQixFQUFFLENBQUNxQyxnQkFBSCxDQUFvQlksTUFBckIsQ0FBTixDQUFtQzdCLEVBQW5DLENBQXNDYSxFQUF0QyxDQUF5Q2lCLEtBQXpDO0FBQ0FqQyxRQUFBQSxNQUFNLENBQUNqQixFQUFFLENBQUNzQyxpQkFBSCxDQUFxQlcsTUFBdEIsQ0FBTixDQUFvQzdCLEVBQXBDLENBQXVDYSxFQUF2QyxDQUEwQ2lCLEtBQTFDO0FBQ0FqQyxRQUFBQSxNQUFNLENBQUNqQixFQUFFLENBQUN1QyxRQUFILENBQVlVLE1BQWIsQ0FBTixDQUEyQjdCLEVBQTNCLENBQThCYSxFQUE5QixDQUFpQ2lCLEtBQWpDO0FBQ0FqQyxRQUFBQSxNQUFNLENBQUNqQixFQUFFLENBQUN3QyxLQUFILENBQVNTLE1BQVYsQ0FBTixDQUF3QjdCLEVBQXhCLENBQTJCYSxFQUEzQixDQUE4QmlCLEtBQTlCO0FBQ0FqQyxRQUFBQSxNQUFNLENBQUNqQixFQUFFLENBQUN5QyxrQkFBSCxDQUFzQlEsTUFBdkIsQ0FBTixDQUFxQzdCLEVBQXJDLENBQXdDYSxFQUF4QyxDQUEyQ2lCLEtBQTNDO0FBRUFSLFFBQUFBLElBQUk7QUFDTCxPQWJEO0FBY0QsS0FsQkMsQ0FBRjtBQW1CRCxHQXpFTyxDQUFSO0FBMkVBM0MsRUFBQUEsUUFBUSxDQUFDLFFBQUQsRUFBVyxNQUFNO0FBQ3ZCWSxJQUFBQSxFQUFFLENBQUMsb0JBQUQsRUFBdUIsTUFBTTtBQUM3QkMsTUFBQUEsS0FBSyxDQUFDQyxJQUFOLENBQVdiLEVBQUUsQ0FBQ08sTUFBZCxFQUFzQixPQUF0QixFQUErQmdCLE9BQS9CLENBQXVDQyxPQUFPLENBQUNDLE9BQVIsRUFBdkM7QUFFQSxhQUFPekIsRUFBRSxDQUFDZ0QsS0FBSCxHQUFXakIsSUFBWCxDQUFnQixNQUFNO0FBQzNCZCxRQUFBQSxNQUFNLENBQUNqQixFQUFFLENBQUNvRCxNQUFKLENBQU4sQ0FBa0JoQyxFQUFsQixDQUFxQkMsS0FBckIsQ0FBMkJnQyxvQkFBM0I7QUFDQXBDLFFBQUFBLE1BQU0sQ0FBQ2pCLEVBQUUsQ0FBQ08sTUFBSCxDQUFVeUMsS0FBVixDQUFnQmhCLFVBQWpCLENBQU4sQ0FBbUNaLEVBQW5DLENBQXNDYSxFQUF0QyxDQUF5Q0MsSUFBekM7QUFDRCxPQUhNLENBQVA7QUFJRCxLQVBDLENBQUY7QUFRRCxHQVRPLENBQVI7QUFXQW5DLEVBQUFBLFFBQVEsQ0FBQyxPQUFELEVBQVUsTUFBTTtBQUN0QkUsSUFBQUEsVUFBVSxDQUFDLE1BQU07QUFDZlcsTUFBQUEsS0FBSyxDQUFDQyxJQUFOLENBQVdiLEVBQVgsRUFBZSxXQUFmO0FBQ0QsS0FGUyxDQUFWO0FBSUFXLElBQUFBLEVBQUUsQ0FBQyw0QkFBRCxFQUErQixNQUFNO0FBQ3JDQyxNQUFBQSxLQUFLLENBQUNDLElBQU4sQ0FBV2IsRUFBRSxDQUFDTyxNQUFkLEVBQXNCLGdCQUF0QixFQUF3Q2dCLE9BQXhDLENBQWdEQyxPQUFPLENBQUNDLE9BQVIsQ0FBZ0IsRUFBaEIsQ0FBaEQ7QUFDQSxhQUFPekIsRUFBRSxDQUFDc0QsSUFBSCxDQUFRLE1BQVIsRUFBZ0J2QixJQUFoQixDQUFzQndCLEdBQUQsSUFBUztBQUNuQ3RDLFFBQUFBLE1BQU0sQ0FBQ3NDLEdBQUQsQ0FBTixDQUFZbkMsRUFBWixDQUFlb0MsSUFBZixDQUFvQm5DLEtBQXBCLENBQTBCLEVBQTFCO0FBQ0FKLFFBQUFBLE1BQU0sQ0FBQ2pCLEVBQUUsQ0FBQ08sTUFBSCxDQUFVbUIsY0FBVixDQUF5QitCLElBQXpCLENBQThCLENBQTlCLEVBQWlDLENBQWpDLENBQUQsQ0FBTixDQUE0Q3JDLEVBQTVDLENBQStDQyxLQUEvQyxDQUFxRCxNQUFyRDtBQUNELE9BSE0sQ0FBUDtBQUlELEtBTkMsQ0FBRjtBQVFBVixJQUFBQSxFQUFFLENBQUMsd0NBQUQsRUFBMkMsTUFBTTtBQUNqREMsTUFBQUEsS0FBSyxDQUFDQyxJQUFOLENBQVdiLEVBQUUsQ0FBQ08sTUFBZCxFQUFzQixnQkFBdEIsRUFBd0NnQixPQUF4QyxDQUFnREMsT0FBTyxDQUFDQyxPQUFSLENBQWdCO0FBQzlERSxRQUFBQSxVQUFVLEVBQUUsQ0FBQyxHQUFELEVBQU0sR0FBTjtBQURrRCxPQUFoQixDQUFoRDtBQUdBLGFBQU8zQixFQUFFLENBQUNzRCxJQUFILENBQVEsTUFBUixFQUFnQnZCLElBQWhCLENBQXNCd0IsR0FBRCxJQUFTO0FBQ25DdEMsUUFBQUEsTUFBTSxDQUFDc0MsR0FBRCxDQUFOLENBQVluQyxFQUFaLENBQWVvQyxJQUFmLENBQW9CbkMsS0FBcEIsQ0FBMEI7QUFDeEJNLFVBQUFBLFVBQVUsRUFBRSxDQUFDLEdBQUQsRUFBTSxHQUFOO0FBRFksU0FBMUI7QUFHQVYsUUFBQUEsTUFBTSxDQUFDakIsRUFBRSxDQUFDbUMsV0FBSixDQUFOLENBQXVCZixFQUF2QixDQUEwQm9DLElBQTFCLENBQStCbkMsS0FBL0IsQ0FBcUMsQ0FBQyxHQUFELEVBQU0sR0FBTixDQUFyQztBQUNELE9BTE0sQ0FBUDtBQU1ELEtBVkMsQ0FBRjtBQVdELEdBeEJPLENBQVI7QUEwQkF0QixFQUFBQSxRQUFRLENBQUMsWUFBRCxFQUFlLE1BQU07QUFDM0JZLElBQUFBLEVBQUUsQ0FBQyxxREFBRCxFQUF5RCtCLElBQUQsSUFBVTtBQUNsRTlCLE1BQUFBLEtBQUssQ0FBQ0MsSUFBTixDQUFXYixFQUFYLEVBQWUsTUFBZixFQUF1QjBELFNBQXZCLENBQWtDQyxPQUFELElBQWE7QUFDNUMxQyxRQUFBQSxNQUFNLENBQUMwQyxPQUFELENBQU4sQ0FBZ0J2QyxFQUFoQixDQUFtQkMsS0FBbkIsQ0FBeUIsTUFBekI7QUFFQXFCLFFBQUFBLElBQUk7QUFDTCxPQUpEO0FBTUExQyxNQUFBQSxFQUFFLENBQUNtQyxXQUFILEdBQWlCLEVBQWpCO0FBQ0FuQyxNQUFBQSxFQUFFLENBQUM0RCxnQkFBSCxHQUFzQixLQUF0QjtBQUNBNUQsTUFBQUEsRUFBRSxDQUFDNkQsV0FBSCxHQUFpQixDQUFqQjtBQUNBN0QsTUFBQUEsRUFBRSxDQUFDa0IsU0FBSDtBQUNELEtBWEMsQ0FBRjtBQWFBUCxJQUFBQSxFQUFFLENBQUMsc0RBQUQsRUFBMEQrQixJQUFELElBQVU7QUFDbkU5QixNQUFBQSxLQUFLLENBQUNDLElBQU4sQ0FBV2IsRUFBWCxFQUFlLE1BQWYsRUFBdUIwRCxTQUF2QixDQUFrQ0MsT0FBRCxJQUFhO0FBQzVDMUMsUUFBQUEsTUFBTSxDQUFDMEMsT0FBRCxDQUFOLENBQWdCdkMsRUFBaEIsQ0FBbUJDLEtBQW5CLENBQXlCLE1BQXpCO0FBRUFxQixRQUFBQSxJQUFJO0FBQ0wsT0FKRDtBQU1BMUMsTUFBQUEsRUFBRSxDQUFDbUMsV0FBSCxHQUFpQixDQUFDLE1BQUQsQ0FBakI7QUFDQW5DLE1BQUFBLEVBQUUsQ0FBQzRELGdCQUFILEdBQXNCRSxTQUF0QjtBQUNBOUQsTUFBQUEsRUFBRSxDQUFDNkQsV0FBSCxHQUFpQixDQUFqQjtBQUNBN0QsTUFBQUEsRUFBRSxDQUFDa0IsU0FBSDtBQUNELEtBWEMsQ0FBRjtBQWFBUCxJQUFBQSxFQUFFLENBQUMsaUNBQUQsRUFBcUMrQixJQUFELElBQVU7QUFDOUM5QixNQUFBQSxLQUFLLENBQUNDLElBQU4sQ0FBV2IsRUFBRSxDQUFDTyxNQUFkLEVBQXNCLGdCQUF0QjtBQUNBSyxNQUFBQSxLQUFLLENBQUNDLElBQU4sQ0FBV2IsRUFBRSxDQUFDTyxNQUFILENBQVVDLE1BQXJCLEVBQTZCLE1BQTdCLEVBQXFDa0QsU0FBckMsQ0FBZ0RLLE9BQUQsSUFBYTtBQUMxRDlDLFFBQUFBLE1BQU0sQ0FBQ2pCLEVBQUUsQ0FBQ08sTUFBSCxDQUFVbUIsY0FBVixDQUF5QitCLElBQXpCLENBQThCLENBQTlCLEVBQWlDLENBQWpDLEVBQW9DRSxPQUFyQyxDQUFOLENBQW9EdkMsRUFBcEQsQ0FBdURDLEtBQXZELENBQTZELE1BQTdEO0FBQ0FKLFFBQUFBLE1BQU0sQ0FBQyxHQUFHK0MsS0FBSCxDQUFTQyxJQUFULENBQWMsSUFBSUMsVUFBSixDQUFlSCxPQUFmLENBQWQsQ0FBRCxDQUFOLENBQStDM0MsRUFBL0MsQ0FBa0RvQyxJQUFsRCxDQUF1RG5DLEtBQXZELENBQTZELENBQUMsSUFBRCxFQUFPLElBQVAsRUFBYSxJQUFiLEVBQW1CLElBQW5CLEVBQXlCLElBQXpCLEVBQStCLElBQS9CLENBQTdEO0FBRUFxQixRQUFBQSxJQUFJO0FBQ0wsT0FMRDtBQU9BMUMsTUFBQUEsRUFBRSxDQUFDbUMsV0FBSCxHQUFpQixDQUFDLE1BQUQsQ0FBakI7QUFDQW5DLE1BQUFBLEVBQUUsQ0FBQzRELGdCQUFILEdBQXNCLEtBQXRCO0FBQ0E1RCxNQUFBQSxFQUFFLENBQUNtRSxXQUFILEdBQWlCLENBQWpCO0FBQ0FuRSxNQUFBQSxFQUFFLENBQUNrQixTQUFIO0FBQ0QsS0FiQyxDQUFGO0FBY0QsR0F6Q08sQ0FBUjtBQTJDQW5CLEVBQUFBLFFBQVEsQ0FBQyxZQUFELEVBQWUsTUFBTTtBQUMzQlksSUFBQUEsRUFBRSxDQUFDLDRCQUFELEVBQStCLE1BQU07QUFDckNDLE1BQUFBLEtBQUssQ0FBQ0MsSUFBTixDQUFXYixFQUFFLENBQUNPLE1BQUgsQ0FBVUMsTUFBckIsRUFBNkIsTUFBN0I7QUFFQVIsTUFBQUEsRUFBRSxDQUFDZSxZQUFILEdBQWtCLE1BQWxCO0FBQ0FmLE1BQUFBLEVBQUUsQ0FBQ29FLFNBQUg7QUFDQW5ELE1BQUFBLE1BQU0sQ0FBQyxHQUFHK0MsS0FBSCxDQUFTQyxJQUFULENBQWMsSUFBSUMsVUFBSixDQUFlbEUsRUFBRSxDQUFDTyxNQUFILENBQVVDLE1BQVYsQ0FBaUJDLElBQWpCLENBQXNCZ0QsSUFBdEIsQ0FBMkIsQ0FBM0IsRUFBOEIsQ0FBOUIsQ0FBZixDQUFkLENBQUQsQ0FBTixDQUF3RXJDLEVBQXhFLENBQTJFb0MsSUFBM0UsQ0FBZ0ZuQyxLQUFoRixDQUFzRixDQUFDLElBQUQsRUFBTyxJQUFQLEVBQWEsSUFBYixFQUFtQixJQUFuQixFQUF5QixJQUF6QixFQUErQixJQUEvQixDQUF0RjtBQUNELEtBTkMsQ0FBRjtBQU9ELEdBUk8sQ0FBUjtBQVVBdEIsRUFBQUEsUUFBUSxDQUFDLG9CQUFELEVBQXVCLE1BQU07QUFDbkNZLElBQUFBLEVBQUUsQ0FBQyxzQ0FBRCxFQUF5QyxNQUFNO0FBQy9DWCxNQUFBQSxFQUFFLENBQUNPLE1BQUgsQ0FBVThELFVBQVYsR0FBdUIsSUFBdkI7QUFDQXJFLE1BQUFBLEVBQUUsQ0FBQ21DLFdBQUgsR0FBaUIsQ0FBQyxVQUFELENBQWpCO0FBQ0EsYUFBT25DLEVBQUUsQ0FBQ3NDLGlCQUFILEVBQVA7QUFDRCxLQUpDLENBQUY7QUFNQTNCLElBQUFBLEVBQUUsQ0FBQyw2Q0FBRCxFQUFnRCxNQUFNO0FBQ3REWCxNQUFBQSxFQUFFLENBQUNPLE1BQUgsQ0FBVThELFVBQVYsR0FBdUIsS0FBdkI7QUFDQXJFLE1BQUFBLEVBQUUsQ0FBQ21DLFdBQUgsR0FBaUIsRUFBakI7QUFDQSxhQUFPbkMsRUFBRSxDQUFDc0MsaUJBQUgsRUFBUDtBQUNELEtBSkMsQ0FBRjtBQU1BM0IsSUFBQUEsRUFBRSxDQUFDLHFCQUFELEVBQXdCLE1BQU07QUFDOUJDLE1BQUFBLEtBQUssQ0FBQ0MsSUFBTixDQUFXYixFQUFFLENBQUNPLE1BQWQsRUFBc0IsU0FBdEI7QUFDQUssTUFBQUEsS0FBSyxDQUFDQyxJQUFOLENBQVdiLEVBQVgsRUFBZSxNQUFmLEVBQXVCc0UsUUFBdkIsQ0FBZ0MsVUFBaEMsRUFBNEMvQyxPQUE1QyxDQUFvREMsT0FBTyxDQUFDQyxPQUFSLEVBQXBEO0FBQ0FiLE1BQUFBLEtBQUssQ0FBQ0MsSUFBTixDQUFXYixFQUFYLEVBQWUsa0JBQWYsRUFBbUN1QixPQUFuQyxDQUEyQ0MsT0FBTyxDQUFDQyxPQUFSLEVBQTNDO0FBRUF6QixNQUFBQSxFQUFFLENBQUNtQyxXQUFILEdBQWlCLENBQUMsVUFBRCxDQUFqQjtBQUVBLGFBQU9uQyxFQUFFLENBQUNzQyxpQkFBSCxHQUF1QlAsSUFBdkIsQ0FBNEIsTUFBTTtBQUN2Q2QsUUFBQUEsTUFBTSxDQUFDakIsRUFBRSxDQUFDTyxNQUFILENBQVVnRSxPQUFWLENBQWtCcEQsU0FBbkIsQ0FBTixDQUFvQ0MsRUFBcEMsQ0FBdUNDLEtBQXZDLENBQTZDLENBQTdDO0FBQ0FKLFFBQUFBLE1BQU0sQ0FBQ2pCLEVBQUUsQ0FBQ21DLFdBQUgsQ0FBZUMsTUFBaEIsQ0FBTixDQUE4QmhCLEVBQTlCLENBQWlDQyxLQUFqQyxDQUF1QyxDQUF2QztBQUNELE9BSE0sQ0FBUDtBQUlELEtBWEMsQ0FBRjtBQVlELEdBekJPLENBQVI7QUEyQkF0QixFQUFBQSxRQUFRLENBQUMsbUJBQUQsRUFBc0IsTUFBTTtBQUNsQ0UsSUFBQUEsVUFBVSxDQUFDLE1BQU07QUFDZlcsTUFBQUEsS0FBSyxDQUFDQyxJQUFOLENBQVdiLEVBQVgsRUFBZSxNQUFmO0FBQ0QsS0FGUyxDQUFWO0FBSUFXLElBQUFBLEVBQUUsQ0FBQyx3Q0FBRCxFQUEyQyxNQUFNO0FBQ2pEWCxNQUFBQSxFQUFFLENBQUNtQyxXQUFILEdBQWlCLENBQUMsS0FBRCxDQUFqQjtBQUNBLGFBQU9uQyxFQUFFLENBQUNxQyxnQkFBSCxFQUFQO0FBQ0QsS0FIQyxDQUFGO0FBS0ExQixJQUFBQSxFQUFFLENBQUMsNkNBQUQsRUFBZ0QsTUFBTTtBQUN0RFgsTUFBQUEsRUFBRSxDQUFDc0QsSUFBSCxDQUFRL0IsT0FBUixDQUFnQkMsT0FBTyxDQUFDQyxPQUFSLEVBQWhCO0FBRUF6QixNQUFBQSxFQUFFLENBQUNtQyxXQUFILEdBQWlCLEVBQWpCO0FBRUEsYUFBT25DLEVBQUUsQ0FBQ3FDLGdCQUFILEdBQXNCTixJQUF0QixDQUEyQixNQUFNO0FBQ3RDZCxRQUFBQSxNQUFNLENBQUNqQixFQUFFLENBQUNzRCxJQUFILENBQVFHLElBQVIsQ0FBYSxDQUFiLEVBQWdCLENBQWhCLENBQUQsQ0FBTixDQUEyQnJDLEVBQTNCLENBQThCQyxLQUE5QixDQUFvQyxZQUFwQztBQUNELE9BRk0sQ0FBUDtBQUdELEtBUkMsQ0FBRjtBQVVBVixJQUFBQSxFQUFFLENBQUMsNkJBQUQsRUFBZ0MsTUFBTTtBQUN0Q1gsTUFBQUEsRUFBRSxDQUFDc0QsSUFBSCxDQUFRL0IsT0FBUixDQUFnQkMsT0FBTyxDQUFDQyxPQUFSLEVBQWhCO0FBQ0F6QixNQUFBQSxFQUFFLENBQUNtQyxXQUFILEdBQWlCLENBQUMsS0FBRCxDQUFqQjtBQUVBLGFBQU9uQyxFQUFFLENBQUNxQyxnQkFBSCxDQUFvQixJQUFwQixFQUEwQk4sSUFBMUIsQ0FBK0IsTUFBTTtBQUMxQ2QsUUFBQUEsTUFBTSxDQUFDakIsRUFBRSxDQUFDc0QsSUFBSCxDQUFRRyxJQUFSLENBQWEsQ0FBYixFQUFnQixDQUFoQixDQUFELENBQU4sQ0FBMkJyQyxFQUEzQixDQUE4QkMsS0FBOUIsQ0FBb0MsWUFBcEM7QUFDRCxPQUZNLENBQVA7QUFHRCxLQVBDLENBQUY7QUFTQVYsSUFBQUEsRUFBRSxDQUFDLHFEQUFELEVBQXdELE1BQU07QUFDOURYLE1BQUFBLEVBQUUsQ0FBQ21DLFdBQUgsR0FBaUIsRUFBakI7QUFDQW5DLE1BQUFBLEVBQUUsQ0FBQ08sTUFBSCxDQUFVOEQsVUFBVixHQUF1QixLQUF2QjtBQUNBckUsTUFBQUEsRUFBRSxDQUFDd0UsV0FBSCxHQUFpQixJQUFqQjtBQUVBeEUsTUFBQUEsRUFBRSxDQUFDcUMsZ0JBQUg7QUFDRCxLQU5DLENBQUY7QUFPRCxHQXBDTyxDQUFSO0FBc0NBdEMsRUFBQUEsUUFBUSxDQUFDLGlCQUFELEVBQW9CLE1BQU07QUFDaENFLElBQUFBLFVBQVUsQ0FBQyxNQUFNO0FBQ2ZXLE1BQUFBLEtBQUssQ0FBQ0MsSUFBTixDQUFXYixFQUFYLEVBQWUsTUFBZjtBQUNELEtBRlMsQ0FBVjtBQUlBVyxJQUFBQSxFQUFFLENBQUMsbUNBQUQsRUFBc0MsTUFBTTtBQUM1Q1gsTUFBQUEsRUFBRSxDQUFDc0QsSUFBSCxDQUFRL0IsT0FBUixDQUFnQkMsT0FBTyxDQUFDQyxPQUFSLENBQWdCO0FBQzlCc0MsUUFBQUEsT0FBTyxFQUFFO0FBQ1BVLFVBQUFBLFNBQVMsRUFBRSxDQUFDO0FBQ1ZDLFlBQUFBLFVBQVUsRUFBRSxDQUNWLENBQ0UsQ0FBQztBQUNDQyxjQUFBQSxJQUFJLEVBQUUsUUFEUDtBQUVDQyxjQUFBQSxLQUFLLEVBQUU7QUFGUixhQUFELEVBR0c7QUFDREQsY0FBQUEsSUFBSSxFQUFFLFFBREw7QUFFREMsY0FBQUEsS0FBSyxFQUFFO0FBRk4sYUFISCxDQURGLENBRFUsRUFTUCxJQVRPLEVBU0QsSUFUQztBQURGLFdBQUQ7QUFESjtBQURxQixPQUFoQixDQUFoQjtBQWlCQTVFLE1BQUFBLEVBQUUsQ0FBQ21DLFdBQUgsR0FBaUIsQ0FBQyxXQUFELENBQWpCO0FBRUEsYUFBT25DLEVBQUUsQ0FBQzZFLGNBQUgsR0FBb0I5QyxJQUFwQixDQUEwQitDLFVBQUQsSUFBZ0I7QUFDOUM3RCxRQUFBQSxNQUFNLENBQUM2RCxVQUFELENBQU4sQ0FBbUIxRCxFQUFuQixDQUFzQm9DLElBQXRCLENBQTJCbkMsS0FBM0IsQ0FBaUM7QUFDL0IwRCxVQUFBQSxRQUFRLEVBQUUsQ0FBQztBQUNUQyxZQUFBQSxNQUFNLEVBQUUsUUFEQztBQUVUQyxZQUFBQSxTQUFTLEVBQUU7QUFGRixXQUFELENBRHFCO0FBSy9CQyxVQUFBQSxLQUFLLEVBQUUsS0FMd0I7QUFNL0JDLFVBQUFBLE1BQU0sRUFBRTtBQU51QixTQUFqQztBQVFBbEUsUUFBQUEsTUFBTSxDQUFDakIsRUFBRSxDQUFDc0QsSUFBSCxDQUFRRyxJQUFSLENBQWEsQ0FBYixFQUFnQixDQUFoQixDQUFELENBQU4sQ0FBMkJyQyxFQUEzQixDQUE4QkMsS0FBOUIsQ0FBb0MsV0FBcEM7QUFDQUosUUFBQUEsTUFBTSxDQUFDakIsRUFBRSxDQUFDc0QsSUFBSCxDQUFRRyxJQUFSLENBQWEsQ0FBYixFQUFnQixDQUFoQixDQUFELENBQU4sQ0FBMkJyQyxFQUEzQixDQUE4QkMsS0FBOUIsQ0FBb0MsV0FBcEM7QUFDRCxPQVhNLENBQVA7QUFZRCxLQWhDQyxDQUFGO0FBa0NBVixJQUFBQSxFQUFFLENBQUMsb0NBQUQsRUFBdUMsTUFBTTtBQUM3Q1gsTUFBQUEsRUFBRSxDQUFDbUMsV0FBSCxHQUFpQixFQUFqQjtBQUNBLGFBQU9uQyxFQUFFLENBQUM2RSxjQUFILEdBQW9COUMsSUFBcEIsQ0FBMEIrQyxVQUFELElBQWdCO0FBQzlDN0QsUUFBQUEsTUFBTSxDQUFDNkQsVUFBRCxDQUFOLENBQW1CMUQsRUFBbkIsQ0FBc0JhLEVBQXRCLENBQXlCaUIsS0FBekI7QUFDQWpDLFFBQUFBLE1BQU0sQ0FBQ2pCLEVBQUUsQ0FBQ3NELElBQUgsQ0FBUW5DLFNBQVQsQ0FBTixDQUEwQkMsRUFBMUIsQ0FBNkJDLEtBQTdCLENBQW1DLENBQW5DO0FBQ0QsT0FITSxDQUFQO0FBSUQsS0FOQyxDQUFGO0FBT0QsR0E5Q08sQ0FBUjtBQWdEQXRCLEVBQUFBLFFBQVEsQ0FBQyxxQkFBRCxFQUF3QixNQUFNO0FBQ3BDRSxJQUFBQSxVQUFVLENBQUMsTUFBTTtBQUNmVyxNQUFBQSxLQUFLLENBQUNDLElBQU4sQ0FBV2IsRUFBWCxFQUFlLE1BQWY7QUFDQVksTUFBQUEsS0FBSyxDQUFDQyxJQUFOLENBQVdiLEVBQUUsQ0FBQ08sTUFBZCxFQUFzQixtQkFBdEI7QUFDRCxLQUhTLENBQVY7QUFLQUksSUFBQUEsRUFBRSxDQUFDLDBDQUFELEVBQTZDLE1BQU07QUFDbkRYLE1BQUFBLEVBQUUsQ0FBQ3NELElBQUgsQ0FBUWdCLFFBQVIsQ0FBaUI7QUFDZlgsUUFBQUEsT0FBTyxFQUFFLFVBRE07QUFFZmUsUUFBQUEsVUFBVSxFQUFFLENBQUM7QUFDWEMsVUFBQUEsSUFBSSxFQUFFLE1BREs7QUFFWEMsVUFBQUEsS0FBSyxFQUFFO0FBRkksU0FBRDtBQUZHLE9BQWpCLEVBTUdyRCxPQU5ILENBTVdDLE9BQU8sQ0FBQ0MsT0FBUixDQUFnQixFQUFoQixDQU5YO0FBUUF6QixNQUFBQSxFQUFFLENBQUNvRixrQkFBSCxHQUF3QixJQUF4QjtBQUNBcEYsTUFBQUEsRUFBRSxDQUFDbUMsV0FBSCxHQUFpQixDQUFDLGtCQUFELENBQWpCO0FBQ0EsYUFBT25DLEVBQUUsQ0FBQ3lDLGtCQUFILEdBQXdCVixJQUF4QixDQUE2QixNQUFNO0FBQ3hDZCxRQUFBQSxNQUFNLENBQUNqQixFQUFFLENBQUNzRCxJQUFILENBQVFuQyxTQUFULENBQU4sQ0FBMEJDLEVBQTFCLENBQTZCQyxLQUE3QixDQUFtQyxDQUFuQztBQUNBSixRQUFBQSxNQUFNLENBQUNqQixFQUFFLENBQUNPLE1BQUgsQ0FBVThFLGlCQUFWLENBQTRCbEUsU0FBN0IsQ0FBTixDQUE4Q0MsRUFBOUMsQ0FBaURDLEtBQWpELENBQXVELENBQXZEO0FBQ0QsT0FITSxDQUFQO0FBSUQsS0FmQyxDQUFGO0FBaUJBVixJQUFBQSxFQUFFLENBQUMsb0NBQUQsRUFBdUMsTUFBTTtBQUM3Q1gsTUFBQUEsRUFBRSxDQUFDbUMsV0FBSCxHQUFpQixFQUFqQjtBQUVBLGFBQU9uQyxFQUFFLENBQUN5QyxrQkFBSCxHQUF3QlYsSUFBeEIsQ0FBNkIsTUFBTTtBQUN4Q2QsUUFBQUEsTUFBTSxDQUFDakIsRUFBRSxDQUFDc0QsSUFBSCxDQUFRbkMsU0FBVCxDQUFOLENBQTBCQyxFQUExQixDQUE2QkMsS0FBN0IsQ0FBbUMsQ0FBbkM7QUFDRCxPQUZNLENBQVA7QUFHRCxLQU5DLENBQUY7QUFRQVYsSUFBQUEsRUFBRSxDQUFDLGtDQUFELEVBQXFDLE1BQU07QUFDM0NYLE1BQUFBLEVBQUUsQ0FBQ29GLGtCQUFILEdBQXdCLEtBQXhCO0FBQ0FwRixNQUFBQSxFQUFFLENBQUNtQyxXQUFILEdBQWlCLENBQUMsa0JBQUQsQ0FBakI7QUFFQSxhQUFPbkMsRUFBRSxDQUFDeUMsa0JBQUgsR0FBd0JWLElBQXhCLENBQTZCLE1BQU07QUFDeENkLFFBQUFBLE1BQU0sQ0FBQ2pCLEVBQUUsQ0FBQ3NELElBQUgsQ0FBUW5DLFNBQVQsQ0FBTixDQUEwQkMsRUFBMUIsQ0FBNkJDLEtBQTdCLENBQW1DLENBQW5DO0FBQ0QsT0FGTSxDQUFQO0FBR0QsS0FQQyxDQUFGO0FBUUQsR0F2Q08sQ0FBUjtBQXlDQXRCLEVBQUFBLFFBQVEsQ0FBQyxRQUFELEVBQVcsTUFBTTtBQUN2QlksSUFBQUEsRUFBRSxDQUFDLG1CQUFELEVBQXNCLE1BQU07QUFDNUJDLE1BQUFBLEtBQUssQ0FBQ0MsSUFBTixDQUFXYixFQUFYLEVBQWUsTUFBZixFQUF1QnVCLE9BQXZCLENBQStCQyxPQUFPLENBQUNDLE9BQVIsQ0FBZ0IsRUFBaEIsQ0FBL0I7QUFDQWIsTUFBQUEsS0FBSyxDQUFDQyxJQUFOLENBQVdiLEVBQVgsRUFBZSxrQkFBZixFQUFtQ3VCLE9BQW5DLENBQTJDQyxPQUFPLENBQUNDLE9BQVIsQ0FBZ0IsSUFBaEIsQ0FBM0M7QUFFQSxhQUFPekIsRUFBRSxDQUFDd0MsS0FBSCxDQUFTO0FBQ2RyQyxRQUFBQSxJQUFJLEVBQUUsSUFEUTtBQUVkQyxRQUFBQSxJQUFJLEVBQUU7QUFGUSxPQUFULEVBR0oyQixJQUhJLENBR0MsTUFBTTtBQUNaZCxRQUFBQSxNQUFNLENBQUNqQixFQUFFLENBQUNzRCxJQUFILENBQVFuQyxTQUFULENBQU4sQ0FBMEJDLEVBQTFCLENBQTZCQyxLQUE3QixDQUFtQyxDQUFuQztBQUNBSixRQUFBQSxNQUFNLENBQUNqQixFQUFFLENBQUNzRCxJQUFILENBQVFHLElBQVIsQ0FBYSxDQUFiLEVBQWdCLENBQWhCLENBQUQsQ0FBTixDQUEyQnJDLEVBQTNCLENBQThCb0MsSUFBOUIsQ0FBbUNuQyxLQUFuQyxDQUF5QztBQUN2Q3NDLFVBQUFBLE9BQU8sRUFBRSxPQUQ4QjtBQUV2Q2UsVUFBQUEsVUFBVSxFQUFFLENBQUM7QUFDWEMsWUFBQUEsSUFBSSxFQUFFLFFBREs7QUFFWEMsWUFBQUEsS0FBSyxFQUFFO0FBRkksV0FBRCxFQUdUO0FBQ0RELFlBQUFBLElBQUksRUFBRSxRQURMO0FBRURDLFlBQUFBLEtBQUssRUFBRSxJQUZOO0FBR0RVLFlBQUFBLFNBQVMsRUFBRTtBQUhWLFdBSFM7QUFGMkIsU0FBekM7QUFXRCxPQWhCTSxDQUFQO0FBaUJELEtBckJDLENBQUY7QUF1QkEzRSxJQUFBQSxFQUFFLENBQUMscUJBQUQsRUFBd0IsTUFBTTtBQUM5QkMsTUFBQUEsS0FBSyxDQUFDQyxJQUFOLENBQVdiLEVBQVgsRUFBZSxNQUFmLEVBQXVCdUIsT0FBdkIsQ0FBK0JDLE9BQU8sQ0FBQ0MsT0FBUixDQUFnQixFQUFoQixDQUEvQjtBQUNBYixNQUFBQSxLQUFLLENBQUNDLElBQU4sQ0FBV2IsRUFBWCxFQUFlLGtCQUFmLEVBQW1DdUIsT0FBbkMsQ0FBMkNDLE9BQU8sQ0FBQ0MsT0FBUixDQUFnQixJQUFoQixDQUEzQztBQUVBekIsTUFBQUEsRUFBRSxDQUFDbUMsV0FBSCxHQUFpQixDQUFDLGNBQUQsQ0FBakI7QUFDQW5DLE1BQUFBLEVBQUUsQ0FBQ3dDLEtBQUgsQ0FBUztBQUNQckMsUUFBQUEsSUFBSSxFQUFFLElBREM7QUFFUG9GLFFBQUFBLE9BQU8sRUFBRTtBQUZGLE9BQVQsRUFHR3hELElBSEgsQ0FHUSxNQUFNO0FBQ1pkLFFBQUFBLE1BQU0sQ0FBQ2pCLEVBQUUsQ0FBQ3NELElBQUgsQ0FBUW5DLFNBQVQsQ0FBTixDQUEwQkMsRUFBMUIsQ0FBNkJDLEtBQTdCLENBQW1DLENBQW5DO0FBQ0FKLFFBQUFBLE1BQU0sQ0FBQ2pCLEVBQUUsQ0FBQ3NELElBQUgsQ0FBUUcsSUFBUixDQUFhLENBQWIsRUFBZ0IsQ0FBaEIsQ0FBRCxDQUFOLENBQTJCckMsRUFBM0IsQ0FBOEJvQyxJQUE5QixDQUFtQ25DLEtBQW5DLENBQXlDO0FBQ3ZDc0MsVUFBQUEsT0FBTyxFQUFFLGNBRDhCO0FBRXZDZSxVQUFBQSxVQUFVLEVBQUUsQ0FBQztBQUNYQyxZQUFBQSxJQUFJLEVBQUUsTUFESztBQUVYQyxZQUFBQSxLQUFLLEVBQUU7QUFGSSxXQUFELEVBR1Q7QUFDREQsWUFBQUEsSUFBSSxFQUFFLE1BREw7QUFFREMsWUFBQUEsS0FBSyxFQUFFLHNDQUZOO0FBR0RVLFlBQUFBLFNBQVMsRUFBRTtBQUhWLFdBSFM7QUFGMkIsU0FBekM7QUFXRCxPQWhCRDtBQWlCRCxLQXRCQyxDQUFGO0FBdUJELEdBL0NPLENBQVI7QUFpREF2RixFQUFBQSxRQUFRLENBQUMsV0FBRCxFQUFjLE1BQU07QUFDMUJFLElBQUFBLFVBQVUsQ0FBQyxNQUFNO0FBQ2ZXLE1BQUFBLEtBQUssQ0FBQ0MsSUFBTixDQUFXYixFQUFYLEVBQWUsTUFBZjtBQUNELEtBRlMsQ0FBVjtBQUlBVyxJQUFBQSxFQUFFLENBQUMscUNBQUQsRUFBd0MsTUFBTTtBQUM5Q1gsTUFBQUEsRUFBRSxDQUFDbUMsV0FBSCxHQUFpQixFQUFqQjtBQUVBLGFBQU9uQyxFQUFFLENBQUN1QyxRQUFILENBQVk7QUFDakJpRCxRQUFBQSxDQUFDLEVBQUUsR0FEYztBQUVqQkMsUUFBQUEsQ0FBQyxFQUFFO0FBRmMsT0FBWixFQUdKMUQsSUFISSxDQUdDLE1BQU07QUFDWmQsUUFBQUEsTUFBTSxDQUFDakIsRUFBRSxDQUFDMEYsUUFBSixDQUFOLENBQW9CdEUsRUFBcEIsQ0FBdUJhLEVBQXZCLENBQTBCaUIsS0FBMUI7QUFDRCxPQUxNLENBQVA7QUFNRCxLQVRDLENBQUY7QUFXQXZDLElBQUFBLEVBQUUsQ0FBQyxpQkFBRCxFQUFvQixNQUFNO0FBQzFCWCxNQUFBQSxFQUFFLENBQUNzRCxJQUFILENBQVFnQixRQUFSLENBQWlCO0FBQ2ZYLFFBQUFBLE9BQU8sRUFBRSxJQURNO0FBRWZlLFFBQUFBLFVBQVUsRUFBRSxDQUNWLElBRFU7QUFGRyxPQUFqQixFQUtHbkQsT0FMSCxDQUtXQyxPQUFPLENBQUNDLE9BQVIsQ0FBZ0I7QUFDekJzQyxRQUFBQSxPQUFPLEVBQUU7QUFDUDRCLFVBQUFBLEVBQUUsRUFBRSxDQUFDO0FBQ0hqQixZQUFBQSxVQUFVLEVBQUUsQ0FDVixJQURVO0FBRFQsV0FBRDtBQURHO0FBRGdCLE9BQWhCLENBTFg7QUFjQTFFLE1BQUFBLEVBQUUsQ0FBQ21DLFdBQUgsR0FBaUIsQ0FBQyxJQUFELENBQWpCO0FBRUEsYUFBT25DLEVBQUUsQ0FBQ3VDLFFBQUgsQ0FBWSxJQUFaLEVBQWtCUixJQUFsQixDQUF1QixNQUFNO0FBQ2xDZCxRQUFBQSxNQUFNLENBQUNqQixFQUFFLENBQUMwRixRQUFKLENBQU4sQ0FBb0J0RSxFQUFwQixDQUF1Qm9DLElBQXZCLENBQTRCbkMsS0FBNUIsQ0FBa0MsRUFBbEM7QUFDRCxPQUZNLENBQVA7QUFHRCxLQXBCQyxDQUFGO0FBc0JBVixJQUFBQSxFQUFFLENBQUMsMEJBQUQsRUFBNkIsTUFBTTtBQUNuQ1gsTUFBQUEsRUFBRSxDQUFDc0QsSUFBSCxDQUFRZ0IsUUFBUixDQUFpQjtBQUNmWCxRQUFBQSxPQUFPLEVBQUUsSUFETTtBQUVmZSxRQUFBQSxVQUFVLEVBQUUsQ0FDVixDQUFDLE9BQUQsRUFBVSxPQUFWLEVBQW1CLE9BQW5CLEVBQTRCLE9BQTVCLENBRFU7QUFGRyxPQUFqQixFQUtHbkQsT0FMSCxDQUtXQyxPQUFPLENBQUNDLE9BQVIsQ0FBZ0I7QUFDekJzQyxRQUFBQSxPQUFPLEVBQUU7QUFDUDRCLFVBQUFBLEVBQUUsRUFBRSxDQUFDO0FBQ0hqQixZQUFBQSxVQUFVLEVBQUUsQ0FDVixDQUFDO0FBQ0NFLGNBQUFBLEtBQUssRUFBRTtBQURSLGFBQUQsRUFFRztBQUNEQSxjQUFBQSxLQUFLLEVBQUU7QUFETixhQUZILEVBSUc7QUFDREEsY0FBQUEsS0FBSyxFQUFFO0FBRE4sYUFKSCxFQU1HO0FBQ0RBLGNBQUFBLEtBQUssRUFBRTtBQUROLGFBTkgsQ0FEVTtBQURULFdBQUQ7QUFERztBQURnQixPQUFoQixDQUxYO0FBc0JBNUUsTUFBQUEsRUFBRSxDQUFDbUMsV0FBSCxHQUFpQixDQUFDLElBQUQsQ0FBakI7QUFFQSxhQUFPbkMsRUFBRSxDQUFDdUMsUUFBSCxDQUFZO0FBQ2pCcUQsUUFBQUEsS0FBSyxFQUFFLE9BRFU7QUFFakJDLFFBQUFBLEtBQUssRUFBRTtBQUZVLE9BQVosRUFHSjlELElBSEksQ0FHQyxNQUFNO0FBQ1pkLFFBQUFBLE1BQU0sQ0FBQ2pCLEVBQUUsQ0FBQzBGLFFBQUosQ0FBTixDQUFvQnRFLEVBQXBCLENBQXVCb0MsSUFBdkIsQ0FBNEJuQyxLQUE1QixDQUFrQztBQUNoQ3lFLFVBQUFBLEtBQUssRUFBRSxPQUR5QjtBQUVoQ0MsVUFBQUEsS0FBSyxFQUFFO0FBRnlCLFNBQWxDO0FBSUQsT0FSTSxDQUFQO0FBU0QsS0FsQ0MsQ0FBRjtBQW1DRCxHQXpFTyxDQUFSO0FBMkVBaEcsRUFBQUEsUUFBUSxDQUFDLGdCQUFELEVBQW1CLE1BQU07QUFDL0JFLElBQUFBLFVBQVUsQ0FBQyxNQUFNO0FBQ2ZXLE1BQUFBLEtBQUssQ0FBQ0MsSUFBTixDQUFXYixFQUFYLEVBQWUsTUFBZjtBQUNELEtBRlMsQ0FBVjtBQUlBVyxJQUFBQSxFQUFFLENBQUMsdUNBQUQsRUFBMEMsTUFBTTtBQUNoRFgsTUFBQUEsRUFBRSxDQUFDc0QsSUFBSCxDQUFRZ0IsUUFBUixDQUFpQjtBQUNmWCxRQUFBQSxPQUFPLEVBQUUsTUFETTtBQUVmZSxRQUFBQSxVQUFVLEVBQUUsQ0FBQyxFQUFELEVBQUssR0FBTDtBQUZHLE9BQWpCLEVBR0duRCxPQUhILENBR1dDLE9BQU8sQ0FBQ0MsT0FBUixDQUFnQjtBQUN6QnNDLFFBQUFBLE9BQU8sRUFBRTtBQUNQaUMsVUFBQUEsSUFBSSxFQUFFLENBQUMsS0FBRDtBQURDO0FBRGdCLE9BQWhCLENBSFg7QUFTQWhHLE1BQUFBLEVBQUUsQ0FBQ3NELElBQUgsQ0FBUWdCLFFBQVIsQ0FBaUI7QUFDZlgsUUFBQUEsT0FBTyxFQUFFLE1BRE07QUFFZmUsUUFBQUEsVUFBVSxFQUFFLENBQUMsRUFBRCxFQUFLLEdBQUw7QUFGRyxPQUFqQixFQUdHbkQsT0FISCxDQUdXQyxPQUFPLENBQUNDLE9BQVIsQ0FBZ0I7QUFDekJzQyxRQUFBQSxPQUFPLEVBQUU7QUFDUGtDLFVBQUFBLElBQUksRUFBRSxDQUFDLEtBQUQ7QUFEQztBQURnQixPQUFoQixDQUhYO0FBU0EsYUFBT2pHLEVBQUUsQ0FBQ2tHLGFBQUgsR0FBbUJuRSxJQUFuQixDQUF5Qm9FLElBQUQsSUFBVTtBQUN2Q2xGLFFBQUFBLE1BQU0sQ0FBQ2tGLElBQUQsQ0FBTixDQUFhL0UsRUFBYixDQUFnQjJCLEtBQWhCO0FBQ0QsT0FGTSxDQUFQO0FBR0QsS0F0QkMsQ0FBRjtBQXdCQXBDLElBQUFBLEVBQUUsQ0FBQyxrQ0FBRCxFQUFxQyxNQUFNO0FBQzNDWCxNQUFBQSxFQUFFLENBQUNzRCxJQUFILENBQVFnQixRQUFSLENBQWlCO0FBQ2ZYLFFBQUFBLE9BQU8sRUFBRSxNQURNO0FBRWZlLFFBQUFBLFVBQVUsRUFBRSxDQUFDLEVBQUQsRUFBSyxHQUFMO0FBRkcsT0FBakIsRUFHR25ELE9BSEgsQ0FHV0MsT0FBTyxDQUFDQyxPQUFSLENBQWdCO0FBQ3pCc0MsUUFBQUEsT0FBTyxFQUFFO0FBQ1BpQyxVQUFBQSxJQUFJLEVBQUUsQ0FDSixnQ0FBTywwQkFBYSxvQ0FBYixDQUFQLENBREk7QUFEQztBQURnQixPQUFoQixDQUhYO0FBV0FoRyxNQUFBQSxFQUFFLENBQUNzRCxJQUFILENBQVFnQixRQUFSLENBQWlCO0FBQ2ZYLFFBQUFBLE9BQU8sRUFBRSxNQURNO0FBRWZlLFFBQUFBLFVBQVUsRUFBRSxDQUFDLEVBQUQsRUFBSyxHQUFMO0FBRkcsT0FBakIsRUFHR25ELE9BSEgsQ0FHV0MsT0FBTyxDQUFDQyxPQUFSLENBQWdCO0FBQ3pCc0MsUUFBQUEsT0FBTyxFQUFFO0FBQ1BrQyxVQUFBQSxJQUFJLEVBQUUsQ0FDSixnQ0FBTywwQkFBYSxvQ0FBYixDQUFQLENBREk7QUFEQztBQURnQixPQUFoQixDQUhYO0FBV0EsYUFBT2pHLEVBQUUsQ0FBQ2tHLGFBQUgsR0FBbUJuRSxJQUFuQixDQUF5Qm9FLElBQUQsSUFBVTtBQUN2Q2xGLFFBQUFBLE1BQU0sQ0FBQ2tGLElBQUQsQ0FBTixDQUFhL0UsRUFBYixDQUFnQjJCLEtBQWhCO0FBQ0QsT0FGTSxDQUFQO0FBR0QsS0ExQkMsQ0FBRjtBQTJCRCxHQXhETyxDQUFSO0FBMERBaEQsRUFBQUEsUUFBUSxDQUFDLGdCQUFELEVBQW1CLE1BQU07QUFDL0JFLElBQUFBLFVBQVUsQ0FBQyxNQUFNO0FBQ2ZXLE1BQUFBLEtBQUssQ0FBQ0MsSUFBTixDQUFXYixFQUFYLEVBQWUsTUFBZjtBQUNELEtBRlMsQ0FBVjtBQUlBVyxJQUFBQSxFQUFFLENBQUMsMENBQUQsRUFBNkMsTUFBTTtBQUNuRDtBQUNBO0FBQ0E7QUFDQVgsTUFBQUEsRUFBRSxDQUFDc0QsSUFBSCxDQUFRZ0IsUUFBUixDQUFpQjtBQUNmWCxRQUFBQSxPQUFPLEVBQUUsUUFETTtBQUVmZSxRQUFBQSxVQUFVLEVBQUUsQ0FBQyxhQUFEO0FBRkcsT0FBakIsRUFHR25ELE9BSEgsQ0FHV0MsT0FBTyxDQUFDQyxPQUFSLEVBSFg7QUFLQSxhQUFPekIsRUFBRSxDQUFDb0csYUFBSCxDQUFpQixhQUFqQixFQUFnQ3JFLElBQWhDLENBQXFDLE1BQU07QUFDaERkLFFBQUFBLE1BQU0sQ0FBQ2pCLEVBQUUsQ0FBQ3NELElBQUgsQ0FBUW5DLFNBQVQsQ0FBTixDQUEwQkMsRUFBMUIsQ0FBNkJDLEtBQTdCLENBQW1DLENBQW5DO0FBQ0QsT0FGTSxDQUFQO0FBR0QsS0FaQyxDQUFGO0FBY0FWLElBQUFBLEVBQUUsQ0FBQyx1Q0FBRCxFQUEwQyxNQUFNO0FBQ2hEO0FBQ0FYLE1BQUFBLEVBQUUsQ0FBQ3NELElBQUgsQ0FBUWdCLFFBQVIsQ0FBaUI7QUFDZlgsUUFBQUEsT0FBTyxFQUFFLFFBRE07QUFFZmUsUUFBQUEsVUFBVSxFQUFFLENBQUMsaUNBQUQ7QUFGRyxPQUFqQixFQUdHbkQsT0FISCxDQUdXQyxPQUFPLENBQUNDLE9BQVIsRUFIWDtBQUtBLGFBQU96QixFQUFFLENBQUNvRyxhQUFILENBQWlCLDZDQUFqQixFQUFnRXJFLElBQWhFLENBQXFFLE1BQU07QUFDaEZkLFFBQUFBLE1BQU0sQ0FBQ2pCLEVBQUUsQ0FBQ3NELElBQUgsQ0FBUW5DLFNBQVQsQ0FBTixDQUEwQkMsRUFBMUIsQ0FBNkJDLEtBQTdCLENBQW1DLENBQW5DO0FBQ0QsT0FGTSxDQUFQO0FBR0QsS0FWQyxDQUFGO0FBWUFWLElBQUFBLEVBQUUsQ0FBQyxtREFBRCxFQUFzRCxNQUFNO0FBQzVELFVBQUkwRixPQUFPLEdBQUc7QUFDWkMsUUFBQUEsSUFBSSxFQUFFO0FBRE0sT0FBZDtBQUdBdEcsTUFBQUEsRUFBRSxDQUFDc0QsSUFBSCxDQUFRZ0IsUUFBUixDQUFpQjtBQUNmWCxRQUFBQSxPQUFPLEVBQUUsUUFETTtBQUVmZSxRQUFBQSxVQUFVLEVBQUUsQ0FBQyxhQUFEO0FBRkcsT0FBakIsRUFHR25ELE9BSEgsQ0FHV0MsT0FBTyxDQUFDK0UsTUFBUixDQUFlRixPQUFmLENBSFg7QUFLQSxhQUFPckcsRUFBRSxDQUFDb0csYUFBSCxDQUFpQixhQUFqQixFQUFnQ3JFLElBQWhDLENBQXFDLE1BQU07QUFDaERkLFFBQUFBLE1BQU0sQ0FBQ2pCLEVBQUUsQ0FBQ3NELElBQUgsQ0FBUW5DLFNBQVQsQ0FBTixDQUEwQkMsRUFBMUIsQ0FBNkJDLEtBQTdCLENBQW1DLENBQW5DO0FBQ0QsT0FGTSxDQUFQO0FBR0QsS0FaQyxDQUFGO0FBYUQsR0E1Q08sQ0FBUjtBQThDQXRCLEVBQUFBLFFBQVEsQ0FBQyxnQkFBRCxFQUFtQixNQUFNO0FBQy9CRSxJQUFBQSxVQUFVLENBQUMsTUFBTTtBQUNmVyxNQUFBQSxLQUFLLENBQUNDLElBQU4sQ0FBV2IsRUFBWCxFQUFlLE1BQWY7QUFDRCxLQUZTLENBQVY7QUFJQVcsSUFBQUEsRUFBRSxDQUFDLDBDQUFELEVBQTZDLE1BQU07QUFDbkRYLE1BQUFBLEVBQUUsQ0FBQ3NELElBQUgsQ0FBUWdCLFFBQVIsQ0FBaUI7QUFDZlgsUUFBQUEsT0FBTyxFQUFFLFFBRE07QUFFZmUsUUFBQUEsVUFBVSxFQUFFLENBQUMsYUFBRDtBQUZHLE9BQWpCLEVBR0duRCxPQUhILENBR1dDLE9BQU8sQ0FBQ0MsT0FBUixFQUhYO0FBS0EsYUFBT3pCLEVBQUUsQ0FBQ3dHLGFBQUgsQ0FBaUIsYUFBakIsRUFBZ0N6RSxJQUFoQyxDQUFxQyxNQUFNO0FBQ2hEZCxRQUFBQSxNQUFNLENBQUNqQixFQUFFLENBQUNzRCxJQUFILENBQVFuQyxTQUFULENBQU4sQ0FBMEJDLEVBQTFCLENBQTZCQyxLQUE3QixDQUFtQyxDQUFuQztBQUNELE9BRk0sQ0FBUDtBQUdELEtBVEMsQ0FBRjtBQVdBVixJQUFBQSxFQUFFLENBQUMsdUNBQUQsRUFBMEMsTUFBTTtBQUNoRDtBQUNBWCxNQUFBQSxFQUFFLENBQUNzRCxJQUFILENBQVFnQixRQUFSLENBQWlCO0FBQ2ZYLFFBQUFBLE9BQU8sRUFBRSxRQURNO0FBRWZlLFFBQUFBLFVBQVUsRUFBRSxDQUFDLGlDQUFEO0FBRkcsT0FBakIsRUFHR25ELE9BSEgsQ0FHV0MsT0FBTyxDQUFDQyxPQUFSLEVBSFg7QUFLQSxhQUFPekIsRUFBRSxDQUFDd0csYUFBSCxDQUFpQiw2Q0FBakIsRUFBZ0V6RSxJQUFoRSxDQUFxRSxNQUFNO0FBQ2hGZCxRQUFBQSxNQUFNLENBQUNqQixFQUFFLENBQUNzRCxJQUFILENBQVFuQyxTQUFULENBQU4sQ0FBMEJDLEVBQTFCLENBQTZCQyxLQUE3QixDQUFtQyxDQUFuQztBQUNELE9BRk0sQ0FBUDtBQUdELEtBVkMsQ0FBRjtBQVdELEdBM0JPLENBQVI7QUE2QkF0QixFQUFBQSxRQUFRLENBQUMwRyxJQUFULENBQWMsZUFBZCxFQUErQixNQUFNO0FBQ25DeEcsSUFBQUEsVUFBVSxDQUFDLE1BQU07QUFDZlcsTUFBQUEsS0FBSyxDQUFDQyxJQUFOLENBQVdiLEVBQVgsRUFBZSxNQUFmO0FBQ0FZLE1BQUFBLEtBQUssQ0FBQ0MsSUFBTixDQUFXYixFQUFYLEVBQWUsb0JBQWY7QUFDQVksTUFBQUEsS0FBSyxDQUFDQyxJQUFOLENBQVdiLEVBQVgsRUFBZSxhQUFmO0FBQ0QsS0FKUyxDQUFWO0FBTUFXLElBQUFBLEVBQUUsQ0FBQyxtQkFBRCxFQUFzQixNQUFNO0FBQzVCWCxNQUFBQSxFQUFFLENBQUNzRCxJQUFILENBQVEvQixPQUFSLENBQWdCQyxPQUFPLENBQUNDLE9BQVIsQ0FBZ0IsS0FBaEIsQ0FBaEI7O0FBQ0F6QixNQUFBQSxFQUFFLENBQUMwRyxrQkFBSCxDQUFzQnBDLFFBQXRCLENBQStCLENBQUMsS0FBRCxFQUFRLENBQUMsS0FBRCxFQUFRLE9BQVIsQ0FBUixFQUEwQjtBQUN2RHFDLFFBQUFBLEtBQUssRUFBRTtBQURnRCxPQUExQixDQUEvQixFQUVJcEYsT0FGSixDQUVZLEVBRlo7O0FBSUEsYUFBT3ZCLEVBQUUsQ0FBQzRHLFlBQUgsQ0FBZ0IsT0FBaEIsRUFBeUIsS0FBekIsRUFBZ0MsQ0FBQyxLQUFELEVBQVEsT0FBUixDQUFoQyxFQUFrRDtBQUN2REQsUUFBQUEsS0FBSyxFQUFFO0FBRGdELE9BQWxELEVBRUo1RSxJQUZJLENBRUMsTUFBTTtBQUNaZCxRQUFBQSxNQUFNLENBQUNqQixFQUFFLENBQUMwRyxrQkFBSCxDQUFzQnZGLFNBQXZCLENBQU4sQ0FBd0NDLEVBQXhDLENBQTJDQyxLQUEzQyxDQUFpRCxDQUFqRDtBQUNBSixRQUFBQSxNQUFNLENBQUNqQixFQUFFLENBQUM2RyxXQUFILENBQWV2QyxRQUFmLENBQXdCLEtBQXhCLEVBQStCbkQsU0FBaEMsQ0FBTixDQUFpREMsRUFBakQsQ0FBb0RDLEtBQXBELENBQTBELENBQTFEO0FBQ0QsT0FMTSxDQUFQO0FBTUQsS0FaQyxDQUFGO0FBYUQsR0FwQkQ7QUFzQkF0QixFQUFBQSxRQUFRLENBQUMwRyxJQUFULENBQWMsU0FBZCxFQUF5QixNQUFNO0FBQzdCeEcsSUFBQUEsVUFBVSxDQUFDLE1BQU07QUFDZlcsTUFBQUEsS0FBSyxDQUFDQyxJQUFOLENBQVdiLEVBQVgsRUFBZSxNQUFmO0FBQ0FZLE1BQUFBLEtBQUssQ0FBQ0MsSUFBTixDQUFXYixFQUFYLEVBQWUscUJBQWY7QUFDQVksTUFBQUEsS0FBSyxDQUFDQyxJQUFOLENBQVdiLEVBQVgsRUFBZSxjQUFmO0FBQ0QsS0FKUyxDQUFWO0FBTUFXLElBQUFBLEVBQUUsQ0FBQyxvQkFBRCxFQUF1QixNQUFNO0FBQzdCWCxNQUFBQSxFQUFFLENBQUNzRCxJQUFILENBQVEvQixPQUFSLENBQWdCQyxPQUFPLENBQUNDLE9BQVIsQ0FBZ0IsS0FBaEIsQ0FBaEI7O0FBQ0F6QixNQUFBQSxFQUFFLENBQUM4RyxtQkFBSCxDQUF1QnhDLFFBQXZCLENBQWdDO0FBQzlCeUMsUUFBQUEsR0FBRyxFQUFFO0FBRHlCLE9BQWhDLEVBRUc7QUFDREosUUFBQUEsS0FBSyxFQUFFO0FBRE4sT0FGSCxFQUlHcEYsT0FKSCxDQUlXLEVBSlg7O0FBTUEsYUFBT3ZCLEVBQUUsQ0FBQ2dILE1BQUgsQ0FBVSxPQUFWLEVBQW1CO0FBQ3hCRCxRQUFBQSxHQUFHLEVBQUU7QUFEbUIsT0FBbkIsRUFFSjtBQUNESixRQUFBQSxLQUFLLEVBQUU7QUFETixPQUZJLEVBSUo1RSxJQUpJLENBSUMsTUFBTTtBQUNaZCxRQUFBQSxNQUFNLENBQUNqQixFQUFFLENBQUM4RyxtQkFBSCxDQUF1QjNGLFNBQXhCLENBQU4sQ0FBeUNDLEVBQXpDLENBQTRDQyxLQUE1QyxDQUFrRCxDQUFsRDtBQUNBSixRQUFBQSxNQUFNLENBQUNqQixFQUFFLENBQUNzRCxJQUFILENBQVFuQyxTQUFULENBQU4sQ0FBMEJDLEVBQTFCLENBQTZCQyxLQUE3QixDQUFtQyxDQUFuQztBQUNBSixRQUFBQSxNQUFNLENBQUNqQixFQUFFLENBQUNpSCxZQUFILENBQWdCM0MsUUFBaEIsQ0FBeUIsS0FBekIsRUFBZ0NuRCxTQUFqQyxDQUFOLENBQWtEQyxFQUFsRCxDQUFxREMsS0FBckQsQ0FBMkQsQ0FBM0Q7QUFDRCxPQVJNLENBQVA7QUFTRCxLQWpCQyxDQUFGO0FBa0JELEdBekJEO0FBMkJBdEIsRUFBQUEsUUFBUSxDQUFDLFNBQUQsRUFBWSxNQUFNO0FBQ3hCRSxJQUFBQSxVQUFVLENBQUMsTUFBTTtBQUNmVyxNQUFBQSxLQUFLLENBQUNDLElBQU4sQ0FBV2IsRUFBWCxFQUFlLE1BQWY7QUFDRCxLQUZTLENBQVY7QUFJQVcsSUFBQUEsRUFBRSxDQUFDLHFDQUFELEVBQXdDLE1BQU07QUFDOUNYLE1BQUFBLEVBQUUsQ0FBQ3NELElBQUgsQ0FBUS9CLE9BQVIsQ0FBZ0JDLE9BQU8sQ0FBQ0MsT0FBUixFQUFoQjtBQUVBLGFBQU96QixFQUFFLENBQUNrSCxNQUFILENBQVUsU0FBVixFQUFxQixtQkFBckIsRUFBMEM7QUFDL0NDLFFBQUFBLEtBQUssRUFBRSxDQUFDLFdBQUQ7QUFEd0MsT0FBMUMsRUFFSnBGLElBRkksQ0FFQyxNQUFNO0FBQ1pkLFFBQUFBLE1BQU0sQ0FBQ2pCLEVBQUUsQ0FBQ3NELElBQUgsQ0FBUW5DLFNBQVQsQ0FBTixDQUEwQkMsRUFBMUIsQ0FBNkJDLEtBQTdCLENBQW1DLENBQW5DO0FBQ0QsT0FKTSxDQUFQO0FBS0QsS0FSQyxDQUFGO0FBVUFWLElBQUFBLEVBQUUsQ0FBQyw4QkFBRCxFQUFpQyxNQUFNO0FBQ3ZDWCxNQUFBQSxFQUFFLENBQUNzRCxJQUFILENBQVEvQixPQUFSLENBQWdCQyxPQUFPLENBQUNDLE9BQVIsRUFBaEI7QUFFQSxhQUFPekIsRUFBRSxDQUFDa0gsTUFBSCxDQUFVLFNBQVYsRUFBcUIsbUJBQXJCLEVBQTBDbkYsSUFBMUMsQ0FBK0MsTUFBTTtBQUMxRGQsUUFBQUEsTUFBTSxDQUFDakIsRUFBRSxDQUFDc0QsSUFBSCxDQUFRbkMsU0FBVCxDQUFOLENBQTBCQyxFQUExQixDQUE2QkMsS0FBN0IsQ0FBbUMsQ0FBbkM7QUFDRCxPQUZNLENBQVA7QUFHRCxLQU5DLENBQUY7QUFPRCxHQXRCTyxDQUFSO0FBd0JBdEIsRUFBQUEsUUFBUSxDQUFDMEcsSUFBVCxDQUFjLFdBQWQsRUFBMkIsTUFBTTtBQUMvQnhHLElBQUFBLFVBQVUsQ0FBQyxNQUFNO0FBQ2ZXLE1BQUFBLEtBQUssQ0FBQ0MsSUFBTixDQUFXYixFQUFYLEVBQWUsTUFBZjtBQUNBWSxNQUFBQSxLQUFLLENBQUNDLElBQU4sQ0FBV2IsRUFBWCxFQUFlLG9CQUFmO0FBQ0FZLE1BQUFBLEtBQUssQ0FBQ0MsSUFBTixDQUFXYixFQUFYLEVBQWUsYUFBZjtBQUNELEtBSlMsQ0FBVjtBQU1BVyxJQUFBQSxFQUFFLENBQUMsbUJBQUQsRUFBc0IsTUFBTTtBQUM1QlgsTUFBQUEsRUFBRSxDQUFDc0QsSUFBSCxDQUFRL0IsT0FBUixDQUFnQkMsT0FBTyxDQUFDQyxPQUFSLENBQWdCLEtBQWhCLENBQWhCOztBQUNBekIsTUFBQUEsRUFBRSxDQUFDb0gsa0JBQUgsQ0FBc0I5QyxRQUF0QixDQUErQixLQUEvQixFQUFzQyxPQUF0QyxFQUErQyxDQUFDLFFBQUQsRUFBVyxTQUFYLENBQS9DLEVBQXNFO0FBQ3BFcUMsUUFBQUEsS0FBSyxFQUFFO0FBRDZELE9BQXRFLEVBRUdwRixPQUZILENBRVcsRUFGWDs7QUFJQSxhQUFPdkIsRUFBRSxDQUFDcUgsUUFBSCxDQUFZLE9BQVosRUFBcUIsS0FBckIsRUFBNEIsQ0FBQyxRQUFELEVBQVcsU0FBWCxDQUE1QixFQUFtRDtBQUN4RFYsUUFBQUEsS0FBSyxFQUFFO0FBRGlELE9BQW5ELEVBRUo1RSxJQUZJLENBRUMsTUFBTTtBQUNaZCxRQUFBQSxNQUFNLENBQUNqQixFQUFFLENBQUNzRCxJQUFILENBQVFuQyxTQUFULENBQU4sQ0FBMEJDLEVBQTFCLENBQTZCQyxLQUE3QixDQUFtQyxDQUFuQztBQUNBSixRQUFBQSxNQUFNLENBQUNqQixFQUFFLENBQUM2RyxXQUFILENBQWV2QyxRQUFmLENBQXdCLEtBQXhCLEVBQStCbkQsU0FBaEMsQ0FBTixDQUFpREMsRUFBakQsQ0FBb0RDLEtBQXBELENBQTBELENBQTFEO0FBQ0QsT0FMTSxDQUFQO0FBTUQsS0FaQyxDQUFGO0FBYUQsR0FwQkQ7QUFzQkF0QixFQUFBQSxRQUFRLENBQUMwRyxJQUFULENBQWMsUUFBZCxFQUF3QixNQUFNO0FBQzVCeEcsSUFBQUEsVUFBVSxDQUFDLE1BQU07QUFDZlcsTUFBQUEsS0FBSyxDQUFDQyxJQUFOLENBQVdiLEVBQVgsRUFBZSxNQUFmO0FBQ0FZLE1BQUFBLEtBQUssQ0FBQ0MsSUFBTixDQUFXYixFQUFYLEVBQWUsb0JBQWY7QUFDQVksTUFBQUEsS0FBSyxDQUFDQyxJQUFOLENBQVdiLEVBQVgsRUFBZSxhQUFmO0FBQ0QsS0FKUyxDQUFWO0FBTUFXLElBQUFBLEVBQUUsQ0FBQyxtQkFBRCxFQUFzQixNQUFNO0FBQzVCWCxNQUFBQSxFQUFFLENBQUNzRCxJQUFILENBQVEvQixPQUFSLENBQWdCQyxPQUFPLENBQUNDLE9BQVIsQ0FBZ0IsS0FBaEIsQ0FBaEI7O0FBQ0F6QixNQUFBQSxFQUFFLENBQUNvSCxrQkFBSCxDQUFzQjlDLFFBQXRCLENBQStCLEtBQS9CLEVBQXNDLGNBQXRDLEVBQXNELENBQUMsUUFBRCxFQUFXLFFBQVgsQ0FBdEQsRUFBNEU7QUFDMUVxQyxRQUFBQSxLQUFLLEVBQUU7QUFEbUUsT0FBNUUsRUFFR3BGLE9BRkgsQ0FFVyxFQUZYOztBQUlBLGFBQU92QixFQUFFLENBQUNzSCxLQUFILENBQVMsT0FBVCxFQUFrQixLQUFsQixFQUF5QixjQUF6QixFQUF5QyxDQUFDLFFBQUQsRUFBVyxRQUFYLENBQXpDLEVBQStEO0FBQ3BFWCxRQUFBQSxLQUFLLEVBQUU7QUFENkQsT0FBL0QsRUFFSjVFLElBRkksQ0FFQyxNQUFNO0FBQ1pkLFFBQUFBLE1BQU0sQ0FBQ2pCLEVBQUUsQ0FBQ29ILGtCQUFILENBQXNCakcsU0FBdkIsQ0FBTixDQUF3Q0MsRUFBeEMsQ0FBMkNDLEtBQTNDLENBQWlELENBQWpEO0FBQ0FKLFFBQUFBLE1BQU0sQ0FBQ2pCLEVBQUUsQ0FBQ3NELElBQUgsQ0FBUW5DLFNBQVQsQ0FBTixDQUEwQkMsRUFBMUIsQ0FBNkJDLEtBQTdCLENBQW1DLENBQW5DO0FBQ0FKLFFBQUFBLE1BQU0sQ0FBQ2pCLEVBQUUsQ0FBQzZHLFdBQUgsQ0FBZXZDLFFBQWYsQ0FBd0IsS0FBeEIsRUFBK0JuRCxTQUFoQyxDQUFOLENBQWlEQyxFQUFqRCxDQUFvREMsS0FBcEQsQ0FBMEQsQ0FBMUQ7QUFDRCxPQU5NLENBQVA7QUFPRCxLQWJDLENBQUY7QUFjRCxHQXJCRDtBQXVCQXRCLEVBQUFBLFFBQVEsQ0FBQyxpQkFBRCxFQUFvQixNQUFNO0FBQ2hDRSxJQUFBQSxVQUFVLENBQUMsTUFBTTtBQUNmVyxNQUFBQSxLQUFLLENBQUNDLElBQU4sQ0FBV2IsRUFBWCxFQUFlLFVBQWY7QUFDQVksTUFBQUEsS0FBSyxDQUFDQyxJQUFOLENBQVdiLEVBQVgsRUFBZSxNQUFmO0FBQ0QsS0FIUyxDQUFWO0FBS0FXLElBQUFBLEVBQUUsQ0FBQyx5QkFBRCxFQUE0QixNQUFNO0FBQ2xDWCxNQUFBQSxFQUFFLENBQUNzRCxJQUFILENBQVFnQixRQUFSLENBQWlCO0FBQ2ZYLFFBQUFBLE9BQU8sRUFBRSxhQURNO0FBRWZlLFFBQUFBLFVBQVUsRUFBRSxDQUFDO0FBQ1hDLFVBQUFBLElBQUksRUFBRSxVQURLO0FBRVhDLFVBQUFBLEtBQUssRUFBRTtBQUZJLFNBQUQ7QUFGRyxPQUFqQixFQU1HckQsT0FOSCxDQU1XQyxPQUFPLENBQUNDLE9BQVIsQ0FBZ0IsS0FBaEIsQ0FOWDtBQU9BekIsTUFBQUEsRUFBRSxDQUFDcUgsUUFBSCxDQUFZL0MsUUFBWixDQUFxQixPQUFyQixFQUE4QixLQUE5QixFQUFxQztBQUNuQ2lELFFBQUFBLEdBQUcsRUFBRTtBQUQ4QixPQUFyQyxFQUVHaEcsT0FGSCxDQUVXQyxPQUFPLENBQUNDLE9BQVIsRUFGWDtBQUlBekIsTUFBQUEsRUFBRSxDQUFDbUMsV0FBSCxHQUFpQixDQUFDLFNBQUQsQ0FBakI7QUFDQSxhQUFPbkMsRUFBRSxDQUFDd0gsY0FBSCxDQUFrQixPQUFsQixFQUEyQixLQUEzQixFQUFrQztBQUN2Q2IsUUFBQUEsS0FBSyxFQUFFO0FBRGdDLE9BQWxDLEVBRUo1RSxJQUZJLENBRUMsTUFBTTtBQUNaZCxRQUFBQSxNQUFNLENBQUNqQixFQUFFLENBQUNzRCxJQUFILENBQVFuQyxTQUFULENBQU4sQ0FBMEJDLEVBQTFCLENBQTZCQyxLQUE3QixDQUFtQyxDQUFuQztBQUNELE9BSk0sQ0FBUDtBQUtELEtBbEJDLENBQUY7QUFvQkFWLElBQUFBLEVBQUUsQ0FBQyxxQkFBRCxFQUF3QixNQUFNO0FBQzlCWCxNQUFBQSxFQUFFLENBQUNzRCxJQUFILENBQVFnQixRQUFSLENBQWlCLFNBQWpCLEVBQTRCL0MsT0FBNUIsQ0FBb0NDLE9BQU8sQ0FBQ0MsT0FBUixDQUFnQixLQUFoQixDQUFwQztBQUNBekIsTUFBQUEsRUFBRSxDQUFDcUgsUUFBSCxDQUFZL0MsUUFBWixDQUFxQixPQUFyQixFQUE4QixLQUE5QixFQUFxQztBQUNuQ2lELFFBQUFBLEdBQUcsRUFBRTtBQUQ4QixPQUFyQyxFQUVHaEcsT0FGSCxDQUVXQyxPQUFPLENBQUNDLE9BQVIsRUFGWDtBQUlBekIsTUFBQUEsRUFBRSxDQUFDbUMsV0FBSCxHQUFpQixFQUFqQjtBQUNBLGFBQU9uQyxFQUFFLENBQUN3SCxjQUFILENBQWtCLE9BQWxCLEVBQTJCLEtBQTNCLEVBQWtDO0FBQ3ZDYixRQUFBQSxLQUFLLEVBQUU7QUFEZ0MsT0FBbEMsRUFFSjVFLElBRkksQ0FFQyxNQUFNO0FBQ1pkLFFBQUFBLE1BQU0sQ0FBQ2pCLEVBQUUsQ0FBQ3NELElBQUgsQ0FBUW5DLFNBQVQsQ0FBTixDQUEwQkMsRUFBMUIsQ0FBNkJDLEtBQTdCLENBQW1DLENBQW5DO0FBQ0QsT0FKTSxDQUFQO0FBS0QsS0FaQyxDQUFGO0FBYUQsR0F2Q08sQ0FBUjtBQXlDQXRCLEVBQUFBLFFBQVEsQ0FBQyxlQUFELEVBQWtCLE1BQU07QUFDOUJFLElBQUFBLFVBQVUsQ0FBQyxNQUFNO0FBQ2ZXLE1BQUFBLEtBQUssQ0FBQ0MsSUFBTixDQUFXYixFQUFYLEVBQWUsTUFBZjtBQUNELEtBRlMsQ0FBVjtBQUlBVyxJQUFBQSxFQUFFLENBQUMsa0JBQUQsRUFBcUIsTUFBTTtBQUMzQlgsTUFBQUEsRUFBRSxDQUFDc0QsSUFBSCxDQUFRZ0IsUUFBUixDQUFpQjtBQUNmWCxRQUFBQSxPQUFPLEVBQUUsVUFETTtBQUVmZSxRQUFBQSxVQUFVLEVBQUUsQ0FBQztBQUNYQyxVQUFBQSxJQUFJLEVBQUUsVUFESztBQUVYQyxVQUFBQSxLQUFLLEVBQUU7QUFGSSxTQUFELEVBR1Q7QUFDREQsVUFBQUEsSUFBSSxFQUFFLE1BREw7QUFFREMsVUFBQUEsS0FBSyxFQUFFO0FBRk4sU0FIUztBQUZHLE9BQWpCLEVBU0dyRCxPQVRILENBU1dDLE9BQU8sQ0FBQ0MsT0FBUixDQUFnQjtBQUN6QmdHLFFBQUFBLE9BQU8sRUFBRSxDQUFDLEdBQUQsRUFBTSxLQUFOLEVBQWEsS0FBYjtBQURnQixPQUFoQixDQVRYO0FBYUEsYUFBT3pILEVBQUUsQ0FBQzBILFlBQUgsQ0FBZ0IsT0FBaEIsRUFBeUIsS0FBekIsRUFBZ0MsZUFBaEMsRUFBaUQ7QUFDdERmLFFBQUFBLEtBQUssRUFBRTtBQUQrQyxPQUFqRCxFQUVKNUUsSUFGSSxDQUVFNEYsUUFBRCxJQUFjO0FBQ3BCMUcsUUFBQUEsTUFBTSxDQUFDMEcsUUFBRCxDQUFOLENBQWlCdkcsRUFBakIsQ0FBb0JvQyxJQUFwQixDQUF5Qm5DLEtBQXpCLENBQStCO0FBQzdCdUcsVUFBQUEsU0FBUyxFQUFFLEtBRGtCO0FBRTdCQyxVQUFBQSxVQUFVLEVBQUU7QUFGaUIsU0FBL0I7QUFJQTVHLFFBQUFBLE1BQU0sQ0FBQ2pCLEVBQUUsQ0FBQ3NELElBQUgsQ0FBUW5DLFNBQVQsQ0FBTixDQUEwQkMsRUFBMUIsQ0FBNkJDLEtBQTdCLENBQW1DLENBQW5DO0FBQ0QsT0FSTSxDQUFQO0FBU0QsS0F2QkMsQ0FBRjtBQXdCRCxHQTdCTyxDQUFSO0FBK0JBdEIsRUFBQUEsUUFBUSxDQUFDLGVBQUQsRUFBa0IsTUFBTTtBQUM5QkUsSUFBQUEsVUFBVSxDQUFDLE1BQU07QUFDZlcsTUFBQUEsS0FBSyxDQUFDQyxJQUFOLENBQVdiLEVBQVgsRUFBZSxNQUFmO0FBQ0FZLE1BQUFBLEtBQUssQ0FBQ0MsSUFBTixDQUFXYixFQUFYLEVBQWUsY0FBZjtBQUNBWSxNQUFBQSxLQUFLLENBQUNDLElBQU4sQ0FBV2IsRUFBWCxFQUFlLGdCQUFmO0FBQ0QsS0FKUyxDQUFWO0FBTUFXLElBQUFBLEVBQUUsQ0FBQywrQkFBRCxFQUFrQyxNQUFNO0FBQ3hDWCxNQUFBQSxFQUFFLENBQUNzRCxJQUFILENBQVFnQixRQUFSLENBQWlCO0FBQ2ZYLFFBQUFBLE9BQU8sRUFBRSxVQURNO0FBRWZlLFFBQUFBLFVBQVUsRUFBRSxDQUFDO0FBQ1hDLFVBQUFBLElBQUksRUFBRSxVQURLO0FBRVhDLFVBQUFBLEtBQUssRUFBRTtBQUZJLFNBQUQsRUFHVDtBQUNERCxVQUFBQSxJQUFJLEVBQUUsTUFETDtBQUVEQyxVQUFBQSxLQUFLLEVBQUU7QUFGTixTQUhTO0FBRkcsT0FBakIsRUFTRyxDQUFDLElBQUQsQ0FUSCxFQVNXckQsT0FUWCxDQVNtQkMsT0FBTyxDQUFDQyxPQUFSLENBQWdCLEtBQWhCLENBVG5CO0FBV0F6QixNQUFBQSxFQUFFLENBQUNtQyxXQUFILEdBQWlCLENBQUMsTUFBRCxDQUFqQjtBQUNBLGFBQU9uQyxFQUFFLENBQUM4SCxZQUFILENBQWdCLE9BQWhCLEVBQXlCLEtBQXpCLEVBQWdDLGVBQWhDLEVBQWlEO0FBQ3REbkIsUUFBQUEsS0FBSyxFQUFFO0FBRCtDLE9BQWpELEVBRUo1RSxJQUZJLENBRUMsTUFBTTtBQUNaZCxRQUFBQSxNQUFNLENBQUNqQixFQUFFLENBQUNzRCxJQUFILENBQVFuQyxTQUFULENBQU4sQ0FBMEJDLEVBQTFCLENBQTZCQyxLQUE3QixDQUFtQyxDQUFuQztBQUNELE9BSk0sQ0FBUDtBQUtELEtBbEJDLENBQUY7QUFvQkFWLElBQUFBLEVBQUUsQ0FBQyxpQ0FBRCxFQUFvQyxNQUFNO0FBQzFDWCxNQUFBQSxFQUFFLENBQUMwSCxZQUFILENBQWdCcEQsUUFBaEIsQ0FBeUIsT0FBekIsRUFBa0MsS0FBbEMsRUFBeUMsZUFBekMsRUFBMEQ7QUFDeERxQyxRQUFBQSxLQUFLLEVBQUU7QUFEaUQsT0FBMUQsRUFFR3BGLE9BRkgsQ0FFV0MsT0FBTyxDQUFDQyxPQUFSLEVBRlg7QUFHQXpCLE1BQUFBLEVBQUUsQ0FBQ3dILGNBQUgsQ0FBa0JsRCxRQUFsQixDQUEyQixLQUEzQixFQUFrQztBQUNoQ3FDLFFBQUFBLEtBQUssRUFBRTtBQUR5QixPQUFsQyxFQUVHcEYsT0FGSCxDQUVXQyxPQUFPLENBQUNDLE9BQVIsRUFGWDtBQUlBekIsTUFBQUEsRUFBRSxDQUFDbUMsV0FBSCxHQUFpQixFQUFqQjtBQUNBLGFBQU9uQyxFQUFFLENBQUM4SCxZQUFILENBQWdCLE9BQWhCLEVBQXlCLEtBQXpCLEVBQWdDLGVBQWhDLEVBQWlEO0FBQ3REbkIsUUFBQUEsS0FBSyxFQUFFO0FBRCtDLE9BQWpELEVBRUo1RSxJQUZJLENBRUMsTUFBTTtBQUNaZCxRQUFBQSxNQUFNLENBQUNqQixFQUFFLENBQUN3SCxjQUFILENBQWtCckcsU0FBbkIsQ0FBTixDQUFvQ0MsRUFBcEMsQ0FBdUNDLEtBQXZDLENBQTZDLENBQTdDO0FBQ0QsT0FKTSxDQUFQO0FBS0QsS0FkQyxDQUFGO0FBZUQsR0ExQ08sQ0FBUjtBQTRDQXRCLEVBQUFBLFFBQVEsQ0FBQyx1QkFBRCxFQUEwQixNQUFNO0FBQ3RDWSxJQUFBQSxFQUFFLENBQUMsMENBQUQsRUFBNkMsTUFBTTtBQUNuRE0sTUFBQUEsTUFBTSxDQUFDakIsRUFBRSxDQUFDK0gsb0JBQUgsQ0FBd0IsTUFBeEIsQ0FBRCxDQUFOLENBQXdDM0csRUFBeEMsQ0FBMkNhLEVBQTNDLENBQThDQyxJQUE5QztBQUNELEtBRkMsQ0FBRjtBQUlBdkIsSUFBQUEsRUFBRSxDQUFDLG9EQUFELEVBQXVELE1BQU07QUFDN0RDLE1BQUFBLEtBQUssQ0FBQ0MsSUFBTixDQUFXYixFQUFFLENBQUNPLE1BQWQsRUFBc0IscUJBQXRCLEVBQTZDZ0IsT0FBN0MsQ0FBcUQ7QUFDbkR5RyxRQUFBQSxPQUFPLEVBQUU7QUFDUHJFLFVBQUFBLE9BQU8sRUFBRSxRQURGO0FBRVBlLFVBQUFBLFVBQVUsRUFBRSxDQUFDO0FBQ1hDLFlBQUFBLElBQUksRUFBRSxRQURLO0FBRVhDLFlBQUFBLEtBQUssRUFBRTtBQUZJLFdBQUQ7QUFGTDtBQUQwQyxPQUFyRDtBQVVBM0QsTUFBQUEsTUFBTSxDQUFDakIsRUFBRSxDQUFDK0gsb0JBQUgsQ0FBd0IsTUFBeEIsRUFBZ0MsRUFBaEMsQ0FBRCxDQUFOLENBQTRDM0csRUFBNUMsQ0FBK0NhLEVBQS9DLENBQWtEQyxJQUFsRDtBQUNELEtBWkMsQ0FBRjtBQWNBdkIsSUFBQUEsRUFBRSxDQUFDLGtEQUFELEVBQXFELE1BQU07QUFDM0RDLE1BQUFBLEtBQUssQ0FBQ0MsSUFBTixDQUFXYixFQUFFLENBQUNPLE1BQWQsRUFBc0IscUJBQXRCLEVBQTZDZ0IsT0FBN0MsQ0FBcUQ7QUFDbkR5RyxRQUFBQSxPQUFPLEVBQUU7QUFDUHJFLFVBQUFBLE9BQU8sRUFBRSxRQURGO0FBRVBlLFVBQUFBLFVBQVUsRUFBRSxDQUFDO0FBQ1hDLFlBQUFBLElBQUksRUFBRSxRQURLO0FBRVhDLFlBQUFBLEtBQUssRUFBRTtBQUZJLFdBQUQ7QUFGTDtBQUQwQyxPQUFyRDtBQVVBM0QsTUFBQUEsTUFBTSxDQUFDakIsRUFBRSxDQUFDK0gsb0JBQUgsQ0FBd0IsYUFBeEIsRUFBdUMsRUFBdkMsQ0FBRCxDQUFOLENBQW1EM0csRUFBbkQsQ0FBc0RhLEVBQXRELENBQXlEaUIsS0FBekQ7QUFDRCxLQVpDLENBQUY7QUFhRCxHQWhDTyxDQUFSO0FBa0NBbkQsRUFBQUEsUUFBUSxDQUFDLGdCQUFELEVBQW1CLE1BQU07QUFDL0IsVUFBTWtJLElBQUksR0FBRyxlQUFiO0FBQ0FoSSxJQUFBQSxVQUFVLENBQUMsTUFBTTtBQUNmVyxNQUFBQSxLQUFLLENBQUNDLElBQU4sQ0FBV2IsRUFBWCxFQUFlLE1BQWY7QUFDRCxLQUZTLENBQVY7QUFJQVcsSUFBQUEsRUFBRSxDQUFDLG1CQUFELEVBQXNCLE1BQU07QUFDNUJYLE1BQUFBLEVBQUUsQ0FBQ3NELElBQUgsQ0FBUWdCLFFBQVIsQ0FBaUI7QUFDZlgsUUFBQUEsT0FBTyxFQUFFLFFBRE07QUFFZmUsUUFBQUEsVUFBVSxFQUFFLENBQUM7QUFDWEMsVUFBQUEsSUFBSSxFQUFFLFFBREs7QUFFWEMsVUFBQUEsS0FBSyxFQUFFcUQ7QUFGSSxTQUFEO0FBRkcsT0FBakIsRUFNRzFHLE9BTkgsQ0FNV0MsT0FBTyxDQUFDQyxPQUFSLENBQWdCO0FBQ3pCNkUsUUFBQUEsSUFBSSxFQUFFO0FBRG1CLE9BQWhCLENBTlg7QUFVQSxhQUFPdEcsRUFBRSxDQUFDa0ksYUFBSCxDQUFpQkQsSUFBakIsRUFBdUJsRyxJQUF2QixDQUE0QixNQUFNO0FBQ3ZDZCxRQUFBQSxNQUFNLENBQUNqQixFQUFFLENBQUNzRCxJQUFILENBQVFuQyxTQUFULENBQU4sQ0FBMEJDLEVBQTFCLENBQTZCQyxLQUE3QixDQUFtQyxDQUFuQztBQUNBSixRQUFBQSxNQUFNLENBQUNqQixFQUFFLENBQUNvRCxNQUFKLENBQU4sQ0FBa0JoQyxFQUFsQixDQUFxQkMsS0FBckIsQ0FBMkI4RyxzQkFBM0I7QUFDRCxPQUhNLENBQVA7QUFJRCxLQWZDLENBQUY7QUFpQkF4SCxJQUFBQSxFQUFFLENBQUMsa0NBQUQsRUFBcUMsTUFBTTtBQUMzQ1gsTUFBQUEsRUFBRSxDQUFDc0QsSUFBSCxDQUFRZ0IsUUFBUixDQUFpQjtBQUNmWCxRQUFBQSxPQUFPLEVBQUUsUUFETTtBQUVmZSxRQUFBQSxVQUFVLEVBQUUsQ0FBQztBQUNYQyxVQUFBQSxJQUFJLEVBQUUsUUFESztBQUVYQyxVQUFBQSxLQUFLLEVBQUVxRDtBQUZJLFNBQUQsRUFJWixDQUFDO0FBQ0N0RCxVQUFBQSxJQUFJLEVBQUUsTUFEUDtBQUVDQyxVQUFBQSxLQUFLLEVBQUU7QUFGUixTQUFELENBSlk7QUFGRyxPQUFqQixFQVdHckQsT0FYSCxDQVdXQyxPQUFPLENBQUNDLE9BQVIsQ0FBZ0I7QUFDekI2RSxRQUFBQSxJQUFJLEVBQUU7QUFEbUIsT0FBaEIsQ0FYWDtBQWVBdEcsTUFBQUEsRUFBRSxDQUFDbUMsV0FBSCxHQUFpQixDQUFDLFdBQUQsQ0FBakI7QUFDQSxhQUFPbkMsRUFBRSxDQUFDa0ksYUFBSCxDQUFpQkQsSUFBakIsRUFBdUI7QUFDNUJHLFFBQUFBLFNBQVMsRUFBRTtBQURpQixPQUF2QixFQUVKckcsSUFGSSxDQUVDLE1BQU07QUFDWmQsUUFBQUEsTUFBTSxDQUFDakIsRUFBRSxDQUFDc0QsSUFBSCxDQUFRbkMsU0FBVCxDQUFOLENBQTBCQyxFQUExQixDQUE2QkMsS0FBN0IsQ0FBbUMsQ0FBbkM7QUFDQUosUUFBQUEsTUFBTSxDQUFDakIsRUFBRSxDQUFDb0QsTUFBSixDQUFOLENBQWtCaEMsRUFBbEIsQ0FBcUJDLEtBQXJCLENBQTJCOEcsc0JBQTNCO0FBQ0QsT0FMTSxDQUFQO0FBTUQsS0F2QkMsQ0FBRjtBQXlCQXBJLElBQUFBLFFBQVEsQ0FBQyw4REFBRCxFQUFpRSxNQUFNO0FBQzdFRSxNQUFBQSxVQUFVLENBQUMsTUFBTTtBQUNmRCxRQUFBQSxFQUFFLENBQUNzRCxJQUFILENBQVEvQixPQUFSLENBQWdCQyxPQUFPLENBQUNDLE9BQVIsQ0FBZ0I7QUFDOUI2RSxVQUFBQSxJQUFJLEVBQUU7QUFEd0IsU0FBaEIsQ0FBaEI7QUFHRCxPQUpTLENBQVY7QUFNQTNGLE1BQUFBLEVBQUUsQ0FBQywyQkFBRCxFQUE4QixNQUFNO0FBQ3BDLFlBQUkwSCxlQUFlLEdBQUcsS0FBdEI7O0FBQ0FySSxRQUFBQSxFQUFFLENBQUNzSSxlQUFILEdBQXFCLE1BQU0sSUFBSTlHLE9BQUosQ0FBYUMsT0FBRCxJQUFhO0FBQ2xEQSxVQUFBQSxPQUFPO0FBQ1A0RyxVQUFBQSxlQUFlLEdBQUcsSUFBbEI7QUFDRCxTQUgwQixDQUEzQjs7QUFJQSxZQUFJRSxrQkFBa0IsR0FBRzNILEtBQUssQ0FBQzRILEdBQU4sQ0FBVXhJLEVBQVYsRUFBYyxpQkFBZCxDQUF6QjtBQUNBLGVBQU9BLEVBQUUsQ0FBQ2tJLGFBQUgsQ0FBaUJELElBQWpCLEVBQXVCbEcsSUFBdkIsQ0FBNEIsTUFBTTtBQUN2Q2QsVUFBQUEsTUFBTSxDQUFDc0gsa0JBQWtCLENBQUNqRSxRQUFuQixDQUE0QjJELElBQTVCLEVBQWtDOUcsU0FBbkMsQ0FBTixDQUFvREMsRUFBcEQsQ0FBdURDLEtBQXZELENBQTZELENBQTdEO0FBQ0FKLFVBQUFBLE1BQU0sQ0FBQ29ILGVBQUQsQ0FBTixDQUF3QmpILEVBQXhCLENBQTJCQyxLQUEzQixDQUFpQyxJQUFqQztBQUNELFNBSE0sQ0FBUDtBQUlELE9BWEMsQ0FBRjtBQWFBVixNQUFBQSxFQUFFLENBQUMsbUNBQUQsRUFBc0MsTUFBTTtBQUM1Q1gsUUFBQUEsRUFBRSxDQUFDc0ksZUFBSCxHQUFxQixNQUFNLENBQUcsQ0FBOUI7O0FBQ0EsWUFBSUMsa0JBQWtCLEdBQUczSCxLQUFLLENBQUM0SCxHQUFOLENBQVV4SSxFQUFWLEVBQWMsaUJBQWQsQ0FBekI7QUFDQSxlQUFPQSxFQUFFLENBQUNrSSxhQUFILENBQWlCRCxJQUFqQixFQUF1QmxHLElBQXZCLENBQTRCLE1BQU07QUFDdkNkLFVBQUFBLE1BQU0sQ0FBQ3NILGtCQUFrQixDQUFDakUsUUFBbkIsQ0FBNEIyRCxJQUE1QixFQUFrQzlHLFNBQW5DLENBQU4sQ0FBb0RDLEVBQXBELENBQXVEQyxLQUF2RCxDQUE2RCxDQUE3RDtBQUNELFNBRk0sQ0FBUDtBQUdELE9BTkMsQ0FBRjtBQU9ELEtBM0JPLENBQVI7QUE2QkFWLElBQUFBLEVBQUUsQ0FBQyw0QkFBRCxFQUErQixNQUFNO0FBQ3JDLFVBQUlzQyxNQUFNLEdBQUcsS0FBYjtBQUNBakQsTUFBQUEsRUFBRSxDQUFDc0QsSUFBSCxDQUFRL0IsT0FBUixDQUFnQkMsT0FBTyxDQUFDQyxPQUFSLENBQWdCLEtBQWhCLENBQWhCLEVBQXdDRixPQUF4QyxDQUFnREMsT0FBTyxDQUFDQyxPQUFSLENBQWdCO0FBQzlENkUsUUFBQUEsSUFBSSxFQUFFO0FBRHdELE9BQWhCLENBQWhEOztBQUlBdEcsTUFBQUEsRUFBRSxDQUFDeUksY0FBSCxHQUFxQlIsSUFBRCxJQUFVO0FBQzVCaEgsUUFBQUEsTUFBTSxDQUFDZ0gsSUFBRCxDQUFOLENBQWE3RyxFQUFiLENBQWdCQyxLQUFoQixDQUFzQixLQUF0QjtBQUNBNEIsUUFBQUEsTUFBTSxHQUFHLElBQVQ7QUFDRCxPQUhEOztBQUtBakQsTUFBQUEsRUFBRSxDQUFDNEQsZ0JBQUgsR0FBc0IsS0FBdEI7QUFDQSxhQUFPNUQsRUFBRSxDQUFDa0ksYUFBSCxDQUFpQkQsSUFBakIsRUFBdUJsRyxJQUF2QixDQUE0QixNQUFNO0FBQ3ZDZCxRQUFBQSxNQUFNLENBQUNnQyxNQUFELENBQU4sQ0FBZTdCLEVBQWYsQ0FBa0JhLEVBQWxCLENBQXFCQyxJQUFyQjtBQUNELE9BRk0sQ0FBUDtBQUdELEtBZkMsQ0FBRjtBQWdCRCxHQTdGTyxDQUFSO0FBK0ZBbkMsRUFBQUEsUUFBUSxDQUFDLGdCQUFELEVBQW1CLE1BQU07QUFDL0JZLElBQUFBLEVBQUUsQ0FBQyxtQ0FBRCxFQUFzQyxNQUFNO0FBQzVDWCxNQUFBQSxFQUFFLENBQUNtQyxXQUFILEdBQWlCLENBQUMsS0FBRCxDQUFqQjtBQUNBbEIsTUFBQUEsTUFBTSxDQUFDakIsRUFBRSxDQUFDMEksYUFBSCxDQUFpQixLQUFqQixDQUFELENBQU4sQ0FBZ0N0SCxFQUFoQyxDQUFtQ2EsRUFBbkMsQ0FBc0NDLElBQXRDO0FBQ0QsS0FIQyxDQUFGO0FBS0F2QixJQUFBQSxFQUFFLENBQUMsdUNBQUQsRUFBMEMsTUFBTTtBQUNoRFgsTUFBQUEsRUFBRSxDQUFDbUMsV0FBSCxHQUFpQixDQUFDLEtBQUQsQ0FBakI7QUFDQWxCLE1BQUFBLE1BQU0sQ0FBQ2pCLEVBQUUsQ0FBQzBJLGFBQUgsQ0FBaUIsS0FBakIsQ0FBRCxDQUFOLENBQWdDdEgsRUFBaEMsQ0FBbUNhLEVBQW5DLENBQXNDaUIsS0FBdEM7QUFDQWpDLE1BQUFBLE1BQU0sQ0FBQ2pCLEVBQUUsQ0FBQzBJLGFBQUgsRUFBRCxDQUFOLENBQTJCdEgsRUFBM0IsQ0FBOEJhLEVBQTlCLENBQWlDaUIsS0FBakM7QUFDRCxLQUpDLENBQUY7QUFLRCxHQVhPLENBQVI7QUFhQW5ELEVBQUFBLFFBQVEsQ0FBQyxxQkFBRCxFQUF3QixNQUFNO0FBQ3BDWSxJQUFBQSxFQUFFLENBQUMscUNBQUQsRUFBd0MsTUFBTTtBQUM5Q1gsTUFBQUEsRUFBRSxDQUFDMkksa0JBQUgsQ0FBc0I7QUFDcEJoSCxRQUFBQSxVQUFVLEVBQUUsQ0FBQyxLQUFEO0FBRFEsT0FBdEIsRUFFRyxNQUFNLENBQUcsQ0FGWjs7QUFHQVYsTUFBQUEsTUFBTSxDQUFDakIsRUFBRSxDQUFDbUMsV0FBSixDQUFOLENBQXVCZixFQUF2QixDQUEwQm9DLElBQTFCLENBQStCbkMsS0FBL0IsQ0FBcUMsQ0FBQyxLQUFELENBQXJDO0FBQ0QsS0FMQyxDQUFGO0FBTUQsR0FQTyxDQUFSO0FBU0F0QixFQUFBQSxRQUFRLENBQUMsNkJBQUQsRUFBZ0MsTUFBTTtBQUM1Q1ksSUFBQUEsRUFBRSxDQUFDLDBCQUFELEVBQTZCLE1BQU07QUFDbkNYLE1BQUFBLEVBQUUsQ0FBQzRJLDBCQUFILENBQThCO0FBQzVCbEUsUUFBQUEsVUFBVSxFQUFFLENBQUM7QUFDWEUsVUFBQUEsS0FBSyxFQUFFO0FBREksU0FBRDtBQURnQixPQUE5QixFQUlHLE1BQU0sQ0FBRyxDQUpaOztBQUtBM0QsTUFBQUEsTUFBTSxDQUFDakIsRUFBRSxDQUFDbUMsV0FBSixDQUFOLENBQXVCZixFQUF2QixDQUEwQm9DLElBQTFCLENBQStCbkMsS0FBL0IsQ0FBcUMsQ0FBQyxLQUFELENBQXJDO0FBQ0QsS0FQQyxDQUFGO0FBUUQsR0FUTyxDQUFSO0FBV0F0QixFQUFBQSxRQUFRLENBQUMseUJBQUQsRUFBNEIsTUFBTTtBQUN4Q1ksSUFBQUEsRUFBRSxDQUFDLHNCQUFELEVBQXlCLE1BQU07QUFDL0JYLE1BQUFBLEVBQUUsQ0FBQzZJLFFBQUgsR0FBY2pJLEtBQUssQ0FBQ0MsSUFBTixFQUFkO0FBQ0FiLE1BQUFBLEVBQUUsQ0FBQzRELGdCQUFILEdBQXNCLEtBQXRCOztBQUVBNUQsTUFBQUEsRUFBRSxDQUFDOEksc0JBQUgsQ0FBMEI7QUFDeEJDLFFBQUFBLEVBQUUsRUFBRTtBQURvQixPQUExQixFQUVHLE1BQU0sQ0FBRyxDQUZaOztBQUdBOUgsTUFBQUEsTUFBTSxDQUFDakIsRUFBRSxDQUFDNkksUUFBSCxDQUFZdkUsUUFBWixDQUFxQixLQUFyQixFQUE0QixRQUE1QixFQUFzQyxHQUF0QyxFQUEyQ25ELFNBQTVDLENBQU4sQ0FBNkRDLEVBQTdELENBQWdFQyxLQUFoRSxDQUFzRSxDQUF0RTtBQUNELEtBUkMsQ0FBRjtBQVNELEdBVk8sQ0FBUjtBQVlBdEIsRUFBQUEsUUFBUSxDQUFDLDBCQUFELEVBQTZCLE1BQU07QUFDekNZLElBQUFBLEVBQUUsQ0FBQyxzQkFBRCxFQUF5QixNQUFNO0FBQy9CWCxNQUFBQSxFQUFFLENBQUM2SSxRQUFILEdBQWNqSSxLQUFLLENBQUNDLElBQU4sRUFBZDtBQUNBYixNQUFBQSxFQUFFLENBQUM0RCxnQkFBSCxHQUFzQixLQUF0Qjs7QUFFQTVELE1BQUFBLEVBQUUsQ0FBQ2dKLHVCQUFILENBQTJCO0FBQ3pCRCxRQUFBQSxFQUFFLEVBQUU7QUFEcUIsT0FBM0IsRUFFRyxNQUFNLENBQUcsQ0FGWjs7QUFHQTlILE1BQUFBLE1BQU0sQ0FBQ2pCLEVBQUUsQ0FBQzZJLFFBQUgsQ0FBWXZFLFFBQVosQ0FBcUIsS0FBckIsRUFBNEIsU0FBNUIsRUFBdUMsR0FBdkMsRUFBNENuRCxTQUE3QyxDQUFOLENBQThEQyxFQUE5RCxDQUFpRUMsS0FBakUsQ0FBdUUsQ0FBdkU7QUFDRCxLQVJDLENBQUY7QUFTRCxHQVZPLENBQVI7QUFZQXRCLEVBQUFBLFFBQVEsQ0FBQzBHLElBQVQsQ0FBYyx3QkFBZCxFQUF3QyxNQUFNO0FBQzVDOUYsSUFBQUEsRUFBRSxDQUFDLHNCQUFELEVBQXlCLE1BQU07QUFDL0JYLE1BQUFBLEVBQUUsQ0FBQzZJLFFBQUgsR0FBY2pJLEtBQUssQ0FBQ0MsSUFBTixFQUFkO0FBQ0FELE1BQUFBLEtBQUssQ0FBQ0MsSUFBTixDQUFXYixFQUFYLEVBQWUsYUFBZixFQUE4QnVCLE9BQTlCLENBQXNDLEtBQXRDO0FBQ0F2QixNQUFBQSxFQUFFLENBQUM0RCxnQkFBSCxHQUFzQixLQUF0Qjs7QUFFQTVELE1BQUFBLEVBQUUsQ0FBQ2lKLHFCQUFILENBQXlCO0FBQ3ZCRixRQUFBQSxFQUFFLEVBQUU7QUFEbUIsT0FBekIsRUFFRyxNQUFNLENBQUcsQ0FGWjs7QUFHQTlILE1BQUFBLE1BQU0sQ0FBQ2pCLEVBQUUsQ0FBQzZJLFFBQUgsQ0FBWXZFLFFBQVosQ0FBcUIsS0FBckIsRUFBNEIsT0FBNUIsRUFBcUMsS0FBckMsRUFBNENuRCxTQUE3QyxDQUFOLENBQThEQyxFQUE5RCxDQUFpRUMsS0FBakUsQ0FBdUUsQ0FBdkU7QUFDQUosTUFBQUEsTUFBTSxDQUFDakIsRUFBRSxDQUFDNkcsV0FBSCxDQUFlcEQsSUFBZixDQUFvQixDQUFwQixFQUF1QixDQUF2QixDQUFELENBQU4sQ0FBa0NyQyxFQUFsQyxDQUFxQ29DLElBQXJDLENBQTBDbkMsS0FBMUMsQ0FBZ0Q7QUFDOUMwQyxRQUFBQSxPQUFPLEVBQUU7QUFDUG1GLFVBQUFBLEtBQUssRUFBRSxDQUFDO0FBQ05ILFlBQUFBLEVBQUUsRUFBRTtBQURFLFdBQUQ7QUFEQTtBQURxQyxPQUFoRDtBQU9ELEtBaEJDLENBQUY7QUFpQkQsR0FsQkQ7QUFvQkFoSixFQUFBQSxRQUFRLENBQUMsZUFBRCxFQUFrQixNQUFNO0FBQzlCWSxJQUFBQSxFQUFFLENBQUMsNEJBQUQsRUFBK0IsTUFBTTtBQUNyQ1gsTUFBQUEsRUFBRSxDQUFDbUosWUFBSCxDQUFnQixLQUFoQjs7QUFFQWxJLE1BQUFBLE1BQU0sQ0FBQ2pCLEVBQUUsQ0FBQ29ELE1BQUosQ0FBTixDQUFrQmhDLEVBQWxCLENBQXFCQyxLQUFyQixDQUEyQixLQUEzQjtBQUNELEtBSkMsQ0FBRjtBQU1BVixJQUFBQSxFQUFFLENBQUMsa0RBQUQsRUFBcUQsTUFBTTtBQUMzRFgsTUFBQUEsRUFBRSxDQUFDeUksY0FBSCxHQUFvQjdILEtBQUssQ0FBQ0MsSUFBTixFQUFwQjtBQUNBYixNQUFBQSxFQUFFLENBQUNvRCxNQUFILEdBQVkrRSxzQkFBWjtBQUNBbkksTUFBQUEsRUFBRSxDQUFDNEQsZ0JBQUgsR0FBc0IsS0FBdEI7O0FBRUE1RCxNQUFBQSxFQUFFLENBQUNtSixZQUFILENBQWdCLEtBQWhCOztBQUVBbEksTUFBQUEsTUFBTSxDQUFDakIsRUFBRSxDQUFDNEQsZ0JBQUosQ0FBTixDQUE0QnhDLEVBQTVCLENBQStCYSxFQUEvQixDQUFrQ2lCLEtBQWxDO0FBQ0FqQyxNQUFBQSxNQUFNLENBQUNqQixFQUFFLENBQUN5SSxjQUFILENBQWtCbkUsUUFBbEIsQ0FBMkIsS0FBM0IsRUFBa0NuRCxTQUFuQyxDQUFOLENBQW9EQyxFQUFwRCxDQUF1REMsS0FBdkQsQ0FBNkQsQ0FBN0Q7QUFDRCxLQVRDLENBQUY7QUFVRCxHQWpCTyxDQUFSO0FBbUJBdEIsRUFBQUEsUUFBUSxDQUFDLGNBQUQsRUFBaUIsTUFBTTtBQUM3QlksSUFBQUEsRUFBRSxDQUFDLHVDQUFELEVBQTBDLE1BQU07QUFDaEQsVUFBSXdGLElBQUksR0FBRztBQUNUaUQsUUFBQUEsUUFBUSxFQUFFO0FBREQsT0FBWDtBQUdBbkksTUFBQUEsTUFBTSxDQUFDakIsRUFBRSxDQUFDcUosV0FBSCxDQUFlbEQsSUFBZixFQUFxQixhQUFyQixFQUFvQyxHQUFwQyxDQUFELENBQU4sQ0FBaUQvRSxFQUFqRCxDQUFvRG9DLElBQXBELENBQXlEbkMsS0FBekQsQ0FBK0Q7QUFDN0RpSSxRQUFBQSxJQUFJLEVBQUUsT0FEdUQ7QUFFN0RyRSxRQUFBQSxTQUFTLEVBQUUsR0FGa0Q7QUFHN0RnRCxRQUFBQSxJQUFJLEVBQUUsYUFIdUQ7QUFJN0RtQixRQUFBQSxRQUFRLEVBQUU7QUFKbUQsT0FBL0Q7QUFNQW5JLE1BQUFBLE1BQU0sQ0FBQ2tGLElBQUQsQ0FBTixDQUFhL0UsRUFBYixDQUFnQm9DLElBQWhCLENBQXFCbkMsS0FBckIsQ0FBMkI7QUFDekIrSCxRQUFBQSxRQUFRLEVBQUUsQ0FBQztBQUNURSxVQUFBQSxJQUFJLEVBQUUsT0FERztBQUVUckUsVUFBQUEsU0FBUyxFQUFFLEdBRkY7QUFHVGdELFVBQUFBLElBQUksRUFBRSxPQUhHO0FBSVRtQixVQUFBQSxRQUFRLEVBQUUsQ0FBQztBQUNURSxZQUFBQSxJQUFJLEVBQUUsT0FERztBQUVUckUsWUFBQUEsU0FBUyxFQUFFLEdBRkY7QUFHVGdELFlBQUFBLElBQUksRUFBRSxhQUhHO0FBSVRtQixZQUFBQSxRQUFRLEVBQUU7QUFKRCxXQUFEO0FBSkQsU0FBRDtBQURlLE9BQTNCO0FBYUQsS0F2QkMsQ0FBRjtBQXlCQXpJLElBQUFBLEVBQUUsQ0FBQyx5Q0FBRCxFQUE0QyxNQUFNO0FBQ2xELFVBQUl3RixJQUFJLEdBQUc7QUFDVGlELFFBQUFBLFFBQVEsRUFBRSxDQUFDO0FBQ1RFLFVBQUFBLElBQUksRUFBRSxPQURHO0FBRVRyRSxVQUFBQSxTQUFTLEVBQUUsR0FGRjtBQUdUZ0QsVUFBQUEsSUFBSSxFQUFFLE9BSEc7QUFJVG1CLFVBQUFBLFFBQVEsRUFBRSxDQUFDO0FBQ1RFLFlBQUFBLElBQUksRUFBRSxPQURHO0FBRVRyRSxZQUFBQSxTQUFTLEVBQUUsR0FGRjtBQUdUZ0QsWUFBQUEsSUFBSSxFQUFFLGFBSEc7QUFJVG1CLFlBQUFBLFFBQVEsRUFBRSxFQUpEO0FBS1RHLFlBQUFBLEdBQUcsRUFBRTtBQUxJLFdBQUQ7QUFKRCxTQUFEO0FBREQsT0FBWDtBQWNBdEksTUFBQUEsTUFBTSxDQUFDakIsRUFBRSxDQUFDcUosV0FBSCxDQUFlbEQsSUFBZixFQUFxQixhQUFyQixFQUFvQyxHQUFwQyxDQUFELENBQU4sQ0FBaUQvRSxFQUFqRCxDQUFvRG9DLElBQXBELENBQXlEbkMsS0FBekQsQ0FBK0Q7QUFDN0RpSSxRQUFBQSxJQUFJLEVBQUUsT0FEdUQ7QUFFN0RyRSxRQUFBQSxTQUFTLEVBQUUsR0FGa0Q7QUFHN0RnRCxRQUFBQSxJQUFJLEVBQUUsYUFIdUQ7QUFJN0RtQixRQUFBQSxRQUFRLEVBQUUsRUFKbUQ7QUFLN0RHLFFBQUFBLEdBQUcsRUFBRTtBQUx3RCxPQUEvRDtBQU9ELEtBdEJDLENBQUY7QUF3QkE1SSxJQUFBQSxFQUFFLENBQUMsc0NBQUQsRUFBeUMsTUFBTTtBQUMvQyxVQUFJd0YsSUFBSSxHQUFHO0FBQ1RpRCxRQUFBQSxRQUFRLEVBQUU7QUFERCxPQUFYO0FBR0FuSSxNQUFBQSxNQUFNLENBQUNqQixFQUFFLENBQUNxSixXQUFILENBQWVsRCxJQUFmLEVBQXFCLGFBQXJCLEVBQW9DLEdBQXBDLENBQUQsQ0FBTixDQUFpRC9FLEVBQWpELENBQW9Eb0MsSUFBcEQsQ0FBeURuQyxLQUF6RCxDQUErRDtBQUM3RGlJLFFBQUFBLElBQUksRUFBRSxPQUR1RDtBQUU3RHJFLFFBQUFBLFNBQVMsRUFBRSxHQUZrRDtBQUc3RGdELFFBQUFBLElBQUksRUFBRSxhQUh1RDtBQUk3RG1CLFFBQUFBLFFBQVEsRUFBRTtBQUptRCxPQUEvRDtBQU1BbkksTUFBQUEsTUFBTSxDQUFDakIsRUFBRSxDQUFDcUosV0FBSCxDQUFlbEQsSUFBZixFQUFxQixjQUFyQixFQUFxQyxHQUFyQyxDQUFELENBQU4sQ0FBa0QvRSxFQUFsRCxDQUFxRG9DLElBQXJELENBQTBEbkMsS0FBMUQsQ0FBZ0U7QUFDOURpSSxRQUFBQSxJQUFJLEVBQUUsUUFEd0Q7QUFFOURyRSxRQUFBQSxTQUFTLEVBQUUsR0FGbUQ7QUFHOURnRCxRQUFBQSxJQUFJLEVBQUUsY0FId0Q7QUFJOURtQixRQUFBQSxRQUFRLEVBQUU7QUFKb0QsT0FBaEU7QUFPQW5JLE1BQUFBLE1BQU0sQ0FBQ2tGLElBQUQsQ0FBTixDQUFhL0UsRUFBYixDQUFnQm9DLElBQWhCLENBQXFCbkMsS0FBckIsQ0FBMkI7QUFDekIrSCxRQUFBQSxRQUFRLEVBQUUsQ0FBQztBQUNURSxVQUFBQSxJQUFJLEVBQUUsT0FERztBQUVUckUsVUFBQUEsU0FBUyxFQUFFLEdBRkY7QUFHVGdELFVBQUFBLElBQUksRUFBRSxPQUhHO0FBSVRtQixVQUFBQSxRQUFRLEVBQUUsQ0FBQztBQUNURSxZQUFBQSxJQUFJLEVBQUUsT0FERztBQUVUckUsWUFBQUEsU0FBUyxFQUFFLEdBRkY7QUFHVGdELFlBQUFBLElBQUksRUFBRSxhQUhHO0FBSVRtQixZQUFBQSxRQUFRLEVBQUU7QUFKRCxXQUFELEVBS1A7QUFDREUsWUFBQUEsSUFBSSxFQUFFLFFBREw7QUFFRHJFLFlBQUFBLFNBQVMsRUFBRSxHQUZWO0FBR0RnRCxZQUFBQSxJQUFJLEVBQUUsY0FITDtBQUlEbUIsWUFBQUEsUUFBUSxFQUFFO0FBSlQsV0FMTztBQUpELFNBQUQ7QUFEZSxPQUEzQjtBQWtCRCxLQW5DQyxDQUFGO0FBb0NELEdBdEZPLENBQVI7QUF3RkFySixFQUFBQSxRQUFRLENBQUMsa0JBQUQsRUFBcUIsTUFBTTtBQUNqQ1ksSUFBQUEsRUFBRSxDQUFDLGtEQUFELEVBQXNEK0IsSUFBRCxJQUFVO0FBQy9EMUMsTUFBQUEsRUFBRSxDQUFDTyxNQUFILENBQVVpSixnQkFBVixHQUE2QixJQUE3QjtBQUNBeEosTUFBQUEsRUFBRSxDQUFDNEQsZ0JBQUgsR0FBc0IsS0FBdEI7O0FBQ0E1RCxNQUFBQSxFQUFFLENBQUM2SSxRQUFILEdBQWMsQ0FBQ1osSUFBRCxFQUFPdEQsSUFBUCxFQUFhQyxLQUFiLEtBQXVCO0FBQ25DM0QsUUFBQUEsTUFBTSxDQUFDZ0gsSUFBRCxDQUFOLENBQWE3RyxFQUFiLENBQWdCQyxLQUFoQixDQUFzQixLQUF0QjtBQUNBSixRQUFBQSxNQUFNLENBQUMwRCxJQUFELENBQU4sQ0FBYXZELEVBQWIsQ0FBZ0JDLEtBQWhCLENBQXNCLFFBQXRCO0FBQ0FKLFFBQUFBLE1BQU0sQ0FBQzJELEtBQUQsQ0FBTixDQUFjeEQsRUFBZCxDQUFpQkMsS0FBakIsQ0FBdUIsR0FBdkI7QUFDQXFCLFFBQUFBLElBQUk7QUFDTCxPQUxEOztBQU1BMUMsTUFBQUEsRUFBRSxDQUFDTyxNQUFILENBQVVrSixPQUFWLENBQWtCO0FBQ2hCO0FBQ0FDLFFBQUFBLElBQUksRUFBRSxJQUFJeEYsVUFBSixDQUFlLENBQUMsRUFBRCxFQUFLLEVBQUwsRUFBUyxFQUFULEVBQWEsRUFBYixFQUFpQixFQUFqQixFQUFxQixFQUFyQixFQUF5QixFQUF6QixFQUE2QixFQUE3QixFQUFpQyxFQUFqQyxFQUFxQyxFQUFyQyxFQUF5QyxFQUF6QyxFQUE2QyxFQUE3QyxFQUFpRCxFQUFqRCxFQUFxRCxFQUFyRCxDQUFmLEVBQXlFeUY7QUFGL0QsT0FBbEI7QUFJRCxLQWJDLENBQUY7QUFlQWhKLElBQUFBLEVBQUUsQ0FBQyxtREFBRCxFQUF1RCtCLElBQUQsSUFBVTtBQUNoRTFDLE1BQUFBLEVBQUUsQ0FBQ08sTUFBSCxDQUFVaUosZ0JBQVYsR0FBNkIsSUFBN0I7QUFDQXhKLE1BQUFBLEVBQUUsQ0FBQzRELGdCQUFILEdBQXNCLEtBQXRCOztBQUNBNUQsTUFBQUEsRUFBRSxDQUFDNkksUUFBSCxHQUFjLENBQUNaLElBQUQsRUFBT3RELElBQVAsRUFBYUMsS0FBYixLQUF1QjtBQUNuQzNELFFBQUFBLE1BQU0sQ0FBQ2dILElBQUQsQ0FBTixDQUFhN0csRUFBYixDQUFnQkMsS0FBaEIsQ0FBc0IsS0FBdEI7QUFDQUosUUFBQUEsTUFBTSxDQUFDMEQsSUFBRCxDQUFOLENBQWF2RCxFQUFiLENBQWdCQyxLQUFoQixDQUFzQixTQUF0QjtBQUNBSixRQUFBQSxNQUFNLENBQUMyRCxLQUFELENBQU4sQ0FBY3hELEVBQWQsQ0FBaUJDLEtBQWpCLENBQXVCLEdBQXZCO0FBQ0FxQixRQUFBQSxJQUFJO0FBQ0wsT0FMRDs7QUFNQTFDLE1BQUFBLEVBQUUsQ0FBQ08sTUFBSCxDQUFVa0osT0FBVixDQUFrQjtBQUNoQjtBQUNBQyxRQUFBQSxJQUFJLEVBQUUsSUFBSXhGLFVBQUosQ0FBZSxDQUFDLEVBQUQsRUFBSyxFQUFMLEVBQVMsRUFBVCxFQUFhLEVBQWIsRUFBaUIsRUFBakIsRUFBcUIsRUFBckIsRUFBeUIsRUFBekIsRUFBNkIsRUFBN0IsRUFBaUMsRUFBakMsRUFBcUMsRUFBckMsRUFBeUMsRUFBekMsRUFBNkMsRUFBN0MsRUFBaUQsRUFBakQsRUFBcUQsRUFBckQsRUFBeUQsRUFBekQsQ0FBZixFQUE2RXlGO0FBRm5FLE9BQWxCO0FBSUQsS0FiQyxDQUFGO0FBZUFoSixJQUFBQSxFQUFFLENBQUMsaURBQUQsRUFBcUQrQixJQUFELElBQVU7QUFDOUQxQyxNQUFBQSxFQUFFLENBQUNPLE1BQUgsQ0FBVWlKLGdCQUFWLEdBQTZCLElBQTdCO0FBQ0F4SixNQUFBQSxFQUFFLENBQUM0RCxnQkFBSCxHQUFzQixLQUF0Qjs7QUFDQTVELE1BQUFBLEVBQUUsQ0FBQzZJLFFBQUgsR0FBYyxDQUFDWixJQUFELEVBQU90RCxJQUFQLEVBQWFDLEtBQWIsS0FBdUI7QUFDbkMzRCxRQUFBQSxNQUFNLENBQUNnSCxJQUFELENBQU4sQ0FBYTdHLEVBQWIsQ0FBZ0JDLEtBQWhCLENBQXNCLEtBQXRCO0FBQ0FKLFFBQUFBLE1BQU0sQ0FBQzBELElBQUQsQ0FBTixDQUFhdkQsRUFBYixDQUFnQkMsS0FBaEIsQ0FBc0IsT0FBdEI7QUFDQUosUUFBQUEsTUFBTSxDQUFDMkQsS0FBRCxDQUFOLENBQWN4RCxFQUFkLENBQWlCb0MsSUFBakIsQ0FBc0JuQyxLQUF0QixDQUE0QjtBQUMxQixlQUFLLEdBRHFCO0FBRTFCOEYsVUFBQUEsS0FBSyxFQUFFLENBQUMsUUFBRCxDQUZtQjtBQUcxQnlDLFVBQUFBLE1BQU0sRUFBRTtBQUhrQixTQUE1QjtBQUtBbEgsUUFBQUEsSUFBSTtBQUNMLE9BVEQ7O0FBVUExQyxNQUFBQSxFQUFFLENBQUNPLE1BQUgsQ0FBVWtKLE9BQVYsQ0FBa0I7QUFDaEI7QUFDQUMsUUFBQUEsSUFBSSxFQUFFLElBQUl4RixVQUFKLENBQWUsQ0FBQyxFQUFELEVBQUssRUFBTCxFQUFTLEVBQVQsRUFBYSxFQUFiLEVBQWlCLEVBQWpCLEVBQXFCLEVBQXJCLEVBQXlCLEVBQXpCLEVBQTZCLEVBQTdCLEVBQWlDLEVBQWpDLEVBQXFDLEVBQXJDLEVBQXlDLEVBQXpDLEVBQTZDLEVBQTdDLEVBQWlELEVBQWpELEVBQXFELEVBQXJELEVBQXlELEVBQXpELEVBQTZELEVBQTdELEVBQWlFLEVBQWpFLEVBQXFFLEVBQXJFLEVBQXlFLEVBQXpFLEVBQTZFLEVBQTdFLEVBQWlGLEVBQWpGLEVBQXFGLEVBQXJGLEVBQXlGLEdBQXpGLEVBQThGLEdBQTlGLEVBQW1HLEdBQW5HLEVBQXdHLEVBQXhHLEVBQTRHLEVBQTVHLEVBQWdILEVBQWhILEVBQW9ILEVBQXBILEVBQXdILEVBQXhILEVBQTRILEVBQTVILEVBQWdJLEVBQWhJLEVBQW9JLEVBQXBJLEVBQXdJLEVBQXhJLEVBQTRJLEVBQTVJLEVBQWdKLEVBQWhKLEVBQW9KLEVBQXBKLEVBQXdKLEVBQXhKLEVBQTRKLEVBQTVKLEVBQWdLLEVBQWhLLENBQWYsRUFBb0x5RjtBQUYxSyxPQUFsQjtBQUlELEtBakJDLENBQUY7QUFrQkQsR0FqRE8sQ0FBUjtBQWtERCxDQTVzQ08sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC1leHByZXNzaW9ucyAqL1xuXG5pbXBvcnQgSW1hcENsaWVudCwgeyBTVEFURV9TRUxFQ1RFRCwgU1RBVEVfTE9HT1VUIH0gZnJvbSAnLi9jbGllbnQnXG5pbXBvcnQgeyBwYXJzZXIgfSBmcm9tICdlbWFpbGpzLWltYXAtaGFuZGxlcidcbmltcG9ydCB7XG4gIHRvVHlwZWRBcnJheSxcbiAgTE9HX0xFVkVMX05PTkUgYXMgbG9nTGV2ZWxcbn0gZnJvbSAnLi9jb21tb24nXG5cbmRlc2NyaWJlKCdicm93c2VyYm94IHVuaXQgdGVzdHMnLCAoKSA9PiB7XG4gIHZhciBiclxuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIGNvbnN0IGF1dGggPSB7IHVzZXI6ICdiYWxkcmlhbicsIHBhc3M6ICdzbGVlcGVyLmRlJyB9XG4gICAgYnIgPSBuZXcgSW1hcENsaWVudCgnc29tZWhvc3QnLCAxMjM0LCB7IGF1dGgsIGxvZ0xldmVsIH0pXG4gICAgYnIuY2xpZW50LnNvY2tldCA9IHtcbiAgICAgIHNlbmQ6ICgpID0+IHsgfSxcbiAgICAgIHVwZ3JhZGVUb1NlY3VyZTogKCkgPT4geyB9XG4gICAgfVxuICB9KVxuXG4gIGRlc2NyaWJlKCcjX29uSWRsZScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGNhbGwgZW50ZXJJZGxlJywgKCkgPT4ge1xuICAgICAgc2lub24uc3R1YihiciwgJ2VudGVySWRsZScpXG5cbiAgICAgIGJyLl9hdXRoZW50aWNhdGVkID0gdHJ1ZVxuICAgICAgYnIuX2VudGVyZWRJZGxlID0gZmFsc2VcbiAgICAgIGJyLl9vbklkbGUoKVxuXG4gICAgICBleHBlY3QoYnIuZW50ZXJJZGxlLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBub3QgY2FsbCBlbnRlcklkbGUnLCAoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGJyLCAnZW50ZXJJZGxlJylcblxuICAgICAgYnIuX2VudGVyZWRJZGxlID0gdHJ1ZVxuICAgICAgYnIuX29uSWRsZSgpXG5cbiAgICAgIGV4cGVjdChici5lbnRlcklkbGUuY2FsbENvdW50KS50by5lcXVhbCgwKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJyNvcGVuQ29ubmVjdGlvbicsICgpID0+IHtcbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIHNpbm9uLnN0dWIoYnIuY2xpZW50LCAnY29ubmVjdCcpXG4gICAgICBzaW5vbi5zdHViKGJyLmNsaWVudCwgJ2Nsb3NlJylcbiAgICAgIHNpbm9uLnN0dWIoYnIuY2xpZW50LCAnZW5xdWV1ZUNvbW1hbmQnKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCBvcGVuIGNvbm5lY3Rpb24nLCAoKSA9PiB7XG4gICAgICBici5jbGllbnQuY29ubmVjdC5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSgpKVxuICAgICAgYnIuY2xpZW50LmVucXVldWVDb21tYW5kLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgY2FwYWJpbGl0eTogWydjYXBhMScsICdjYXBhMiddXG4gICAgICB9KSlcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gYnIuY2xpZW50Lm9ucmVhZHkoKSwgMClcbiAgICAgIHJldHVybiBici5vcGVuQ29ubmVjdGlvbigpLnRoZW4oKCkgPT4ge1xuICAgICAgICBleHBlY3QoYnIuY2xpZW50LmNvbm5lY3QuY2FsbGVkT25jZSkudG8uYmUudHJ1ZVxuICAgICAgICBleHBlY3QoYnIuY2xpZW50LmVucXVldWVDb21tYW5kLmNhbGxlZE9uY2UpLnRvLmJlLnRydWVcbiAgICAgICAgZXhwZWN0KGJyLl9jYXBhYmlsaXR5Lmxlbmd0aCkudG8uZXF1YWwoMilcbiAgICAgICAgZXhwZWN0KGJyLl9jYXBhYmlsaXR5WzBdKS50by5lcXVhbCgnY2FwYTEnKVxuICAgICAgICBleHBlY3QoYnIuX2NhcGFiaWxpdHlbMV0pLnRvLmVxdWFsKCdjYXBhMicpXG4gICAgICB9KVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJyNjb25uZWN0JywgKCkgPT4ge1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgc2lub24uc3R1Yihici5jbGllbnQsICdjb25uZWN0JylcbiAgICAgIHNpbm9uLnN0dWIoYnIuY2xpZW50LCAnY2xvc2UnKVxuICAgICAgc2lub24uc3R1YihiciwgJ3VwZGF0ZUNhcGFiaWxpdHknKVxuICAgICAgc2lub24uc3R1YihiciwgJ3VwZ3JhZGVDb25uZWN0aW9uJylcbiAgICAgIHNpbm9uLnN0dWIoYnIsICd1cGRhdGVJZCcpXG4gICAgICBzaW5vbi5zdHViKGJyLCAnbG9naW4nKVxuICAgICAgc2lub24uc3R1YihiciwgJ2NvbXByZXNzQ29ubmVjdGlvbicpXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgY29ubmVjdCcsICgpID0+IHtcbiAgICAgIGJyLmNsaWVudC5jb25uZWN0LnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKCkpXG4gICAgICBici51cGRhdGVDYXBhYmlsaXR5LnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKCkpXG4gICAgICBici51cGdyYWRlQ29ubmVjdGlvbi5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSgpKVxuICAgICAgYnIudXBkYXRlSWQucmV0dXJucyhQcm9taXNlLnJlc29sdmUoKSlcbiAgICAgIGJyLmxvZ2luLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKCkpXG4gICAgICBici5jb21wcmVzc0Nvbm5lY3Rpb24ucmV0dXJucyhQcm9taXNlLnJlc29sdmUoKSlcblxuICAgICAgc2V0VGltZW91dCgoKSA9PiBici5jbGllbnQub25yZWFkeSgpLCAwKVxuICAgICAgcmV0dXJuIGJyLmNvbm5lY3QoKS50aGVuKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KGJyLmNsaWVudC5jb25uZWN0LmNhbGxlZE9uY2UpLnRvLmJlLnRydWVcbiAgICAgICAgZXhwZWN0KGJyLnVwZGF0ZUNhcGFiaWxpdHkuY2FsbGVkT25jZSkudG8uYmUudHJ1ZVxuICAgICAgICBleHBlY3QoYnIudXBncmFkZUNvbm5lY3Rpb24uY2FsbGVkT25jZSkudG8uYmUudHJ1ZVxuICAgICAgICBleHBlY3QoYnIudXBkYXRlSWQuY2FsbGVkT25jZSkudG8uYmUudHJ1ZVxuICAgICAgICBleHBlY3QoYnIubG9naW4uY2FsbGVkT25jZSkudG8uYmUudHJ1ZVxuICAgICAgICBleHBlY3QoYnIuY29tcHJlc3NDb25uZWN0aW9uLmNhbGxlZE9uY2UpLnRvLmJlLnRydWVcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byBsb2dpbicsIChkb25lKSA9PiB7XG4gICAgICBici5jbGllbnQuY29ubmVjdC5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSgpKVxuICAgICAgYnIudXBkYXRlQ2FwYWJpbGl0eS5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSgpKVxuICAgICAgYnIudXBncmFkZUNvbm5lY3Rpb24ucmV0dXJucyhQcm9taXNlLnJlc29sdmUoKSlcbiAgICAgIGJyLnVwZGF0ZUlkLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKCkpXG4gICAgICBici5sb2dpbi50aHJvd3MobmV3IEVycm9yKCkpXG5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gYnIuY2xpZW50Lm9ucmVhZHkoKSwgMClcbiAgICAgIGJyLmNvbm5lY3QoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIGV4cGVjdChlcnIpLnRvLmV4aXN0XG5cbiAgICAgICAgZXhwZWN0KGJyLmNsaWVudC5jb25uZWN0LmNhbGxlZE9uY2UpLnRvLmJlLnRydWVcbiAgICAgICAgZXhwZWN0KGJyLmNsaWVudC5jbG9zZS5jYWxsZWRPbmNlKS50by5iZS50cnVlXG4gICAgICAgIGV4cGVjdChici51cGRhdGVDYXBhYmlsaXR5LmNhbGxlZE9uY2UpLnRvLmJlLnRydWVcbiAgICAgICAgZXhwZWN0KGJyLnVwZ3JhZGVDb25uZWN0aW9uLmNhbGxlZE9uY2UpLnRvLmJlLnRydWVcbiAgICAgICAgZXhwZWN0KGJyLnVwZGF0ZUlkLmNhbGxlZE9uY2UpLnRvLmJlLnRydWVcbiAgICAgICAgZXhwZWN0KGJyLmxvZ2luLmNhbGxlZE9uY2UpLnRvLmJlLnRydWVcblxuICAgICAgICBleHBlY3QoYnIuY29tcHJlc3NDb25uZWN0aW9uLmNhbGxlZCkudG8uYmUuZmFsc2VcblxuICAgICAgICBkb25lKClcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgdGltZW91dCcsIChkb25lKSA9PiB7XG4gICAgICBici5jbGllbnQuY29ubmVjdC5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSgpKVxuICAgICAgYnIudGltZW91dENvbm5lY3Rpb24gPSAxXG5cbiAgICAgIGJyLmNvbm5lY3QoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIGV4cGVjdChlcnIpLnRvLmV4aXN0XG5cbiAgICAgICAgZXhwZWN0KGJyLmNsaWVudC5jb25uZWN0LmNhbGxlZE9uY2UpLnRvLmJlLnRydWVcbiAgICAgICAgZXhwZWN0KGJyLmNsaWVudC5jbG9zZS5jYWxsZWRPbmNlKS50by5iZS50cnVlXG5cbiAgICAgICAgZXhwZWN0KGJyLnVwZGF0ZUNhcGFiaWxpdHkuY2FsbGVkKS50by5iZS5mYWxzZVxuICAgICAgICBleHBlY3QoYnIudXBncmFkZUNvbm5lY3Rpb24uY2FsbGVkKS50by5iZS5mYWxzZVxuICAgICAgICBleHBlY3QoYnIudXBkYXRlSWQuY2FsbGVkKS50by5iZS5mYWxzZVxuICAgICAgICBleHBlY3QoYnIubG9naW4uY2FsbGVkKS50by5iZS5mYWxzZVxuICAgICAgICBleHBlY3QoYnIuY29tcHJlc3NDb25uZWN0aW9uLmNhbGxlZCkudG8uYmUuZmFsc2VcblxuICAgICAgICBkb25lKClcbiAgICAgIH0pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnI2Nsb3NlJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZm9yY2UtY2xvc2UnLCAoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGJyLmNsaWVudCwgJ2Nsb3NlJykucmV0dXJucyhQcm9taXNlLnJlc29sdmUoKSlcblxuICAgICAgcmV0dXJuIGJyLmNsb3NlKCkudGhlbigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChici5fc3RhdGUpLnRvLmVxdWFsKFNUQVRFX0xPR09VVClcbiAgICAgICAgZXhwZWN0KGJyLmNsaWVudC5jbG9zZS5jYWxsZWRPbmNlKS50by5iZS50cnVlXG4gICAgICB9KVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJyNleGVjJywgKCkgPT4ge1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgc2lub24uc3R1YihiciwgJ2JyZWFrSWRsZScpXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgc2VuZCBzdHJpbmcgY29tbWFuZCcsICgpID0+IHtcbiAgICAgIHNpbm9uLnN0dWIoYnIuY2xpZW50LCAnZW5xdWV1ZUNvbW1hbmQnKS5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSh7fSkpXG4gICAgICByZXR1cm4gYnIuZXhlYygnVEVTVCcpLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICBleHBlY3QocmVzKS50by5kZWVwLmVxdWFsKHt9KVxuICAgICAgICBleHBlY3QoYnIuY2xpZW50LmVucXVldWVDb21tYW5kLmFyZ3NbMF1bMF0pLnRvLmVxdWFsKCdURVNUJylcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgdXBkYXRlIGNhcGFiaWxpdHkgZnJvbSByZXNwb25zZScsICgpID0+IHtcbiAgICAgIHNpbm9uLnN0dWIoYnIuY2xpZW50LCAnZW5xdWV1ZUNvbW1hbmQnKS5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgIGNhcGFiaWxpdHk6IFsnQScsICdCJ11cbiAgICAgIH0pKVxuICAgICAgcmV0dXJuIGJyLmV4ZWMoJ1RFU1QnKS50aGVuKChyZXMpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlcykudG8uZGVlcC5lcXVhbCh7XG4gICAgICAgICAgY2FwYWJpbGl0eTogWydBJywgJ0InXVxuICAgICAgICB9KVxuICAgICAgICBleHBlY3QoYnIuX2NhcGFiaWxpdHkpLnRvLmRlZXAuZXF1YWwoWydBJywgJ0InXSlcbiAgICAgIH0pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnI2VudGVySWRsZScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHBlcmlvZGljYWxseSBzZW5kIE5PT1AgaWYgSURMRSBub3Qgc3VwcG9ydGVkJywgKGRvbmUpID0+IHtcbiAgICAgIHNpbm9uLnN0dWIoYnIsICdleGVjJykuY2FsbHNGYWtlKChjb21tYW5kKSA9PiB7XG4gICAgICAgIGV4cGVjdChjb21tYW5kKS50by5lcXVhbCgnTk9PUCcpXG5cbiAgICAgICAgZG9uZSgpXG4gICAgICB9KVxuXG4gICAgICBici5fY2FwYWJpbGl0eSA9IFtdXG4gICAgICBici5fc2VsZWN0ZWRNYWlsYm94ID0gJ0ZPTydcbiAgICAgIGJyLnRpbWVvdXROb29wID0gMVxuICAgICAgYnIuZW50ZXJJZGxlKClcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBwZXJpb2RpY2FsbHkgc2VuZCBOT09QIGlmIG5vIG1haWxib3ggc2VsZWN0ZWQnLCAoZG9uZSkgPT4ge1xuICAgICAgc2lub24uc3R1YihiciwgJ2V4ZWMnKS5jYWxsc0Zha2UoKGNvbW1hbmQpID0+IHtcbiAgICAgICAgZXhwZWN0KGNvbW1hbmQpLnRvLmVxdWFsKCdOT09QJylcblxuICAgICAgICBkb25lKClcbiAgICAgIH0pXG5cbiAgICAgIGJyLl9jYXBhYmlsaXR5ID0gWydJRExFJ11cbiAgICAgIGJyLl9zZWxlY3RlZE1haWxib3ggPSB1bmRlZmluZWRcbiAgICAgIGJyLnRpbWVvdXROb29wID0gMVxuICAgICAgYnIuZW50ZXJJZGxlKClcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBicmVhayBJRExFIGFmdGVyIHRpbWVvdXQnLCAoZG9uZSkgPT4ge1xuICAgICAgc2lub24uc3R1Yihici5jbGllbnQsICdlbnF1ZXVlQ29tbWFuZCcpXG4gICAgICBzaW5vbi5zdHViKGJyLmNsaWVudC5zb2NrZXQsICdzZW5kJykuY2FsbHNGYWtlKChwYXlsb2FkKSA9PiB7XG4gICAgICAgIGV4cGVjdChici5jbGllbnQuZW5xdWV1ZUNvbW1hbmQuYXJnc1swXVswXS5jb21tYW5kKS50by5lcXVhbCgnSURMRScpXG4gICAgICAgIGV4cGVjdChbXS5zbGljZS5jYWxsKG5ldyBVaW50OEFycmF5KHBheWxvYWQpKSkudG8uZGVlcC5lcXVhbChbMHg0NCwgMHg0ZiwgMHg0ZSwgMHg0NSwgMHgwZCwgMHgwYV0pXG5cbiAgICAgICAgZG9uZSgpXG4gICAgICB9KVxuXG4gICAgICBici5fY2FwYWJpbGl0eSA9IFsnSURMRSddXG4gICAgICBici5fc2VsZWN0ZWRNYWlsYm94ID0gJ0ZPTydcbiAgICAgIGJyLnRpbWVvdXRJZGxlID0gMVxuICAgICAgYnIuZW50ZXJJZGxlKClcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCcjYnJlYWtJZGxlJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgc2VuZCBET05FIHRvIHNvY2tldCcsICgpID0+IHtcbiAgICAgIHNpbm9uLnN0dWIoYnIuY2xpZW50LnNvY2tldCwgJ3NlbmQnKVxuXG4gICAgICBici5fZW50ZXJlZElkbGUgPSAnSURMRSdcbiAgICAgIGJyLmJyZWFrSWRsZSgpXG4gICAgICBleHBlY3QoW10uc2xpY2UuY2FsbChuZXcgVWludDhBcnJheShici5jbGllbnQuc29ja2V0LnNlbmQuYXJnc1swXVswXSkpKS50by5kZWVwLmVxdWFsKFsweDQ0LCAweDRmLCAweDRlLCAweDQ1LCAweDBkLCAweDBhXSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCcjdXBncmFkZUNvbm5lY3Rpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBkbyBub3RoaW5nIGlmIGFscmVhZHkgc2VjdXJlZCcsICgpID0+IHtcbiAgICAgIGJyLmNsaWVudC5zZWN1cmVNb2RlID0gdHJ1ZVxuICAgICAgYnIuX2NhcGFiaWxpdHkgPSBbJ3N0YXJ0dGxzJ11cbiAgICAgIHJldHVybiBici51cGdyYWRlQ29ubmVjdGlvbigpXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgZG8gbm90aGluZyBpZiBTVEFSVFRMUyBub3QgYXZhaWxhYmxlJywgKCkgPT4ge1xuICAgICAgYnIuY2xpZW50LnNlY3VyZU1vZGUgPSBmYWxzZVxuICAgICAgYnIuX2NhcGFiaWxpdHkgPSBbXVxuICAgICAgcmV0dXJuIGJyLnVwZ3JhZGVDb25uZWN0aW9uKClcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBydW4gU1RBUlRUTFMnLCAoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGJyLmNsaWVudCwgJ3VwZ3JhZGUnKVxuICAgICAgc2lub24uc3R1YihiciwgJ2V4ZWMnKS53aXRoQXJncygnU1RBUlRUTFMnKS5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSgpKVxuICAgICAgc2lub24uc3R1YihiciwgJ3VwZGF0ZUNhcGFiaWxpdHknKS5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSgpKVxuXG4gICAgICBici5fY2FwYWJpbGl0eSA9IFsnU1RBUlRUTFMnXVxuXG4gICAgICByZXR1cm4gYnIudXBncmFkZUNvbm5lY3Rpb24oKS50aGVuKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KGJyLmNsaWVudC51cGdyYWRlLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICAgICAgZXhwZWN0KGJyLl9jYXBhYmlsaXR5Lmxlbmd0aCkudG8uZXF1YWwoMClcbiAgICAgIH0pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnI3VwZGF0ZUNhcGFiaWxpdHknLCAoKSA9PiB7XG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGJyLCAnZXhlYycpXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgZG8gbm90aGluZyBpZiBjYXBhYmlsaXR5IGlzIHNldCcsICgpID0+IHtcbiAgICAgIGJyLl9jYXBhYmlsaXR5ID0gWydhYmMnXVxuICAgICAgcmV0dXJuIGJyLnVwZGF0ZUNhcGFiaWxpdHkoKVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIHJ1biBDQVBBQklMSVRZIGlmIGNhcGFiaWxpdHkgbm90IHNldCcsICgpID0+IHtcbiAgICAgIGJyLmV4ZWMucmV0dXJucyhQcm9taXNlLnJlc29sdmUoKSlcblxuICAgICAgYnIuX2NhcGFiaWxpdHkgPSBbXVxuXG4gICAgICByZXR1cm4gYnIudXBkYXRlQ2FwYWJpbGl0eSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICBleHBlY3QoYnIuZXhlYy5hcmdzWzBdWzBdKS50by5lcXVhbCgnQ0FQQUJJTElUWScpXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIGZvcmNlIHJ1biBDQVBBQklMSVRZJywgKCkgPT4ge1xuICAgICAgYnIuZXhlYy5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSgpKVxuICAgICAgYnIuX2NhcGFiaWxpdHkgPSBbJ2FiYyddXG5cbiAgICAgIHJldHVybiBici51cGRhdGVDYXBhYmlsaXR5KHRydWUpLnRoZW4oKCkgPT4ge1xuICAgICAgICBleHBlY3QoYnIuZXhlYy5hcmdzWzBdWzBdKS50by5lcXVhbCgnQ0FQQUJJTElUWScpXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIGRvIG5vdGhpbmcgaWYgY29ubmVjdGlvbiBpcyBub3QgeWV0IHVwZ3JhZGVkJywgKCkgPT4ge1xuICAgICAgYnIuX2NhcGFiaWxpdHkgPSBbXVxuICAgICAgYnIuY2xpZW50LnNlY3VyZU1vZGUgPSBmYWxzZVxuICAgICAgYnIuX3JlcXVpcmVUTFMgPSB0cnVlXG5cbiAgICAgIGJyLnVwZGF0ZUNhcGFiaWxpdHkoKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJyNsaXN0TmFtZXNwYWNlcycsICgpID0+IHtcbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIHNpbm9uLnN0dWIoYnIsICdleGVjJylcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBydW4gTkFNRVNQQUNFIGlmIHN1cHBvcnRlZCcsICgpID0+IHtcbiAgICAgIGJyLmV4ZWMucmV0dXJucyhQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgTkFNRVNQQUNFOiBbe1xuICAgICAgICAgICAgYXR0cmlidXRlczogW1xuICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgW3tcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdTVFJJTkcnLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6ICdJTkJPWC4nXG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ1NUUklORycsXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogJy4nXG4gICAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgICAgXSwgbnVsbCwgbnVsbFxuICAgICAgICAgICAgXVxuICAgICAgICAgIH1dXG4gICAgICAgIH1cbiAgICAgIH0pKVxuICAgICAgYnIuX2NhcGFiaWxpdHkgPSBbJ05BTUVTUEFDRSddXG5cbiAgICAgIHJldHVybiBici5saXN0TmFtZXNwYWNlcygpLnRoZW4oKG5hbWVzcGFjZXMpID0+IHtcbiAgICAgICAgZXhwZWN0KG5hbWVzcGFjZXMpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgICAgIHBlcnNvbmFsOiBbe1xuICAgICAgICAgICAgcHJlZml4OiAnSU5CT1guJyxcbiAgICAgICAgICAgIGRlbGltaXRlcjogJy4nXG4gICAgICAgICAgfV0sXG4gICAgICAgICAgdXNlcnM6IGZhbHNlLFxuICAgICAgICAgIHNoYXJlZDogZmFsc2VcbiAgICAgICAgfSlcbiAgICAgICAgZXhwZWN0KGJyLmV4ZWMuYXJnc1swXVswXSkudG8uZXF1YWwoJ05BTUVTUEFDRScpXG4gICAgICAgIGV4cGVjdChici5leGVjLmFyZ3NbMF1bMV0pLnRvLmVxdWFsKCdOQU1FU1BBQ0UnKVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBkbyBub3RoaW5nIGlmIG5vdCBzdXBwb3J0ZWQnLCAoKSA9PiB7XG4gICAgICBici5fY2FwYWJpbGl0eSA9IFtdXG4gICAgICByZXR1cm4gYnIubGlzdE5hbWVzcGFjZXMoKS50aGVuKChuYW1lc3BhY2VzKSA9PiB7XG4gICAgICAgIGV4cGVjdChuYW1lc3BhY2VzKS50by5iZS5mYWxzZVxuICAgICAgICBleHBlY3QoYnIuZXhlYy5jYWxsQ291bnQpLnRvLmVxdWFsKDApXG4gICAgICB9KVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJyNjb21wcmVzc0Nvbm5lY3Rpb24nLCAoKSA9PiB7XG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGJyLCAnZXhlYycpXG4gICAgICBzaW5vbi5zdHViKGJyLmNsaWVudCwgJ2VuYWJsZUNvbXByZXNzaW9uJylcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBydW4gQ09NUFJFU1M9REVGTEFURSBpZiBzdXBwb3J0ZWQnLCAoKSA9PiB7XG4gICAgICBici5leGVjLndpdGhBcmdzKHtcbiAgICAgICAgY29tbWFuZDogJ0NPTVBSRVNTJyxcbiAgICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgdmFsdWU6ICdERUZMQVRFJ1xuICAgICAgICB9XVxuICAgICAgfSkucmV0dXJucyhQcm9taXNlLnJlc29sdmUoe30pKVxuXG4gICAgICBici5fZW5hYmxlQ29tcHJlc3Npb24gPSB0cnVlXG4gICAgICBici5fY2FwYWJpbGl0eSA9IFsnQ09NUFJFU1M9REVGTEFURSddXG4gICAgICByZXR1cm4gYnIuY29tcHJlc3NDb25uZWN0aW9uKCkudGhlbigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChici5leGVjLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICAgICAgZXhwZWN0KGJyLmNsaWVudC5lbmFibGVDb21wcmVzc2lvbi5jYWxsQ291bnQpLnRvLmVxdWFsKDEpXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIGRvIG5vdGhpbmcgaWYgbm90IHN1cHBvcnRlZCcsICgpID0+IHtcbiAgICAgIGJyLl9jYXBhYmlsaXR5ID0gW11cblxuICAgICAgcmV0dXJuIGJyLmNvbXByZXNzQ29ubmVjdGlvbigpLnRoZW4oKCkgPT4ge1xuICAgICAgICBleHBlY3QoYnIuZXhlYy5jYWxsQ291bnQpLnRvLmVxdWFsKDApXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIGRvIG5vdGhpbmcgaWYgbm90IGVuYWJsZWQnLCAoKSA9PiB7XG4gICAgICBici5fZW5hYmxlQ29tcHJlc3Npb24gPSBmYWxzZVxuICAgICAgYnIuX2NhcGFiaWxpdHkgPSBbJ0NPTVBSRVNTPURFRkxBVEUnXVxuXG4gICAgICByZXR1cm4gYnIuY29tcHJlc3NDb25uZWN0aW9uKCkudGhlbigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChici5leGVjLmNhbGxDb3VudCkudG8uZXF1YWwoMClcbiAgICAgIH0pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnI2xvZ2luJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgY2FsbCBMT0dJTicsICgpID0+IHtcbiAgICAgIHNpbm9uLnN0dWIoYnIsICdleGVjJykucmV0dXJucyhQcm9taXNlLnJlc29sdmUoe30pKVxuICAgICAgc2lub24uc3R1YihiciwgJ3VwZGF0ZUNhcGFiaWxpdHknKS5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSh0cnVlKSlcblxuICAgICAgcmV0dXJuIGJyLmxvZ2luKHtcbiAgICAgICAgdXNlcjogJ3UxJyxcbiAgICAgICAgcGFzczogJ3AxJ1xuICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChici5leGVjLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICAgICAgZXhwZWN0KGJyLmV4ZWMuYXJnc1swXVswXSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICAgICAgY29tbWFuZDogJ2xvZ2luJyxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBbe1xuICAgICAgICAgICAgdHlwZTogJ1NUUklORycsXG4gICAgICAgICAgICB2YWx1ZTogJ3UxJ1xuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIHR5cGU6ICdTVFJJTkcnLFxuICAgICAgICAgICAgdmFsdWU6ICdwMScsXG4gICAgICAgICAgICBzZW5zaXRpdmU6IHRydWVcbiAgICAgICAgICB9XVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBjYWxsIFhPQVVUSDInLCAoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGJyLCAnZXhlYycpLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKHt9KSlcbiAgICAgIHNpbm9uLnN0dWIoYnIsICd1cGRhdGVDYXBhYmlsaXR5JykucmV0dXJucyhQcm9taXNlLnJlc29sdmUodHJ1ZSkpXG5cbiAgICAgIGJyLl9jYXBhYmlsaXR5ID0gWydBVVRIPVhPQVVUSDInXVxuICAgICAgYnIubG9naW4oe1xuICAgICAgICB1c2VyOiAndTEnLFxuICAgICAgICB4b2F1dGgyOiAnYWJjJ1xuICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChici5leGVjLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICAgICAgZXhwZWN0KGJyLmV4ZWMuYXJnc1swXVswXSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICAgICAgY29tbWFuZDogJ0FVVEhFTlRJQ0FURScsXG4gICAgICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICAgIHZhbHVlOiAnWE9BVVRIMidcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICB2YWx1ZTogJ2RYTmxjajExTVFGaGRYUm9QVUpsWVhKbGNpQmhZbU1CQVE9PScsXG4gICAgICAgICAgICBzZW5zaXRpdmU6IHRydWVcbiAgICAgICAgICB9XVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCcjdXBkYXRlSWQnLCAoKSA9PiB7XG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGJyLCAnZXhlYycpXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgbm90IG5vdGhpbmcgaWYgbm90IHN1cHBvcnRlZCcsICgpID0+IHtcbiAgICAgIGJyLl9jYXBhYmlsaXR5ID0gW11cblxuICAgICAgcmV0dXJuIGJyLnVwZGF0ZUlkKHtcbiAgICAgICAgYTogJ2InLFxuICAgICAgICBjOiAnZCdcbiAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICBleHBlY3QoYnIuc2VydmVySWQpLnRvLmJlLmZhbHNlXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIHNlbmQgTklMJywgKCkgPT4ge1xuICAgICAgYnIuZXhlYy53aXRoQXJncyh7XG4gICAgICAgIGNvbW1hbmQ6ICdJRCcsXG4gICAgICAgIGF0dHJpYnV0ZXM6IFtcbiAgICAgICAgICBudWxsXG4gICAgICAgIF1cbiAgICAgIH0pLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgIElEOiBbe1xuICAgICAgICAgICAgYXR0cmlidXRlczogW1xuICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICBdXG4gICAgICAgICAgfV1cbiAgICAgICAgfVxuICAgICAgfSkpXG4gICAgICBici5fY2FwYWJpbGl0eSA9IFsnSUQnXVxuXG4gICAgICByZXR1cm4gYnIudXBkYXRlSWQobnVsbCkudGhlbigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChici5zZXJ2ZXJJZCkudG8uZGVlcC5lcXVhbCh7fSlcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgZXhoYW5nZSBJRCB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICBici5leGVjLndpdGhBcmdzKHtcbiAgICAgICAgY29tbWFuZDogJ0lEJyxcbiAgICAgICAgYXR0cmlidXRlczogW1xuICAgICAgICAgIFsnY2tleTEnLCAnY3ZhbDEnLCAnY2tleTInLCAnY3ZhbDInXVxuICAgICAgICBdXG4gICAgICB9KS5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICBJRDogW3tcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IFtcbiAgICAgICAgICAgICAgW3tcbiAgICAgICAgICAgICAgICB2YWx1ZTogJ3NrZXkxJ1xuICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgdmFsdWU6ICdzdmFsMSdcbiAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIHZhbHVlOiAnc2tleTInXG4gICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogJ3N2YWwyJ1xuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH1dXG4gICAgICAgIH1cbiAgICAgIH0pKVxuICAgICAgYnIuX2NhcGFiaWxpdHkgPSBbJ0lEJ11cblxuICAgICAgcmV0dXJuIGJyLnVwZGF0ZUlkKHtcbiAgICAgICAgY2tleTE6ICdjdmFsMScsXG4gICAgICAgIGNrZXkyOiAnY3ZhbDInXG4gICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KGJyLnNlcnZlcklkKS50by5kZWVwLmVxdWFsKHtcbiAgICAgICAgICBza2V5MTogJ3N2YWwxJyxcbiAgICAgICAgICBza2V5MjogJ3N2YWwyJ1xuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCcjbGlzdE1haWxib3hlcycsICgpID0+IHtcbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIHNpbm9uLnN0dWIoYnIsICdleGVjJylcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBjYWxsIExJU1QgYW5kIExTVUIgaW4gc2VxdWVuY2UnLCAoKSA9PiB7XG4gICAgICBici5leGVjLndpdGhBcmdzKHtcbiAgICAgICAgY29tbWFuZDogJ0xJU1QnLFxuICAgICAgICBhdHRyaWJ1dGVzOiBbJycsICcqJ11cbiAgICAgIH0pLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgIExJU1Q6IFtmYWxzZV1cbiAgICAgICAgfVxuICAgICAgfSkpXG5cbiAgICAgIGJyLmV4ZWMud2l0aEFyZ3Moe1xuICAgICAgICBjb21tYW5kOiAnTFNVQicsXG4gICAgICAgIGF0dHJpYnV0ZXM6IFsnJywgJyonXVxuICAgICAgfSkucmV0dXJucyhQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgTFNVQjogW2ZhbHNlXVxuICAgICAgICB9XG4gICAgICB9KSlcblxuICAgICAgcmV0dXJuIGJyLmxpc3RNYWlsYm94ZXMoKS50aGVuKCh0cmVlKSA9PiB7XG4gICAgICAgIGV4cGVjdCh0cmVlKS50by5leGlzdFxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBub3QgZGllIG9uIE5JTCBzZXBhcmF0b3JzJywgKCkgPT4ge1xuICAgICAgYnIuZXhlYy53aXRoQXJncyh7XG4gICAgICAgIGNvbW1hbmQ6ICdMSVNUJyxcbiAgICAgICAgYXR0cmlidXRlczogWycnLCAnKiddXG4gICAgICB9KS5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICBMSVNUOiBbXG4gICAgICAgICAgICBwYXJzZXIodG9UeXBlZEFycmF5KCcqIExJU1QgKFxcXFxOb0luZmVyaW9ycykgTklMIFwiSU5CT1hcIicpKVxuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgfSkpXG5cbiAgICAgIGJyLmV4ZWMud2l0aEFyZ3Moe1xuICAgICAgICBjb21tYW5kOiAnTFNVQicsXG4gICAgICAgIGF0dHJpYnV0ZXM6IFsnJywgJyonXVxuICAgICAgfSkucmV0dXJucyhQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgTFNVQjogW1xuICAgICAgICAgICAgcGFyc2VyKHRvVHlwZWRBcnJheSgnKiBMU1VCIChcXFxcTm9JbmZlcmlvcnMpIE5JTCBcIklOQk9YXCInKSlcbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIH0pKVxuXG4gICAgICByZXR1cm4gYnIubGlzdE1haWxib3hlcygpLnRoZW4oKHRyZWUpID0+IHtcbiAgICAgICAgZXhwZWN0KHRyZWUpLnRvLmV4aXN0XG4gICAgICB9KVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJyNjcmVhdGVNYWlsYm94JywgKCkgPT4ge1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgc2lub24uc3R1YihiciwgJ2V4ZWMnKVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIGNhbGwgQ1JFQVRFIHdpdGggYSBzdHJpbmcgcGF5bG9hZCcsICgpID0+IHtcbiAgICAgIC8vIFRoZSBzcGVjIGFsbG93cyB1bnF1b3RlZCBBVE9NLXN0eWxlIHN5bnRheCB0b28sIGJ1dCBmb3JcbiAgICAgIC8vIHNpbXBsaWNpdHkgd2UgYWx3YXlzIGdlbmVyYXRlIGEgc3RyaW5nIGV2ZW4gaWYgaXQgY291bGQgYmVcbiAgICAgIC8vIGV4cHJlc3NlZCBhcyBhbiBhdG9tLlxuICAgICAgYnIuZXhlYy53aXRoQXJncyh7XG4gICAgICAgIGNvbW1hbmQ6ICdDUkVBVEUnLFxuICAgICAgICBhdHRyaWJ1dGVzOiBbJ21haWxib3huYW1lJ11cbiAgICAgIH0pLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKCkpXG5cbiAgICAgIHJldHVybiBici5jcmVhdGVNYWlsYm94KCdtYWlsYm94bmFtZScpLnRoZW4oKCkgPT4ge1xuICAgICAgICBleHBlY3QoYnIuZXhlYy5jYWxsQ291bnQpLnRvLmVxdWFsKDEpXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIGNhbGwgbXV0ZjcgZW5jb2RlIHRoZSBhcmd1bWVudCcsICgpID0+IHtcbiAgICAgIC8vIEZyb20gUkZDIDM1MDFcbiAgICAgIGJyLmV4ZWMud2l0aEFyZ3Moe1xuICAgICAgICBjb21tYW5kOiAnQ1JFQVRFJyxcbiAgICAgICAgYXR0cmlidXRlczogWyd+cGV0ZXIvbWFpbC8mVSxCVEZ3LS8mWmVWbkxJcWUtJ11cbiAgICAgIH0pLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKCkpXG5cbiAgICAgIHJldHVybiBici5jcmVhdGVNYWlsYm94KCd+cGV0ZXIvbWFpbC9cXHU1M2YwXFx1NTMxNy9cXHU2NWU1XFx1NjcyY1xcdThhOWUnKS50aGVuKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KGJyLmV4ZWMuY2FsbENvdW50KS50by5lcXVhbCgxKVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCB0cmVhdCBhbiBBTFJFQURZRVhJU1RTIHJlc3BvbnNlIGFzIHN1Y2Nlc3MnLCAoKSA9PiB7XG4gICAgICB2YXIgZmFrZUVyciA9IHtcbiAgICAgICAgY29kZTogJ0FMUkVBRFlFWElTVFMnXG4gICAgICB9XG4gICAgICBici5leGVjLndpdGhBcmdzKHtcbiAgICAgICAgY29tbWFuZDogJ0NSRUFURScsXG4gICAgICAgIGF0dHJpYnV0ZXM6IFsnbWFpbGJveG5hbWUnXVxuICAgICAgfSkucmV0dXJucyhQcm9taXNlLnJlamVjdChmYWtlRXJyKSlcblxuICAgICAgcmV0dXJuIGJyLmNyZWF0ZU1haWxib3goJ21haWxib3huYW1lJykudGhlbigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChici5leGVjLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICAgIH0pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnI2RlbGV0ZU1haWxib3gnLCAoKSA9PiB7XG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGJyLCAnZXhlYycpXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgY2FsbCBERUxFVEUgd2l0aCBhIHN0cmluZyBwYXlsb2FkJywgKCkgPT4ge1xuICAgICAgYnIuZXhlYy53aXRoQXJncyh7XG4gICAgICAgIGNvbW1hbmQ6ICdERUxFVEUnLFxuICAgICAgICBhdHRyaWJ1dGVzOiBbJ21haWxib3huYW1lJ11cbiAgICAgIH0pLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKCkpXG5cbiAgICAgIHJldHVybiBici5kZWxldGVNYWlsYm94KCdtYWlsYm94bmFtZScpLnRoZW4oKCkgPT4ge1xuICAgICAgICBleHBlY3QoYnIuZXhlYy5jYWxsQ291bnQpLnRvLmVxdWFsKDEpXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIGNhbGwgbXV0ZjcgZW5jb2RlIHRoZSBhcmd1bWVudCcsICgpID0+IHtcbiAgICAgIC8vIEZyb20gUkZDIDM1MDFcbiAgICAgIGJyLmV4ZWMud2l0aEFyZ3Moe1xuICAgICAgICBjb21tYW5kOiAnREVMRVRFJyxcbiAgICAgICAgYXR0cmlidXRlczogWyd+cGV0ZXIvbWFpbC8mVSxCVEZ3LS8mWmVWbkxJcWUtJ11cbiAgICAgIH0pLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKCkpXG5cbiAgICAgIHJldHVybiBici5kZWxldGVNYWlsYm94KCd+cGV0ZXIvbWFpbC9cXHU1M2YwXFx1NTMxNy9cXHU2NWU1XFx1NjcyY1xcdThhOWUnKS50aGVuKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KGJyLmV4ZWMuY2FsbENvdW50KS50by5lcXVhbCgxKVxuICAgICAgfSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlLnNraXAoJyNsaXN0TWVzc2FnZXMnLCAoKSA9PiB7XG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGJyLCAnZXhlYycpXG4gICAgICBzaW5vbi5zdHViKGJyLCAnX2J1aWxkRkVUQ0hDb21tYW5kJylcbiAgICAgIHNpbm9uLnN0dWIoYnIsICdfcGFyc2VGRVRDSCcpXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgY2FsbCBGRVRDSCcsICgpID0+IHtcbiAgICAgIGJyLmV4ZWMucmV0dXJucyhQcm9taXNlLnJlc29sdmUoJ2FiYycpKVxuICAgICAgYnIuX2J1aWxkRkVUQ0hDb21tYW5kLndpdGhBcmdzKFsnMToyJywgWyd1aWQnLCAnZmxhZ3MnXSwge1xuICAgICAgICBieVVpZDogdHJ1ZVxuICAgICAgfV0pLnJldHVybnMoe30pXG5cbiAgICAgIHJldHVybiBici5saXN0TWVzc2FnZXMoJ0lOQk9YJywgJzE6MicsIFsndWlkJywgJ2ZsYWdzJ10sIHtcbiAgICAgICAgYnlVaWQ6IHRydWVcbiAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICBleHBlY3QoYnIuX2J1aWxkRkVUQ0hDb21tYW5kLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICAgICAgZXhwZWN0KGJyLl9wYXJzZUZFVENILndpdGhBcmdzKCdhYmMnKS5jYWxsQ291bnQpLnRvLmVxdWFsKDEpXG4gICAgICB9KVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUuc2tpcCgnI3NlYXJjaCcsICgpID0+IHtcbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIHNpbm9uLnN0dWIoYnIsICdleGVjJylcbiAgICAgIHNpbm9uLnN0dWIoYnIsICdfYnVpbGRTRUFSQ0hDb21tYW5kJylcbiAgICAgIHNpbm9uLnN0dWIoYnIsICdfcGFyc2VTRUFSQ0gnKVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIGNhbGwgU0VBUkNIJywgKCkgPT4ge1xuICAgICAgYnIuZXhlYy5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSgnYWJjJykpXG4gICAgICBici5fYnVpbGRTRUFSQ0hDb21tYW5kLndpdGhBcmdzKHtcbiAgICAgICAgdWlkOiAxXG4gICAgICB9LCB7XG4gICAgICAgIGJ5VWlkOiB0cnVlXG4gICAgICB9KS5yZXR1cm5zKHt9KVxuXG4gICAgICByZXR1cm4gYnIuc2VhcmNoKCdJTkJPWCcsIHtcbiAgICAgICAgdWlkOiAxXG4gICAgICB9LCB7XG4gICAgICAgIGJ5VWlkOiB0cnVlXG4gICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KGJyLl9idWlsZFNFQVJDSENvbW1hbmQuY2FsbENvdW50KS50by5lcXVhbCgxKVxuICAgICAgICBleHBlY3QoYnIuZXhlYy5jYWxsQ291bnQpLnRvLmVxdWFsKDEpXG4gICAgICAgIGV4cGVjdChici5fcGFyc2VTRUFSQ0gud2l0aEFyZ3MoJ2FiYycpLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICAgIH0pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnI3VwbG9hZCcsICgpID0+IHtcbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIHNpbm9uLnN0dWIoYnIsICdleGVjJylcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBjYWxsIEFQUEVORCB3aXRoIGN1c3RvbSBmbGFnJywgKCkgPT4ge1xuICAgICAgYnIuZXhlYy5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSgpKVxuXG4gICAgICByZXR1cm4gYnIudXBsb2FkKCdtYWlsYm94JywgJ3RoaXMgaXMgYSBtZXNzYWdlJywge1xuICAgICAgICBmbGFnczogWydcXFxcJE15RmxhZyddXG4gICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KGJyLmV4ZWMuY2FsbENvdW50KS50by5lcXVhbCgxKVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBjYWxsIEFQUEVORCB3L28gZmxhZ3MnLCAoKSA9PiB7XG4gICAgICBici5leGVjLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKCkpXG5cbiAgICAgIHJldHVybiBici51cGxvYWQoJ21haWxib3gnLCAndGhpcyBpcyBhIG1lc3NhZ2UnKS50aGVuKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KGJyLmV4ZWMuY2FsbENvdW50KS50by5lcXVhbCgxKVxuICAgICAgfSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlLnNraXAoJyNzZXRGbGFncycsICgpID0+IHtcbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIHNpbm9uLnN0dWIoYnIsICdleGVjJylcbiAgICAgIHNpbm9uLnN0dWIoYnIsICdfYnVpbGRTVE9SRUNvbW1hbmQnKVxuICAgICAgc2lub24uc3R1YihiciwgJ19wYXJzZUZFVENIJylcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBjYWxsIFNUT1JFJywgKCkgPT4ge1xuICAgICAgYnIuZXhlYy5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSgnYWJjJykpXG4gICAgICBici5fYnVpbGRTVE9SRUNvbW1hbmQud2l0aEFyZ3MoJzE6MicsICdGTEFHUycsIFsnXFxcXFNlZW4nLCAnJE15RmxhZyddLCB7XG4gICAgICAgIGJ5VWlkOiB0cnVlXG4gICAgICB9KS5yZXR1cm5zKHt9KVxuXG4gICAgICByZXR1cm4gYnIuc2V0RmxhZ3MoJ0lOQk9YJywgJzE6MicsIFsnXFxcXFNlZW4nLCAnJE15RmxhZyddLCB7XG4gICAgICAgIGJ5VWlkOiB0cnVlXG4gICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KGJyLmV4ZWMuY2FsbENvdW50KS50by5lcXVhbCgxKVxuICAgICAgICBleHBlY3QoYnIuX3BhcnNlRkVUQ0gud2l0aEFyZ3MoJ2FiYycpLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICAgIH0pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZS5za2lwKCcjc3RvcmUnLCAoKSA9PiB7XG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGJyLCAnZXhlYycpXG4gICAgICBzaW5vbi5zdHViKGJyLCAnX2J1aWxkU1RPUkVDb21tYW5kJylcbiAgICAgIHNpbm9uLnN0dWIoYnIsICdfcGFyc2VGRVRDSCcpXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgY2FsbCBTVE9SRScsICgpID0+IHtcbiAgICAgIGJyLmV4ZWMucmV0dXJucyhQcm9taXNlLnJlc29sdmUoJ2FiYycpKVxuICAgICAgYnIuX2J1aWxkU1RPUkVDb21tYW5kLndpdGhBcmdzKCcxOjInLCAnK1gtR00tTEFCRUxTJywgWydcXFxcU2VudCcsICdcXFxcSnVuayddLCB7XG4gICAgICAgIGJ5VWlkOiB0cnVlXG4gICAgICB9KS5yZXR1cm5zKHt9KVxuXG4gICAgICByZXR1cm4gYnIuc3RvcmUoJ0lOQk9YJywgJzE6MicsICcrWC1HTS1MQUJFTFMnLCBbJ1xcXFxTZW50JywgJ1xcXFxKdW5rJ10sIHtcbiAgICAgICAgYnlVaWQ6IHRydWVcbiAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICBleHBlY3QoYnIuX2J1aWxkU1RPUkVDb21tYW5kLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICAgICAgZXhwZWN0KGJyLmV4ZWMuY2FsbENvdW50KS50by5lcXVhbCgxKVxuICAgICAgICBleHBlY3QoYnIuX3BhcnNlRkVUQ0gud2l0aEFyZ3MoJ2FiYycpLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICAgIH0pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnI2RlbGV0ZU1lc3NhZ2VzJywgKCkgPT4ge1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgc2lub24uc3R1YihiciwgJ3NldEZsYWdzJylcbiAgICAgIHNpbm9uLnN0dWIoYnIsICdleGVjJylcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBjYWxsIFVJRCBFWFBVTkdFJywgKCkgPT4ge1xuICAgICAgYnIuZXhlYy53aXRoQXJncyh7XG4gICAgICAgIGNvbW1hbmQ6ICdVSUQgRVhQVU5HRScsXG4gICAgICAgIGF0dHJpYnV0ZXM6IFt7XG4gICAgICAgICAgdHlwZTogJ3NlcXVlbmNlJyxcbiAgICAgICAgICB2YWx1ZTogJzE6MidcbiAgICAgICAgfV1cbiAgICAgIH0pLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKCdhYmMnKSlcbiAgICAgIGJyLnNldEZsYWdzLndpdGhBcmdzKCdJTkJPWCcsICcxOjInLCB7XG4gICAgICAgIGFkZDogJ1xcXFxEZWxldGVkJ1xuICAgICAgfSkucmV0dXJucyhQcm9taXNlLnJlc29sdmUoKSlcblxuICAgICAgYnIuX2NhcGFiaWxpdHkgPSBbJ1VJRFBMVVMnXVxuICAgICAgcmV0dXJuIGJyLmRlbGV0ZU1lc3NhZ2VzKCdJTkJPWCcsICcxOjInLCB7XG4gICAgICAgIGJ5VWlkOiB0cnVlXG4gICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KGJyLmV4ZWMuY2FsbENvdW50KS50by5lcXVhbCgxKVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBjYWxsIEVYUFVOR0UnLCAoKSA9PiB7XG4gICAgICBici5leGVjLndpdGhBcmdzKCdFWFBVTkdFJykucmV0dXJucyhQcm9taXNlLnJlc29sdmUoJ2FiYycpKVxuICAgICAgYnIuc2V0RmxhZ3Mud2l0aEFyZ3MoJ0lOQk9YJywgJzE6MicsIHtcbiAgICAgICAgYWRkOiAnXFxcXERlbGV0ZWQnXG4gICAgICB9KS5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSgpKVxuXG4gICAgICBici5fY2FwYWJpbGl0eSA9IFtdXG4gICAgICByZXR1cm4gYnIuZGVsZXRlTWVzc2FnZXMoJ0lOQk9YJywgJzE6MicsIHtcbiAgICAgICAgYnlVaWQ6IHRydWVcbiAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICBleHBlY3QoYnIuZXhlYy5jYWxsQ291bnQpLnRvLmVxdWFsKDEpXG4gICAgICB9KVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJyNjb3B5TWVzc2FnZXMnLCAoKSA9PiB7XG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGJyLCAnZXhlYycpXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgY2FsbCBDT1BZJywgKCkgPT4ge1xuICAgICAgYnIuZXhlYy53aXRoQXJncyh7XG4gICAgICAgIGNvbW1hbmQ6ICdVSUQgQ09QWScsXG4gICAgICAgIGF0dHJpYnV0ZXM6IFt7XG4gICAgICAgICAgdHlwZTogJ3NlcXVlbmNlJyxcbiAgICAgICAgICB2YWx1ZTogJzE6MidcbiAgICAgICAgfSwge1xuICAgICAgICAgIHR5cGU6ICdhdG9tJyxcbiAgICAgICAgICB2YWx1ZTogJ1tHbWFpbF0vVHJhc2gnXG4gICAgICAgIH1dXG4gICAgICB9KS5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgIGNvcHl1aWQ6IFsnMScsICcxOjInLCAnNCwzJ11cbiAgICAgIH0pKVxuXG4gICAgICByZXR1cm4gYnIuY29weU1lc3NhZ2VzKCdJTkJPWCcsICcxOjInLCAnW0dtYWlsXS9UcmFzaCcsIHtcbiAgICAgICAgYnlVaWQ6IHRydWVcbiAgICAgIH0pLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGV4cGVjdChyZXNwb25zZSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICAgICAgc3JjU2VxU2V0OiAnMToyJyxcbiAgICAgICAgICBkZXN0U2VxU2V0OiAnNCwzJ1xuICAgICAgICB9KVxuICAgICAgICBleHBlY3QoYnIuZXhlYy5jYWxsQ291bnQpLnRvLmVxdWFsKDEpXG4gICAgICB9KVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJyNtb3ZlTWVzc2FnZXMnLCAoKSA9PiB7XG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGJyLCAnZXhlYycpXG4gICAgICBzaW5vbi5zdHViKGJyLCAnY29weU1lc3NhZ2VzJylcbiAgICAgIHNpbm9uLnN0dWIoYnIsICdkZWxldGVNZXNzYWdlcycpXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgY2FsbCBNT1ZFIGlmIHN1cHBvcnRlZCcsICgpID0+IHtcbiAgICAgIGJyLmV4ZWMud2l0aEFyZ3Moe1xuICAgICAgICBjb21tYW5kOiAnVUlEIE1PVkUnLFxuICAgICAgICBhdHRyaWJ1dGVzOiBbe1xuICAgICAgICAgIHR5cGU6ICdzZXF1ZW5jZScsXG4gICAgICAgICAgdmFsdWU6ICcxOjInXG4gICAgICAgIH0sIHtcbiAgICAgICAgICB0eXBlOiAnYXRvbScsXG4gICAgICAgICAgdmFsdWU6ICdbR21haWxdL1RyYXNoJ1xuICAgICAgICB9XVxuICAgICAgfSwgWydPSyddKS5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSgnYWJjJykpXG5cbiAgICAgIGJyLl9jYXBhYmlsaXR5ID0gWydNT1ZFJ11cbiAgICAgIHJldHVybiBici5tb3ZlTWVzc2FnZXMoJ0lOQk9YJywgJzE6MicsICdbR21haWxdL1RyYXNoJywge1xuICAgICAgICBieVVpZDogdHJ1ZVxuICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChici5leGVjLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgZmFsbGJhY2sgdG8gY29weStleHB1bmdlJywgKCkgPT4ge1xuICAgICAgYnIuY29weU1lc3NhZ2VzLndpdGhBcmdzKCdJTkJPWCcsICcxOjInLCAnW0dtYWlsXS9UcmFzaCcsIHtcbiAgICAgICAgYnlVaWQ6IHRydWVcbiAgICAgIH0pLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKCkpXG4gICAgICBici5kZWxldGVNZXNzYWdlcy53aXRoQXJncygnMToyJywge1xuICAgICAgICBieVVpZDogdHJ1ZVxuICAgICAgfSkucmV0dXJucyhQcm9taXNlLnJlc29sdmUoKSlcblxuICAgICAgYnIuX2NhcGFiaWxpdHkgPSBbXVxuICAgICAgcmV0dXJuIGJyLm1vdmVNZXNzYWdlcygnSU5CT1gnLCAnMToyJywgJ1tHbWFpbF0vVHJhc2gnLCB7XG4gICAgICAgIGJ5VWlkOiB0cnVlXG4gICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KGJyLmRlbGV0ZU1lc3NhZ2VzLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICAgIH0pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnI19zaG91bGRTZWxlY3RNYWlsYm94JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBjdHggaXMgdW5kZWZpbmVkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGJyLl9zaG91bGRTZWxlY3RNYWlsYm94KCdwYXRoJykpLnRvLmJlLnRydWVcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIGEgZGlmZmVyZW50IHBhdGggaXMgcXVldWVkJywgKCkgPT4ge1xuICAgICAgc2lub24uc3R1Yihici5jbGllbnQsICdnZXRQcmV2aW91c2x5UXVldWVkJykucmV0dXJucyh7XG4gICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICBjb21tYW5kOiAnU0VMRUNUJyxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBbe1xuICAgICAgICAgICAgdHlwZTogJ1NUUklORycsXG4gICAgICAgICAgICB2YWx1ZTogJ3F1ZXVlZCBwYXRoJ1xuICAgICAgICAgIH1dXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIGV4cGVjdChici5fc2hvdWxkU2VsZWN0TWFpbGJveCgncGF0aCcsIHt9KSkudG8uYmUudHJ1ZVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIHRoZSBzYW1lIHBhdGggaXMgcXVldWVkJywgKCkgPT4ge1xuICAgICAgc2lub24uc3R1Yihici5jbGllbnQsICdnZXRQcmV2aW91c2x5UXVldWVkJykucmV0dXJucyh7XG4gICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICBjb21tYW5kOiAnU0VMRUNUJyxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBbe1xuICAgICAgICAgICAgdHlwZTogJ1NUUklORycsXG4gICAgICAgICAgICB2YWx1ZTogJ3F1ZXVlZCBwYXRoJ1xuICAgICAgICAgIH1dXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIGV4cGVjdChici5fc2hvdWxkU2VsZWN0TWFpbGJveCgncXVldWVkIHBhdGgnLCB7fSkpLnRvLmJlLmZhbHNlXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnI3NlbGVjdE1haWxib3gnLCAoKSA9PiB7XG4gICAgY29uc3QgcGF0aCA9ICdbR21haWxdL1RyYXNoJ1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgc2lub24uc3R1YihiciwgJ2V4ZWMnKVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIHJ1biBTRUxFQ1QnLCAoKSA9PiB7XG4gICAgICBici5leGVjLndpdGhBcmdzKHtcbiAgICAgICAgY29tbWFuZDogJ1NFTEVDVCcsXG4gICAgICAgIGF0dHJpYnV0ZXM6IFt7XG4gICAgICAgICAgdHlwZTogJ1NUUklORycsXG4gICAgICAgICAgdmFsdWU6IHBhdGhcbiAgICAgICAgfV1cbiAgICAgIH0pLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgY29kZTogJ1JFQUQtV1JJVEUnXG4gICAgICB9KSlcblxuICAgICAgcmV0dXJuIGJyLnNlbGVjdE1haWxib3gocGF0aCkudGhlbigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChici5leGVjLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICAgICAgZXhwZWN0KGJyLl9zdGF0ZSkudG8uZXF1YWwoU1RBVEVfU0VMRUNURUQpXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIHJ1biBTRUxFQ1Qgd2l0aCBDT05EU1RPUkUnLCAoKSA9PiB7XG4gICAgICBici5leGVjLndpdGhBcmdzKHtcbiAgICAgICAgY29tbWFuZDogJ1NFTEVDVCcsXG4gICAgICAgIGF0dHJpYnV0ZXM6IFt7XG4gICAgICAgICAgdHlwZTogJ1NUUklORycsXG4gICAgICAgICAgdmFsdWU6IHBhdGhcbiAgICAgICAgfSxcbiAgICAgICAgW3tcbiAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgdmFsdWU6ICdDT05EU1RPUkUnXG4gICAgICAgIH1dXG4gICAgICAgIF1cbiAgICAgIH0pLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgY29kZTogJ1JFQUQtV1JJVEUnXG4gICAgICB9KSlcblxuICAgICAgYnIuX2NhcGFiaWxpdHkgPSBbJ0NPTkRTVE9SRSddXG4gICAgICByZXR1cm4gYnIuc2VsZWN0TWFpbGJveChwYXRoLCB7XG4gICAgICAgIGNvbmRzdG9yZTogdHJ1ZVxuICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChici5leGVjLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICAgICAgZXhwZWN0KGJyLl9zdGF0ZSkudG8uZXF1YWwoU1RBVEVfU0VMRUNURUQpXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnc2hvdWxkIGVtaXQgb25zZWxlY3RtYWlsYm94IGJlZm9yZSBzZWxlY3RNYWlsYm94IGlzIHJlc29sdmVkJywgKCkgPT4ge1xuICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIGJyLmV4ZWMucmV0dXJucyhQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICAgIGNvZGU6ICdSRUFELVdSSVRFJ1xuICAgICAgICB9KSlcbiAgICAgIH0pXG5cbiAgICAgIGl0KCd3aGVuIGl0IHJldHVybnMgYSBwcm9taXNlJywgKCkgPT4ge1xuICAgICAgICB2YXIgcHJvbWlzZVJlc29sdmVkID0gZmFsc2VcbiAgICAgICAgYnIub25zZWxlY3RtYWlsYm94ID0gKCkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICByZXNvbHZlKClcbiAgICAgICAgICBwcm9taXNlUmVzb2x2ZWQgPSB0cnVlXG4gICAgICAgIH0pXG4gICAgICAgIHZhciBvbnNlbGVjdG1haWxib3hTcHkgPSBzaW5vbi5zcHkoYnIsICdvbnNlbGVjdG1haWxib3gnKVxuICAgICAgICByZXR1cm4gYnIuc2VsZWN0TWFpbGJveChwYXRoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICBleHBlY3Qob25zZWxlY3RtYWlsYm94U3B5LndpdGhBcmdzKHBhdGgpLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICAgICAgICBleHBlY3QocHJvbWlzZVJlc29sdmVkKS50by5lcXVhbCh0cnVlKVxuICAgICAgICB9KVxuICAgICAgfSlcblxuICAgICAgaXQoJ3doZW4gaXQgZG9lcyBub3QgcmV0dXJuIGEgcHJvbWlzZScsICgpID0+IHtcbiAgICAgICAgYnIub25zZWxlY3RtYWlsYm94ID0gKCkgPT4geyB9XG4gICAgICAgIHZhciBvbnNlbGVjdG1haWxib3hTcHkgPSBzaW5vbi5zcHkoYnIsICdvbnNlbGVjdG1haWxib3gnKVxuICAgICAgICByZXR1cm4gYnIuc2VsZWN0TWFpbGJveChwYXRoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICBleHBlY3Qob25zZWxlY3RtYWlsYm94U3B5LndpdGhBcmdzKHBhdGgpLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgZW1pdCBvbmNsb3NlbWFpbGJveCcsICgpID0+IHtcbiAgICAgIGxldCBjYWxsZWQgPSBmYWxzZVxuICAgICAgYnIuZXhlYy5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSgnYWJjJykpLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgY29kZTogJ1JFQUQtV1JJVEUnXG4gICAgICB9KSlcblxuICAgICAgYnIub25jbG9zZW1haWxib3ggPSAocGF0aCkgPT4ge1xuICAgICAgICBleHBlY3QocGF0aCkudG8uZXF1YWwoJ3l5eScpXG4gICAgICAgIGNhbGxlZCA9IHRydWVcbiAgICAgIH1cblxuICAgICAgYnIuX3NlbGVjdGVkTWFpbGJveCA9ICd5eXknXG4gICAgICByZXR1cm4gYnIuc2VsZWN0TWFpbGJveChwYXRoKS50aGVuKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KGNhbGxlZCkudG8uYmUudHJ1ZVxuICAgICAgfSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCcjaGFzQ2FwYWJpbGl0eScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGRldGVjdCBleGlzdGluZyBjYXBhYmlsaXR5JywgKCkgPT4ge1xuICAgICAgYnIuX2NhcGFiaWxpdHkgPSBbJ1paWiddXG4gICAgICBleHBlY3QoYnIuaGFzQ2FwYWJpbGl0eSgnenp6JykpLnRvLmJlLnRydWVcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBkZXRlY3Qgbm9uIGV4aXN0aW5nIGNhcGFiaWxpdHknLCAoKSA9PiB7XG4gICAgICBici5fY2FwYWJpbGl0eSA9IFsnWlpaJ11cbiAgICAgIGV4cGVjdChici5oYXNDYXBhYmlsaXR5KCdvb28nKSkudG8uYmUuZmFsc2VcbiAgICAgIGV4cGVjdChici5oYXNDYXBhYmlsaXR5KCkpLnRvLmJlLmZhbHNlXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnI191bnRhZ2dlZE9rSGFuZGxlcicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHVwZGF0ZSBjYXBhYmlsaXR5IGlmIHByZXNlbnQnLCAoKSA9PiB7XG4gICAgICBici5fdW50YWdnZWRPa0hhbmRsZXIoe1xuICAgICAgICBjYXBhYmlsaXR5OiBbJ2FiYyddXG4gICAgICB9LCAoKSA9PiB7IH0pXG4gICAgICBleHBlY3QoYnIuX2NhcGFiaWxpdHkpLnRvLmRlZXAuZXF1YWwoWydhYmMnXSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCcjX3VudGFnZ2VkQ2FwYWJpbGl0eUhhbmRsZXInLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB1cGRhdGUgY2FwYWJpbGl0eScsICgpID0+IHtcbiAgICAgIGJyLl91bnRhZ2dlZENhcGFiaWxpdHlIYW5kbGVyKHtcbiAgICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgICB2YWx1ZTogJ2FiYydcbiAgICAgICAgfV1cbiAgICAgIH0sICgpID0+IHsgfSlcbiAgICAgIGV4cGVjdChici5fY2FwYWJpbGl0eSkudG8uZGVlcC5lcXVhbChbJ0FCQyddKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJyNfdW50YWdnZWRFeGlzdHNIYW5kbGVyJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZW1pdCBvbnVwZGF0ZScsICgpID0+IHtcbiAgICAgIGJyLm9udXBkYXRlID0gc2lub24uc3R1YigpXG4gICAgICBici5fc2VsZWN0ZWRNYWlsYm94ID0gJ0ZPTydcblxuICAgICAgYnIuX3VudGFnZ2VkRXhpc3RzSGFuZGxlcih7XG4gICAgICAgIG5yOiAxMjNcbiAgICAgIH0sICgpID0+IHsgfSlcbiAgICAgIGV4cGVjdChici5vbnVwZGF0ZS53aXRoQXJncygnRk9PJywgJ2V4aXN0cycsIDEyMykuY2FsbENvdW50KS50by5lcXVhbCgxKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJyNfdW50YWdnZWRFeHB1bmdlSGFuZGxlcicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGVtaXQgb251cGRhdGUnLCAoKSA9PiB7XG4gICAgICBici5vbnVwZGF0ZSA9IHNpbm9uLnN0dWIoKVxuICAgICAgYnIuX3NlbGVjdGVkTWFpbGJveCA9ICdGT08nXG5cbiAgICAgIGJyLl91bnRhZ2dlZEV4cHVuZ2VIYW5kbGVyKHtcbiAgICAgICAgbnI6IDEyM1xuICAgICAgfSwgKCkgPT4geyB9KVxuICAgICAgZXhwZWN0KGJyLm9udXBkYXRlLndpdGhBcmdzKCdGT08nLCAnZXhwdW5nZScsIDEyMykuY2FsbENvdW50KS50by5lcXVhbCgxKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUuc2tpcCgnI191bnRhZ2dlZEZldGNoSGFuZGxlcicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGVtaXQgb251cGRhdGUnLCAoKSA9PiB7XG4gICAgICBici5vbnVwZGF0ZSA9IHNpbm9uLnN0dWIoKVxuICAgICAgc2lub24uc3R1YihiciwgJ19wYXJzZUZFVENIJykucmV0dXJucygnYWJjJylcbiAgICAgIGJyLl9zZWxlY3RlZE1haWxib3ggPSAnRk9PJ1xuXG4gICAgICBici5fdW50YWdnZWRGZXRjaEhhbmRsZXIoe1xuICAgICAgICBucjogMTIzXG4gICAgICB9LCAoKSA9PiB7IH0pXG4gICAgICBleHBlY3QoYnIub251cGRhdGUud2l0aEFyZ3MoJ0ZPTycsICdmZXRjaCcsICdhYmMnKS5jYWxsQ291bnQpLnRvLmVxdWFsKDEpXG4gICAgICBleHBlY3QoYnIuX3BhcnNlRkVUQ0guYXJnc1swXVswXSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICBGRVRDSDogW3tcbiAgICAgICAgICAgIG5yOiAxMjNcbiAgICAgICAgICB9XVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJyNfY2hhbmdlU3RhdGUnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBzZXQgdGhlIHN0YXRlIHZhbHVlJywgKCkgPT4ge1xuICAgICAgYnIuX2NoYW5nZVN0YXRlKDEyMzQ1KVxuXG4gICAgICBleHBlY3QoYnIuX3N0YXRlKS50by5lcXVhbCgxMjM0NSlcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBlbWl0IG9uY2xvc2VtYWlsYm94IGlmIG1haWxib3ggd2FzIGNsb3NlZCcsICgpID0+IHtcbiAgICAgIGJyLm9uY2xvc2VtYWlsYm94ID0gc2lub24uc3R1YigpXG4gICAgICBici5fc3RhdGUgPSBTVEFURV9TRUxFQ1RFRFxuICAgICAgYnIuX3NlbGVjdGVkTWFpbGJveCA9ICdhYWEnXG5cbiAgICAgIGJyLl9jaGFuZ2VTdGF0ZSgxMjM0NSlcblxuICAgICAgZXhwZWN0KGJyLl9zZWxlY3RlZE1haWxib3gpLnRvLmJlLmZhbHNlXG4gICAgICBleHBlY3QoYnIub25jbG9zZW1haWxib3gud2l0aEFyZ3MoJ2FhYScpLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCcjX2Vuc3VyZVBhdGgnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBjcmVhdGUgdGhlIHBhdGggaWYgbm90IHByZXNlbnQnLCAoKSA9PiB7XG4gICAgICB2YXIgdHJlZSA9IHtcbiAgICAgICAgY2hpbGRyZW46IFtdXG4gICAgICB9XG4gICAgICBleHBlY3QoYnIuX2Vuc3VyZVBhdGgodHJlZSwgJ2hlbGxvL3dvcmxkJywgJy8nKSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICAgIG5hbWU6ICd3b3JsZCcsXG4gICAgICAgIGRlbGltaXRlcjogJy8nLFxuICAgICAgICBwYXRoOiAnaGVsbG8vd29ybGQnLFxuICAgICAgICBjaGlsZHJlbjogW11cbiAgICAgIH0pXG4gICAgICBleHBlY3QodHJlZSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICAgIGNoaWxkcmVuOiBbe1xuICAgICAgICAgIG5hbWU6ICdoZWxsbycsXG4gICAgICAgICAgZGVsaW1pdGVyOiAnLycsXG4gICAgICAgICAgcGF0aDogJ2hlbGxvJyxcbiAgICAgICAgICBjaGlsZHJlbjogW3tcbiAgICAgICAgICAgIG5hbWU6ICd3b3JsZCcsXG4gICAgICAgICAgICBkZWxpbWl0ZXI6ICcvJyxcbiAgICAgICAgICAgIHBhdGg6ICdoZWxsby93b3JsZCcsXG4gICAgICAgICAgICBjaGlsZHJlbjogW11cbiAgICAgICAgICB9XVxuICAgICAgICB9XVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZXhpc3RpbmcgcGF0aCBpZiBwb3NzaWJsZScsICgpID0+IHtcbiAgICAgIHZhciB0cmVlID0ge1xuICAgICAgICBjaGlsZHJlbjogW3tcbiAgICAgICAgICBuYW1lOiAnaGVsbG8nLFxuICAgICAgICAgIGRlbGltaXRlcjogJy8nLFxuICAgICAgICAgIHBhdGg6ICdoZWxsbycsXG4gICAgICAgICAgY2hpbGRyZW46IFt7XG4gICAgICAgICAgICBuYW1lOiAnd29ybGQnLFxuICAgICAgICAgICAgZGVsaW1pdGVyOiAnLycsXG4gICAgICAgICAgICBwYXRoOiAnaGVsbG8vd29ybGQnLFxuICAgICAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAgICAgYWJjOiAxMjNcbiAgICAgICAgICB9XVxuICAgICAgICB9XVxuICAgICAgfVxuICAgICAgZXhwZWN0KGJyLl9lbnN1cmVQYXRoKHRyZWUsICdoZWxsby93b3JsZCcsICcvJykpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgICBuYW1lOiAnd29ybGQnLFxuICAgICAgICBkZWxpbWl0ZXI6ICcvJyxcbiAgICAgICAgcGF0aDogJ2hlbGxvL3dvcmxkJyxcbiAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICBhYmM6IDEyM1xuICAgICAgfSlcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgY2FzZSBpbnNlbnNpdGl2ZSBJbmJveCcsICgpID0+IHtcbiAgICAgIHZhciB0cmVlID0ge1xuICAgICAgICBjaGlsZHJlbjogW11cbiAgICAgIH1cbiAgICAgIGV4cGVjdChici5fZW5zdXJlUGF0aCh0cmVlLCAnSW5ib3gvd29ybGQnLCAnLycpKS50by5kZWVwLmVxdWFsKHtcbiAgICAgICAgbmFtZTogJ3dvcmxkJyxcbiAgICAgICAgZGVsaW1pdGVyOiAnLycsXG4gICAgICAgIHBhdGg6ICdJbmJveC93b3JsZCcsXG4gICAgICAgIGNoaWxkcmVuOiBbXVxuICAgICAgfSlcbiAgICAgIGV4cGVjdChici5fZW5zdXJlUGF0aCh0cmVlLCAnSU5CT1gvd29ybGRzJywgJy8nKSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICAgIG5hbWU6ICd3b3JsZHMnLFxuICAgICAgICBkZWxpbWl0ZXI6ICcvJyxcbiAgICAgICAgcGF0aDogJ0lOQk9YL3dvcmxkcycsXG4gICAgICAgIGNoaWxkcmVuOiBbXVxuICAgICAgfSlcblxuICAgICAgZXhwZWN0KHRyZWUpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgICBjaGlsZHJlbjogW3tcbiAgICAgICAgICBuYW1lOiAnSW5ib3gnLFxuICAgICAgICAgIGRlbGltaXRlcjogJy8nLFxuICAgICAgICAgIHBhdGg6ICdJbmJveCcsXG4gICAgICAgICAgY2hpbGRyZW46IFt7XG4gICAgICAgICAgICBuYW1lOiAnd29ybGQnLFxuICAgICAgICAgICAgZGVsaW1pdGVyOiAnLycsXG4gICAgICAgICAgICBwYXRoOiAnSW5ib3gvd29ybGQnLFxuICAgICAgICAgICAgY2hpbGRyZW46IFtdXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgbmFtZTogJ3dvcmxkcycsXG4gICAgICAgICAgICBkZWxpbWl0ZXI6ICcvJyxcbiAgICAgICAgICAgIHBhdGg6ICdJTkJPWC93b3JsZHMnLFxuICAgICAgICAgICAgY2hpbGRyZW46IFtdXG4gICAgICAgICAgfV1cbiAgICAgICAgfV1cbiAgICAgIH0pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgndW50YWdnZWQgdXBkYXRlcycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJlY2VpdmUgaW5mb3JtYXRpb24gYWJvdXQgdW50YWdnZWQgZXhpc3RzJywgKGRvbmUpID0+IHtcbiAgICAgIGJyLmNsaWVudC5fY29ubmVjdGlvblJlYWR5ID0gdHJ1ZVxuICAgICAgYnIuX3NlbGVjdGVkTWFpbGJveCA9ICdGT08nXG4gICAgICBici5vbnVwZGF0ZSA9IChwYXRoLCB0eXBlLCB2YWx1ZSkgPT4ge1xuICAgICAgICBleHBlY3QocGF0aCkudG8uZXF1YWwoJ0ZPTycpXG4gICAgICAgIGV4cGVjdCh0eXBlKS50by5lcXVhbCgnZXhpc3RzJylcbiAgICAgICAgZXhwZWN0KHZhbHVlKS50by5lcXVhbCgxMjMpXG4gICAgICAgIGRvbmUoKVxuICAgICAgfVxuICAgICAgYnIuY2xpZW50Ll9vbkRhdGEoe1xuICAgICAgICAvKiAqIDEyMyBFWElTVFNcXHJcXG4gKi9cbiAgICAgICAgZGF0YTogbmV3IFVpbnQ4QXJyYXkoWzQyLCAzMiwgNDksIDUwLCA1MSwgMzIsIDY5LCA4OCwgNzMsIDgzLCA4NCwgODMsIDEzLCAxMF0pLmJ1ZmZlclxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCByZWNlaXZlIGluZm9ybWF0aW9uIGFib3V0IHVudGFnZ2VkIGV4cHVuZ2UnLCAoZG9uZSkgPT4ge1xuICAgICAgYnIuY2xpZW50Ll9jb25uZWN0aW9uUmVhZHkgPSB0cnVlXG4gICAgICBici5fc2VsZWN0ZWRNYWlsYm94ID0gJ0ZPTydcbiAgICAgIGJyLm9udXBkYXRlID0gKHBhdGgsIHR5cGUsIHZhbHVlKSA9PiB7XG4gICAgICAgIGV4cGVjdChwYXRoKS50by5lcXVhbCgnRk9PJylcbiAgICAgICAgZXhwZWN0KHR5cGUpLnRvLmVxdWFsKCdleHB1bmdlJylcbiAgICAgICAgZXhwZWN0KHZhbHVlKS50by5lcXVhbCg0NTYpXG4gICAgICAgIGRvbmUoKVxuICAgICAgfVxuICAgICAgYnIuY2xpZW50Ll9vbkRhdGEoe1xuICAgICAgICAvKiAqIDQ1NiBFWFBVTkdFXFxyXFxuICovXG4gICAgICAgIGRhdGE6IG5ldyBVaW50OEFycmF5KFs0MiwgMzIsIDUyLCA1MywgNTQsIDMyLCA2OSwgODgsIDgwLCA4NSwgNzgsIDcxLCA2OSwgMTMsIDEwXSkuYnVmZmVyXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIHJlY2VpdmUgaW5mb3JtYXRpb24gYWJvdXQgdW50YWdnZWQgZmV0Y2gnLCAoZG9uZSkgPT4ge1xuICAgICAgYnIuY2xpZW50Ll9jb25uZWN0aW9uUmVhZHkgPSB0cnVlXG4gICAgICBici5fc2VsZWN0ZWRNYWlsYm94ID0gJ0ZPTydcbiAgICAgIGJyLm9udXBkYXRlID0gKHBhdGgsIHR5cGUsIHZhbHVlKSA9PiB7XG4gICAgICAgIGV4cGVjdChwYXRoKS50by5lcXVhbCgnRk9PJylcbiAgICAgICAgZXhwZWN0KHR5cGUpLnRvLmVxdWFsKCdmZXRjaCcpXG4gICAgICAgIGV4cGVjdCh2YWx1ZSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICAgICAgJyMnOiAxMjMsXG4gICAgICAgICAgZmxhZ3M6IFsnXFxcXFNlZW4nXSxcbiAgICAgICAgICBtb2RzZXE6ICc0J1xuICAgICAgICB9KVxuICAgICAgICBkb25lKClcbiAgICAgIH1cbiAgICAgIGJyLmNsaWVudC5fb25EYXRhKHtcbiAgICAgICAgLyogKiAxMjMgRkVUQ0ggKEZMQUdTIChcXFxcU2VlbikgTU9EU0VRICg0KSlcXHJcXG4gKi9cbiAgICAgICAgZGF0YTogbmV3IFVpbnQ4QXJyYXkoWzQyLCAzMiwgNDksIDUwLCA1MSwgMzIsIDcwLCA2OSwgODQsIDY3LCA3MiwgMzIsIDQwLCA3MCwgNzYsIDY1LCA3MSwgODMsIDMyLCA0MCwgOTIsIDgzLCAxMDEsIDEwMSwgMTEwLCA0MSwgMzIsIDc3LCA3OSwgNjgsIDgzLCA2OSwgODEsIDMyLCA0MCwgNTIsIDQxLCA0MSwgMTMsIDEwXSkuYnVmZmVyXG4gICAgICB9KVxuICAgIH0pXG4gIH0pXG59KVxuIl19 \ No newline at end of file diff --git a/dist/command-builder-unit.js b/dist/command-builder-unit.js new file mode 100644 index 0000000..f3a9a1a --- /dev/null +++ b/dist/command-builder-unit.js @@ -0,0 +1,369 @@ +"use strict"; + +var _commandBuilder = require("./command-builder"); + +describe('buildFETCHCommand', () => { + it('should build single ALL', () => { + expect((0, _commandBuilder.buildFETCHCommand)('1:*', ['all'], {})).to.deep.equal({ + command: 'FETCH', + attributes: [{ + type: 'SEQUENCE', + value: '1:*' + }, { + type: 'ATOM', + value: 'ALL' + }] + }); + }); + it('should build FETCH with uid', () => { + expect((0, _commandBuilder.buildFETCHCommand)('1:*', ['all'], { + byUid: true + })).to.deep.equal({ + command: 'UID FETCH', + attributes: [{ + type: 'SEQUENCE', + value: '1:*' + }, { + type: 'ATOM', + value: 'ALL' + }] + }); + }); + it('should build FETCH with uid, envelope', () => { + expect((0, _commandBuilder.buildFETCHCommand)('1:*', ['uid', 'envelope'], {})).to.deep.equal({ + command: 'FETCH', + attributes: [{ + type: 'SEQUENCE', + value: '1:*' + }, [{ + type: 'ATOM', + value: 'UID' + }, { + type: 'ATOM', + value: 'ENVELOPE' + }]] + }); + }); + it('should build FETCH with modseq', () => { + expect((0, _commandBuilder.buildFETCHCommand)('1:*', ['modseq (1234567)'], {})).to.deep.equal({ + command: 'FETCH', + attributes: [{ + type: 'SEQUENCE', + value: '1:*' + }, [{ + type: 'ATOM', + value: 'MODSEQ' + }, [{ + type: 'ATOM', + value: '1234567' + }]]] + }); + }); + it('should build FETCH with section', () => { + expect((0, _commandBuilder.buildFETCHCommand)('1:*', ['body[text]'], {})).to.deep.equal({ + command: 'FETCH', + attributes: [{ + type: 'SEQUENCE', + value: '1:*' + }, { + type: 'ATOM', + value: 'BODY', + section: [{ + type: 'ATOM', + value: 'TEXT' + }] + }] + }); + }); + it('should build FETCH with section and list', () => { + expect((0, _commandBuilder.buildFETCHCommand)('1:*', ['body[header.fields (date in-reply-to)]'], {})).to.deep.equal({ + command: 'FETCH', + attributes: [{ + type: 'SEQUENCE', + value: '1:*' + }, { + type: 'ATOM', + value: 'BODY', + section: [{ + type: 'ATOM', + value: 'HEADER.FIELDS' + }, [{ + type: 'ATOM', + value: 'DATE' + }, { + type: 'ATOM', + value: 'IN-REPLY-TO' + }]] + }] + }); + }); + it('should build FETCH with ', () => { + expect((0, _commandBuilder.buildFETCHCommand)('1:*', ['all'], { + changedSince: '123456' + })).to.deep.equal({ + command: 'FETCH', + attributes: [{ + type: 'SEQUENCE', + value: '1:*' + }, { + type: 'ATOM', + value: 'ALL' + }, [{ + type: 'ATOM', + value: 'CHANGEDSINCE' + }, { + type: 'ATOM', + value: '123456' + }]] + }); + }); + it('should build FETCH with partial', () => { + expect((0, _commandBuilder.buildFETCHCommand)('1:*', ['body[]'], {})).to.deep.equal({ + command: 'FETCH', + attributes: [{ + type: 'SEQUENCE', + value: '1:*' + }, { + type: 'ATOM', + value: 'BODY', + section: [] + }] + }); + }); + it('should build FETCH with the valueAsString option', () => { + expect((0, _commandBuilder.buildFETCHCommand)('1:*', ['body[]'], { + valueAsString: false + })).to.deep.equal({ + command: 'FETCH', + attributes: [{ + type: 'SEQUENCE', + value: '1:*' + }, { + type: 'ATOM', + value: 'BODY', + section: [] + }], + valueAsString: false + }); + }); +}); +describe('#_buildXOAuth2Token', () => { + it('should return base64 encoded XOAUTH2 token', () => { + expect((0, _commandBuilder.buildXOAuth2Token)('user@host', 'abcde')).to.equal('dXNlcj11c2VyQGhvc3QBYXV0aD1CZWFyZXIgYWJjZGUBAQ=='); + }); +}); +describe('buildSEARCHCommand', () => { + it('should compose a search command', () => { + expect((0, _commandBuilder.buildSEARCHCommand)({ + unseen: true, + header: ['subject', 'hello world'], + or: { + unseen: true, + seen: true + }, + not: { + seen: true + }, + sentbefore: new Date(2011, 1, 3, 12, 0, 0), + since: new Date(2011, 11, 23, 12, 0, 0), + uid: '1:*', + 'X-GM-MSGID': '1499257647490662970', + 'X-GM-THRID': '1499257647490662971' + }, {})).to.deep.equal({ + command: 'SEARCH', + attributes: [{ + type: 'atom', + value: 'UNSEEN' + }, { + type: 'atom', + value: 'HEADER' + }, { + type: 'string', + value: 'subject' + }, { + type: 'string', + value: 'hello world' + }, { + type: 'atom', + value: 'OR' + }, { + type: 'atom', + value: 'UNSEEN' + }, { + type: 'atom', + value: 'SEEN' + }, { + type: 'atom', + value: 'NOT' + }, { + type: 'atom', + value: 'SEEN' + }, { + type: 'atom', + value: 'SENTBEFORE' + }, { + type: 'atom', + value: '3-Feb-2011' + }, { + type: 'atom', + value: 'SINCE' + }, { + type: 'atom', + value: '23-Dec-2011' + }, { + type: 'atom', + value: 'UID' + }, { + type: 'sequence', + value: '1:*' + }, { + type: 'atom', + value: 'X-GM-MSGID' + }, { + type: 'number', + value: '1499257647490662970' + }, { + type: 'atom', + value: 'X-GM-THRID' + }, { + type: 'number', + value: '1499257647490662971' + }] + }); + }); + it('should compose an unicode search command', () => { + expect((0, _commandBuilder.buildSEARCHCommand)({ + body: 'jõgeva' + }, {})).to.deep.equal({ + command: 'SEARCH', + attributes: [{ + type: 'atom', + value: 'CHARSET' + }, { + type: 'atom', + value: 'UTF-8' + }, { + type: 'atom', + value: 'BODY' + }, { + type: 'literal', + value: 'jõgeva' + }] + }); + }); +}); +describe('#_buildSTORECommand', () => { + it('should compose a store command from an array', () => { + expect((0, _commandBuilder.buildSTORECommand)('1,2,3', 'FLAGS', ['a', 'b'], {})).to.deep.equal({ + command: 'STORE', + attributes: [{ + type: 'sequence', + value: '1,2,3' + }, { + type: 'atom', + value: 'FLAGS' + }, [{ + type: 'atom', + value: 'a' + }, { + type: 'atom', + value: 'b' + }]] + }); + }); + it('should compose a store set flags command', () => { + expect((0, _commandBuilder.buildSTORECommand)('1,2,3', 'FLAGS', ['a', 'b'], {})).to.deep.equal({ + command: 'STORE', + attributes: [{ + type: 'sequence', + value: '1,2,3' + }, { + type: 'atom', + value: 'FLAGS' + }, [{ + type: 'atom', + value: 'a' + }, { + type: 'atom', + value: 'b' + }]] + }); + }); + it('should compose a store add flags command', () => { + expect((0, _commandBuilder.buildSTORECommand)('1,2,3', '+FLAGS', ['a', 'b'], {})).to.deep.equal({ + command: 'STORE', + attributes: [{ + type: 'sequence', + value: '1,2,3' + }, { + type: 'atom', + value: '+FLAGS' + }, [{ + type: 'atom', + value: 'a' + }, { + type: 'atom', + value: 'b' + }]] + }); + }); + it('should compose a store remove flags command', () => { + expect((0, _commandBuilder.buildSTORECommand)('1,2,3', '-FLAGS', ['a', 'b'], {})).to.deep.equal({ + command: 'STORE', + attributes: [{ + type: 'sequence', + value: '1,2,3' + }, { + type: 'atom', + value: '-FLAGS' + }, [{ + type: 'atom', + value: 'a' + }, { + type: 'atom', + value: 'b' + }]] + }); + }); + it('should compose a store remove silent flags command', () => { + expect((0, _commandBuilder.buildSTORECommand)('1,2,3', '-FLAGS', ['a', 'b'], { + silent: true + })).to.deep.equal({ + command: 'STORE', + attributes: [{ + type: 'sequence', + value: '1,2,3' + }, { + type: 'atom', + value: '-FLAGS.SILENT' + }, [{ + type: 'atom', + value: 'a' + }, { + type: 'atom', + value: 'b' + }]] + }); + }); + it('should compose a uid store flags command', () => { + expect((0, _commandBuilder.buildSTORECommand)('1,2,3', 'FLAGS', ['a', 'b'], { + byUid: true + })).to.deep.equal({ + command: 'UID STORE', + attributes: [{ + type: 'sequence', + value: '1,2,3' + }, { + type: 'atom', + value: 'FLAGS' + }, [{ + type: 'atom', + value: 'a' + }, { + type: 'atom', + value: 'b' + }]] + }); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21tYW5kLWJ1aWxkZXItdW5pdC5qcyJdLCJuYW1lcyI6WyJkZXNjcmliZSIsIml0IiwiZXhwZWN0IiwidG8iLCJkZWVwIiwiZXF1YWwiLCJjb21tYW5kIiwiYXR0cmlidXRlcyIsInR5cGUiLCJ2YWx1ZSIsImJ5VWlkIiwic2VjdGlvbiIsImNoYW5nZWRTaW5jZSIsInZhbHVlQXNTdHJpbmciLCJ1bnNlZW4iLCJoZWFkZXIiLCJvciIsInNlZW4iLCJub3QiLCJzZW50YmVmb3JlIiwiRGF0ZSIsInNpbmNlIiwidWlkIiwiYm9keSIsInNpbGVudCJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7QUFPQUEsUUFBUSxDQUFDLG1CQUFELEVBQXNCLE1BQU07QUFDbENDLEVBQUFBLEVBQUUsQ0FBQyx5QkFBRCxFQUE0QixNQUFNO0FBQ2xDQyxJQUFBQSxNQUFNLENBQUMsdUNBQWtCLEtBQWxCLEVBQXlCLENBQUMsS0FBRCxDQUF6QixFQUFrQyxFQUFsQyxDQUFELENBQU4sQ0FBOENDLEVBQTlDLENBQWlEQyxJQUFqRCxDQUFzREMsS0FBdEQsQ0FBNEQ7QUFDMURDLE1BQUFBLE9BQU8sRUFBRSxPQURpRDtBQUUxREMsTUFBQUEsVUFBVSxFQUFFLENBQUM7QUFDWEMsUUFBQUEsSUFBSSxFQUFFLFVBREs7QUFFWEMsUUFBQUEsS0FBSyxFQUFFO0FBRkksT0FBRCxFQUdUO0FBQ0RELFFBQUFBLElBQUksRUFBRSxNQURMO0FBRURDLFFBQUFBLEtBQUssRUFBRTtBQUZOLE9BSFM7QUFGOEMsS0FBNUQ7QUFVRCxHQVhDLENBQUY7QUFhQVIsRUFBQUEsRUFBRSxDQUFDLDZCQUFELEVBQWdDLE1BQU07QUFDdENDLElBQUFBLE1BQU0sQ0FBQyx1Q0FBa0IsS0FBbEIsRUFBeUIsQ0FBQyxLQUFELENBQXpCLEVBQWtDO0FBQ3ZDUSxNQUFBQSxLQUFLLEVBQUU7QUFEZ0MsS0FBbEMsQ0FBRCxDQUFOLENBRUlQLEVBRkosQ0FFT0MsSUFGUCxDQUVZQyxLQUZaLENBRWtCO0FB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VSxFQUFFLENBQUM7QUFDWEMsUUFBQUEsSUFBSSxFQUFFLE1BREs7QUFFWEMsUUFBQUEsS0FBSyxFQUFFO0FBRkksT0FBRCxFQUdUO0FBQ0RELFFBQUFBLElBQUksRUFBRSxNQURMO0FBRURDLFFBQUFBLEtBQUssRUFBRTtBQUZOLE9BSFMsRUFNVDtBQUNERCxRQUFBQSxJQUFJLEVBQUUsUUFETDtBQUVEQyxRQUFBQSxLQUFLLEVBQUU7QUFGTixPQU5TLEVBU1Q7QUFDREQsUUFBQUEsSUFBSSxFQUFFLFFBREw7QUFFREMsUUFBQUEsS0FBSyxFQUFFO0FBRk4sT0FUUyxFQVlUO0FBQ0RELFFBQUFBLElBQUksRUFBRSxNQURMO0FBRURDLFFBQUFBLEtBQUssRUFBRTtBQUZOLE9BWlMsRUFlVDtBQUNERCxRQUFBQSxJQUFJLEVBQUUsTUFETDtBQUVEQyxRQUFBQSxLQUFLLEVBQUU7QUFGTixPQWZTLEVBa0JUO0FBQ0RELFFBQUFBLElBQUksRUFBRSxNQURMO0FBRURDLFFBQUFBLEtBQUssRUFBRTtBQUZOLE9BbEJTLEVBcUJUO0FBQ0RELFFBQUFBLElBQUksRUFBRSxNQURMO0FBRURDLFFBQUFBLEtBQUssRUFBRTtBQUZOLE9BckJTLEVBd0JUO0FBQ0RELFFBQUFBLElBQUksRUFBRSxNQURMO0FBRURDLFFBQUFBLEtBQUssRUFBRTtBQUZOLE9BeEJTLEVBMkJUO0FBQ0RELFFBQUFBLElBQUksRUFBRSxNQURMO0FBRURDLFFBQUFBLEtBQUssRUFBRTtBQUZOLE9BM0JTLEVBOEJUO0FBQ0RELFFBQUFBLElBQUksRUFBRSxNQURMO0FBRURDLFFBQUFBLEtBQUssRUFBRTtBQUZOLE9BOUJTLEVBaUNUO0FBQ0RELFFBQUFBLElBQUksRUFBRSxNQURMO0FBRURDLFFBQUFBLEtBQUssRUFBRTtBQUZOLE9BakNTLEVBb0NUO0FBQ0RELFFBQUFBLElBQUksRUFBRSxNQURMO0FBRURDLFFBQUFBLEtBQUssRUFBRTtBQUZOLE9BcENTLEVBdUNUO0FBQ0RELFFBQUFBLElBQUksRUFBRSxNQURMO0FBRURDLFFBQUFBLEtB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LEtBRmxCO0FBb0JELEdBckJDLENBQUY7QUF1QkFSLEVBQUFBLEVBQUUsQ0FBQywwQ0FBRCxFQUE2QyxNQUFNO0FBQ25EQyxJQUFBQSxNQUFNLENBQUMsdUNBQWtCLE9BQWxCLEVBQTJCLE9BQTNCLEVBQW9DLENBQUMsR0FBRCxFQUFNLEdBQU4sQ0FBcEMsRUFBZ0Q7QUFDckRRLE1BQUFBLEtBQUssRUFBRTtBQUQ4QyxLQUFoRCxDQUFELENBQU4sQ0FFSVAsRUFGSixDQUVPQyxJQUZQLENBRVlDLEtBRlosQ0FFa0I7QUFDaEJDLE1BQUFBLE9BQU8sRUFBRSxXQURPO0FBRWhCQyxNQUFBQSxVQUFVLEVBQUUsQ0FBQztBQUNYQyxRQUFBQSxJQUFJLEVBQUUsVUFESztBQUVYQyxRQUFBQSxLQUFLLEVBQUU7QUFGSSxPQUFELEVBR1Q7QUFDREQsUUFBQUEsSUFBSSxFQUFFLE1BREw7QUFFREMsUUFBQUEsS0FBSyxFQUFFO0FBRk4sT0FIUyxFQU9aLENBQUM7QUFDQ0QsUUFBQUEsSUFBSSxFQUFFLE1BRFA7QUFFQ0MsUUFBQUEsS0FBSyxFQUFFO0FBRlIsT0FBRCxFQUdHO0FBQ0RELFFBQUFBLElBQUksRUFBRSxNQURMO0FBRURDLFFBQUFBLEtBQUssRUFBRTtBQUZOLE9BSEgsQ0FQWTtBQUZJLEtBRmxCO0FBb0JELEdBckJDLENBQUY7QUFzQkQsQ0FsSU8sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGJ1aWxkU1RPUkVDb21tYW5kLFxuICBidWlsZEZFVENIQ29tbWFuZCxcbiAgYnVpbGRYT0F1dGgyVG9rZW4sXG4gIGJ1aWxkU0VBUkNIQ29tbWFuZFxufSBmcm9tICcuL2NvbW1hbmQtYnVpbGRlcidcblxuZGVzY3JpYmUoJ2J1aWxkRkVUQ0hDb21tYW5kJywgKCkgPT4ge1xuICBpdCgnc2hvdWxkIGJ1aWxkIHNpbmdsZSBBTEwnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGJ1aWxkRkVUQ0hDb21tYW5kKCcxOionLCBbJ2FsbCddLCB7fSkpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgY29tbWFuZDogJ0ZFVENIJyxcbiAgICAgIGF0dHJpYnV0ZXM6IFt7XG4gICAgICAgIHR5cGU6ICdTRVFVRU5DRScsXG4gICAgICAgIHZhbHVlOiAnMToqJ1xuICAgICAgfSwge1xuICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgIHZhbHVlOiAnQUxMJ1xuICAgICAgfV1cbiAgICB9KVxuICB9KVxuXG4gIGl0KCdzaG91bGQgYnVpbGQgRkVUQ0ggd2l0aCB1aWQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGJ1aWxkRkVUQ0hDb21tYW5kKCcxOionLCBbJ2FsbCddLCB7XG4gICAgICBieVVpZDogdHJ1ZVxuICAgIH0pKS50by5kZWVwLmVxdWFsKHtcbiAgICAgIGNvbW1hbmQ6ICdVSUQgRkVUQ0gnLFxuICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgdHlwZTogJ1NFUVVFTkNFJyxcbiAgICAgICAgdmFsdWU6ICcxOionXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgdmFsdWU6ICdBTEwnXG4gICAgICB9XVxuICAgIH0pXG4gIH0pXG5cbiAgaXQoJ3Nob3VsZCBidWlsZCBGRVRDSCB3aXRoIHVpZCwgZW52ZWxvcGUnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGJ1aWxkRkVUQ0hDb21tYW5kKCcxOionLCBbJ3VpZCcsICdlbnZlbG9wZSddLCB7fSkpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgY29tbWFuZDogJ0ZFVENIJyxcbiAgICAgIGF0dHJpYnV0ZXM6IFt7XG4gICAgICAgIHR5cGU6ICdTRVFVRU5DRScsXG4gICAgICAgIHZhbHVlOiAnMToqJ1xuICAgICAgfSxcbiAgICAgIFt7XG4gICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgdmFsdWU6ICdVSUQnXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgdmFsdWU6ICdFTlZFTE9QRSdcbiAgICAgIH1dXG4gICAgICBdXG4gICAgfSlcbiAgfSlcblxuICBpdCgnc2hvdWxkIGJ1aWxkIEZFVENIIHdpdGggbW9kc2VxJywgKCkgPT4ge1xuICAgIGV4cGVjdChidWlsZEZFVENIQ29tbWFuZCgnMToqJywgWydtb2RzZXEgKDEyMzQ1NjcpJ10sIHt9KSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICBjb21tYW5kOiAnRkVUQ0gnLFxuICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgdHlwZTogJ1NFUVVFTkNFJyxcbiAgICAgICAgdmFsdWU6ICcxOionXG4gICAgICB9LFxuICAgICAgW3tcbiAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICB2YWx1ZTogJ01PRFNFUSdcbiAgICAgIH0sXG4gICAgICBbe1xuICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgIHZhbHVlOiAnMTIzNDU2NydcbiAgICAgIH1dXG4gICAgICBdXG4gICAgICBdXG4gICAgfSlcbiAgfSlcblxuICBpdCgnc2hvdWxkIGJ1aWxkIEZFVENIIHdpdGggc2VjdGlvbicsICgpID0+IHtcbiAgICBleHBlY3QoYnVpbGRGRVRDSENvbW1hbmQoJzE6KicsIFsnYm9keVt0ZXh0XSddLCB7fSkpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgY29tbWFuZDogJ0ZFVENIJyxcbiAgICAgIGF0dHJpYnV0ZXM6IFt7XG4gICAgICAgIHR5cGU6ICdTRVFVRU5DRScsXG4gICAgICAgIHZhbHVlOiAnMToqJ1xuICAgICAgfSwge1xuICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgIHZhbHVlOiAnQk9EWScsXG4gICAgICAgIHNlY3Rpb246IFt7XG4gICAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICAgIHZhbHVlOiAnVEVYVCdcbiAgICAgICAgfV1cbiAgICAgIH1dXG4gICAgfSlcbiAgfSlcblxuICBpdCgnc2hvdWxkIGJ1aWxkIEZFVENIIHdpdGggc2VjdGlvbiBhbmQgbGlzdCcsICgpID0+IHtcbiAgICBleHBlY3QoYnVpbGRGRVRDSENvbW1hbmQoJzE6KicsIFsnYm9keVtoZWFkZXIuZmllbGRzIChkYXRlIGluLXJlcGx5LXRvKV0nXSwge30pKS50by5kZWVwLmVxdWFsKHtcbiAgICAgIGNvbW1hbmQ6ICdGRVRDSCcsXG4gICAgICBhdHRyaWJ1dGVzOiBbe1xuICAgICAgICB0eXBlOiAnU0VRVUVOQ0UnLFxuICAgICAgICB2YWx1ZTogJzE6KidcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICB2YWx1ZTogJ0JPRFknLFxuICAgICAgICBzZWN0aW9uOiBbe1xuICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICB2YWx1ZTogJ0hFQURFUi5GSUVMRFMnXG4gICAgICAgIH0sXG4gICAgICAgIFt7XG4gICAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICAgIHZhbHVlOiAnREFURSdcbiAgICAgICAgfSwge1xuICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICB2YWx1ZTogJ0lOLVJFUExZLVRPJ1xuICAgICAgICB9XVxuICAgICAgICBdXG4gICAgICB9XVxuICAgIH0pXG4gIH0pXG5cbiAgaXQoJ3Nob3VsZCBidWlsZCBGRVRDSCB3aXRoICcsICgpID0+IHtcbiAgICBleHBlY3QoYnVpbGRGRVRDSENvbW1hbmQoJzE6KicsIFsnYWxsJ10sIHtcbiAgICAgIGNoYW5nZWRTaW5jZTogJzEyMzQ1NidcbiAgICB9KSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICBjb21tYW5kOiAnRkVUQ0gnLFxuICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgdHlwZTogJ1NFUVVFTkNFJyxcbiAgICAgICAgdmFsdWU6ICcxOionXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgdmFsdWU6ICdBTEwnXG4gICAgICB9LFxuICAgICAgW3tcbiAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICB2YWx1ZTogJ0NIQU5HRURTSU5DRSdcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICB2YWx1ZTogJzEyMzQ1NidcbiAgICAgIH1dXG4gICAgICBdXG4gICAgfSlcbiAgfSlcblxuICBpdCgnc2hvdWxkIGJ1aWxkIEZFVENIIHdpdGggcGFydGlhbCcsICgpID0+IHtcbiAgICBleHBlY3QoYnVpbGRGRVRDSENvbW1hbmQoJzE6KicsIFsnYm9keVtdJ10sIHt9KSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICBjb21tYW5kOiAnRkVUQ0gnLFxuICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgdHlwZTogJ1NFUVVFTkNFJyxcbiAgICAgICAgdmFsdWU6ICcxOionXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgdmFsdWU6ICdCT0RZJyxcbiAgICAgICAgc2VjdGlvbjogW11cbiAgICAgIH1dXG4gICAgfSlcbiAgfSlcblxuICBpdCgnc2hvdWxkIGJ1aWxkIEZFVENIIHdpdGggdGhlIHZhbHVlQXNTdHJpbmcgb3B0aW9uJywgKCkgPT4ge1xuICAgIGV4cGVjdChidWlsZEZFVENIQ29tbWFuZCgnMToqJywgWydib2R5W10nXSwgeyB2YWx1ZUFzU3RyaW5nOiBmYWxzZSB9KSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICBjb21tYW5kOiAnRkVUQ0gnLFxuICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgdHlwZTogJ1NFUVVFTkNFJyxcbiAgICAgICAgdmFsdWU6ICcxOionXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgdmFsdWU6ICdCT0RZJyxcbiAgICAgICAgc2VjdGlvbjogW11cbiAgICAgIH1dLFxuICAgICAgdmFsdWVBc1N0cmluZzogZmFsc2VcbiAgICB9KVxuICB9KVxufSlcblxuZGVzY3JpYmUoJyNfYnVpbGRYT0F1dGgyVG9rZW4nLCAoKSA9PiB7XG4gIGl0KCdzaG91bGQgcmV0dXJuIGJhc2U2NCBlbmNvZGVkIFhPQVVUSDIgdG9rZW4nLCAoKSA9PiB7XG4gICAgZXhwZWN0KGJ1aWxkWE9BdXRoMlRva2VuKCd1c2VyQGhvc3QnLCAnYWJjZGUnKSkudG8uZXF1YWwoJ2RYTmxjajExYzJWeVFHaHZjM1FCWVhWMGFEMUNaV0Z5WlhJZ1lXSmpaR1VCQVE9PScpXG4gIH0pXG59KVxuXG5kZXNjcmliZSgnYnVpbGRTRUFSQ0hDb21tYW5kJywgKCkgPT4ge1xuICBpdCgnc2hvdWxkIGNvbXBvc2UgYSBzZWFyY2ggY29tbWFuZCcsICgpID0+IHtcbiAgICBleHBlY3QoYnVpbGRTRUFSQ0hDb21tYW5kKHtcbiAgICAgIHVuc2VlbjogdHJ1ZSxcbiAgICAgIGhlYWRlcjogWydzdWJqZWN0JywgJ2hlbGxvIHdvcmxkJ10sXG4gICAgICBvcjoge1xuICAgICAgICB1bnNlZW46IHRydWUsXG4gICAgICAgIHNlZW46IHRydWVcbiAgICAgIH0sXG4gICAgICBub3Q6IHtcbiAgICAgICAgc2VlbjogdHJ1ZVxuICAgICAgfSxcbiAgICAgIHNlbnRiZWZvcmU6IG5ldyBEYXRlKDIwMTEsIDEsIDMsIDEyLCAwLCAwKSxcbiAgICAgIHNpbmNlOiBuZXcgRGF0ZSgyMDExLCAxMSwgMjMsIDEyLCAwLCAwKSxcbiAgICAgIHVpZDogJzE6KicsXG4gICAgICAnWC1HTS1NU0dJRCc6ICcxNDk5MjU3NjQ3NDkwNjYyOTcwJyxcbiAgICAgICdYLUdNLVRIUklEJzogJzE0OTkyNTc2NDc0OTA2NjI5NzEnXG4gICAgfSwge30pKS50by5kZWVwLmVxdWFsKHtcbiAgICAgIGNvbW1hbmQ6ICdTRUFSQ0gnLFxuICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgdHlwZTogJ2F0b20nLFxuICAgICAgICB2YWx1ZTogJ1VOU0VFTidcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ2F0b20nLFxuICAgICAgICB2YWx1ZTogJ0hFQURFUidcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIHZhbHVlOiAnc3ViamVjdCdcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIHZhbHVlOiAnaGVsbG8gd29ybGQnXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdhdG9tJyxcbiAgICAgICAgdmFsdWU6ICdPUidcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ2F0b20nLFxuICAgICAgICB2YWx1ZTogJ1VOU0VFTidcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ2F0b20nLFxuICAgICAgICB2YWx1ZTogJ1NFRU4nXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdhdG9tJyxcbiAgICAgICAgdmFsdWU6ICdOT1QnXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdhdG9tJyxcbiAgICAgICAgdmFsdWU6ICdTRUVOJ1xuICAgICAgfSwge1xuICAgICAgICB0eXBlOiAnYXRvbScsXG4gICAgICAgIHZhbHVlOiAnU0VOVEJFRk9SRSdcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ2F0b20nLFxuICAgICAgICB2YWx1ZTogJzMtRmViLTIwMTEnXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdhdG9tJyxcbiAgICAgICAgdmFsdWU6ICdTSU5DRSdcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ2F0b20nLFxuICAgICAgICB2YWx1ZTogJzIzLURlYy0yMDExJ1xuICAgICAgfSwge1xuICAgICAgICB0eXBlOiAnYXRvbScsXG4gICAgICAgIHZhbHVlOiAnVUlEJ1xuICAgICAgfSwge1xuICAgICAgICB0eXBlOiAnc2VxdWVuY2UnLFxuICAgICAgICB2YWx1ZTogJzE6KidcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ2F0b20nLFxuICAgICAgICB2YWx1ZTogJ1gtR00tTVNHSUQnXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgICB2YWx1ZTogJzE0OTkyNTc2NDc0OTA2NjI5NzAnXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdhdG9tJyxcbiAgICAgICAgdmFsdWU6ICdYLUdNLVRIUklEJ1xuICAgICAgfSwge1xuICAgICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgICAgdmFsdWU6ICcxNDk5MjU3NjQ3NDkwNjYyOTcxJ1xuICAgICAgfV1cbiAgICB9KVxuICB9KVxuXG4gIGl0KCdzaG91bGQgY29tcG9zZSBhbiB1bmljb2RlIHNlYXJjaCBjb21tYW5kJywgKCkgPT4ge1xuICAgIGV4cGVjdChidWlsZFNFQVJDSENvbW1hbmQoe1xuICAgICAgYm9keTogJ2rDtWdldmEnXG4gICAgfSwge30pKS50by5kZWVwLmVxdWFsKHtcbiAgICAgIGNvbW1hbmQ6ICdTRUFSQ0gnLFxuICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgdHlwZTogJ2F0b20nLFxuICAgICAgICB2YWx1ZTogJ0NIQVJTRVQnXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdhdG9tJyxcbiAgICAgICAgdmFsdWU6ICdVVEYtOCdcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ2F0b20nLFxuICAgICAgICB2YWx1ZTogJ0JPRFknXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdsaXRlcmFsJyxcbiAgICAgICAgdmFsdWU6ICdqw4PCtWdldmEnXG4gICAgICB9XVxuICAgIH0pXG4gIH0pXG59KVxuXG5kZXNjcmliZSgnI19idWlsZFNUT1JFQ29tbWFuZCcsICgpID0+IHtcbiAgaXQoJ3Nob3VsZCBjb21wb3NlIGEgc3RvcmUgY29tbWFuZCBmcm9tIGFuIGFycmF5JywgKCkgPT4ge1xuICAgIGV4cGVjdChidWlsZFNUT1JFQ29tbWFuZCgnMSwyLDMnLCAnRkxBR1MnLCBbJ2EnLCAnYiddLCB7fSkpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgY29tbWFuZDogJ1NUT1JFJyxcbiAgICAgIGF0dHJpYnV0ZXM6IFt7XG4gICAgICAgIHR5cGU6ICdzZXF1ZW5jZScsXG4gICAgICAgIHZhbHVlOiAnMSwyLDMnXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdhdG9tJyxcbiAgICAgICAgdmFsdWU6ICdGTEFHUydcbiAgICAgIH0sXG4gICAgICBbe1xuICAgICAgICB0eXBlOiAnYXRvbScsXG4gICAgICAgIHZhbHVlOiAnYSdcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ2F0b20nLFxuICAgICAgICB2YWx1ZTogJ2InXG4gICAgICB9XVxuICAgICAgXVxuICAgIH0pXG4gIH0pXG5cbiAgaXQoJ3Nob3VsZCBjb21wb3NlIGEgc3RvcmUgc2V0IGZsYWdzIGNvbW1hbmQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGJ1aWxkU1RPUkVDb21tYW5kKCcxLDIsMycsICdGTEFHUycsIFsnYScsICdiJ10sIHt9KSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICBjb21tYW5kOiAnU1RPUkUnLFxuICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgdHlwZTogJ3NlcXVlbmNlJyxcbiAgICAgICAgdmFsdWU6ICcxLDIsMydcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ2F0b20nLFxuICAgICAgICB2YWx1ZTogJ0ZMQUdTJ1xuICAgICAgfSxcbiAgICAgIFt7XG4gICAgICAgIHR5cGU6ICdhdG9tJyxcbiAgICAgICAgdmFsdWU6ICdhJ1xuICAgICAgfSwge1xuICAgICAgICB0eXBlOiAnYXRvbScsXG4gICAgICAgIHZhbHVlOiAnYidcbiAgICAgIH1dXG4gICAgICBdXG4gICAgfSlcbiAgfSlcblxuICBpdCgnc2hvdWxkIGNvbXBvc2UgYSBzdG9yZSBhZGQgZmxhZ3MgY29tbWFuZCcsICgpID0+IHtcbiAgICBleHBlY3QoYnVpbGRTVE9SRUNvbW1hbmQoJzEsMiwzJywgJytGTEFHUycsIFsnYScsICdiJ10sIHt9KSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICBjb21tYW5kOiAnU1RPUkUnLFxuICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgdHlwZTogJ3NlcXVlbmNlJyxcbiAgICAgICAgdmFsdWU6ICcxLDIsMydcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ2F0b20nLFxuICAgICAgICB2YWx1ZTogJytGTEFHUydcbiAgICAgIH0sXG4gICAgICBbe1xuICAgICAgICB0eXBlOiAnYXRvbScsXG4gICAgICAgIHZhbHVlOiAnYSdcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ2F0b20nLFxuICAgICAgICB2YWx1ZTogJ2InXG4gICAgICB9XVxuICAgICAgXVxuICAgIH0pXG4gIH0pXG5cbiAgaXQoJ3Nob3VsZCBjb21wb3NlIGEgc3RvcmUgcmVtb3ZlIGZsYWdzIGNvbW1hbmQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGJ1aWxkU1RPUkVDb21tYW5kKCcxLDIsMycsICctRkxBR1MnLCBbJ2EnLCAnYiddLCB7fSkpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgY29tbWFuZDogJ1NUT1JFJyxcbiAgICAgIGF0dHJpYnV0ZXM6IFt7XG4gICAgICAgIHR5cGU6ICdzZXF1ZW5jZScsXG4gICAgICAgIHZhbHVlOiAnMSwyLDMnXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdhdG9tJyxcbiAgICAgICAgdmFsdWU6ICctRkxBR1MnXG4gICAgICB9LFxuICAgICAgW3tcbiAgICAgICAgdHlwZTogJ2F0b20nLFxuICAgICAgICB2YWx1ZTogJ2EnXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdhdG9tJyxcbiAgICAgICAgdmFsdWU6ICdiJ1xuICAgICAgfV1cbiAgICAgIF1cbiAgICB9KVxuICB9KVxuXG4gIGl0KCdzaG91bGQgY29tcG9zZSBhIHN0b3JlIHJlbW92ZSBzaWxlbnQgZmxhZ3MgY29tbWFuZCcsICgpID0+IHtcbiAgICBleHBlY3QoYnVpbGRTVE9SRUNvbW1hbmQoJzEsMiwzJywgJy1GTEFHUycsIFsnYScsICdiJ10sIHtcbiAgICAgIHNpbGVudDogdHJ1ZVxuICAgIH0pKS50by5kZWVwLmVxdWFsKHtcbiAgICAgIGNvbW1hbmQ6ICdTVE9SRScsXG4gICAgICBhdHRyaWJ1dGVzOiBbe1xuICAgICAgICB0eXBlOiAnc2VxdWVuY2UnLFxuICAgICAgICB2YWx1ZTogJzEsMiwzJ1xuICAgICAgfSwge1xuICAgICAgICB0eXBlOiAnYXRvbScsXG4gICAgICAgIHZhbHVlOiAnLUZMQUdTLlNJTEVOVCdcbiAgICAgIH0sXG4gICAgICBbe1xuICAgICAgICB0eXBlOiAnYXRvbScsXG4gICAgICAgIHZhbHVlOiAnYSdcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ2F0b20nLFxuICAgICAgICB2YWx1ZTogJ2InXG4gICAgICB9XVxuICAgICAgXVxuICAgIH0pXG4gIH0pXG5cbiAgaXQoJ3Nob3VsZCBjb21wb3NlIGEgdWlkIHN0b3JlIGZsYWdzIGNvbW1hbmQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGJ1aWxkU1RPUkVDb21tYW5kKCcxLDIsMycsICdGTEFHUycsIFsnYScsICdiJ10sIHtcbiAgICAgIGJ5VWlkOiB0cnVlXG4gICAgfSkpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgY29tbWFuZDogJ1VJRCBTVE9SRScsXG4gICAgICBhdHRyaWJ1dGVzOiBbe1xuICAgICAgICB0eXBlOiAnc2VxdWVuY2UnLFxuICAgICAgICB2YWx1ZTogJzEsMiwzJ1xuICAgICAgfSwge1xuICAgICAgICB0eXBlOiAnYXRvbScsXG4gICAgICAgIHZhbHVlOiAnRkxBR1MnXG4gICAgICB9LFxuICAgICAgW3tcbiAgICAgICAgdHlwZTogJ2F0b20nLFxuICAgICAgICB2YWx1ZTogJ2EnXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdhdG9tJyxcbiAgICAgICAgdmFsdWU6ICdiJ1xuICAgICAgfV1cbiAgICAgIF1cbiAgICB9KVxuICB9KVxufSlcbiJdfQ== \ No newline at end of file diff --git a/dist/command-parser-unit.js b/dist/command-parser-unit.js new file mode 100644 index 0000000..27ceef5 --- /dev/null +++ b/dist/command-parser-unit.js @@ -0,0 +1,461 @@ +"use strict"; + +var _emailjsImapHandler = require("emailjs-imap-handler"); + +var _commandParser = require("./command-parser"); + +var _common = require("./common"); + +var _envelope = _interopRequireDefault(require("../res/fixtures/envelope")); + +var _mimeTortureBodystructure = _interopRequireDefault(require("../res/fixtures/mime-torture-bodystructure")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/* eslint-disable no-unused-expressions */ + +/* eslint-disable no-useless-escape */ +describe('parseNAMESPACE', () => { + it('should not succeed for no namespace response', () => { + expect((0, _commandParser.parseNAMESPACE)({ + payload: { + NAMESPACE: [] + } + })).to.be.false; + }); + it('should return single personal namespace', () => { + expect((0, _commandParser.parseNAMESPACE)({ + payload: { + NAMESPACE: [{ + attributes: [[[{ + type: 'STRING', + value: 'INBOX.' + }, { + type: 'STRING', + value: '.' + }]], null, null] + }] + } + })).to.deep.equal({ + personal: [{ + prefix: 'INBOX.', + delimiter: '.' + }], + users: false, + shared: false + }); + }); + it('should return single personal, single users, multiple shared', () => { + expect((0, _commandParser.parseNAMESPACE)({ + payload: { + NAMESPACE: [{ + attributes: [// personal + [[{ + type: 'STRING', + value: '' + }, { + type: 'STRING', + value: '/' + }]], // users + [[{ + type: 'STRING', + value: '~' + }, { + type: 'STRING', + value: '/' + }]], // shared + [[{ + type: 'STRING', + value: '#shared/' + }, { + type: 'STRING', + value: '/' + }], [{ + type: 'STRING', + value: '#public/' + }, { + type: 'STRING', + value: '/' + }]]] + }] + } + })).to.deep.equal({ + personal: [{ + prefix: '', + delimiter: '/' + }], + users: [{ + prefix: '~', + delimiter: '/' + }], + shared: [{ + prefix: '#shared/', + delimiter: '/' + }, { + prefix: '#public/', + delimiter: '/' + }] + }); + }); + it('should handle NIL namespace hierarchy delim', () => { + expect((0, _commandParser.parseNAMESPACE)({ + payload: { + NAMESPACE: [// This specific value is returned by yahoo.co.jp's + // imapgate version 0.7.68_11_1.61475 IMAP server + (0, _emailjsImapHandler.parser)((0, _common.toTypedArray)('* NAMESPACE (("" NIL)) NIL NIL'))] + } + })).to.deep.equal({ + personal: [{ + prefix: '', + delimiter: null + }], + users: false, + shared: false + }); + }); +}); +describe('parseSELECT', () => { + it('should parse a complete response', () => { + expect((0, _commandParser.parseSELECT)({ + code: 'READ-WRITE', + payload: { + EXISTS: [{ + nr: 123 + }], + FLAGS: [{ + attributes: [[{ + type: 'ATOM', + value: '\\Answered' + }, { + type: 'ATOM', + value: '\\Flagged' + }]] + }], + OK: [{ + code: 'PERMANENTFLAGS', + permanentflags: ['\\Answered', '\\Flagged'] + }, { + code: 'UIDVALIDITY', + uidvalidity: '2' + }, { + code: 'UIDNEXT', + uidnext: '38361' + }, { + code: 'HIGHESTMODSEQ', + highestmodseq: '3682918' + }] + } + })).to.deep.equal({ + exists: 123, + flags: ['\\Answered', '\\Flagged'], + highestModseq: '3682918', + permanentFlags: ['\\Answered', '\\Flagged'], + readOnly: false, + uidNext: 38361, + uidValidity: 2 + }); + }); + it('should parse response with no modseq', () => { + expect((0, _commandParser.parseSELECT)({ + code: 'READ-WRITE', + payload: { + EXISTS: [{ + nr: 123 + }], + FLAGS: [{ + attributes: [[{ + type: 'ATOM', + value: '\\Answered' + }, { + type: 'ATOM', + value: '\\Flagged' + }]] + }], + OK: [{ + code: 'PERMANENTFLAGS', + permanentflags: ['\\Answered', '\\Flagged'] + }, { + code: 'UIDVALIDITY', + uidvalidity: '2' + }, { + code: 'UIDNEXT', + uidnext: '38361' + }] + } + })).to.deep.equal({ + exists: 123, + flags: ['\\Answered', '\\Flagged'], + permanentFlags: ['\\Answered', '\\Flagged'], + readOnly: false, + uidNext: 38361, + uidValidity: 2 + }); + }); + it('should parse response with read-only', () => { + expect((0, _commandParser.parseSELECT)({ + code: 'READ-ONLY', + payload: { + EXISTS: [{ + nr: 123 + }], + FLAGS: [{ + attributes: [[{ + type: 'ATOM', + value: '\\Answered' + }, { + type: 'ATOM', + value: '\\Flagged' + }]] + }], + OK: [{ + code: 'PERMANENTFLAGS', + permanentflags: ['\\Answered', '\\Flagged'] + }, { + code: 'UIDVALIDITY', + uidvalidity: '2' + }, { + code: 'UIDNEXT', + uidnext: '38361' + }] + } + })).to.deep.equal({ + exists: 123, + flags: ['\\Answered', '\\Flagged'], + permanentFlags: ['\\Answered', '\\Flagged'], + readOnly: true, + uidNext: 38361, + uidValidity: 2 + }); + }); + it('should parse response with NOMODSEQ flag', () => { + expect((0, _commandParser.parseSELECT)({ + code: 'READ-WRITE', + payload: { + EXISTS: [{ + nr: 123 + }], + FLAGS: [{ + attributes: [[{ + type: 'ATOM', + value: '\\Answered' + }, { + type: 'ATOM', + value: '\\Flagged' + }]] + }], + OK: [{ + code: 'PERMANENTFLAGS', + permanentflags: ['\\Answered', '\\Flagged'] + }, { + code: 'UIDVALIDITY', + uidvalidity: '2' + }, { + code: 'UIDNEXT', + uidnext: '38361' + }, { + code: 'NOMODSEQ' + }] + } + })).to.deep.equal({ + exists: 123, + flags: ['\\Answered', '\\Flagged'], + permanentFlags: ['\\Answered', '\\Flagged'], + readOnly: false, + uidNext: 38361, + uidValidity: 2, + noModseq: true + }); + }); +}); +describe('parseENVELOPE', () => { + it('should parsed envelope object', () => { + expect((0, _commandParser.parseENVELOPE)(_envelope.default.source)).to.deep.equal(_envelope.default.parsed); + }); +}); +describe('parseBODYSTRUCTURE', () => { + it('should parse bodystructure object', () => { + expect((0, _commandParser.parseBODYSTRUCTURE)(_mimeTortureBodystructure.default.source)).to.deep.equal(_mimeTortureBodystructure.default.parsed); + }); + it('should parse bodystructure with unicode filename', () => { + var input = [[{ + type: 'STRING', + value: 'APPLICATION' + }, { + type: 'STRING', + value: 'OCTET-STREAM' + }, null, null, null, { + type: 'STRING', + value: 'BASE64' + }, { + type: 'ATOM', + value: '40' + }, null, [{ + type: 'STRING', + value: 'ATTACHMENT' + }, [{ + type: 'STRING', + value: 'FILENAME' + }, { + type: 'STRING', + value: '=?ISO-8859-1?Q?BBR_Handel,_Gewerbe,_B=FCrobetriebe,?= =?ISO-8859-1?Q?_private_Bildungseinrichtungen.txt?=' + }]], null], { + type: 'STRING', + value: 'MIXED' + }, [{ + type: 'STRING', + value: 'BOUNDARY' + }, { + type: 'STRING', + value: '----sinikael-?=_1-14105085265110.49903922458179295' + }], null, null]; + var expected = { + childNodes: [{ + part: '1', + type: 'application/octet-stream', + encoding: 'base64', + size: 40, + disposition: 'attachment', + dispositionParameters: { + filename: 'BBR Handel, Gewerbe, Bürobetriebe, private Bildungseinrichtungen.txt' + } + }], + type: 'multipart/mixed', + parameters: { + boundary: '----sinikael-?=_1-14105085265110.49903922458179295' + } + }; + expect((0, _commandParser.parseBODYSTRUCTURE)(input)).to.deep.equal(expected); + }); +}); +describe('parseFETCH', () => { + it('should return values lowercase keys', () => { + expect((0, _commandParser.parseFETCH)({ + payload: { + FETCH: [{ + nr: 123, + attributes: [[{ + type: 'ATOM', + value: 'BODY', + section: [{ + type: 'ATOM', + value: 'HEADER' + }, [{ + type: 'ATOM', + value: 'DATE' + }, { + type: 'ATOM', + value: 'SUBJECT' + }]], + partial: [0, 123] + }, { + type: 'ATOM', + value: 'abc' + }]] + }] + } + })).to.deep.equal([{ + '#': 123, + 'body[header (date subject)]<0.123>': 'abc' + }]); + }); + it('should merge multiple responses based on sequence number', () => { + expect((0, _commandParser.parseFETCH)({ + payload: { + FETCH: [{ + nr: 123, + attributes: [[{ + type: 'ATOM', + value: 'UID' + }, { + type: 'ATOM', + value: 789 + }]] + }, { + nr: 124, + attributes: [[{ + type: 'ATOM', + value: 'UID' + }, { + type: 'ATOM', + value: 790 + }]] + }, { + nr: 123, + attributes: [[{ + type: 'ATOM', + value: 'MODSEQ' + }, { + type: 'ATOM', + value: '127' + }]] + }] + } + })).to.deep.equal([{ + '#': 123, + uid: 789, + modseq: '127' + }, { + '#': 124, + uid: 790 + }]); + }); +}); +describe('parseSEARCH', () => { + it('should parse SEARCH response', () => { + expect((0, _commandParser.parseSEARCH)({ + payload: { + SEARCH: [{ + attributes: [{ + value: 5 + }, { + value: 7 + }] + }, { + attributes: [{ + value: 6 + }] + }] + } + })).to.deep.equal([5, 6, 7]); + }); + it('should parse empty SEARCH response', () => { + expect((0, _commandParser.parseSEARCH)({ + payload: { + SEARCH: [{ + command: 'SEARCH', + tag: '*' + }] + } + })).to.deep.equal([]); + }); +}); +describe('parseCOPY', () => { + it('should parse COPY response', () => { + expect((0, _commandParser.parseCOPY)({ + copyuid: ['1', '1:3', '3,4,2'] + })).to.deep.equal({ + srcSeqSet: '1:3', + destSeqSet: '3,4,2' + }); + }); + it('should return undefined when response does not contain copyuid', () => { + expect((0, _commandParser.parseCOPY)({})).to.equal(undefined); + }); + it('should return undefined when response is not defined', () => { + expect((0, _commandParser.parseCOPY)()).to.equal(undefined); + }); +}); +describe('parseAPPEND', () => { + it('should parse APPEND response', () => { + expect((0, _commandParser.parseAPPEND)({ + appenduid: ['1', '3'] + })).to.equal('3'); + }); + it('should return undefined when response does not contain copyuid', () => { + expect((0, _commandParser.parseAPPEND)({})).to.equal(undefined); + }); + it('should return undefined when response is not defined', () => { + expect((0, _commandParser.parseAPPEND)()).to.equal(undefined); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21tYW5kLXBhcnNlci11bml0LmpzIl0sIm5hbWVzIjpbImRlc2NyaWJlIiwiaXQiLCJleHBlY3QiLCJwYXlsb2FkIiwiTkFNRVNQQUNFIiwidG8iLCJiZSIsImZhbHNlIiwiYXR0cmlidXRlcyIsInR5cGUiLCJ2YWx1ZSIsImRlZXAiLCJlcXVhbCIsInBlcnNvbmFsIiwicHJlZml4IiwiZGVsaW1pdGVyIiwidXNlcnMiLCJzaGFyZWQiLCJjb2RlIiwiRVhJU1RTIiwibnIiLCJGTEFHUyIsIk9LIiwicGVybWFuZW50ZmxhZ3MiLCJ1aWR2YWxpZGl0eSIsInVpZG5leHQiLCJoaWdoZXN0bW9kc2VxIiwiZXhpc3RzIiwiZmxhZ3MiLCJoaWdoZXN0TW9kc2VxIiwicGVybWFuZW50RmxhZ3MiLCJyZWFkT25seSIsInVpZE5leHQiLCJ1aWRWYWxpZGl0eSIsIm5vTW9kc2VxIiwidGVzdEVudmVsb3BlIiwic291cmNlIiwicGFyc2VkIiwibWltZVRvcnR1cmUiLCJpbnB1dCIsImV4cGVjdGVkIiwiY2hpbGROb2RlcyIsInBhcnQiLCJlbmNvZGluZyIsInNpemUiLCJkaXNwb3NpdGlvbiIsImRpc3Bvc2l0aW9uUGFyYW1ldGVycyIsImZpbGVuYW1lIiwicGFyYW1ldGVycyIsImJvdW5kYXJ5IiwiRkVUQ0giLCJzZWN0aW9uIiwicGFydGlhbCIsInVpZCIsIm1vZHNlcSIsIlNFQVJDSCIsImNvbW1hbmQiLCJ0YWciLCJjb3B5dWlkIiwic3JjU2VxU2V0IiwiZGVzdFNlcVNldCIsInVuZGVmaW5lZCIsImFwcGVuZHVpZCJdLCJtYXBwaW5ncyI6Ijs7QUFHQTs7QUFDQTs7QUFVQTs7QUFDQTs7QUFDQTs7OztBQWhCQTs7QUFDQTtBQWlCQUEsUUFBUSxDQUFDLGdCQUFELEVBQW1CLE1BQU07QUFDL0JDLEVBQUFBLEVBQUUsQ0FBQyw4Q0FBRCxFQUFpRCxNQUFNO0FBQ3ZEQyxJQUFBQSxNQUFNLENBQUMsbUNBQWU7QUFDcEJDLE1BQUFBLE9BQU8sRUFBRTtBQUNQQyxRQUFBQSxTQUFTLEVBQUU7QUFESjtBQURXLEtBQWYsQ0FBRCxDQUFOLENBSUlDLEVBSkosQ0FJT0MsRUFKUCxDQUlVQyxLQUpWO0FBS0QsR0FOQyxDQUFGO0FBUUFOLEVBQUFBLEVBQUUsQ0FBQyx5Q0FBRCxFQUE0QyxNQUFNO0FBQ2xEQyxJQUFBQSxNQUFNLENBQUMsbUNBQWU7QUFDcEJDLE1BQUFBLE9BQU8sRUFBRTtBQUNQQyxRQUFBQSxTQUFTLEVBQUUsQ0FBQztBQUNWSSxVQUFBQSxVQUFVLEVBQUUsQ0FDVixDQUNFLENBQUM7QUFDQ0MsWUFBQUEsSUFBSSxFQUFFLFFBRFA7QUFFQ0MsWUFBQUEsS0FBSyxFQUFFO0FBRlIsV0FBRCxFQUdHO0FBQ0RELFlBQUFBLElBQUksRUFBRSxRQURMO0FBRURDLFlBQUFBLEtBQUssRUFBRTtBQUZOLFdBSEgsQ0FERixDQURVLEVBU1AsSUFUTyxFQVNELElBVEM7QUFERixTQUFEO0FBREo7QUFEVyxLQUFmLENBQUQsQ0FBTixDQWdCSUwsRUFoQkosQ0FnQk9NLElBaEJQLENBZ0JZQyxLQWhCWixDQWdCa0I7QUFDaEJDLE1BQUFBLFFBQVEsRUFBRSxDQUFDO0FBQ1RDLFFBQUFBLE1BQU0sRUFBRSxRQURDO0FBRVRDLFFBQUFBLFNBQVMsRUFBRTtBQUZGLE9BQUQsQ0FETTtBQUtoQkMsTUFBQUEsS0FBSyxFQUFFLEtBTFM7QUFNaEJDLE1BQUFBLE1BQU0sRUFBRTtBQU5RLEtBaEJsQjtBQXdCRCxHQXpCQyxDQUFGO0FBMkJBaEIsRUFBQUEsRUFBRSxDQUFDLDhEQUFELEVBQWlFLE1BQU07QUFDdkVDLElBQUFBLE1BQU0sQ0FBQyxtQ0FBZTtBQUNwQkMsTUFBQUEsT0FBTyxFQUFFO0FBQ1BDLFFBQUFBLFNBQVMsRUFBRSxDQUFDO0FBQ1ZJLFVBQUFBLFVBQVUsRUFBRSxDQUNWO0FBQ0EsV0FDRSxDQUFDO0FBQ0NDLFlBQUFBLElBQUksRUFBRSxRQURQO0FBRUNDLFlBQUFBLEtBQUssRUFBRTtBQUZSLFdBQUQsRUFHRztBQUNERCxZQUFBQSxJQUFJLEVBQUUsUUFETDtBQUVEQyxZQUFBQSxLQUFLLEVBQUU7QUFGTixXQUhILENBREYsQ0FGVSxFQVdWO0FBQ0EsV0FDRSxDQUFDO0FBQ0NELFlBQUFBLElBQUksRUFBRSxRQURQO0FBRUNDLFlBQUFBLEtBQUssRUFBRTtBQUZSLFdBQUQsRUFHRztBQUNERCxZQUFBQSxJQUFJLEVBQUUsUUFETDtBQUVEQyxZQUFBQSxLQUFLLEVBQUU7QUFGTixXQUhILENBREYsQ0FaVSxFQXFCVjtBQUNBLFdBQ0UsQ0FBQztBQUNDRCxZQUFBQSxJQUFJLEVBQUUsUUFEUDtBQUVDQyxZQUFBQSxLQUFLLEVBQUU7QUFGUixXQUFELEVBR0c7QUFDREQsWUFBQUEsSUFBSSxFQUFFLFFBREw7QUFFREMsWUFBQUEsS0FBSyxFQUFFO0FBRk4sV0FISCxDQURGLEVBUUUsQ0FBQztBQUNDRCxZQUFBQSxJQUFJLEVBQUUsUUFEUDtBQUVDQyxZQUFBQSxLQUFLLEVBQUU7QUFGUixXQUFELEVBR0c7QUFDREQsWUFBQUEsSUFBSSxFQUFFLFFBREw7QUFFREMsWUFBQUEsS0FBSyxFQUFFO0FBRk4sV0FISCxDQVJGLENBdEJVO0FBREYsU0FBRDtBQURKO0FBRFcsS0FBZixDQUFELENBQU4sQ0E0Q0lMLEVBNUNKLENBNENPTSxJQTVDUCxDQTRDWUMsS0E1Q1osQ0E0Q2tCO0FBQ2hCQyxNQUFBQSxRQUFRLEVBQUUsQ0FBQztBQUNUQyxRQUFBQSxNQUFNLEVBQUUsRUFEQztBQUVUQyxRQUFBQSxTQUFTLEVBQUU7QUFGRixPQUFELENBRE07QUFLaEJDLE1BQUFBLEtBQUssRUFBRSxDQUFDO0FBQ05GLFFBQUFBLE1BQU0sRUFBRSxHQURGO0FBRU5DLFFBQUFBLFNBQVMsRUFBRTtBQUZMLE9BQUQsQ0FMUztBQVNoQkUsTUFBQUEsTUFBTSxFQUFFLENBQUM7QUFDUEgsUUFBQUEsTUFBTSxFQUFFLFVBREQ7QUFFUEMsUUFBQUEsU0FBUyxFQUFFO0FBRkosT0FBRCxFQUdMO0FBQ0RELFFBQUFBLE1BQU0sRUFBRSxVQURQO0FBRURDLFFBQUFBLFNBQVMsRUFBRTtBQUZWLE9BSEs7QUFUUSxLQTVDbEI7QUE2REQsR0E5REMsQ0FBRjtBQWdFQWQsRUFBQUEsRUFBRSxDQUFDLDZDQUFELEVBQWdELE1BQU07QUFDdERDLElBQUFBLE1BQU0sQ0FBQyxtQ0FBZTtBQUNwQkMsTUFBQUEsT0FBTyxFQUFFO0FBQ1BDLFFBQUFBLFNBQVMsRUFBRSxDQUNUO0FBQ0E7QUFDQSx3Q0FBTywwQkFBYSxnQ0FBYixDQUFQLENBSFM7QUFESjtBQURXLEtBQWYsQ0FBRCxDQUFOLENBUUlDLEVBUkosQ0FRT00sSUFSUCxDQVFZQyxLQVJaLENBUWtCO0FBQ2hCQyxNQUFBQSxRQUFRLEVBQUUsQ0FBQztBQUNUQyxRQUFBQSxNQUFNLEVBQUUsRUFEQztBQUVUQyxRQUFBQSxTQUFTLEVBQUU7QUFGRixPQUFELENBRE07QUFLaEJDLE1BQUFBLEtBQUssRUFBRSxLQUxTO0FBTWhCQyxNQUFBQSxNQUFNLEVBQUU7QUFOUSxLQVJsQjtBQWdCRCxHQWpCQyxDQUFGO0FBa0JELENBdEhPLENBQVI7QUF3SEFqQixRQUFRLENBQUMsYUFBRCxFQUFnQixNQUFNO0FBQzVCQyxFQUFBQSxFQUFFLENBQUMsa0NBQUQsRUFBcUMsTUFBTTtBQUMzQ0MsSUFBQUEsTUFBTSxDQUFDLGdDQUFZO0FBQ2pCZ0IsTUFBQUEsSUFBSSxFQUFFLFlBRFc7QUFFakJmLE1BQUFBLE9BQU8sRUFBRTtBQUNQZ0IsUUFBQUEsTUFBTSxFQUFFLENBQUM7QUFDUEMsVUFBQUEsRUFBRSxFQUFFO0FBREcsU0FBRCxDQUREO0FBSVBDLFFBQUFBLEtBQUssRUFBRSxDQUFDO0FBQ05iLFVBQUFBLFVBQVUsRUFBRSxDQUNWLENBQUM7QUFDQ0MsWUFBQUEsSUFBSSxFQUFFLE1BRFA7QUFFQ0MsWUFBQUEsS0FBSyxFQUFFO0FBRlIsV0FBRCxFQUdHO0FBQ0RELFlBQUFBLElBQUksRUFBRSxNQURMO0FBRURDLFlBQUFBLEtBQUssRUFBRTtBQUZOLFdBSEgsQ0FEVTtBQUROLFNBQUQsQ0FKQTtBQWVQWSxRQUFBQSxFQUFFLEVBQUUsQ0FBQztBQUNISixVQUFBQSxJQUFJLEVBQUUsZ0JBREg7QUFFSEssVUFBQUEsY0FBYyxFQUFFLENBQUMsWUFBRCxFQUFlLFdBQWY7QUFGYixTQUFELEVBR0Q7QUFDREwsVUFBQUEsSUFBSSxFQUFFLGFBREw7QUFFRE0sVUFBQUEsV0FBVyxFQUFFO0FBRlosU0FIQyxFQU1EO0FBQ0ROLFVBQUFBLElBQUksRUFBRSxTQURMO0FBRURPLFVBQUFBLE9BQU8sRUFBRTtBQUZSLFNBTkMsRUFTRDtBQUNEUCxVQUFBQSxJQUFJLEVBQUUsZUFETDtBQUVEUSxVQUFBQSxhQUFhLEVBQUU7QUFGZCxTQVRDO0FBZkc7QUFGUSxLQUFaLENBQUQsQ0FBTixDQStCSXJCLEVBL0JKLENBK0JPTSxJQS9CUCxDQStCWUMsS0EvQlosQ0ErQmtCO0FBQ2hCZSxNQUFBQSxNQUFNLEVBQUUsR0FEUTtBQUVoQkMsTUFBQUEsS0FBSyxFQUFFLENBQUMsWUFBRCxFQUFlLFdBQWYsQ0FGUztBQUdoQkMsTUFBQUEsYUFBYSxFQUFFLFNBSEM7QUFJaEJDLE1BQUFBLGNBQWMsRUFBRSxDQUFDLFlBQUQsRUFBZSxXQUFmLENBSkE7QUFLaEJDLE1BQUFBLFFBQVEsRUFBRSxLQUxNO0FBTWhCQyxNQUFBQSxPQUFPLEVBQUUsS0FOTztBQU9oQkMsTUFBQUEsV0FBVyxFQUFFO0FBUEcsS0EvQmxCO0FBd0NELEdBekNDLENBQUY7QUEyQ0FoQyxFQUFBQSxFQUFFLENBQUMsc0NBQUQsRUFBeUMsTUFBTTtBQUMvQ0MsSUFBQUEsTUFBTSxDQUFDLGdDQUFZO0FBQ2pCZ0IsTUFBQUEsSUFBSSxFQUFFLFlBRFc7QUFFakJmLE1BQUFBLE9BQU8sRUFBRTtBQUNQZ0IsUUFBQUEsTUFBTSxFQUFFLENBQUM7QUFDUEMsVUFBQUEsRUFBRSxFQUFFO0FBREcsU0FBRCxDQUREO0FBSVBDLFFBQUFBLEtBQUssRUFBRSxDQUFDO0FBQ05iLFVBQUFBLFVBQVUsRUFBRSxDQUNWLENBQUM7QUFDQ0MsWUFBQUEsSUFBSSxFQUFFLE1BRFA7QUFFQ0MsWUFBQUEsS0FBSyxFQUFFO0FBRlIsV0FBRCxFQUdHO0FBQ0RELFlBQUFBLElBQUksRUFBRSxNQURMO0FBRURDLFlBQUFBLEtBQUssRUFBRTtBQUZOLFdBSEgsQ0FEVTtBQUROLFNBQUQsQ0FKQTtBQWVQWSxRQUFBQSxFQUFFLEVBQUUsQ0FBQztBQUNISixVQUFBQSxJQUFJLEVBQUUsZ0JBREg7QUFFSEssVUFBQUEsY0FBYyxFQUFFLENBQUMsWUFBRCxFQUFlLFdBQWY7QUFGYixTQUFELEVBR0Q7QUFDREwsVUFBQUEsSUFBSSxFQUFFLGFBREw7QUFFRE0sVUFBQUEsV0FBVyxFQUFFO0FBRlosU0FIQyxFQU1EO0FBQ0ROLFVBQUFBLElBQUksRUFBRSxTQURMO0FBRURPLFVBQUFBLE9BQU8sRUFBRTtBQUZSLFNBTkM7QUFmRztBQUZRLEtBQVosQ0FBRCxDQUFOLENBNEJJcEIsRUE1QkosQ0E0Qk9NLElBNUJQLENBNEJZQyxLQTVCWixDQTRCa0I7QUFDaEJlLE1BQUFBLE1BQU0sRUFBRSxHQURRO0FBRWhCQyxNQUFBQSxLQUFLLEVBQUUsQ0FBQyxZQUFELEVBQWUsV0FBZixDQUZTO0FBR2hCRSxNQUFBQSxjQUFjLEVBQUUsQ0FBQyxZQUFELEVBQWUsV0FBZixDQUhBO0FBSWhCQyxNQUFBQSxRQUFRLEVBQUUsS0FKTTtBQUtoQkMsTUFBQUEsT0FBTyxFQUFFLEtBTE87QUFNaEJDLE1BQUFBLFdBQVcsRUFBRTtBQU5HLEtBNUJsQjtBQW9DRCxHQXJDQyxDQUFGO0FBdUNBaEMsRUFBQUEsRUFBRSxDQUFDLHNDQUFELEVBQXlDLE1BQU07QUFDL0NDLElBQUFBLE1BQU0sQ0FBQyxnQ0FBWTtBQUNqQmdCLE1BQUFBLElBQUksRUFBRSxXQURXO0FBRWpCZixNQUFBQSxPQUFPLEVBQUU7QUFDUGdCLFFBQUFBLE1BQU0sRUFBRSxDQUFDO0FBQ1BDLFVBQUFBLEVBQUUsRUFBRTtBQURHLFNBQUQsQ0FERDtBQUlQQyxRQUFBQSxLQUFLLEVBQUUsQ0FBQztBQUNOYixVQUFBQSxVQUFVLEVBQUUsQ0FDVixDQUFDO0FBQ0NDLFlBQUFBLElBQUksRUFBRSxNQURQO0FBRUNDLFlBQUFBLEtBQUssRUFBRTtBQUZSLFdBQUQsRUFHRztBQUNERCxZQUFBQSxJQUFJLEVBQUUsTUFETDtBQUVEQyxZQUFBQSxLQUFLLEVBQUU7QUFGTixXQUhILENBRFU7QUFETixTQUFELENBSkE7QUFlUFksUUFBQUEsRUFBRSxFQUFFLENBQUM7QUFDSEosVUFBQUEsSUFBSSxFQUFFLGdCQURIO0FBRUhLLFVBQUFBLGNBQWMsRUFBRSxDQUFDLFlBQUQsRUFBZSxXQUFmO0FBRmIsU0FBRCxFQUdEO0FBQ0RMLFVBQUFBLElBQUksRUFBRSxhQURMO0FBRURNLFVBQUFBLFdBQVcsRUFBRTtBQUZaLFNBSEMsRUFNRDtBQUNETixVQUFBQSxJQUFJLEVBQUUsU0FETDtBQUVETyxVQUFBQSxPQUFPLEVBQUU7QUFGUixTQU5DO0FBZkc7QUFGUSxLQUFaLENBQUQsQ0FBTixDQTRCSXBCLEVBNUJKLENBNEJPTSxJQTVCUCxDQTRCWUMsS0E1QlosQ0E0QmtCO0FBQ2hCZSxNQUFBQSxNQUFNLEVBQUUsR0FEUTtBQUVoQkMsTUFBQUEsS0FBSyxFQUFFLENBQUMsWUFBRCxFQUFlLFdBQWYsQ0FGUztBQUdoQkUsTUFBQUEsY0FBYyxFQUFFLENBQUMsWUFBRCxFQUFlLFdBQWYsQ0FIQTtBQUloQkMsTUFBQUEsUUFBUSxFQUFFLElBSk07QUFLaEJDLE1BQUFBLE9BQU8sRUFBRSxLQUxPO0FBTWhCQyxNQUFBQSxXQUFXLEVBQUU7QUFORyxLQTVCbEI7QUFvQ0QsR0FyQ0MsQ0FBRjtBQXVDQWhDLEVBQUFBLEVBQUUsQ0FBQywwQ0FBRCxFQUE2QyxNQUFNO0FBQ25EQyxJQUFBQSxNQUFNLENBQUMsZ0NBQVk7QUFDakJnQixNQUFBQSxJQUFJLEVBQUUsWUFEVztBQUVqQmYsTUFBQUEsT0FBTyxFQUFFO0FBQ1BnQixRQUFBQSxNQUFNLEVBQUUsQ0FBQztBQUNQQyxVQUFBQSxFQUFFLEVBQUU7QUFERyxTQUFELENBREQ7QUFJUEMsUUFBQUEsS0FBSyxFQUFFLENBQUM7QUFDTmIsVUFBQUEsVUFBVSxFQUFFLENBQ1YsQ0FBQztBQUNDQyxZQUFBQSxJQUFJLEVBQUUsTUFEUDtBQUVDQyxZQUFBQSxLQUFLLEVBQUU7QUFGUixXQUFELEVBR0c7QUFDREQsWUFBQUEsSUFBSSxFQUFFLE1BREw7QUFFREMsWUFBQUEsS0FBSyxFQUFFO0FBRk4sV0FISCxDQURVO0FBRE4sU0FBRCxDQUpBO0FBZVBZLFFBQUFBLEVBQUUsRUFBRSxDQUFDO0FBQ0hKLFVBQUFBLElBQUksRUFBRSxnQkFESDtBQUVISyxVQUFBQSxjQUFjLEVBQUUsQ0FBQyxZQUFELEVBQWUsV0FBZjtBQUZiLFNBQUQsRUFHRDtBQUNETCxVQUFBQSxJQUFJLEVBQUUsYUFETDtBQUVETSxVQUFBQSxXQUFXLEVBQUU7QUFGWixTQUhDLEVBTUQ7QUFDRE4sVUFBQUEsSUFBSSxFQUFFLFNBREw7QUFFRE8sVUFBQUEsT0FBTyxFQUFFO0FBRlIsU0FOQyxFQVNEO0FBQ0RQLFVBQUFBLElBQUksRUFBRTtBQURMLFNBVEM7QUFmRztBQUZRLEtBQVosQ0FBRCxDQUFOLENBOEJJYixFQTlCSixDQThCT00sSUE5QlAsQ0E4QllDLEtBOUJaLENBOEJrQjtBQUNoQmUsTUFBQUEsTUFBTSxFQUFFLEdBRFE7QUFFaEJDLE1BQUFBLEtBQUssRUFBRSxDQUFDLFlBQUQsRUFBZSxXQUFmLENBRlM7QUFHaEJFLE1BQUFBLGNBQWMsRUFBRSxDQUFDLFlBQUQsRUFBZSxXQUFmLENBSEE7QUFJaEJDLE1BQUFBLFFBQVEsRUFBRSxLQUpNO0FBS2hCQyxNQUFBQSxPQUFPLEVBQUUsS0FMTztBQU1oQkMsTUFBQUEsV0FBVyxFQUFFLENBTkc7QUFPaEJDLE1BQUFBLFFBQVEsRUFBRTtBQVBNLEtBOUJsQjtBQXVDRCxHQXhDQyxDQUFGO0FBeUNELENBbktPLENBQVI7QUFxS0FsQyxRQUFRLENBQUMsZUFBRCxFQUFrQixNQUFNO0FBQzlCQyxFQUFBQSxFQUFFLENBQUMsK0JBQUQsRUFBa0MsTUFBTTtBQUN4Q0MsSUFBQUEsTUFBTSxDQUFDLGtDQUFjaUMsa0JBQWFDLE1BQTNCLENBQUQsQ0FBTixDQUEyQy9CLEVBQTNDLENBQThDTSxJQUE5QyxDQUFtREMsS0FBbkQsQ0FBeUR1QixrQkFBYUUsTUFBdEU7QUFDRCxHQUZDLENBQUY7QUFHRCxDQUpPLENBQVI7QUFNQXJDLFFBQVEsQ0FBQyxvQkFBRCxFQUF1QixNQUFNO0FBQ25DQyxFQUFBQSxFQUFFLENBQUMsbUNBQUQsRUFBc0MsTUFBTTtBQUM1Q0MsSUFBQUEsTUFBTSxDQUFDLHVDQUFtQm9DLGtDQUFZRixNQUEvQixDQUFELENBQU4sQ0FBK0MvQixFQUEvQyxDQUFrRE0sSUFBbEQsQ0FBdURDLEtBQXZELENBQTZEMEIsa0NBQVlELE1BQXpFO0FBQ0QsR0FGQyxDQUFGO0FBSUFwQyxFQUFBQSxFQUFFLENBQUMsa0RBQUQsRUFBcUQsTUFBTTtBQUMzRCxRQUFJc0MsS0FBSyxHQUFHLENBQ1YsQ0FDRTtBQUFFOUIsTUFBQUEsSUFBSSxFQUFFLFFBQVI7QUFBa0JDLE1BQUFBLEtBQUssRUFBRTtBQUF6QixLQURGLEVBRUU7QUFBRUQsTUFBQUEsSUFBSSxFQUFFLFFBQVI7QUFBa0JDLE1BQUFBLEtBQUssRUFBRTtBQUF6QixLQUZGLEVBR0UsSUFIRixFQUlFLElBSkYsRUFLRSxJQUxGLEVBTUU7QUFBRUQsTUFBQUEsSUFBSSxFQUFFLFFBQVI7QUFBa0JDLE1BQUFBLEtBQUssRUFBRTtBQUF6QixLQU5GLEVBT0U7QUFBRUQsTUFBQUEsSUFBSSxFQUFFLE1BQVI7QUFBZ0JDLE1BQUFBLEtBQUssRUFBRTtBQUF2QixLQVBGLEVBUUUsSUFSRixFQVNFLENBQ0U7QUFBRUQsTUFBQUEsSUFBSSxFQUFFLFFBQVI7QUFBa0JDLE1BQUFBLEtBQUssRUFBRTtBQUF6QixLQURGLEVBRUUsQ0FDRTtBQUFFRCxNQUFBQSxJQUFJLEVBQUUsUUFBUjtBQUFrQkMsTUFBQUEsS0FBSyxFQUFFO0FBQXpCLEtBREYsRUFFRTtBQUFFRCxNQUFBQSxJQUFJLEVBQUUsUUFBUjtBQUFrQkMsTUFBQUEsS0FBSyxFQUFFO0FBQXpCLEtBRkYsQ0FGRixDQVRGLEVBZ0JFLElBaEJGLENBRFUsRUFtQlY7QUFBRUQsTUFBQUEsSUFBSSxFQUFFLFFBQVI7QUFBa0JDLE1BQUFBLEtBQUssRUFBRTtBQUF6QixLQW5CVSxFQW9CVixDQUNFO0FBQUVELE1BQUFBLElBQUksRUFBRSxRQUFSO0FBQWtCQyxNQUFBQSxLQUFLLEVBQUU7QUFBekIsS0FERixFQUVFO0FBQUVELE1BQUFBLElBQUksRUFBRSxRQUFSO0FBQWtCQyxNQUFBQSxLQUFLLEVBQUU7QUFBekIsS0FGRixDQXBCVSxFQXdCVixJQXhCVSxFQXlCVixJQXpCVSxDQUFaO0FBNEJBLFFBQUk4QixRQUFRLEdBQUc7QUFDYkMsTUFBQUEsVUFBVSxFQUFFLENBQUM7QUFDWEMsUUFBQUEsSUFBSSxFQUFFLEdBREs7QUFFWGpDLFFBQUFBLElBQUksRUFBRSwwQkFGSztBQUdYa0MsUUFBQUEsUUFBUSxFQUFFLFFBSEM7QUFJWEMsUUFBQUEsSUFBSSxFQUFFLEVBSks7QUFLWEMsUUFBQUEsV0FBVyxFQUFFLFlBTEY7QUFNWEMsUUFBQUEscUJBQXFCLEVBQUU7QUFDckJDLFVBQUFBLFFBQVEsRUFBRTtBQURXO0FBTlosT0FBRCxDQURDO0FBV2J0QyxNQUFBQSxJQUFJLEVBQUUsaUJBWE87QUFZYnVDLE1BQUFBLFVBQVUsRUFBRTtBQUNWQyxRQUFBQSxRQUFRLEVBQUU7QUFEQTtBQVpDLEtBQWY7QUFpQkEvQyxJQUFBQSxNQUFNLENBQUMsdUNBQW1CcUMsS0FBbkIsQ0FBRCxDQUFOLENBQWtDbEMsRUFBbEMsQ0FBcUNNLElBQXJDLENBQTBDQyxLQUExQyxDQUFnRDRCLFFBQWhEO0FBQ0QsR0EvQ0MsQ0FBRjtBQWdERCxDQXJETyxDQUFSO0FBdURBeEMsUUFBUSxDQUFDLFlBQUQsRUFBZSxNQUFNO0FBQzNCQyxFQUFBQSxFQUFFLENBQUMscUNBQUQsRUFBd0MsTUFBTTtBQUM5Q0MsSUFBQUEsTUFBTSxDQUFDLCtCQUFXO0FBQ2hCQyxNQUFBQSxPQUFPLEVBQUU7QUFDUCtDLFFBQUFBLEtBQUssRUFBRSxDQUFDO0FBQ045QixVQUFBQSxFQUFFLEVBQUUsR0FERTtBQUVOWixVQUFBQSxVQUFVLEVBQUUsQ0FDVixDQUFDO0FBQ0NDLFlBQUFBLElBQUksRUFBRSxNQURQO0FBRUNDLFlBQUFBLEtBQUssRUFBRSxNQUZSO0FBR0N5QyxZQUFBQSxPQUFPLEVBQUUsQ0FBQztBQUNSMUMsY0FBQUEsSUFBSSxFQUFFLE1BREU7QUFFUkMsY0FBQUEsS0FBSyxFQUFFO0FBRkMsYUFBRCxFQUlULENBQUM7QUFDQ0QsY0FBQUEsSUFBSSxFQUFFLE1BRFA7QUFFQ0MsY0FBQUEsS0FBSyxFQUFFO0FBRlIsYUFBRCxFQUdHO0FBQ0RELGNBQUFBLElBQUksRUFBRSxNQURMO0FBRURDLGNBQUFBLEtBQUssRUFBRTtBQUZOLGFBSEgsQ0FKUyxDQUhWO0FBZUMwQyxZQUFBQSxPQUFPLEVBQUUsQ0FBQyxDQUFELEVBQUksR0FBSjtBQWZWLFdBQUQsRUFnQkc7QUFDRDNDLFlBQUFBLElBQUksRUFBRSxNQURMO0FBRURDLFlBQUFBLEtBQUssRUFBRTtBQUZOLFdBaEJILENBRFU7QUFGTixTQUFEO0FBREE7QUFETyxLQUFYLENBQUQsQ0FBTixDQTRCSUwsRUE1QkosQ0E0Qk9NLElBNUJQLENBNEJZQyxLQTVCWixDQTRCa0IsQ0FBQztBQUNqQixXQUFLLEdBRFk7QUFFakIsNENBQXNDO0FBRnJCLEtBQUQsQ0E1QmxCO0FBZ0NELEdBakNDLENBQUY7QUFtQ0FYLEVBQUFBLEVBQUUsQ0FBQywwREFBRCxFQUE2RCxNQUFNO0FBQ25FQyxJQUFBQSxNQUFNLENBQUMsK0JBQVc7QUFDaEJDLE1BQUFBLE9BQU8sRUFBRTtBQUNQK0MsUUFBQUEsS0FBSyxFQUFFLENBQUM7QUFDTjlCLFVBQUFBLEVBQUUsRUFBRSxHQURFO0FBRU5aLFVBQUFBLFVBQVUsRUFBRSxDQUNWLENBQUM7QUFDQ0MsWUFBQUEsSUFBSSxFQUFFLE1BRFA7QUFFQ0MsWUFBQUEsS0FBSyxFQUFFO0FBRlIsV0FBRCxFQUdHO0FBQ0RELFlBQUFBLElBQUksRUFBRSxNQURMO0FBRURDLFlBQUFBLEtBQUssRUFBRTtBQUZOLFdBSEgsQ0FEVTtBQUZOLFNBQUQsRUFXSjtBQUNEVSxVQUFBQSxFQUFFLEVBQUUsR0FESDtBQUVEWixVQUFBQSxVQUFVLEVBQUUsQ0FDVixDQUFDO0FBQ0NDLFlBQUFBLElBQUksRUFBRSxNQURQO0FBRUNDLFlBQUFBLEtBQUssRUFBRTtBQUZSLFdBQUQsRUFHRztBQUNERCxZQUFBQSxJQUFJLEVBQUUsTUFETDtBQUVEQyxZQUFBQSxLQUFLLEVBQUU7QUFGTixXQUhILENBRFU7QUFGWCxTQVhJLEVBc0JKO0FBQ0RVLFVBQUFBLEVBQUUsRUFBRSxHQURIO0FBRURaLFVBQUFBLFVBQVUsRUFBRSxDQUNWLENBQUM7QUFDQ0MsWUFBQUEsSUFBSSxFQUFFLE1BRFA7QUFFQ0MsWUFBQUEsS0FBSyxFQUFFO0FBRlIsV0FBRCxFQUdHO0FBQ0RELFlBQUFBLElBQUksRUFBRSxNQURMO0FBRURDLFlBQUFBLEtBQUssRUFBRTtBQUZOLFdBSEgsQ0FEVTtBQUZYLFNBdEJJO0FBREE7QUFETyxLQUFYLENBQUQsQ0FBTixDQXFDSUwsRUFyQ0osQ0FxQ09NLElBckNQLENBcUNZQyxLQXJDWixDQXFDa0IsQ0FBQztBQUNqQixXQUFLLEdBRFk7QUFFakJ5QyxNQUFBQSxHQUFHLEVBQUUsR0FGWTtBQUdqQkMsTUFBQUEsTUFBTSxFQUFFO0FBSFMsS0FBRCxFQUlmO0FBQ0QsV0FBSyxHQURKO0FBRURELE1BQUFBLEdBQUcsRUFBRTtBQUZKLEtBSmUsQ0FyQ2xCO0FBNkNELEdBOUNDLENBQUY7QUErQ0QsQ0FuRk8sQ0FBUjtBQXFGQXJELFFBQVEsQ0FBQyxhQUFELEVBQWdCLE1BQU07QUFDNUJDLEVBQUFBLEVBQUUsQ0FBQyw4QkFBRCxFQUFpQyxNQUFNO0FBQ3ZDQyxJQUFBQSxNQUFNLENBQUMsZ0NBQVk7QUFDakJDLE1BQUFBLE9BQU8sRUFBRTtBQUNQb0QsUUFBQUEsTUFBTSxFQUFFLENBQUM7QUFDUC9DLFVBQUFBLFVBQVUsRUFBRSxDQUFDO0FBQ1hFLFlBQUFBLEtBQUssRUFBRTtBQURJLFdBQUQsRUFFVDtBQUNEQSxZQUFBQSxLQUFLLEVBQUU7QUFETixXQUZTO0FBREwsU0FBRCxFQU1MO0FBQ0RGLFVBQUFBLFVBQVUsRUFBRSxDQUFDO0FBQ1hFLFlBQUFBLEtBQUssRUFBRTtBQURJLFdBQUQ7QUFEWCxTQU5LO0FBREQ7QUFEUSxLQUFaLENBQUQsQ0FBTixDQWNJTCxFQWRKLENBY09NLElBZFAsQ0FjWUMsS0FkWixDQWNrQixDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxDQWRsQjtBQWVELEdBaEJDLENBQUY7QUFrQkFYLEVBQUFBLEVBQUUsQ0FBQyxvQ0FBRCxFQUF1QyxNQUFNO0FBQzdDQyxJQUFBQSxNQUFNLENBQUMsZ0NBQVk7QUFDakJDLE1BQUFBLE9BQU8sRUFBRTtBQUNQb0QsUUFBQUEsTUFBTSxFQUFFLENBQUM7QUFDUEMsVUFBQUEsT0FBTyxFQUFFLFFBREY7QUFFUEMsVUFBQUEsR0FBRyxFQUFFO0FBRkUsU0FBRDtBQUREO0FBRFEsS0FBWixDQUFELENBQU4sQ0FPSXBELEVBUEosQ0FPT00sSUFQUCxDQU9ZQyxLQVBaLENBT2tCLEVBUGxCO0FBUUQsR0FUQyxDQUFGO0FBVUQsQ0E3Qk8sQ0FBUjtBQStCQVosUUFBUSxDQUFDLFdBQUQsRUFBYyxNQUFNO0FBQzFCQyxFQUFBQSxFQUFFLENBQUMsNEJBQUQsRUFBK0IsTUFBTTtBQUNyQ0MsSUFBQUEsTUFBTSxDQUFDLDhCQUFVO0FBQ2Z3RCxNQUFBQSxPQUFPLEVBQUUsQ0FBQyxHQUFELEVBQU0sS0FBTixFQUFhLE9BQWI7QUFETSxLQUFWLENBQUQsQ0FBTixDQUVJckQsRUFGSixDQUVPTSxJQUZQLENBRVlDLEtBRlosQ0FFa0I7QUFDaEIrQyxNQUFBQSxTQUFTLEVBQUUsS0FESztBQUVoQkMsTUFBQUEsVUFBVSxFQUFFO0FBRkksS0FGbEI7QUFNRCxHQVBDLENBQUY7QUFTQTNELEVBQUFBLEVBQUUsQ0FBQyxnRUFBRCxFQUFtRSxNQUFNO0FBQ3pFQyxJQUFBQSxNQUFNLENBQUMsOEJBQVUsRUFBVixDQUFELENBQU4sQ0FBc0JHLEVBQXRCLENBQXlCTyxLQUF6QixDQUErQmlELFNBQS9CO0FBQ0QsR0FGQyxDQUFGO0FBSUE1RCxFQUFBQSxFQUFFLENBQUMsc0RBQUQsRUFBeUQsTUFBTTtBQUMvREMsSUFBQUEsTUFBTSxDQUFDLCtCQUFELENBQU4sQ0FBb0JHLEVBQXBCLENBQXVCTyxLQUF2QixDQUE2QmlELFNBQTdCO0FBQ0QsR0FGQyxDQUFGO0FBR0QsQ0FqQk8sQ0FBUjtBQW1CQTdELFFBQVEsQ0FBQyxhQUFELEVBQWdCLE1BQU07QUFDNUJDLEVBQUFBLEVBQUUsQ0FBQyw4QkFBRCxFQUFpQyxNQUFNO0FBQ3ZDQyxJQUFBQSxNQUFNLENBQUMsZ0NBQVk7QUFDakI0RCxNQUFBQSxTQUFTLEVBQUUsQ0FBQyxHQUFELEVBQU0sR0FBTjtBQURNLEtBQVosQ0FBRCxDQUFOLENBRUl6RCxFQUZKLENBRU9PLEtBRlAsQ0FFYSxHQUZiO0FBR0QsR0FKQyxDQUFGO0FBTUFYLEVBQUFBLEVBQUUsQ0FBQyxnRUFBRCxFQUFtRSxNQUFNO0FBQ3pFQyxJQUFBQSxNQUFNLENBQUMsZ0NBQVksRUFBWixDQUFELENBQU4sQ0FBd0JHLEVBQXhCLENBQTJCTyxLQUEzQixDQUFpQ2lELFNBQWpDO0FBQ0QsR0FGQyxDQUFGO0FBSUE1RCxFQUFBQSxFQUFFLENBQUMsc0RBQUQsRUFBeUQsTUFBTTtBQUMvREMsSUFBQUEsTUFBTSxDQUFDLGlDQUFELENBQU4sQ0FBc0JHLEVBQXRCLENBQXlCTyxLQUF6QixDQUErQmlELFNBQS9CO0FBQ0QsR0FGQyxDQUFGO0FBR0QsQ0FkTyxDQUFSIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLWV4cHJlc3Npb25zICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11c2VsZXNzLWVzY2FwZSAqL1xuXG5pbXBvcnQgeyBwYXJzZXIgfSBmcm9tICdlbWFpbGpzLWltYXAtaGFuZGxlcidcbmltcG9ydCB7XG4gIHBhcnNlQVBQRU5ELFxuICBwYXJzZUNPUFksXG4gIHBhcnNlU0VBUkNILFxuICBwYXJzZU5BTUVTUEFDRSxcbiAgcGFyc2VFTlZFTE9QRSxcbiAgcGFyc2VTRUxFQ1QsXG4gIHBhcnNlQk9EWVNUUlVDVFVSRSxcbiAgcGFyc2VGRVRDSFxufSBmcm9tICcuL2NvbW1hbmQtcGFyc2VyJ1xuaW1wb3J0IHsgdG9UeXBlZEFycmF5IH0gZnJvbSAnLi9jb21tb24nXG5pbXBvcnQgdGVzdEVudmVsb3BlIGZyb20gJy4uL3Jlcy9maXh0dXJlcy9lbnZlbG9wZSdcbmltcG9ydCBtaW1lVG9ydHVyZSBmcm9tICcuLi9yZXMvZml4dHVyZXMvbWltZS10b3J0dXJlLWJvZHlzdHJ1Y3R1cmUnXG5cbmRlc2NyaWJlKCdwYXJzZU5BTUVTUEFDRScsICgpID0+IHtcbiAgaXQoJ3Nob3VsZCBub3Qgc3VjY2VlZCBmb3Igbm8gbmFtZXNwYWNlIHJlc3BvbnNlJywgKCkgPT4ge1xuICAgIGV4cGVjdChwYXJzZU5BTUVTUEFDRSh7XG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIE5BTUVTUEFDRTogW11cbiAgICAgIH1cbiAgICB9KSkudG8uYmUuZmFsc2VcbiAgfSlcblxuICBpdCgnc2hvdWxkIHJldHVybiBzaW5nbGUgcGVyc29uYWwgbmFtZXNwYWNlJywgKCkgPT4ge1xuICAgIGV4cGVjdChwYXJzZU5BTUVTUEFDRSh7XG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIE5BTUVTUEFDRTogW3tcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBbXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIFt7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1NUUklORycsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICdJTkJPWC4nXG4gICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnU1RSSU5HJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJy4nXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICBdLCBudWxsLCBudWxsXG4gICAgICAgICAgXVxuICAgICAgICB9XVxuICAgICAgfVxuICAgIH0pKS50by5kZWVwLmVxdWFsKHtcbiAgICAgIHBlcnNvbmFsOiBbe1xuICAgICAgICBwcmVmaXg6ICdJTkJPWC4nLFxuICAgICAgICBkZWxpbWl0ZXI6ICcuJ1xuICAgICAgfV0sXG4gICAgICB1c2VyczogZmFsc2UsXG4gICAgICBzaGFyZWQ6IGZhbHNlXG4gICAgfSlcbiAgfSlcblxuICBpdCgnc2hvdWxkIHJldHVybiBzaW5nbGUgcGVyc29uYWwsIHNpbmdsZSB1c2VycywgbXVsdGlwbGUgc2hhcmVkJywgKCkgPT4ge1xuICAgIGV4cGVjdChwYXJzZU5BTUVTUEFDRSh7XG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIE5BTUVTUEFDRTogW3tcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBbXG4gICAgICAgICAgICAvLyBwZXJzb25hbFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBbe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdTVFJJTkcnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnJ1xuICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1NUUklORycsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICcvJ1xuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIC8vIHVzZXJzXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIFt7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1NUUklORycsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICd+J1xuICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1NUUklORycsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICcvJ1xuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIC8vIHNoYXJlZFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBbe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdTVFJJTkcnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnI3NoYXJlZC8nXG4gICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnU1RSSU5HJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJy8nXG4gICAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgICBbe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdTVFJJTkcnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnI3B1YmxpYy8nXG4gICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnU1RSSU5HJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJy8nXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICBdXG4gICAgICAgICAgXVxuICAgICAgICB9XVxuICAgICAgfVxuICAgIH0pKS50by5kZWVwLmVxdWFsKHtcbiAgICAgIHBlcnNvbmFsOiBbe1xuICAgICAgICBwcmVmaXg6ICcnLFxuICAgICAgICBkZWxpbWl0ZXI6ICcvJ1xuICAgICAgfV0sXG4gICAgICB1c2VyczogW3tcbiAgICAgICAgcHJlZml4OiAnficsXG4gICAgICAgIGRlbGltaXRlcjogJy8nXG4gICAgICB9XSxcbiAgICAgIHNoYXJlZDogW3tcbiAgICAgICAgcHJlZml4OiAnI3NoYXJlZC8nLFxuICAgICAgICBkZWxpbWl0ZXI6ICcvJ1xuICAgICAgfSwge1xuICAgICAgICBwcmVmaXg6ICcjcHVibGljLycsXG4gICAgICAgIGRlbGltaXRlcjogJy8nXG4gICAgICB9XVxuICAgIH0pXG4gIH0pXG5cbiAgaXQoJ3Nob3VsZCBoYW5kbGUgTklMIG5hbWVzcGFjZSBoaWVyYXJjaHkgZGVsaW0nLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlTkFNRVNQQUNFKHtcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgTkFNRVNQQUNFOiBbXG4gICAgICAgICAgLy8gVGhpcyBzcGVjaWZpYyB2YWx1ZSBpcyByZXR1cm5lZCBieSB5YWhvby5jby5qcCdzXG4gICAgICAgICAgLy8gaW1hcGdhdGUgdmVyc2lvbiAwLjcuNjhfMTFfMS42MTQ3NSBJTUFQIHNlcnZlclxuICAgICAgICAgIHBhcnNlcih0b1R5cGVkQXJyYXkoJyogTkFNRVNQQUNFICgoXCJcIiBOSUwpKSBOSUwgTklMJykpXG4gICAgICAgIF1cbiAgICAgIH1cbiAgICB9KSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICBwZXJzb25hbDogW3tcbiAgICAgICAgcHJlZml4OiAnJyxcbiAgICAgICAgZGVsaW1pdGVyOiBudWxsXG4gICAgICB9XSxcbiAgICAgIHVzZXJzOiBmYWxzZSxcbiAgICAgIHNoYXJlZDogZmFsc2VcbiAgICB9KVxuICB9KVxufSlcblxuZGVzY3JpYmUoJ3BhcnNlU0VMRUNUJywgKCkgPT4ge1xuICBpdCgnc2hvdWxkIHBhcnNlIGEgY29tcGxldGUgcmVzcG9uc2UnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlU0VMRUNUKHtcbiAgICAgIGNvZGU6ICdSRUFELVdSSVRFJyxcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgRVhJU1RTOiBbe1xuICAgICAgICAgIG5yOiAxMjNcbiAgICAgICAgfV0sXG4gICAgICAgIEZMQUdTOiBbe1xuICAgICAgICAgIGF0dHJpYnV0ZXM6IFtcbiAgICAgICAgICAgIFt7XG4gICAgICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdcXFxcQW5zd2VyZWQnXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdcXFxcRmxhZ2dlZCdcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgXVxuICAgICAgICB9XSxcbiAgICAgICAgT0s6IFt7XG4gICAgICAgICAgY29kZTogJ1BFUk1BTkVOVEZMQUdTJyxcbiAgICAgICAgICBwZXJtYW5lbnRmbGFnczogWydcXFxcQW5zd2VyZWQnLCAnXFxcXEZsYWdnZWQnXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgY29kZTogJ1VJRFZBTElESVRZJyxcbiAgICAgICAgICB1aWR2YWxpZGl0eTogJzInXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBjb2RlOiAnVUlETkVYVCcsXG4gICAgICAgICAgdWlkbmV4dDogJzM4MzYxJ1xuICAgICAgICB9LCB7XG4gICAgICAgICAgY29kZTogJ0hJR0hFU1RNT0RTRVEnLFxuICAgICAgICAgIGhpZ2hlc3Rtb2RzZXE6ICczNjgyOTE4J1xuICAgICAgICB9XVxuICAgICAgfVxuICAgIH0pKS50by5kZWVwLmVxdWFsKHtcbiAgICAgIGV4aXN0czogMTIzLFxuICAgICAgZmxhZ3M6IFsnXFxcXEFuc3dlcmVkJywgJ1xcXFxGbGFnZ2VkJ10sXG4gICAgICBoaWdoZXN0TW9kc2VxOiAnMzY4MjkxOCcsXG4gICAgICBwZXJtYW5lbnRGbGFnczogWydcXFxcQW5zd2VyZWQnLCAnXFxcXEZsYWdnZWQnXSxcbiAgICAgIHJlYWRPbmx5OiBmYWxzZSxcbiAgICAgIHVpZE5leHQ6IDM4MzYxLFxuICAgICAgdWlkVmFsaWRpdHk6IDJcbiAgICB9KVxuICB9KVxuXG4gIGl0KCdzaG91bGQgcGFyc2UgcmVzcG9uc2Ugd2l0aCBubyBtb2RzZXEnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlU0VMRUNUKHtcbiAgICAgIGNvZGU6ICdSRUFELVdSSVRFJyxcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgRVhJU1RTOiBbe1xuICAgICAgICAgIG5yOiAxMjNcbiAgICAgICAgfV0sXG4gICAgICAgIEZMQUdTOiBbe1xuICAgICAgICAgIGF0dHJpYnV0ZXM6IFtcbiAgICAgICAgICAgIFt7XG4gICAgICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdcXFxcQW5zd2VyZWQnXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdcXFxcRmxhZ2dlZCdcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgXVxuICAgICAgICB9XSxcbiAgICAgICAgT0s6IFt7XG4gICAgICAgICAgY29kZTogJ1BFUk1BTkVOVEZMQUdTJyxcbiAgICAgICAgICBwZXJtYW5lbnRmbGFnczogWydcXFxcQW5zd2VyZWQnLCAnXFxcXEZsYWdnZWQnXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgY29kZTogJ1VJRFZBTElESVRZJyxcbiAgICAgICAgICB1aWR2YWxpZGl0eTogJzInXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBjb2RlOiAnVUlETkVYVCcsXG4gICAgICAgICAgdWlkbmV4dDogJzM4MzYxJ1xuICAgICAgICB9XVxuICAgICAgfVxuICAgIH0pKS50by5kZWVwLmVxdWFsKHtcbiAgICAgIGV4aXN0czogMTIzLFxuICAgICAgZmxhZ3M6IFsnXFxcXEFuc3dlcmVkJywgJ1xcXFxGbGFnZ2VkJ10sXG4gICAgICBwZXJtYW5lbnRGbGFnczogWydcXFxcQW5zd2VyZWQnLCAnXFxcXEZsYWdnZWQnXSxcbiAgICAgIHJlYWRPbmx5OiBmYWxzZSxcbiAgICAgIHVpZE5leHQ6IDM4MzYxLFxuICAgICAgdWlkVmFsaWRpdHk6IDJcbiAgICB9KVxuICB9KVxuXG4gIGl0KCdzaG91bGQgcGFyc2UgcmVzcG9uc2Ugd2l0aCByZWFkLW9ubHknLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlU0VMRUNUKHtcbiAgICAgIGNvZGU6ICdSRUFELU9OTFknLFxuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBFWElTVFM6IFt7XG4gICAgICAgICAgbnI6IDEyM1xuICAgICAgICB9XSxcbiAgICAgICAgRkxBR1M6IFt7XG4gICAgICAgICAgYXR0cmlidXRlczogW1xuICAgICAgICAgICAgW3tcbiAgICAgICAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICAgICAgICB2YWx1ZTogJ1xcXFxBbnN3ZXJlZCdcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICAgICAgICB2YWx1ZTogJ1xcXFxGbGFnZ2VkJ1xuICAgICAgICAgICAgfV1cbiAgICAgICAgICBdXG4gICAgICAgIH1dLFxuICAgICAgICBPSzogW3tcbiAgICAgICAgICBjb2RlOiAnUEVSTUFORU5URkxBR1MnLFxuICAgICAgICAgIHBlcm1hbmVudGZsYWdzOiBbJ1xcXFxBbnN3ZXJlZCcsICdcXFxcRmxhZ2dlZCddXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBjb2RlOiAnVUlEVkFMSURJVFknLFxuICAgICAgICAgIHVpZHZhbGlkaXR5OiAnMidcbiAgICAgICAgfSwge1xuICAgICAgICAgIGNvZGU6ICdVSURORVhUJyxcbiAgICAgICAgICB1aWRuZXh0OiAnMzgzNjEnXG4gICAgICAgIH1dXG4gICAgICB9XG4gICAgfSkpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgZXhpc3RzOiAxMjMsXG4gICAgICBmbGFnczogWydcXFxcQW5zd2VyZWQnLCAnXFxcXEZsYWdnZWQnXSxcbiAgICAgIHBlcm1hbmVudEZsYWdzOiBbJ1xcXFxBbnN3ZXJlZCcsICdcXFxcRmxhZ2dlZCddLFxuICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICB1aWROZXh0OiAzODM2MSxcbiAgICAgIHVpZFZhbGlkaXR5OiAyXG4gICAgfSlcbiAgfSlcblxuICBpdCgnc2hvdWxkIHBhcnNlIHJlc3BvbnNlIHdpdGggTk9NT0RTRVEgZmxhZycsICgpID0+IHtcbiAgICBleHBlY3QocGFyc2VTRUxFQ1Qoe1xuICAgICAgY29kZTogJ1JFQUQtV1JJVEUnLFxuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBFWElTVFM6IFt7XG4gICAgICAgICAgbnI6IDEyM1xuICAgICAgICB9XSxcbiAgICAgICAgRkxBR1M6IFt7XG4gICAgICAgICAgYXR0cmlidXRlczogW1xuICAgICAgICAgICAgW3tcbiAgICAgICAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICAgICAgICB2YWx1ZTogJ1xcXFxBbnN3ZXJlZCdcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICAgICAgICB2YWx1ZTogJ1xcXFxGbGFnZ2VkJ1xuICAgICAgICAgICAgfV1cbiAgICAgICAgICBdXG4gICAgICAgIH1dLFxuICAgICAgICBPSzogW3tcbiAgICAgICAgICBjb2RlOiAnUEVSTUFORU5URkxBR1MnLFxuICAgICAgICAgIHBlcm1hbmVudGZsYWdzOiBbJ1xcXFxBbnN3ZXJlZCcsICdcXFxcRmxhZ2dlZCddXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBjb2RlOiAnVUlEVkFMSURJVFknLFxuICAgICAgICAgIHVpZHZhbGlkaXR5OiAnMidcbiAgICAgICAgfSwge1xuICAgICAgICAgIGNvZGU6ICdVSURORVhUJyxcbiAgICAgICAgICB1aWRuZXh0OiAnMzgzNjEnXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBjb2RlOiAnTk9NT0RTRVEnXG4gICAgICAgIH1dXG4gICAgICB9XG4gICAgfSkpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgZXhpc3RzOiAxMjMsXG4gICAgICBmbGFnczogWydcXFxcQW5zd2VyZWQnLCAnXFxcXEZsYWdnZWQnXSxcbiAgICAgIHBlcm1hbmVudEZsYWdzOiBbJ1xcXFxBbnN3ZXJlZCcsICdcXFxcRmxhZ2dlZCddLFxuICAgICAgcmVhZE9ubHk6IGZhbHNlLFxuICAgICAgdWlkTmV4dDogMzgzNjEsXG4gICAgICB1aWRWYWxpZGl0eTogMixcbiAgICAgIG5vTW9kc2VxOiB0cnVlXG4gICAgfSlcbiAgfSlcbn0pXG5cbmRlc2NyaWJlKCdwYXJzZUVOVkVMT1BFJywgKCkgPT4ge1xuICBpdCgnc2hvdWxkIHBhcnNlZCBlbnZlbG9wZSBvYmplY3QnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlRU5WRUxPUEUodGVzdEVudmVsb3BlLnNvdXJjZSkpLnRvLmRlZXAuZXF1YWwodGVzdEVudmVsb3BlLnBhcnNlZClcbiAgfSlcbn0pXG5cbmRlc2NyaWJlKCdwYXJzZUJPRFlTVFJVQ1RVUkUnLCAoKSA9PiB7XG4gIGl0KCdzaG91bGQgcGFyc2UgYm9keXN0cnVjdHVyZSBvYmplY3QnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlQk9EWVNUUlVDVFVSRShtaW1lVG9ydHVyZS5zb3VyY2UpKS50by5kZWVwLmVxdWFsKG1pbWVUb3J0dXJlLnBhcnNlZClcbiAgfSlcblxuICBpdCgnc2hvdWxkIHBhcnNlIGJvZHlzdHJ1Y3R1cmUgd2l0aCB1bmljb2RlIGZpbGVuYW1lJywgKCkgPT4ge1xuICAgIHZhciBpbnB1dCA9IFtcbiAgICAgIFtcbiAgICAgICAgeyB0eXBlOiAnU1RSSU5HJywgdmFsdWU6ICdBUFBMSUNBVElPTicgfSxcbiAgICAgICAgeyB0eXBlOiAnU1RSSU5HJywgdmFsdWU6ICdPQ1RFVC1TVFJFQU0nIH0sXG4gICAgICAgIG51bGwsXG4gICAgICAgIG51bGwsXG4gICAgICAgIG51bGwsXG4gICAgICAgIHsgdHlwZTogJ1NUUklORycsIHZhbHVlOiAnQkFTRTY0JyB9LFxuICAgICAgICB7IHR5cGU6ICdBVE9NJywgdmFsdWU6ICc0MCcgfSxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgW1xuICAgICAgICAgIHsgdHlwZTogJ1NUUklORycsIHZhbHVlOiAnQVRUQUNITUVOVCcgfSxcbiAgICAgICAgICBbXG4gICAgICAgICAgICB7IHR5cGU6ICdTVFJJTkcnLCB2YWx1ZTogJ0ZJTEVOQU1FJyB9LFxuICAgICAgICAgICAgeyB0eXBlOiAnU1RSSU5HJywgdmFsdWU6ICc9P0lTTy04ODU5LTE/UT9CQlJfSGFuZGVsLF9HZXdlcmJlLF9CPUZDcm9iZXRyaWViZSw/PSA9P0lTTy04ODU5LTE/UT9fcHJpdmF0ZV9CaWxkdW5nc2VpbnJpY2h0dW5nZW4udHh0Pz0nIH1cbiAgICAgICAgICBdXG4gICAgICAgIF0sXG4gICAgICAgIG51bGxcbiAgICAgIF0sXG4gICAgICB7IHR5cGU6ICdTVFJJTkcnLCB2YWx1ZTogJ01JWEVEJyB9LFxuICAgICAgW1xuICAgICAgICB7IHR5cGU6ICdTVFJJTkcnLCB2YWx1ZTogJ0JPVU5EQVJZJyB9LFxuICAgICAgICB7IHR5cGU6ICdTVFJJTkcnLCB2YWx1ZTogJy0tLS1zaW5pa2FlbC0/PV8xLTE0MTA1MDg1MjY1MTEwLjQ5OTAzOTIyNDU4MTc5Mjk1JyB9XG4gICAgICBdLFxuICAgICAgbnVsbCxcbiAgICAgIG51bGxcbiAgICBdXG5cbiAgICB2YXIgZXhwZWN0ZWQgPSB7XG4gICAgICBjaGlsZE5vZGVzOiBbe1xuICAgICAgICBwYXJ0OiAnMScsXG4gICAgICAgIHR5cGU6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLFxuICAgICAgICBlbmNvZGluZzogJ2Jhc2U2NCcsXG4gICAgICAgIHNpemU6IDQwLFxuICAgICAgICBkaXNwb3NpdGlvbjogJ2F0dGFjaG1lbnQnLFxuICAgICAgICBkaXNwb3NpdGlvblBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBmaWxlbmFtZTogJ0JCUiBIYW5kZWwsIEdld2VyYmUsIELDvHJvYmV0cmllYmUsIHByaXZhdGUgQmlsZHVuZ3NlaW5yaWNodHVuZ2VuLnR4dCdcbiAgICAgICAgfVxuICAgICAgfV0sXG4gICAgICB0eXBlOiAnbXVsdGlwYXJ0L21peGVkJyxcbiAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgYm91bmRhcnk6ICctLS0tc2luaWthZWwtPz1fMS0xNDEwNTA4NTI2NTExMC40OTkwMzkyMjQ1ODE3OTI5NSdcbiAgICAgIH1cbiAgICB9XG5cbiAgICBleHBlY3QocGFyc2VCT0RZU1RSVUNUVVJFKGlucHV0KSkudG8uZGVlcC5lcXVhbChleHBlY3RlZClcbiAgfSlcbn0pXG5cbmRlc2NyaWJlKCdwYXJzZUZFVENIJywgKCkgPT4ge1xuICBpdCgnc2hvdWxkIHJldHVybiB2YWx1ZXMgbG93ZXJjYXNlIGtleXMnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlRkVUQ0goe1xuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBGRVRDSDogW3tcbiAgICAgICAgICBucjogMTIzLFxuICAgICAgICAgIGF0dHJpYnV0ZXM6IFtcbiAgICAgICAgICAgIFt7XG4gICAgICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdCT0RZJyxcbiAgICAgICAgICAgICAgc2VjdGlvbjogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICdIRUFERVInXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFt7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnREFURSdcbiAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJ1NVQkpFQ1QnXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHBhcnRpYWw6IFswLCAxMjNdXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdhYmMnXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIF1cbiAgICAgICAgfV1cbiAgICAgIH1cbiAgICB9KSkudG8uZGVlcC5lcXVhbChbe1xuICAgICAgJyMnOiAxMjMsXG4gICAgICAnYm9keVtoZWFkZXIgKGRhdGUgc3ViamVjdCldPDAuMTIzPic6ICdhYmMnXG4gICAgfV0pXG4gIH0pXG5cbiAgaXQoJ3Nob3VsZCBtZXJnZSBtdWx0aXBsZSByZXNwb25zZXMgYmFzZWQgb24gc2VxdWVuY2UgbnVtYmVyJywgKCkgPT4ge1xuICAgIGV4cGVjdChwYXJzZUZFVENIKHtcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgRkVUQ0g6IFt7XG4gICAgICAgICAgbnI6IDEyMyxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBbXG4gICAgICAgICAgICBbe1xuICAgICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICAgIHZhbHVlOiAnVUlEJ1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICAgIHZhbHVlOiA3ODlcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgbnI6IDEyNCxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBbXG4gICAgICAgICAgICBbe1xuICAgICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICAgIHZhbHVlOiAnVUlEJ1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICAgIHZhbHVlOiA3OTBcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgbnI6IDEyMyxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBbXG4gICAgICAgICAgICBbe1xuICAgICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICAgIHZhbHVlOiAnTU9EU0VRJ1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICAgIHZhbHVlOiAnMTI3J1xuICAgICAgICAgICAgfV1cbiAgICAgICAgICBdXG4gICAgICAgIH1dXG4gICAgICB9XG4gICAgfSkpLnRvLmRlZXAuZXF1YWwoW3tcbiAgICAgICcjJzogMTIzLFxuICAgICAgdWlkOiA3ODksXG4gICAgICBtb2RzZXE6ICcxMjcnXG4gICAgfSwge1xuICAgICAgJyMnOiAxMjQsXG4gICAgICB1aWQ6IDc5MFxuICAgIH1dKVxuICB9KVxufSlcblxuZGVzY3JpYmUoJ3BhcnNlU0VBUkNIJywgKCkgPT4ge1xuICBpdCgnc2hvdWxkIHBhcnNlIFNFQVJDSCByZXNwb25zZScsICgpID0+IHtcbiAgICBleHBlY3QocGFyc2VTRUFSQ0goe1xuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBTRUFSQ0g6IFt7XG4gICAgICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgICAgIHZhbHVlOiA1XG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgdmFsdWU6IDdcbiAgICAgICAgICB9XVxuICAgICAgICB9LCB7XG4gICAgICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgICAgIHZhbHVlOiA2XG4gICAgICAgICAgfV1cbiAgICAgICAgfV1cbiAgICAgIH1cbiAgICB9KSkudG8uZGVlcC5lcXVhbChbNSwgNiwgN10pXG4gIH0pXG5cbiAgaXQoJ3Nob3VsZCBwYXJzZSBlbXB0eSBTRUFSQ0ggcmVzcG9uc2UnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlU0VBUkNIKHtcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgU0VBUkNIOiBbe1xuICAgICAgICAgIGNvbW1hbmQ6ICdTRUFSQ0gnLFxuICAgICAgICAgIHRhZzogJyonXG4gICAgICAgIH1dXG4gICAgICB9XG4gICAgfSkpLnRvLmRlZXAuZXF1YWwoW10pXG4gIH0pXG59KVxuXG5kZXNjcmliZSgncGFyc2VDT1BZJywgKCkgPT4ge1xuICBpdCgnc2hvdWxkIHBhcnNlIENPUFkgcmVzcG9uc2UnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlQ09QWSh7XG4gICAgICBjb3B5dWlkOiBbJzEnLCAnMTozJywgJzMsNCwyJ11cbiAgICB9KSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICBzcmNTZXFTZXQ6ICcxOjMnLFxuICAgICAgZGVzdFNlcVNldDogJzMsNCwyJ1xuICAgIH0pXG4gIH0pXG5cbiAgaXQoJ3Nob3VsZCByZXR1cm4gdW5kZWZpbmVkIHdoZW4gcmVzcG9uc2UgZG9lcyBub3QgY29udGFpbiBjb3B5dWlkJywgKCkgPT4ge1xuICAgIGV4cGVjdChwYXJzZUNPUFkoe30pKS50by5lcXVhbCh1bmRlZmluZWQpXG4gIH0pXG5cbiAgaXQoJ3Nob3VsZCByZXR1cm4gdW5kZWZpbmVkIHdoZW4gcmVzcG9uc2UgaXMgbm90IGRlZmluZWQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlQ09QWSgpKS50by5lcXVhbCh1bmRlZmluZWQpXG4gIH0pXG59KVxuXG5kZXNjcmliZSgncGFyc2VBUFBFTkQnLCAoKSA9PiB7XG4gIGl0KCdzaG91bGQgcGFyc2UgQVBQRU5EIHJlc3BvbnNlJywgKCkgPT4ge1xuICAgIGV4cGVjdChwYXJzZUFQUEVORCh7XG4gICAgICBhcHBlbmR1aWQ6IFsnMScsICczJ11cbiAgICB9KSkudG8uZXF1YWwoJzMnKVxuICB9KVxuXG4gIGl0KCdzaG91bGQgcmV0dXJuIHVuZGVmaW5lZCB3aGVuIHJlc3BvbnNlIGRvZXMgbm90IGNvbnRhaW4gY29weXVpZCcsICgpID0+IHtcbiAgICBleHBlY3QocGFyc2VBUFBFTkQoe30pKS50by5lcXVhbCh1bmRlZmluZWQpXG4gIH0pXG5cbiAgaXQoJ3Nob3VsZCByZXR1cm4gdW5kZWZpbmVkIHdoZW4gcmVzcG9uc2UgaXMgbm90IGRlZmluZWQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlQVBQRU5EKCkpLnRvLmVxdWFsKHVuZGVmaW5lZClcbiAgfSlcbn0pXG4iXX0= \ No newline at end of file diff --git a/dist/compression-worker.js b/dist/compression-worker.js new file mode 100644 index 0000000..5234c9c --- /dev/null +++ b/dist/compression-worker.js @@ -0,0 +1,41 @@ +"use strict"; + +var _compression = _interopRequireDefault(require("./compression")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const MESSAGE_INITIALIZE_WORKER = 'start'; +const MESSAGE_INFLATE = 'inflate'; +const MESSAGE_INFLATED_DATA_READY = 'inflated_ready'; +const MESSAGE_DEFLATE = 'deflate'; +const MESSAGE_DEFLATED_DATA_READY = 'deflated_ready'; + +const createMessage = (message, buffer) => ({ + message, + buffer +}); + +const inflatedReady = buffer => self.postMessage(createMessage(MESSAGE_INFLATED_DATA_READY, buffer), [buffer]); + +const deflatedReady = buffer => self.postMessage(createMessage(MESSAGE_DEFLATED_DATA_READY, buffer), [buffer]); + +const compressor = new _compression.default(inflatedReady, deflatedReady); + +self.onmessage = function (e) { + const message = e.data.message; + const buffer = e.data.buffer; + + switch (message) { + case MESSAGE_INITIALIZE_WORKER: + break; + + case MESSAGE_INFLATE: + compressor.inflate(buffer); + break; + + case MESSAGE_DEFLATE: + compressor.deflate(buffer); + break; + } +}; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21wcmVzc2lvbi13b3JrZXIuanMiXSwibmFtZXMiOlsiTUVTU0FHRV9JTklUSUFMSVpFX1dPUktFUiIsIk1FU1NBR0VfSU5GTEFURSIsIk1FU1NBR0VfSU5GTEFURURfREFUQV9SRUFEWSIsIk1FU1NBR0VfREVGTEFURSIsIk1FU1NBR0VfREVGTEFURURfREFUQV9SRUFEWSIsImNyZWF0ZU1lc3NhZ2UiLCJtZXNzYWdlIiwiYnVmZmVyIiwiaW5mbGF0ZWRSZWFkeSIsInNlbGYiLCJwb3N0TWVzc2FnZSIsImRlZmxhdGVkUmVhZHkiLCJjb21wcmVzc29yIiwiQ29tcHJlc3NvciIsIm9ubWVzc2FnZSIsImUiLCJkYXRhIiwiaW5mbGF0ZSIsImRlZmxhdGUiXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7QUFFQSxNQUFNQSx5QkFBeUIsR0FBRyxPQUFsQztBQUNBLE1BQU1DLGVBQWUsR0FBRyxTQUF4QjtBQUNBLE1BQU1DLDJCQUEyQixHQUFHLGdCQUFwQztBQUNBLE1BQU1DLGVBQWUsR0FBRyxTQUF4QjtBQUNBLE1BQU1DLDJCQUEyQixHQUFHLGdCQUFwQzs7QUFFQSxNQUFNQyxhQUFhLEdBQUcsQ0FBQ0MsT0FBRCxFQUFVQyxNQUFWLE1BQXNCO0FBQUVELEVBQUFBLE9BQUY7QUFBV0MsRUFBQUE7QUFBWCxDQUF0QixDQUF0Qjs7QUFFQSxNQUFNQyxhQUFhLEdBQUdELE1BQU0sSUFBSUUsSUFBSSxDQUFDQyxXQUFMLENBQWlCTCxhQUFhLENBQUNILDJCQUFELEVBQThCSyxNQUE5QixDQUE5QixFQUFxRSxDQUFDQSxNQUFELENBQXJFLENBQWhDOztBQUNBLE1BQU1JLGFBQWEsR0FBR0osTUFBTSxJQUFJRSxJQUFJLENBQUNDLFdBQUwsQ0FBaUJMLGFBQWEsQ0FBQ0QsMkJBQUQsRUFBOEJHLE1BQTlCLENBQTlCLEVBQXFFLENBQUNBLE1BQUQsQ0FBckUsQ0FBaEM7O0FBQ0EsTUFBTUssVUFBVSxHQUFHLElBQUlDLG9CQUFKLENBQWVMLGFBQWYsRUFBOEJHLGFBQTlCLENBQW5COztBQUVBRixJQUFJLENBQUNLLFNBQUwsR0FBaUIsVUFBVUMsQ0FBVixFQUFhO0FBQzVCLFFBQU1ULE9BQU8sR0FBR1MsQ0FBQyxDQUFDQyxJQUFGLENBQU9WLE9BQXZCO0FBQ0EsUUFBTUMsTUFBTSxHQUFHUSxDQUFDLENBQUNDLElBQUYsQ0FBT1QsTUFBdEI7O0FBRUEsVUFBUUQsT0FBUjtBQUNFLFNBQUtOLHlCQUFMO0FBQ0U7O0FBRUYsU0FBS0MsZUFBTDtBQUNFVyxNQUFBQSxVQUFVLENBQUNLLE9BQVgsQ0FBbUJWLE1BQW5CO0FBQ0E7O0FBRUYsU0FBS0osZUFBTDtBQUNFUyxNQUFBQSxVQUFVLENBQUNNLE9BQVgsQ0FBbUJYLE1BQW5CO0FBQ0E7QUFWSjtBQVlELENBaEJEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IENvbXByZXNzb3IgZnJvbSAnLi9jb21wcmVzc2lvbidcblxuY29uc3QgTUVTU0FHRV9JTklUSUFMSVpFX1dPUktFUiA9ICdzdGFydCdcbmNvbnN0IE1FU1NBR0VfSU5GTEFURSA9ICdpbmZsYXRlJ1xuY29uc3QgTUVTU0FHRV9JTkZMQVRFRF9EQVRBX1JFQURZID0gJ2luZmxhdGVkX3JlYWR5J1xuY29uc3QgTUVTU0FHRV9ERUZMQVRFID0gJ2RlZmxhdGUnXG5jb25zdCBNRVNTQUdFX0RFRkxBVEVEX0RBVEFfUkVBRFkgPSAnZGVmbGF0ZWRfcmVhZHknXG5cbmNvbnN0IGNyZWF0ZU1lc3NhZ2UgPSAobWVzc2FnZSwgYnVmZmVyKSA9PiAoeyBtZXNzYWdlLCBidWZmZXIgfSlcblxuY29uc3QgaW5mbGF0ZWRSZWFkeSA9IGJ1ZmZlciA9PiBzZWxmLnBvc3RNZXNzYWdlKGNyZWF0ZU1lc3NhZ2UoTUVTU0FHRV9JTkZMQVRFRF9EQVRBX1JFQURZLCBidWZmZXIpLCBbYnVmZmVyXSlcbmNvbnN0IGRlZmxhdGVkUmVhZHkgPSBidWZmZXIgPT4gc2VsZi5wb3N0TWVzc2FnZShjcmVhdGVNZXNzYWdlKE1FU1NBR0VfREVGTEFURURfREFUQV9SRUFEWSwgYnVmZmVyKSwgW2J1ZmZlcl0pXG5jb25zdCBjb21wcmVzc29yID0gbmV3IENvbXByZXNzb3IoaW5mbGF0ZWRSZWFkeSwgZGVmbGF0ZWRSZWFkeSlcblxuc2VsZi5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZSkge1xuICBjb25zdCBtZXNzYWdlID0gZS5kYXRhLm1lc3NhZ2VcbiAgY29uc3QgYnVmZmVyID0gZS5kYXRhLmJ1ZmZlclxuXG4gIHN3aXRjaCAobWVzc2FnZSkge1xuICAgIGNhc2UgTUVTU0FHRV9JTklUSUFMSVpFX1dPUktFUjpcbiAgICAgIGJyZWFrXG5cbiAgICBjYXNlIE1FU1NBR0VfSU5GTEFURTpcbiAgICAgIGNvbXByZXNzb3IuaW5mbGF0ZShidWZmZXIpXG4gICAgICBicmVha1xuXG4gICAgY2FzZSBNRVNTQUdFX0RFRkxBVEU6XG4gICAgICBjb21wcmVzc29yLmRlZmxhdGUoYnVmZmVyKVxuICAgICAgYnJlYWtcbiAgfVxufVxuIl19 \ No newline at end of file diff --git a/dist/imap-unit.js b/dist/imap-unit.js new file mode 100644 index 0000000..21b91f5 --- /dev/null +++ b/dist/imap-unit.js @@ -0,0 +1,764 @@ +"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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbWFwLXVuaXQuanMiXSwibmFtZXMiOlsiaG9zdCIsInBvcnQiLCJkZXNjcmliZSIsImNsaWVudCIsInNvY2tldFN0dWIiLCJiZWZvcmVFYWNoIiwiSW1hcENsaWVudCIsImV4cGVjdCIsInRvIiwiZXhpc3QiLCJsb2dnZXIiLCJkZWJ1ZyIsImVycm9yIiwiU29ja2V0Iiwib3BlbiIsInByb3RvdHlwZSIsImNsb3NlIiwic2VuZCIsInN1c3BlbmQiLCJyZXN1bWUiLCJ1cGdyYWRlVG9TZWN1cmUiLCJzaW5vbiIsImNyZWF0ZVN0dWJJbnN0YW5jZSIsInN0dWIiLCJ3aXRoQXJncyIsInJldHVybnMiLCJwcm9taXNlIiwiY29ubmVjdCIsInRoZW4iLCJjYWxsQ291bnQiLCJlcXVhbCIsIm9uZXJyb3IiLCJvbm9wZW4iLCJvbmNsb3NlIiwib25kYXRhIiwic2V0VGltZW91dCIsInNraXAiLCJpdCIsInNvY2tldCIsInJlYWR5U3RhdGUiLCJjYWxsZWQiLCJiZSIsImZhbHNlIiwic2VjdXJlTW9kZSIsInVwZ3JhZGUiLCJoYW5kbGVyIiwic2V0SGFuZGxlciIsIl9nbG9iYWxBY2NlcHRVbnRhZ2dlZCIsIkZFVENIIiwiZG9uZSIsImRhdGEiLCJFcnJvciIsIl9vbkRhdGEiLCJidWZmZXIiLCJfcGFyc2VJbmNvbWluZ0NvbW1hbmRzIiwiY2FsbGVkT25jZSIsInRydWUiLCJfaXRlcmF0ZUluY29taW5nQnVmZmVyIiwiYXBwZW5kSW5jb21pbmdCdWZmZXIiLCJpdGVyYXRvciIsIlN0cmluZyIsImZyb21DaGFyQ29kZSIsImFwcGx5IiwibmV4dCIsInZhbHVlIiwidW5kZWZpbmVkIiwiaXRlcmF0b3IxIiwiaXRlcmF0b3IyIiwiaXRlcmF0b3IzIiwiY29udGVudCIsIl9pbmNvbWluZ0J1ZmZlcnMiLCJwdXNoIiwib25yZWFkeSIsImdlbiIsIl9oYW5kbGVSZXNwb25zZSIsInRhZyIsImNvbW1hbmQiLCJhdHRyaWJ1dGVzIiwidHlwZSIsIm5yIiwiX2N1cnJlbnRDb21tYW5kIiwiZXJyb3JSZXNwb25zZUV4cGVjdHNFbXB0eUxpbmUiLCJURVNUIiwiX3NlbmRSZXF1ZXN0IiwicGF5bG9hZCIsImRlZXAiLCJjYWxsYmFjayIsInJlc3BvbnNlIiwiY2FsbHNGYWtlIiwiX2NsaWVudFF1ZXVlIiwiX3RhZ0NvdW50ZXIiLCJfY2FuU2VuZCIsImVucXVldWVDb21tYW5kIiwidCIsImNhdGNoIiwiZXJyIiwibGVuZ3RoIiwicmVxdWVzdCIsInZhbHVlQXNTdHJpbmciLCJfZW50ZXJJZGxlIiwiX2NsZWFySWRsZSIsImFyZ3MiLCJwcmVjaGVjayIsImN0eCIsImluY2x1ZGUiLCJyZXN0b3JlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJvbmlkbGUiLCJ0aW1lb3V0RW50ZXJJZGxlIiwiX3Byb2Nlc3NSZXNwb25zZSIsImh1bWFuUmVhZGFibGUiLCJzZWN0aW9uIiwiY29kZSIsImNhcGFiaWxpdHkiLCJpc0Vycm9yIiwiUmFuZ2VFcnJvciIsImNvbXByZXNzZWQiLCJlbmFibGVDb21wcmVzc2lvbiIsImV4cGVjdGVkIiwic3BsaXQiLCJtYXAiLCJjaGFyIiwiY2hhckNvZGVBdCIsImFjdHVhbE91dCIsIkJ1ZmZlciIsImZyb20iLCJfc29ja2V0T25EYXRhIiwidGVzdEFuZEdldEF0dHJpYnV0ZSIsImNyZWF0ZUNvbW1hbmQiLCJnZXRQcmV2aW91c2x5UXVldWVkIiwiYXR0cmlidXRlIl0sIm1hcHBpbmdzIjoiOztBQUVBOztBQUNBOzs7O0FBSEE7QUFLQSxNQUFNQSxJQUFJLEdBQUcsV0FBYjtBQUNBLE1BQU1DLElBQUksR0FBRyxLQUFiO0FBRUFDLFFBQVEsQ0FBQyw0QkFBRCxFQUErQixNQUFNO0FBQzNDLE1BQUlDLE1BQUosRUFBWUMsVUFBWjtBQUVBOztBQUVBQyxFQUFBQSxVQUFVLENBQUMsTUFBTTtBQUNmRixJQUFBQSxNQUFNLEdBQUcsSUFBSUcsYUFBSixDQUFlTixJQUFmLEVBQXFCQyxJQUFyQixDQUFUO0FBQ0FNLElBQUFBLE1BQU0sQ0FBQ0osTUFBRCxDQUFOLENBQWVLLEVBQWYsQ0FBa0JDLEtBQWxCO0FBRUFOLElBQUFBLE1BQU0sQ0FBQ08sTUFBUCxHQUFnQjtBQUNkQyxNQUFBQSxLQUFLLEVBQUUsTUFBTSxDQUFHLENBREY7QUFFZEMsTUFBQUEsS0FBSyxFQUFFLE1BQU0sQ0FBRztBQUZGLEtBQWhCOztBQUtBLFFBQUlDLE1BQU0sR0FBRyxZQUFZLENBQUcsQ0FBNUI7O0FBQ0FBLElBQUFBLE1BQU0sQ0FBQ0MsSUFBUCxHQUFjLE1BQU0sQ0FBRyxDQUF2Qjs7QUFDQUQsSUFBQUEsTUFBTSxDQUFDRSxTQUFQLENBQWlCQyxLQUFqQixHQUF5QixNQUFNLENBQUcsQ0FBbEM7O0FBQ0FILElBQUFBLE1BQU0sQ0FBQ0UsU0FBUCxDQUFpQkUsSUFBakIsR0FBd0IsTUFBTSxDQUFHLENBQWpDOztBQUNBSixJQUFBQSxNQUFNLENBQUNFLFNBQVAsQ0FBaUJHLE9BQWpCLEdBQTJCLE1BQU0sQ0FBRyxDQUFwQzs7QUFDQUwsSUFBQUEsTUFBTSxDQUFDRSxTQUFQLENBQWlCSSxNQUFqQixHQUEwQixNQUFNLENBQUcsQ0FBbkM7O0FBQ0FOLElBQUFBLE1BQU0sQ0FBQ0UsU0FBUCxDQUFpQkssZUFBakIsR0FBbUMsTUFBTSxDQUFHLENBQTVDOztBQUVBaEIsSUFBQUEsVUFBVSxHQUFHaUIsS0FBSyxDQUFDQyxrQkFBTixDQUF5QlQsTUFBekIsQ0FBYjtBQUNBUSxJQUFBQSxLQUFLLENBQUNFLElBQU4sQ0FBV1YsTUFBWCxFQUFtQixNQUFuQixFQUEyQlcsUUFBM0IsQ0FBb0N4QixJQUFwQyxFQUEwQ0MsSUFBMUMsRUFBZ0R3QixPQUFoRCxDQUF3RHJCLFVBQXhEO0FBRUEsUUFBSXNCLE9BQU8sR0FBR3ZCLE1BQU0sQ0FBQ3dCLE9BQVAsQ0FBZWQsTUFBZixFQUF1QmUsSUFBdkIsQ0FBNEIsTUFBTTtBQUM5Q3JCLE1BQUFBLE1BQU0sQ0FBQ00sTUFBTSxDQUFDQyxJQUFQLENBQVllLFNBQWIsQ0FBTixDQUE4QnJCLEVBQTlCLENBQWlDc0IsS0FBakMsQ0FBdUMsQ0FBdkM7QUFFQXZCLE1BQUFBLE1BQU0sQ0FBQ0gsVUFBVSxDQUFDMkIsT0FBWixDQUFOLENBQTJCdkIsRUFBM0IsQ0FBOEJDLEtBQTlCO0FBQ0FGLE1BQUFBLE1BQU0sQ0FBQ0gsVUFBVSxDQUFDNEIsTUFBWixDQUFOLENBQTBCeEIsRUFBMUIsQ0FBNkJDLEtBQTdCO0FBQ0FGLE1BQUFBLE1BQU0sQ0FBQ0gsVUFBVSxDQUFDNkIsT0FBWixDQUFOLENBQTJCekIsRUFBM0IsQ0FBOEJDLEtBQTlCO0FBQ0FGLE1BQUFBLE1BQU0sQ0FBQ0gsVUFBVSxDQUFDOEIsTUFBWixDQUFOLENBQTBCMUIsRUFBMUIsQ0FBNkJDLEtBQTdCO0FBQ0QsS0FQYSxDQUFkO0FBU0EwQixJQUFBQSxVQUFVLENBQUMsTUFBTS9CLFVBQVUsQ0FBQzRCLE1BQVgsRUFBUCxFQUE0QixFQUE1QixDQUFWO0FBRUEsV0FBT04sT0FBUDtBQUNELEdBaENTLENBQVY7QUFrQ0F4QixFQUFBQSxRQUFRLENBQUNrQyxJQUFULENBQWMsUUFBZCxFQUF3QixNQUFNO0FBQzVCQyxJQUFBQSxFQUFFLENBQUMsMEJBQUQsRUFBNkIsTUFBTTtBQUNuQ2xDLE1BQUFBLE1BQU0sQ0FBQ21DLE1BQVAsQ0FBY0MsVUFBZCxHQUEyQixNQUEzQjtBQUVBSixNQUFBQSxVQUFVLENBQUMsTUFBTS9CLFVBQVUsQ0FBQzZCLE9BQVgsRUFBUCxFQUE2QixFQUE3QixDQUFWO0FBQ0EsYUFBTzlCLE1BQU0sQ0FBQ2EsS0FBUCxHQUFlWSxJQUFmLENBQW9CLE1BQU07QUFDL0JyQixRQUFBQSxNQUFNLENBQUNILFVBQVUsQ0FBQ1ksS0FBWCxDQUFpQmEsU0FBbEIsQ0FBTixDQUFtQ3JCLEVBQW5DLENBQXNDc0IsS0FBdEMsQ0FBNEMsQ0FBNUM7QUFDRCxPQUZNLENBQVA7QUFHRCxLQVBDLENBQUY7QUFTQU8sSUFBQUEsRUFBRSxDQUFDLDhCQUFELEVBQWlDLE1BQU07QUFDdkNsQyxNQUFBQSxNQUFNLENBQUNtQyxNQUFQLENBQWNDLFVBQWQsR0FBMkIsZ0JBQTNCO0FBRUFKLE1BQUFBLFVBQVUsQ0FBQyxNQUFNL0IsVUFBVSxDQUFDNkIsT0FBWCxFQUFQLEVBQTZCLEVBQTdCLENBQVY7QUFDQSxhQUFPOUIsTUFBTSxDQUFDYSxLQUFQLEdBQWVZLElBQWYsQ0FBb0IsTUFBTTtBQUMvQnJCLFFBQUFBLE1BQU0sQ0FBQ0gsVUFBVSxDQUFDWSxLQUFYLENBQWlCd0IsTUFBbEIsQ0FBTixDQUFnQ2hDLEVBQWhDLENBQW1DaUMsRUFBbkMsQ0FBc0NDLEtBQXRDO0FBQ0QsT0FGTSxDQUFQO0FBR0QsS0FQQyxDQUFGO0FBUUQsR0FsQkQ7QUFvQkF4QyxFQUFBQSxRQUFRLENBQUMsVUFBRCxFQUFhLE1BQU07QUFDekJtQyxJQUFBQSxFQUFFLENBQUMsdUJBQUQsRUFBMEIsTUFBTTtBQUNoQ2xDLE1BQUFBLE1BQU0sQ0FBQ3dDLFVBQVAsR0FBb0IsS0FBcEI7QUFDQXhDLE1BQUFBLE1BQU0sQ0FBQ3lDLE9BQVA7QUFDRCxLQUhDLENBQUY7QUFLQVAsSUFBQUEsRUFBRSxDQUFDLDJCQUFELEVBQThCLE1BQU07QUFDcENsQyxNQUFBQSxNQUFNLENBQUN3QyxVQUFQLEdBQW9CLElBQXBCO0FBQ0F4QyxNQUFBQSxNQUFNLENBQUN5QyxPQUFQO0FBQ0QsS0FIQyxDQUFGO0FBSUQsR0FWTyxDQUFSO0FBWUExQyxFQUFBQSxRQUFRLENBQUMsYUFBRCxFQUFnQixNQUFNO0FBQzVCbUMsSUFBQUEsRUFBRSxDQUFDLHVDQUFELEVBQTBDLE1BQU07QUFDaEQsVUFBSVEsT0FBTyxHQUFHLE1BQU0sQ0FBRyxDQUF2Qjs7QUFDQTFDLE1BQUFBLE1BQU0sQ0FBQzJDLFVBQVAsQ0FBa0IsT0FBbEIsRUFBMkJELE9BQTNCO0FBRUF0QyxNQUFBQSxNQUFNLENBQUNKLE1BQU0sQ0FBQzRDLHFCQUFQLENBQTZCQyxLQUE5QixDQUFOLENBQTJDeEMsRUFBM0MsQ0FBOENzQixLQUE5QyxDQUFvRGUsT0FBcEQ7QUFDRCxLQUxDLENBQUY7QUFNRCxHQVBPLENBQVI7QUFTQTNDLEVBQUFBLFFBQVEsQ0FBQyxpQkFBRCxFQUFvQixNQUFNO0FBQ2hDbUMsSUFBQUEsRUFBRSxDQUFDLHdDQUFELEVBQTRDWSxJQUFELElBQVU7QUFDckQ5QyxNQUFBQSxNQUFNLENBQUNtQyxNQUFQLENBQWNQLE9BQWQsQ0FBc0I7QUFDcEJtQixRQUFBQSxJQUFJLEVBQUUsSUFBSUMsS0FBSixDQUFVLEtBQVY7QUFEYyxPQUF0Qjs7QUFJQWhELE1BQUFBLE1BQU0sQ0FBQzRCLE9BQVAsR0FBaUIsTUFBTTtBQUNyQmtCLFFBQUFBLElBQUk7QUFDTCxPQUZEO0FBR0QsS0FSQyxDQUFGO0FBU0QsR0FWTyxDQUFSO0FBWUEvQyxFQUFBQSxRQUFRLENBQUMsaUJBQUQsRUFBb0IsTUFBTTtBQUNoQ21DLElBQUFBLEVBQUUsQ0FBQyxvQkFBRCxFQUF3QlksSUFBRCxJQUFVO0FBQ2pDOUMsTUFBQUEsTUFBTSxDQUFDbUMsTUFBUCxDQUFjTCxPQUFkOztBQUVBOUIsTUFBQUEsTUFBTSxDQUFDNEIsT0FBUCxHQUFpQixNQUFNO0FBQ3JCa0IsUUFBQUEsSUFBSTtBQUNMLE9BRkQ7QUFHRCxLQU5DLENBQUY7QUFPRCxHQVJPLENBQVI7QUFVQS9DLEVBQUFBLFFBQVEsQ0FBQyxVQUFELEVBQWEsTUFBTTtBQUN6Qm1DLElBQUFBLEVBQUUsQ0FBQyxzQkFBRCxFQUF5QixNQUFNO0FBQy9CaEIsTUFBQUEsS0FBSyxDQUFDRSxJQUFOLENBQVdwQixNQUFYLEVBQW1CLHdCQUFuQjtBQUNBa0IsTUFBQUEsS0FBSyxDQUFDRSxJQUFOLENBQVdwQixNQUFYLEVBQW1CLHdCQUFuQjs7QUFFQUEsTUFBQUEsTUFBTSxDQUFDaUQsT0FBUCxDQUFlO0FBQ2JGLFFBQUFBLElBQUksRUFBRSwwQkFBYSxRQUFiLEVBQXVCRztBQURoQixPQUFmOztBQUlBOUMsTUFBQUEsTUFBTSxDQUFDSixNQUFNLENBQUNtRCxzQkFBUCxDQUE4QkMsVUFBL0IsQ0FBTixDQUFpRC9DLEVBQWpELENBQW9EaUMsRUFBcEQsQ0FBdURlLElBQXZEO0FBQ0FqRCxNQUFBQSxNQUFNLENBQUNKLE1BQU0sQ0FBQ3NELHNCQUFQLENBQThCRixVQUEvQixDQUFOLENBQWlEL0MsRUFBakQsQ0FBb0RpQyxFQUFwRCxDQUF1RGUsSUFBdkQ7QUFDRCxLQVZDLENBQUY7QUFXRCxHQVpPLENBQVI7QUFjQXRELEVBQUFBLFFBQVEsQ0FBQyxvQkFBRCxFQUF1QixNQUFNO0FBQ25DbUMsSUFBQUEsRUFBRSxDQUFDLDhCQUFELEVBQWlDLE1BQU07QUFDdkNxQixNQUFBQSxvQkFBb0IsQ0FBQyxpRUFBRCxDQUFwQjs7QUFDQSxVQUFJQyxRQUFRLEdBQUd4RCxNQUFNLENBQUNzRCxzQkFBUCxFQUFmOztBQUVBbEQsTUFBQUEsTUFBTSxDQUFDcUQsTUFBTSxDQUFDQyxZQUFQLENBQW9CQyxLQUFwQixDQUEwQixJQUExQixFQUFnQ0gsUUFBUSxDQUFDSSxJQUFULEdBQWdCQyxLQUFoRCxDQUFELENBQU4sQ0FBK0R4RCxFQUEvRCxDQUFrRXNCLEtBQWxFLENBQXdFLG1CQUF4RTtBQUNBdkIsTUFBQUEsTUFBTSxDQUFDcUQsTUFBTSxDQUFDQyxZQUFQLENBQW9CQyxLQUFwQixDQUEwQixJQUExQixFQUFnQ0gsUUFBUSxDQUFDSSxJQUFULEdBQWdCQyxLQUFoRCxDQUFELENBQU4sQ0FBK0R4RCxFQUEvRCxDQUFrRXNCLEtBQWxFLENBQXdFLG1CQUF4RTtBQUNBdkIsTUFBQUEsTUFBTSxDQUFDcUQsTUFBTSxDQUFDQyxZQUFQLENBQW9CQyxLQUFwQixDQUEwQixJQUExQixFQUFnQ0gsUUFBUSxDQUFDSSxJQUFULEdBQWdCQyxLQUFoRCxDQUFELENBQU4sQ0FBK0R4RCxFQUEvRCxDQUFrRXNCLEtBQWxFLENBQXdFLG1CQUF4RTtBQUNBdkIsTUFBQUEsTUFBTSxDQUFDb0QsUUFBUSxDQUFDSSxJQUFULEdBQWdCQyxLQUFqQixDQUFOLENBQThCeEQsRUFBOUIsQ0FBaUNpQyxFQUFqQyxDQUFvQ3dCLFNBQXBDO0FBQ0QsS0FSQyxDQUFGO0FBVUE1QixJQUFBQSxFQUFFLENBQUMsaUNBQUQsRUFBb0MsTUFBTTtBQUMxQ3FCLE1BQUFBLG9CQUFvQixDQUFDLDRGQUFELENBQXBCOztBQUNBLFVBQUlDLFFBQVEsR0FBR3hELE1BQU0sQ0FBQ3NELHNCQUFQLEVBQWY7O0FBRUFsRCxNQUFBQSxNQUFNLENBQUNxRCxNQUFNLENBQUNDLFlBQVAsQ0FBb0JDLEtBQXBCLENBQTBCLElBQTFCLEVBQWdDSCxRQUFRLENBQUNJLElBQVQsR0FBZ0JDLEtBQWhELENBQUQsQ0FBTixDQUErRHhELEVBQS9ELENBQWtFc0IsS0FBbEUsQ0FBd0UsMEJBQXhFO0FBQ0F2QixNQUFBQSxNQUFNLENBQUNxRCxNQUFNLENBQUNDLFlBQVAsQ0FBb0JDLEtBQXBCLENBQTBCLElBQTFCLEVBQWdDSCxRQUFRLENBQUNJLElBQVQsR0FBZ0JDLEtBQWhELENBQUQsQ0FBTixDQUErRHhELEVBQS9ELENBQWtFc0IsS0FBbEUsQ0FBd0UsNkJBQXhFO0FBQ0F2QixNQUFBQSxNQUFNLENBQUNxRCxNQUFNLENBQUNDLFlBQVAsQ0FBb0JDLEtBQXBCLENBQTBCLElBQTFCLEVBQWdDSCxRQUFRLENBQUNJLElBQVQsR0FBZ0JDLEtBQWhELENBQUQsQ0FBTixDQUErRHhELEVBQS9ELENBQWtFc0IsS0FBbEUsQ0FBd0UsNkJBQXhFO0FBQ0F2QixNQUFBQSxNQUFNLENBQUNvRCxRQUFRLENBQUNJLElBQVQsR0FBZ0JDLEtBQWpCLENBQU4sQ0FBOEJ4RCxFQUE5QixDQUFpQ2lDLEVBQWpDLENBQW9Dd0IsU0FBcEM7QUFDRCxLQVJDLENBQUY7QUFVQTVCLElBQUFBLEVBQUUsQ0FBQyxtQ0FBRCxFQUFzQyxNQUFNO0FBQzVDcUIsTUFBQUEsb0JBQW9CLENBQUMsc0RBQUQsQ0FBcEI7O0FBQ0EsVUFBSUMsUUFBUSxHQUFHeEQsTUFBTSxDQUFDc0Qsc0JBQVAsRUFBZjs7QUFFQWxELE1BQUFBLE1BQU0sQ0FBQ3FELE1BQU0sQ0FBQ0MsWUFBUCxDQUFvQkMsS0FBcEIsQ0FBMEIsSUFBMUIsRUFBZ0NILFFBQVEsQ0FBQ0ksSUFBVCxHQUFnQkMsS0FBaEQsQ0FBRCxDQUFOLENBQStEeEQsRUFBL0QsQ0FBa0VzQixLQUFsRSxDQUF3RSxtQkFBeEU7QUFDQXZCLE1BQUFBLE1BQU0sQ0FBQ3FELE1BQU0sQ0FBQ0MsWUFBUCxDQUFvQkMsS0FBcEIsQ0FBMEIsSUFBMUIsRUFBZ0NILFFBQVEsQ0FBQ0ksSUFBVCxHQUFnQkMsS0FBaEQsQ0FBRCxDQUFOLENBQStEeEQsRUFBL0QsQ0FBa0VzQixLQUFsRSxDQUF3RSw2QkFBeEU7QUFDQXZCLE1BQUFBLE1BQU0sQ0FBQ29ELFFBQVEsQ0FBQ0ksSUFBVCxHQUFnQkMsS0FBakIsQ0FBTixDQUE4QnhELEVBQTlCLENBQWlDaUMsRUFBakMsQ0FBb0N3QixTQUFwQztBQUNELEtBUEMsQ0FBRjtBQVNBNUIsSUFBQUEsRUFBRSxDQUFDLG1DQUFELEVBQXNDLE1BQU07QUFDNUNxQixNQUFBQSxvQkFBb0IsQ0FBQyxtREFBRCxDQUFwQjs7QUFDQSxVQUFJQyxRQUFRLEdBQUd4RCxNQUFNLENBQUNzRCxzQkFBUCxFQUFmOztBQUVBbEQsTUFBQUEsTUFBTSxDQUFDcUQsTUFBTSxDQUFDQyxZQUFQLENBQW9CQyxLQUFwQixDQUEwQixJQUExQixFQUFnQ0gsUUFBUSxDQUFDSSxJQUFULEdBQWdCQyxLQUFoRCxDQUFELENBQU4sQ0FBK0R4RCxFQUEvRCxDQUFrRXNCLEtBQWxFLENBQXdFLDBCQUF4RTtBQUNBdkIsTUFBQUEsTUFBTSxDQUFDcUQsTUFBTSxDQUFDQyxZQUFQLENBQW9CQyxLQUFwQixDQUEwQixJQUExQixFQUFnQ0gsUUFBUSxDQUFDSSxJQUFULEdBQWdCQyxLQUFoRCxDQUFELENBQU4sQ0FBK0R4RCxFQUEvRCxDQUFrRXNCLEtBQWxFLENBQXdFLG1CQUF4RTtBQUNBdkIsTUFBQUEsTUFBTSxDQUFDb0QsUUFBUSxDQUFDSSxJQUFULEdBQWdCQyxLQUFqQixDQUFOLENBQThCeEQsRUFBOUIsQ0FBaUNpQyxFQUFqQyxDQUFvQ3dCLFNBQXBDO0FBQ0QsS0FQQyxDQUFGO0FBU0E1QixJQUFBQSxFQUFFLENBQUMsbUNBQUQsRUFBc0MsTUFBTTtBQUM1Q3FCLE1BQUFBLG9CQUFvQixDQUFDLGdDQUFELENBQXBCOztBQUNBLFVBQUlDLFFBQVEsR0FBR3hELE1BQU0sQ0FBQ3NELHNCQUFQLEVBQWY7O0FBQ0FsRCxNQUFBQSxNQUFNLENBQUNxRCxNQUFNLENBQUNDLFlBQVAsQ0FBb0JDLEtBQXBCLENBQTBCLElBQTFCLEVBQWdDSCxRQUFRLENBQUNJLElBQVQsR0FBZ0JDLEtBQWhELENBQUQsQ0FBTixDQUErRHhELEVBQS9ELENBQWtFc0IsS0FBbEUsQ0FBd0UsNEJBQXhFO0FBQ0QsS0FKQyxDQUFGO0FBTUFPLElBQUFBLEVBQUUsQ0FBQyw2QkFBRCxFQUFnQyxNQUFNO0FBQ3RDcUIsTUFBQUEsb0JBQW9CLENBQUMsNkVBQUQsQ0FBcEI7O0FBQ0EsVUFBSUMsUUFBUSxHQUFHeEQsTUFBTSxDQUFDc0Qsc0JBQVAsRUFBZjs7QUFDQWxELE1BQUFBLE1BQU0sQ0FBQ3FELE1BQU0sQ0FBQ0MsWUFBUCxDQUFvQkMsS0FBcEIsQ0FBMEIsSUFBMUIsRUFBZ0NILFFBQVEsQ0FBQ0ksSUFBVCxHQUFnQkMsS0FBaEQsQ0FBRCxDQUFOLENBQStEeEQsRUFBL0QsQ0FBa0VzQixLQUFsRSxDQUF3RSx5RUFBeEU7QUFDRCxLQUpDLENBQUY7QUFNQU8sSUFBQUEsRUFBRSxDQUFDLCtCQUFELEVBQWtDLE1BQU07QUFDeENxQixNQUFBQSxvQkFBb0IsQ0FBQyxtSEFBRCxDQUFwQjs7QUFDQSxVQUFJQyxRQUFRLEdBQUd4RCxNQUFNLENBQUNzRCxzQkFBUCxFQUFmOztBQUNBbEQsTUFBQUEsTUFBTSxDQUFDcUQsTUFBTSxDQUFDQyxZQUFQLENBQW9CQyxLQUFwQixDQUEwQixJQUExQixFQUFnQ0gsUUFBUSxDQUFDSSxJQUFULEdBQWdCQyxLQUFoRCxDQUFELENBQU4sQ0FBK0R4RCxFQUEvRCxDQUFrRXNCLEtBQWxFLENBQXdFLCtHQUF4RTtBQUNELEtBSkMsQ0FBRjtBQU1BTyxJQUFBQSxFQUFFLENBQUMsNENBQUQsRUFBK0MsTUFBTTtBQUNyRHFCLE1BQUFBLG9CQUFvQixDQUFDLHFFQUFELENBQXBCOztBQUNBLFVBQUlDLFFBQVEsR0FBR3hELE1BQU0sQ0FBQ3NELHNCQUFQLEVBQWY7O0FBQ0FsRCxNQUFBQSxNQUFNLENBQUNxRCxNQUFNLENBQUNDLFlBQVAsQ0FBb0JDLEtBQXBCLENBQTBCLElBQTFCLEVBQWdDSCxRQUFRLENBQUNJLElBQVQsR0FBZ0JDLEtBQWhELENBQUQsQ0FBTixDQUErRHhELEVBQS9ELENBQWtFc0IsS0FBbEUsQ0FBd0UsaUVBQXhFO0FBQ0QsS0FKQyxDQUFGO0FBTUFPLElBQUFBLEVBQUUsQ0FBQywwREFBRCxFQUE2RCxNQUFNO0FBQ25FcUIsTUFBQUEsb0JBQW9CLENBQUMscUJBQUQsQ0FBcEI7O0FBQ0EsVUFBSVEsU0FBUyxHQUFHL0QsTUFBTSxDQUFDc0Qsc0JBQVAsRUFBaEI7O0FBQ0FsRCxNQUFBQSxNQUFNLENBQUMyRCxTQUFTLENBQUNILElBQVYsR0FBaUJDLEtBQWxCLENBQU4sQ0FBK0J4RCxFQUEvQixDQUFrQ2lDLEVBQWxDLENBQXFDd0IsU0FBckM7QUFFQVAsTUFBQUEsb0JBQW9CLENBQUMseUJBQUQsQ0FBcEI7O0FBQ0EsVUFBSVMsU0FBUyxHQUFHaEUsTUFBTSxDQUFDc0Qsc0JBQVAsRUFBaEI7O0FBQ0FsRCxNQUFBQSxNQUFNLENBQUNxRCxNQUFNLENBQUNDLFlBQVAsQ0FBb0JDLEtBQXBCLENBQTBCLElBQTFCLEVBQWdDSyxTQUFTLENBQUNKLElBQVYsR0FBaUJDLEtBQWpELENBQUQsQ0FBTixDQUFnRXhELEVBQWhFLENBQW1Fc0IsS0FBbkUsQ0FBeUUsbUJBQXpFO0FBQ0F2QixNQUFBQSxNQUFNLENBQUNxRCxNQUFNLENBQUNDLFlBQVAsQ0FBb0JDLEtBQXBCLENBQTBCLElBQTFCLEVBQWdDSyxTQUFTLENBQUNKLElBQVYsR0FBaUJDLEtBQWpELENBQUQsQ0FBTixDQUFnRXhELEVBQWhFLENBQW1Fc0IsS0FBbkUsQ0FBeUUsbUJBQXpFO0FBQ0F2QixNQUFBQSxNQUFNLENBQUM0RCxTQUFTLENBQUNKLElBQVYsR0FBaUJDLEtBQWxCLENBQU4sQ0FBK0J4RCxFQUEvQixDQUFrQ2lDLEVBQWxDLENBQXFDd0IsU0FBckM7QUFDRCxLQVZDLENBQUY7QUFZQTVCLElBQUFBLEVBQUUsQ0FBQyw4REFBRCxFQUFpRSxNQUFNO0FBQ3ZFcUIsTUFBQUEsb0JBQW9CLENBQUMsa0JBQUQsQ0FBcEI7O0FBQ0EsVUFBSVEsU0FBUyxHQUFHL0QsTUFBTSxDQUFDc0Qsc0JBQVAsRUFBaEI7O0FBQ0FsRCxNQUFBQSxNQUFNLENBQUMyRCxTQUFTLENBQUNILElBQVYsR0FBaUJDLEtBQWxCLENBQU4sQ0FBK0J4RCxFQUEvQixDQUFrQ2lDLEVBQWxDLENBQXFDd0IsU0FBckM7QUFFQVAsTUFBQUEsb0JBQW9CLENBQUMsZUFBRCxDQUFwQjs7QUFDQSxVQUFJUyxTQUFTLEdBQUdoRSxNQUFNLENBQUNzRCxzQkFBUCxFQUFoQjs7QUFDQWxELE1BQUFBLE1BQU0sQ0FBQ3FELE1BQU0sQ0FBQ0MsWUFBUCxDQUFvQkMsS0FBcEIsQ0FBMEIsSUFBMUIsRUFBZ0NLLFNBQVMsQ0FBQ0osSUFBVixHQUFpQkMsS0FBakQsQ0FBRCxDQUFOLENBQWdFeEQsRUFBaEUsQ0FBbUVzQixLQUFuRSxDQUF5RSwyQkFBekU7QUFDQXZCLE1BQUFBLE1BQU0sQ0FBQzRELFNBQVMsQ0FBQ0osSUFBVixHQUFpQkMsS0FBbEIsQ0FBTixDQUErQnhELEVBQS9CLENBQWtDaUMsRUFBbEMsQ0FBcUN3QixTQUFyQztBQUNELEtBVEMsQ0FBRjtBQVdBNUIsSUFBQUEsRUFBRSxDQUFDLGdFQUFELEVBQW1FLE1BQU07QUFDekVxQixNQUFBQSxvQkFBb0IsQ0FBQyxtQkFBRCxDQUFwQjs7QUFDQSxVQUFJUSxTQUFTLEdBQUcvRCxNQUFNLENBQUNzRCxzQkFBUCxFQUFoQjs7QUFDQWxELE1BQUFBLE1BQU0sQ0FBQzJELFNBQVMsQ0FBQ0gsSUFBVixHQUFpQkMsS0FBbEIsQ0FBTixDQUErQnhELEVBQS9CLENBQWtDaUMsRUFBbEMsQ0FBcUN3QixTQUFyQztBQUVBUCxNQUFBQSxvQkFBb0IsQ0FBQyx1QkFBRCxDQUFwQjs7QUFDQSxVQUFJUyxTQUFTLEdBQUdoRSxNQUFNLENBQUNzRCxzQkFBUCxFQUFoQjs7QUFDQWxELE1BQUFBLE1BQU0sQ0FBQ3FELE1BQU0sQ0FBQ0MsWUFBUCxDQUFvQkMsS0FBcEIsQ0FBMEIsSUFBMUIsRUFBZ0NLLFNBQVMsQ0FBQ0osSUFBVixHQUFpQkMsS0FBakQsQ0FBRCxDQUFOLENBQWdFeEQsRUFBaEUsQ0FBbUVzQixLQUFuRSxDQUF5RSxvQ0FBekU7QUFDQXZCLE1BQUFBLE1BQU0sQ0FBQzRELFNBQVMsQ0FBQ0osSUFBVixHQUFpQkMsS0FBbEIsQ0FBTixDQUErQnhELEVBQS9CLENBQWtDaUMsRUFBbEMsQ0FBcUN3QixTQUFyQztBQUNELEtBVEMsQ0FBRjtBQVdBNUIsSUFBQUEsRUFBRSxDQUFDLGdFQUFELEVBQW1FLE1BQU07QUFDekVxQixNQUFBQSxvQkFBb0IsQ0FBQyxrQkFBRCxDQUFwQjs7QUFDQSxVQUFJUSxTQUFTLEdBQUcvRCxNQUFNLENBQUNzRCxzQkFBUCxFQUFoQjs7QUFDQWxELE1BQUFBLE1BQU0sQ0FBQzJELFNBQVMsQ0FBQ0gsSUFBVixHQUFpQkMsS0FBbEIsQ0FBTixDQUErQnhELEVBQS9CLENBQWtDaUMsRUFBbEMsQ0FBcUN3QixTQUFyQztBQUVBUCxNQUFBQSxvQkFBb0IsQ0FBQyx3QkFBRCxDQUFwQjs7QUFDQSxVQUFJUyxTQUFTLEdBQUdoRSxNQUFNLENBQUNzRCxzQkFBUCxFQUFoQjs7QUFDQWxELE1BQUFBLE1BQU0sQ0FBQ3FELE1BQU0sQ0FBQ0MsWUFBUCxDQUFvQkMsS0FBcEIsQ0FBMEIsSUFBMUIsRUFBZ0NLLFNBQVMsQ0FBQ0osSUFBVixHQUFpQkMsS0FBakQsQ0FBRCxDQUFOLENBQWdFeEQsRUFBaEUsQ0FBbUVzQixLQUFuRSxDQUF5RSxvQ0FBekU7QUFDQXZCLE1BQUFBLE1BQU0sQ0FBQzRELFNBQVMsQ0FBQ0osSUFBVixHQUFpQkMsS0FBbEIsQ0FBTixDQUErQnhELEVBQS9CLENBQWtDaUMsRUFBbEMsQ0FBcUN3QixTQUFyQztBQUNELEtBVEMsQ0FBRjtBQVdBNUIsSUFBQUEsRUFBRSxDQUFDLGdFQUFELEVBQW1FLE1BQU07QUFDekVxQixNQUFBQSxvQkFBb0IsQ0FBQyxpRUFBRCxDQUFwQjs7QUFDQSxVQUFJUSxTQUFTLEdBQUcvRCxNQUFNLENBQUNzRCxzQkFBUCxFQUFoQjs7QUFDQWxELE1BQUFBLE1BQU0sQ0FBQzJELFNBQVMsQ0FBQ0gsSUFBVixHQUFpQkMsS0FBbEIsQ0FBTixDQUErQnhELEVBQS9CLENBQWtDaUMsRUFBbEMsQ0FBcUN3QixTQUFyQztBQUNBUCxNQUFBQSxvQkFBb0IsQ0FBQyxXQUFELENBQXBCOztBQUNBLFVBQUlTLFNBQVMsR0FBR2hFLE1BQU0sQ0FBQ3NELHNCQUFQLEVBQWhCOztBQUNBbEQsTUFBQUEsTUFBTSxDQUFDcUQsTUFBTSxDQUFDQyxZQUFQLENBQW9CQyxLQUFwQixDQUEwQixJQUExQixFQUFnQ0ssU0FBUyxDQUFDSixJQUFWLEdBQWlCQyxLQUFqRCxDQUFELENBQU4sQ0FBZ0V4RCxFQUFoRSxDQUFtRXNCLEtBQW5FLENBQXlFLHNFQUF6RTtBQUNELEtBUEMsQ0FBRjtBQVNBTyxJQUFBQSxFQUFFLENBQUMsOERBQUQsRUFBaUUsTUFBTTtBQUN2RXFCLE1BQUFBLG9CQUFvQixDQUFDLGtCQUFELENBQXBCOztBQUNBLFVBQUlRLFNBQVMsR0FBRy9ELE1BQU0sQ0FBQ3NELHNCQUFQLEVBQWhCOztBQUNBbEQsTUFBQUEsTUFBTSxDQUFDMkQsU0FBUyxDQUFDSCxJQUFWLEdBQWlCQyxLQUFsQixDQUFOLENBQStCeEQsRUFBL0IsQ0FBa0NpQyxFQUFsQyxDQUFxQ3dCLFNBQXJDO0FBRUFQLE1BQUFBLG9CQUFvQixDQUFDLEdBQUQsQ0FBcEI7O0FBQ0EsVUFBSVMsU0FBUyxHQUFHaEUsTUFBTSxDQUFDc0Qsc0JBQVAsRUFBaEI7O0FBQ0FsRCxNQUFBQSxNQUFNLENBQUM0RCxTQUFTLENBQUNKLElBQVYsR0FBaUJDLEtBQWxCLENBQU4sQ0FBK0J4RCxFQUEvQixDQUFrQ2lDLEVBQWxDLENBQXFDd0IsU0FBckM7QUFFQVAsTUFBQUEsb0JBQW9CLENBQUMsYUFBRCxDQUFwQjs7QUFDQSxVQUFJVSxTQUFTLEdBQUdqRSxNQUFNLENBQUNzRCxzQkFBUCxFQUFoQjs7QUFDQWxELE1BQUFBLE1BQU0sQ0FBQ3FELE1BQU0sQ0FBQ0MsWUFBUCxDQUFvQkMsS0FBcEIsQ0FBMEIsSUFBMUIsRUFBZ0NNLFNBQVMsQ0FBQ0wsSUFBVixHQUFpQkMsS0FBakQsQ0FBRCxDQUFOLENBQWdFeEQsRUFBaEUsQ0FBbUVzQixLQUFuRSxDQUF5RSwwQkFBekU7QUFDQXZCLE1BQUFBLE1BQU0sQ0FBQzZELFNBQVMsQ0FBQ0wsSUFBVixHQUFpQkMsS0FBbEIsQ0FBTixDQUErQnhELEVBQS9CLENBQWtDaUMsRUFBbEMsQ0FBcUN3QixTQUFyQztBQUNELEtBYkMsQ0FBRjtBQWVBNUIsSUFBQUEsRUFBRSxDQUFDLDJEQUFELEVBQThELE1BQU07QUFDcEVxQixNQUFBQSxvQkFBb0IsQ0FBQyxjQUFELENBQXBCOztBQUNBLFVBQUlRLFNBQVMsR0FBRy9ELE1BQU0sQ0FBQ3NELHNCQUFQLEVBQWhCOztBQUNBbEQsTUFBQUEsTUFBTSxDQUFDMkQsU0FBUyxDQUFDSCxJQUFWLEdBQWlCQyxLQUFsQixDQUFOLENBQStCeEQsRUFBL0IsQ0FBa0NpQyxFQUFsQyxDQUFxQ3dCLFNBQXJDO0FBRUFQLE1BQUFBLG9CQUFvQixDQUFDLFVBQUQsQ0FBcEI7O0FBQ0EsVUFBSVMsU0FBUyxHQUFHaEUsTUFBTSxDQUFDc0Qsc0JBQVAsRUFBaEI7O0FBQ0FsRCxNQUFBQSxNQUFNLENBQUNxRCxNQUFNLENBQUNDLFlBQVAsQ0FBb0JDLEtBQXBCLENBQTBCLElBQTFCLEVBQWdDSyxTQUFTLENBQUNKLElBQVYsR0FBaUJDLEtBQWpELENBQUQsQ0FBTixDQUFnRXhELEVBQWhFLENBQW1Fc0IsS0FBbkUsQ0FBeUUsa0JBQXpFO0FBQ0F2QixNQUFBQSxNQUFNLENBQUM0RCxTQUFTLENBQUNKLElBQVYsR0FBaUJDLEtBQWxCLENBQU4sQ0FBK0J4RCxFQUEvQixDQUFrQ2lDLEVBQWxDLENBQXFDd0IsU0FBckM7QUFDRCxLQVRDLENBQUY7QUFXQTVCLElBQUFBLEVBQUUsQ0FBQyw4Q0FBRCxFQUFpRCxNQUFNO0FBQ3ZEcUIsTUFBQUEsb0JBQW9CLENBQUMsOERBQUQsQ0FBcEI7O0FBQ0EsVUFBSUMsUUFBUSxHQUFHeEQsTUFBTSxDQUFDc0Qsc0JBQVAsRUFBZjs7QUFDQWxELE1BQUFBLE1BQU0sQ0FBQ3FELE1BQU0sQ0FBQ0MsWUFBUCxDQUFvQkMsS0FBcEIsQ0FBMEIsSUFBMUIsRUFBZ0NILFFBQVEsQ0FBQ0ksSUFBVCxHQUFnQkMsS0FBaEQsQ0FBRCxDQUFOLENBQStEeEQsRUFBL0QsQ0FBa0VzQixLQUFsRSxDQUF3RSwwREFBeEU7QUFDRCxLQUpDLENBQUY7QUFNQU8sSUFBQUEsRUFBRSxDQUFDLDhDQUFELEVBQWlELE1BQU07QUFDdkRxQixNQUFBQSxvQkFBb0IsQ0FBQyw0RUFBRCxDQUFwQjs7QUFDQSxVQUFJQyxRQUFRLEdBQUd4RCxNQUFNLENBQUNzRCxzQkFBUCxFQUFmOztBQUNBbEQsTUFBQUEsTUFBTSxDQUFDcUQsTUFBTSxDQUFDQyxZQUFQLENBQW9CQyxLQUFwQixDQUEwQixJQUExQixFQUFnQ0gsUUFBUSxDQUFDSSxJQUFULEdBQWdCQyxLQUFoRCxDQUFELENBQU4sQ0FBK0R4RCxFQUEvRCxDQUFrRXNCLEtBQWxFLENBQXdFLHdFQUF4RTtBQUNELEtBSkMsQ0FBRjs7QUFNQSxhQUFTNEIsb0JBQVQsQ0FBK0JXLE9BQS9CLEVBQXdDO0FBQ3RDbEUsTUFBQUEsTUFBTSxDQUFDbUUsZ0JBQVAsQ0FBd0JDLElBQXhCLENBQTZCLDBCQUFhRixPQUFiLENBQTdCO0FBQ0Q7QUFDRixHQTlKTyxDQUFSO0FBZ0tBbkUsRUFBQUEsUUFBUSxDQUFDLHlCQUFELEVBQTRCLE1BQU07QUFDeENtQyxJQUFBQSxFQUFFLENBQUMsNkNBQUQsRUFBZ0QsTUFBTTtBQUN0RGxDLE1BQUFBLE1BQU0sQ0FBQ3FFLE9BQVAsR0FBaUJuRCxLQUFLLENBQUNFLElBQU4sRUFBakI7QUFDQUYsTUFBQUEsS0FBSyxDQUFDRSxJQUFOLENBQVdwQixNQUFYLEVBQW1CLGlCQUFuQjs7QUFFQSxnQkFBV3NFLEdBQVgsR0FBa0I7QUFBRSxjQUFNLDBCQUFhLGlCQUFiLENBQU47QUFBdUM7O0FBRTNEdEUsTUFBQUEsTUFBTSxDQUFDbUQsc0JBQVAsQ0FBOEJtQixHQUFHLEVBQWpDOztBQUVBbEUsTUFBQUEsTUFBTSxDQUFDSixNQUFNLENBQUNxRSxPQUFQLENBQWUzQyxTQUFoQixDQUFOLENBQWlDckIsRUFBakMsQ0FBb0NzQixLQUFwQyxDQUEwQyxDQUExQztBQUNBdkIsTUFBQUEsTUFBTSxDQUFDSixNQUFNLENBQUN1RSxlQUFQLENBQXVCbEQsUUFBdkIsQ0FBZ0M7QUFDckNtRCxRQUFBQSxHQUFHLEVBQUUsSUFEZ0M7QUFFckNDLFFBQUFBLE9BQU8sRUFBRSxPQUY0QjtBQUdyQ0MsUUFBQUEsVUFBVSxFQUFFLENBQUM7QUFDWEMsVUFBQUEsSUFBSSxFQUFFLE1BREs7QUFFWGQsVUFBQUEsS0FBSyxFQUFFO0FBRkksU0FBRDtBQUh5QixPQUFoQyxFQU9KVCxVQVBHLENBQU4sQ0FPZS9DLEVBUGYsQ0FPa0JpQyxFQVBsQixDQU9xQmUsSUFQckI7QUFRRCxLQWpCQyxDQUFGO0FBbUJBbkIsSUFBQUEsRUFBRSxDQUFDLGdEQUFELEVBQW1ELE1BQU07QUFDekRoQixNQUFBQSxLQUFLLENBQUNFLElBQU4sQ0FBV3BCLE1BQVgsRUFBbUIsaUJBQW5COztBQUVBLGdCQUFXc0UsR0FBWCxHQUFrQjtBQUFFLGNBQU0sMEJBQWEsWUFBYixDQUFOO0FBQWtDOztBQUV0RHRFLE1BQUFBLE1BQU0sQ0FBQ21ELHNCQUFQLENBQThCbUIsR0FBRyxFQUFqQzs7QUFFQWxFLE1BQUFBLE1BQU0sQ0FBQ0osTUFBTSxDQUFDdUUsZUFBUCxDQUF1QmxELFFBQXZCLENBQWdDO0FBQ3JDbUQsUUFBQUEsR0FBRyxFQUFFLEdBRGdDO0FBRXJDQyxRQUFBQSxPQUFPLEVBQUUsUUFGNEI7QUFHckNDLFFBQUFBLFVBQVUsRUFBRSxFQUh5QjtBQUlyQ0UsUUFBQUEsRUFBRSxFQUFFO0FBSmlDLE9BQWhDLEVBS0p4QixVQUxHLENBQU4sQ0FLZS9DLEVBTGYsQ0FLa0JpQyxFQUxsQixDQUtxQmUsSUFMckI7QUFNRCxLQWJDLENBQUY7QUFlQW5CLElBQUFBLEVBQUUsQ0FBQyxrREFBRCxFQUFxRCxNQUFNO0FBQzNEaEIsTUFBQUEsS0FBSyxDQUFDRSxJQUFOLENBQVdwQixNQUFYLEVBQW1CLE1BQW5COztBQUVBLGdCQUFXc0UsR0FBWCxHQUFrQjtBQUFFLGNBQU0sMEJBQWEsbUJBQWIsQ0FBTjtBQUF5Qzs7QUFDN0R0RSxNQUFBQSxNQUFNLENBQUM2RSxlQUFQLEdBQXlCO0FBQ3ZCOUIsUUFBQUEsSUFBSSxFQUFFLENBQUMsY0FBRDtBQURpQixPQUF6Qjs7QUFJQS9DLE1BQUFBLE1BQU0sQ0FBQ21ELHNCQUFQLENBQThCbUIsR0FBRyxFQUFqQzs7QUFFQWxFLE1BQUFBLE1BQU0sQ0FBQ0osTUFBTSxDQUFDYyxJQUFQLENBQVlPLFFBQVosQ0FBcUIsa0JBQXJCLEVBQXlDSyxTQUExQyxDQUFOLENBQTJEckIsRUFBM0QsQ0FBOERzQixLQUE5RCxDQUFvRSxDQUFwRTtBQUNELEtBWEMsQ0FBRjtBQWFBTyxJQUFBQSxFQUFFLENBQUMsMkNBQUQsRUFBOEMsTUFBTTtBQUNwRGhCLE1BQUFBLEtBQUssQ0FBQ0UsSUFBTixDQUFXcEIsTUFBWCxFQUFtQixNQUFuQjs7QUFFQSxnQkFBV3NFLEdBQVgsR0FBa0I7QUFBRSxjQUFNLDBCQUFhLFVBQWIsQ0FBTjtBQUFnQzs7QUFDcER0RSxNQUFBQSxNQUFNLENBQUM2RSxlQUFQLEdBQXlCO0FBQ3ZCOUIsUUFBQUEsSUFBSSxFQUFFLEVBRGlCO0FBRXZCK0IsUUFBQUEsNkJBQTZCLEVBQUU7QUFGUixPQUF6Qjs7QUFLQTlFLE1BQUFBLE1BQU0sQ0FBQ21ELHNCQUFQLENBQThCbUIsR0FBRyxFQUFqQzs7QUFFQWxFLE1BQUFBLE1BQU0sQ0FBQ0osTUFBTSxDQUFDYyxJQUFQLENBQVlPLFFBQVosQ0FBcUIsTUFBckIsRUFBNkJLLFNBQTlCLENBQU4sQ0FBK0NyQixFQUEvQyxDQUFrRHNCLEtBQWxELENBQXdELENBQXhEO0FBQ0QsS0FaQyxDQUFGO0FBYUQsR0E3RE8sQ0FBUjtBQStEQTVCLEVBQUFBLFFBQVEsQ0FBQyxrQkFBRCxFQUFxQixNQUFNO0FBQ2pDbUMsSUFBQUEsRUFBRSxDQUFDLHlDQUFELEVBQTRDLE1BQU07QUFDbERoQixNQUFBQSxLQUFLLENBQUNFLElBQU4sQ0FBV3BCLE1BQVgsRUFBbUIsa0JBQW5CO0FBQ0FrQixNQUFBQSxLQUFLLENBQUNFLElBQU4sQ0FBV3BCLE1BQVgsRUFBbUIsY0FBbkI7O0FBRUFBLE1BQUFBLE1BQU0sQ0FBQzRDLHFCQUFQLENBQTZCbUMsSUFBN0IsR0FBb0MsTUFBTSxDQUFHLENBQTdDOztBQUNBN0QsTUFBQUEsS0FBSyxDQUFDRSxJQUFOLENBQVdwQixNQUFNLENBQUM0QyxxQkFBbEIsRUFBeUMsTUFBekM7QUFFQTVDLE1BQUFBLE1BQU0sQ0FBQzZFLGVBQVAsR0FBeUIsS0FBekI7O0FBQ0E3RSxNQUFBQSxNQUFNLENBQUN1RSxlQUFQLENBQXVCO0FBQ3JCQyxRQUFBQSxHQUFHLEVBQUUsR0FEZ0I7QUFFckJDLFFBQUFBLE9BQU8sRUFBRTtBQUZZLE9BQXZCOztBQUtBckUsTUFBQUEsTUFBTSxDQUFDSixNQUFNLENBQUNnRixZQUFQLENBQW9CdEQsU0FBckIsQ0FBTixDQUFzQ3JCLEVBQXRDLENBQXlDc0IsS0FBekMsQ0FBK0MsQ0FBL0M7QUFDQXZCLE1BQUFBLE1BQU0sQ0FBQ0osTUFBTSxDQUFDNEMscUJBQVAsQ0FBNkJtQyxJQUE3QixDQUFrQzFELFFBQWxDLENBQTJDO0FBQ2hEbUQsUUFBQUEsR0FBRyxFQUFFLEdBRDJDO0FBRWhEQyxRQUFBQSxPQUFPLEVBQUU7QUFGdUMsT0FBM0MsRUFHSi9DLFNBSEcsQ0FBTixDQUdjckIsRUFIZCxDQUdpQnNCLEtBSGpCLENBR3VCLENBSHZCO0FBSUQsS0FsQkMsQ0FBRjtBQW9CQU8sSUFBQUEsRUFBRSxDQUFDLHdDQUFELEVBQTJDLE1BQU07QUFDakRoQixNQUFBQSxLQUFLLENBQUNFLElBQU4sQ0FBV3BCLE1BQVgsRUFBbUIsa0JBQW5COztBQUNBQSxNQUFBQSxNQUFNLENBQUM0QyxxQkFBUCxDQUE2Qm1DLElBQTdCLEdBQW9DLE1BQU0sQ0FBRyxDQUE3Qzs7QUFDQTdELE1BQUFBLEtBQUssQ0FBQ0UsSUFBTixDQUFXcEIsTUFBTSxDQUFDNEMscUJBQWxCLEVBQXlDLE1BQXpDO0FBQ0ExQixNQUFBQSxLQUFLLENBQUNFLElBQU4sQ0FBV3BCLE1BQVgsRUFBbUIsY0FBbkI7QUFFQUEsTUFBQUEsTUFBTSxDQUFDNkUsZUFBUCxHQUF5QjtBQUN2QkksUUFBQUEsT0FBTyxFQUFFO0FBRGMsT0FBekI7O0FBR0FqRixNQUFBQSxNQUFNLENBQUN1RSxlQUFQLENBQXVCO0FBQ3JCQyxRQUFBQSxHQUFHLEVBQUUsR0FEZ0I7QUFFckJDLFFBQUFBLE9BQU8sRUFBRTtBQUZZLE9BQXZCOztBQUtBckUsTUFBQUEsTUFBTSxDQUFDSixNQUFNLENBQUNnRixZQUFQLENBQW9CdEQsU0FBckIsQ0FBTixDQUFzQ3JCLEVBQXRDLENBQXlDc0IsS0FBekMsQ0FBK0MsQ0FBL0M7QUFDQXZCLE1BQUFBLE1BQU0sQ0FBQ0osTUFBTSxDQUFDNEMscUJBQVAsQ0FBNkJtQyxJQUE3QixDQUFrQzFELFFBQWxDLENBQTJDO0FBQ2hEbUQsUUFBQUEsR0FBRyxFQUFFLEdBRDJDO0FBRWhEQyxRQUFBQSxPQUFPLEVBQUU7QUFGdUMsT0FBM0MsRUFHSi9DLFNBSEcsQ0FBTixDQUdjckIsRUFIZCxDQUdpQnNCLEtBSGpCLENBR3VCLENBSHZCO0FBSUQsS0FuQkMsQ0FBRjtBQXFCQU8sSUFBQUEsRUFBRSxDQUFDLHdCQUFELEVBQTJCLE1BQU07QUFDakNoQixNQUFBQSxLQUFLLENBQUNFLElBQU4sQ0FBV3BCLE1BQVgsRUFBbUIsa0JBQW5COztBQUNBQSxNQUFBQSxNQUFNLENBQUM0QyxxQkFBUCxDQUE2Qm1DLElBQTdCLEdBQW9DLE1BQU0sQ0FBRyxDQUE3Qzs7QUFDQTdELE1BQUFBLEtBQUssQ0FBQ0UsSUFBTixDQUFXcEIsTUFBTSxDQUFDNEMscUJBQWxCLEVBQXlDLE1BQXpDO0FBRUE1QyxNQUFBQSxNQUFNLENBQUM2RSxlQUFQLEdBQXlCO0FBQ3ZCSSxRQUFBQSxPQUFPLEVBQUU7QUFDUEYsVUFBQUEsSUFBSSxFQUFFO0FBREM7QUFEYyxPQUF6Qjs7QUFLQS9FLE1BQUFBLE1BQU0sQ0FBQ3VFLGVBQVAsQ0FBdUI7QUFDckJDLFFBQUFBLEdBQUcsRUFBRSxHQURnQjtBQUVyQkMsUUFBQUEsT0FBTyxFQUFFO0FBRlksT0FBdkI7O0FBS0FyRSxNQUFBQSxNQUFNLENBQUNKLE1BQU0sQ0FBQzRDLHFCQUFQLENBQTZCbUMsSUFBN0IsQ0FBa0NyRCxTQUFuQyxDQUFOLENBQW9EckIsRUFBcEQsQ0FBdURzQixLQUF2RCxDQUE2RCxDQUE3RDtBQUNBdkIsTUFBQUEsTUFBTSxDQUFDSixNQUFNLENBQUM2RSxlQUFQLENBQXVCSSxPQUF2QixDQUErQkYsSUFBaEMsQ0FBTixDQUE0QzFFLEVBQTVDLENBQStDNkUsSUFBL0MsQ0FBb0R2RCxLQUFwRCxDQUEwRCxDQUFDO0FBQ3pENkMsUUFBQUEsR0FBRyxFQUFFLEdBRG9EO0FBRXpEQyxRQUFBQSxPQUFPLEVBQUU7QUFGZ0QsT0FBRCxDQUExRDtBQUlELEtBcEJDLENBQUY7QUFzQkF2QyxJQUFBQSxFQUFFLENBQUMsZ0NBQUQsRUFBbUMsTUFBTTtBQUN6Q2hCLE1BQUFBLEtBQUssQ0FBQ0UsSUFBTixDQUFXcEIsTUFBWCxFQUFtQixrQkFBbkI7QUFDQWtCLE1BQUFBLEtBQUssQ0FBQ0UsSUFBTixDQUFXcEIsTUFBWCxFQUFtQixjQUFuQjs7QUFDQUEsTUFBQUEsTUFBTSxDQUFDNEMscUJBQVAsQ0FBNkJtQyxJQUE3QixHQUFvQyxNQUFNLENBQUcsQ0FBN0M7O0FBQ0E3RCxNQUFBQSxLQUFLLENBQUNFLElBQU4sQ0FBV3BCLE1BQU0sQ0FBQzRDLHFCQUFsQixFQUF5QyxNQUF6QztBQUVBNUMsTUFBQUEsTUFBTSxDQUFDNkUsZUFBUCxHQUF5QjtBQUN2QkwsUUFBQUEsR0FBRyxFQUFFLEdBRGtCO0FBRXZCVyxRQUFBQSxRQUFRLEVBQUdDLFFBQUQsSUFBYztBQUN0QmhGLFVBQUFBLE1BQU0sQ0FBQ2dGLFFBQUQsQ0FBTixDQUFpQi9FLEVBQWpCLENBQW9CNkUsSUFBcEIsQ0FBeUJ2RCxLQUF6QixDQUErQjtBQUM3QjZDLFlBQUFBLEdBQUcsRUFBRSxHQUR3QjtBQUU3QkMsWUFBQUEsT0FBTyxFQUFFLE1BRm9CO0FBRzdCUSxZQUFBQSxPQUFPLEVBQUU7QUFDUEYsY0FBQUEsSUFBSSxFQUFFO0FBREM7QUFIb0IsV0FBL0I7QUFPRCxTQVZzQjtBQVd2QkUsUUFBQUEsT0FBTyxFQUFFO0FBQ1BGLFVBQUFBLElBQUksRUFBRTtBQURDO0FBWGMsT0FBekI7O0FBZUEvRSxNQUFBQSxNQUFNLENBQUN1RSxlQUFQLENBQXVCO0FBQ3JCQyxRQUFBQSxHQUFHLEVBQUUsR0FEZ0I7QUFFckJDLFFBQUFBLE9BQU8sRUFBRTtBQUZZLE9BQXZCOztBQUtBckUsTUFBQUEsTUFBTSxDQUFDSixNQUFNLENBQUNnRixZQUFQLENBQW9CdEQsU0FBckIsQ0FBTixDQUFzQ3JCLEVBQXRDLENBQXlDc0IsS0FBekMsQ0FBK0MsQ0FBL0M7QUFDQXZCLE1BQUFBLE1BQU0sQ0FBQ0osTUFBTSxDQUFDNEMscUJBQVAsQ0FBNkJtQyxJQUE3QixDQUFrQ3JELFNBQW5DLENBQU4sQ0FBb0RyQixFQUFwRCxDQUF1RHNCLEtBQXZELENBQTZELENBQTdEO0FBQ0QsS0E1QkMsQ0FBRjtBQTZCRCxHQTdGTyxDQUFSO0FBK0ZBNUIsRUFBQUEsUUFBUSxDQUFDLGlCQUFELEVBQW9CLE1BQU07QUFDaENtQyxJQUFBQSxFQUFFLENBQUMseUJBQUQsRUFBNEIsTUFBTTtBQUNsQ2hCLE1BQUFBLEtBQUssQ0FBQ0UsSUFBTixDQUFXcEIsTUFBWCxFQUFtQixjQUFuQixFQUFtQ3FGLFNBQW5DLENBQTZDLE1BQU07QUFDakRyRixRQUFBQSxNQUFNLENBQUNzRixZQUFQLENBQW9CLENBQXBCLEVBQXVCSCxRQUF2QixDQUFnQztBQUFFVixVQUFBQSxPQUFPLEVBQUU7QUFBWCxTQUFoQztBQUNELE9BRkQ7QUFJQXpFLE1BQUFBLE1BQU0sQ0FBQ3VGLFdBQVAsR0FBcUIsR0FBckI7QUFDQXZGLE1BQUFBLE1BQU0sQ0FBQ3NGLFlBQVAsR0FBc0IsRUFBdEI7QUFDQXRGLE1BQUFBLE1BQU0sQ0FBQ3dGLFFBQVAsR0FBa0IsSUFBbEI7QUFFQSxhQUFPeEYsTUFBTSxDQUFDeUYsY0FBUCxDQUFzQjtBQUMzQmhCLFFBQUFBLE9BQU8sRUFBRTtBQURrQixPQUF0QixFQUVKLENBQUMsS0FBRCxDQUZJLEVBRUs7QUFDVmlCLFFBQUFBLENBQUMsRUFBRTtBQURPLE9BRkwsRUFJSkMsS0FKSSxDQUlHQyxHQUFELElBQVM7QUFDaEJ4RixRQUFBQSxNQUFNLENBQUN3RixHQUFELENBQU4sQ0FBWXZGLEVBQVosQ0FBZUMsS0FBZjtBQUNELE9BTk0sQ0FBUDtBQU9ELEtBaEJDLENBQUY7QUFrQkE0QixJQUFBQSxFQUFFLENBQUMsdUJBQUQsRUFBMEIsTUFBTTtBQUNoQ2hCLE1BQUFBLEtBQUssQ0FBQ0UsSUFBTixDQUFXcEIsTUFBWCxFQUFtQixjQUFuQixFQUFtQ3FGLFNBQW5DLENBQTZDLE1BQU07QUFDakRyRixRQUFBQSxNQUFNLENBQUNzRixZQUFQLENBQW9CLENBQXBCLEVBQXVCSCxRQUF2QixDQUFnQyxFQUFoQztBQUNELE9BRkQ7QUFJQW5GLE1BQUFBLE1BQU0sQ0FBQ3VGLFdBQVAsR0FBcUIsR0FBckI7QUFDQXZGLE1BQUFBLE1BQU0sQ0FBQ3NGLFlBQVAsR0FBc0IsRUFBdEI7QUFDQXRGLE1BQUFBLE1BQU0sQ0FBQ3dGLFFBQVAsR0FBa0IsSUFBbEI7QUFFQSxhQUFPeEYsTUFBTSxDQUFDeUYsY0FBUCxDQUFzQjtBQUMzQmhCLFFBQUFBLE9BQU8sRUFBRTtBQURrQixPQUF0QixFQUVKLENBQUMsS0FBRCxDQUZJLEVBRUs7QUFDVmlCLFFBQUFBLENBQUMsRUFBRTtBQURPLE9BRkwsRUFJSmpFLElBSkksQ0FJQyxNQUFNO0FBQ1pyQixRQUFBQSxNQUFNLENBQUNKLE1BQU0sQ0FBQ2dGLFlBQVAsQ0FBb0J0RCxTQUFyQixDQUFOLENBQXNDckIsRUFBdEMsQ0FBeUNzQixLQUF6QyxDQUErQyxDQUEvQztBQUNBdkIsUUFBQUEsTUFBTSxDQUFDSixNQUFNLENBQUNzRixZQUFQLENBQW9CTyxNQUFyQixDQUFOLENBQW1DeEYsRUFBbkMsQ0FBc0NzQixLQUF0QyxDQUE0QyxDQUE1QztBQUNBdkIsUUFBQUEsTUFBTSxDQUFDSixNQUFNLENBQUNzRixZQUFQLENBQW9CLENBQXBCLEVBQXVCZCxHQUF4QixDQUFOLENBQW1DbkUsRUFBbkMsQ0FBc0NzQixLQUF0QyxDQUE0QyxNQUE1QztBQUNBdkIsUUFBQUEsTUFBTSxDQUFDSixNQUFNLENBQUNzRixZQUFQLENBQW9CLENBQXBCLEVBQXVCUSxPQUF4QixDQUFOLENBQXVDekYsRUFBdkMsQ0FBMEM2RSxJQUExQyxDQUErQ3ZELEtBQS9DLENBQXFEO0FBQ25EOEMsVUFBQUEsT0FBTyxFQUFFLEtBRDBDO0FBRW5ERCxVQUFBQSxHQUFHLEVBQUU7QUFGOEMsU0FBckQ7QUFJQXBFLFFBQUFBLE1BQU0sQ0FBQ0osTUFBTSxDQUFDc0YsWUFBUCxDQUFvQixDQUFwQixFQUF1QkksQ0FBeEIsQ0FBTixDQUFpQ3JGLEVBQWpDLENBQW9Dc0IsS0FBcEMsQ0FBMEMsQ0FBMUM7QUFDRCxPQWJNLENBQVA7QUFjRCxLQXZCQyxDQUFGO0FBeUJBTyxJQUFBQSxFQUFFLENBQUMsbUJBQUQsRUFBc0IsTUFBTTtBQUM1QmhCLE1BQUFBLEtBQUssQ0FBQ0UsSUFBTixDQUFXcEIsTUFBWCxFQUFtQixjQUFuQjtBQUVBQSxNQUFBQSxNQUFNLENBQUN1RixXQUFQLEdBQXFCLEdBQXJCO0FBQ0F2RixNQUFBQSxNQUFNLENBQUNzRixZQUFQLEdBQXNCLEVBQXRCO0FBQ0F0RixNQUFBQSxNQUFNLENBQUN3RixRQUFQLEdBQWtCLEtBQWxCO0FBRUF4RCxNQUFBQSxVQUFVLENBQUMsTUFBTTtBQUFFaEMsUUFBQUEsTUFBTSxDQUFDc0YsWUFBUCxDQUFvQixDQUFwQixFQUF1QkgsUUFBdkIsQ0FBZ0MsRUFBaEM7QUFBcUMsT0FBOUMsRUFBZ0QsQ0FBaEQsQ0FBVjtBQUVBLGFBQU9uRixNQUFNLENBQUN5RixjQUFQLENBQXNCO0FBQzNCaEIsUUFBQUEsT0FBTyxFQUFFO0FBRGtCLE9BQXRCLEVBRUosQ0FBQyxLQUFELENBRkksRUFFSztBQUNWaUIsUUFBQUEsQ0FBQyxFQUFFO0FBRE8sT0FGTCxFQUlKakUsSUFKSSxDQUlDLE1BQU07QUFDWnJCLFFBQUFBLE1BQU0sQ0FBQ0osTUFBTSxDQUFDZ0YsWUFBUCxDQUFvQnRELFNBQXJCLENBQU4sQ0FBc0NyQixFQUF0QyxDQUF5Q3NCLEtBQXpDLENBQStDLENBQS9DO0FBQ0F2QixRQUFBQSxNQUFNLENBQUNKLE1BQU0sQ0FBQ3NGLFlBQVAsQ0FBb0JPLE1BQXJCLENBQU4sQ0FBbUN4RixFQUFuQyxDQUFzQ3NCLEtBQXRDLENBQTRDLENBQTVDO0FBQ0F2QixRQUFBQSxNQUFNLENBQUNKLE1BQU0sQ0FBQ3NGLFlBQVAsQ0FBb0IsQ0FBcEIsRUFBdUJkLEdBQXhCLENBQU4sQ0FBbUNuRSxFQUFuQyxDQUFzQ3NCLEtBQXRDLENBQTRDLE1BQTVDO0FBQ0QsT0FSTSxDQUFQO0FBU0QsS0FsQkMsQ0FBRjtBQW9CQU8sSUFBQUEsRUFBRSxDQUFDLGtEQUFELEVBQXFELE1BQU07QUFDM0RoQixNQUFBQSxLQUFLLENBQUNFLElBQU4sQ0FBV3BCLE1BQVgsRUFBbUIsY0FBbkI7QUFFQUEsTUFBQUEsTUFBTSxDQUFDdUYsV0FBUCxHQUFxQixHQUFyQjtBQUNBdkYsTUFBQUEsTUFBTSxDQUFDc0YsWUFBUCxHQUFzQixFQUF0QjtBQUNBdEYsTUFBQUEsTUFBTSxDQUFDd0YsUUFBUCxHQUFrQixLQUFsQjtBQUVBeEQsTUFBQUEsVUFBVSxDQUFDLE1BQU07QUFBRWhDLFFBQUFBLE1BQU0sQ0FBQ3NGLFlBQVAsQ0FBb0IsQ0FBcEIsRUFBdUJILFFBQXZCLENBQWdDLEVBQWhDO0FBQXFDLE9BQTlDLEVBQWdELENBQWhELENBQVY7QUFDQSxhQUFPbkYsTUFBTSxDQUFDeUYsY0FBUCxDQUFzQjtBQUMzQmhCLFFBQUFBLE9BQU8sRUFBRSxLQURrQjtBQUUzQnNCLFFBQUFBLGFBQWEsRUFBRTtBQUZZLE9BQXRCLEVBR0osQ0FBQyxLQUFELENBSEksRUFHSztBQUNWTCxRQUFBQSxDQUFDLEVBQUU7QUFETyxPQUhMLEVBS0pqRSxJQUxJLENBS0MsTUFBTTtBQUNackIsUUFBQUEsTUFBTSxDQUFDSixNQUFNLENBQUNzRixZQUFQLENBQW9CLENBQXBCLEVBQXVCUSxPQUF2QixDQUErQkMsYUFBaEMsQ0FBTixDQUFxRDFGLEVBQXJELENBQXdEc0IsS0FBeEQsQ0FBOEQsS0FBOUQ7QUFDRCxPQVBNLENBQVA7QUFRRCxLQWhCQyxDQUFGO0FBaUJELEdBakZPLENBQVI7QUFtRkE1QixFQUFBQSxRQUFRLENBQUMsZUFBRCxFQUFrQixNQUFNO0FBQzlCbUMsSUFBQUEsRUFBRSxDQUFDLDRDQUFELEVBQStDLE1BQU07QUFDckRoQixNQUFBQSxLQUFLLENBQUNFLElBQU4sQ0FBV3BCLE1BQVgsRUFBbUIsWUFBbkI7QUFFQUEsTUFBQUEsTUFBTSxDQUFDc0YsWUFBUCxHQUFzQixFQUF0Qjs7QUFDQXRGLE1BQUFBLE1BQU0sQ0FBQ2dGLFlBQVA7O0FBRUE1RSxNQUFBQSxNQUFNLENBQUNKLE1BQU0sQ0FBQ2dHLFVBQVAsQ0FBa0J0RSxTQUFuQixDQUFOLENBQW9DckIsRUFBcEMsQ0FBdUNzQixLQUF2QyxDQUE2QyxDQUE3QztBQUNELEtBUEMsQ0FBRjtBQVNBTyxJQUFBQSxFQUFFLENBQUMsa0JBQUQsRUFBcUIsTUFBTTtBQUMzQmhCLE1BQUFBLEtBQUssQ0FBQ0UsSUFBTixDQUFXcEIsTUFBWCxFQUFtQixZQUFuQjtBQUNBa0IsTUFBQUEsS0FBSyxDQUFDRSxJQUFOLENBQVdwQixNQUFYLEVBQW1CLE1BQW5CO0FBRUFBLE1BQUFBLE1BQU0sQ0FBQ3NGLFlBQVAsR0FBc0IsQ0FBQztBQUNyQlEsUUFBQUEsT0FBTyxFQUFFO0FBQ1B0QixVQUFBQSxHQUFHLEVBQUUsTUFERTtBQUVQQyxVQUFBQSxPQUFPLEVBQUU7QUFGRjtBQURZLE9BQUQsQ0FBdEI7O0FBTUF6RSxNQUFBQSxNQUFNLENBQUNnRixZQUFQOztBQUVBNUUsTUFBQUEsTUFBTSxDQUFDSixNQUFNLENBQUNpRyxVQUFQLENBQWtCdkUsU0FBbkIsQ0FBTixDQUFvQ3JCLEVBQXBDLENBQXVDc0IsS0FBdkMsQ0FBNkMsQ0FBN0M7QUFDQXZCLE1BQUFBLE1BQU0sQ0FBQ0osTUFBTSxDQUFDYyxJQUFQLENBQVlvRixJQUFaLENBQWlCLENBQWpCLEVBQW9CLENBQXBCLENBQUQsQ0FBTixDQUErQjdGLEVBQS9CLENBQWtDc0IsS0FBbEMsQ0FBd0MsZUFBeEM7QUFDRCxLQWRDLENBQUY7QUFnQkFPLElBQUFBLEVBQUUsQ0FBQywwQkFBRCxFQUE2QixNQUFNO0FBQ25DaEIsTUFBQUEsS0FBSyxDQUFDRSxJQUFOLENBQVdwQixNQUFYLEVBQW1CLFlBQW5CO0FBQ0FrQixNQUFBQSxLQUFLLENBQUNFLElBQU4sQ0FBV3BCLE1BQVgsRUFBbUIsTUFBbkI7QUFFQUEsTUFBQUEsTUFBTSxDQUFDc0YsWUFBUCxHQUFzQixDQUFDO0FBQ3JCUSxRQUFBQSxPQUFPLEVBQUU7QUFDUHRCLFVBQUFBLEdBQUcsRUFBRSxNQURFO0FBRVBDLFVBQUFBLE9BQU8sRUFBRSxNQUZGO0FBR1BDLFVBQUFBLFVBQVUsRUFBRSxDQUFDO0FBQ1hDLFlBQUFBLElBQUksRUFBRSxTQURLO0FBRVhkLFlBQUFBLEtBQUssRUFBRTtBQUZJLFdBQUQ7QUFITDtBQURZLE9BQUQsQ0FBdEI7O0FBVUE3RCxNQUFBQSxNQUFNLENBQUNnRixZQUFQOztBQUVBNUUsTUFBQUEsTUFBTSxDQUFDSixNQUFNLENBQUNpRyxVQUFQLENBQWtCdkUsU0FBbkIsQ0FBTixDQUFvQ3JCLEVBQXBDLENBQXVDc0IsS0FBdkMsQ0FBNkMsQ0FBN0M7QUFDQXZCLE1BQUFBLE1BQU0sQ0FBQ0osTUFBTSxDQUFDYyxJQUFQLENBQVlvRixJQUFaLENBQWlCLENBQWpCLEVBQW9CLENBQXBCLENBQUQsQ0FBTixDQUErQjdGLEVBQS9CLENBQWtDc0IsS0FBbEMsQ0FBd0MsbUJBQXhDO0FBQ0F2QixNQUFBQSxNQUFNLENBQUNKLE1BQU0sQ0FBQzZFLGVBQVAsQ0FBdUI5QixJQUF4QixDQUFOLENBQW9DMUMsRUFBcEMsQ0FBdUM2RSxJQUF2QyxDQUE0Q3ZELEtBQTVDLENBQWtELENBQUMsS0FBRCxDQUFsRDtBQUNELEtBbkJDLENBQUY7QUFxQkFPLElBQUFBLEVBQUUsQ0FBQyxxQkFBRCxFQUF5QlksSUFBRCxJQUFVO0FBQ2xDNUIsTUFBQUEsS0FBSyxDQUFDRSxJQUFOLENBQVdwQixNQUFYLEVBQW1CLFlBQW5CO0FBRUFBLE1BQUFBLE1BQU0sQ0FBQ3dGLFFBQVAsR0FBa0IsSUFBbEI7QUFDQXhGLE1BQUFBLE1BQU0sQ0FBQ3NGLFlBQVAsR0FBc0IsQ0FBQztBQUNyQlEsUUFBQUEsT0FBTyxFQUFFO0FBQ1B0QixVQUFBQSxHQUFHLEVBQUUsTUFERTtBQUVQQyxVQUFBQSxPQUFPLEVBQUUsTUFGRjtBQUdQQyxVQUFBQSxVQUFVLEVBQUUsQ0FBQztBQUNYQyxZQUFBQSxJQUFJLEVBQUUsU0FESztBQUVYZCxZQUFBQSxLQUFLLEVBQUU7QUFGSSxXQUFEO0FBSEwsU0FEWTtBQVNyQnNDLFFBQUFBLFFBQVEsRUFBR0MsR0FBRCxJQUFTO0FBQ2pCaEcsVUFBQUEsTUFBTSxDQUFDZ0csR0FBRCxDQUFOLENBQVkvRixFQUFaLENBQWVDLEtBQWY7QUFDQUYsVUFBQUEsTUFBTSxDQUFDSixNQUFNLENBQUN3RixRQUFSLENBQU4sQ0FBd0JuRixFQUF4QixDQUEyQmlDLEVBQTNCLENBQThCZSxJQUE5Qjs7QUFDQXJELFVBQUFBLE1BQU0sQ0FBQ2dGLFlBQVAsR0FBc0IsTUFBTTtBQUMxQjVFLFlBQUFBLE1BQU0sQ0FBQ0osTUFBTSxDQUFDc0YsWUFBUCxDQUFvQk8sTUFBckIsQ0FBTixDQUFtQ3hGLEVBQW5DLENBQXNDc0IsS0FBdEMsQ0FBNEMsQ0FBNUM7QUFDQXZCLFlBQUFBLE1BQU0sQ0FBQ0osTUFBTSxDQUFDc0YsWUFBUCxDQUFvQixDQUFwQixFQUF1QmQsR0FBeEIsQ0FBTixDQUFtQ25FLEVBQW5DLENBQXNDZ0csT0FBdEMsQ0FBOEMsSUFBOUM7QUFDQWpHLFlBQUFBLE1BQU0sQ0FBQ0osTUFBTSxDQUFDc0YsWUFBUCxDQUFvQixDQUFwQixFQUF1QlEsT0FBdkIsQ0FBK0J0QixHQUFoQyxDQUFOLENBQTJDbkUsRUFBM0MsQ0FBOENnRyxPQUE5QyxDQUFzRCxJQUF0RDs7QUFDQXJHLFlBQUFBLE1BQU0sQ0FBQ2lHLFVBQVAsQ0FBa0JLLE9BQWxCOztBQUNBeEQsWUFBQUEsSUFBSTtBQUNMLFdBTkQ7O0FBT0E5QyxVQUFBQSxNQUFNLENBQUN5RixjQUFQLENBQXNCLEVBQXRCLEVBQTBCM0IsU0FBMUIsRUFBcUM7QUFDbkNzQyxZQUFBQSxHQUFHLEVBQUVBO0FBRDhCLFdBQXJDO0FBR0EsaUJBQU9HLE9BQU8sQ0FBQ0MsT0FBUixFQUFQO0FBQ0Q7QUF2Qm9CLE9BQUQsQ0FBdEI7O0FBeUJBeEcsTUFBQUEsTUFBTSxDQUFDZ0YsWUFBUDtBQUNELEtBOUJDLENBQUY7QUErQkQsR0E5RU8sQ0FBUjtBQWdGQWpGLEVBQUFBLFFBQVEsQ0FBQyxhQUFELEVBQWdCLE1BQU07QUFDNUJtQyxJQUFBQSxFQUFFLENBQUMsdUJBQUQsRUFBMkJZLElBQUQsSUFBVTtBQUNwQzlDLE1BQUFBLE1BQU0sQ0FBQ3lHLE1BQVAsR0FBZ0IsTUFBTTtBQUNwQjNELFFBQUFBLElBQUk7QUFDTCxPQUZEOztBQUdBOUMsTUFBQUEsTUFBTSxDQUFDMEcsZ0JBQVAsR0FBMEIsQ0FBMUI7O0FBRUExRyxNQUFBQSxNQUFNLENBQUNnRyxVQUFQO0FBQ0QsS0FQQyxDQUFGO0FBUUQsR0FUTyxDQUFSO0FBV0FqRyxFQUFBQSxRQUFRLENBQUMsbUJBQUQsRUFBc0IsTUFBTTtBQUNsQ21DLElBQUFBLEVBQUUsQ0FBQywwQkFBRCxFQUE2QixNQUFNO0FBQ25DLFVBQUlrRCxRQUFRLEdBQUc7QUFDYlosUUFBQUEsR0FBRyxFQUFFLEdBRFE7QUFFYkMsUUFBQUEsT0FBTyxFQUFFLElBRkk7QUFHYkMsUUFBQUEsVUFBVSxFQUFFLENBQUM7QUFDWEMsVUFBQUEsSUFBSSxFQUFFLE1BREs7QUFFWGQsVUFBQUEsS0FBSyxFQUFFO0FBRkksU0FBRDtBQUhDLE9BQWY7O0FBUUE3RCxNQUFBQSxNQUFNLENBQUMyRyxnQkFBUCxDQUF3QnZCLFFBQXhCOztBQUVBaEYsTUFBQUEsTUFBTSxDQUFDZ0YsUUFBUSxDQUFDd0IsYUFBVixDQUFOLENBQStCdkcsRUFBL0IsQ0FBa0NzQixLQUFsQyxDQUF3QyxrQkFBeEM7QUFDRCxLQVpDLENBQUY7QUFjQU8sSUFBQUEsRUFBRSxDQUFDLDBCQUFELEVBQTZCLE1BQU07QUFDbkMsVUFBSWtELFFBQVEsR0FBRztBQUNiWixRQUFBQSxHQUFHLEVBQUUsR0FEUTtBQUViQyxRQUFBQSxPQUFPLEVBQUUsSUFGSTtBQUdiQyxRQUFBQSxVQUFVLEVBQUUsQ0FBQztBQUNYQyxVQUFBQSxJQUFJLEVBQUUsTUFESztBQUVYa0MsVUFBQUEsT0FBTyxFQUFFLENBQUM7QUFDUmxDLFlBQUFBLElBQUksRUFBRSxNQURFO0FBRVJkLFlBQUFBLEtBQUssRUFBRTtBQUZDLFdBQUQsRUFHTjtBQUNEYyxZQUFBQSxJQUFJLEVBQUUsTUFETDtBQUVEZCxZQUFBQSxLQUFLLEVBQUU7QUFGTixXQUhNLEVBTU47QUFDRGMsWUFBQUEsSUFBSSxFQUFFLE1BREw7QUFFRGQsWUFBQUEsS0FBSyxFQUFFO0FBRk4sV0FOTTtBQUZFLFNBQUQsRUFZVDtBQUNEYyxVQUFBQSxJQUFJLEVBQUUsTUFETDtBQUVEZCxVQUFBQSxLQUFLLEVBQUU7QUFGTixTQVpTO0FBSEMsT0FBZjs7QUFvQkE3RCxNQUFBQSxNQUFNLENBQUMyRyxnQkFBUCxDQUF3QnZCLFFBQXhCOztBQUNBaEYsTUFBQUEsTUFBTSxDQUFDZ0YsUUFBUSxDQUFDMEIsSUFBVixDQUFOLENBQXNCekcsRUFBdEIsQ0FBeUJzQixLQUF6QixDQUErQixZQUEvQjtBQUNBdkIsTUFBQUEsTUFBTSxDQUFDZ0YsUUFBUSxDQUFDMkIsVUFBVixDQUFOLENBQTRCMUcsRUFBNUIsQ0FBK0I2RSxJQUEvQixDQUFvQ3ZELEtBQXBDLENBQTBDLENBQUMsV0FBRCxFQUFjLFNBQWQsQ0FBMUM7QUFDRCxLQXhCQyxDQUFGO0FBeUJELEdBeENPLENBQVI7QUEwQ0E1QixFQUFBQSxRQUFRLENBQUMsVUFBRCxFQUFhLE1BQU07QUFDekJtQyxJQUFBQSxFQUFFLENBQUMsd0NBQUQsRUFBMkMsTUFBTTtBQUNqRDlCLE1BQUFBLE1BQU0sQ0FBQ0osTUFBTSxDQUFDZ0gsT0FBUCxDQUFlLElBQUlDLFVBQUosQ0FBZSxLQUFmLENBQWYsQ0FBRCxDQUFOLENBQThDNUcsRUFBOUMsQ0FBaURpQyxFQUFqRCxDQUFvRGUsSUFBcEQ7QUFDQWpELE1BQUFBLE1BQU0sQ0FBQ0osTUFBTSxDQUFDZ0gsT0FBUCxDQUFlLEtBQWYsQ0FBRCxDQUFOLENBQThCM0csRUFBOUIsQ0FBaUNpQyxFQUFqQyxDQUFvQ0MsS0FBcEM7QUFDRCxLQUhDLENBQUY7QUFJRCxHQUxPLENBQVI7QUFPQXhDLEVBQUFBLFFBQVEsQ0FBQyxvQkFBRCxFQUF1QixNQUFNO0FBQ25DbUMsSUFBQUEsRUFBRSxDQUFDLDZDQUFELEVBQWdELE1BQU07QUFDdERsQyxNQUFBQSxNQUFNLENBQUNtQyxNQUFQLENBQWNKLE1BQWQsR0FBdUIsTUFBTSxDQUFHLENBQWhDOztBQUNBYixNQUFBQSxLQUFLLENBQUNFLElBQU4sQ0FBV3BCLE1BQU0sQ0FBQ21DLE1BQWxCLEVBQTBCLFFBQTFCO0FBRUEvQixNQUFBQSxNQUFNLENBQUNKLE1BQU0sQ0FBQ2tILFVBQVIsQ0FBTixDQUEwQjdHLEVBQTFCLENBQTZCaUMsRUFBN0IsQ0FBZ0NDLEtBQWhDO0FBQ0F2QyxNQUFBQSxNQUFNLENBQUNtSCxpQkFBUDtBQUNBL0csTUFBQUEsTUFBTSxDQUFDSixNQUFNLENBQUNrSCxVQUFSLENBQU4sQ0FBMEI3RyxFQUExQixDQUE2QmlDLEVBQTdCLENBQWdDZSxJQUFoQztBQUVBLFlBQU00QixPQUFPLEdBQUcsUUFBaEI7QUFDQSxZQUFNbUMsUUFBUSxHQUFHbkMsT0FBTyxDQUFDb0MsS0FBUixDQUFjLEVBQWQsRUFBa0JDLEdBQWxCLENBQXNCQyxJQUFJLElBQUlBLElBQUksQ0FBQ0MsVUFBTCxDQUFnQixDQUFoQixDQUE5QixDQUFqQjtBQUVBeEgsTUFBQUEsTUFBTSxDQUFDYyxJQUFQLENBQVltRSxPQUFaO0FBQ0EsWUFBTXdDLFNBQVMsR0FBR3hILFVBQVUsQ0FBQ2EsSUFBWCxDQUFnQm9GLElBQWhCLENBQXFCLENBQXJCLEVBQXdCLENBQXhCLENBQWxCO0FBQ0FsRyxNQUFBQSxNQUFNLENBQUNtQyxNQUFQLENBQWNKLE1BQWQsQ0FBcUI7QUFBRWdCLFFBQUFBLElBQUksRUFBRTBFO0FBQVIsT0FBckI7QUFDQXJILE1BQUFBLE1BQU0sQ0FBQ3NILE1BQU0sQ0FBQ0MsSUFBUCxDQUFZM0gsTUFBTSxDQUFDNEgsYUFBUCxDQUFxQjFCLElBQXJCLENBQTBCLENBQTFCLEVBQTZCLENBQTdCLEVBQWdDbkQsSUFBNUMsQ0FBRCxDQUFOLENBQTBEMUMsRUFBMUQsQ0FBNkQ2RSxJQUE3RCxDQUFrRXZELEtBQWxFLENBQXdFK0YsTUFBTSxDQUFDQyxJQUFQLENBQVlQLFFBQVosQ0FBeEU7QUFDRCxLQWZDLENBQUY7QUFnQkQsR0FqQk8sQ0FBUjtBQW1CQXJILEVBQUFBLFFBQVEsQ0FBQyxzQkFBRCxFQUF5QixNQUFNO0FBQ3JDLFVBQU1xRyxHQUFHLEdBQUcsRUFBWjtBQUVBbEUsSUFBQUEsRUFBRSxDQUFDLGlFQUFELEVBQW9FLE1BQU07QUFDMUVsQyxNQUFBQSxNQUFNLENBQUM2RSxlQUFQLEdBQXlCZixTQUF6QjtBQUNBOUQsTUFBQUEsTUFBTSxDQUFDc0YsWUFBUCxHQUFzQixFQUF0QjtBQUVBbEYsTUFBQUEsTUFBTSxDQUFDeUgsbUJBQW1CLEVBQXBCLENBQU4sQ0FBOEJ4SCxFQUE5QixDQUFpQ2lDLEVBQWpDLENBQW9Dd0IsU0FBcEM7QUFDRCxLQUxDLENBQUY7QUFPQTVCLElBQUFBLEVBQUUsQ0FBQyx5RUFBRCxFQUE0RSxNQUFNO0FBQ2xGbEMsTUFBQUEsTUFBTSxDQUFDNkUsZUFBUCxHQUF5QmlELGFBQWEsQ0FBQyxNQUFELENBQXRDO0FBQ0E5SCxNQUFBQSxNQUFNLENBQUNzRixZQUFQLEdBQXNCLEVBQXRCO0FBRUFsRixNQUFBQSxNQUFNLENBQUN5SCxtQkFBbUIsRUFBcEIsQ0FBTixDQUE4QnhILEVBQTlCLENBQWlDaUMsRUFBakMsQ0FBb0N3QixTQUFwQztBQUNELEtBTEMsQ0FBRjtBQU9BNUIsSUFBQUEsRUFBRSxDQUFDLDJFQUFELEVBQThFLE1BQU07QUFDcEZsQyxNQUFBQSxNQUFNLENBQUM2RSxlQUFQLEdBQXlCaUQsYUFBYSxDQUFDLFFBQUQsRUFBVyxNQUFYLENBQXRDO0FBQ0E5SCxNQUFBQSxNQUFNLENBQUNzRixZQUFQLEdBQXNCLEVBQXRCO0FBRUFsRixNQUFBQSxNQUFNLENBQUN5SCxtQkFBbUIsRUFBcEIsQ0FBTixDQUE4QnhILEVBQTlCLENBQWlDc0IsS0FBakMsQ0FBdUMsTUFBdkM7QUFDRCxLQUxDLENBQUY7QUFPQU8sSUFBQUEsRUFBRSxDQUFDLDRGQUFELEVBQStGLE1BQU07QUFDckdsQyxNQUFBQSxNQUFNLENBQUM2RSxlQUFQLEdBQXlCaUQsYUFBYSxDQUFDLFFBQUQsRUFBVyxNQUFYLENBQXRDO0FBQ0E5SCxNQUFBQSxNQUFNLENBQUNzRixZQUFQLEdBQXNCLENBQ3BCd0MsYUFBYSxDQUFDLFFBQUQsQ0FETyxFQUVwQkEsYUFBYSxDQUFDLFFBQUQsQ0FGTyxDQUF0QjtBQUtBMUgsTUFBQUEsTUFBTSxDQUFDeUgsbUJBQW1CLEVBQXBCLENBQU4sQ0FBOEJ4SCxFQUE5QixDQUFpQ3NCLEtBQWpDLENBQXVDLE1BQXZDO0FBQ0QsS0FSQyxDQUFGO0FBVUFPLElBQUFBLEVBQUUsQ0FBQyxpRkFBRCxFQUFvRixNQUFNO0FBQzFGbEMsTUFBQUEsTUFBTSxDQUFDNkUsZUFBUCxHQUF5QmlELGFBQWEsQ0FBQyxRQUFELEVBQVcsUUFBWCxDQUF0QztBQUNBOUgsTUFBQUEsTUFBTSxDQUFDc0YsWUFBUCxHQUFzQixDQUNwQndDLGFBQWEsQ0FBQyxRQUFELEVBQVcsTUFBWCxDQURPLEVBRXBCQSxhQUFhLENBQUMsTUFBRCxDQUZPLEVBR3BCMUIsR0FIb0IsRUFJcEIwQixhQUFhLENBQUMsUUFBRCxFQUFXLFFBQVgsQ0FKTyxDQUF0QjtBQU9BMUgsTUFBQUEsTUFBTSxDQUFDeUgsbUJBQW1CLEVBQXBCLENBQU4sQ0FBOEJ4SCxFQUE5QixDQUFpQ3NCLEtBQWpDLENBQXVDLE1BQXZDO0FBQ0QsS0FWQyxDQUFGO0FBWUFPLElBQUFBLEVBQUUsQ0FBQyxpRkFBRCxFQUFvRixNQUFNO0FBQzFGbEMsTUFBQUEsTUFBTSxDQUFDc0YsWUFBUCxHQUFzQixDQUNwQndDLGFBQWEsQ0FBQyxRQUFELEVBQVcsUUFBWCxDQURPLEVBRXBCQSxhQUFhLENBQUMsUUFBRCxFQUFXLE1BQVgsQ0FGTyxFQUdwQjFCLEdBSG9CLEVBSXBCMEIsYUFBYSxDQUFDLFFBQUQsRUFBVyxRQUFYLENBSk8sQ0FBdEI7QUFPQTFILE1BQUFBLE1BQU0sQ0FBQ3lILG1CQUFtQixFQUFwQixDQUFOLENBQThCeEgsRUFBOUIsQ0FBaUNzQixLQUFqQyxDQUF1QyxNQUF2QztBQUNELEtBVEMsQ0FBRjtBQVdBTyxJQUFBQSxFQUFFLENBQUMsaUZBQUQsRUFBb0YsTUFBTTtBQUMxRmxDLE1BQUFBLE1BQU0sQ0FBQ3NGLFlBQVAsR0FBc0IsQ0FDcEJ3QyxhQUFhLENBQUMsUUFBRCxFQUFXLFFBQVgsQ0FETyxFQUVwQkEsYUFBYSxDQUFDLFFBQUQsRUFBVyxNQUFYLENBRk8sRUFHcEJBLGFBQWEsQ0FBQyxNQUFELENBSE8sRUFJcEIxQixHQUpvQixFQUtwQjBCLGFBQWEsQ0FBQyxRQUFELEVBQVcsUUFBWCxDQUxPLENBQXRCO0FBUUExSCxNQUFBQSxNQUFNLENBQUN5SCxtQkFBbUIsRUFBcEIsQ0FBTixDQUE4QnhILEVBQTlCLENBQWlDc0IsS0FBakMsQ0FBdUMsTUFBdkM7QUFDRCxLQVZDLENBQUY7O0FBWUEsYUFBU2tHLG1CQUFULEdBQWdDO0FBQzlCLFlBQU05RSxJQUFJLEdBQUcvQyxNQUFNLENBQUMrSCxtQkFBUCxDQUEyQixDQUFDLFFBQUQsQ0FBM0IsRUFBdUMzQixHQUF2QyxDQUFiOztBQUNBLFVBQUlyRCxJQUFKLEVBQVU7QUFDUixlQUFPQSxJQUFJLENBQUMrQyxPQUFMLENBQWFwQixVQUFiLENBQXdCLENBQXhCLEVBQTJCYixLQUFsQztBQUNEO0FBQ0Y7O0FBRUQsYUFBU2lFLGFBQVQsQ0FBd0JyRCxPQUF4QixFQUFpQ3VELFNBQWpDLEVBQTRDO0FBQzFDLFlBQU10RCxVQUFVLEdBQUcsRUFBbkI7QUFDQSxZQUFNM0IsSUFBSSxHQUFHO0FBQ1grQyxRQUFBQSxPQUFPLEVBQUU7QUFBRXJCLFVBQUFBLE9BQUY7QUFBV0MsVUFBQUE7QUFBWDtBQURFLE9BQWI7O0FBSUEsVUFBSXNELFNBQUosRUFBZTtBQUNiakYsUUFBQUEsSUFBSSxDQUFDK0MsT0FBTCxDQUFhcEIsVUFBYixDQUF3Qk4sSUFBeEIsQ0FBNkI7QUFDM0JPLFVBQUFBLElBQUksRUFBRSxRQURxQjtBQUUzQmQsVUFBQUEsS0FBSyxFQUFFbUU7QUFGb0IsU0FBN0I7QUFJRDs7QUFFRCxhQUFPakYsSUFBUDtBQUNEO0FBQ0YsR0EzRk8sQ0FBUjtBQTRGRCxDQWh3Qk8sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC1leHByZXNzaW9ucyAqL1xuXG5pbXBvcnQgSW1hcENsaWVudCBmcm9tICcuL2ltYXAnXG5pbXBvcnQgeyB0b1R5cGVkQXJyYXkgfSBmcm9tICcuL2NvbW1vbidcblxuY29uc3QgaG9zdCA9ICdsb2NhbGhvc3QnXG5jb25zdCBwb3J0ID0gMTAwMDBcblxuZGVzY3JpYmUoJ2Jyb3dzZXJib3ggaW1hcCB1bml0IHRlc3RzJywgKCkgPT4ge1xuICB2YXIgY2xpZW50LCBzb2NrZXRTdHViXG5cbiAgLyoganNoaW50IGluZGVudDpmYWxzZSAqL1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIGNsaWVudCA9IG5ldyBJbWFwQ2xpZW50KGhvc3QsIHBvcnQpXG4gICAgZXhwZWN0KGNsaWVudCkudG8uZXhpc3RcblxuICAgIGNsaWVudC5sb2dnZXIgPSB7XG4gICAgICBkZWJ1ZzogKCkgPT4geyB9LFxuICAgICAgZXJyb3I6ICgpID0+IHsgfVxuICAgIH1cblxuICAgIHZhciBTb2NrZXQgPSBmdW5jdGlvbiAoKSB7IH1cbiAgICBTb2NrZXQub3BlbiA9ICgpID0+IHsgfVxuICAgIFNvY2tldC5wcm90b3R5cGUuY2xvc2UgPSAoKSA9PiB7IH1cbiAgICBTb2NrZXQucHJvdG90eXBlLnNlbmQgPSAoKSA9PiB7IH1cbiAgICBTb2NrZXQucHJvdG90eXBlLnN1c3BlbmQgPSAoKSA9PiB7IH1cbiAgICBTb2NrZXQucHJvdG90eXBlLnJlc3VtZSA9ICgpID0+IHsgfVxuICAgIFNvY2tldC5wcm90b3R5cGUudXBncmFkZVRvU2VjdXJlID0gKCkgPT4geyB9XG5cbiAgICBzb2NrZXRTdHViID0gc2lub24uY3JlYXRlU3R1Ykluc3RhbmNlKFNvY2tldClcbiAgICBzaW5vbi5zdHViKFNvY2tldCwgJ29wZW4nKS53aXRoQXJncyhob3N0LCBwb3J0KS5yZXR1cm5zKHNvY2tldFN0dWIpXG5cbiAgICB2YXIgcHJvbWlzZSA9IGNsaWVudC5jb25uZWN0KFNvY2tldCkudGhlbigoKSA9PiB7XG4gICAgICBleHBlY3QoU29ja2V0Lm9wZW4uY2FsbENvdW50KS50by5lcXVhbCgxKVxuXG4gICAgICBleHBlY3Qoc29ja2V0U3R1Yi5vbmVycm9yKS50by5leGlzdFxuICAgICAgZXhwZWN0KHNvY2tldFN0dWIub25vcGVuKS50by5leGlzdFxuICAgICAgZXhwZWN0KHNvY2tldFN0dWIub25jbG9zZSkudG8uZXhpc3RcbiAgICAgIGV4cGVjdChzb2NrZXRTdHViLm9uZGF0YSkudG8uZXhpc3RcbiAgICB9KVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiBzb2NrZXRTdHViLm9ub3BlbigpLCAxMClcblxuICAgIHJldHVybiBwcm9taXNlXG4gIH0pXG5cbiAgZGVzY3JpYmUuc2tpcCgnI2Nsb3NlJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgY2FsbCBzb2NrZXQuY2xvc2UnLCAoKSA9PiB7XG4gICAgICBjbGllbnQuc29ja2V0LnJlYWR5U3RhdGUgPSAnb3BlbidcblxuICAgICAgc2V0VGltZW91dCgoKSA9PiBzb2NrZXRTdHViLm9uY2xvc2UoKSwgMTApXG4gICAgICByZXR1cm4gY2xpZW50LmNsb3NlKCkudGhlbigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChzb2NrZXRTdHViLmNsb3NlLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgbm90IGNhbGwgc29ja2V0LmNsb3NlJywgKCkgPT4ge1xuICAgICAgY2xpZW50LnNvY2tldC5yZWFkeVN0YXRlID0gJ25vdCBvcGVuLiBkdWguJ1xuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHNvY2tldFN0dWIub25jbG9zZSgpLCAxMClcbiAgICAgIHJldHVybiBjbGllbnQuY2xvc2UoKS50aGVuKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KHNvY2tldFN0dWIuY2xvc2UuY2FsbGVkKS50by5iZS5mYWxzZVxuICAgICAgfSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCcjdXBncmFkZScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHVwZ3JhZGUgc29ja2V0JywgKCkgPT4ge1xuICAgICAgY2xpZW50LnNlY3VyZU1vZGUgPSBmYWxzZVxuICAgICAgY2xpZW50LnVwZ3JhZGUoKVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIG5vdCB1cGdyYWRlIHNvY2tldCcsICgpID0+IHtcbiAgICAgIGNsaWVudC5zZWN1cmVNb2RlID0gdHJ1ZVxuICAgICAgY2xpZW50LnVwZ3JhZGUoKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJyNzZXRIYW5kbGVyJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgc2V0IGdsb2JhbCBoYW5kbGVyIGZvciBrZXl3b3JkJywgKCkgPT4ge1xuICAgICAgdmFyIGhhbmRsZXIgPSAoKSA9PiB7IH1cbiAgICAgIGNsaWVudC5zZXRIYW5kbGVyKCdmZXRjaCcsIGhhbmRsZXIpXG5cbiAgICAgIGV4cGVjdChjbGllbnQuX2dsb2JhbEFjY2VwdFVudGFnZ2VkLkZFVENIKS50by5lcXVhbChoYW5kbGVyKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJyNzb2NrZXQub25lcnJvcicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGVtaXQgZXJyb3IgYW5kIGNsb3NlIGNvbm5lY3Rpb24nLCAoZG9uZSkgPT4ge1xuICAgICAgY2xpZW50LnNvY2tldC5vbmVycm9yKHtcbiAgICAgICAgZGF0YTogbmV3IEVycm9yKCdlcnInKVxuICAgICAgfSlcblxuICAgICAgY2xpZW50Lm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgIGRvbmUoKVxuICAgICAgfVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJyNzb2NrZXQub25jbG9zZScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGVtaXQgZXJyb3IgJywgKGRvbmUpID0+IHtcbiAgICAgIGNsaWVudC5zb2NrZXQub25jbG9zZSgpXG5cbiAgICAgIGNsaWVudC5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICBkb25lKClcbiAgICAgIH1cbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCcjX29uRGF0YScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHByb2Nlc3MgaW5wdXQnLCAoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGNsaWVudCwgJ19wYXJzZUluY29taW5nQ29tbWFuZHMnKVxuICAgICAgc2lub24uc3R1YihjbGllbnQsICdfaXRlcmF0ZUluY29taW5nQnVmZmVyJylcblxuICAgICAgY2xpZW50Ll9vbkRhdGEoe1xuICAgICAgICBkYXRhOiB0b1R5cGVkQXJyYXkoJ2Zvb2JhcicpLmJ1ZmZlclxuICAgICAgfSlcblxuICAgICAgZXhwZWN0KGNsaWVudC5fcGFyc2VJbmNvbWluZ0NvbW1hbmRzLmNhbGxlZE9uY2UpLnRvLmJlLnRydWVcbiAgICAgIGV4cGVjdChjbGllbnQuX2l0ZXJhdGVJbmNvbWluZ0J1ZmZlci5jYWxsZWRPbmNlKS50by5iZS50cnVlXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgncmF0ZUluY29taW5nQnVmZmVyJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgaXRlcmF0ZSBjaHVua2VkIGlucHV0JywgKCkgPT4ge1xuICAgICAgYXBwZW5kSW5jb21pbmdCdWZmZXIoJyogMSBGRVRDSCAoVUlEIDEpXFxyXFxuKiAyIEZFVENIIChVSUQgMilcXHJcXG4qIDMgRkVUQ0ggKFVJRCAzKVxcclxcbicpXG4gICAgICB2YXIgaXRlcmF0b3IgPSBjbGllbnQuX2l0ZXJhdGVJbmNvbWluZ0J1ZmZlcigpXG5cbiAgICAgIGV4cGVjdChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGl0ZXJhdG9yLm5leHQoKS52YWx1ZSkpLnRvLmVxdWFsKCcqIDEgRkVUQ0ggKFVJRCAxKScpXG4gICAgICBleHBlY3QoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBpdGVyYXRvci5uZXh0KCkudmFsdWUpKS50by5lcXVhbCgnKiAyIEZFVENIIChVSUQgMiknKVxuICAgICAgZXhwZWN0KFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgaXRlcmF0b3IubmV4dCgpLnZhbHVlKSkudG8uZXF1YWwoJyogMyBGRVRDSCAoVUlEIDMpJylcbiAgICAgIGV4cGVjdChpdGVyYXRvci5uZXh0KCkudmFsdWUpLnRvLmJlLnVuZGVmaW5lZFxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIHByb2Nlc3MgY2h1bmtlZCBsaXRlcmFscycsICgpID0+IHtcbiAgICAgIGFwcGVuZEluY29taW5nQnVmZmVyKCcqIDEgRkVUQ0ggKFVJRCB7MX1cXHJcXG4xKVxcclxcbiogMiBGRVRDSCAoVUlEIHs0fVxcclxcbjIzNDUpXFxyXFxuKiAzIEZFVENIIChVSUQgezR9XFxyXFxuMzc4OSlcXHJcXG4nKVxuICAgICAgdmFyIGl0ZXJhdG9yID0gY2xpZW50Ll9pdGVyYXRlSW5jb21pbmdCdWZmZXIoKVxuXG4gICAgICBleHBlY3QoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBpdGVyYXRvci5uZXh0KCkudmFsdWUpKS50by5lcXVhbCgnKiAxIEZFVENIIChVSUQgezF9XFxyXFxuMSknKVxuICAgICAgZXhwZWN0KFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgaXRlcmF0b3IubmV4dCgpLnZhbHVlKSkudG8uZXF1YWwoJyogMiBGRVRDSCAoVUlEIHs0fVxcclxcbjIzNDUpJylcbiAgICAgIGV4cGVjdChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGl0ZXJhdG9yLm5leHQoKS52YWx1ZSkpLnRvLmVxdWFsKCcqIDMgRkVUQ0ggKFVJRCB7NH1cXHJcXG4zNzg5KScpXG4gICAgICBleHBlY3QoaXRlcmF0b3IubmV4dCgpLnZhbHVlKS50by5iZS51bmRlZmluZWRcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBwcm9jZXNzIGNodW5rZWQgbGl0ZXJhbHMgMicsICgpID0+IHtcbiAgICAgIGFwcGVuZEluY29taW5nQnVmZmVyKCcqIDEgRkVUQ0ggKFVJRCAxKVxcclxcbiogMiBGRVRDSCAoVUlEIHs0fVxcclxcbjIzNDUpXFxyXFxuJylcbiAgICAgIHZhciBpdGVyYXRvciA9IGNsaWVudC5faXRlcmF0ZUluY29taW5nQnVmZmVyKClcblxuICAgICAgZXhwZWN0KFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgaXRlcmF0b3IubmV4dCgpLnZhbHVlKSkudG8uZXF1YWwoJyogMSBGRVRDSCAoVUlEIDEpJylcbiAgICAgIGV4cGVjdChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGl0ZXJhdG9yLm5leHQoKS52YWx1ZSkpLnRvLmVxdWFsKCcqIDIgRkVUQ0ggKFVJRCB7NH1cXHJcXG4yMzQ1KScpXG4gICAgICBleHBlY3QoaXRlcmF0b3IubmV4dCgpLnZhbHVlKS50by5iZS51bmRlZmluZWRcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBwcm9jZXNzIGNodW5rZWQgbGl0ZXJhbHMgMycsICgpID0+IHtcbiAgICAgIGFwcGVuZEluY29taW5nQnVmZmVyKCcqIDEgRkVUQ0ggKFVJRCB7MX1cXHJcXG4xKVxcclxcbiogMiBGRVRDSCAoVUlEIDQpXFxyXFxuJylcbiAgICAgIHZhciBpdGVyYXRvciA9IGNsaWVudC5faXRlcmF0ZUluY29taW5nQnVmZmVyKClcblxuICAgICAgZXhwZWN0KFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgaXRlcmF0b3IubmV4dCgpLnZhbHVlKSkudG8uZXF1YWwoJyogMSBGRVRDSCAoVUlEIHsxfVxcclxcbjEpJylcbiAgICAgIGV4cGVjdChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGl0ZXJhdG9yLm5leHQoKS52YWx1ZSkpLnRvLmVxdWFsKCcqIDIgRkVUQ0ggKFVJRCA0KScpXG4gICAgICBleHBlY3QoaXRlcmF0b3IubmV4dCgpLnZhbHVlKS50by5iZS51bmRlZmluZWRcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBwcm9jZXNzIGNodW5rZWQgbGl0ZXJhbHMgNCcsICgpID0+IHtcbiAgICAgIGFwcGVuZEluY29taW5nQnVmZmVyKCcqIFNFQVJDSCB7MX1cXHJcXG4xIHsxfVxcclxcbjJcXHJcXG4nKVxuICAgICAgdmFyIGl0ZXJhdG9yID0gY2xpZW50Ll9pdGVyYXRlSW5jb21pbmdCdWZmZXIoKVxuICAgICAgZXhwZWN0KFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgaXRlcmF0b3IubmV4dCgpLnZhbHVlKSkudG8uZXF1YWwoJyogU0VBUkNIIHsxfVxcclxcbjEgezF9XFxyXFxuMicpXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgcHJvY2VzcyBDUkxGIGxpdGVyYWwnLCAoKSA9PiB7XG4gICAgICBhcHBlbmRJbmNvbWluZ0J1ZmZlcignKiAxIEZFVENIIChVSUQgMjAgQk9EWVtIRUFERVIuRklFTERTIChSRUZFUkVOQ0VTIExJU1QtSUQpXSB7Mn1cXHJcXG5cXHJcXG4pXFxyXFxuJylcbiAgICAgIHZhciBpdGVyYXRvciA9IGNsaWVudC5faXRlcmF0ZUluY29taW5nQnVmZmVyKClcbiAgICAgIGV4cGVjdChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGl0ZXJhdG9yLm5leHQoKS52YWx1ZSkpLnRvLmVxdWFsKCcqIDEgRkVUQ0ggKFVJRCAyMCBCT0RZW0hFQURFUi5GSUVMRFMgKFJFRkVSRU5DRVMgTElTVC1JRCldIHsyfVxcclxcblxcclxcbiknKVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIHByb2Nlc3MgQ1JMRiBsaXRlcmFsIDInLCAoKSA9PiB7XG4gICAgICBhcHBlbmRJbmNvbWluZ0J1ZmZlcignKiAxIEZFVENIIChVSUQgMSBFTlZFTE9QRSAoXCJzdHJpbmcgd2l0aCB7cGFyZW50aGVzaXN9XCIpIEJPRFlbSEVBREVSLkZJRUxEUyAoUkVGRVJFTkNFUyBMSVNULUlEKV0gezJ9XFxyXFxuXFxyXFxuKVxcclxcbicpXG4gICAgICB2YXIgaXRlcmF0b3IgPSBjbGllbnQuX2l0ZXJhdGVJbmNvbWluZ0J1ZmZlcigpXG4gICAgICBleHBlY3QoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBpdGVyYXRvci5uZXh0KCkudmFsdWUpKS50by5lcXVhbCgnKiAxIEZFVENIIChVSUQgMSBFTlZFTE9QRSAoXCJzdHJpbmcgd2l0aCB7cGFyZW50aGVzaXN9XCIpIEJPRFlbSEVBREVSLkZJRUxEUyAoUkVGRVJFTkNFUyBMSVNULUlEKV0gezJ9XFxyXFxuXFxyXFxuKScpXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgcGFyc2UgbXVsdGlwbGUgemVyby1sZW5ndGggbGl0ZXJhbHMnLCAoKSA9PiB7XG4gICAgICBhcHBlbmRJbmNvbWluZ0J1ZmZlcignKiAxMjYwMTUgRkVUQ0ggKFVJRCA1ODU1OTkgQk9EWVsxLjJdIHswfVxcclxcbiBCT0RZWzEuMV0gezB9XFxyXFxuKVxcclxcbicpXG4gICAgICB2YXIgaXRlcmF0b3IgPSBjbGllbnQuX2l0ZXJhdGVJbmNvbWluZ0J1ZmZlcigpXG4gICAgICBleHBlY3QoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBpdGVyYXRvci5uZXh0KCkudmFsdWUpKS50by5lcXVhbCgnKiAxMjYwMTUgRkVUQ0ggKFVJRCA1ODU1OTkgQk9EWVsxLjJdIHswfVxcclxcbiBCT0RZWzEuMV0gezB9XFxyXFxuKScpXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgcHJvY2VzcyB0d28gY29tbWFuZHMgd2hlbiBDUkxGIGFycml2ZXMgaW4gMiBwYXJ0cycsICgpID0+IHtcbiAgICAgIGFwcGVuZEluY29taW5nQnVmZmVyKCcqIDEgRkVUQ0ggKFVJRCAxKVxccicpXG4gICAgICB2YXIgaXRlcmF0b3IxID0gY2xpZW50Ll9pdGVyYXRlSW5jb21pbmdCdWZmZXIoKVxuICAgICAgZXhwZWN0KGl0ZXJhdG9yMS5uZXh0KCkudmFsdWUpLnRvLmJlLnVuZGVmaW5lZFxuXG4gICAgICBhcHBlbmRJbmNvbWluZ0J1ZmZlcignXFxuKiAyIEZFVENIIChVSUQgMilcXHJcXG4nKVxuICAgICAgdmFyIGl0ZXJhdG9yMiA9IGNsaWVudC5faXRlcmF0ZUluY29taW5nQnVmZmVyKClcbiAgICAgIGV4cGVjdChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGl0ZXJhdG9yMi5uZXh0KCkudmFsdWUpKS50by5lcXVhbCgnKiAxIEZFVENIIChVSUQgMSknKVxuICAgICAgZXhwZWN0KFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgaXRlcmF0b3IyLm5leHQoKS52YWx1ZSkpLnRvLmVxdWFsKCcqIDIgRkVUQ0ggKFVJRCAyKScpXG4gICAgICBleHBlY3QoaXRlcmF0b3IyLm5leHQoKS52YWx1ZSkudG8uYmUudW5kZWZpbmVkXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgcHJvY2VzcyBsaXRlcmFsIHdoZW4gbGl0ZXJhbCBjb3VudCBhcnJpdmVzIGluIDIgcGFydHMnLCAoKSA9PiB7XG4gICAgICBhcHBlbmRJbmNvbWluZ0J1ZmZlcignKiAxIEZFVENIIChVSUQgeycpXG4gICAgICB2YXIgaXRlcmF0b3IxID0gY2xpZW50Ll9pdGVyYXRlSW5jb21pbmdCdWZmZXIoKVxuICAgICAgZXhwZWN0KGl0ZXJhdG9yMS5uZXh0KCkudmFsdWUpLnRvLmJlLnVuZGVmaW5lZFxuXG4gICAgICBhcHBlbmRJbmNvbWluZ0J1ZmZlcignMn1cXHJcXG4xMilcXHJcXG4nKVxuICAgICAgdmFyIGl0ZXJhdG9yMiA9IGNsaWVudC5faXRlcmF0ZUluY29taW5nQnVmZmVyKClcbiAgICAgIGV4cGVjdChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGl0ZXJhdG9yMi5uZXh0KCkudmFsdWUpKS50by5lcXVhbCgnKiAxIEZFVENIIChVSUQgezJ9XFxyXFxuMTIpJylcbiAgICAgIGV4cGVjdChpdGVyYXRvcjIubmV4dCgpLnZhbHVlKS50by5iZS51bmRlZmluZWRcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBwcm9jZXNzIGxpdGVyYWwgd2hlbiBsaXRlcmFsIGNvdW50IGFycml2ZXMgaW4gMiBwYXJ0cyAyJywgKCkgPT4ge1xuICAgICAgYXBwZW5kSW5jb21pbmdCdWZmZXIoJyogMSBGRVRDSCAoVUlEIHsxJylcbiAgICAgIHZhciBpdGVyYXRvcjEgPSBjbGllbnQuX2l0ZXJhdGVJbmNvbWluZ0J1ZmZlcigpXG4gICAgICBleHBlY3QoaXRlcmF0b3IxLm5leHQoKS52YWx1ZSkudG8uYmUudW5kZWZpbmVkXG5cbiAgICAgIGFwcGVuZEluY29taW5nQnVmZmVyKCcwfVxcclxcbjAxMjM0NTY3ODkpXFxyXFxuJylcbiAgICAgIHZhciBpdGVyYXRvcjIgPSBjbGllbnQuX2l0ZXJhdGVJbmNvbWluZ0J1ZmZlcigpXG4gICAgICBleHBlY3QoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBpdGVyYXRvcjIubmV4dCgpLnZhbHVlKSkudG8uZXF1YWwoJyogMSBGRVRDSCAoVUlEIHsxMH1cXHJcXG4wMTIzNDU2Nzg5KScpXG4gICAgICBleHBlY3QoaXRlcmF0b3IyLm5leHQoKS52YWx1ZSkudG8uYmUudW5kZWZpbmVkXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgcHJvY2VzcyBsaXRlcmFsIHdoZW4gbGl0ZXJhbCBjb3VudCBhcnJpdmVzIGluIDIgcGFydHMgMycsICgpID0+IHtcbiAgICAgIGFwcGVuZEluY29taW5nQnVmZmVyKCcqIDEgRkVUQ0ggKFVJRCB7JylcbiAgICAgIHZhciBpdGVyYXRvcjEgPSBjbGllbnQuX2l0ZXJhdGVJbmNvbWluZ0J1ZmZlcigpXG4gICAgICBleHBlY3QoaXRlcmF0b3IxLm5leHQoKS52YWx1ZSkudG8uYmUudW5kZWZpbmVkXG5cbiAgICAgIGFwcGVuZEluY29taW5nQnVmZmVyKCcxMH1cXHJcXG4xMjM0NTY3ODkwKVxcclxcbicpXG4gICAgICB2YXIgaXRlcmF0b3IyID0gY2xpZW50Ll9pdGVyYXRlSW5jb21pbmdCdWZmZXIoKVxuICAgICAgZXhwZWN0KFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgaXRlcmF0b3IyLm5leHQoKS52YWx1ZSkpLnRvLmVxdWFsKCcqIDEgRkVUQ0ggKFVJRCB7MTB9XFxyXFxuMTIzNDU2Nzg5MCknKVxuICAgICAgZXhwZWN0KGl0ZXJhdG9yMi5uZXh0KCkudmFsdWUpLnRvLmJlLnVuZGVmaW5lZFxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIHByb2Nlc3MgbGl0ZXJhbCB3aGVuIGxpdGVyYWwgY291bnQgYXJyaXZlcyBpbiAyIHBhcnRzIDQnLCAoKSA9PiB7XG4gICAgICBhcHBlbmRJbmNvbWluZ0J1ZmZlcignKiAxIEZFVENIIChVSUQgMSBCT0RZW0hFQURFUi5GSUVMRFMgKFJFRkVSRU5DRVMgTElTVC1JRCldIHsyfVxccicpXG4gICAgICB2YXIgaXRlcmF0b3IxID0gY2xpZW50Ll9pdGVyYXRlSW5jb21pbmdCdWZmZXIoKVxuICAgICAgZXhwZWN0KGl0ZXJhdG9yMS5uZXh0KCkudmFsdWUpLnRvLmJlLnVuZGVmaW5lZFxuICAgICAgYXBwZW5kSW5jb21pbmdCdWZmZXIoJ1xcblhYKVxcclxcbicpXG4gICAgICB2YXIgaXRlcmF0b3IyID0gY2xpZW50Ll9pdGVyYXRlSW5jb21pbmdCdWZmZXIoKVxuICAgICAgZXhwZWN0KFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgaXRlcmF0b3IyLm5leHQoKS52YWx1ZSkpLnRvLmVxdWFsKCcqIDEgRkVUQ0ggKFVJRCAxIEJPRFlbSEVBREVSLkZJRUxEUyAoUkVGRVJFTkNFUyBMSVNULUlEKV0gezJ9XFxyXFxuWFgpJylcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBwcm9jZXNzIGxpdGVyYWwgd2hlbiBsaXRlcmFsIGNvdW50IGFycml2ZXMgaW4gMyBwYXJ0cycsICgpID0+IHtcbiAgICAgIGFwcGVuZEluY29taW5nQnVmZmVyKCcqIDEgRkVUQ0ggKFVJRCB7JylcbiAgICAgIHZhciBpdGVyYXRvcjEgPSBjbGllbnQuX2l0ZXJhdGVJbmNvbWluZ0J1ZmZlcigpXG4gICAgICBleHBlY3QoaXRlcmF0b3IxLm5leHQoKS52YWx1ZSkudG8uYmUudW5kZWZpbmVkXG5cbiAgICAgIGFwcGVuZEluY29taW5nQnVmZmVyKCcxJylcbiAgICAgIHZhciBpdGVyYXRvcjIgPSBjbGllbnQuX2l0ZXJhdGVJbmNvbWluZ0J1ZmZlcigpXG4gICAgICBleHBlY3QoaXRlcmF0b3IyLm5leHQoKS52YWx1ZSkudG8uYmUudW5kZWZpbmVkXG5cbiAgICAgIGFwcGVuZEluY29taW5nQnVmZmVyKCd9XFxyXFxuMSlcXHJcXG4nKVxuICAgICAgdmFyIGl0ZXJhdG9yMyA9IGNsaWVudC5faXRlcmF0ZUluY29taW5nQnVmZmVyKClcbiAgICAgIGV4cGVjdChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGl0ZXJhdG9yMy5uZXh0KCkudmFsdWUpKS50by5lcXVhbCgnKiAxIEZFVENIIChVSUQgezF9XFxyXFxuMSknKVxuICAgICAgZXhwZWN0KGl0ZXJhdG9yMy5uZXh0KCkudmFsdWUpLnRvLmJlLnVuZGVmaW5lZFxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIHByb2Nlc3MgU0VBUkNIIHJlc3BvbnNlIHdoZW4gaXQgYXJyaXZlcyBpbiAyIHBhcnRzJywgKCkgPT4ge1xuICAgICAgYXBwZW5kSW5jb21pbmdCdWZmZXIoJyogU0VBUkNIIDEgMicpXG4gICAgICB2YXIgaXRlcmF0b3IxID0gY2xpZW50Ll9pdGVyYXRlSW5jb21pbmdCdWZmZXIoKVxuICAgICAgZXhwZWN0KGl0ZXJhdG9yMS5uZXh0KCkudmFsdWUpLnRvLmJlLnVuZGVmaW5lZFxuXG4gICAgICBhcHBlbmRJbmNvbWluZ0J1ZmZlcignIDMgNFxcclxcbicpXG4gICAgICB2YXIgaXRlcmF0b3IyID0gY2xpZW50Ll9pdGVyYXRlSW5jb21pbmdCdWZmZXIoKVxuICAgICAgZXhwZWN0KFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgaXRlcmF0b3IyLm5leHQoKS52YWx1ZSkpLnRvLmVxdWFsKCcqIFNFQVJDSCAxIDIgMyA0JylcbiAgICAgIGV4cGVjdChpdGVyYXRvcjIubmV4dCgpLnZhbHVlKS50by5iZS51bmRlZmluZWRcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBub3QgcHJvY2VzcyB7fSBpbiBzdHJpbmcgYXMgbGl0ZXJhbCAxJywgKCkgPT4ge1xuICAgICAgYXBwZW5kSW5jb21pbmdCdWZmZXIoJyogMSBGRVRDSCAoVUlEIDEgRU5WRUxPUEUgKFwic3RyaW5nIHdpdGgge3BhcmVudGhlc2lzfVwiKSlcXHJcXG4nKVxuICAgICAgdmFyIGl0ZXJhdG9yID0gY2xpZW50Ll9pdGVyYXRlSW5jb21pbmdCdWZmZXIoKVxuICAgICAgZXhwZWN0KFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgaXRlcmF0b3IubmV4dCgpLnZhbHVlKSkudG8uZXF1YWwoJyogMSBGRVRDSCAoVUlEIDEgRU5WRUxPUEUgKFwic3RyaW5nIHdpdGgge3BhcmVudGhlc2lzfVwiKSknKVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIG5vdCBwcm9jZXNzIHt9IGluIHN0cmluZyBhcyBsaXRlcmFsIDInLCAoKSA9PiB7XG4gICAgICBhcHBlbmRJbmNvbWluZ0J1ZmZlcignKiAxIEZFVENIIChVSUQgMSBFTlZFTE9QRSAoXCJzdHJpbmcgd2l0aCBudW1iZXIgaW4gcGFyZW50aGVzaXMgezEyM31cIikpXFxyXFxuJylcbiAgICAgIHZhciBpdGVyYXRvciA9IGNsaWVudC5faXRlcmF0ZUluY29taW5nQnVmZmVyKClcbiAgICAgIGV4cGVjdChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGl0ZXJhdG9yLm5leHQoKS52YWx1ZSkpLnRvLmVxdWFsKCcqIDEgRkVUQ0ggKFVJRCAxIEVOVkVMT1BFIChcInN0cmluZyB3aXRoIG51bWJlciBpbiBwYXJlbnRoZXNpcyB7MTIzfVwiKSknKVxuICAgIH0pXG5cbiAgICBmdW5jdGlvbiBhcHBlbmRJbmNvbWluZ0J1ZmZlciAoY29udGVudCkge1xuICAgICAgY2xpZW50Ll9pbmNvbWluZ0J1ZmZlcnMucHVzaCh0b1R5cGVkQXJyYXkoY29udGVudCkpXG4gICAgfVxuICB9KVxuXG4gIGRlc2NyaWJlKCcjX3BhcnNlSW5jb21pbmdDb21tYW5kcycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHByb2Nlc3MgYSB0YWdnZWQgaXRlbSBmcm9tIHRoZSBxdWV1ZScsICgpID0+IHtcbiAgICAgIGNsaWVudC5vbnJlYWR5ID0gc2lub24uc3R1YigpXG4gICAgICBzaW5vbi5zdHViKGNsaWVudCwgJ19oYW5kbGVSZXNwb25zZScpXG5cbiAgICAgIGZ1bmN0aW9uICogZ2VuICgpIHsgeWllbGQgdG9UeXBlZEFycmF5KCdPSyBIZWxsbyB3b3JsZCEnKSB9XG5cbiAgICAgIGNsaWVudC5fcGFyc2VJbmNvbWluZ0NvbW1hbmRzKGdlbigpKVxuXG4gICAgICBleHBlY3QoY2xpZW50Lm9ucmVhZHkuY2FsbENvdW50KS50by5lcXVhbCgxKVxuICAgICAgZXhwZWN0KGNsaWVudC5faGFuZGxlUmVzcG9uc2Uud2l0aEFyZ3Moe1xuICAgICAgICB0YWc6ICdPSycsXG4gICAgICAgIGNvbW1hbmQ6ICdIZWxsbycsXG4gICAgICAgIGF0dHJpYnV0ZXM6IFt7XG4gICAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICAgIHZhbHVlOiAnd29ybGQhJ1xuICAgICAgICB9XVxuICAgICAgfSkuY2FsbGVkT25jZSkudG8uYmUudHJ1ZVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIHByb2Nlc3MgYW4gdW50YWdnZWQgaXRlbSBmcm9tIHRoZSBxdWV1ZScsICgpID0+IHtcbiAgICAgIHNpbm9uLnN0dWIoY2xpZW50LCAnX2hhbmRsZVJlc3BvbnNlJylcblxuICAgICAgZnVuY3Rpb24gKiBnZW4gKCkgeyB5aWVsZCB0b1R5cGVkQXJyYXkoJyogMSBFWElTVFMnKSB9XG5cbiAgICAgIGNsaWVudC5fcGFyc2VJbmNvbWluZ0NvbW1hbmRzKGdlbigpKVxuXG4gICAgICBleHBlY3QoY2xpZW50Ll9oYW5kbGVSZXNwb25zZS53aXRoQXJncyh7XG4gICAgICAgIHRhZzogJyonLFxuICAgICAgICBjb21tYW5kOiAnRVhJU1RTJyxcbiAgICAgICAgYXR0cmlidXRlczogW10sXG4gICAgICAgIG5yOiAxXG4gICAgICB9KS5jYWxsZWRPbmNlKS50by5iZS50cnVlXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgcHJvY2VzcyBhIHBsdXMgdGFnZ2VkIGl0ZW0gZnJvbSB0aGUgcXVldWUnLCAoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGNsaWVudCwgJ3NlbmQnKVxuXG4gICAgICBmdW5jdGlvbiAqIGdlbiAoKSB7IHlpZWxkIHRvVHlwZWRBcnJheSgnKyBQbGVhc2UgY29udGludWUnKSB9XG4gICAgICBjbGllbnQuX2N1cnJlbnRDb21tYW5kID0ge1xuICAgICAgICBkYXRhOiBbJ2xpdGVyYWwgZGF0YSddXG4gICAgICB9XG5cbiAgICAgIGNsaWVudC5fcGFyc2VJbmNvbWluZ0NvbW1hbmRzKGdlbigpKVxuXG4gICAgICBleHBlY3QoY2xpZW50LnNlbmQud2l0aEFyZ3MoJ2xpdGVyYWwgZGF0YVxcclxcbicpLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBwcm9jZXNzIGFuIFhPQVVUSDIgZXJyb3IgY2hhbGxlbmdlJywgKCkgPT4ge1xuICAgICAgc2lub24uc3R1YihjbGllbnQsICdzZW5kJylcblxuICAgICAgZnVuY3Rpb24gKiBnZW4gKCkgeyB5aWVsZCB0b1R5cGVkQXJyYXkoJysgRk9PQkFSJykgfVxuICAgICAgY2xpZW50Ll9jdXJyZW50Q29tbWFuZCA9IHtcbiAgICAgICAgZGF0YTogW10sXG4gICAgICAgIGVycm9yUmVzcG9uc2VFeHBlY3RzRW1wdHlMaW5lOiB0cnVlXG4gICAgICB9XG5cbiAgICAgIGNsaWVudC5fcGFyc2VJbmNvbWluZ0NvbW1hbmRzKGdlbigpKVxuXG4gICAgICBleHBlY3QoY2xpZW50LnNlbmQud2l0aEFyZ3MoJ1xcclxcbicpLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCcjX2hhbmRsZVJlc3BvbnNlJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgaW52b2tlIGdsb2JhbCBoYW5kbGVyIGJ5IGRlZmF1bHQnLCAoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGNsaWVudCwgJ19wcm9jZXNzUmVzcG9uc2UnKVxuICAgICAgc2lub24uc3R1YihjbGllbnQsICdfc2VuZFJlcXVlc3QnKVxuXG4gICAgICBjbGllbnQuX2dsb2JhbEFjY2VwdFVudGFnZ2VkLlRFU1QgPSAoKSA9PiB7IH1cbiAgICAgIHNpbm9uLnN0dWIoY2xpZW50Ll9nbG9iYWxBY2NlcHRVbnRhZ2dlZCwgJ1RFU1QnKVxuXG4gICAgICBjbGllbnQuX2N1cnJlbnRDb21tYW5kID0gZmFsc2VcbiAgICAgIGNsaWVudC5faGFuZGxlUmVzcG9uc2Uoe1xuICAgICAgICB0YWc6ICcqJyxcbiAgICAgICAgY29tbWFuZDogJ3Rlc3QnXG4gICAgICB9KVxuXG4gICAgICBleHBlY3QoY2xpZW50Ll9zZW5kUmVxdWVzdC5jYWxsQ291bnQpLnRvLmVxdWFsKDEpXG4gICAgICBleHBlY3QoY2xpZW50Ll9nbG9iYWxBY2NlcHRVbnRhZ2dlZC5URVNULndpdGhBcmdzKHtcbiAgICAgICAgdGFnOiAnKicsXG4gICAgICAgIGNvbW1hbmQ6ICd0ZXN0J1xuICAgICAgfSkuY2FsbENvdW50KS50by5lcXVhbCgxKVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIGludm9rZSBnbG9iYWwgaGFuZGxlciBpZiBuZWVkZWQnLCAoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGNsaWVudCwgJ19wcm9jZXNzUmVzcG9uc2UnKVxuICAgICAgY2xpZW50Ll9nbG9iYWxBY2NlcHRVbnRhZ2dlZC5URVNUID0gKCkgPT4geyB9XG4gICAgICBzaW5vbi5zdHViKGNsaWVudC5fZ2xvYmFsQWNjZXB0VW50YWdnZWQsICdURVNUJylcbiAgICAgIHNpbm9uLnN0dWIoY2xpZW50LCAnX3NlbmRSZXF1ZXN0JylcblxuICAgICAgY2xpZW50Ll9jdXJyZW50Q29tbWFuZCA9IHtcbiAgICAgICAgcGF5bG9hZDoge31cbiAgICAgIH1cbiAgICAgIGNsaWVudC5faGFuZGxlUmVzcG9uc2Uoe1xuICAgICAgICB0YWc6ICcqJyxcbiAgICAgICAgY29tbWFuZDogJ3Rlc3QnXG4gICAgICB9KVxuXG4gICAgICBleHBlY3QoY2xpZW50Ll9zZW5kUmVxdWVzdC5jYWxsQ291bnQpLnRvLmVxdWFsKDApXG4gICAgICBleHBlY3QoY2xpZW50Ll9nbG9iYWxBY2NlcHRVbnRhZ2dlZC5URVNULndpdGhBcmdzKHtcbiAgICAgICAgdGFnOiAnKicsXG4gICAgICAgIGNvbW1hbmQ6ICd0ZXN0J1xuICAgICAgfSkuY2FsbENvdW50KS50by5lcXVhbCgxKVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIHB1c2ggdG8gcGF5bG9hZCcsICgpID0+IHtcbiAgICAgIHNpbm9uLnN0dWIoY2xpZW50LCAnX3Byb2Nlc3NSZXNwb25zZScpXG4gICAgICBjbGllbnQuX2dsb2JhbEFjY2VwdFVudGFnZ2VkLlRFU1QgPSAoKSA9PiB7IH1cbiAgICAgIHNpbm9uLnN0dWIoY2xpZW50Ll9nbG9iYWxBY2NlcHRVbnRhZ2dlZCwgJ1RFU1QnKVxuXG4gICAgICBjbGllbnQuX2N1cnJlbnRDb21tYW5kID0ge1xuICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgVEVTVDogW11cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2xpZW50Ll9oYW5kbGVSZXNwb25zZSh7XG4gICAgICAgIHRhZzogJyonLFxuICAgICAgICBjb21tYW5kOiAndGVzdCdcbiAgICAgIH0pXG5cbiAgICAgIGV4cGVjdChjbGllbnQuX2dsb2JhbEFjY2VwdFVudGFnZ2VkLlRFU1QuY2FsbENvdW50KS50by5lcXVhbCgwKVxuICAgICAgZXhwZWN0KGNsaWVudC5fY3VycmVudENvbW1hbmQucGF5bG9hZC5URVNUKS50by5kZWVwLmVxdWFsKFt7XG4gICAgICAgIHRhZzogJyonLFxuICAgICAgICBjb21tYW5kOiAndGVzdCdcbiAgICAgIH1dKVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIGludm9rZSBjb21tYW5kIGNhbGxiYWNrJywgKCkgPT4ge1xuICAgICAgc2lub24uc3R1YihjbGllbnQsICdfcHJvY2Vzc1Jlc3BvbnNlJylcbiAgICAgIHNpbm9uLnN0dWIoY2xpZW50LCAnX3NlbmRSZXF1ZXN0JylcbiAgICAgIGNsaWVudC5fZ2xvYmFsQWNjZXB0VW50YWdnZWQuVEVTVCA9ICgpID0+IHsgfVxuICAgICAgc2lub24uc3R1YihjbGllbnQuX2dsb2JhbEFjY2VwdFVudGFnZ2VkLCAnVEVTVCcpXG5cbiAgICAgIGNsaWVudC5fY3VycmVudENvbW1hbmQgPSB7XG4gICAgICAgIHRhZzogJ0EnLFxuICAgICAgICBjYWxsYmFjazogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgZXhwZWN0KHJlc3BvbnNlKS50by5kZWVwLmVxdWFsKHtcbiAgICAgICAgICAgIHRhZzogJ0EnLFxuICAgICAgICAgICAgY29tbWFuZDogJ3Rlc3QnLFxuICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICBURVNUOiAnYWJjJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICBURVNUOiAnYWJjJ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjbGllbnQuX2hhbmRsZVJlc3BvbnNlKHtcbiAgICAgICAgdGFnOiAnQScsXG4gICAgICAgIGNvbW1hbmQ6ICd0ZXN0J1xuICAgICAgfSlcblxuICAgICAgZXhwZWN0KGNsaWVudC5fc2VuZFJlcXVlc3QuY2FsbENvdW50KS50by5lcXVhbCgxKVxuICAgICAgZXhwZWN0KGNsaWVudC5fZ2xvYmFsQWNjZXB0VW50YWdnZWQuVEVTVC5jYWxsQ291bnQpLnRvLmVxdWFsKDApXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnI2VucXVldWVDb21tYW5kJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmVqZWN0IG9uIE5PL0JBRCcsICgpID0+IHtcbiAgICAgIHNpbm9uLnN0dWIoY2xpZW50LCAnX3NlbmRSZXF1ZXN0JykuY2FsbHNGYWtlKCgpID0+IHtcbiAgICAgICAgY2xpZW50Ll9jbGllbnRRdWV1ZVswXS5jYWxsYmFjayh7IGNvbW1hbmQ6ICdOTycgfSlcbiAgICAgIH0pXG5cbiAgICAgIGNsaWVudC5fdGFnQ291bnRlciA9IDEwMFxuICAgICAgY2xpZW50Ll9jbGllbnRRdWV1ZSA9IFtdXG4gICAgICBjbGllbnQuX2NhblNlbmQgPSB0cnVlXG5cbiAgICAgIHJldHVybiBjbGllbnQuZW5xdWV1ZUNvbW1hbmQoe1xuICAgICAgICBjb21tYW5kOiAnYWJjJ1xuICAgICAgfSwgWydkZWYnXSwge1xuICAgICAgICB0OiAxXG4gICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIGV4cGVjdChlcnIpLnRvLmV4aXN0XG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIGludm9rZSBzZW5kaW5nJywgKCkgPT4ge1xuICAgICAgc2lub24uc3R1YihjbGllbnQsICdfc2VuZFJlcXVlc3QnKS5jYWxsc0Zha2UoKCkgPT4ge1xuICAgICAgICBjbGllbnQuX2NsaWVudFF1ZXVlWzBdLmNhbGxiYWNrKHt9KVxuICAgICAgfSlcblxuICAgICAgY2xpZW50Ll90YWdDb3VudGVyID0gMTAwXG4gICAgICBjbGllbnQuX2NsaWVudFF1ZXVlID0gW11cbiAgICAgIGNsaWVudC5fY2FuU2VuZCA9IHRydWVcblxuICAgICAgcmV0dXJuIGNsaWVudC5lbnF1ZXVlQ29tbWFuZCh7XG4gICAgICAgIGNvbW1hbmQ6ICdhYmMnXG4gICAgICB9LCBbJ2RlZiddLCB7XG4gICAgICAgIHQ6IDFcbiAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICBleHBlY3QoY2xpZW50Ll9zZW5kUmVxdWVzdC5jYWxsQ291bnQpLnRvLmVxdWFsKDEpXG4gICAgICAgIGV4cGVjdChjbGllbnQuX2NsaWVudFF1ZXVlLmxlbmd0aCkudG8uZXF1YWwoMSlcbiAgICAgICAgZXhwZWN0KGNsaWVudC5fY2xpZW50UXVldWVbMF0udGFnKS50by5lcXVhbCgnVzEwMScpXG4gICAgICAgIGV4cGVjdChjbGllbnQuX2NsaWVudFF1ZXVlWzBdLnJlcXVlc3QpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgICAgIGNvbW1hbmQ6ICdhYmMnLFxuICAgICAgICAgIHRhZzogJ1cxMDEnXG4gICAgICAgIH0pXG4gICAgICAgIGV4cGVjdChjbGllbnQuX2NsaWVudFF1ZXVlWzBdLnQpLnRvLmVxdWFsKDEpXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIG9ubHkgcXVldWUnLCAoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGNsaWVudCwgJ19zZW5kUmVxdWVzdCcpXG5cbiAgICAgIGNsaWVudC5fdGFnQ291bnRlciA9IDEwMFxuICAgICAgY2xpZW50Ll9jbGllbnRRdWV1ZSA9IFtdXG4gICAgICBjbGllbnQuX2NhblNlbmQgPSBmYWxzZVxuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHsgY2xpZW50Ll9jbGllbnRRdWV1ZVswXS5jYWxsYmFjayh7fSkgfSwgMClcblxuICAgICAgcmV0dXJuIGNsaWVudC5lbnF1ZXVlQ29tbWFuZCh7XG4gICAgICAgIGNvbW1hbmQ6ICdhYmMnXG4gICAgICB9LCBbJ2RlZiddLCB7XG4gICAgICAgIHQ6IDFcbiAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICBleHBlY3QoY2xpZW50Ll9zZW5kUmVxdWVzdC5jYWxsQ291bnQpLnRvLmVxdWFsKDApXG4gICAgICAgIGV4cGVjdChjbGllbnQuX2NsaWVudFF1ZXVlLmxlbmd0aCkudG8uZXF1YWwoMSlcbiAgICAgICAgZXhwZWN0KGNsaWVudC5fY2xpZW50UXVldWVbMF0udGFnKS50by5lcXVhbCgnVzEwMScpXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIHN0b3JlIHZhbHVlQXNTdHJpbmcgb3B0aW9uIGluIHRoZSBjb21tYW5kJywgKCkgPT4ge1xuICAgICAgc2lub24uc3R1YihjbGllbnQsICdfc2VuZFJlcXVlc3QnKVxuXG4gICAgICBjbGllbnQuX3RhZ0NvdW50ZXIgPSAxMDBcbiAgICAgIGNsaWVudC5fY2xpZW50UXVldWUgPSBbXVxuICAgICAgY2xpZW50Ll9jYW5TZW5kID0gZmFsc2VcblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGNsaWVudC5fY2xpZW50UXVldWVbMF0uY2FsbGJhY2soe30pIH0sIDApXG4gICAgICByZXR1cm4gY2xpZW50LmVucXVldWVDb21tYW5kKHtcbiAgICAgICAgY29tbWFuZDogJ2FiYycsXG4gICAgICAgIHZhbHVlQXNTdHJpbmc6IGZhbHNlXG4gICAgICB9LCBbJ2RlZiddLCB7XG4gICAgICAgIHQ6IDFcbiAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICBleHBlY3QoY2xpZW50Ll9jbGllbnRRdWV1ZVswXS5yZXF1ZXN0LnZhbHVlQXNTdHJpbmcpLnRvLmVxdWFsKGZhbHNlKVxuICAgICAgfSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCcjX3NlbmRSZXF1ZXN0JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZW50ZXIgaWRsZSBpZiBub3RoaW5nIGlzIHRvIHByb2Nlc3MnLCAoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGNsaWVudCwgJ19lbnRlcklkbGUnKVxuXG4gICAgICBjbGllbnQuX2NsaWVudFF1ZXVlID0gW11cbiAgICAgIGNsaWVudC5fc2VuZFJlcXVlc3QoKVxuXG4gICAgICBleHBlY3QoY2xpZW50Ll9lbnRlcklkbGUuY2FsbENvdW50KS50by5lcXVhbCgxKVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIHNlbmQgZGF0YScsICgpID0+IHtcbiAgICAgIHNpbm9uLnN0dWIoY2xpZW50LCAnX2NsZWFySWRsZScpXG4gICAgICBzaW5vbi5zdHViKGNsaWVudCwgJ3NlbmQnKVxuXG4gICAgICBjbGllbnQuX2NsaWVudFF1ZXVlID0gW3tcbiAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgIHRhZzogJ1cxMDEnLFxuICAgICAgICAgIGNvbW1hbmQ6ICdURVNUJ1xuICAgICAgICB9XG4gICAgICB9XVxuICAgICAgY2xpZW50Ll9zZW5kUmVxdWVzdCgpXG5cbiAgICAgIGV4cGVjdChjbGllbnQuX2NsZWFySWRsZS5jYWxsQ291bnQpLnRvLmVxdWFsKDEpXG4gICAgICBleHBlY3QoY2xpZW50LnNlbmQuYXJnc1swXVswXSkudG8uZXF1YWwoJ1cxMDEgVEVTVFxcclxcbicpXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgc2VuZCBwYXJ0aWFsIGRhdGEnLCAoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGNsaWVudCwgJ19jbGVhcklkbGUnKVxuICAgICAgc2lub24uc3R1YihjbGllbnQsICdzZW5kJylcblxuICAgICAgY2xpZW50Ll9jbGllbnRRdWV1ZSA9IFt7XG4gICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICB0YWc6ICdXMTAxJyxcbiAgICAgICAgICBjb21tYW5kOiAnVEVTVCcsXG4gICAgICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgICAgIHR5cGU6ICdMSVRFUkFMJyxcbiAgICAgICAgICAgIHZhbHVlOiAnYWJjJ1xuICAgICAgICAgIH1dXG4gICAgICAgIH1cbiAgICAgIH1dXG4gICAgICBjbGllbnQuX3NlbmRSZXF1ZXN0KClcblxuICAgICAgZXhwZWN0KGNsaWVudC5fY2xlYXJJZGxlLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICAgIGV4cGVjdChjbGllbnQuc2VuZC5hcmdzWzBdWzBdKS50by5lcXVhbCgnVzEwMSBURVNUIHszfVxcclxcbicpXG4gICAgICBleHBlY3QoY2xpZW50Ll9jdXJyZW50Q29tbWFuZC5kYXRhKS50by5kZWVwLmVxdWFsKFsnYWJjJ10pXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgcnVuIHByZWNoZWNrJywgKGRvbmUpID0+IHtcbiAgICAgIHNpbm9uLnN0dWIoY2xpZW50LCAnX2NsZWFySWRsZScpXG5cbiAgICAgIGNsaWVudC5fY2FuU2VuZCA9IHRydWVcbiAgICAgIGNsaWVudC5fY2xpZW50UXVldWUgPSBbe1xuICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgdGFnOiAnVzEwMScsXG4gICAgICAgICAgY29tbWFuZDogJ1RFU1QnLFxuICAgICAgICAgIGF0dHJpYnV0ZXM6IFt7XG4gICAgICAgICAgICB0eXBlOiAnTElURVJBTCcsXG4gICAgICAgICAgICB2YWx1ZTogJ2FiYydcbiAgICAgICAgICB9XVxuICAgICAgICB9LFxuICAgICAgICBwcmVjaGVjazogKGN0eCkgPT4ge1xuICAgICAgICAgIGV4cGVjdChjdHgpLnRvLmV4aXN0XG4gICAgICAgICAgZXhwZWN0KGNsaWVudC5fY2FuU2VuZCkudG8uYmUudHJ1ZVxuICAgICAgICAgIGNsaWVudC5fc2VuZFJlcXVlc3QgPSAoKSA9PiB7XG4gICAgICAgICAgICBleHBlY3QoY2xpZW50Ll9jbGllbnRRdWV1ZS5sZW5ndGgpLnRvLmVxdWFsKDIpXG4gICAgICAgICAgICBleHBlY3QoY2xpZW50Ll9jbGllbnRRdWV1ZVswXS50YWcpLnRvLmluY2x1ZGUoJy5wJylcbiAgICAgICAgICAgIGV4cGVjdChjbGllbnQuX2NsaWVudFF1ZXVlWzBdLnJlcXVlc3QudGFnKS50by5pbmNsdWRlKCcucCcpXG4gICAgICAgICAgICBjbGllbnQuX2NsZWFySWRsZS5yZXN0b3JlKClcbiAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjbGllbnQuZW5xdWV1ZUNvbW1hbmQoe30sIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgY3R4OiBjdHhcbiAgICAgICAgICB9KVxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICB9XG4gICAgICB9XVxuICAgICAgY2xpZW50Ll9zZW5kUmVxdWVzdCgpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnI19lbnRlcklkbGUnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBzZXQgaWRsZSB0aW1lcicsIChkb25lKSA9PiB7XG4gICAgICBjbGllbnQub25pZGxlID0gKCkgPT4ge1xuICAgICAgICBkb25lKClcbiAgICAgIH1cbiAgICAgIGNsaWVudC50aW1lb3V0RW50ZXJJZGxlID0gMVxuXG4gICAgICBjbGllbnQuX2VudGVySWRsZSgpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnI19wcm9jZXNzUmVzcG9uc2UnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBzZXQgaHVtYW5SZWFkYWJsZScsICgpID0+IHtcbiAgICAgIHZhciByZXNwb25zZSA9IHtcbiAgICAgICAgdGFnOiAnKicsXG4gICAgICAgIGNvbW1hbmQ6ICdPSycsXG4gICAgICAgIGF0dHJpYnV0ZXM6IFt7XG4gICAgICAgICAgdHlwZTogJ1RFWFQnLFxuICAgICAgICAgIHZhbHVlOiAnU29tZSByYW5kb20gdGV4dCdcbiAgICAgICAgfV1cbiAgICAgIH1cbiAgICAgIGNsaWVudC5fcHJvY2Vzc1Jlc3BvbnNlKHJlc3BvbnNlKVxuXG4gICAgICBleHBlY3QocmVzcG9uc2UuaHVtYW5SZWFkYWJsZSkudG8uZXF1YWwoJ1NvbWUgcmFuZG9tIHRleHQnKVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIHNldCByZXNwb25zZSBjb2RlJywgKCkgPT4ge1xuICAgICAgdmFyIHJlc3BvbnNlID0ge1xuICAgICAgICB0YWc6ICcqJyxcbiAgICAgICAgY29tbWFuZDogJ09LJyxcbiAgICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgc2VjdGlvbjogW3tcbiAgICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICAgIHZhbHVlOiAnQ0FQQUJJTElUWSdcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICB2YWx1ZTogJ0lNQVA0UkVWMSdcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICB2YWx1ZTogJ1VJRFBMVVMnXG4gICAgICAgICAgfV1cbiAgICAgICAgfSwge1xuICAgICAgICAgIHR5cGU6ICdURVhUJyxcbiAgICAgICAgICB2YWx1ZTogJ1NvbWUgcmFuZG9tIHRleHQnXG4gICAgICAgIH1dXG4gICAgICB9XG4gICAgICBjbGllbnQuX3Byb2Nlc3NSZXNwb25zZShyZXNwb25zZSlcbiAgICAgIGV4cGVjdChyZXNwb25zZS5jb2RlKS50by5lcXVhbCgnQ0FQQUJJTElUWScpXG4gICAgICBleHBlY3QocmVzcG9uc2UuY2FwYWJpbGl0eSkudG8uZGVlcC5lcXVhbChbJ0lNQVA0UkVWMScsICdVSURQTFVTJ10pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnI2lzRXJyb3InLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBkZXRlY3QgaWYgYW4gb2JqZWN0IGlzIGFuIGVycm9yJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNsaWVudC5pc0Vycm9yKG5ldyBSYW5nZUVycm9yKCdhYmMnKSkpLnRvLmJlLnRydWVcbiAgICAgIGV4cGVjdChjbGllbnQuaXNFcnJvcignYWJjJykpLnRvLmJlLmZhbHNlXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnI2VuYWJsZUNvbXByZXNzaW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgY3JlYXRlIGluZmxhdGVyIGFuZCBkZWZsYXRlciBzdHJlYW1zJywgKCkgPT4ge1xuICAgICAgY2xpZW50LnNvY2tldC5vbmRhdGEgPSAoKSA9PiB7IH1cbiAgICAgIHNpbm9uLnN0dWIoY2xpZW50LnNvY2tldCwgJ29uZGF0YScpXG5cbiAgICAgIGV4cGVjdChjbGllbnQuY29tcHJlc3NlZCkudG8uYmUuZmFsc2VcbiAgICAgIGNsaWVudC5lbmFibGVDb21wcmVzc2lvbigpXG4gICAgICBleHBlY3QoY2xpZW50LmNvbXByZXNzZWQpLnRvLmJlLnRydWVcblxuICAgICAgY29uc3QgcGF5bG9hZCA9ICdhc2Rhc2QnXG4gICAgICBjb25zdCBleHBlY3RlZCA9IHBheWxvYWQuc3BsaXQoJycpLm1hcChjaGFyID0+IGNoYXIuY2hhckNvZGVBdCgwKSlcblxuICAgICAgY2xpZW50LnNlbmQocGF5bG9hZClcbiAgICAgIGNvbnN0IGFjdHVhbE91dCA9IHNvY2tldFN0dWIuc2VuZC5hcmdzWzBdWzBdXG4gICAgICBjbGllbnQuc29ja2V0Lm9uZGF0YSh7IGRhdGE6IGFjdHVhbE91dCB9KVxuICAgICAgZXhwZWN0KEJ1ZmZlci5mcm9tKGNsaWVudC5fc29ja2V0T25EYXRhLmFyZ3NbMF1bMF0uZGF0YSkpLnRvLmRlZXAuZXF1YWwoQnVmZmVyLmZyb20oZXhwZWN0ZWQpKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJyNnZXRQcmV2aW91c2x5UXVldWVkJywgKCkgPT4ge1xuICAgIGNvbnN0IGN0eCA9IHt9XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB1bmRlZmluZWQgd2l0aCBlbXB0eSBxdWV1ZSBhbmQgbm8gY3VycmVudCBjb21tYW5kJywgKCkgPT4ge1xuICAgICAgY2xpZW50Ll9jdXJyZW50Q29tbWFuZCA9IHVuZGVmaW5lZFxuICAgICAgY2xpZW50Ll9jbGllbnRRdWV1ZSA9IFtdXG5cbiAgICAgIGV4cGVjdCh0ZXN0QW5kR2V0QXR0cmlidXRlKCkpLnRvLmJlLnVuZGVmaW5lZFxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB1bmRlZmluZWQgd2l0aCBlbXB0eSBxdWV1ZSBhbmQgbm9uLVNFTEVDVCBjdXJyZW50IGNvbW1hbmQnLCAoKSA9PiB7XG4gICAgICBjbGllbnQuX2N1cnJlbnRDb21tYW5kID0gY3JlYXRlQ29tbWFuZCgnVEVTVCcpXG4gICAgICBjbGllbnQuX2NsaWVudFF1ZXVlID0gW11cblxuICAgICAgZXhwZWN0KHRlc3RBbmRHZXRBdHRyaWJ1dGUoKSkudG8uYmUudW5kZWZpbmVkXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGN1cnJlbnQgY29tbWFuZCB3aXRoIGVtcHR5IHF1ZXVlIGFuZCBTRUxFQ1QgY3VycmVudCBjb21tYW5kJywgKCkgPT4ge1xuICAgICAgY2xpZW50Ll9jdXJyZW50Q29tbWFuZCA9IGNyZWF0ZUNvbW1hbmQoJ1NFTEVDVCcsICdBVFRSJylcbiAgICAgIGNsaWVudC5fY2xpZW50UXVldWUgPSBbXVxuXG4gICAgICBleHBlY3QodGVzdEFuZEdldEF0dHJpYnV0ZSgpKS50by5lcXVhbCgnQVRUUicpXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGN1cnJlbnQgY29tbWFuZCB3aXRoIG5vbi1TRUxFQ1QgY29tbWFuZHMgaW4gcXVldWUgYW5kIFNFTEVDVCBjdXJyZW50IGNvbW1hbmQnLCAoKSA9PiB7XG4gICAgICBjbGllbnQuX2N1cnJlbnRDb21tYW5kID0gY3JlYXRlQ29tbWFuZCgnU0VMRUNUJywgJ0FUVFInKVxuICAgICAgY2xpZW50Ll9jbGllbnRRdWV1ZSA9IFtcbiAgICAgICAgY3JlYXRlQ29tbWFuZCgnVEVTVDAxJyksXG4gICAgICAgIGNyZWF0ZUNvbW1hbmQoJ1RFU1QwMicpXG4gICAgICBdXG5cbiAgICAgIGV4cGVjdCh0ZXN0QW5kR2V0QXR0cmlidXRlKCkpLnRvLmVxdWFsKCdBVFRSJylcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gbGFzdCBTRUxFQ1QgYmVmb3JlIGN0eCB3aXRoIG11bHRpcGxlIFNFTEVDVCBjb21tYW5kcyBpbiBxdWV1ZSAoMSknLCAoKSA9PiB7XG4gICAgICBjbGllbnQuX2N1cnJlbnRDb21tYW5kID0gY3JlYXRlQ29tbWFuZCgnU0VMRUNUJywgJ0FUVFIwMScpXG4gICAgICBjbGllbnQuX2NsaWVudFF1ZXVlID0gW1xuICAgICAgICBjcmVhdGVDb21tYW5kKCdTRUxFQ1QnLCAnQVRUUicpLFxuICAgICAgICBjcmVhdGVDb21tYW5kKCdURVNUJyksXG4gICAgICAgIGN0eCxcbiAgICAgICAgY3JlYXRlQ29tbWFuZCgnU0VMRUNUJywgJ0FUVFIwMycpXG4gICAgICBdXG5cbiAgICAgIGV4cGVjdCh0ZXN0QW5kR2V0QXR0cmlidXRlKCkpLnRvLmVxdWFsKCdBVFRSJylcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gbGFzdCBTRUxFQ1QgYmVmb3JlIGN0eCB3aXRoIG11bHRpcGxlIFNFTEVDVCBjb21tYW5kcyBpbiBxdWV1ZSAoMiknLCAoKSA9PiB7XG4gICAgICBjbGllbnQuX2NsaWVudFF1ZXVlID0gW1xuICAgICAgICBjcmVhdGVDb21tYW5kKCdTRUxFQ1QnLCAnQVRUUjAyJyksXG4gICAgICAgIGNyZWF0ZUNvbW1hbmQoJ1NFTEVDVCcsICdBVFRSJyksXG4gICAgICAgIGN0eCxcbiAgICAgICAgY3JlYXRlQ29tbWFuZCgnU0VMRUNUJywgJ0FUVFIwMycpXG4gICAgICBdXG5cbiAgICAgIGV4cGVjdCh0ZXN0QW5kR2V0QXR0cmlidXRlKCkpLnRvLmVxdWFsKCdBVFRSJylcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gbGFzdCBTRUxFQ1QgYmVmb3JlIGN0eCB3aXRoIG11bHRpcGxlIFNFTEVDVCBjb21tYW5kcyBpbiBxdWV1ZSAoMyknLCAoKSA9PiB7XG4gICAgICBjbGllbnQuX2NsaWVudFF1ZXVlID0gW1xuICAgICAgICBjcmVhdGVDb21tYW5kKCdTRUxFQ1QnLCAnQVRUUjAyJyksXG4gICAgICAgIGNyZWF0ZUNvbW1hbmQoJ1NFTEVDVCcsICdBVFRSJyksXG4gICAgICAgIGNyZWF0ZUNvbW1hbmQoJ1RFU1QnKSxcbiAgICAgICAgY3R4LFxuICAgICAgICBjcmVhdGVDb21tYW5kKCdTRUxFQ1QnLCAnQVRUUjAzJylcbiAgICAgIF1cblxuICAgICAgZXhwZWN0KHRlc3RBbmRHZXRBdHRyaWJ1dGUoKSkudG8uZXF1YWwoJ0FUVFInKVxuICAgIH0pXG5cbiAgICBmdW5jdGlvbiB0ZXN0QW5kR2V0QXR0cmlidXRlICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBjbGllbnQuZ2V0UHJldmlvdXNseVF1ZXVlZChbJ1NFTEVDVCddLCBjdHgpXG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICByZXR1cm4gZGF0YS5yZXF1ZXN0LmF0dHJpYnV0ZXNbMF0udmFsdWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVDb21tYW5kIChjb21tYW5kLCBhdHRyaWJ1dGUpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBbXVxuICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgcmVxdWVzdDogeyBjb21tYW5kLCBhdHRyaWJ1dGVzIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGF0dHJpYnV0ZSkge1xuICAgICAgICBkYXRhLnJlcXVlc3QuYXR0cmlidXRlcy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiAnU1RSSU5HJyxcbiAgICAgICAgICB2YWx1ZTogYXR0cmlidXRlXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkYXRhXG4gICAgfVxuICB9KVxufSlcbiJdfQ== \ No newline at end of file diff --git a/dist/imap.js b/dist/imap.js index 5f3b454..c20f882 100644 --- a/dist/imap.js +++ b/dist/imap.js @@ -945,4 +945,5 @@ const createMessage = (message, buffer) => ({ message, buffer }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbWFwLmpzIl0sIm5hbWVzIjpbIk1FU1NBR0VfSU5JVElBTElaRV9XT1JLRVIiLCJNRVNTQUdFX0lORkxBVEUiLCJNRVNTQUdFX0lORkxBVEVEX0RBVEFfUkVBRFkiLCJNRVNTQUdFX0RFRkxBVEUiLCJNRVNTQUdFX0RFRkxBVEVEX0RBVEFfUkVBRFkiLCJFT0wiLCJMSU5FX0ZFRUQiLCJDQVJSSUFHRV9SRVRVUk4iLCJMRUZUX0NVUkxZX0JSQUNLRVQiLCJSSUdIVF9DVVJMWV9CUkFDS0VUIiwiQVNDSUlfUExVUyIsIkJVRkZFUl9TVEFURV9MSVRFUkFMIiwiQlVGRkVSX1NUQVRFX1BPU1NJQkxZX0xJVEVSQUxfTEVOR1RIXzEiLCJCVUZGRVJfU1RBVEVfUE9TU0lCTFlfTElURVJBTF9MRU5HVEhfMiIsIkJVRkZFUl9TVEFURV9ERUZBVUxUIiwiVElNRU9VVF9FTlRFUl9JRExFIiwiVElNRU9VVF9TT0NLRVRfTE9XRVJfQk9VTkQiLCJUSU1FT1VUX1NPQ0tFVF9NVUxUSVBMSUVSIiwiSW1hcCIsImNvbnN0cnVjdG9yIiwiaG9zdCIsInBvcnQiLCJvcHRpb25zIiwidGltZW91dEVudGVySWRsZSIsInRpbWVvdXRTb2NrZXRMb3dlckJvdW5kIiwidGltZW91dFNvY2tldE11bHRpcGxpZXIiLCJ1c2VTZWN1cmVUcmFuc3BvcnQiLCJzZWN1cmVNb2RlIiwiX2Nvbm5lY3Rpb25SZWFkeSIsIl9nbG9iYWxBY2NlcHRVbnRhZ2dlZCIsIl9jbGllbnRRdWV1ZSIsIl9jYW5TZW5kIiwiX3RhZ0NvdW50ZXIiLCJfY3VycmVudENvbW1hbmQiLCJfaWRsZVRpbWVyIiwiX3NvY2tldFRpbWVvdXRUaW1lciIsImNvbXByZXNzZWQiLCJfaW5jb21pbmdCdWZmZXJzIiwiX2J1ZmZlclN0YXRlIiwiX2xpdGVyYWxSZW1haW5pbmciLCJvbmNlcnQiLCJvbmVycm9yIiwib25yZWFkeSIsIm9uaWRsZSIsImNvbm5lY3QiLCJTb2NrZXQiLCJUQ1BTb2NrZXQiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInNvY2tldCIsIm9wZW4iLCJiaW5hcnlUeXBlIiwiY2EiLCJjZXJ0IiwiRSIsIm9uY2xvc2UiLCJfb25FcnJvciIsIkVycm9yIiwib25kYXRhIiwiZXZ0IiwiX29uRGF0YSIsImVyciIsImUiLCJkYXRhIiwibWVzc2FnZSIsIm9ub3BlbiIsImNsb3NlIiwiZXJyb3IiLCJ0ZWFyRG93biIsImZvckVhY2giLCJjbWQiLCJjYWxsYmFjayIsImNsZWFyVGltZW91dCIsIl9kaXNhYmxlQ29tcHJlc3Npb24iLCJyZWFkeVN0YXRlIiwibG9nb3V0IiwidGhlbiIsImNhdGNoIiwiZW5xdWV1ZUNvbW1hbmQiLCJ1cGdyYWRlIiwidXBncmFkZVRvU2VjdXJlIiwicmVxdWVzdCIsImFjY2VwdFVudGFnZ2VkIiwiY29tbWFuZCIsImNvbmNhdCIsIm1hcCIsInVudGFnZ2VkIiwidG9TdHJpbmciLCJ0b1VwcGVyQ2FzZSIsInRyaW0iLCJ0YWciLCJwYXlsb2FkIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwicmVzcG9uc2UiLCJpc0Vycm9yIiwiaW5kZXhPZiIsImh1bWFuUmVhZGFibGUiLCJjb2RlIiwiT2JqZWN0Iiwia2V5cyIsImtleSIsImluZGV4IiwiY3R4Iiwic3BsaWNlIiwicHVzaCIsIl9zZW5kUmVxdWVzdCIsImdldFByZXZpb3VzbHlRdWV1ZWQiLCJjb21tYW5kcyIsInN0YXJ0SW5kZXgiLCJpIiwiaXNNYXRjaCIsInNlbmQiLCJzdHIiLCJidWZmZXIiLCJ0aW1lb3V0IiwiTWF0aCIsImZsb29yIiwiYnl0ZUxlbmd0aCIsInNldFRpbWVvdXQiLCJfc2VuZENvbXByZXNzZWQiLCJzZXRIYW5kbGVyIiwibG9nZ2VyIiwiVWludDhBcnJheSIsIl9wYXJzZUluY29taW5nQ29tbWFuZHMiLCJfaXRlcmF0ZUluY29taW5nQnVmZmVyIiwiYnVmIiwiZGlmZiIsIm1pbiIsIk51bWJlciIsIl9sZW5ndGhCdWZmZXIiLCJzdGFydCIsImxhdGVzdCIsInN1YmFycmF5IiwicHJldkJ1ZiIsInNldCIsImxlZnRJZHgiLCJsZWZ0T2ZMZWZ0Q3VybHkiLCJMRmlkeCIsImNvbW1hbmRMZW5ndGgiLCJyZWR1Y2UiLCJwcmV2IiwiY3VyciIsInVpbnQ4QXJyYXkiLCJzaGlmdCIsInJlbWFpbmluZ0xlbmd0aCIsImV4Y2Vzc0xlbmd0aCIsIl9jbGVhcklkbGUiLCJjaHVuayIsImVycm9yUmVzcG9uc2VFeHBlY3RzRW1wdHlMaW5lIiwidmFsdWVBc1N0cmluZyIsImRlYnVnIiwiX3Byb2Nlc3NSZXNwb25zZSIsIl9oYW5kbGVSZXNwb25zZSIsIl9lbnRlcklkbGUiLCJfcmVzdGFydFF1ZXVlIiwicHJlY2hlY2siLCJjb250ZXh0Iiwid2FpdERyYWluIiwiYXR0cmlidXRlcyIsInRlc3QiLCJ0eXBlIiwibnIiLCJ2YWx1ZSIsInNlY3Rpb24iLCJvcHRpb24iLCJBcnJheSIsImlzQXJyYXkiLCJ0b0xvd2VyQ2FzZSIsInByb3RvdHlwZSIsImNhbGwiLCJtYXRjaCIsImVuYWJsZUNvbXByZXNzaW9uIiwiX3NvY2tldE9uRGF0YSIsIndpbmRvdyIsIldvcmtlciIsIl9jb21wcmVzc2lvbldvcmtlciIsIlVSTCIsImNyZWF0ZU9iamVjdFVSTCIsIkJsb2IiLCJDb21wcmVzc2lvbkJsb2IiLCJvbm1lc3NhZ2UiLCJwb3N0TWVzc2FnZSIsImNyZWF0ZU1lc3NhZ2UiLCJpbmZsYXRlZFJlYWR5IiwiZGVmbGF0ZWRSZWFkeSIsIl9jb21wcmVzc2lvbiIsIkNvbXByZXNzaW9uIiwiaW5mbGF0ZSIsInRlcm1pbmF0ZSIsImRlZmxhdGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7cTF2Q0FHQTtBQUNBO0FBQ0E7O0FBQ0EsTUFBTUEseUJBQXlCLEdBQUcsT0FBbEM7QUFDQSxNQUFNQyxlQUFlLEdBQUcsU0FBeEI7QUFDQSxNQUFNQywyQkFBMkIsR0FBRyxnQkFBcEM7QUFDQSxNQUFNQyxlQUFlLEdBQUcsU0FBeEI7QUFDQSxNQUFNQywyQkFBMkIsR0FBRyxn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O0FBQVdrRCxFQUFBQTtBQUFYLENBQXRCLENBQXRCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcHJvcE9yIH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgVENQU29ja2V0IGZyb20gJ2VtYWlsanMtdGNwLXNvY2tldCdcbmltcG9ydCB7IHRvVHlwZWRBcnJheSwgZnJvbVR5cGVkQXJyYXkgfSBmcm9tICcuL2NvbW1vbidcbmltcG9ydCB7IHBhcnNlciwgY29tcGlsZXIgfSBmcm9tICdlbWFpbGpzLWltYXAtaGFuZGxlcidcbmltcG9ydCBDb21wcmVzc2lvbiBmcm9tICcuL2NvbXByZXNzaW9uJ1xuaW1wb3J0IENvbXByZXNzaW9uQmxvYiBmcm9tICcuLi9yZXMvY29tcHJlc3Npb24ud29ya2VyLmJsb2InXG5cbi8vXG4vLyBjb25zdGFudHMgdXNlZCBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB3b3JrZXJcbi8vXG5jb25zdCBNRVNTQUdFX0lOSVRJQUxJWkVfV09SS0VSID0gJ3N0YXJ0J1xuY29uc3QgTUVTU0FHRV9JTkZMQVRFID0gJ2luZmxhdGUnXG5jb25zdCBNRVNTQUdFX0lORkxBVEVEX0RBVEFfUkVBRFkgPSAnaW5mbGF0ZWRfcmVhZHknXG5jb25zdCBNRVNTQUdFX0RFRkxBVEUgPSAnZGVmbGF0ZSdcbmNvbnN0IE1FU1NBR0VfREVGTEFURURfREFUQV9SRUFEWSA9ICdkZWZsYXRlZF9yZWFkeSdcblxuY29uc3QgRU9MID0gJ1xcclxcbidcbmNvbnN0IExJTkVfRkVFRCA9IDEwXG5jb25zdCBDQVJSSUFHRV9SRVRVUk4gPSAxM1xuY29uc3QgTEVGVF9DVVJMWV9CUkFDS0VUID0gMTIzXG5jb25zdCBSSUdIVF9DVVJMWV9CUkFDS0VUID0gMTI1XG5cbmNvbnN0IEFTQ0lJX1BMVVMgPSA0M1xuXG4vLyBTdGF0ZSB0cmFja2luZyB3aGVuIGNvbnN0cnVjdGluZyBhbiBJTUFQIGNvbW1hbmQgZnJvbSBidWZmZXJzLlxuY29uc3QgQlVGRkVSX1NUQVRFX0xJVEVSQUwgPSAnbGl0ZXJhbCdcbmNvbnN0IEJVRkZFUl9TVEFURV9QT1NTSUJMWV9MSVRFUkFMX0xFTkdUSF8xID0gJ2xpdGVyYWxfbGVuZ3RoXzEnXG5jb25zdCBCVUZGRVJfU1RBVEVfUE9TU0lCTFlfTElURVJBTF9MRU5HVEhfMiA9ICdsaXRlcmFsX2xlbmd0aF8yJ1xuY29uc3QgQlVGRkVSX1NUQVRFX0RFRkFVTFQgPSAnZGVmYXVsdCdcblxuLyoqXG4gKiBIb3cgbXVjaCB0aW1lIHRvIHdhaXQgc2luY2UgdGhlIGxhc3QgcmVzcG9uc2UgdW50aWwgdGhlIGNvbm5lY3Rpb24gaXMgY29uc2lkZXJlZCBpZGxpbmdcbiAqL1xuY29uc3QgVElNRU9VVF9FTlRFUl9JRExFID0gMTAwMFxuXG4vKipcbiAqIExvd2VyIEJvdW5kIGZvciBzb2NrZXQgdGltZW91dCB0byB3YWl0IHNpbmNlIHRoZSBsYXN0IGRhdGEgd2FzIHdyaXR0ZW4gdG8gYSBzb2NrZXRcbiAqL1xuY29uc3QgVElNRU9VVF9TT0NLRVRfTE9XRVJfQk9VTkQgPSA2MDAwMFxuXG4vKipcbiAqIE11bHRpcGxpZXIgZm9yIHNvY2tldCB0aW1lb3V0OlxuICpcbiAqIFdlIGFzc3VtZSBhdCBsZWFzdCBhIEdQUlMgY29ubmVjdGlvbiB3aXRoIDExNSBrYi9zID0gMTQsMzc1IGtCL3MgdG9wcywgc28gMTAgS0IvcyB0byBiZSBvblxuICogdGhlIHNhZmUgc2lkZS4gV2UgY2FuIHRpbWVvdXQgYWZ0ZXIgYSBsb3dlciBib3VuZCBvZiAxMHMgKyAobiBLQiAvIDEwIEtCL3MpLiBBIDEgTUIgbWVzc2FnZVxuICogdXBsb2FkIHdvdWxkIGJlIDExMCBzZWNvbmRzIHRvIHdhaXQgZm9yIHRoZSB0aW1lb3V0LiAxMCBLQi9zID09PSAwLjEgcy9CXG4gKi9cbmNvbnN0IFRJTUVPVVRfU09DS0VUX01VTFRJUExJRVIgPSAwLjFcblxuLyoqXG4gKiBDcmVhdGVzIGEgY29ubmVjdGlvbiBvYmplY3QgdG8gYW4gSU1BUCBzZXJ2ZXIuIENhbGwgYGNvbm5lY3RgIG1ldGhvZCB0byBpbml0aXRhdGVcbiAqIHRoZSBhY3R1YWwgY29ubmVjdGlvbiwgdGhlIGNvbnN0cnVjdG9yIG9ubHkgZGVmaW5lcyB0aGUgcHJvcGVydGllcyBidXQgZG9lcyBub3QgYWN0dWFsbHkgY29ubmVjdC5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gW2hvc3Q9J2xvY2FsaG9zdCddIEhvc3RuYW1lIHRvIGNvbmVuY3QgdG9cbiAqIEBwYXJhbSB7TnVtYmVyfSBbcG9ydD0xNDNdIFBvcnQgbnVtYmVyIHRvIGNvbm5lY3QgdG9cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gT3B0aW9uYWwgb3B0aW9ucyBvYmplY3RcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMudXNlU2VjdXJlVHJhbnNwb3J0XSBTZXQgdG8gdHJ1ZSwgdG8gdXNlIGVuY3J5cHRlZCBjb25uZWN0aW9uXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuY29tcHJlc3Npb25Xb3JrZXJQYXRoXSBvZmZsb2FkcyBkZS0vY29tcHJlc3Npb24gY29tcHV0YXRpb24gdG8gYSB3ZWIgd29ya2VyLCB0aGlzIGlzIHRoZSBwYXRoIHRvIHRoZSBicm93c2VyaWZpZWQgZW1haWxqcy1jb21wcmVzc29yLXdvcmtlci5qc1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbWFwIHtcbiAgY29uc3RydWN0b3IgKGhvc3QsIHBvcnQsIG9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMudGltZW91dEVudGVySWRsZSA9IFRJTUVPVVRfRU5URVJfSURMRVxuICAgIHRoaXMudGltZW91dFNvY2tldExvd2VyQm91bmQgPSBUSU1FT1VUX1NPQ0tFVF9MT1dFUl9CT1VORFxuICAgIHRoaXMudGltZW91dFNvY2tldE11bHRpcGxpZXIgPSBUSU1FT1VUX1NPQ0tFVF9NVUxUSVBMSUVSXG5cbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXG5cbiAgICB0aGlzLnBvcnQgPSBwb3J0IHx8ICh0aGlzLm9wdGlvbnMudXNlU2VjdXJlVHJhbnNwb3J0ID8gOTkzIDogMTQzKVxuICAgIHRoaXMuaG9zdCA9IGhvc3QgfHwgJ2xvY2FsaG9zdCdcblxuICAgIC8vIFVzZSBhIFRMUyBjb25uZWN0aW9uLiBQb3J0IDk5MyBhbHNvIGZvcmNlcyBUTFMuXG4gICAgdGhpcy5vcHRpb25zLnVzZVNlY3VyZVRyYW5zcG9ydCA9ICd1c2VTZWN1cmVUcmFuc3BvcnQnIGluIHRoaXMub3B0aW9ucyA/ICEhdGhpcy5vcHRpb25zLnVzZVNlY3VyZVRyYW5zcG9ydCA6IHRoaXMucG9ydCA9PT0gOTkzXG5cbiAgICB0aGlzLnNlY3VyZU1vZGUgPSAhIXRoaXMub3B0aW9ucy51c2VTZWN1cmVUcmFuc3BvcnQgLy8gRG9lcyB0aGUgY29ubmVjdGlvbiB1c2UgU1NML1RMU1xuXG4gICAgdGhpcy5fY29ubmVjdGlvblJlYWR5ID0gZmFsc2UgLy8gSXMgdGhlIGNvbmVjdGlvbiBlc3RhYmxpc2hlZCBhbmQgZ3JlZXRpbmcgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyXG5cbiAgICB0aGlzLl9nbG9iYWxBY2NlcHRVbnRhZ2dlZCA9IHt9IC8vIEdsb2JhbCBoYW5kbGVycyBmb3IgdW5yZWxhdGVkIHJlc3BvbnNlcyAoRVhQVU5HRSwgRVhJU1RTIGV0Yy4pXG5cbiAgICB0aGlzLl9jbGllbnRRdWV1ZSA9IFtdIC8vIFF1ZXVlIG9mIG91dGdvaW5nIGNvbW1hbmRzXG4gICAgdGhpcy5fY2FuU2VuZCA9IGZhbHNlIC8vIElzIGl0IE9LIHRvIHNlbmQgc29tZXRoaW5nIHRvIHRoZSBzZXJ2ZXJcbiAgICB0aGlzLl90YWdDb3VudGVyID0gMCAvLyBDb3VudGVyIHRvIGFsbG93IHVuaXF1ZXVlIGltYXAgdGFnc1xuICAgIHRoaXMuX2N1cnJlbnRDb21tYW5kID0gZmFsc2UgLy8gQ3VycmVudCBjb21tYW5kIHRoYXQgaXMgd2FpdGluZyBmb3IgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyXG5cbiAgICB0aGlzLl9pZGxlVGltZXIgPSBmYWxzZSAvLyBUaW1lciB3YWl0aW5nIHRvIGVudGVyIGlkbGVcbiAgICB0aGlzLl9zb2NrZXRUaW1lb3V0VGltZXIgPSBmYWxzZSAvLyBUaW1lciB3YWl0aW5nIHRvIGRlY2xhcmUgdGhlIHNvY2tldCBkZWFkIHN0YXJ0aW5nIGZyb20gdGhlIGxhc3Qgd3JpdGVcblxuICAgIHRoaXMuY29tcHJlc3NlZCA9IGZhbHNlIC8vIElzIHRoZSBjb25uZWN0aW9uIGNvbXByZXNzZWQgYW5kIG5lZWRzIGluZmxhdGluZy9kZWZsYXRpbmdcblxuICAgIC8vXG4gICAgLy8gSEVMUEVSU1xuICAgIC8vXG5cbiAgICAvLyBBcyB0aGUgc2VydmVyIHNlbmRzIGRhdGEgaW4gY2h1bmtzLCBpdCBuZWVkcyB0byBiZSBzcGxpdCBpbnRvIHNlcGFyYXRlIGxpbmVzLiBIZWxwcyBwYXJzaW5nIHRoZSBpbnB1dC5cbiAgICB0aGlzLl9pbmNvbWluZ0J1ZmZlcnMgPSBbXVxuICAgIHRoaXMuX2J1ZmZlclN0YXRlID0gQlVGRkVSX1NUQVRFX0RFRkFVTFRcbiAgICB0aGlzLl9saXRlcmFsUmVtYWluaW5nID0gMFxuXG4gICAgLy9cbiAgICAvLyBFdmVudCBwbGFjZWhvbGRlcnMsIG1heSBiZSBvdmVycmlkZW4gd2l0aCBjYWxsYmFjayBmdW5jdGlvbnNcbiAgICAvL1xuICAgIHRoaXMub25jZXJ0ID0gbnVsbFxuICAgIHRoaXMub25lcnJvciA9IG51bGwgLy8gSXJyZWNvdmVyYWJsZSBlcnJvciBvY2N1cnJlZC4gQ29ubmVjdGlvbiB0byB0aGUgc2VydmVyIHdpbGwgYmUgY2xvc2VkIGF1dG9tYXRpY2FsbHkuXG4gICAgdGhpcy5vbnJlYWR5ID0gbnVsbCAvLyBUaGUgY29ubmVjdGlvbiB0byB0aGUgc2VydmVyIGhhcyBiZWVuIGVzdGFibGlzaGVkIGFuZCBncmVldGluZyBpcyByZWNlaXZlZFxuICAgIHRoaXMub25pZGxlID0gbnVsbCAvLyBUaGVyZSBhcmUgbm8gbW9yZSBjb21tYW5kcyB0byBwcm9jZXNzXG4gIH1cblxuICAvLyBQVUJMSUMgTUVUSE9EU1xuXG4gIC8qKlxuICAgKiBJbml0aWF0ZSBhIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlci4gV2FpdCBmb3Igb25yZWFkeSBldmVudFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gU29ja2V0XG4gICAqICAgICBURVNUSU5HIE9OTFkhIFRoZSBUQ1BTb2NrZXQgaGFzIGEgcHJldHR5IG5vbnNlbnNpY2FsIGNvbnZlbmllbmNlIGNvbnN0cnVjdG9yLFxuICAgKiAgICAgd2hpY2ggbWFrZXMgaXQgaGFyZCB0byBtb2NrLiBGb3IgZGVwZW5kZW5jeS1pbmplY3Rpb24gcHVycG9zZXMsIHdlIHVzZSB0aGVcbiAgICogICAgIFNvY2tldCBwYXJhbWV0ZXIgdG8gcGFzcyBpbiBhIG1vY2sgU29ja2V0IGltcGxlbWVudGF0aW9uLiBTaG91bGQgYmUgbGVmdCBibGFua1xuICAgKiAgICAgaW4gcHJvZHVjdGlvbiB1c2UhXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBSZXNvbHZlcyB3aGVuIHNvY2tldCBpcyBvcGVuZWRcbiAgICovXG4gIGNvbm5lY3QgKFNvY2tldCA9IFRDUFNvY2tldCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnNvY2tldCA9IFNvY2tldC5vcGVuKHRoaXMuaG9zdCwgdGhpcy5wb3J0LCB7XG4gICAgICAgIGJpbmFyeVR5cGU6ICdhcnJheWJ1ZmZlcicsXG4gICAgICAgIHVzZVNlY3VyZVRyYW5zcG9ydDogdGhpcy5zZWN1cmVNb2RlLFxuICAgICAgICBjYTogdGhpcy5vcHRpb25zLmNhXG4gICAgICB9KVxuXG4gICAgICAvLyBhbGxvd3MgY2VydGlmaWNhdGUgaGFuZGxpbmcgZm9yIHBsYXRmb3JtIHcvbyBuYXRpdmUgdGxzIHN1cHBvcnRcbiAgICAgIC8vIG9uY2VydCBpcyBub24gc3RhbmRhcmQgc28gc2V0dGluZyBpdCBtaWdodCB0aHJvdyBpZiB0aGUgc29ja2V0IG9iamVjdCBpcyBpbW11dGFibGVcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuc29ja2V0Lm9uY2VydCA9IChjZXJ0KSA9PiB7IHRoaXMub25jZXJ0ICYmIHRoaXMub25jZXJ0KGNlcnQpIH1cbiAgICAgIH0gY2F0Y2ggKEUpIHsgfVxuXG4gICAgICAvLyBDb25uZWN0aW9uIGNsb3NpbmcgdW5leHBlY3RlZCBpcyBhbiBlcnJvclxuICAgICAgdGhpcy5zb2NrZXQub25jbG9zZSA9ICgpID0+IHRoaXMuX29uRXJyb3IobmV3IEVycm9yKCdTb2NrZXQgY2xvc2VkIHVuZXhwZWN0ZWRseSEnKSlcbiAgICAgIHRoaXMuc29ja2V0Lm9uZGF0YSA9IChldnQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLl9vbkRhdGEoZXZ0KVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aGlzLl9vbkVycm9yKGVycilcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBpZiBhbiBlcnJvciBoYXBwZW5zIGR1cmluZyBjcmVhdGUgdGltZSwgcmVqZWN0IHRoZSBwcm9taXNlXG4gICAgICB0aGlzLnNvY2tldC5vbmVycm9yID0gKGUpID0+IHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignQ291bGQgbm90IG9wZW4gc29ja2V0OiAnICsgZS5kYXRhLm1lc3NhZ2UpKVxuICAgICAgfVxuXG4gICAgICB0aGlzLnNvY2tldC5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICAgIC8vIHVzZSBwcm9wZXIgXCJpcnJlY292ZXJhYmxlIGVycm9yLCB0ZWFyIGRvd24gZXZlcnl0aGluZ1wiLWhhbmRsZXIgb25seSBhZnRlciBzb2NrZXQgaXMgb3BlblxuICAgICAgICB0aGlzLnNvY2tldC5vbmVycm9yID0gKGUpID0+IHRoaXMuX29uRXJyb3IoZSlcbiAgICAgICAgcmVzb2x2ZSgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlclxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUmVzb2x2ZXMgd2hlbiB0aGUgc29ja2V0IGlzIGNsb3NlZFxuICAgKi9cbiAgY2xvc2UgKGVycm9yKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB2YXIgdGVhckRvd24gPSAoKSA9PiB7XG4gICAgICAgIC8vIGZ1bGZpbGwgcGVuZGluZyBwcm9taXNlc1xuICAgICAgICB0aGlzLl9jbGllbnRRdWV1ZS5mb3JFYWNoKGNtZCA9PiBjbWQuY2FsbGJhY2soZXJyb3IpKVxuICAgICAgICBpZiAodGhpcy5fY3VycmVudENvbW1hbmQpIHtcbiAgICAgICAgICB0aGlzLl9jdXJyZW50Q29tbWFuZC5jYWxsYmFjayhlcnJvcilcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NsaWVudFF1ZXVlID0gW11cbiAgICAgICAgdGhpcy5fY3VycmVudENvbW1hbmQgPSBmYWxzZVxuXG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9pZGxlVGltZXIpXG4gICAgICAgIHRoaXMuX2lkbGVUaW1lciA9IG51bGxcblxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fc29ja2V0VGltZW91dFRpbWVyKVxuICAgICAgICB0aGlzLl9zb2NrZXRUaW1lb3V0VGltZXIgPSBudWxsXG5cbiAgICAgICAgaWYgKHRoaXMuc29ja2V0KSB7XG4gICAgICAgICAgLy8gcmVtb3ZlIGFsbCBsaXN0ZW5lcnNcbiAgICAgICAgICB0aGlzLnNvY2tldC5vbm9wZW4gPSBudWxsXG4gICAgICAgICAgdGhpcy5zb2NrZXQub25jbG9zZSA9IG51bGxcbiAgICAgICAgICB0aGlzLnNvY2tldC5vbmRhdGEgPSBudWxsXG4gICAgICAgICAgdGhpcy5zb2NrZXQub25lcnJvciA9IG51bGxcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQub25jZXJ0ID0gbnVsbFxuICAgICAgICAgIH0gY2F0Y2ggKEUpIHsgfVxuXG4gICAgICAgICAgdGhpcy5zb2NrZXQgPSBudWxsXG4gICAgICAgIH1cblxuICAgICAgICByZXNvbHZlKClcbiAgICAgIH1cblxuICAgICAgdGhpcy5fZGlzYWJsZUNvbXByZXNzaW9uKClcblxuICAgICAgaWYgKCF0aGlzLnNvY2tldCB8fCB0aGlzLnNvY2tldC5yZWFkeVN0YXRlICE9PSAnb3BlbicpIHtcbiAgICAgICAgcmV0dXJuIHRlYXJEb3duKClcbiAgICAgIH1cblxuICAgICAgdGhpcy5zb2NrZXQub25jbG9zZSA9IHRoaXMuc29ja2V0Lm9uZXJyb3IgPSB0ZWFyRG93biAvLyB3ZSBkb24ndCByZWFsbHkgY2FyZSBhYm91dCB0aGUgZXJyb3IgaGVyZVxuICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogU2VuZCBMT0dPVVQgdG8gdGhlIHNlcnZlci5cbiAgICpcbiAgICogVXNlIGlzIGRpc2NvdXJhZ2VkIVxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUmVzb2x2ZXMgd2hlbiBjb25uZWN0aW9uIGlzIGNsb3NlZCBieSBzZXJ2ZXIuXG4gICAqL1xuICBsb2dvdXQgKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnNvY2tldC5vbmNsb3NlID0gdGhpcy5zb2NrZXQub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5jbG9zZSgnQ2xpZW50IGxvZ2dpbmcgb3V0JykudGhlbihyZXNvbHZlKS5jYXRjaChyZWplY3QpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuZW5xdWV1ZUNvbW1hbmQoJ0xPR09VVCcpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWF0ZXMgVExTIGhhbmRzaGFrZVxuICAgKi9cbiAgdXBncmFkZSAoKSB7XG4gICAgdGhpcy5zZWN1cmVNb2RlID0gdHJ1ZVxuICAgIHRoaXMuc29ja2V0LnVwZ3JhZGVUb1NlY3VyZSgpXG4gIH1cblxuICAvKipcbiAgICogU2NoZWR1bGVzIGEgY29tbWFuZCB0byBiZSBzZW50IHRvIHRoZSBzZXJ2ZXIuXG4gICAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW1haWxqcy9lbWFpbGpzLWltYXAtaGFuZGxlciBmb3IgcmVxdWVzdCBzdHJ1Y3R1cmUuXG4gICAqIERvIG5vdCBwcm92aWRlIGEgdGFnIHByb3BlcnR5LCBpdCB3aWxsIGJlIHNldCBieSB0aGUgcXVldWUgbWFuYWdlci5cbiAgICpcbiAgICogVG8gY2F0Y2ggdW50YWdnZWQgcmVzcG9uc2VzIHVzZSBhY2NlcHRVbnRhZ2dlZCBwcm9wZXJ0eS4gRm9yIGV4YW1wbGUsIGlmXG4gICAqIHRoZSB2YWx1ZSBmb3IgaXQgaXMgJ0ZFVENIJyB0aGVuIHRoZSByZXBvbnNlIGluY2x1ZGVzICdwYXlsb2FkLkZFVENIJyBwcm9wZXJ0eVxuICAgKiB0aGF0IGlzIGFuIGFycmF5IGluY2x1ZGluZyBhbGwgbGlzdGVkICogRkVUQ0ggcmVzcG9uc2VzLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcmVxdWVzdCBTdHJ1Y3R1cmVkIHJlcXVlc3Qgb2JqZWN0XG4gICAqIEBwYXJhbSB7QXJyYXl9IGFjY2VwdFVudGFnZ2VkIGEgbGlzdCBvZiB1bnRhZ2dlZCByZXNwb25zZXMgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIGluICdwYXlsb2FkJyBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIE9wdGlvbmFsIGRhdGEgZm9yIHRoZSBjb21tYW5kIHBheWxvYWRcbiAgICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlIHdhcyByZWNlaXZlZFxuICAgKi9cbiAgZW5xdWV1ZUNvbW1hbmQgKHJlcXVlc3QsIGFjY2VwdFVudGFnZ2VkLCBvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiByZXF1ZXN0ID09PSAnc3RyaW5nJykge1xuICAgICAgcmVxdWVzdCA9IHtcbiAgICAgICAgY29tbWFuZDogcmVxdWVzdFxuICAgICAgfVxuICAgIH1cblxuICAgIGFjY2VwdFVudGFnZ2VkID0gW10uY29uY2F0KGFjY2VwdFVudGFnZ2VkIHx8IFtdKS5tYXAoKHVudGFnZ2VkKSA9PiAodW50YWdnZWQgfHwgJycpLnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKS50cmltKCkpXG5cbiAgICB2YXIgdGFnID0gJ1cnICsgKCsrdGhpcy5fdGFnQ291bnRlcilcbiAgICByZXF1ZXN0LnRhZyA9IHRhZ1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHZhciBkYXRhID0ge1xuICAgICAgICB0YWc6IHRhZyxcbiAgICAgICAgcmVxdWVzdDogcmVxdWVzdCxcbiAgICAgICAgcGF5bG9hZDogYWNjZXB0VW50YWdnZWQubGVuZ3RoID8ge30gOiB1bmRlZmluZWQsXG4gICAgICAgIGNhbGxiYWNrOiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pc0Vycm9yKHJlc3BvbnNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlamVjdChyZXNwb25zZSlcbiAgICAgICAgICB9IGVsc2UgaWYgKFsnTk8nLCAnQkFEJ10uaW5kZXhPZihwcm9wT3IoJycsICdjb21tYW5kJywgcmVzcG9uc2UpLnRvVXBwZXJDYXNlKCkudHJpbSgpKSA+PSAwKSB7XG4gICAgICAgICAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IocmVzcG9uc2UuaHVtYW5SZWFkYWJsZSB8fCAnRXJyb3InKVxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmNvZGUpIHtcbiAgICAgICAgICAgICAgZXJyb3IuY29kZSA9IHJlc3BvbnNlLmNvZGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZWplY3QoZXJyb3IpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBhcHBseSBhbnkgYWRkaXRpb25hbCBvcHRpb25zIHRvIHRoZSBjb21tYW5kXG4gICAgICBPYmplY3Qua2V5cyhvcHRpb25zIHx8IHt9KS5mb3JFYWNoKChrZXkpID0+IHsgZGF0YVtrZXldID0gb3B0aW9uc1trZXldIH0pXG5cbiAgICAgIGFjY2VwdFVudGFnZ2VkLmZvckVhY2goKGNvbW1hbmQpID0+IHsgZGF0YS5wYXlsb2FkW2NvbW1hbmRdID0gW10gfSlcblxuICAgICAgLy8gaWYgd2UncmUgaW4gcHJpb3JpdHkgbW9kZSAoaS5lLiB3ZSByYW4gY29tbWFuZHMgaW4gYSBwcmVjaGVjayksXG4gICAgICAvLyBxdWV1ZSBhbnkgY29tbWFuZHMgQkVGT1JFIHRoZSBjb21tYW5kIHRoYXQgY29udGlhbmVkIHRoZSBwcmVjaGVjayxcbiAgICAgIC8vIG90aGVyd2lzZSBqdXN0IHF1ZXVlIGNvbW1hbmQgYXMgdXN1YWxcbiAgICAgIHZhciBpbmRleCA9IGRhdGEuY3R4ID8gdGhpcy5fY2xpZW50UXVldWUuaW5kZXhPZihkYXRhLmN0eCkgOiAtMVxuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgZGF0YS50YWcgKz0gJy5wJ1xuICAgICAgICBkYXRhLnJlcXVlc3QudGFnICs9ICcucCdcbiAgICAgICAgdGhpcy5fY2xpZW50UXVldWUuc3BsaWNlKGluZGV4LCAwLCBkYXRhKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fY2xpZW50UXVldWUucHVzaChkYXRhKVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fY2FuU2VuZCkge1xuICAgICAgICB0aGlzLl9zZW5kUmVxdWVzdCgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gY29tbWFuZHNcbiAgICogQHBhcmFtIGN0eFxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGdldFByZXZpb3VzbHlRdWV1ZWQgKGNvbW1hbmRzLCBjdHgpIHtcbiAgICBjb25zdCBzdGFydEluZGV4ID0gdGhpcy5fY2xpZW50UXVldWUuaW5kZXhPZihjdHgpIC0gMVxuXG4gICAgLy8gc2VhcmNoIGJhY2t3YXJkcyBmb3IgdGhlIGNvbW1hbmRzIGFuZCByZXR1cm4gdGhlIGZpcnN0IGZvdW5kXG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBpZiAoaXNNYXRjaCh0aGlzLl9jbGllbnRRdWV1ZVtpXSkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NsaWVudFF1ZXVlW2ldXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYWxzbyBjaGVjayBjdXJyZW50IGNvbW1hbmQgaWYgbm8gU0VMRUNUIGlzIHF1ZXVlZFxuICAgIGlmIChpc01hdGNoKHRoaXMuX2N1cnJlbnRDb21tYW5kKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRDb21tYW5kXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG5cbiAgICBmdW5jdGlvbiBpc01hdGNoIChkYXRhKSB7XG4gICAgICByZXR1cm4gZGF0YSAmJiBkYXRhLnJlcXVlc3QgJiYgY29tbWFuZHMuaW5kZXhPZihkYXRhLnJlcXVlc3QuY29tbWFuZCkgPj0gMFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGRhdGEgdG8gdGhlIFRDUCBzb2NrZXRcbiAgICogQXJtcyBhIHRpbWVvdXQgd2FpdGluZyBmb3IgYSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgUGF5bG9hZFxuICAgKi9cbiAgc2VuZCAoc3RyKSB7XG4gICAgY29uc3QgYnVmZmVyID0gdG9UeXBlZEFycmF5KHN0cikuYnVmZmVyXG4gICAgY29uc3QgdGltZW91dCA9IHRoaXMudGltZW91dFNvY2tldExvd2VyQm91bmQgKyBNYXRoLmZsb29yKGJ1ZmZlci5ieXRlTGVuZ3RoICogdGhpcy50aW1lb3V0U29ja2V0TXVsdGlwbGllcilcblxuICAgIGNsZWFyVGltZW91dCh0aGlzLl9zb2NrZXRUaW1lb3V0VGltZXIpIC8vIGNsZWFyIHBlbmRpbmcgdGltZW91dHNcbiAgICB0aGlzLl9zb2NrZXRUaW1lb3V0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX29uRXJyb3IobmV3IEVycm9yKCcgU29ja2V0IHRpbWVkIG91dCEnKSksIHRpbWVvdXQpIC8vIGFybSB0aGUgbmV4dCB0aW1lb3V0XG5cbiAgICBpZiAodGhpcy5jb21wcmVzc2VkKSB7XG4gICAgICB0aGlzLl9zZW5kQ29tcHJlc3NlZChidWZmZXIpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghdGhpcy5zb2NrZXQpIHtcbiAgICAgICAgdGhpcy5fb25FcnJvcihuZXcgRXJyb3IoXCJFcnJvciA6OiBVbmV4cGVjdGVkIHNvY2tldCBjbG9zZVwiKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNvY2tldC5zZW5kKGJ1ZmZlcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIGdsb2JhbCBoYW5kbGVyIGZvciBhbiB1bnRhZ2dlZCByZXNwb25zZS4gSWYgY3VycmVudGx5IHByb2Nlc3NlZCBjb21tYW5kXG4gICAqIGhhcyBub3QgbGlzdGVkIHVudGFnZ2VkIGNvbW1hbmQgaXQgaXMgZm9yd2FyZGVkIHRvIHRoZSBnbG9iYWwgaGFuZGxlci4gVXNlZnVsXG4gICAqIHdpdGggRVhQVU5HRSwgRVhJU1RTIGV0Yy5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNvbW1hbmQgVW50YWdnZWQgY29tbWFuZCBuYW1lXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIGZ1bmN0aW9uIHdpdGggcmVzcG9uc2Ugb2JqZWN0IGFuZCBjb250aW51ZSBjYWxsYmFjayBmdW5jdGlvblxuICAgKi9cbiAgc2V0SGFuZGxlciAoY29tbWFuZCwgY2FsbGJhY2spIHtcbiAgICB0aGlzLl9nbG9iYWxBY2NlcHRVbnRhZ2dlZFtjb21tYW5kLnRvVXBwZXJDYXNlKCkudHJpbSgpXSA9IGNhbGxiYWNrXG4gIH1cblxuICAvLyBJTlRFUk5BTCBFVkVOVFNcblxuICAvKipcbiAgICogRXJyb3IgaGFuZGxlciBmb3IgdGhlIHNvY2tldFxuICAgKlxuICAgKiBAZXZlbnRcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0IEV2ZW50IG9iamVjdC4gU2VlIGV2dC5kYXRhIGZvciB0aGUgZXJyb3JcbiAgICovXG4gIF9vbkVycm9yIChldnQpIHtcbiAgICB2YXIgZXJyb3JcbiAgICBpZiAodGhpcy5pc0Vycm9yKGV2dCkpIHtcbiAgICAgIGVycm9yID0gZXZ0XG4gICAgfSBlbHNlIGlmIChldnQgJiYgdGhpcy5pc0Vycm9yKGV2dC5kYXRhKSkge1xuICAgICAgZXJyb3IgPSBldnQuZGF0YVxuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvciA9IG5ldyBFcnJvcigoZXZ0ICYmIGV2dC5kYXRhICYmIGV2dC5kYXRhLm1lc3NhZ2UpIHx8IGV2dC5kYXRhIHx8IGV2dCB8fCAnRXJyb3InKVxuICAgIH1cblxuICAgIHRoaXMubG9nZ2VyLmVycm9yKGVycm9yKVxuXG4gICAgLy8gYWx3YXlzIGNhbGwgb25lcnJvciBjYWxsYmFjaywgbm8gbWF0dGVyIGlmIGNsb3NlKCkgc3VjY2VlZHMgb3IgZmFpbHNcbiAgICB0aGlzLmNsb3NlKGVycm9yKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMub25lcnJvciAmJiB0aGlzLm9uZXJyb3IoZXJyb3IpXG4gICAgfSwgKCkgPT4ge1xuICAgICAgdGhpcy5vbmVycm9yICYmIHRoaXMub25lcnJvcihlcnJvcilcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIGluY29taW5nIGRhdGEgZnJvbSB0aGUgc2VydmVyLiBUaGUgZGF0YSBpcyBzZW50IGluIGFyYml0cmFyeVxuICAgKiBjaHVua3MgYW5kIGNhbid0IGJlIHVzZWQgZGlyZWN0bHkgc28gdGhpcyBmdW5jdGlvbiBtYWtlcyBzdXJlIHRoZSBkYXRhXG4gICAqIGlzIHNwbGl0IGludG8gY29tcGxldGUgbGluZXMgYmVmb3JlIHRoZSBkYXRhIGlzIHBhc3NlZCB0byB0aGUgY29tbWFuZFxuICAgKiBoYW5kbGVyXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKi9cbiAgX29uRGF0YSAoZXZ0KSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3NvY2tldFRpbWVvdXRUaW1lcikgLy8gcmVzZXQgdGhlIHRpbWVvdXQgb24gZWFjaCBkYXRhIHBhY2tldFxuICAgIGNvbnN0IHRpbWVvdXQgPSB0aGlzLnRpbWVvdXRTb2NrZXRMb3dlckJvdW5kICsgTWF0aC5mbG9vcig0MDk2ICogdGhpcy50aW1lb3V0U29ja2V0TXVsdGlwbGllcikgLy8gbWF4IHBhY2tldCBzaXplIGlzIDQwOTYgYnl0ZXNcbiAgICB0aGlzLl9zb2NrZXRUaW1lb3V0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX29uRXJyb3IobmV3IEVycm9yKCcgU29ja2V0IHRpbWVkIG91dCEnKSksIHRpbWVvdXQpXG5cbiAgICB0aGlzLl9pbmNvbWluZ0J1ZmZlcnMucHVzaChuZXcgVWludDhBcnJheShldnQuZGF0YSkpIC8vIGFwcGVuZCB0byB0aGUgaW5jb21pbmcgYnVmZmVyXG4gICAgdGhpcy5fcGFyc2VJbmNvbWluZ0NvbW1hbmRzKHRoaXMuX2l0ZXJhdGVJbmNvbWluZ0J1ZmZlcigpKSAvLyBDb25zdW1lIHRoZSBpbmNvbWluZyBidWZmZXJcbiAgfVxuXG4gICogX2l0ZXJhdGVJbmNvbWluZ0J1ZmZlciAoKSB7XG4gICAgbGV0IGJ1ZiA9IHRoaXMuX2luY29taW5nQnVmZmVyc1t0aGlzLl9pbmNvbWluZ0J1ZmZlcnMubGVuZ3RoIC0gMV0gfHwgW11cbiAgICBsZXQgaSA9IDBcblxuICAgIC8vIGxvb3AgaW52YXJpYW50OlxuICAgIC8vICAgdGhpcy5faW5jb21pbmdCdWZmZXJzIHN0YXJ0cyB3aXRoIHRoZSBiZWdpbm5pbmcgb2YgaW5jb21pbmcgY29tbWFuZC5cbiAgICAvLyAgIGJ1ZiBpcyBzaG9ydGhhbmQgZm9yIGxhc3QgZWxlbWVudCBvZiB0aGlzLl9pbmNvbWluZ0J1ZmZlcnMuXG4gICAgLy8gICBidWZbMC4uaS0xXSBpcyBwYXJ0IG9mIGluY29taW5nIGNvbW1hbmQuXG4gICAgd2hpbGUgKGkgPCBidWYubGVuZ3RoKSB7XG4gICAgICBzd2l0Y2ggKHRoaXMuX2J1ZmZlclN0YXRlKSB7XG4gICAgICAgIGNhc2UgQlVGRkVSX1NUQVRFX0xJVEVSQUw6XG4gICAgICAgICAgY29uc3QgZGlmZiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBpLCB0aGlzLl9saXRlcmFsUmVtYWluaW5nKVxuICAgICAgICAgIHRoaXMuX2xpdGVyYWxSZW1haW5pbmcgLT0gZGlmZlxuICAgICAgICAgIGkgKz0gZGlmZlxuICAgICAgICAgIGlmICh0aGlzLl9saXRlcmFsUmVtYWluaW5nID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLl9idWZmZXJTdGF0ZSA9IEJVRkZFUl9TVEFURV9ERUZBVUxUXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBCVUZGRVJfU1RBVEVfUE9TU0lCTFlfTElURVJBTF9MRU5HVEhfMjpcbiAgICAgICAgICBpZiAoaSA8IGJ1Zi5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChidWZbaV0gPT09IENBUlJJQUdFX1JFVFVSTikge1xuICAgICAgICAgICAgICB0aGlzLl9saXRlcmFsUmVtYWluaW5nID0gTnVtYmVyKGZyb21UeXBlZEFycmF5KHRoaXMuX2xlbmd0aEJ1ZmZlcikpICsgMiAvLyBmb3IgQ1JMRlxuICAgICAgICAgICAgICB0aGlzLl9idWZmZXJTdGF0ZSA9IEJVRkZFUl9TVEFURV9MSVRFUkFMXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLl9idWZmZXJTdGF0ZSA9IEJVRkZFUl9TVEFURV9ERUZBVUxUXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fbGVuZ3RoQnVmZmVyXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBCVUZGRVJfU1RBVEVfUE9TU0lCTFlfTElURVJBTF9MRU5HVEhfMTpcbiAgICAgICAgICBjb25zdCBzdGFydCA9IGlcbiAgICAgICAgICB3aGlsZSAoaSA8IGJ1Zi5sZW5ndGggJiYgYnVmW2ldID49IDQ4ICYmIGJ1ZltpXSA8PSA1NykgeyAvLyBkaWdpdHNcbiAgICAgICAgICAgIGkrK1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RhcnQgIT09IGkpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhdGVzdCA9IGJ1Zi5zdWJhcnJheShzdGFydCwgaSlcbiAgICAgICAgICAgIGNvbnN0IHByZXZCdWYgPSB0aGlzLl9sZW5ndGhCdWZmZXJcbiAgICAgICAgICAgIHRoaXMuX2xlbmd0aEJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHByZXZCdWYubGVuZ3RoICsgbGF0ZXN0Lmxlbmd0aClcbiAgICAgICAgICAgIHRoaXMuX2xlbmd0aEJ1ZmZlci5zZXQocHJldkJ1ZilcbiAgICAgICAgICAgIHRoaXMuX2xlbmd0aEJ1ZmZlci5zZXQobGF0ZXN0LCBwcmV2QnVmLmxlbmd0aClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGkgPCBidWYubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fbGVuZ3RoQnVmZmVyLmxlbmd0aCA+IDAgJiYgYnVmW2ldID09PSBSSUdIVF9DVVJMWV9CUkFDS0VUKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2J1ZmZlclN0YXRlID0gQlVGRkVSX1NUQVRFX1BPU1NJQkxZX0xJVEVSQUxfTEVOR1RIXzJcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9sZW5ndGhCdWZmZXJcbiAgICAgICAgICAgICAgdGhpcy5fYnVmZmVyU3RhdGUgPSBCVUZGRVJfU1RBVEVfREVGQVVMVFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSsrXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBmaW5kIGxpdGVyYWwgbGVuZ3RoXG4gICAgICAgICAgY29uc3QgbGVmdElkeCA9IGJ1Zi5pbmRleE9mKExFRlRfQ1VSTFlfQlJBQ0tFVCwgaSlcbiAgICAgICAgICBpZiAobGVmdElkeCA+IC0xKSB7XG4gICAgICAgICAgICBjb25zdCBsZWZ0T2ZMZWZ0Q3VybHkgPSBuZXcgVWludDhBcnJheShidWYuYnVmZmVyLCBpLCBsZWZ0SWR4IC0gaSlcbiAgICAgICAgICAgIGlmIChsZWZ0T2ZMZWZ0Q3VybHkuaW5kZXhPZihMSU5FX0ZFRUQpID09PSAtMSkge1xuICAgICAgICAgICAgICBpID0gbGVmdElkeCArIDFcbiAgICAgICAgICAgICAgdGhpcy5fbGVuZ3RoQnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMClcbiAgICAgICAgICAgICAgdGhpcy5fYnVmZmVyU3RhdGUgPSBCVUZGRVJfU1RBVEVfUE9TU0lCTFlfTElURVJBTF9MRU5HVEhfMVxuICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGZpbmQgZW5kIG9mIGNvbW1hbmRcbiAgICAgICAgICBjb25zdCBMRmlkeCA9IGJ1Zi5pbmRleE9mKExJTkVfRkVFRCwgaSlcbiAgICAgICAgICBpZiAoTEZpZHggPiAtMSkge1xuICAgICAgICAgICAgaWYgKExGaWR4IDwgYnVmLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgdGhpcy5faW5jb21pbmdCdWZmZXJzW3RoaXMuX2luY29taW5nQnVmZmVycy5sZW5ndGggLSAxXSA9IG5ldyBVaW50OEFycmF5KGJ1Zi5idWZmZXIsIDAsIExGaWR4ICsgMSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNvbW1hbmRMZW5ndGggPSB0aGlzLl9pbmNvbWluZ0J1ZmZlcnMucmVkdWNlKChwcmV2LCBjdXJyKSA9PiBwcmV2ICsgY3Vyci5sZW5ndGgsIDApIC0gMiAvLyAyIGZvciBDUkxGXG4gICAgICAgICAgICBjb25zdCBjb21tYW5kID0gbmV3IFVpbnQ4QXJyYXkoY29tbWFuZExlbmd0aClcbiAgICAgICAgICAgIGxldCBpbmRleCA9IDBcbiAgICAgICAgICAgIHdoaWxlICh0aGlzLl9pbmNvbWluZ0J1ZmZlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBsZXQgdWludDhBcnJheSA9IHRoaXMuX2luY29taW5nQnVmZmVycy5zaGlmdCgpXG5cbiAgICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nTGVuZ3RoID0gY29tbWFuZExlbmd0aCAtIGluZGV4XG4gICAgICAgICAgICAgIGlmICh1aW50OEFycmF5Lmxlbmd0aCA+IHJlbWFpbmluZ0xlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4Y2Vzc0xlbmd0aCA9IHVpbnQ4QXJyYXkubGVuZ3RoIC0gcmVtYWluaW5nTGVuZ3RoXG4gICAgICAgICAgICAgICAgdWludDhBcnJheSA9IHVpbnQ4QXJyYXkuc3ViYXJyYXkoMCwgLWV4Y2Vzc0xlbmd0aClcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pbmNvbWluZ0J1ZmZlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5faW5jb21pbmdCdWZmZXJzID0gW11cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29tbWFuZC5zZXQodWludDhBcnJheSwgaW5kZXgpXG4gICAgICAgICAgICAgIGluZGV4ICs9IHVpbnQ4QXJyYXkubGVuZ3RoXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB5aWVsZCBjb21tYW5kXG4gICAgICAgICAgICBpZiAoTEZpZHggPCBidWYubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICBidWYgPSBuZXcgVWludDhBcnJheShidWYuc3ViYXJyYXkoTEZpZHggKyAxKSlcbiAgICAgICAgICAgICAgdGhpcy5faW5jb21pbmdCdWZmZXJzLnB1c2goYnVmKVxuICAgICAgICAgICAgICBpID0gMFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gY2xlYXIgdGhlIHRpbWVvdXQgd2hlbiBhbiBlbnRpcmUgY29tbWFuZCBoYXMgYXJyaXZlZFxuICAgICAgICAgICAgICAvLyBhbmQgbm90IHdhaXRpbmcgb24gbW9yZSBkYXRhIGZvciBuZXh0IGNvbW1hbmRcbiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3NvY2tldFRpbWVvdXRUaW1lcilcbiAgICAgICAgICAgICAgdGhpcy5fc29ja2V0VGltZW91dFRpbWVyID0gbnVsbFxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFBSSVZBVEUgTUVUSE9EU1xuXG4gIC8qKlxuICAgKiBQcm9jZXNzZXMgYSBjb21tYW5kIGZyb20gdGhlIHF1ZXVlLiBUaGUgY29tbWFuZCBpcyBwYXJzZWQgYW5kIGZlZWRlZCB0byBhIGhhbmRsZXJcbiAgICovXG4gIF9wYXJzZUluY29taW5nQ29tbWFuZHMgKGNvbW1hbmRzKSB7XG4gICAgZm9yICh2YXIgY29tbWFuZCBvZiBjb21tYW5kcykge1xuICAgICAgdGhpcy5fY2xlYXJJZGxlKClcblxuICAgICAgLypcbiAgICAgICAqIFRoZSBcIitcIi10YWdnZWQgcmVzcG9uc2UgaXMgYSBzcGVjaWFsIGNhc2U6XG4gICAgICAgKiBFaXRoZXIgdGhlIHNlcnZlciBjYW4gYXNrcyBmb3IgdGhlIG5leHQgY2h1bmsgb2YgZGF0YSwgZS5nLiBmb3IgdGhlIEFVVEhFTlRJQ0FURSBjb21tYW5kLlxuICAgICAgICpcbiAgICAgICAqIE9yIHRoZXJlIHdhcyBhbiBlcnJvciBpbiB0aGUgWE9BVVRIMiBhdXRoZW50aWNhdGlvbiwgZm9yIHdoaWNoIFNBU0wgaW5pdGlhbCBjbGllbnQgcmVzcG9uc2UgZXh0ZW5zaW9uXG4gICAgICAgKiBkaWN0YXRlcyB0aGUgY2xpZW50IHNlbmRzIGFuIGVtcHR5IEVPTCByZXNwb25zZSB0byB0aGUgY2hhbGxlbmdlIGNvbnRhaW5pbmcgdGhlIGVycm9yIG1lc3NhZ2UuXG4gICAgICAgKlxuICAgICAgICogRGV0YWlscyBvbiBcIitcIi10YWdnZWQgcmVzcG9uc2U6XG4gICAgICAgKiAgIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNTAxI3NlY3Rpb24tMi4yLjFcbiAgICAgICAqL1xuICAgICAgLy9cbiAgICAgIGlmIChjb21tYW5kWzBdID09PSBBU0NJSV9QTFVTKSB7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50Q29tbWFuZC5kYXRhLmxlbmd0aCkge1xuICAgICAgICAgIC8vIGZlZWQgdGhlIG5leHQgY2h1bmsgb2YgZGF0YVxuICAgICAgICAgIHZhciBjaHVuayA9IHRoaXMuX2N1cnJlbnRDb21tYW5kLmRhdGEuc2hpZnQoKVxuICAgICAgICAgIGNodW5rICs9ICghdGhpcy5fY3VycmVudENvbW1hbmQuZGF0YS5sZW5ndGggPyBFT0wgOiAnJykgLy8gRU9MIGlmIHRoZXJlJ3Mgbm90aGluZyBtb3JlIHRvIHNlbmRcbiAgICAgICAgICB0aGlzLnNlbmQoY2h1bmspXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fY3VycmVudENvbW1hbmQuZXJyb3JSZXNwb25zZUV4cGVjdHNFbXB0eUxpbmUpIHtcbiAgICAgICAgICB0aGlzLnNlbmQoRU9MKSAvLyBYT0FVVEgyIGVtcHR5IHJlc3BvbnNlLCBlcnJvciB3aWxsIGJlIHJlcG9ydGVkIHdoZW4gc2VydmVyIGNvbnRpbnVlcyB3aXRoIE5PIHJlc3BvbnNlXG4gICAgICAgIH1cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgdmFyIHJlc3BvbnNlXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB2YWx1ZUFzU3RyaW5nID0gdGhpcy5fY3VycmVudENvbW1hbmQucmVxdWVzdCAmJiB0aGlzLl9jdXJyZW50Q29tbWFuZC5yZXF1ZXN0LnZhbHVlQXNTdHJpbmdcbiAgICAgICAgcmVzcG9uc2UgPSBwYXJzZXIoY29tbWFuZCwgeyB2YWx1ZUFzU3RyaW5nIH0pXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdTOicsICgpID0+IGNvbXBpbGVyKHJlc3BvbnNlLCBmYWxzZSwgdHJ1ZSkpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdFcnJvciBwYXJzaW5nIGltYXAgY29tbWFuZCEnLCByZXNwb25zZSlcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRXJyb3IoZSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5fcHJvY2Vzc1Jlc3BvbnNlKHJlc3BvbnNlKVxuICAgICAgdGhpcy5faGFuZGxlUmVzcG9uc2UocmVzcG9uc2UpXG5cbiAgICAgIC8vIGZpcnN0IHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlciwgY29ubmVjdGlvbiBpcyBub3cgdXNhYmxlXG4gICAgICBpZiAoIXRoaXMuX2Nvbm5lY3Rpb25SZWFkeSkge1xuICAgICAgICB0aGlzLl9jb25uZWN0aW9uUmVhZHkgPSB0cnVlXG4gICAgICAgIHRoaXMub25yZWFkeSAmJiB0aGlzLm9ucmVhZHkoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGZWVkcyBhIHBhcnNlZCByZXNwb25zZSBvYmplY3QgdG8gYW4gYXBwcm9wcmlhdGUgaGFuZGxlclxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcmVzcG9uc2UgUGFyc2VkIGNvbW1hbmQgb2JqZWN0XG4gICAqL1xuICBfaGFuZGxlUmVzcG9uc2UgKHJlc3BvbnNlKSB7XG4gICAgdmFyIGNvbW1hbmQgPSBwcm9wT3IoJycsICdjb21tYW5kJywgcmVzcG9uc2UpLnRvVXBwZXJDYXNlKCkudHJpbSgpXG5cbiAgICBpZiAoIXRoaXMuX2N1cnJlbnRDb21tYW5kKSB7XG4gICAgICAvLyB1bnNvbGljaXRlZCB1bnRhZ2dlZCByZXNwb25zZVxuICAgICAgaWYgKHJlc3BvbnNlLnRhZyA9PT0gJyonICYmIGNvbW1hbmQgaW4gdGhpcy5fZ2xvYmFsQWNjZXB0VW50YWdnZWQpIHtcbiAgICAgICAgdGhpcy5fZ2xvYmFsQWNjZXB0VW50YWdnZWRbY29tbWFuZF0ocmVzcG9uc2UpXG4gICAgICAgIHRoaXMuX2NhblNlbmQgPSB0cnVlXG4gICAgICAgIHRoaXMuX3NlbmRSZXF1ZXN0KClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuX2N1cnJlbnRDb21tYW5kLnBheWxvYWQgJiYgcmVzcG9uc2UudGFnID09PSAnKicgJiYgY29tbWFuZCBpbiB0aGlzLl9jdXJyZW50Q29tbWFuZC5wYXlsb2FkKSB7XG4gICAgICAvLyBleHBlY3RlZCB1bnRhZ2dlZCByZXNwb25zZVxuICAgICAgdGhpcy5fY3VycmVudENvbW1hbmQucGF5bG9hZFtjb21tYW5kXS5wdXNoKHJlc3BvbnNlKVxuICAgIH0gZWxzZSBpZiAocmVzcG9uc2UudGFnID09PSAnKicgJiYgY29tbWFuZCBpbiB0aGlzLl9nbG9iYWxBY2NlcHRVbnRhZ2dlZCkge1xuICAgICAgLy8gdW5leHBlY3RlZCB1bnRhZ2dlZCByZXNwb25zZVxuICAgICAgdGhpcy5fZ2xvYmFsQWNjZXB0VW50YWdnZWRbY29tbWFuZF0ocmVzcG9uc2UpXG4gICAgfSBlbHNlIGlmIChyZXNwb25zZS50YWcgPT09IHRoaXMuX2N1cnJlbnRDb21tYW5kLnRhZykge1xuICAgICAgLy8gdGFnZ2VkIHJlc3BvbnNlXG4gICAgICBpZiAodGhpcy5fY3VycmVudENvbW1hbmQucGF5bG9hZCAmJiBPYmplY3Qua2V5cyh0aGlzLl9jdXJyZW50Q29tbWFuZC5wYXlsb2FkKS5sZW5ndGgpIHtcbiAgICAgICAgcmVzcG9uc2UucGF5bG9hZCA9IHRoaXMuX2N1cnJlbnRDb21tYW5kLnBheWxvYWRcbiAgICAgIH1cbiAgICAgIHRoaXMuX2N1cnJlbnRDb21tYW5kLmNhbGxiYWNrKHJlc3BvbnNlKVxuICAgICAgdGhpcy5fY2FuU2VuZCA9IHRydWVcbiAgICAgIHRoaXMuX3NlbmRSZXF1ZXN0KClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBjb21tYW5kIGZyb20gY2xpZW50IHF1ZXVlIHRvIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICBfc2VuZFJlcXVlc3QgKCkge1xuICAgIGlmICghdGhpcy5fY2xpZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZW50ZXJJZGxlKClcbiAgICB9XG4gICAgdGhpcy5fY2xlYXJJZGxlKClcblxuICAgIC8vIGFuIG9wZXJhdGlvbiB3YXMgbWFkZSBpbiB0aGUgcHJlY2hlY2ssIG5vIG5lZWQgdG8gcmVzdGFydCB0aGUgcXVldWUgbWFudWFsbHlcbiAgICB0aGlzLl9yZXN0YXJ0UXVldWUgPSBmYWxzZVxuXG4gICAgdmFyIGNvbW1hbmQgPSB0aGlzLl9jbGllbnRRdWV1ZVswXVxuICAgIGlmICh0eXBlb2YgY29tbWFuZC5wcmVjaGVjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gcmVtZW1iZXIgdGhlIGNvbnRleHRcbiAgICAgIHZhciBjb250ZXh0ID0gY29tbWFuZFxuICAgICAgdmFyIHByZWNoZWNrID0gY29udGV4dC5wcmVjaGVja1xuICAgICAgZGVsZXRlIGNvbnRleHQucHJlY2hlY2tcblxuICAgICAgLy8gd2UgbmVlZCB0byByZXN0YXJ0IHRoZSBxdWV1ZSBoYW5kbGluZyBpZiBubyBvcGVyYXRpb24gd2FzIG1hZGUgaW4gdGhlIHByZWNoZWNrXG4gICAgICB0aGlzLl9yZXN0YXJ0UXVldWUgPSB0cnVlXG5cbiAgICAgIC8vIGludm9rZSB0aGUgcHJlY2hlY2sgY29tbWFuZCBhbmQgcmVzdW1lIG5vcm1hbCBvcGVyYXRpb24gYWZ0ZXIgdGhlIHByb21pc2UgcmVzb2x2ZXNcbiAgICAgIHByZWNoZWNrKGNvbnRleHQpLnRoZW4oKCkgPT4ge1xuICAgICAgICAvLyB3ZSdyZSBkb25lIHdpdGggdGhlIHByZWNoZWNrXG4gICAgICAgIGlmICh0aGlzLl9yZXN0YXJ0UXVldWUpIHtcbiAgICAgICAgICAvLyB3ZSBuZWVkIHRvIHJlc3RhcnQgdGhlIHF1ZXVlIGhhbmRsaW5nXG4gICAgICAgICAgdGhpcy5fc2VuZFJlcXVlc3QoKVxuICAgICAgICB9XG4gICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIC8vIHByZWNoZWNrIGZhaWxlZCwgc28gd2UgcmVtb3ZlIHRoZSBpbml0aWFsIGNvbW1hbmRcbiAgICAgICAgLy8gZnJvbSB0aGUgcXVldWUsIGludm9rZSBpdHMgY2FsbGJhY2sgYW5kIHJlc3VtZSBub3JtYWwgb3BlcmF0aW9uXG4gICAgICAgIGxldCBjbWRcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9jbGllbnRRdWV1ZS5pbmRleE9mKGNvbnRleHQpXG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgY21kID0gdGhpcy5fY2xpZW50UXVldWUuc3BsaWNlKGluZGV4LCAxKVswXVxuICAgICAgICB9XG4gICAgICAgIGlmIChjbWQgJiYgY21kLmNhbGxiYWNrKSB7XG4gICAgICAgICAgY21kLmNhbGxiYWNrKGVycilcbiAgICAgICAgICB0aGlzLl9jYW5TZW5kID0gdHJ1ZVxuICAgICAgICAgIHRoaXMuX3BhcnNlSW5jb21pbmdDb21tYW5kcyh0aGlzLl9pdGVyYXRlSW5jb21pbmdCdWZmZXIoKSkgLy8gQ29uc3VtZSB0aGUgcmVzdCBvZiB0aGUgaW5jb21pbmcgYnVmZmVyXG4gICAgICAgICAgdGhpcy5fc2VuZFJlcXVlc3QoKSAvLyBjb250aW51ZSBzZW5kaW5nXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9jYW5TZW5kID0gZmFsc2VcbiAgICB0aGlzLl9jdXJyZW50Q29tbWFuZCA9IHRoaXMuX2NsaWVudFF1ZXVlLnNoaWZ0KClcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLl9jdXJyZW50Q29tbWFuZC5kYXRhID0gY29tcGlsZXIodGhpcy5fY3VycmVudENvbW1hbmQucmVxdWVzdCwgdHJ1ZSlcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdDOicsICgpID0+IGNvbXBpbGVyKHRoaXMuX2N1cnJlbnRDb21tYW5kLnJlcXVlc3QsIGZhbHNlLCB0cnVlKSkgLy8gZXhjbHVkZXMgcGFzc3dvcmRzIGV0Yy5cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignRXJyb3IgY29tcGlsaW5nIGltYXAgY29tbWFuZCEnLCB0aGlzLl9jdXJyZW50Q29tbWFuZC5yZXF1ZXN0KVxuICAgICAgcmV0dXJuIHRoaXMuX29uRXJyb3IobmV3IEVycm9yKCdFcnJvciBjb21waWxpbmcgaW1hcCBjb21tYW5kIScpKVxuICAgIH1cblxuICAgIHZhciBkYXRhID0gdGhpcy5fY3VycmVudENvbW1hbmQuZGF0YS5zaGlmdCgpXG5cbiAgICB0aGlzLnNlbmQoZGF0YSArICghdGhpcy5fY3VycmVudENvbW1hbmQuZGF0YS5sZW5ndGggPyBFT0wgOiAnJykpXG4gICAgcmV0dXJuIHRoaXMud2FpdERyYWluXG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgb25pZGxlLCBub3RpbmcgdG8gZG8gY3VycmVudGx5XG4gICAqL1xuICBfZW50ZXJJZGxlICgpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5faWRsZVRpbWVyKVxuICAgIHRoaXMuX2lkbGVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gKHRoaXMub25pZGxlICYmIHRoaXMub25pZGxlKCkpLCB0aGlzLnRpbWVvdXRFbnRlcklkbGUpXG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VsIGlkbGUgdGltZXJcbiAgICovXG4gIF9jbGVhcklkbGUgKCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl9pZGxlVGltZXIpXG4gICAgdGhpcy5faWRsZVRpbWVyID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCBwcm9jZXNzZXMgYSByZXNwb25zZSBpbnRvIGFuIGVhc2llciB0byBoYW5kbGUgZm9ybWF0LlxuICAgKiBBZGQgdW50YWdnZWQgbnVtYmVyZWQgcmVzcG9uc2VzIChlLmcuIEZFVENIKSBpbnRvIGEgbmljZWx5IGZlYXNpYmxlIGZvcm1cbiAgICogQ2hlY2tzIGlmIGEgcmVzcG9uc2UgaW5jbHVkZXMgb3B0aW9uYWwgcmVzcG9uc2UgY29kZXNcbiAgICogYW5kIGNvcGllcyB0aGVzZSBpbnRvIHNlcGFyYXRlIHByb3BlcnRpZXMuIEZvciBleGFtcGxlIHRoZVxuICAgKiBmb2xsb3dpbmcgcmVzcG9uc2UgaW5jbHVkZXMgYSBjYXBhYmlsaXR5IGxpc3RpbmcgYW5kIGEgaHVtYW5cbiAgICogcmVhZGFibGUgbWVzc2FnZTpcbiAgICpcbiAgICogICAgICogT0sgW0NBUEFCSUxJVFkgSUQgTkFNRVNQQUNFXSBBbGwgcmVhZHlcbiAgICpcbiAgICogVGhpcyBtZXRob2QgYWRkcyBhICdjYXBhYmlsaXR5JyBwcm9wZXJ0eSB3aXRoIGFuIGFycmF5IHZhbHVlIFsnSUQnLCAnTkFNRVNQQUNFJ11cbiAgICogdG8gdGhlIHJlc3BvbnNlIG9iamVjdC4gQWRkaXRpb25hbGx5ICdBbGwgcmVhZHknIGlzIGFkZGVkIGFzICdodW1hblJlYWRhYmxlJyBwcm9wZXJ0eS5cbiAgICpcbiAgICogU2VlIHBvc3NpYmxlbSBJTUFQIFJlc3BvbnNlIENvZGVzIGF0IGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1NTMwXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSByZXNwb25zZSBQYXJzZWQgcmVzcG9uc2Ugb2JqZWN0XG4gICAqL1xuICBfcHJvY2Vzc1Jlc3BvbnNlIChyZXNwb25zZSkge1xuICAgIGNvbnN0IGNvbW1hbmQgPSBwcm9wT3IoJycsICdjb21tYW5kJywgcmVzcG9uc2UpLnRvVXBwZXJDYXNlKCkudHJpbSgpXG5cbiAgICAvLyBubyBhdHRyaWJ1dGVzXG4gICAgaWYgKCFyZXNwb25zZSB8fCAhcmVzcG9uc2UuYXR0cmlidXRlcyB8fCAhcmVzcG9uc2UuYXR0cmlidXRlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIHVudGFnZ2VkIHJlc3BvbnNlcyB3LyBzZXF1ZW5jZSBudW1iZXJzXG4gICAgaWYgKHJlc3BvbnNlLnRhZyA9PT0gJyonICYmIC9eXFxkKyQvLnRlc3QocmVzcG9uc2UuY29tbWFuZCkgJiYgcmVzcG9uc2UuYXR0cmlidXRlc1swXS50eXBlID09PSAnQVRPTScpIHtcbiAgICAgIHJlc3BvbnNlLm5yID0gTnVtYmVyKHJlc3BvbnNlLmNvbW1hbmQpXG4gICAgICByZXNwb25zZS5jb21tYW5kID0gKHJlc3BvbnNlLmF0dHJpYnV0ZXMuc2hpZnQoKS52YWx1ZSB8fCAnJykudG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpLnRyaW0oKVxuICAgIH1cblxuICAgIC8vIG5vIG9wdGlvbmFsIHJlc3BvbnNlIGNvZGVcbiAgICBpZiAoWydPSycsICdOTycsICdCQUQnLCAnQllFJywgJ1BSRUFVVEgnXS5pbmRleE9mKGNvbW1hbmQpIDwgMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gSWYgbGFzdCBlbGVtZW50IG9mIHRoZSByZXNwb25zZSBpcyBURVhUIHRoZW4gdGhpcyBpcyBmb3IgaHVtYW5zXG4gICAgaWYgKHJlc3BvbnNlLmF0dHJpYnV0ZXNbcmVzcG9uc2UuYXR0cmlidXRlcy5sZW5ndGggLSAxXS50eXBlID09PSAnVEVYVCcpIHtcbiAgICAgIHJlc3BvbnNlLmh1bWFuUmVhZGFibGUgPSByZXNwb25zZS5hdHRyaWJ1dGVzW3Jlc3BvbnNlLmF0dHJpYnV0ZXMubGVuZ3RoIC0gMV0udmFsdWVcbiAgICB9XG5cbiAgICAvLyBQYXJzZSBhbmQgZm9ybWF0IEFUT00gdmFsdWVzXG4gICAgaWYgKHJlc3BvbnNlLmF0dHJpYnV0ZXNbMF0udHlwZSA9PT0gJ0FUT00nICYmIHJlc3BvbnNlLmF0dHJpYnV0ZXNbMF0uc2VjdGlvbikge1xuICAgICAgY29uc3Qgb3B0aW9uID0gcmVzcG9uc2UuYXR0cmlidXRlc1swXS5zZWN0aW9uLm1hcCgoa2V5KSA9PiB7XG4gICAgICAgIGlmICgha2V5KSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoa2V5KSkge1xuICAgICAgICAgIHJldHVybiBrZXkubWFwKChrZXkpID0+IChrZXkudmFsdWUgfHwgJycpLnRvU3RyaW5nKCkudHJpbSgpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiAoa2V5LnZhbHVlIHx8ICcnKS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkudHJpbSgpXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IGtleSA9IG9wdGlvbi5zaGlmdCgpXG4gICAgICByZXNwb25zZS5jb2RlID0ga2V5XG5cbiAgICAgIGlmIChvcHRpb24ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJlc3BvbnNlW2tleS50b0xvd2VyQ2FzZSgpXSA9IG9wdGlvblswXVxuICAgICAgfSBlbHNlIGlmIChvcHRpb24ubGVuZ3RoID4gMSkge1xuICAgICAgICByZXNwb25zZVtrZXkudG9Mb3dlckNhc2UoKV0gPSBvcHRpb25cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgdmFsdWUgaXMgYW4gRXJyb3Igb2JqZWN0XG4gICAqXG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlIFZhbHVlIHRvIGJlIGNoZWNrZWRcbiAgICogQHJldHVybiB7Qm9vbGVhbn0gcmV0dXJucyB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBhbiBFcnJvclxuICAgKi9cbiAgaXNFcnJvciAodmFsdWUpIHtcbiAgICByZXR1cm4gISFPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLm1hdGNoKC9FcnJvclxcXSQvKVxuICB9XG5cbiAgLy8gQ09NUFJFU1NJT04gUkVMQVRFRCBNRVRIT0RTXG5cbiAgLyoqXG4gICAqIFNldHMgdXAgZGVmbGF0ZS9pbmZsYXRlIGZvciB0aGUgSU9cbiAgICovXG4gIGVuYWJsZUNvbXByZXNzaW9uICgpIHtcbiAgICB0aGlzLl9zb2NrZXRPbkRhdGEgPSB0aGlzLnNvY2tldC5vbmRhdGFcbiAgICB0aGlzLmNvbXByZXNzZWQgPSB0cnVlXG5cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lldvcmtlcikge1xuICAgICAgdGhpcy5fY29tcHJlc3Npb25Xb3JrZXIgPSBuZXcgV29ya2VyKFVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW0NvbXByZXNzaW9uQmxvYl0pKSlcbiAgICAgIHRoaXMuX2NvbXByZXNzaW9uV29ya2VyLm9ubWVzc2FnZSA9IChlKSA9PiB7XG4gICAgICAgIHZhciBtZXNzYWdlID0gZS5kYXRhLm1lc3NhZ2VcbiAgICAgICAgdmFyIGRhdGEgPSBlLmRhdGEuYnVmZmVyXG5cbiAgICAgICAgc3dpdGNoIChtZXNzYWdlKSB7XG4gICAgICAgICAgY2FzZSBNRVNTQUdFX0lORkxBVEVEX0RBVEFfUkVBRFk6XG4gICAgICAgICAgICB0aGlzLl9zb2NrZXRPbkRhdGEoeyBkYXRhIH0pXG4gICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgY2FzZSBNRVNTQUdFX0RFRkxBVEVEX0RBVEFfUkVBRFk6XG4gICAgICAgICAgICB0aGlzLndhaXREcmFpbiA9IHRoaXMuc29ja2V0LnNlbmQoZGF0YSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5fY29tcHJlc3Npb25Xb3JrZXIub25lcnJvciA9IChlKSA9PiB7XG4gICAgICAgIHRoaXMuX29uRXJyb3IobmV3IEVycm9yKCdFcnJvciBoYW5kbGluZyBjb21wcmVzc2lvbiB3ZWIgd29ya2VyOiAnICsgZS5tZXNzYWdlKSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5fY29tcHJlc3Npb25Xb3JrZXIucG9zdE1lc3NhZ2UoY3JlYXRlTWVzc2FnZShNRVNTQUdFX0lOSVRJQUxJWkVfV09SS0VSKSlcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaW5mbGF0ZWRSZWFkeSA9IChidWZmZXIpID0+IHsgdGhpcy5fc29ja2V0T25EYXRhKHsgZGF0YTogYnVmZmVyIH0pIH1cbiAgICAgIGNvbnN0IGRlZmxhdGVkUmVhZHkgPSAoYnVmZmVyKSA9PiB7IHRoaXMud2FpdERyYWluID0gdGhpcy5zb2NrZXQuc2VuZChidWZmZXIpIH1cbiAgICAgIHRoaXMuX2NvbXByZXNzaW9uID0gbmV3IENvbXByZXNzaW9uKGluZmxhdGVkUmVhZHksIGRlZmxhdGVkUmVhZHkpXG4gICAgfVxuXG4gICAgLy8gb3ZlcnJpZGUgZGF0YSBoYW5kbGVyLCBkZWNvbXByZXNzIGluY29taW5nIGRhdGFcbiAgICB0aGlzLnNvY2tldC5vbmRhdGEgPSAoZXZ0KSA9PiB7XG4gICAgICBpZiAoIXRoaXMuY29tcHJlc3NlZCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2NvbXByZXNzaW9uV29ya2VyKSB7XG4gICAgICAgIHRoaXMuX2NvbXByZXNzaW9uV29ya2VyLnBvc3RNZXNzYWdlKGNyZWF0ZU1lc3NhZ2UoTUVTU0FHRV9JTkZMQVRFLCBldnQuZGF0YSksIFtldnQuZGF0YV0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9jb21wcmVzc2lvbi5pbmZsYXRlKGV2dC5kYXRhKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbmRvZXMgYW55IGNoYW5nZXMgcmVsYXRlZCB0byBjb21wcmVzc2lvbi4gVGhpcyBvbmx5IGJlIGNhbGxlZCB3aGVuIGNsb3NpbmcgdGhlIGNvbm5lY3Rpb25cbiAgICovXG4gIF9kaXNhYmxlQ29tcHJlc3Npb24gKCkge1xuICAgIGlmICghdGhpcy5jb21wcmVzc2VkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmNvbXByZXNzZWQgPSBmYWxzZVxuICAgIHRoaXMuc29ja2V0Lm9uZGF0YSA9IHRoaXMuX3NvY2tldE9uRGF0YVxuICAgIHRoaXMuX3NvY2tldE9uRGF0YSA9IG51bGxcblxuICAgIGlmICh0aGlzLl9jb21wcmVzc2lvbldvcmtlcikge1xuICAgICAgLy8gdGVybWluYXRlIHRoZSB3b3JrZXJcbiAgICAgIHRoaXMuX2NvbXByZXNzaW9uV29ya2VyLnRlcm1pbmF0ZSgpXG4gICAgICB0aGlzLl9jb21wcmVzc2lvbldvcmtlciA9IG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT3V0Z29pbmcgcGF5bG9hZCBuZWVkcyB0byBiZSBjb21wcmVzc2VkIGFuZCBzZW50IHRvIHNvY2tldFxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5QnVmZmVyfSBidWZmZXIgT3V0Z29pbmcgdW5jb21wcmVzc2VkIGFycmF5YnVmZmVyXG4gICAqL1xuICBfc2VuZENvbXByZXNzZWQgKGJ1ZmZlcikge1xuICAgIC8vIGRlZmxhdGVcbiAgICBpZiAodGhpcy5fY29tcHJlc3Npb25Xb3JrZXIpIHtcbiAgICAgIHRoaXMuX2NvbXByZXNzaW9uV29ya2VyLnBvc3RNZXNzYWdlKGNyZWF0ZU1lc3NhZ2UoTUVTU0FHRV9ERUZMQVRFLCBidWZmZXIpLCBbYnVmZmVyXSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY29tcHJlc3Npb24uZGVmbGF0ZShidWZmZXIpXG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGNyZWF0ZU1lc3NhZ2UgPSAobWVzc2FnZSwgYnVmZmVyKSA9PiAoeyBtZXNzYWdlLCBidWZmZXIgfSlcbiJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbWFwLmpzIl0sIm5hbWVzIjpbIk1FU1NBR0VfSU5JVElBTElaRV9XT1JLRVIiLCJNRVNTQUdFX0lORkxBVEUiLCJNRVNTQUdFX0lORkxBVEVEX0RBVEFfUkVBRFkiLCJNRVNTQUdFX0RFRkxBVEUiLCJNRVNTQUdFX0RFRkxBVEVEX0RBVEFfUkVBRFkiLCJFT0wiLCJMSU5FX0ZFRUQiLCJDQVJSSUFHRV9SRVRVUk4iLCJMRUZUX0NVUkxZX0JSQUNLRVQiLCJSSUdIVF9DVVJMWV9CUkFDS0VUIiwiQVNDSUlfUExVUyIsIkJVRkZFUl9TVEFURV9MSVRFUkFMIiwiQlVGRkVSX1NUQVRFX1BPU1NJQkxZX0xJVEVSQUxfTEVOR1RIXzEiLCJCVUZGRVJfU1RBVEVfUE9TU0lCTFlfTElURVJBTF9MRU5HVEhfMiIsIkJVRkZFUl9TVEFURV9ERUZBVUxUIiwiVElNRU9VVF9FTlRFUl9JRExFIiwiVElNRU9VVF9TT0NLRVRfTE9XRVJfQk9VTkQiLCJUSU1FT1VUX1NPQ0tFVF9NVUxUSVBMSUVSIiwiSW1hcCIsImNvbnN0cnVjdG9yIiwiaG9zdCIsInBvcnQiLCJvcHRpb25zIiwidGltZW91dEVudGVySWRsZSIsInRpbWVvdXRTb2NrZXRMb3dlckJvdW5kIiwidGltZW91dFNvY2tldE11bHRpcGxpZXIiLCJ1c2VTZWN1cmVUcmFuc3BvcnQiLCJzZWN1cmVNb2RlIiwiX2Nvbm5lY3Rpb25SZWFkeSIsIl9nbG9iYWxBY2NlcHRVbnRhZ2dlZCIsIl9jbGllbnRRdWV1ZSIsIl9jYW5TZW5kIiwiX3RhZ0NvdW50ZXIiLCJfY3VycmVudENvbW1hbmQiLCJfaWRsZVRpbWVyIiwiX3NvY2tldFRpbWVvdXRUaW1lciIsImNvbXByZXNzZWQiLCJfaW5jb21pbmdCdWZmZXJzIiwiX2J1ZmZlclN0YXRlIiwiX2xpdGVyYWxSZW1haW5pbmciLCJvbmNlcnQiLCJvbmVycm9yIiwib25yZWFkeSIsIm9uaWRsZSIsImNvbm5lY3QiLCJTb2NrZXQiLCJUQ1BTb2NrZXQiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInNvY2tldCIsIm9wZW4iLCJiaW5hcnlUeXBlIiwiY2EiLCJjZXJ0IiwiRSIsIm9uY2xvc2UiLCJfb25FcnJvciIsIkVycm9yIiwib25kYXRhIiwiZXZ0IiwiX29uRGF0YSIsImVyciIsImUiLCJkYXRhIiwibWVzc2FnZSIsIm9ub3BlbiIsImNsb3NlIiwiZXJyb3IiLCJ0ZWFyRG93biIsImZvckVhY2giLCJjbWQiLCJjYWxsYmFjayIsImNsZWFyVGltZW91dCIsIl9kaXNhYmxlQ29tcHJlc3Npb24iLCJyZWFkeVN0YXRlIiwibG9nb3V0IiwidGhlbiIsImNhdGNoIiwiZW5xdWV1ZUNvbW1hbmQiLCJ1cGdyYWRlIiwidXBncmFkZVRvU2VjdXJlIiwicmVxdWVzdCIsImFjY2VwdFVudGFnZ2VkIiwiY29tbWFuZCIsImNvbmNhdCIsIm1hcCIsInVudGFnZ2VkIiwidG9TdHJpbmciLCJ0b1VwcGVyQ2FzZSIsInRyaW0iLCJ0YWciLCJwYXlsb2FkIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwicmVzcG9uc2UiLCJpc0Vycm9yIiwiaW5kZXhPZiIsImh1bWFuUmVhZGFibGUiLCJjb2RlIiwiT2JqZWN0Iiwia2V5cyIsImtleSIsImluZGV4IiwiY3R4Iiwic3BsaWNlIiwicHVzaCIsIl9zZW5kUmVxdWVzdCIsImdldFByZXZpb3VzbHlRdWV1ZWQiLCJjb21tYW5kcyIsInN0YXJ0SW5kZXgiLCJpIiwiaXNNYXRjaCIsInNlbmQiLCJzdHIiLCJidWZmZXIiLCJ0aW1lb3V0IiwiTWF0aCIsImZsb29yIiwiYnl0ZUxlbmd0aCIsInNldFRpbWVvdXQiLCJfc2VuZENvbXByZXNzZWQiLCJzZXRIYW5kbGVyIiwibG9nZ2VyIiwiVWludDhBcnJheSIsIl9wYXJzZUluY29taW5nQ29tbWFuZHMiLCJfaXRlcmF0ZUluY29taW5nQnVmZmVyIiwiYnVmIiwiZGlmZiIsIm1pbiIsIk51bWJlciIsIl9sZW5ndGhCdWZmZXIiLCJzdGFydCIsImxhdGVzdCIsInN1YmFycmF5IiwicHJldkJ1ZiIsInNldCIsImxlZnRJZHgiLCJsZWZ0T2ZMZWZ0Q3VybHkiLCJMRmlkeCIsImNvbW1hbmRMZW5ndGgiLCJyZWR1Y2UiLCJwcmV2IiwiY3VyciIsInVpbnQ4QXJyYXkiLCJzaGlmdCIsInJlbWFpbmluZ0xlbmd0aCIsImV4Y2Vzc0xlbmd0aCIsIl9jbGVhcklkbGUiLCJjaHVuayIsImVycm9yUmVzcG9uc2VFeHBlY3RzRW1wdHlMaW5lIiwidmFsdWVBc1N0cmluZyIsImRlYnVnIiwiX3Byb2Nlc3NSZXNwb25zZSIsIl9oYW5kbGVSZXNwb25zZSIsIl9lbnRlcklkbGUiLCJfcmVzdGFydFF1ZXVlIiwicHJlY2hlY2siLCJjb250ZXh0Iiwid2FpdERyYWluIiwiYXR0cmlidXRlcyIsInRlc3QiLCJ0eXBlIiwibnIiLCJ2YWx1ZSIsInNlY3Rpb24iLCJvcHRpb24iLCJBcnJheSIsImlzQXJyYXkiLCJ0b0xvd2VyQ2FzZSIsInByb3RvdHlwZSIsImNhbGwiLCJtYXRjaCIsImVuYWJsZUNvbXByZXNzaW9uIiwiX3NvY2tldE9uRGF0YSIsIndpbmRvdyIsIldvcmtlciIsIl9jb21wcmVzc2lvbldvcmtlciIsIlVSTCIsImNyZWF0ZU9iamVjdFVSTCIsIkJsb2IiLCJDb21wcmVzc2lvbkJsb2IiLCJvbm1lc3NhZ2UiLCJwb3N0TWVzc2FnZSIsImNyZWF0ZU1lc3NhZ2UiLCJpbmZsYXRlZFJlYWR5IiwiZGVmbGF0ZWRSZWFkeSIsIl9jb21wcmVzc2lvbiIsIkNvbXByZXNzaW9uIiwiaW5mbGF0ZSIsInRlcm1pbmF0ZSIsImRlZmxhdGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7cTF2Q0FHQTtBQUNBO0FBQ0E7O0FBQ0EsTUFBTUEseUJBQXlCLEdBQUcsT0FBbEM7QUFDQSxNQUFNQyxlQUFlLEdBQUcsU0FBeEI7QUFDQSxNQUFNQywyQkFBMkIsR0FBRyxnQkFBcEM7QUFDQSxNQUFNQyxlQUFlLEdBQUcsU0FBeEI7QUFDQSxNQUFNQywyQkFBMkIsR0FBRyxn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O0FBQVdrRCxFQUFBQTtBQUFYLENBQXRCLENBQXRCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcHJvcE9yIH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgVENQU29ja2V0IGZyb20gJ2VtYWlsanMtdGNwLXNvY2tldCdcbmltcG9ydCB7IHRvVHlwZWRBcnJheSwgZnJvbVR5cGVkQXJyYXkgfSBmcm9tICcuL2NvbW1vbidcbmltcG9ydCB7IHBhcnNlciwgY29tcGlsZXIgfSBmcm9tICdlbWFpbGpzLWltYXAtaGFuZGxlcidcbmltcG9ydCBDb21wcmVzc2lvbiBmcm9tICcuL2NvbXByZXNzaW9uJ1xuaW1wb3J0IENvbXByZXNzaW9uQmxvYiBmcm9tICcuLi9yZXMvY29tcHJlc3Npb24ud29ya2VyLmJsb2InXG5cbi8vXG4vLyBjb25zdGFudHMgdXNlZCBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB3b3JrZXJcbi8vXG5jb25zdCBNRVNTQUdFX0lOSVRJQUxJWkVfV09SS0VSID0gJ3N0YXJ0J1xuY29uc3QgTUVTU0FHRV9JTkZMQVRFID0gJ2luZmxhdGUnXG5jb25zdCBNRVNTQUdFX0lORkxBVEVEX0RBVEFfUkVBRFkgPSAnaW5mbGF0ZWRfcmVhZHknXG5jb25zdCBNRVNTQUdFX0RFRkxBVEUgPSAnZGVmbGF0ZSdcbmNvbnN0IE1FU1NBR0VfREVGTEFURURfREFUQV9SRUFEWSA9ICdkZWZsYXRlZF9yZWFkeSdcblxuY29uc3QgRU9MID0gJ1xcclxcbidcbmNvbnN0IExJTkVfRkVFRCA9IDEwXG5jb25zdCBDQVJSSUFHRV9SRVRVUk4gPSAxM1xuY29uc3QgTEVGVF9DVVJMWV9CUkFDS0VUID0gMTIzXG5jb25zdCBSSUdIVF9DVVJMWV9CUkFDS0VUID0gMTI1XG5cbmNvbnN0IEFTQ0lJX1BMVVMgPSA0M1xuXG4vLyBTdGF0ZSB0cmFja2luZyB3aGVuIGNvbnN0cnVjdGluZyBhbiBJTUFQIGNvbW1hbmQgZnJvbSBidWZmZXJzLlxuY29uc3QgQlVGRkVSX1NUQVRFX0xJVEVSQUwgPSAnbGl0ZXJhbCdcbmNvbnN0IEJVRkZFUl9TVEFURV9QT1NTSUJMWV9MSVRFUkFMX0xFTkdUSF8xID0gJ2xpdGVyYWxfbGVuZ3RoXzEnXG5jb25zdCBCVUZGRVJfU1RBVEVfUE9TU0lCTFlfTElURVJBTF9MRU5HVEhfMiA9ICdsaXRlcmFsX2xlbmd0aF8yJ1xuY29uc3QgQlVGRkVSX1NUQVRFX0RFRkFVTFQgPSAnZGVmYXVsdCdcblxuLyoqXG4gKiBIb3cgbXVjaCB0aW1lIHRvIHdhaXQgc2luY2UgdGhlIGxhc3QgcmVzcG9uc2UgdW50aWwgdGhlIGNvbm5lY3Rpb24gaXMgY29uc2lkZXJlZCBpZGxpbmdcbiAqL1xuY29uc3QgVElNRU9VVF9FTlRFUl9JRExFID0gMTAwMFxuXG4vKipcbiAqIExvd2VyIEJvdW5kIGZvciBzb2NrZXQgdGltZW91dCB0byB3YWl0IHNpbmNlIHRoZSBsYXN0IGRhdGEgd2FzIHdyaXR0ZW4gdG8gYSBzb2NrZXRcbiAqL1xuY29uc3QgVElNRU9VVF9TT0NLRVRfTE9XRVJfQk9VTkQgPSA2MDAwMFxuXG4vKipcbiAqIE11bHRpcGxpZXIgZm9yIHNvY2tldCB0aW1lb3V0OlxuICpcbiAqIFdlIGFzc3VtZSBhdCBsZWFzdCBhIEdQUlMgY29ubmVjdGlvbiB3aXRoIDExNSBrYi9zID0gMTQsMzc1IGtCL3MgdG9wcywgc28gMTAgS0IvcyB0byBiZSBvblxuICogdGhlIHNhZmUgc2lkZS4gV2UgY2FuIHRpbWVvdXQgYWZ0ZXIgYSBsb3dlciBib3VuZCBvZiAxMHMgKyAobiBLQiAvIDEwIEtCL3MpLiBBIDEgTUIgbWVzc2FnZVxuICogdXBsb2FkIHdvdWxkIGJlIDExMCBzZWNvbmRzIHRvIHdhaXQgZm9yIHRoZSB0aW1lb3V0LiAxMCBLQi9zID09PSAwLjEgcy9CXG4gKi9cbmNvbnN0IFRJTUVPVVRfU09DS0VUX01VTFRJUExJRVIgPSAwLjFcblxuLyoqXG4gKiBDcmVhdGVzIGEgY29ubmVjdGlvbiBvYmplY3QgdG8gYW4gSU1BUCBzZXJ2ZXIuIENhbGwgYGNvbm5lY3RgIG1ldGhvZCB0byBpbml0aXRhdGVcbiAqIHRoZSBhY3R1YWwgY29ubmVjdGlvbiwgdGhlIGNvbnN0cnVjdG9yIG9ubHkgZGVmaW5lcyB0aGUgcHJvcGVydGllcyBidXQgZG9lcyBub3QgYWN0dWFsbHkgY29ubmVjdC5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gW2hvc3Q9J2xvY2FsaG9zdCddIEhvc3RuYW1lIHRvIGNvbmVuY3QgdG9cbiAqIEBwYXJhbSB7TnVtYmVyfSBbcG9ydD0xNDNdIFBvcnQgbnVtYmVyIHRvIGNvbm5lY3QgdG9cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gT3B0aW9uYWwgb3B0aW9ucyBvYmplY3RcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMudXNlU2VjdXJlVHJhbnNwb3J0XSBTZXQgdG8gdHJ1ZSwgdG8gdXNlIGVuY3J5cHRlZCBjb25uZWN0aW9uXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuY29tcHJlc3Npb25Xb3JrZXJQYXRoXSBvZmZsb2FkcyBkZS0vY29tcHJlc3Npb24gY29tcHV0YXRpb24gdG8gYSB3ZWIgd29ya2VyLCB0aGlzIGlzIHRoZSBwYXRoIHRvIHRoZSBicm93c2VyaWZpZWQgZW1haWxqcy1jb21wcmVzc29yLXdvcmtlci5qc1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbWFwIHtcbiAgY29uc3RydWN0b3IgKGhvc3QsIHBvcnQsIG9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMudGltZW91dEVudGVySWRsZSA9IFRJTUVPVVRfRU5URVJfSURMRVxuICAgIHRoaXMudGltZW91dFNvY2tldExvd2VyQm91bmQgPSBUSU1FT1VUX1NPQ0tFVF9MT1dFUl9CT1VORFxuICAgIHRoaXMudGltZW91dFNvY2tldE11bHRpcGxpZXIgPSBUSU1FT1VUX1NPQ0tFVF9NVUxUSVBMSUVSXG5cbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXG5cbiAgICB0aGlzLnBvcnQgPSBwb3J0IHx8ICh0aGlzLm9wdGlvbnMudXNlU2VjdXJlVHJhbnNwb3J0ID8gOTkzIDogMTQzKVxuICAgIHRoaXMuaG9zdCA9IGhvc3QgfHwgJ2xvY2FsaG9zdCdcblxuICAgIC8vIFVzZSBhIFRMUyBjb25uZWN0aW9uLiBQb3J0IDk5MyBhbHNvIGZvcmNlcyBUTFMuXG4gICAgdGhpcy5vcHRpb25zLnVzZVNlY3VyZVRyYW5zcG9ydCA9ICd1c2VTZWN1cmVUcmFuc3BvcnQnIGluIHRoaXMub3B0aW9ucyA/ICEhdGhpcy5vcHRpb25zLnVzZVNlY3VyZVRyYW5zcG9ydCA6IHRoaXMucG9ydCA9PT0gOTkzXG5cbiAgICB0aGlzLnNlY3VyZU1vZGUgPSAhIXRoaXMub3B0aW9ucy51c2VTZWN1cmVUcmFuc3BvcnQgLy8gRG9lcyB0aGUgY29ubmVjdGlvbiB1c2UgU1NML1RMU1xuXG4gICAgdGhpcy5fY29ubmVjdGlvblJlYWR5ID0gZmFsc2UgLy8gSXMgdGhlIGNvbmVjdGlvbiBlc3RhYmxpc2hlZCBhbmQgZ3JlZXRpbmcgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyXG5cbiAgICB0aGlzLl9nbG9iYWxBY2NlcHRVbnRhZ2dlZCA9IHt9IC8vIEdsb2JhbCBoYW5kbGVycyBmb3IgdW5yZWxhdGVkIHJlc3BvbnNlcyAoRVhQVU5HRSwgRVhJU1RTIGV0Yy4pXG5cbiAgICB0aGlzLl9jbGllbnRRdWV1ZSA9IFtdIC8vIFF1ZXVlIG9mIG91dGdvaW5nIGNvbW1hbmRzXG4gICAgdGhpcy5fY2FuU2VuZCA9IGZhbHNlIC8vIElzIGl0IE9LIHRvIHNlbmQgc29tZXRoaW5nIHRvIHRoZSBzZXJ2ZXJcbiAgICB0aGlzLl90YWdDb3VudGVyID0gMCAvLyBDb3VudGVyIHRvIGFsbG93IHVuaXF1ZXVlIGltYXAgdGFnc1xuICAgIHRoaXMuX2N1cnJlbnRDb21tYW5kID0gZmFsc2UgLy8gQ3VycmVudCBjb21tYW5kIHRoYXQgaXMgd2FpdGluZyBmb3IgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyXG5cbiAgICB0aGlzLl9pZGxlVGltZXIgPSBmYWxzZSAvLyBUaW1lciB3YWl0aW5nIHRvIGVudGVyIGlkbGVcbiAgICB0aGlzLl9zb2NrZXRUaW1lb3V0VGltZXIgPSBmYWxzZSAvLyBUaW1lciB3YWl0aW5nIHRvIGRlY2xhcmUgdGhlIHNvY2tldCBkZWFkIHN0YXJ0aW5nIGZyb20gdGhlIGxhc3Qgd3JpdGVcblxuICAgIHRoaXMuY29tcHJlc3NlZCA9IGZhbHNlIC8vIElzIHRoZSBjb25uZWN0aW9uIGNvbXByZXNzZWQgYW5kIG5lZWRzIGluZmxhdGluZy9kZWZsYXRpbmdcblxuICAgIC8vXG4gICAgLy8gSEVMUEVSU1xuICAgIC8vXG5cbiAgICAvLyBBcyB0aGUgc2VydmVyIHNlbmRzIGRhdGEgaW4gY2h1bmtzLCBpdCBuZWVkcyB0byBiZSBzcGxpdCBpbnRvIHNlcGFyYXRlIGxpbmVzLiBIZWxwcyBwYXJzaW5nIHRoZSBpbnB1dC5cbiAgICB0aGlzLl9pbmNvbWluZ0J1ZmZlcnMgPSBbXVxuICAgIHRoaXMuX2J1ZmZlclN0YXRlID0gQlVGRkVSX1NUQVRFX0RFRkFVTFRcbiAgICB0aGlzLl9saXRlcmFsUmVtYWluaW5nID0gMFxuXG4gICAgLy9cbiAgICAvLyBFdmVudCBwbGFjZWhvbGRlcnMsIG1heSBiZSBvdmVycmlkZW4gd2l0aCBjYWxsYmFjayBmdW5jdGlvbnNcbiAgICAvL1xuICAgIHRoaXMub25jZXJ0ID0gbnVsbFxuICAgIHRoaXMub25lcnJvciA9IG51bGwgLy8gSXJyZWNvdmVyYWJsZSBlcnJvciBvY2N1cnJlZC4gQ29ubmVjdGlvbiB0byB0aGUgc2VydmVyIHdpbGwgYmUgY2xvc2VkIGF1dG9tYXRpY2FsbHkuXG4gICAgdGhpcy5vbnJlYWR5ID0gbnVsbCAvLyBUaGUgY29ubmVjdGlvbiB0byB0aGUgc2VydmVyIGhhcyBiZWVuIGVzdGFibGlzaGVkIGFuZCBncmVldGluZyBpcyByZWNlaXZlZFxuICAgIHRoaXMub25pZGxlID0gbnVsbCAvLyBUaGVyZSBhcmUgbm8gbW9yZSBjb21tYW5kcyB0byBwcm9jZXNzXG4gIH1cblxuICAvLyBQVUJMSUMgTUVUSE9EU1xuXG4gIC8qKlxuICAgKiBJbml0aWF0ZSBhIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlci4gV2FpdCBmb3Igb25yZWFkeSBldmVudFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gU29ja2V0XG4gICAqICAgICBURVNUSU5HIE9OTFkhIFRoZSBUQ1BTb2NrZXQgaGFzIGEgcHJldHR5IG5vbnNlbnNpY2FsIGNvbnZlbmllbmNlIGNvbnN0cnVjdG9yLFxuICAgKiAgICAgd2hpY2ggbWFrZXMgaXQgaGFyZCB0byBtb2NrLiBGb3IgZGVwZW5kZW5jeS1pbmplY3Rpb24gcHVycG9zZXMsIHdlIHVzZSB0aGVcbiAgICogICAgIFNvY2tldCBwYXJhbWV0ZXIgdG8gcGFzcyBpbiBhIG1vY2sgU29ja2V0IGltcGxlbWVudGF0aW9uLiBTaG91bGQgYmUgbGVmdCBibGFua1xuICAgKiAgICAgaW4gcHJvZHVjdGlvbiB1c2UhXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBSZXNvbHZlcyB3aGVuIHNvY2tldCBpcyBvcGVuZWRcbiAgICovXG4gIGNvbm5lY3QgKFNvY2tldCA9IFRDUFNvY2tldCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnNvY2tldCA9IFNvY2tldC5vcGVuKHRoaXMuaG9zdCwgdGhpcy5wb3J0LCB7XG4gICAgICAgIGJpbmFyeVR5cGU6ICdhcnJheWJ1ZmZlcicsXG4gICAgICAgIHVzZVNlY3VyZVRyYW5zcG9ydDogdGhpcy5zZWN1cmVNb2RlLFxuICAgICAgICBjYTogdGhpcy5vcHRpb25zLmNhXG4gICAgICB9KVxuXG4gICAgICAvLyBhbGxvd3MgY2VydGlmaWNhdGUgaGFuZGxpbmcgZm9yIHBsYXRmb3JtIHcvbyBuYXRpdmUgdGxzIHN1cHBvcnRcbiAgICAgIC8vIG9uY2VydCBpcyBub24gc3RhbmRhcmQgc28gc2V0dGluZyBpdCBtaWdodCB0aHJvdyBpZiB0aGUgc29ja2V0IG9iamVjdCBpcyBpbW11dGFibGVcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuc29ja2V0Lm9uY2VydCA9IChjZXJ0KSA9PiB7IHRoaXMub25jZXJ0ICYmIHRoaXMub25jZXJ0KGNlcnQpIH1cbiAgICAgIH0gY2F0Y2ggKEUpIHsgfVxuXG4gICAgICAvLyBDb25uZWN0aW9uIGNsb3NpbmcgdW5leHBlY3RlZCBpcyBhbiBlcnJvclxuICAgICAgdGhpcy5zb2NrZXQub25jbG9zZSA9ICgpID0+IHRoaXMuX29uRXJyb3IobmV3IEVycm9yKCdTb2NrZXQgY2xvc2VkIHVuZXhwZWN0ZWRseSEnKSlcbiAgICAgIHRoaXMuc29ja2V0Lm9uZGF0YSA9IChldnQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLl9vbkRhdGEoZXZ0KVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aGlzLl9vbkVycm9yKGVycilcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBpZiBhbiBlcnJvciBoYXBwZW5zIGR1cmluZyBjcmVhdGUgdGltZSwgcmVqZWN0IHRoZSBwcm9taXNlXG4gICAgICB0aGlzLnNvY2tldC5vbmVycm9yID0gKGUpID0+IHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignQ291bGQgbm90IG9wZW4gc29ja2V0OiAnICsgZS5kYXRhLm1lc3NhZ2UpKVxuICAgICAgfVxuXG4gICAgICB0aGlzLnNvY2tldC5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICAgIC8vIHVzZSBwcm9wZXIgXCJpcnJlY292ZXJhYmxlIGVycm9yLCB0ZWFyIGRvd24gZXZlcnl0aGluZ1wiLWhhbmRsZXIgb25seSBhZnRlciBzb2NrZXQgaXMgb3BlblxuICAgICAgICB0aGlzLnNvY2tldC5vbmVycm9yID0gKGUpID0+IHRoaXMuX29uRXJyb3IoZSlcbiAgICAgICAgcmVzb2x2ZSgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlclxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUmVzb2x2ZXMgd2hlbiB0aGUgc29ja2V0IGlzIGNsb3NlZFxuICAgKi9cbiAgY2xvc2UgKGVycm9yKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB2YXIgdGVhckRvd24gPSAoKSA9PiB7XG4gICAgICAgIC8vIGZ1bGZpbGwgcGVuZGluZyBwcm9taXNlc1xuICAgICAgICB0aGlzLl9jbGllbnRRdWV1ZS5mb3JFYWNoKGNtZCA9PiBjbWQuY2FsbGJhY2soZXJyb3IpKVxuICAgICAgICBpZiAodGhpcy5fY3VycmVudENvbW1hbmQpIHtcbiAgICAgICAgICB0aGlzLl9jdXJyZW50Q29tbWFuZC5jYWxsYmFjayhlcnJvcilcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NsaWVudFF1ZXVlID0gW11cbiAgICAgICAgdGhpcy5fY3VycmVudENvbW1hbmQgPSBmYWxzZVxuXG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9pZGxlVGltZXIpXG4gICAgICAgIHRoaXMuX2lkbGVUaW1lciA9IG51bGxcblxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fc29ja2V0VGltZW91dFRpbWVyKVxuICAgICAgICB0aGlzLl9zb2NrZXRUaW1lb3V0VGltZXIgPSBudWxsXG5cbiAgICAgICAgaWYgKHRoaXMuc29ja2V0KSB7XG4gICAgICAgICAgLy8gcmVtb3ZlIGFsbCBsaXN0ZW5lcnNcbiAgICAgICAgICB0aGlzLnNvY2tldC5vbm9wZW4gPSBudWxsXG4gICAgICAgICAgdGhpcy5zb2NrZXQub25jbG9zZSA9IG51bGxcbiAgICAgICAgICB0aGlzLnNvY2tldC5vbmRhdGEgPSBudWxsXG4gICAgICAgICAgdGhpcy5zb2NrZXQub25lcnJvciA9IG51bGxcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQub25jZXJ0ID0gbnVsbFxuICAgICAgICAgIH0gY2F0Y2ggKEUpIHsgfVxuXG4gICAgICAgICAgdGhpcy5zb2NrZXQgPSBudWxsXG4gICAgICAgIH1cblxuICAgICAgICByZXNvbHZlKClcbiAgICAgIH1cblxuICAgICAgdGhpcy5fZGlzYWJsZUNvbXByZXNzaW9uKClcblxuICAgICAgaWYgKCF0aGlzLnNvY2tldCB8fCB0aGlzLnNvY2tldC5yZWFkeVN0YXRlICE9PSAnb3BlbicpIHtcbiAgICAgICAgcmV0dXJuIHRlYXJEb3duKClcbiAgICAgIH1cblxuICAgICAgdGhpcy5zb2NrZXQub25jbG9zZSA9IHRoaXMuc29ja2V0Lm9uZXJyb3IgPSB0ZWFyRG93biAvLyB3ZSBkb24ndCByZWFsbHkgY2FyZSBhYm91dCB0aGUgZXJyb3IgaGVyZVxuICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogU2VuZCBMT0dPVVQgdG8gdGhlIHNlcnZlci5cbiAgICpcbiAgICogVXNlIGlzIGRpc2NvdXJhZ2VkIVxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUmVzb2x2ZXMgd2hlbiBjb25uZWN0aW9uIGlzIGNsb3NlZCBieSBzZXJ2ZXIuXG4gICAqL1xuICBsb2dvdXQgKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnNvY2tldC5vbmNsb3NlID0gdGhpcy5zb2NrZXQub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5jbG9zZSgnQ2xpZW50IGxvZ2dpbmcgb3V0JykudGhlbihyZXNvbHZlKS5jYXRjaChyZWplY3QpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuZW5xdWV1ZUNvbW1hbmQoJ0xPR09VVCcpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWF0ZXMgVExTIGhhbmRzaGFrZVxuICAgKi9cbiAgdXBncmFkZSAoKSB7XG4gICAgdGhpcy5zZWN1cmVNb2RlID0gdHJ1ZVxuICAgIHRoaXMuc29ja2V0LnVwZ3JhZGVUb1NlY3VyZSgpXG4gIH1cblxuICAvKipcbiAgICogU2NoZWR1bGVzIGEgY29tbWFuZCB0byBiZSBzZW50IHRvIHRoZSBzZXJ2ZXIuXG4gICAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW1haWxqcy9lbWFpbGpzLWltYXAtaGFuZGxlciBmb3IgcmVxdWVzdCBzdHJ1Y3R1cmUuXG4gICAqIERvIG5vdCBwcm92aWRlIGEgdGFnIHByb3BlcnR5LCBpdCB3aWxsIGJlIHNldCBieSB0aGUgcXVldWUgbWFuYWdlci5cbiAgICpcbiAgICogVG8gY2F0Y2ggdW50YWdnZWQgcmVzcG9uc2VzIHVzZSBhY2NlcHRVbnRhZ2dlZCBwcm9wZXJ0eS4gRm9yIGV4YW1wbGUsIGlmXG4gICAqIHRoZSB2YWx1ZSBmb3IgaXQgaXMgJ0ZFVENIJyB0aGVuIHRoZSByZXBvbnNlIGluY2x1ZGVzICdwYXlsb2FkLkZFVENIJyBwcm9wZXJ0eVxuICAgKiB0aGF0IGlzIGFuIGFycmF5IGluY2x1ZGluZyBhbGwgbGlzdGVkICogRkVUQ0ggcmVzcG9uc2VzLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcmVxdWVzdCBTdHJ1Y3R1cmVkIHJlcXVlc3Qgb2JqZWN0XG4gICAqIEBwYXJhbSB7QXJyYXl9IGFjY2VwdFVudGFnZ2VkIGEgbGlzdCBvZiB1bnRhZ2dlZCByZXNwb25zZXMgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIGluICdwYXlsb2FkJyBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIE9wdGlvbmFsIGRhdGEgZm9yIHRoZSBjb21tYW5kIHBheWxvYWRcbiAgICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlIHdhcyByZWNlaXZlZFxuICAgKi9cbiAgZW5xdWV1ZUNvbW1hbmQgKHJlcXVlc3QsIGFjY2VwdFVudGFnZ2VkLCBvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiByZXF1ZXN0ID09PSAnc3RyaW5nJykge1xuICAgICAgcmVxdWVzdCA9IHtcbiAgICAgICAgY29tbWFuZDogcmVxdWVzdFxuICAgICAgfVxuICAgIH1cblxuICAgIGFjY2VwdFVudGFnZ2VkID0gW10uY29uY2F0KGFjY2VwdFVudGFnZ2VkIHx8IFtdKS5tYXAoKHVudGFnZ2VkKSA9PiAodW50YWdnZWQgfHwgJycpLnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKS50cmltKCkpXG5cbiAgICB2YXIgdGFnID0gJ1cnICsgKCsrdGhpcy5fdGFnQ291bnRlcilcbiAgICByZXF1ZXN0LnRhZyA9IHRhZ1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHZhciBkYXRhID0ge1xuICAgICAgICB0YWc6IHRhZyxcbiAgICAgICAgcmVxdWVzdDogcmVxdWVzdCxcbiAgICAgICAgcGF5bG9hZDogYWNjZXB0VW50YWdnZWQubGVuZ3RoID8ge30gOiB1bmRlZmluZWQsXG4gICAgICAgIGNhbGxiYWNrOiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pc0Vycm9yKHJlc3BvbnNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlamVjdChyZXNwb25zZSlcbiAgICAgICAgICB9IGVsc2UgaWYgKFsnTk8nLCAnQkFEJ10uaW5kZXhPZihwcm9wT3IoJycsICdjb21tYW5kJywgcmVzcG9uc2UpLnRvVXBwZXJDYXNlKCkudHJpbSgpKSA+PSAwKSB7XG4gICAgICAgICAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IocmVzcG9uc2UuaHVtYW5SZWFkYWJsZSB8fCAnRXJyb3InKVxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmNvZGUpIHtcbiAgICAgICAgICAgICAgZXJyb3IuY29kZSA9IHJlc3BvbnNlLmNvZGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZWplY3QoZXJyb3IpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBhcHBseSBhbnkgYWRkaXRpb25hbCBvcHRpb25zIHRvIHRoZSBjb21tYW5kXG4gICAgICBPYmplY3Qua2V5cyhvcHRpb25zIHx8IHt9KS5mb3JFYWNoKChrZXkpID0+IHsgZGF0YVtrZXldID0gb3B0aW9uc1trZXldIH0pXG5cbiAgICAgIGFjY2VwdFVudGFnZ2VkLmZvckVhY2goKGNvbW1hbmQpID0+IHsgZGF0YS5wYXlsb2FkW2NvbW1hbmRdID0gW10gfSlcblxuICAgICAgLy8gaWYgd2UncmUgaW4gcHJpb3JpdHkgbW9kZSAoaS5lLiB3ZSByYW4gY29tbWFuZHMgaW4gYSBwcmVjaGVjayksXG4gICAgICAvLyBxdWV1ZSBhbnkgY29tbWFuZHMgQkVGT1JFIHRoZSBjb21tYW5kIHRoYXQgY29udGlhbmVkIHRoZSBwcmVjaGVjayxcbiAgICAgIC8vIG90aGVyd2lzZSBqdXN0IHF1ZXVlIGNvbW1hbmQgYXMgdXN1YWxcbiAgICAgIHZhciBpbmRleCA9IGRhdGEuY3R4ID8gdGhpcy5fY2xpZW50UXVldWUuaW5kZXhPZihkYXRhLmN0eCkgOiAtMVxuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgZGF0YS50YWcgKz0gJy5wJ1xuICAgICAgICBkYXRhLnJlcXVlc3QudGFnICs9ICcucCdcbiAgICAgICAgdGhpcy5fY2xpZW50UXVldWUuc3BsaWNlKGluZGV4LCAwLCBkYXRhKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fY2xpZW50UXVldWUucHVzaChkYXRhKVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fY2FuU2VuZCkge1xuICAgICAgICB0aGlzLl9zZW5kUmVxdWVzdCgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gY29tbWFuZHNcbiAgICogQHBhcmFtIGN0eFxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGdldFByZXZpb3VzbHlRdWV1ZWQgKGNvbW1hbmRzLCBjdHgpIHtcbiAgICBjb25zdCBzdGFydEluZGV4ID0gdGhpcy5fY2xpZW50UXVldWUuaW5kZXhPZihjdHgpIC0gMVxuXG4gICAgLy8gc2VhcmNoIGJhY2t3YXJkcyBmb3IgdGhlIGNvbW1hbmRzIGFuZCByZXR1cm4gdGhlIGZpcnN0IGZvdW5kXG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBpZiAoaXNNYXRjaCh0aGlzLl9jbGllbnRRdWV1ZVtpXSkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NsaWVudFF1ZXVlW2ldXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYWxzbyBjaGVjayBjdXJyZW50IGNvbW1hbmQgaWYgbm8gU0VMRUNUIGlzIHF1ZXVlZFxuICAgIGlmIChpc01hdGNoKHRoaXMuX2N1cnJlbnRDb21tYW5kKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRDb21tYW5kXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG5cbiAgICBmdW5jdGlvbiBpc01hdGNoIChkYXRhKSB7XG4gICAgICByZXR1cm4gZGF0YSAmJiBkYXRhLnJlcXVlc3QgJiYgY29tbWFuZHMuaW5kZXhPZihkYXRhLnJlcXVlc3QuY29tbWFuZCkgPj0gMFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGRhdGEgdG8gdGhlIFRDUCBzb2NrZXRcbiAgICogQXJtcyBhIHRpbWVvdXQgd2FpdGluZyBmb3IgYSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgUGF5bG9hZFxuICAgKi9cbiAgc2VuZCAoc3RyKSB7XG4gICAgY29uc3QgYnVmZmVyID0gdG9UeXBlZEFycmF5KHN0cikuYnVmZmVyXG4gICAgY29uc3QgdGltZW91dCA9IHRoaXMudGltZW91dFNvY2tldExvd2VyQm91bmQgKyBNYXRoLmZsb29yKGJ1ZmZlci5ieXRlTGVuZ3RoICogdGhpcy50aW1lb3V0U29ja2V0TXVsdGlwbGllcilcblxuICAgIGNsZWFyVGltZW91dCh0aGlzLl9zb2NrZXRUaW1lb3V0VGltZXIpIC8vIGNsZWFyIHBlbmRpbmcgdGltZW91dHNcbiAgICB0aGlzLl9zb2NrZXRUaW1lb3V0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX29uRXJyb3IobmV3IEVycm9yKCcgU29ja2V0IHRpbWVkIG91dCEnKSksIHRpbWVvdXQpIC8vIGFybSB0aGUgbmV4dCB0aW1lb3V0XG5cbiAgICBpZiAodGhpcy5jb21wcmVzc2VkKSB7XG4gICAgICB0aGlzLl9zZW5kQ29tcHJlc3NlZChidWZmZXIpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghdGhpcy5zb2NrZXQpIHtcbiAgICAgICAgdGhpcy5fb25FcnJvcihuZXcgRXJyb3IoXCJFcnJvciA6OiBVbmV4cGVjdGVkIHNvY2tldCBjbG9zZVwiKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNvY2tldC5zZW5kKGJ1ZmZlcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIGdsb2JhbCBoYW5kbGVyIGZvciBhbiB1bnRhZ2dlZCByZXNwb25zZS4gSWYgY3VycmVudGx5IHByb2Nlc3NlZCBjb21tYW5kXG4gICAqIGhhcyBub3QgbGlzdGVkIHVudGFnZ2VkIGNvbW1hbmQgaXQgaXMgZm9yd2FyZGVkIHRvIHRoZSBnbG9iYWwgaGFuZGxlci4gVXNlZnVsXG4gICAqIHdpdGggRVhQVU5HRSwgRVhJU1RTIGV0Yy5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNvbW1hbmQgVW50YWdnZWQgY29tbWFuZCBuYW1lXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIGZ1bmN0aW9uIHdpdGggcmVzcG9uc2Ugb2JqZWN0IGFuZCBjb250aW51ZSBjYWxsYmFjayBmdW5jdGlvblxuICAgKi9cbiAgc2V0SGFuZGxlciAoY29tbWFuZCwgY2FsbGJhY2spIHtcbiAgICB0aGlzLl9nbG9iYWxBY2NlcHRVbnRhZ2dlZFtjb21tYW5kLnRvVXBwZXJDYXNlKCkudHJpbSgpXSA9IGNhbGxiYWNrXG4gIH1cblxuICAvLyBJTlRFUk5BTCBFVkVOVFNcblxuICAvKipcbiAgICogRXJyb3IgaGFuZGxlciBmb3IgdGhlIHNvY2tldFxuICAgKlxuICAgKiBAZXZlbnRcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0IEV2ZW50IG9iamVjdC4gU2VlIGV2dC5kYXRhIGZvciB0aGUgZXJyb3JcbiAgICovXG4gIF9vbkVycm9yIChldnQpIHtcbiAgICB2YXIgZXJyb3JcbiAgICBpZiAodGhpcy5pc0Vycm9yKGV2dCkpIHtcbiAgICAgIGVycm9yID0gZXZ0XG4gICAgfSBlbHNlIGlmIChldnQgJiYgdGhpcy5pc0Vycm9yKGV2dC5kYXRhKSkge1xuICAgICAgZXJyb3IgPSBldnQuZGF0YVxuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvciA9IG5ldyBFcnJvcigoZXZ0ICYmIGV2dC5kYXRhICYmIGV2dC5kYXRhLm1lc3NhZ2UpIHx8IGV2dC5kYXRhIHx8IGV2dCB8fCAnRXJyb3InKVxuICAgIH1cblxuICAgIHRoaXMubG9nZ2VyLmVycm9yKGVycm9yKVxuXG4gICAgLy8gYWx3YXlzIGNhbGwgb25lcnJvciBjYWxsYmFjaywgbm8gbWF0dGVyIGlmIGNsb3NlKCkgc3VjY2VlZHMgb3IgZmFpbHNcbiAgICB0aGlzLmNsb3NlKGVycm9yKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMub25lcnJvciAmJiB0aGlzLm9uZXJyb3IoZXJyb3IpXG4gICAgfSwgKCkgPT4ge1xuICAgICAgdGhpcy5vbmVycm9yICYmIHRoaXMub25lcnJvcihlcnJvcilcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIGluY29taW5nIGRhdGEgZnJvbSB0aGUgc2VydmVyLiBUaGUgZGF0YSBpcyBzZW50IGluIGFyYml0cmFyeVxuICAgKiBjaHVua3MgYW5kIGNhbid0IGJlIHVzZWQgZGlyZWN0bHkgc28gdGhpcyBmdW5jdGlvbiBtYWtlcyBzdXJlIHRoZSBkYXRhXG4gICAqIGlzIHNwbGl0IGludG8gY29tcGxldGUgbGluZXMgYmVmb3JlIHRoZSBkYXRhIGlzIHBhc3NlZCB0byB0aGUgY29tbWFuZFxuICAgKiBoYW5kbGVyXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKi9cbiAgX29uRGF0YSAoZXZ0KSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3NvY2tldFRpbWVvdXRUaW1lcikgLy8gcmVzZXQgdGhlIHRpbWVvdXQgb24gZWFjaCBkYXRhIHBhY2tldFxuICAgIGNvbnN0IHRpbWVvdXQgPSB0aGlzLnRpbWVvdXRTb2NrZXRMb3dlckJvdW5kICsgTWF0aC5mbG9vcig0MDk2ICogdGhpcy50aW1lb3V0U29ja2V0TXVsdGlwbGllcikgLy8gbWF4IHBhY2tldCBzaXplIGlzIDQwOTYgYnl0ZXNcbiAgICB0aGlzLl9zb2NrZXRUaW1lb3V0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX29uRXJyb3IobmV3IEVycm9yKCcgU29ja2V0IHRpbWVkIG91dCEnKSksIHRpbWVvdXQpXG5cbiAgICB0aGlzLl9pbmNvbWluZ0J1ZmZlcnMucHVzaChuZXcgVWludDhBcnJheShldnQuZGF0YSkpIC8vIGFwcGVuZCB0byB0aGUgaW5jb21pbmcgYnVmZmVyXG4gICAgdGhpcy5fcGFyc2VJbmNvbWluZ0NvbW1hbmRzKHRoaXMuX2l0ZXJhdGVJbmNvbWluZ0J1ZmZlcigpKSAvLyBDb25zdW1lIHRoZSBpbmNvbWluZyBidWZmZXJcbiAgfVxuXG4gICogX2l0ZXJhdGVJbmNvbWluZ0J1ZmZlciAoKSB7XG4gICAgbGV0IGJ1ZiA9IHRoaXMuX2luY29taW5nQnVmZmVyc1t0aGlzLl9pbmNvbWluZ0J1ZmZlcnMubGVuZ3RoIC0gMV0gfHwgW11cbiAgICBsZXQgaSA9IDBcblxuICAgIC8vIGxvb3AgaW52YXJpYW50OlxuICAgIC8vICAgdGhpcy5faW5jb21pbmdCdWZmZXJzIHN0YXJ0cyB3aXRoIHRoZSBiZWdpbm5pbmcgb2YgaW5jb21pbmcgY29tbWFuZC5cbiAgICAvLyAgIGJ1ZiBpcyBzaG9ydGhhbmQgZm9yIGxhc3QgZWxlbWVudCBvZiB0aGlzLl9pbmNvbWluZ0J1ZmZlcnMuXG4gICAgLy8gICBidWZbMC4uaS0xXSBpcyBwYXJ0IG9mIGluY29taW5nIGNvbW1hbmQuXG4gICAgd2hpbGUgKGkgPCBidWYubGVuZ3RoKSB7XG4gICAgICBzd2l0Y2ggKHRoaXMuX2J1ZmZlclN0YXRlKSB7XG4gICAgICAgIGNhc2UgQlVGRkVSX1NUQVRFX0xJVEVSQUw6XG4gICAgICAgICAgY29uc3QgZGlmZiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBpLCB0aGlzLl9saXRlcmFsUmVtYWluaW5nKVxuICAgICAgICAgIHRoaXMuX2xpdGVyYWxSZW1haW5pbmcgLT0gZGlmZlxuICAgICAgICAgIGkgKz0gZGlmZlxuICAgICAgICAgIGlmICh0aGlzLl9saXRlcmFsUmVtYWluaW5nID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLl9idWZmZXJTdGF0ZSA9IEJVRkZFUl9TVEFURV9ERUZBVUxUXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBCVUZGRVJfU1RBVEVfUE9TU0lCTFlfTElURVJBTF9MRU5HVEhfMjpcbiAgICAgICAgICBpZiAoaSA8IGJ1Zi5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChidWZbaV0gPT09IENBUlJJQUdFX1JFVFVSTikge1xuICAgICAgICAgICAgICB0aGlzLl9saXRlcmFsUmVtYWluaW5nID0gTnVtYmVyKGZyb21UeXBlZEFycmF5KHRoaXMuX2xlbmd0aEJ1ZmZlcikpICsgMiAvLyBmb3IgQ1JMRlxuICAgICAgICAgICAgICB0aGlzLl9idWZmZXJTdGF0ZSA9IEJVRkZFUl9TVEFURV9MSVRFUkFMXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLl9idWZmZXJTdGF0ZSA9IEJVRkZFUl9TVEFURV9ERUZBVUxUXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fbGVuZ3RoQnVmZmVyXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBCVUZGRVJfU1RBVEVfUE9TU0lCTFlfTElURVJBTF9MRU5HVEhfMTpcbiAgICAgICAgICBjb25zdCBzdGFydCA9IGlcbiAgICAgICAgICB3aGlsZSAoaSA8IGJ1Zi5sZW5ndGggJiYgYnVmW2ldID49IDQ4ICYmIGJ1ZltpXSA8PSA1NykgeyAvLyBkaWdpdHNcbiAgICAgICAgICAgIGkrK1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RhcnQgIT09IGkpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhdGVzdCA9IGJ1Zi5zdWJhcnJheShzdGFydCwgaSlcbiAgICAgICAgICAgIGNvbnN0IHByZXZCdWYgPSB0aGlzLl9sZW5ndGhCdWZmZXJcbiAgICAgICAgICAgIHRoaXMuX2xlbmd0aEJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHByZXZCdWYubGVuZ3RoICsgbGF0ZXN0Lmxlbmd0aClcbiAgICAgICAgICAgIHRoaXMuX2xlbmd0aEJ1ZmZlci5zZXQocHJldkJ1ZilcbiAgICAgICAgICAgIHRoaXMuX2xlbmd0aEJ1ZmZlci5zZXQobGF0ZXN0LCBwcmV2QnVmLmxlbmd0aClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGkgPCBidWYubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fbGVuZ3RoQnVmZmVyLmxlbmd0aCA+IDAgJiYgYnVmW2ldID09PSBSSUdIVF9DVVJMWV9CUkFDS0VUKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2J1ZmZlclN0YXRlID0gQlVGRkVSX1NUQVRFX1BPU1NJQkxZX0xJVEVSQUxfTEVOR1RIXzJcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9sZW5ndGhCdWZmZXJcbiAgICAgICAgICAgICAgdGhpcy5fYnVmZmVyU3RhdGUgPSBCVUZGRVJfU1RBVEVfREVGQVVMVFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSsrXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBmaW5kIGxpdGVyYWwgbGVuZ3RoXG4gICAgICAgICAgY29uc3QgbGVmdElkeCA9IGJ1Zi5pbmRleE9mKExFRlRfQ1VSTFlfQlJBQ0tFVCwgaSlcbiAgICAgICAgICBpZiAobGVmdElkeCA+IC0xKSB7XG4gICAgICAgICAgICBjb25zdCBsZWZ0T2ZMZWZ0Q3VybHkgPSBuZXcgVWludDhBcnJheShidWYuYnVmZmVyLCBpLCBsZWZ0SWR4IC0gaSlcbiAgICAgICAgICAgIGlmIChsZWZ0T2ZMZWZ0Q3VybHkuaW5kZXhPZihMSU5FX0ZFRUQpID09PSAtMSkge1xuICAgICAgICAgICAgICBpID0gbGVmdElkeCArIDFcbiAgICAgICAgICAgICAgdGhpcy5fbGVuZ3RoQnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMClcbiAgICAgICAgICAgICAgdGhpcy5fYnVmZmVyU3RhdGUgPSBCVUZGRVJfU1RBVEVfUE9TU0lCTFlfTElURVJBTF9MRU5HVEhfMVxuICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGZpbmQgZW5kIG9mIGNvbW1hbmRcbiAgICAgICAgICBjb25zdCBMRmlkeCA9IGJ1Zi5pbmRleE9mKExJTkVfRkVFRCwgaSlcbiAgICAgICAgICBpZiAoTEZpZHggPiAtMSkge1xuICAgICAgICAgICAgaWYgKExGaWR4IDwgYnVmLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgdGhpcy5faW5jb21pbmdCdWZmZXJzW3RoaXMuX2luY29taW5nQnVmZmVycy5sZW5ndGggLSAxXSA9IG5ldyBVaW50OEFycmF5KGJ1Zi5idWZmZXIsIDAsIExGaWR4ICsgMSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNvbW1hbmRMZW5ndGggPSB0aGlzLl9pbmNvbWluZ0J1ZmZlcnMucmVkdWNlKChwcmV2LCBjdXJyKSA9PiBwcmV2ICsgY3Vyci5sZW5ndGgsIDApIC0gMiAvLyAyIGZvciBDUkxGXG4gICAgICAgICAgICBjb25zdCBjb21tYW5kID0gbmV3IFVpbnQ4QXJyYXkoY29tbWFuZExlbmd0aClcbiAgICAgICAgICAgIGxldCBpbmRleCA9IDBcbiAgICAgICAgICAgIHdoaWxlICh0aGlzLl9pbmNvbWluZ0J1ZmZlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBsZXQgdWludDhBcnJheSA9IHRoaXMuX2luY29taW5nQnVmZmVycy5zaGlmdCgpXG5cbiAgICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nTGVuZ3RoID0gY29tbWFuZExlbmd0aCAtIGluZGV4XG4gICAgICAgICAgICAgIGlmICh1aW50OEFycmF5Lmxlbmd0aCA+IHJlbWFpbmluZ0xlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4Y2Vzc0xlbmd0aCA9IHVpbnQ4QXJyYXkubGVuZ3RoIC0gcmVtYWluaW5nTGVuZ3RoXG4gICAgICAgICAgICAgICAgdWludDhBcnJheSA9IHVpbnQ4QXJyYXkuc3ViYXJyYXkoMCwgLWV4Y2Vzc0xlbmd0aClcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pbmNvbWluZ0J1ZmZlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5faW5jb21pbmdCdWZmZXJzID0gW11cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29tbWFuZC5zZXQodWludDhBcnJheSwgaW5kZXgpXG4gICAgICAgICAgICAgIGluZGV4ICs9IHVpbnQ4QXJyYXkubGVuZ3RoXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB5aWVsZCBjb21tYW5kXG4gICAgICAgICAgICBpZiAoTEZpZHggPCBidWYubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICBidWYgPSBuZXcgVWludDhBcnJheShidWYuc3ViYXJyYXkoTEZpZHggKyAxKSlcbiAgICAgICAgICAgICAgdGhpcy5faW5jb21pbmdCdWZmZXJzLnB1c2goYnVmKVxuICAgICAgICAgICAgICBpID0gMFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gY2xlYXIgdGhlIHRpbWVvdXQgd2hlbiBhbiBlbnRpcmUgY29tbWFuZCBoYXMgYXJyaXZlZFxuICAgICAgICAgICAgICAvLyBhbmQgbm90IHdhaXRpbmcgb24gbW9yZSBkYXRhIGZvciBuZXh0IGNvbW1hbmRcbiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3NvY2tldFRpbWVvdXRUaW1lcilcbiAgICAgICAgICAgICAgdGhpcy5fc29ja2V0VGltZW91dFRpbWVyID0gbnVsbFxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFBSSVZBVEUgTUVUSE9EU1xuXG4gIC8qKlxuICAgKiBQcm9jZXNzZXMgYSBjb21tYW5kIGZyb20gdGhlIHF1ZXVlLiBUaGUgY29tbWFuZCBpcyBwYXJzZWQgYW5kIGZlZWRlZCB0byBhIGhhbmRsZXJcbiAgICovXG4gIF9wYXJzZUluY29taW5nQ29tbWFuZHMgKGNvbW1hbmRzKSB7XG4gICAgZm9yICh2YXIgY29tbWFuZCBvZiBjb21tYW5kcykge1xuICAgICAgdGhpcy5fY2xlYXJJZGxlKClcblxuICAgICAgLypcbiAgICAgICAqIFRoZSBcIitcIi10YWdnZWQgcmVzcG9uc2UgaXMgYSBzcGVjaWFsIGNhc2U6XG4gICAgICAgKiBFaXRoZXIgdGhlIHNlcnZlciBjYW4gYXNrcyBmb3IgdGhlIG5leHQgY2h1bmsgb2YgZGF0YSwgZS5nLiBmb3IgdGhlIEFVVEhFTlRJQ0FURSBjb21tYW5kLlxuICAgICAgICpcbiAgICAgICAqIE9yIHRoZXJlIHdhcyBhbiBlcnJvciBpbiB0aGUgWE9BVVRIMiBhdXRoZW50aWNhdGlvbiwgZm9yIHdoaWNoIFNBU0wgaW5pdGlhbCBjbGllbnQgcmVzcG9uc2UgZXh0ZW5zaW9uXG4gICAgICAgKiBkaWN0YXRlcyB0aGUgY2xpZW50IHNlbmRzIGFuIGVtcHR5IEVPTCByZXNwb25zZSB0byB0aGUgY2hhbGxlbmdlIGNvbnRhaW5pbmcgdGhlIGVycm9yIG1lc3NhZ2UuXG4gICAgICAgKlxuICAgICAgICogRGV0YWlscyBvbiBcIitcIi10YWdnZWQgcmVzcG9uc2U6XG4gICAgICAgKiAgIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNTAxI3NlY3Rpb24tMi4yLjFcbiAgICAgICAqL1xuICAgICAgLy9cbiAgICAgIGlmIChjb21tYW5kWzBdID09PSBBU0NJSV9QTFVTKSB7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50Q29tbWFuZC5kYXRhLmxlbmd0aCkge1xuICAgICAgICAgIC8vIGZlZWQgdGhlIG5leHQgY2h1bmsgb2YgZGF0YVxuICAgICAgICAgIHZhciBjaHVuayA9IHRoaXMuX2N1cnJlbnRDb21tYW5kLmRhdGEuc2hpZnQoKVxuICAgICAgICAgIGNodW5rICs9ICghdGhpcy5fY3VycmVudENvbW1hbmQuZGF0YS5sZW5ndGggPyBFT0wgOiAnJykgLy8gRU9MIGlmIHRoZXJlJ3Mgbm90aGluZyBtb3JlIHRvIHNlbmRcbiAgICAgICAgICB0aGlzLnNlbmQoY2h1bmspXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fY3VycmVudENvbW1hbmQuZXJyb3JSZXNwb25zZUV4cGVjdHNFbXB0eUxpbmUpIHtcbiAgICAgICAgICB0aGlzLnNlbmQoRU9MKSAvLyBYT0FVVEgyIGVtcHR5IHJlc3BvbnNlLCBlcnJvciB3aWxsIGJlIHJlcG9ydGVkIHdoZW4gc2VydmVyIGNvbnRpbnVlcyB3aXRoIE5PIHJlc3BvbnNlXG4gICAgICAgIH1cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgdmFyIHJlc3BvbnNlXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB2YWx1ZUFzU3RyaW5nID0gdGhpcy5fY3VycmVudENvbW1hbmQucmVxdWVzdCAmJiB0aGlzLl9jdXJyZW50Q29tbWFuZC5yZXF1ZXN0LnZhbHVlQXNTdHJpbmdcbiAgICAgICAgcmVzcG9uc2UgPSBwYXJzZXIoY29tbWFuZCwgeyB2YWx1ZUFzU3RyaW5nIH0pXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdTOicsICgpID0+IGNvbXBpbGVyKHJlc3BvbnNlLCBmYWxzZSwgdHJ1ZSkpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdFcnJvciBwYXJzaW5nIGltYXAgY29tbWFuZCEnLCByZXNwb25zZSlcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRXJyb3IoZSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5fcHJvY2Vzc1Jlc3BvbnNlKHJlc3BvbnNlKVxuICAgICAgdGhpcy5faGFuZGxlUmVzcG9uc2UocmVzcG9uc2UpXG5cbiAgICAgIC8vIGZpcnN0IHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlciwgY29ubmVjdGlvbiBpcyBub3cgdXNhYmxlXG4gICAgICBpZiAoIXRoaXMuX2Nvbm5lY3Rpb25SZWFkeSkge1xuICAgICAgICB0aGlzLl9jb25uZWN0aW9uUmVhZHkgPSB0cnVlXG4gICAgICAgIHRoaXMub25yZWFkeSAmJiB0aGlzLm9ucmVhZHkoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGZWVkcyBhIHBhcnNlZCByZXNwb25zZSBvYmplY3QgdG8gYW4gYXBwcm9wcmlhdGUgaGFuZGxlclxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcmVzcG9uc2UgUGFyc2VkIGNvbW1hbmQgb2JqZWN0XG4gICAqL1xuICBfaGFuZGxlUmVzcG9uc2UgKHJlc3BvbnNlKSB7XG4gICAgdmFyIGNvbW1hbmQgPSBwcm9wT3IoJycsICdjb21tYW5kJywgcmVzcG9uc2UpLnRvVXBwZXJDYXNlKCkudHJpbSgpXG5cbiAgICBpZiAoIXRoaXMuX2N1cnJlbnRDb21tYW5kKSB7XG4gICAgICAvLyB1bnNvbGljaXRlZCB1bnRhZ2dlZCByZXNwb25zZVxuICAgICAgaWYgKHJlc3BvbnNlLnRhZyA9PT0gJyonICYmIGNvbW1hbmQgaW4gdGhpcy5fZ2xvYmFsQWNjZXB0VW50YWdnZWQpIHtcbiAgICAgICAgdGhpcy5fZ2xvYmFsQWNjZXB0VW50YWdnZWRbY29tbWFuZF0ocmVzcG9uc2UpXG4gICAgICAgIHRoaXMuX2NhblNlbmQgPSB0cnVlXG4gICAgICAgIHRoaXMuX3NlbmRSZXF1ZXN0KClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuX2N1cnJlbnRDb21tYW5kLnBheWxvYWQgJiYgcmVzcG9uc2UudGFnID09PSAnKicgJiYgY29tbWFuZCBpbiB0aGlzLl9jdXJyZW50Q29tbWFuZC5wYXlsb2FkKSB7XG4gICAgICAvLyBleHBlY3RlZCB1bnRhZ2dlZCByZXNwb25zZVxuICAgICAgdGhpcy5fY3VycmVudENvbW1hbmQucGF5bG9hZFtjb21tYW5kXS5wdXNoKHJlc3BvbnNlKVxuICAgIH0gZWxzZSBpZiAocmVzcG9uc2UudGFnID09PSAnKicgJiYgY29tbWFuZCBpbiB0aGlzLl9nbG9iYWxBY2NlcHRVbnRhZ2dlZCkge1xuICAgICAgLy8gdW5leHBlY3RlZCB1bnRhZ2dlZCByZXNwb25zZVxuICAgICAgdGhpcy5fZ2xvYmFsQWNjZXB0VW50YWdnZWRbY29tbWFuZF0ocmVzcG9uc2UpXG4gICAgfSBlbHNlIGlmIChyZXNwb25zZS50YWcgPT09IHRoaXMuX2N1cnJlbnRDb21tYW5kLnRhZykge1xuICAgICAgLy8gdGFnZ2VkIHJlc3BvbnNlXG4gICAgICBpZiAodGhpcy5fY3VycmVudENvbW1hbmQucGF5bG9hZCAmJiBPYmplY3Qua2V5cyh0aGlzLl9jdXJyZW50Q29tbWFuZC5wYXlsb2FkKS5sZW5ndGgpIHtcbiAgICAgICAgcmVzcG9uc2UucGF5bG9hZCA9IHRoaXMuX2N1cnJlbnRDb21tYW5kLnBheWxvYWRcbiAgICAgIH1cbiAgICAgIHRoaXMuX2N1cnJlbnRDb21tYW5kLmNhbGxiYWNrKHJlc3BvbnNlKVxuICAgICAgdGhpcy5fY2FuU2VuZCA9IHRydWVcbiAgICAgIHRoaXMuX3NlbmRSZXF1ZXN0KClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBjb21tYW5kIGZyb20gY2xpZW50IHF1ZXVlIHRvIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICBfc2VuZFJlcXVlc3QgKCkge1xuICAgIGlmICghdGhpcy5fY2xpZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZW50ZXJJZGxlKClcbiAgICB9XG4gICAgdGhpcy5fY2xlYXJJZGxlKClcblxuICAgIC8vIGFuIG9wZXJhdGlvbiB3YXMgbWFkZSBpbiB0aGUgcHJlY2hlY2ssIG5vIG5lZWQgdG8gcmVzdGFydCB0aGUgcXVldWUgbWFudWFsbHlcbiAgICB0aGlzLl9yZXN0YXJ0UXVldWUgPSBmYWxzZVxuXG4gICAgdmFyIGNvbW1hbmQgPSB0aGlzLl9jbGllbnRRdWV1ZVswXVxuICAgIGlmICh0eXBlb2YgY29tbWFuZC5wcmVjaGVjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gcmVtZW1iZXIgdGhlIGNvbnRleHRcbiAgICAgIHZhciBjb250ZXh0ID0gY29tbWFuZFxuICAgICAgdmFyIHByZWNoZWNrID0gY29udGV4dC5wcmVjaGVja1xuICAgICAgZGVsZXRlIGNvbnRleHQucHJlY2hlY2tcblxuICAgICAgLy8gd2UgbmVlZCB0byByZXN0YXJ0IHRoZSBxdWV1ZSBoYW5kbGluZyBpZiBubyBvcGVyYXRpb24gd2FzIG1hZGUgaW4gdGhlIHByZWNoZWNrXG4gICAgICB0aGlzLl9yZXN0YXJ0UXVldWUgPSB0cnVlXG5cbiAgICAgIC8vIGludm9rZSB0aGUgcHJlY2hlY2sgY29tbWFuZCBhbmQgcmVzdW1lIG5vcm1hbCBvcGVyYXRpb24gYWZ0ZXIgdGhlIHByb21pc2UgcmVzb2x2ZXNcbiAgICAgIHByZWNoZWNrKGNvbnRleHQpLnRoZW4oKCkgPT4ge1xuICAgICAgICAvLyB3ZSdyZSBkb25lIHdpdGggdGhlIHByZWNoZWNrXG4gICAgICAgIGlmICh0aGlzLl9yZXN0YXJ0UXVldWUpIHtcbiAgICAgICAgICAvLyB3ZSBuZWVkIHRvIHJlc3RhcnQgdGhlIHF1ZXVlIGhhbmRsaW5nXG4gICAgICAgICAgdGhpcy5fc2VuZFJlcXVlc3QoKVxuICAgICAgICB9XG4gICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIC8vIHByZWNoZWNrIGZhaWxlZCwgc28gd2UgcmVtb3ZlIHRoZSBpbml0aWFsIGNvbW1hbmRcbiAgICAgICAgLy8gZnJvbSB0aGUgcXVldWUsIGludm9rZSBpdHMgY2FsbGJhY2sgYW5kIHJlc3VtZSBub3JtYWwgb3BlcmF0aW9uXG4gICAgICAgIGxldCBjbWRcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9jbGllbnRRdWV1ZS5pbmRleE9mKGNvbnRleHQpXG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgY21kID0gdGhpcy5fY2xpZW50UXVldWUuc3BsaWNlKGluZGV4LCAxKVswXVxuICAgICAgICB9XG4gICAgICAgIGlmIChjbWQgJiYgY21kLmNhbGxiYWNrKSB7XG4gICAgICAgICAgY21kLmNhbGxiYWNrKGVycilcbiAgICAgICAgICB0aGlzLl9jYW5TZW5kID0gdHJ1ZVxuICAgICAgICAgIHRoaXMuX3BhcnNlSW5jb21pbmdDb21tYW5kcyh0aGlzLl9pdGVyYXRlSW5jb21pbmdCdWZmZXIoKSkgLy8gQ29uc3VtZSB0aGUgcmVzdCBvZiB0aGUgaW5jb21pbmcgYnVmZmVyXG4gICAgICAgICAgdGhpcy5fc2VuZFJlcXVlc3QoKSAvLyBjb250aW51ZSBzZW5kaW5nXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9jYW5TZW5kID0gZmFsc2VcbiAgICB0aGlzLl9jdXJyZW50Q29tbWFuZCA9IHRoaXMuX2NsaWVudFF1ZXVlLnNoaWZ0KClcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLl9jdXJyZW50Q29tbWFuZC5kYXRhID0gY29tcGlsZXIodGhpcy5fY3VycmVudENvbW1hbmQucmVxdWVzdCwgdHJ1ZSlcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdDOicsICgpID0+IGNvbXBpbGVyKHRoaXMuX2N1cnJlbnRDb21tYW5kLnJlcXVlc3QsIGZhbHNlLCB0cnVlKSkgLy8gZXhjbHVkZXMgcGFzc3dvcmRzIGV0Yy5cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignRXJyb3IgY29tcGlsaW5nIGltYXAgY29tbWFuZCEnLCB0aGlzLl9jdXJyZW50Q29tbWFuZC5yZXF1ZXN0KVxuICAgICAgcmV0dXJuIHRoaXMuX29uRXJyb3IobmV3IEVycm9yKCdFcnJvciBjb21waWxpbmcgaW1hcCBjb21tYW5kIScpKVxuICAgIH1cblxuICAgIHZhciBkYXRhID0gdGhpcy5fY3VycmVudENvbW1hbmQuZGF0YS5zaGlmdCgpXG5cbiAgICB0aGlzLnNlbmQoZGF0YSArICghdGhpcy5fY3VycmVudENvbW1hbmQuZGF0YS5sZW5ndGggPyBFT0wgOiAnJykpXG4gICAgcmV0dXJuIHRoaXMud2FpdERyYWluXG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgb25pZGxlLCBub3RpbmcgdG8gZG8gY3VycmVudGx5XG4gICAqL1xuICBfZW50ZXJJZGxlICgpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5faWRsZVRpbWVyKVxuICAgIHRoaXMuX2lkbGVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gKHRoaXMub25pZGxlICYmIHRoaXMub25pZGxlKCkpLCB0aGlzLnRpbWVvdXRFbnRlcklkbGUpXG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VsIGlkbGUgdGltZXJcbiAgICovXG4gIF9jbGVhcklkbGUgKCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl9pZGxlVGltZXIpXG4gICAgdGhpcy5faWRsZVRpbWVyID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCBwcm9jZXNzZXMgYSByZXNwb25zZSBpbnRvIGFuIGVhc2llciB0byBoYW5kbGUgZm9ybWF0LlxuICAgKiBBZGQgdW50YWdnZWQgbnVtYmVyZWQgcmVzcG9uc2VzIChlLmcuIEZFVENIKSBpbnRvIGEgbmljZWx5IGZlYXNpYmxlIGZvcm1cbiAgICogQ2hlY2tzIGlmIGEgcmVzcG9uc2UgaW5jbHVkZXMgb3B0aW9uYWwgcmVzcG9uc2UgY29kZXNcbiAgICogYW5kIGNvcGllcyB0aGVzZSBpbnRvIHNlcGFyYXRlIHByb3BlcnRpZXMuIEZvciBleGFtcGxlIHRoZVxuICAgKiBmb2xsb3dpbmcgcmVzcG9uc2UgaW5jbHVkZXMgYSBjYXBhYmlsaXR5IGxpc3RpbmcgYW5kIGEgaHVtYW5cbiAgICogcmVhZGFibGUgbWVzc2FnZTpcbiAgICpcbiAgICogICAgICogT0sgW0NBUEFCSUxJVFkgSUQgTkFNRVNQQUNFXSBBbGwgcmVhZHlcbiAgICpcbiAgICogVGhpcyBtZXRob2QgYWRkcyBhICdjYXBhYmlsaXR5JyBwcm9wZXJ0eSB3aXRoIGFuIGFycmF5IHZhbHVlIFsnSUQnLCAnTkFNRVNQQUNFJ11cbiAgICogdG8gdGhlIHJlc3BvbnNlIG9iamVjdC4gQWRkaXRpb25hbGx5ICdBbGwgcmVhZHknIGlzIGFkZGVkIGFzICdodW1hblJlYWRhYmxlJyBwcm9wZXJ0eS5cbiAgICpcbiAgICogU2VlIHBvc3NpYmxlbSBJTUFQIFJlc3BvbnNlIENvZGVzIGF0IGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1NTMwXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSByZXNwb25zZSBQYXJzZWQgcmVzcG9uc2Ugb2JqZWN0XG4gICAqL1xuICBfcHJvY2Vzc1Jlc3BvbnNlIChyZXNwb25zZSkge1xuICAgIGNvbnN0IGNvbW1hbmQgPSBwcm9wT3IoJycsICdjb21tYW5kJywgcmVzcG9uc2UpLnRvVXBwZXJDYXNlKCkudHJpbSgpXG5cbiAgICAvLyBubyBhdHRyaWJ1dGVzXG4gICAgaWYgKCFyZXNwb25zZSB8fCAhcmVzcG9uc2UuYXR0cmlidXRlcyB8fCAhcmVzcG9uc2UuYXR0cmlidXRlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIHVudGFnZ2VkIHJlc3BvbnNlcyB3LyBzZXF1ZW5jZSBudW1iZXJzXG4gICAgaWYgKHJlc3BvbnNlLnRhZyA9PT0gJyonICYmIC9eXFxkKyQvLnRlc3QocmVzcG9uc2UuY29tbWFuZCkgJiYgcmVzcG9uc2UuYXR0cmlidXRlc1swXS50eXBlID09PSAnQVRPTScpIHtcbiAgICAgIHJlc3BvbnNlLm5yID0gTnVtYmVyKHJlc3BvbnNlLmNvbW1hbmQpXG4gICAgICByZXNwb25zZS5jb21tYW5kID0gKHJlc3BvbnNlLmF0dHJpYnV0ZXMuc2hpZnQoKS52YWx1ZSB8fCAnJykudG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpLnRyaW0oKVxuICAgIH1cblxuICAgIC8vIG5vIG9wdGlvbmFsIHJlc3BvbnNlIGNvZGVcbiAgICBpZiAoWydPSycsICdOTycsICdCQUQnLCAnQllFJywgJ1BSRUFVVEgnXS5pbmRleE9mKGNvbW1hbmQpIDwgMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gSWYgbGFzdCBlbGVtZW50IG9mIHRoZSByZXNwb25zZSBpcyBURVhUIHRoZW4gdGhpcyBpcyBmb3IgaHVtYW5zXG4gICAgaWYgKHJlc3BvbnNlLmF0dHJpYnV0ZXNbcmVzcG9uc2UuYXR0cmlidXRlcy5sZW5ndGggLSAxXS50eXBlID09PSAnVEVYVCcpIHtcbiAgICAgIHJlc3BvbnNlLmh1bWFuUmVhZGFibGUgPSByZXNwb25zZS5hdHRyaWJ1dGVzW3Jlc3BvbnNlLmF0dHJpYnV0ZXMubGVuZ3RoIC0gMV0udmFsdWVcbiAgICB9XG5cbiAgICAvLyBQYXJzZSBhbmQgZm9ybWF0IEFUT00gdmFsdWVzXG4gICAgaWYgKHJlc3BvbnNlLmF0dHJpYnV0ZXNbMF0udHlwZSA9PT0gJ0FUT00nICYmIHJlc3BvbnNlLmF0dHJpYnV0ZXNbMF0uc2VjdGlvbikge1xuICAgICAgY29uc3Qgb3B0aW9uID0gcmVzcG9uc2UuYXR0cmlidXRlc1swXS5zZWN0aW9uLm1hcCgoa2V5KSA9PiB7XG4gICAgICAgIGlmICgha2V5KSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoa2V5KSkge1xuICAgICAgICAgIHJldHVybiBrZXkubWFwKChrZXkpID0+IChrZXkudmFsdWUgfHwgJycpLnRvU3RyaW5nKCkudHJpbSgpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiAoa2V5LnZhbHVlIHx8ICcnKS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkudHJpbSgpXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IGtleSA9IG9wdGlvbi5zaGlmdCgpXG4gICAgICByZXNwb25zZS5jb2RlID0ga2V5XG5cbiAgICAgIGlmIChvcHRpb24ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJlc3BvbnNlW2tleS50b0xvd2VyQ2FzZSgpXSA9IG9wdGlvblswXVxuICAgICAgfSBlbHNlIGlmIChvcHRpb24ubGVuZ3RoID4gMSkge1xuICAgICAgICByZXNwb25zZVtrZXkudG9Mb3dlckNhc2UoKV0gPSBvcHRpb25cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgdmFsdWUgaXMgYW4gRXJyb3Igb2JqZWN0XG4gICAqXG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlIFZhbHVlIHRvIGJlIGNoZWNrZWRcbiAgICogQHJldHVybiB7Qm9vbGVhbn0gcmV0dXJucyB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBhbiBFcnJvclxuICAgKi9cbiAgaXNFcnJvciAodmFsdWUpIHtcbiAgICByZXR1cm4gISFPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLm1hdGNoKC9FcnJvclxcXSQvKVxuICB9XG5cbiAgLy8gQ09NUFJFU1NJT04gUkVMQVRFRCBNRVRIT0RTXG5cbiAgLyoqXG4gICAqIFNldHMgdXAgZGVmbGF0ZS9pbmZsYXRlIGZvciB0aGUgSU9cbiAgICovXG4gIGVuYWJsZUNvbXByZXNzaW9uICgpIHtcbiAgICB0aGlzLl9zb2NrZXRPbkRhdGEgPSB0aGlzLnNvY2tldC5vbmRhdGFcbiAgICB0aGlzLmNvbXByZXNzZWQgPSB0cnVlXG5cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lldvcmtlcikge1xuICAgICAgdGhpcy5fY29tcHJlc3Npb25Xb3JrZXIgPSBuZXcgV29ya2VyKFVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW0NvbXByZXNzaW9uQmxvYl0pKSlcbiAgICAgIHRoaXMuX2NvbXByZXNzaW9uV29ya2VyLm9ubWVzc2FnZSA9IChlKSA9PiB7XG4gICAgICAgIHZhciBtZXNzYWdlID0gZS5kYXRhLm1lc3NhZ2VcbiAgICAgICAgdmFyIGRhdGEgPSBlLmRhdGEuYnVmZmVyXG5cbiAgICAgICAgc3dpdGNoIChtZXNzYWdlKSB7XG4gICAgICAgICAgY2FzZSBNRVNTQUdFX0lORkxBVEVEX0RBVEFfUkVBRFk6XG4gICAgICAgICAgICB0aGlzLl9zb2NrZXRPbkRhdGEoeyBkYXRhIH0pXG4gICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgY2FzZSBNRVNTQUdFX0RFRkxBVEVEX0RBVEFfUkVBRFk6XG4gICAgICAgICAgICB0aGlzLndhaXREcmFpbiA9IHRoaXMuc29ja2V0LnNlbmQoZGF0YSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5fY29tcHJlc3Npb25Xb3JrZXIub25lcnJvciA9IChlKSA9PiB7XG4gICAgICAgIHRoaXMuX29uRXJyb3IobmV3IEVycm9yKCdFcnJvciBoYW5kbGluZyBjb21wcmVzc2lvbiB3ZWIgd29ya2VyOiAnICsgZS5tZXNzYWdlKSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5fY29tcHJlc3Npb25Xb3JrZXIucG9zdE1lc3NhZ2UoY3JlYXRlTWVzc2FnZShNRVNTQUdFX0lOSVRJQUxJWkVfV09SS0VSKSlcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaW5mbGF0ZWRSZWFkeSA9IChidWZmZXIpID0+IHsgdGhpcy5fc29ja2V0T25EYXRhKHsgZGF0YTogYnVmZmVyIH0pIH1cbiAgICAgIGNvbnN0IGRlZmxhdGVkUmVhZHkgPSAoYnVmZmVyKSA9PiB7IHRoaXMud2FpdERyYWluID0gdGhpcy5zb2NrZXQuc2VuZChidWZmZXIpIH1cbiAgICAgIHRoaXMuX2NvbXByZXNzaW9uID0gbmV3IENvbXByZXNzaW9uKGluZmxhdGVkUmVhZHksIGRlZmxhdGVkUmVhZHkpXG4gICAgfVxuXG4gICAgLy8gb3ZlcnJpZGUgZGF0YSBoYW5kbGVyLCBkZWNvbXByZXNzIGluY29taW5nIGRhdGFcbiAgICB0aGlzLnNvY2tldC5vbmRhdGEgPSAoZXZ0KSA9PiB7XG4gICAgICBpZiAoIXRoaXMuY29tcHJlc3NlZCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2NvbXByZXNzaW9uV29ya2VyKSB7XG4gICAgICAgIHRoaXMuX2NvbXByZXNzaW9uV29ya2VyLnBvc3RNZXNzYWdlKGNyZWF0ZU1lc3NhZ2UoTUVTU0FHRV9JTkZMQVRFLCBldnQuZGF0YSksIFtldnQuZGF0YV0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9jb21wcmVzc2lvbi5pbmZsYXRlKGV2dC5kYXRhKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbmRvZXMgYW55IGNoYW5nZXMgcmVsYXRlZCB0byBjb21wcmVzc2lvbi4gVGhpcyBvbmx5IGJlIGNhbGxlZCB3aGVuIGNsb3NpbmcgdGhlIGNvbm5lY3Rpb25cbiAgICovXG4gIF9kaXNhYmxlQ29tcHJlc3Npb24gKCkge1xuICAgIGlmICghdGhpcy5jb21wcmVzc2VkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmNvbXByZXNzZWQgPSBmYWxzZVxuICAgIHRoaXMuc29ja2V0Lm9uZGF0YSA9IHRoaXMuX3NvY2tldE9uRGF0YVxuICAgIHRoaXMuX3NvY2tldE9uRGF0YSA9IG51bGxcblxuICAgIGlmICh0aGlzLl9jb21wcmVzc2lvbldvcmtlcikge1xuICAgICAgLy8gdGVybWluYXRlIHRoZSB3b3JrZXJcbiAgICAgIHRoaXMuX2NvbXByZXNzaW9uV29ya2VyLnRlcm1pbmF0ZSgpXG4gICAgICB0aGlzLl9jb21wcmVzc2lvbldvcmtlciA9IG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT3V0Z29pbmcgcGF5bG9hZCBuZWVkcyB0byBiZSBjb21wcmVzc2VkIGFuZCBzZW50IHRvIHNvY2tldFxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5QnVmZmVyfSBidWZmZXIgT3V0Z29pbmcgdW5jb21wcmVzc2VkIGFycmF5YnVmZmVyXG4gICAqL1xuICBfc2VuZENvbXByZXNzZWQgKGJ1ZmZlcikge1xuICAgIC8vIGRlZmxhdGVcbiAgICBpZiAodGhpcy5fY29tcHJlc3Npb25Xb3JrZXIpIHtcbiAgICAgIHRoaXMuX2NvbXByZXNzaW9uV29ya2VyLnBvc3RNZXNzYWdlKGNyZWF0ZU1lc3NhZ2UoTUVTU0FHRV9ERUZMQVRFLCBidWZmZXIpLCBbYnVmZmVyXSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY29tcHJlc3Npb24uZGVmbGF0ZShidWZmZXIpXG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGNyZWF0ZU1lc3NhZ2UgPSAobWVzc2FnZSwgYnVmZmVyKSA9PiAoeyBtZXNzYWdlLCBidWZmZXIgfSlcbiJdfQ== + diff --git a/dist/special-use-unit.js b/dist/special-use-unit.js new file mode 100644 index 0000000..738633e --- /dev/null +++ b/dist/special-use-unit.js @@ -0,0 +1,42 @@ +"use strict"; + +var _specialUse = require("./special-use"); + +/* eslint-disable no-unused-expressions */ + +/* eslint-disable no-useless-escape */ +describe('checkSpecialUse', () => { + it('should return a matching special use flag', () => { + expect((0, _specialUse.checkSpecialUse)({ + flags: ['test', '\\All'] + })).to.equal('\\All'); + }); + it('should fail for non-existent flag', () => { + expect((0, _specialUse.checkSpecialUse)({})).to.be.false; + }); + it('should fail for invalid flag', () => { + expect((0, _specialUse.checkSpecialUse)({ + flags: ['test'] + })).to.be.false; + }); + it('should return special use flag if a matching name is found', () => { + expect((0, _specialUse.checkSpecialUse)({ + name: 'test' + })).to.be.false; + expect((0, _specialUse.checkSpecialUse)({ + name: 'Praht' + })).to.equal('\\Trash'); + expect((0, _specialUse.checkSpecialUse)({ + flags: ['\HasChildren'], + // not a special use flag + name: 'Praht' + })).to.equal('\\Trash'); + }); + it('should prefer matching special use flag over a matching name', () => { + expect((0, _specialUse.checkSpecialUse)({ + flags: ['\\All'], + name: 'Praht' + })).to.equal('\\All'); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9zcGVjaWFsLXVzZS11bml0LmpzIl0sIm5hbWVzIjpbImRlc2NyaWJlIiwiaXQiLCJleHBlY3QiLCJmbGFncyIsInRvIiwiZXF1YWwiLCJiZSIsImZhbHNlIiwibmFtZSJdLCJtYXBwaW5ncyI6Ijs7QUFHQTs7QUFIQTs7QUFDQTtBQUlBQSxRQUFRLENBQUMsaUJBQUQsRUFBb0IsTUFBTTtBQUNoQ0MsRUFBQUEsRUFBRSxDQUFDLDJDQUFELEVBQThDLE1BQU07QUFDcERDLElBQUFBLE1BQU0sQ0FBQyxpQ0FBZ0I7QUFDckJDLE1BQUFBLEtBQUssRUFBRSxDQUFDLE1BQUQsRUFBUyxPQUFUO0FBRGMsS0FBaEIsQ0FBRCxDQUFOLENBRUlDLEVBRkosQ0FFT0MsS0FGUCxDQUVhLE9BRmI7QUFHRCxHQUpDLENBQUY7QUFNQUosRUFBQUEsRUFBRSxDQUFDLG1DQUFELEVBQXNDLE1BQU07QUFDNUNDLElBQUFBLE1BQU0sQ0FBQyxpQ0FBZ0IsRUFBaEIsQ0FBRCxDQUFOLENBQTRCRSxFQUE1QixDQUErQkUsRUFBL0IsQ0FBa0NDLEtBQWxDO0FBQ0QsR0FGQyxDQUFGO0FBSUFOLEVBQUFBLEVBQUUsQ0FBQyw4QkFBRCxFQUFpQyxNQUFNO0FBQ3ZDQyxJQUFBQSxNQUFNLENBQUMsaUNBQWdCO0FBQ3JCQyxNQUFBQSxLQUFLLEVBQUUsQ0FBQyxNQUFEO0FBRGMsS0FBaEIsQ0FBRCxDQUFOLENBRUlDLEVBRkosQ0FFT0UsRUFGUCxDQUVVQyxLQUZWO0FBR0QsR0FKQyxDQUFGO0FBTUFOLEVBQUFBLEVBQUUsQ0FBQyw0REFBRCxFQUErRCxNQUFNO0FBQ3JFQyxJQUFBQSxNQUFNLENBQUMsaUNBQWdCO0FBQ3JCTSxNQUFBQSxJQUFJLEVBQUU7QUFEZSxLQUFoQixDQUFELENBQU4sQ0FFSUosRUFGSixDQUVPRSxFQUZQLENBRVVDLEtBRlY7QUFHQUwsSUFBQUEsTUFBTSxDQUFDLGlDQUFnQjtBQUNyQk0sTUFBQUEsSUFBSSxFQUFFO0FBRGUsS0FBaEIsQ0FBRCxDQUFOLENBRUlKLEVBRkosQ0FFT0MsS0FGUCxDQUVhLFNBRmI7QUFHQUgsSUFBQUEsTUFBTSxDQUFDLGlDQUFnQjtBQUNyQkMsTUFBQUEsS0FBSyxFQUFFLENBQUMsY0FBRCxDQURjO0FBQ0k7QUFDekJLLE1BQUFBLElBQUksRUFBRTtBQUZlLEtBQWhCLENBQUQsQ0FBTixDQUdJSixFQUhKLENBR09DLEtBSFAsQ0FHYSxTQUhiO0FBSUQsR0FYQyxDQUFGO0FBYUFKLEVBQUFBLEVBQUUsQ0FBQyw4REFBRCxFQUFpRSxNQUFNO0FBQ3ZFQyxJQUFBQSxNQUFNLENBQUMsaUNBQWdCO0FBQ3JCQyxNQUFBQSxLQUFLLEVBQUUsQ0FBQyxPQUFELENBRGM7QUFFckJLLE1BQUFBLElBQUksRUFBRTtBQUZlLEtBQWhCLENBQUQsQ0FBTixDQUdJSixFQUhKLENBR09DLEtBSFAsQ0FHYSxPQUhiO0FBSUQsR0FMQyxDQUFGO0FBTUQsQ0FwQ08sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC1leHByZXNzaW9ucyAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tdXNlbGVzcy1lc2NhcGUgKi9cblxuaW1wb3J0IHsgY2hlY2tTcGVjaWFsVXNlIH0gZnJvbSAnLi9zcGVjaWFsLXVzZSdcblxuZGVzY3JpYmUoJ2NoZWNrU3BlY2lhbFVzZScsICgpID0+IHtcbiAgaXQoJ3Nob3VsZCByZXR1cm4gYSBtYXRjaGluZyBzcGVjaWFsIHVzZSBmbGFnJywgKCkgPT4ge1xuICAgIGV4cGVjdChjaGVja1NwZWNpYWxVc2Uoe1xuICAgICAgZmxhZ3M6IFsndGVzdCcsICdcXFxcQWxsJ11cbiAgICB9KSkudG8uZXF1YWwoJ1xcXFxBbGwnKVxuICB9KVxuXG4gIGl0KCdzaG91bGQgZmFpbCBmb3Igbm9uLWV4aXN0ZW50IGZsYWcnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGNoZWNrU3BlY2lhbFVzZSh7fSkpLnRvLmJlLmZhbHNlXG4gIH0pXG5cbiAgaXQoJ3Nob3VsZCBmYWlsIGZvciBpbnZhbGlkIGZsYWcnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGNoZWNrU3BlY2lhbFVzZSh7XG4gICAgICBmbGFnczogWyd0ZXN0J11cbiAgICB9KSkudG8uYmUuZmFsc2VcbiAgfSlcblxuICBpdCgnc2hvdWxkIHJldHVybiBzcGVjaWFsIHVzZSBmbGFnIGlmIGEgbWF0Y2hpbmcgbmFtZSBpcyBmb3VuZCcsICgpID0+IHtcbiAgICBleHBlY3QoY2hlY2tTcGVjaWFsVXNlKHtcbiAgICAgIG5hbWU6ICd0ZXN0J1xuICAgIH0pKS50by5iZS5mYWxzZVxuICAgIGV4cGVjdChjaGVja1NwZWNpYWxVc2Uoe1xuICAgICAgbmFtZTogJ1ByYWh0J1xuICAgIH0pKS50by5lcXVhbCgnXFxcXFRyYXNoJylcbiAgICBleHBlY3QoY2hlY2tTcGVjaWFsVXNlKHtcbiAgICAgIGZsYWdzOiBbJ1xcSGFzQ2hpbGRyZW4nXSwgLy8gbm90IGEgc3BlY2lhbCB1c2UgZmxhZ1xuICAgICAgbmFtZTogJ1ByYWh0J1xuICAgIH0pKS50by5lcXVhbCgnXFxcXFRyYXNoJylcbiAgfSlcblxuICBpdCgnc2hvdWxkIHByZWZlciBtYXRjaGluZyBzcGVjaWFsIHVzZSBmbGFnIG92ZXIgYSBtYXRjaGluZyBuYW1lJywgKCkgPT4ge1xuICAgIGV4cGVjdChjaGVja1NwZWNpYWxVc2Uoe1xuICAgICAgZmxhZ3M6IFsnXFxcXEFsbCddLFxuICAgICAgbmFtZTogJ1ByYWh0J1xuICAgIH0pKS50by5lcXVhbCgnXFxcXEFsbCcpXG4gIH0pXG59KVxuIl19 \ No newline at end of file diff --git a/package.json b/package.json index 7a473e8..a868c78 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ }, "repository": { "type": "git", - "url": "git://github.com/emailjs/emailjs-imap-client.git" + "url": "git+https://github.com/pipedrive/emailjs-imap-client.git" }, "main": "dist/index", "dependencies": { diff --git a/src/imap.js b/src/imap.js index 905cfcc..2543e0b 100644 --- a/src/imap.js +++ b/src/imap.js @@ -345,9 +345,9 @@ export default class Imap { this._sendCompressed(buffer) } else { if (!this.socket) { - this._onError(new Error("Error :: Unexpected socket close")); + this._onError(new Error('Error :: Unexpected socket close')) } else { - this.socket.send(buffer); + this.socket.send(buffer) } } }