UNPKG

50.7 kBJavaScriptView Raw
1"use strict";
2
3var _stringify = require("babel-runtime/core-js/json/stringify");
4
5var _stringify2 = _interopRequireDefault(_stringify);
6
7var _toConsumableArray2 = require("babel-runtime/helpers/toConsumableArray");
8
9var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
10
11var _regenerator = require("babel-runtime/regenerator");
12
13var _regenerator2 = _interopRequireDefault(_regenerator);
14
15var _createClass2 = require("babel-runtime/helpers/createClass");
16
17var _createClass3 = _interopRequireDefault(_createClass2);
18
19var _classCallCheck2 = require("babel-runtime/helpers/classCallCheck");
20
21var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
22
23var _promise = require("babel-runtime/core-js/promise");
24
25var _promise2 = _interopRequireDefault(_promise);
26
27function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
28
29var __awaiter = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) {
30 return new (P || (P = _promise2.default))(function (resolve, reject) {
31 function fulfilled(value) {
32 try {
33 step(generator.next(value));
34 } catch (e) {
35 reject(e);
36 }
37 }
38 function rejected(value) {
39 try {
40 step(generator.throw(value));
41 } catch (e) {
42 reject(e);
43 }
44 }
45 function step(result) {
46 result.done ? resolve(result.value) : new P(function (resolve) {
47 resolve(result.value);
48 }).then(fulfilled, rejected);
49 }
50 step((generator = generator.apply(thisArg, _arguments)).next());
51 });
52};
53var typestore_1 = require("typestore");
54var IndexedDBConstants_1 = require("./IndexedDBConstants");
55var log = typestore_1.Log.create(__filename);
56/**
57 * Super simple plain jain key for now
58 * what you send to the constructor comes out the
59 * other end
60 *
61 * just like poop!
62 */
63
64var IndexedDBKeyValue = function IndexedDBKeyValue() {
65 (0, _classCallCheck3.default)(this, IndexedDBKeyValue);
66
67 this.indexedDBKey = true;
68
69 for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
70 args[_key] = arguments[_key];
71 }
72
73 this.args = args;
74};
75
76exports.IndexedDBKeyValue = IndexedDBKeyValue;
77
78var IndexedDBRepoPlugin = function () {
79 /**
80 * Construct a new repo/store
81 * manager for a given repo/model
82 *
83 * @param store
84 * @param repo
85 */
86 function IndexedDBRepoPlugin(store, repo) {
87 (0, _classCallCheck3.default)(this, IndexedDBRepoPlugin);
88
89 this.store = store;
90 this.repo = repo;
91 this.type = typestore_1.PluginType.Repo | typestore_1.PluginType.Finder;
92 this.supportedModels = [repo.modelClazz];
93 this.keys = repo.modelType.options.attrs.filter(function (attr) {
94 return attr.primaryKey || attr.secondaryKey;
95 }).map(function (attr) {
96 return attr.name;
97 });
98 repo.attach(this);
99 }
100 /**
101 * Create a finder method with descriptor
102 * and signature
103 *
104 * @param repo
105 * @param finderKey
106 * @returns {any}
107 */
108
109
110 (0, _createClass3.default)(IndexedDBRepoPlugin, [{
111 key: "decorateFinder",
112 value: function decorateFinder(repo, finderKey) {
113 var _this = this;
114
115 var finderOpts = typestore_1.getMetadata(IndexedDBConstants_1.IndexedDBFinderKey, this.repo, finderKey);
116 if (!finderOpts) return null;
117 var fn = finderOpts.fn;
118 var filter = finderOpts.filter;
119
120 if (!fn && !filter) throw new Error('finder or fn properties MUST be provided on an indexeddb finder descriptor');
121 return function () {
122 for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
123 args[_key2] = arguments[_key2];
124 }
125
126 return __awaiter(_this, void 0, void 0, _regenerator2.default.mark(function _callee() {
127 var results, mapper, mappedResults;
128 return _regenerator2.default.wrap(function _callee$(_context) {
129 while (1) {
130 switch (_context.prev = _context.next) {
131 case 0:
132 _context.next = 2;
133 return fn ? fn.apply(undefined, [this].concat(args)) : this.table.filter(function (record) {
134 return filter.apply(undefined, [record].concat(args));
135 }).toArray();
136
137 case 2:
138 results = _context.sent;
139 mapper = this.mapper;
140 mappedResults = results.map(function (record) {
141 return mapper.fromObject(record);
142 });
143 return _context.abrupt("return", finderOpts.singleResult ? mappedResults[0] : mappedResults);
144
145 case 6:
146 case "end":
147 return _context.stop();
148 }
149 }
150 }, _callee, this);
151 }));
152 };
153 }
154 /**
155 * Handle a plugin event
156 *
157 * @param eventType
158 * @param args
159 * @returns {boolean}
160 */
161
162 }, {
163 key: "handle",
164 value: function handle(eventType) {
165 return false;
166 }
167 /**
168 * Model mapper
169 *
170 * @returns {IModelMapper<M>}
171 */
172
173 }, {
174 key: "init",
175 value: function init(coordinator, opts) {
176 return __awaiter(this, void 0, void 0, _regenerator2.default.mark(function _callee2() {
177 return _regenerator2.default.wrap(function _callee2$(_context2) {
178 while (1) {
179 switch (_context2.prev = _context2.next) {
180 case 0:
181 return _context2.abrupt("return", this.coordinator = coordinator);
182
183 case 1:
184 case "end":
185 return _context2.stop();
186 }
187 }
188 }, _callee2, this);
189 }));
190 }
191 }, {
192 key: "start",
193 value: function start() {
194 return __awaiter(this, void 0, void 0, _regenerator2.default.mark(function _callee3() {
195 return _regenerator2.default.wrap(function _callee3$(_context3) {
196 while (1) {
197 switch (_context3.prev = _context3.next) {
198 case 0:
199 return _context3.abrupt("return", this.coordinator);
200
201 case 1:
202 case "end":
203 return _context3.stop();
204 }
205 }
206 }, _callee3, this);
207 }));
208 }
209 }, {
210 key: "stop",
211 value: function stop() {
212 return __awaiter(this, void 0, void 0, _regenerator2.default.mark(function _callee4() {
213 return _regenerator2.default.wrap(function _callee4$(_context4) {
214 while (1) {
215 switch (_context4.prev = _context4.next) {
216 case 0:
217 return _context4.abrupt("return", this.coordinator);
218
219 case 1:
220 case "end":
221 return _context4.stop();
222 }
223 }
224 }, _callee4, this);
225 }));
226 }
227 }, {
228 key: "key",
229 value: function key() {
230 for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
231 args[_key3] = arguments[_key3];
232 }
233
234 return new (Function.prototype.bind.apply(IndexedDBKeyValue, [null].concat(args)))();
235 }
236 }, {
237 key: "keyFromObject",
238 value: function keyFromObject(o) {
239 return new (Function.prototype.bind.apply(IndexedDBKeyValue, [null].concat((0, _toConsumableArray3.default)(this.keys.map(function (key) {
240 return o[key];
241 })))))();
242 }
243 }, {
244 key: "dbKeyFromKey",
245 value: function dbKeyFromKey(key) {
246 return key.args[0];
247 }
248 }, {
249 key: "get",
250 value: function get(key) {
251 return __awaiter(this, void 0, void 0, _regenerator2.default.mark(function _callee5() {
252 var _this2 = this;
253
254 var dbObjects;
255 return _regenerator2.default.wrap(function _callee5$(_context5) {
256 while (1) {
257 switch (_context5.prev = _context5.next) {
258 case 0:
259 key = key.indexedDBKey ? key : this.key(key);
260 _context5.next = 3;
261 return this.table.filter(function (record) {
262 var recordKey = _this2.keyFromObject(record);
263 return Array.isEqual(key.args, recordKey.args);
264 }).toArray();
265
266 case 3:
267 dbObjects = _context5.sent;
268
269 if (!(dbObjects.length === 0)) {
270 _context5.next = 8;
271 break;
272 }
273
274 return _context5.abrupt("return", null);
275
276 case 8:
277 if (!(dbObjects.length > 1)) {
278 _context5.next = 10;
279 break;
280 }
281
282 throw new Error("More than one database object returned for key: " + (0, _stringify2.default)(key.args));
283
284 case 10:
285 return _context5.abrupt("return", this.repo.getMapper(this.repo.modelClazz).fromObject(dbObjects[0]));
286
287 case 11:
288 case "end":
289 return _context5.stop();
290 }
291 }
292 }, _callee5, this);
293 }));
294 }
295 }, {
296 key: "save",
297 value: function save(model) {
298 return __awaiter(this, void 0, void 0, _regenerator2.default.mark(function _callee6() {
299 var mapper, json;
300 return _regenerator2.default.wrap(function _callee6$(_context6) {
301 while (1) {
302 switch (_context6.prev = _context6.next) {
303 case 0:
304 mapper = this.mapper;
305 json = mapper.toObject(model);
306 _context6.prev = 2;
307 _context6.next = 5;
308 return this.table.put(json);
309
310 case 5:
311 this.repo.triggerPersistenceEvent(typestore_1.ModelPersistenceEventType.Save, model);
312 _context6.next = 13;
313 break;
314
315 case 8:
316 _context6.prev = 8;
317 _context6.t0 = _context6["catch"](2);
318
319 log.error('Failed to persist model', _context6.t0);
320 log.error('Failed persisted json', json, model);
321 throw _context6.t0;
322
323 case 13:
324 return _context6.abrupt("return", model);
325
326 case 14:
327 case "end":
328 return _context6.stop();
329 }
330 }
331 }, _callee6, this, [[2, 8]]);
332 }));
333 }
334 /**
335 * Remove implementation
336 *
337 * @param key
338 * @returns {Promise<void>}
339 */
340
341 }, {
342 key: "remove",
343 value: function remove(key) {
344 return __awaiter(this, void 0, void 0, _regenerator2.default.mark(function _callee7() {
345 var model, result;
346 return _regenerator2.default.wrap(function _callee7$(_context7) {
347 while (1) {
348 switch (_context7.prev = _context7.next) {
349 case 0:
350 key = key.indexedDBKey ? key : this.key(key);
351
352 if (!this.repo.supportPersistenceEvents()) {
353 _context7.next = 7;
354 break;
355 }
356
357 _context7.next = 4;
358 return this.get(key);
359
360 case 4:
361 _context7.t0 = _context7.sent;
362 _context7.next = 8;
363 break;
364
365 case 7:
366 _context7.t0 = null;
367
368 case 8:
369 model = _context7.t0;
370 _context7.next = 11;
371 return this.table.delete(key.args[0]);
372
373 case 11:
374 result = _context7.sent;
375
376 if (model) this.repo.triggerPersistenceEvent(typestore_1.ModelPersistenceEventType.Remove, model);
377 return _context7.abrupt("return", _promise2.default.resolve(result));
378
379 case 14:
380 case "end":
381 return _context7.stop();
382 }
383 }
384 }, _callee7, this);
385 }));
386 }
387 }, {
388 key: "count",
389 value: function count() {
390 return _promise2.default.resolve(this.table.count());
391 }
392 /**
393 * Bulk get
394 *
395 * @param keys
396 * @returns {any}
397 */
398
399 }, {
400 key: "bulkGet",
401 value: function bulkGet() {
402 for (var _len4 = arguments.length, keys = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
403 keys[_key4] = arguments[_key4];
404 }
405
406 return __awaiter(this, void 0, void 0, _regenerator2.default.mark(function _callee8() {
407 var _this3 = this;
408
409 var promises;
410 return _regenerator2.default.wrap(function _callee8$(_context8) {
411 while (1) {
412 switch (_context8.prev = _context8.next) {
413 case 0:
414 keys = keys.map(function (key) {
415 return key.indexedDBKey ? key : _this3.key(key);
416 });
417 promises = keys.map(function (key) {
418 return _this3.get(key);
419 });
420 _context8.next = 4;
421 return _promise2.default.all(promises);
422
423 case 4:
424 return _context8.abrupt("return", _context8.sent);
425
426 case 5:
427 case "end":
428 return _context8.stop();
429 }
430 }
431 }, _callee8, this);
432 }));
433 }
434 /**
435 * Bulk save/put
436 *
437 * @param models
438 * @returns {M[]}
439 */
440
441 }, {
442 key: "bulkSave",
443 value: function bulkSave() {
444 for (var _len5 = arguments.length, models = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
445 models[_key5] = arguments[_key5];
446 }
447
448 return __awaiter(this, void 0, void 0, _regenerator2.default.mark(function _callee9() {
449 var _repo;
450
451 var mapper, jsons;
452 return _regenerator2.default.wrap(function _callee9$(_context9) {
453 while (1) {
454 switch (_context9.prev = _context9.next) {
455 case 0:
456 mapper = this.repo.getMapper(this.repo.modelClazz);
457 jsons = models.map(function (model) {
458 return mapper.toObject(model);
459 });
460 _context9.next = 4;
461 return this.table.bulkPut(jsons);
462
463 case 4:
464 (_repo = this.repo).triggerPersistenceEvent.apply(_repo, [typestore_1.ModelPersistenceEventType.Save].concat(models));
465 return _context9.abrupt("return", models);
466
467 case 6:
468 case "end":
469 return _context9.stop();
470 }
471 }
472 }, _callee9, this);
473 }));
474 }
475 /**
476 * Bulk remove
477 *
478 * @param keys
479 * @returns {IndexedDBKeyValue[]}
480 */
481
482 }, {
483 key: "bulkRemove",
484 value: function bulkRemove() {
485 for (var _len6 = arguments.length, keys = Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
486 keys[_key6] = arguments[_key6];
487 }
488
489 return __awaiter(this, void 0, void 0, _regenerator2.default.mark(function _callee10() {
490 var _this4 = this,
491 _repo2;
492
493 var models, dbKeys;
494 return _regenerator2.default.wrap(function _callee10$(_context10) {
495 while (1) {
496 switch (_context10.prev = _context10.next) {
497 case 0:
498 keys = keys.map(function (key) {
499 return key.indexedDBKey ? key : _this4.key(key);
500 });
501
502 if (!this.repo.supportPersistenceEvents()) {
503 _context10.next = 7;
504 break;
505 }
506
507 _context10.next = 4;
508 return this.bulkGet.apply(this, (0, _toConsumableArray3.default)(keys));
509
510 case 4:
511 _context10.t0 = _context10.sent;
512 _context10.next = 8;
513 break;
514
515 case 7:
516 _context10.t0 = null;
517
518 case 8:
519 models = _context10.t0;
520 dbKeys = keys.map(function (key) {
521 return _this4.dbKeyFromKey(key);
522 });
523 _context10.next = 12;
524 return this.table.bulkDelete(dbKeys);
525
526 case 12:
527 if (models) (_repo2 = this.repo).triggerPersistenceEvent.apply(_repo2, [typestore_1.ModelPersistenceEventType.Remove].concat((0, _toConsumableArray3.default)(models)));
528 return _context10.abrupt("return", keys);
529
530 case 14:
531 case "end":
532 return _context10.stop();
533 }
534 }
535 }, _callee10, this);
536 }));
537 }
538 }, {
539 key: "mapper",
540 get: function get() {
541 return this.repo.getMapper(this.repo.modelClazz);
542 }
543 /**
544 * Get dexie table
545 *
546 * @returns {Dexie.Table<any, any>}
547 */
548
549 }, {
550 key: "table",
551 get: function get() {
552 return this.store.table(this.repo.modelType);
553 }
554 /**
555 * Get db ref
556 *
557 * @returns {Dexie}
558 */
559
560 }, {
561 key: "db",
562 get: function get() {
563 return this.store.db;
564 }
565 }]);
566 return IndexedDBRepoPlugin;
567}();
568
569exports.IndexedDBRepoPlugin = IndexedDBRepoPlugin;
570//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkluZGV4ZWREQlJlcG9QbHVnaW4uanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxJQUFJLFlBQWEsYUFBUSxVQUFLLFNBQWQsSUFBNEIsVUFBVSxPQUFWLEVBQW1CLFVBQW5CLEVBQStCLENBQS9CLEVBQWtDLFNBQWxDLEVBQTZDO0FBQ3JGLFdBQU8sS0FBSyxNQUFNLHFCQUFOLENBQUwsRUFBeUIsVUFBVSxPQUFWLEVBQW1CLE1BQW5CLEVBQTJCO0FBQ3ZELGlCQUFTLFNBQVQsQ0FBbUIsS0FBbkIsRUFBMEI7QUFBRSxnQkFBSTtBQUFFLHFCQUFLLFVBQVUsSUFBVixDQUFlLEtBQWYsQ0FBTDtBQUE4QixhQUFwQyxDQUFxQyxPQUFPLENBQVAsRUFBVTtBQUFFLHVCQUFPLENBQVA7QUFBWTtBQUFFO0FBQzNGLGlCQUFTLFFBQVQsQ0FBa0IsS0FBbEIsRUFBeUI7QUFBRSxnQkFBSTtBQUFFLHFCQUFLLFVBQVUsS0FBVixDQUFnQixLQUFoQixDQUFMO0FBQStCLGFBQXJDLENBQXNDLE9BQU8sQ0FBUCxFQUFVO0FBQUUsdUJBQU8sQ0FBUDtBQUFZO0FBQUU7QUFDM0YsaUJBQVMsSUFBVCxDQUFjLE1BQWQsRUFBc0I7QUFBRSxtQkFBTyxJQUFQLEdBQWMsUUFBUSxPQUFPLEtBQWYsQ0FBZCxHQUFzQyxJQUFJLENBQUosQ0FBTSxVQUFVLE9BQVYsRUFBbUI7QUFBRSx3QkFBUSxPQUFPLEtBQWY7QUFBd0IsYUFBbkQsRUFBcUQsSUFBckQsQ0FBMEQsU0FBMUQsRUFBcUUsUUFBckUsQ0FBdEM7QUFBdUg7QUFDL0ksYUFBSyxDQUFDLFlBQVksVUFBVSxLQUFWLENBQWdCLE9BQWhCLEVBQXlCLFVBQXpCLENBQWIsRUFBbUQsSUFBbkQsRUFBTDtBQUNILEtBTE0sQ0FBUDtBQU1ILENBUEQ7QUFRQSxJQUFNLGNBQWMsUUFBUSxXQUFSLENBQXBCO0FBQ0EsSUFBTSx1QkFBdUIsUUFBUSxzQkFBUixDQUE3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VCxDQUFsQztBQUFBLGlDQUFULENBQVA7O0FBRG1DLHFDQUVuQixLQUFLLElBQUwsQ0FBVSx3QkFBVixFQUZtQjtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBLHVDQUd6QixLQUFLLE9BQUwsOENBQWdCLElBQWhCLEVBSHlCOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUEsZ0RBR0QsSUFIQzs7QUFBQTtBQUU3QixzQ0FGNkI7QUFJN0Isc0NBSjZCLEdBSXBCLEtBQUssR0FBTCxDQUFTO0FBQUEsMkNBQU8sT0FBSyxZQUFMLENBQWtCLEdBQWxCLENBQVA7QUFBQSxpQ0FBVCxDQUpvQjtBQUFBO0FBQUEsdUNBSzdCLEtBQUssS0FBTCxDQUFXLFVBQVgsQ0FBc0IsTUFBdEIsQ0FMNkI7O0FBQUE7QUFNbkMsb0NBQUksTUFBSixFQUNJLGVBQUssSUFBTCxFQUFVLHVCQUFWLGdCQUFrQyxZQUFZLHlCQUFaLENBQXNDLE1BQXhFLDBDQUFtRixNQUFuRjtBQVArQixtRUFRNUIsSUFSNEI7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsYUFBaEMsRUFBUDtBQVVIOzs7NEJBNUlZO0FBQ1QsbUJBQU8sS0FBSyxJQUFMLENBQVUsU0FBVixDQUFvQixLQUFLLElBQUwsQ0FBVSxVQUE5QixDQUFQO0FBQ0g7QUFDRDs7Ozs7Ozs7NEJBS1k7QUFDUixtQkFBTyxLQUFLLEtBQUwsQ0FBVyxLQUFYLENBQWlCLEtBQUssSUFBTCxDQUFVLFNBQTNCLENBQVA7QUFDSDtBQUNEOzs7Ozs7Ozs0QkFLUztBQUNMLG1CQUFPLEtBQUssS0FBTCxDQUFXLEVBQWxCO0FBQ0g7Ozs7O0FBNEhMLFFBQVEsbUJBQVIsR0FBOEIsbUJBQTlCIiwiZmlsZSI6IkluZGV4ZWREQlJlcG9QbHVnaW4uanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLnRocm93KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHJlc3VsdC52YWx1ZSk7IH0pLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMpKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmNvbnN0IHR5cGVzdG9yZV8xID0gcmVxdWlyZShcInR5cGVzdG9yZVwiKTtcbmNvbnN0IEluZGV4ZWREQkNvbnN0YW50c18xID0gcmVxdWlyZShcIi4vSW5kZXhlZERCQ29uc3RhbnRzXCIpO1xuY29uc3QgbG9nID0gdHlwZXN0b3JlXzEuTG9nLmNyZWF0ZShfX2ZpbGVuYW1lKTtcbi8qKlxuICogU3VwZXIgc2ltcGxlIHBsYWluIGphaW4ga2V5IGZvciBub3dcbiAqIHdoYXQgeW91IHNlbmQgdG8gdGhlIGNvbnN0cnVjdG9yIGNvbWVzIG91dCB0aGVcbiAqIG90aGVyIGVuZFxuICpcbiAqIGp1c3QgbGlrZSBwb29wIVxuICovXG5jbGFzcyBJbmRleGVkREJLZXlWYWx1ZSB7XG4gICAgY29uc3RydWN0b3IoLi4uYXJncykge1xuICAgICAgICB0aGlzLmluZGV4ZWREQktleSA9IHRydWU7XG4gICAgICAgIHRoaXMuYXJncyA9IGFyZ3M7XG4gICAgfVxufVxuZXhwb3J0cy5JbmRleGVkREJLZXlWYWx1ZSA9IEluZGV4ZWREQktleVZhbHVlO1xuY2xhc3MgSW5kZXhlZERCUmVwb1BsdWdpbiB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0IGEgbmV3IHJlcG8vc3RvcmVcbiAgICAgKiBtYW5hZ2VyIGZvciBhIGdpdmVuIHJlcG8vbW9kZWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdG9yZVxuICAgICAqIEBwYXJhbSByZXBvXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc3RvcmUsIHJlcG8pIHtcbiAgICAgICAgdGhpcy5zdG9yZSA9IHN0b3JlO1xuICAgICAgICB0aGlzLnJlcG8gPSByZXBvO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlc3RvcmVfMS5QbHVnaW5UeXBlLlJlcG8gfCB0eXBlc3RvcmVfMS5QbHVnaW5UeXBlLkZpbmRlcjtcbiAgICAgICAgdGhpcy5zdXBwb3J0ZWRNb2RlbHMgPSBbcmVwby5tb2RlbENsYXp6XTtcbiAgICAgICAgdGhpcy5rZXlzID0gcmVwby5tb2RlbFR5cGUub3B0aW9ucy5hdHRyc1xuICAgICAgICAgICAgLmZpbHRlcihhdHRyID0+IGF0dHIucHJpbWFyeUtleSB8fCBhdHRyLnNlY29uZGFyeUtleSlcbiAgICAgICAgICAgIC5tYXAoYXR0ciA9PiBhdHRyLm5hbWUpO1xuICAgICAgICByZXBvLmF0dGFjaCh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgZmluZGVyIG1ldGhvZCB3aXRoIGRlc2NyaXB0b3JcbiAgICAgKiBhbmQgc2lnbmF0dXJlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVwb1xuICAgICAqIEBwYXJhbSBmaW5kZXJLZXlcbiAgICAgKiBAcmV0dXJucyB7YW55fVxuICAgICAqL1xuICAgIGRlY29yYXRlRmluZGVyKHJlcG8sIGZpbmRlcktleSkge1xuICAgICAgICBjb25zdCBmaW5kZXJPcHRzID0gdHlwZXN0b3JlXzEuZ2V0TWV0YWRhdGEoSW5kZXhlZERCQ29uc3RhbnRzXzEuSW5kZXhlZERCRmluZGVyS2V5LCB0aGlzLnJlcG8sIGZpbmRlcktleSk7XG4gICAgICAgIGlmICghZmluZGVyT3B0cylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCB7IGZuLCBmaWx0ZXIgfSA9IGZpbmRlck9wdHM7XG4gICAgICAgIGlmICghZm4gJiYgIWZpbHRlcilcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZmluZGVyIG9yIGZuIHByb3BlcnRpZXMgTVVTVCBiZSBwcm92aWRlZCBvbiBhbiBpbmRleGVkZGIgZmluZGVyIGRlc2NyaXB0b3InKTtcbiAgICAgICAgcmV0dXJuICguLi5hcmdzKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0cyA9IHlpZWxkICgoZm4pID8gZm4odGhpcywgLi4uYXJncykgOiB0aGlzLnRhYmxlXG4gICAgICAgICAgICAgICAgLmZpbHRlcihyZWNvcmQgPT4gZmlsdGVyKHJlY29yZCwgLi4uYXJncykpXG4gICAgICAgICAgICAgICAgLnRvQXJyYXkoKSk7XG4gICAgICAgICAgICBjb25zdCBtYXBwZXIgPSB0aGlzLm1hcHBlcjtcbiAgICAgICAgICAgIGNvbnN0IG1hcHBlZFJlc3VsdHMgPSByZXN1bHRzLm1hcChyZWNvcmQgPT4gbWFwcGVyLmZyb21PYmplY3QocmVjb3JkKSk7XG4gICAgICAgICAgICByZXR1cm4gZmluZGVyT3B0cy5zaW5nbGVSZXN1bHQgPyBtYXBwZWRSZXN1bHRzWzBdIDogbWFwcGVkUmVzdWx0cztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBhIHBsdWdpbiBldmVudFxuICAgICAqXG4gICAgICogQHBhcmFtIGV2ZW50VHlwZVxuICAgICAqIEBwYXJhbSBhcmdzXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaGFuZGxlKGV2ZW50VHlwZSwgLi4uYXJncykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1vZGVsIG1hcHBlclxuICAgICAqXG4gICAgICogQHJldHVybnMge0lNb2RlbE1hcHBlcjxNPn1cbiAgICAgKi9cbiAgICBnZXQgbWFwcGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXBvLmdldE1hcHBlcih0aGlzLnJlcG8ubW9kZWxDbGF6eik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBkZXhpZSB0YWJsZVxuICAgICAqXG4gICAgICogQHJldHVybnMge0RleGllLlRhYmxlPGFueSwgYW55Pn1cbiAgICAgKi9cbiAgICBnZXQgdGFibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLnRhYmxlKHRoaXMucmVwby5tb2RlbFR5cGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgZGIgcmVmXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7RGV4aWV9XG4gICAgICovXG4gICAgZ2V0IGRiKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5kYjtcbiAgICB9XG4gICAgaW5pdChjb29yZGluYXRvciwgb3B0cykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuICh0aGlzLmNvb3JkaW5hdG9yID0gY29vcmRpbmF0b3IpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhcnQoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb29yZGluYXRvcjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0b3AoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb29yZGluYXRvcjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGtleSguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5kZXhlZERCS2V5VmFsdWUoLi4uYXJncyk7XG4gICAgfVxuICAgIGtleUZyb21PYmplY3Qobykge1xuICAgICAgICByZXR1cm4gbmV3IEluZGV4ZWREQktleVZhbHVlKC4uLnRoaXMua2V5cy5tYXAoa2V5ID0+IG9ba2V5XSkpO1xuICAgIH1cbiAgICBkYktleUZyb21LZXkoa2V5KSB7XG4gICAgICAgIHJldHVybiBrZXkuYXJnc1swXTtcbiAgICB9XG4gICAgZ2V0KGtleSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAga2V5ID0ga2V5LmluZGV4ZWREQktleSA/IGtleSA6IHRoaXMua2V5KGtleSk7XG4gICAgICAgICAgICBjb25zdCBkYk9iamVjdHMgPSB5aWVsZCB0aGlzLnRhYmxlXG4gICAgICAgICAgICAgICAgLmZpbHRlcihyZWNvcmQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZEtleSA9IHRoaXMua2V5RnJvbU9iamVjdChyZWNvcmQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0VxdWFsKGtleS5hcmdzLCByZWNvcmRLZXkuYXJncyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC50b0FycmF5KCk7XG4gICAgICAgICAgICBpZiAoZGJPYmplY3RzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGVsc2UgaWYgKGRiT2JqZWN0cy5sZW5ndGggPiAxKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTW9yZSB0aGFuIG9uZSBkYXRhYmFzZSBvYmplY3QgcmV0dXJuZWQgZm9yIGtleTogJHtKU09OLnN0cmluZ2lmeShrZXkuYXJncyl9YCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXBvLmdldE1hcHBlcih0aGlzLnJlcG8ubW9kZWxDbGF6eikuZnJvbU9iamVjdChkYk9iamVjdHNbMF0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2F2ZShtb2RlbCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgbWFwcGVyID0gdGhpcy5tYXBwZXI7XG4gICAgICAgICAgICBjb25zdCBqc29uID0gbWFwcGVyLnRvT2JqZWN0KG1vZGVsKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgeWllbGQgdGhpcy50YWJsZS5wdXQoanNvbik7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXBvLnRyaWdnZXJQZXJzaXN0ZW5jZUV2ZW50KHR5cGVzdG9yZV8xLk1vZGVsUGVyc2lzdGVuY2VFdmVudFR5cGUuU2F2ZSwgbW9kZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcignRmFpbGVkIHRvIHBlcnNpc3QgbW9kZWwnLCBlcnIpO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcignRmFpbGVkIHBlcnNpc3RlZCBqc29uJywganNvbiwgbW9kZWwpO1xuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtb2RlbDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBpbXBsZW1lbnRhdGlvblxuICAgICAqXG4gICAgICogQHBhcmFtIGtleVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgICAqL1xuICAgIHJlbW92ZShrZXkpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGtleSA9IGtleS5pbmRleGVkREJLZXkgPyBrZXkgOiB0aGlzLmtleShrZXkpO1xuICAgICAgICAgICAgY29uc3QgbW9kZWwgPSAodGhpcy5yZXBvLnN1cHBvcnRQZXJzaXN0ZW5jZUV2ZW50cygpKSA/XG4gICAgICAgICAgICAgICAgeWllbGQgdGhpcy5nZXQoa2V5KSA6IG51bGw7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCB0aGlzLnRhYmxlLmRlbGV0ZShrZXkuYXJnc1swXSk7XG4gICAgICAgICAgICBpZiAobW9kZWwpXG4gICAgICAgICAgICAgICAgdGhpcy5yZXBvLnRyaWdnZXJQZXJzaXN0ZW5jZUV2ZW50KHR5cGVzdG9yZV8xLk1vZGVsUGVyc2lzdGVuY2VFdmVudFR5cGUuUmVtb3ZlLCBtb2RlbCk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLnRhYmxlLmNvdW50KCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBCdWxrIGdldFxuICAgICAqXG4gICAgICogQHBhcmFtIGtleXNcbiAgICAgKiBAcmV0dXJucyB7YW55fVxuICAgICAqL1xuICAgIGJ1bGtHZXQoLi4ua2V5cykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAga2V5cyA9IGtleXMubWFwKGtleSA9PiAoa2V5LmluZGV4ZWREQktleSkgPyBrZXkgOiB0aGlzLmtleShrZXkpKTtcbiAgICAgICAgICAgIGNvbnN0IHByb21pc2VzID0ga2V5cy5tYXAoa2V5ID0+IHRoaXMuZ2V0KGtleSkpO1xuICAgICAgICAgICAgcmV0dXJuIHlpZWxkIFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEJ1bGsgc2F2ZS9wdXRcbiAgICAgKlxuICAgICAqIEBwYXJhbSBtb2RlbHNcbiAgICAgKiBAcmV0dXJucyB7TVtdfVxuICAgICAqL1xuICAgIGJ1bGtTYXZlKC4uLm1vZGVscykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgbWFwcGVyID0gdGhpcy5yZXBvLmdldE1hcHBlcih0aGlzLnJlcG8ubW9kZWxDbGF6eik7XG4gICAgICAgICAgICBjb25zdCBqc29ucyA9IG1vZGVscy5tYXAobW9kZWwgPT4gbWFwcGVyLnRvT2JqZWN0KG1vZGVsKSk7XG4gICAgICAgICAgICB5aWVsZCB0aGlzLnRhYmxlLmJ1bGtQdXQoanNvbnMpO1xuICAgICAgICAgICAgdGhpcy5yZXBvLnRyaWdnZXJQZXJzaXN0ZW5jZUV2ZW50KHR5cGVzdG9yZV8xLk1vZGVsUGVyc2lzdGVuY2VFdmVudFR5cGUuU2F2ZSwgLi4ubW9kZWxzKTtcbiAgICAgICAgICAgIHJldHVybiBtb2RlbHM7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBCdWxrIHJlbW92ZVxuICAgICAqXG4gICAgICogQHBhcmFtIGtleXNcbiAgICAgKiBAcmV0dXJucyB7SW5kZXhlZERCS2V5VmFsdWVbXX1cbiAgICAgKi9cbiAgICBidWxrUmVtb3ZlKC4uLmtleXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGtleXMgPSBrZXlzLm1hcChrZXkgPT4gKGtleS5pbmRleGVkREJLZXkpID8ga2V5IDogdGhpcy5rZXkoa2V5KSk7XG4gICAgICAgICAgICBjb25zdCBtb2RlbHMgPSAodGhpcy5yZXBvLnN1cHBvcnRQZXJzaXN0ZW5jZUV2ZW50cygpKSA/XG4gICAgICAgICAgICAgICAgeWllbGQgdGhpcy5idWxrR2V0KC4uLmtleXMpIDogbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGRiS2V5cyA9IGtleXMubWFwKGtleSA9PiB0aGlzLmRiS2V5RnJvbUtleShrZXkpKTtcbiAgICAgICAgICAgIHlpZWxkIHRoaXMudGFibGUuYnVsa0RlbGV0ZShkYktleXMpO1xuICAgICAgICAgICAgaWYgKG1vZGVscylcbiAgICAgICAgICAgICAgICB0aGlzLnJlcG8udHJpZ2dlclBlcnNpc3RlbmNlRXZlbnQodHlwZXN0b3JlXzEuTW9kZWxQZXJzaXN0ZW5jZUV2ZW50VHlwZS5SZW1vdmUsIC4uLm1vZGVscyk7XG4gICAgICAgICAgICByZXR1cm4ga2V5cztcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5JbmRleGVkREJSZXBvUGx1Z2luID0gSW5kZXhlZERCUmVwb1BsdWdpbjtcbiJdfQ==
571//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkluZGV4ZWREQlJlcG9QbHVnaW4uanMiLCJJbmRleGVkREJSZXBvUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsSUFBSSxZQUFhLGFBQVEsVUFBSyxTQUFkLElBQTRCLFVBQVUsT0FBVixFQUFtQixVQUFuQixFQUErQixDQUEvQixFQUFrQyxTQUFsQyxFQUE2QztBQUNyRixXQUFPLEtBQUssTUFBTSxxQkFBTixDQUFMLEVBQXlCLFVBQVUsT0FBVixFQUFtQixNQUFuQixFQUEyQjtBQUN2RCxpQkFBUyxTQUFULENBQW1CLEtBQW5CLEVBQTBCO0FBQUUsZ0JBQUk7QUFBRSxxQkFBSyxVQUFVLElBQVYsQ0FBZSxLQUFmLENBQUw7QUFBOEIsYUFBcEMsQ0FBcUMsT0FBTyxDQUFQLEVBQVU7QUFBRSx1QkFBTyxDQUFQO0FBQVk7QUFBRTtBQUMzRixpQkFBUyxRQUFULENBQWtCLEtBQWxCLEVBQXlCO0FBQUUsZ0JBQUk7QUFBRSxxQkFBSyxVQUFVLEtBQVYsQ0FBZ0IsS0FBaEIsQ0FBTDtBQUErQixhQUFyQyxDQUFzQyxPQUFPLENBQVAsRUFBVTtBQUFFLHVCQUFPLENBQVA7QUFBWTtBQUFFO0FBQzNGLGlCQUFTLElBQVQsQ0FBYyxNQUFkLEVBQXNCO0FBQUUsbUJBQU8sSUFBUCxHQUFjLFFBQVEsT0FBTyxLQUFmLENBQWQsR0FBc0MsSUFBSSxDQUFKLENBQU0sVUFBVSxPQUFWLEVBQW1CO0FBQUUsd0JBQVEsT0FBTyxLQUFmO0FBQXdCLGFBQW5ELEVBQXFELElBQXJELENBQTBELFNBQTFELEVBQXFFLFFBQXJFLENBQXRDO0FBQXVIO0FBQy9JLGFBQUssQ0FBQyxZQUFZLFVBQVUsS0FBVixDQUFnQixPQUFoQixFQUF5QixVQUF6QixDQUFiLEVBQW1ELElBQW5ELEVBQUw7QUFDSCxLQUxNLENBQVA7QUFNSCxDQVBEO0FDREEsSUFBQSxjQUFBLFFBQUEsV0FBQSxDQUFBO0FBbUJBLElBQUEsdUJBQUEsUUFBQSxzQkFBQSxDQUFBO0FBR0EsSUFBTSxNQUFNLFlBQUEsR0FBQSxDQUFJLE1BQUosQ0FBVyxVQUFYLENBQVo7QUFFQTs7Ozs7Ozs7SUFPQSxpQixHQU1DLDZCQUF5QjtBQUFBOztBQUZ6QixTQUFBLFlBQUEsR0FBZSxJQUFmOztBQUV5QixzQ0FBVixJQUFVO0FBQVYsWUFBVTtBQUFBOztBQUN4QixTQUFLLElBQUwsR0FBWSxJQUFaO0FBQ0EsQzs7QUFSRixRQUFBLGlCQUFBLEdBQUEsaUJBQUE7O0lBV0EsbUI7QUFRQzs7Ozs7OztBQU9BLGlDQUFvQixLQUFwQixFQUFrRCxJQUFsRCxFQUE4RDtBQUFBOztBQUExQyxhQUFBLEtBQUEsR0FBQSxLQUFBO0FBQThCLGFBQUEsSUFBQSxHQUFBLElBQUE7QUFibEQsYUFBQSxJQUFBLEdBQU8sWUFBQSxVQUFBLENBQVcsSUFBWCxHQUFrQixZQUFBLFVBQUEsQ0FBVyxNQUFwQztBQWNDLGFBQUssZUFBTCxHQUF1QixDQUFDLEtBQUssVUFBTixDQUF2QjtBQUNBLGFBQUssSUFBTCxHQUFZLEtBQUssU0FBTCxDQUFlLE9BQWYsQ0FBdUIsS0FBdkIsQ0FDVixNQURVLENBQ0g7QUFBQSxtQkFBUSxLQUFLLFVBQUwsSUFBbUIsS0FBSyxZQUFoQztBQUFBLFNBREcsRUFFVixHQUZVLENBRU47QUFBQSxtQkFBUSxLQUFLLElBQWI7QUFBQSxTQUZNLENBQVo7QUFLQSxhQUFLLE1BQUwsQ0FBWSxJQUFaO0FBQ0E7QUFFRDs7Ozs7Ozs7Ozs7O3VDQVFlLEksRUFBZ0IsUyxFQUFnQjtBQUFBOztBQUM5QyxnQkFBTSxhQUFhLFlBQUEsV0FBQSxDQUNsQixxQkFBQSxrQkFEa0IsRUFFbEIsS0FBSyxJQUZhLEVBR2xCLFNBSGtCLENBQW5CO0FBTUEsZ0JBQUksQ0FBQyxVQUFMLEVBQ0MsT0FBTyxJQUFQO0FBUjZDLGdCQVV2QyxFQVZ1QyxHQVV6QixVQVZ5QixDQVV2QyxFQVZ1QztBQUFBLGdCQVVuQyxNQVZtQyxHQVV6QixVQVZ5QixDQVVuQyxNQVZtQzs7QUFXOUMsZ0JBQUksQ0FBQyxFQUFELElBQU8sQ0FBQyxNQUFaLEVBQ0MsTUFBTSxJQUFJLEtBQUosQ0FBVSw0RUFBVixDQUFOO0FBRUQsbUJBQU87QUFBQSxtREFBUyxJQUFUO0FBQVMsd0JBQVQ7QUFBQTs7QUFBQSx1QkFBYSxpQkFBQSxLQUFBLENBQUEsRUFBQSxLQUFBLENBQUEsNkJBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSwyQ0FFRyxFQUFELEdBQU8scUJBQUcsSUFBSCxTQUFZLElBQVosRUFBUCxHQUEyQixLQUFLLEtBQUwsQ0FDOUMsTUFEOEMsQ0FDdkM7QUFBQSwrQ0FBVSx5QkFBTyxNQUFQLFNBQWtCLElBQWxCLEVBQVY7QUFBQSxxQ0FEdUMsRUFFOUMsT0FGOEMsRUFGN0I7O0FBQUE7QUFFZiwyQ0FGZTtBQU9iLDBDQVBhLEdBT0osS0FBSyxNQVBEO0FBU2IsaURBVGEsR0FTRyxRQUFRLEdBQVIsQ0FBWTtBQUFBLCtDQUFVLE9BQU8sVUFBUCxDQUFrQixNQUFsQixDQUFWO0FBQUEscUNBQVosQ0FUSDtBQUFBLHFFQVVaLFdBQVcsWUFBWCxHQUEwQixjQUFjLENBQWQsQ0FBMUIsR0FBNkMsYUFWakM7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsaUJBQUEsRUFBYjtBQUFBLGFBQVA7QUFZQTtBQUVEOzs7Ozs7Ozs7OytCQU9PLFMsRUFBa0M7QUFDeEMsbUJBQU8sS0FBUDtBQUNBO0FBRUQ7Ozs7Ozs7OzZCQTRCVyxXLEVBQTBCLEksRUFBd0I7QUR2Q3RELG1CQUFPLFVBQVUsSUFBVixFQUFnQixLQUFLLENBQXJCLEVBQXdCLEtBQUssQ0FBN0IsNkJBQWdDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxrRUN3Q3JDLEtBQUssV0FBTCxHQUFtQixXRHhDa0I7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsYUFBaEMsRUFBUDtBQ3lDTjs7O2dDQUVVO0FEdENKLG1CQUFPLFVBQVUsSUFBVixFQUFnQixLQUFLLENBQXJCLEVBQXdCLEtBQUssQ0FBN0IsNkJBQWdDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxrRUN1Q3RDLEtBQUssV0R2Q2lDOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGFBQWhDLEVBQVA7QUN3Q047OzsrQkFFUztBRHJDSCxtQkFBTyxVQUFVLElBQVYsRUFBZ0IsS0FBSyxDQUFyQixFQUF3QixLQUFLLENBQTdCLDZCQUFnQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsa0VDc0N0QyxLQUFLLFdEdENpQzs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxhQUFoQyxFQUFQO0FDdUNOOzs7OEJBRVU7QUFBQSwrQ0FBSixJQUFJO0FBQUosb0JBQUk7QUFBQTs7QUFDVixzREFBVyxpQkFBWCxnQkFBZ0MsSUFBaEM7QUFDQTs7O3NDQUVhLEMsRUFBSztBQUNsQixzREFBVyxpQkFBWCxpREFBZ0MsS0FBSyxJQUFMLENBQVUsR0FBVixDQUFjO0FBQUEsdUJBQU8sRUFBRSxHQUFGLENBQVA7QUFBQSxhQUFkLENBQWhDO0FBQ0E7OztxQ0FFWSxHLEVBQXFCO0FBQ2pDLG1CQUFPLElBQUksSUFBSixDQUFTLENBQVQsQ0FBUDtBQUNBOzs7NEJBRVMsRyxFQUFxQjtBRHZDeEIsbUJBQU8sVUFBVSxJQUFWLEVBQWdCLEtBQUssQ0FBckIsRUFBd0IsS0FBSyxDQUE3Qiw2QkFBZ0M7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FDd0M3QyxzQ0FBTSxJQUFJLFlBQUosR0FBbUIsR0FBbkIsR0FBeUIsS0FBSyxHQUFMLENBQVMsR0FBVCxDQUEvQjtBRHhDNkM7QUFBQSx1Q0MyQ3JCLEtBQUssS0FBTCxDQUN0QixNQURzQixDQUNmLGtCQUFNO0FBRWIsd0NBQU0sWUFBWSxPQUFLLGFBQUwsQ0FBbUIsTUFBbkIsQ0FBbEI7QUFDQSwyQ0FBTyxNQUFNLE9BQU4sQ0FBYyxJQUFJLElBQWxCLEVBQXdCLFVBQVUsSUFBbEMsQ0FBUDtBQUNBLGlDQUxzQixFQU10QixPQU5zQixFRDNDcUI7O0FBQUE7QUMyQ3ZDLHlDRDNDdUM7O0FBQUEsc0NDbUR6QyxVQUFVLE1BQVYsS0FBcUIsQ0RuRG9CO0FBQUE7QUFBQTtBQUFBOztBQUFBLGtFQ29EckMsSURwRHFDOztBQUFBO0FBQUEsc0NDcURwQyxVQUFVLE1BQVYsR0FBbUIsQ0RyRGlCO0FBQUE7QUFBQTtBQUFBOztBQUFBLHNDQ3NEdEMsSUFBSSxLQUFKLHNEQUE2RCx5QkFBZSxJQUFJLElBQW5CLENBQTdELENEdERzQzs7QUFBQTtBQUFBLGtFQ3dEdEMsS0FBSyxJQUFMLENBQVUsU0FBVixDQUFvQixLQUFLLElBQUwsQ0FBVSxVQUE5QixFQUEwQyxVQUExQyxDQUFxRCxVQUFVLENBQVYsQ0FBckQsQ0R4RHNDOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGFBQWhDLEVBQVA7QUMyRE47Ozs2QkFFVSxLLEVBQU87QUQ3Q1gsbUJBQU8sVUFBVSxJQUFWLEVBQWdCLEtBQUssQ0FBckIsRUFBd0IsS0FBSyxDQUE3Qiw2QkFBZ0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FDOEN2QyxzQ0Q5Q3VDLEdDOEM5QixLQUFLLE1EOUN5QjtBQytDdkMsb0NEL0N1QyxHQytDaEMsT0FBTyxRQUFQLENBQWdCLEtBQWhCLENEL0NnQztBQUFBO0FBQUE7QUFBQSx1Q0NrRHRDLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxJQUFmLENEbERzQzs7QUFBQTtBQ21ENUMscUNBQUssSUFBTCxDQUFVLHVCQUFWLENBQWtDLFlBQUEseUJBQUEsQ0FBMEIsSUFBNUQsRUFBa0UsS0FBbEU7QURuRDRDO0FBQUE7O0FBQUE7QUFBQTtBQUFBOztBQ3FENUMsb0NBQUksS0FBSixDQUFVLHlCQUFWO0FBQ0Esb0NBQUksS0FBSixDQUFVLHVCQUFWLEVBQWtDLElBQWxDLEVBQXVDLEtBQXZDO0FEdEQ0Qzs7QUFBQTtBQUFBLGtFQzBEdEMsS0QxRHNDOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGFBQWhDLEVBQVA7QUMyRE47QUFFRDs7Ozs7Ozs7OytCQU1hLEcsRUFBcUI7QUQ3QzNCLG1CQUFPLFVBQVUsSUFBVixFQUFnQixLQUFLLENBQXJCLEVBQXdCLEtBQUssQ0FBN0IsNkJBQWdDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQzhDN0Msc0NBQU0sSUFBSSxZQUFKLEdBQW1CLEdBQW5CLEdBQXlCLEtBQUssR0FBTCxDQUFTLEdBQVQsQ0FBL0I7O0FEOUM2QyxxQ0NnRDlCLEtBQUssSUFBTCxDQUFVLHdCQUFWLEVEaEQ4QjtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBLHVDQ2lEdEMsS0FBSyxHQUFMLENBQVMsR0FBVCxDRGpEc0M7O0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQSwrQ0NpRHRCLElEakRzQjs7QUFBQTtBQ2dEdkMscUNEaER1QztBQUFBO0FBQUEsdUNDbUR4QixLQUFLLEtBQUwsQ0FBVyxNQUFYLENBQWtCLElBQUksSUFBSixDQUFTLENBQVQsQ0FBbEIsQ0RuRHdCOztBQUFBO0FDbUR2QyxzQ0RuRHVDOztBQ3FEN0Msb0NBQUksS0FBSixFQUNDLEtBQUssSUFBTCxDQUFVLHVCQUFWLENBQWtDLFlBQUEseUJBQUEsQ0FBMEIsTUFBNUQsRUFBbUUsS0FBbkU7QUR0RDRDLGtFQ3dEdEMsa0JBQVEsT0FBUixDQUFnQixNQUFoQixDRHhEc0M7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsYUFBaEMsRUFBUDtBQ3lETjs7O2dDQUVJO0FBQ0osbUJBQU8sa0JBQVEsT0FBUixDQUFnQixLQUFLLEtBQUwsQ0FBVyxLQUFYLEVBQWhCLENBQVA7QUFDQTtBQUVEOzs7Ozs7Ozs7a0NBTXlDO0FBQUEsK0NBQXhCLElBQXdCO0FBQXhCLG9CQUF3QjtBQUFBOztBRGpEbEMsbUJBQU8sVUFBVSxJQUFWLEVBQWdCLEtBQUssQ0FBckIsRUFBd0IsS0FBSyxDQUE3Qiw2QkFBZ0M7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FDa0Q3Qyx1Q0FBTyxLQUFLLEdBQUwsQ0FBUztBQUFBLDJDQUFRLElBQUksWUFBTCxHQUFxQixHQUFyQixHQUEyQixPQUFLLEdBQUwsQ0FBUyxHQUFULENBQWxDO0FBQUEsaUNBQVQsQ0FBUDtBQUVNLHdDRHBEdUMsR0NvRDVCLEtBQUssR0FBTCxDQUFTO0FBQUEsMkNBQU8sT0FBSyxHQUFMLENBQVMsR0FBVCxDQUFQO0FBQUEsaUNBQVQsQ0RwRDRCO0FBQUE7QUFBQSx1Q0NxRGhDLGtCQUFRLEdBQVIsQ0FBWSxRQUFaLENEckRnQzs7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGFBQWhDLEVBQVA7QUNzRE47QUFFRDs7Ozs7Ozs7O21DQU00QjtBQUFBLCtDQUFWLE1BQVU7QUFBVixzQkFBVTtBQUFBOztBRGpEckIsbUJBQU8sVUFBVSxJQUFWLEVBQWdCLEtBQUssQ0FBckIsRUFBd0IsS0FBSyxDQUE3Qiw2QkFBZ0M7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FDa0R2QyxzQ0RsRHVDLEdDa0Q5QixLQUFLLElBQUwsQ0FBVSxTQUFWLENBQW9CLEtBQUssSUFBTCxDQUFVLFVBQTlCLENEbEQ4QjtBQ21EdkMscUNEbkR1QyxHQ21EL0IsT0FBTyxHQUFQLENBQVc7QUFBQSwyQ0FBUyxPQUFPLFFBQVAsQ0FBZ0IsS0FBaEIsQ0FBVDtBQUFBLGlDQUFYLENEbkQrQjtBQUFBO0FBQUEsdUNDcUR0QyxLQUFLLEtBQUwsQ0FBbUIsT0FBbkIsQ0FBMkIsS0FBM0IsQ0RyRHNDOztBQUFBO0FDc0Q3Qyw4Q0FBSyxJQUFMLEVBQVUsdUJBQVYsZUFBa0MsWUFBQSx5QkFBQSxDQUEwQixJQUE1RCxTQUFvRSxNQUFwRTtBRHRENkMsa0VDd0R0QyxNRHhEc0M7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsYUFBaEMsRUFBUDtBQ3lETjtBQUVEOzs7Ozs7Ozs7cUNBTTRDO0FBQUEsK0NBQXhCLElBQXdCO0FBQXhCLG9CQUF3QjtBQUFBOztBRGxEckMsbUJBQU8sVUFBVSxJQUFWLEVBQWdCLEtBQUssQ0FBckIsRUFBd0IsS0FBSyxDQUE3Qiw2QkFBZ0M7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUNtRDdDLHVDQUFPLEtBQUssR0FBTCxDQUFTO0FBQUEsMkNBQVEsSUFBSSxZQUFMLEdBQXFCLEdBQXJCLEdBQTJCLE9BQUssR0FBTCxDQUFTLEdBQVQsQ0FBbEM7QUFBQSxpQ0FBVCxDQUFQOztBRG5ENkMscUNDcUQ3QixLQUFLLElBQUwsQ0FBVSx3QkFBVixFRHJENkI7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQSx1Q0NzRHRDLEtBQUssT0FBTCw4Q0FBZ0IsSUFBaEIsRUR0RHNDOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUEsZ0RDc0RkLElEdERjOztBQUFBO0FDcUR2QyxzQ0RyRHVDO0FDd0R2QyxzQ0R4RHVDLEdDd0Q5QixLQUFLLEdBQUwsQ0FBUztBQUFBLDJDQUFPLE9BQUssWUFBTCxDQUFrQixHQUFsQixDQUFQO0FBQUEsaUNBQVQsQ0R4RDhCO0FBQUE7QUFBQSx1Q0MwRHRDLEtBQUssS0FBTCxDQUFtQixVQUFuQixDQUE4QixNQUE5QixDRDFEc0M7O0FBQUE7QUM0RDdDLG9DQUFJLE1BQUosRUFDQyxlQUFLLElBQUwsRUFBVSx1QkFBVixnQkFBa0MsWUFBQSx5QkFBQSxDQUEwQixNQUE1RCwwQ0FBc0UsTUFBdEU7QUQ3RDRDLG1FQytEdEMsSUQvRHNDOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGFBQWhDLEVBQVA7QUNnRU47Ozs0QkE5SlM7QUFDVCxtQkFBTyxLQUFLLElBQUwsQ0FBVSxTQUFWLENBQW9CLEtBQUssSUFBTCxDQUFVLFVBQTlCLENBQVA7QUFDQTtBQUVEOzs7Ozs7Ozs0QkFLUztBQUNSLG1CQUFPLEtBQUssS0FBTCxDQUFXLEtBQVgsQ0FBaUIsS0FBSyxJQUFMLENBQVUsU0FBM0IsQ0FBUDtBQUNBO0FBRUQ7Ozs7Ozs7OzRCQUtNO0FBQ0wsbUJBQU8sS0FBSyxLQUFMLENBQVcsRUFBbEI7QUFDQTs7Ozs7QUFqR0YsUUFBQSxtQkFBQSxHQUFBLG1CQUFBIiwiZmlsZSI6IkluZGV4ZWREQlJlcG9QbHVnaW4uanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL2pnbGFuei9EZXZlbG9wbWVudC9kZW5zZWJyYWluL2VwaWN0YXNrLXdvcmtzcGFjZS90eXBlc3RvcmUvcGFja2FnZXMvdHlwZXN0b3JlLXBsdWdpbi1pbmRleGVkZGIvc3JjIn0=