UNPKG

@neocomplexx/ngx-neo-indexeddb

Version:

This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.0.5.

474 lines (464 loc) 41.4 kB
(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core')) : typeof define === 'function' && define.amd ? define('@neocomplexx/ngx-neo-indexeddb', ['exports', '@angular/core'], factory) : (factory((global.neocomplexx = global.neocomplexx || {}, global.neocomplexx['ngx-neo-indexeddb'] = {}),global.ng.core)); }(this, (function (exports,core) { 'use strict'; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ var NgxNeoIndexedDbModule = /** @class */ (function () { function NgxNeoIndexedDbModule() { } /** * @return {?} */ NgxNeoIndexedDbModule.forRoot = /** * @return {?} */ function () { return { ngModule: NgxNeoIndexedDbModule, providers: [] }; }; NgxNeoIndexedDbModule.decorators = [ { type: core.NgModule, args: [{ declarations: [], imports: [], exports: [] },] } ]; return NgxNeoIndexedDbModule; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ var DbWrapper = /** @class */ (function () { function DbWrapper(dbName, version) { this.dbName = dbName; this.dbVersion = version || 1; this.db = null; } /** * @param {?} storeName * @return {?} */ DbWrapper.prototype.validateStoreName = /** * @param {?} storeName * @return {?} */ function (storeName) { return this.db.objectStoreNames.contains(storeName); }; /** * @param {?} storeName * @param {?} reject * @return {?} */ DbWrapper.prototype.validateBeforeTransaction = /** * @param {?} storeName * @param {?} reject * @return {?} */ function (storeName, reject) { if (!this.db) { reject('You need to use the openDatabase function to create a database before you query it!'); } if (!this.validateStoreName(storeName)) { reject(('objectStore does not exists: ' + storeName)); } }; /** * @param {?} options * @return {?} */ DbWrapper.prototype.createTransaction = /** * @param {?} options * @return {?} */ function (options) { /** @type {?} */ var trans = this.db.transaction(options.storeName, options.dbMode); trans.onerror = options.error; trans.oncomplete = options.complete; trans.onabort = options.abort; return trans; }; return DbWrapper; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ var Utils = /** @class */ (function () { function Utils() { this.indexedDB = window.indexedDB || (( /** @type {?} */(window))).mozIndexedDB || (( /** @type {?} */(window))).webkitIndexedDB || (( /** @type {?} */(window))).msIndexedDB; } return Utils; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ var NgxNeoIDB = /** @class */ (function () { function NgxNeoIDB(dbName, version) { this.utils = new Utils(); this.dbWrapper = new DbWrapper(dbName, version); } /** * @param {?} version * @param {?=} upgradeCallback * @return {?} */ NgxNeoIDB.prototype.openDatabase = /** * @param {?} version * @param {?=} upgradeCallback * @return {?} */ function (version, upgradeCallback) { var _this = this; return new Promise(function (resolve, reject) { _this.dbWrapper.dbVersion = version; /** @type {?} */ var request = _this.utils.indexedDB.open(_this.dbWrapper.dbName, version); request.onsuccess = function (e) { _this.dbWrapper.db = request.result; resolve(); }; request.onerror = function (e) { reject('IndexedDB error: ' + (( /** @type {?} */(e.target))).errorCode ? (( /** @type {?} */(e.target))).errorCode + ' (' + (( /** @type {?} */(e.target))).error + ')' : (( /** @type {?} */(e.target))).errorCode); }; if (typeof upgradeCallback === 'function') { request.onupgradeneeded = function (e) { upgradeCallback(e, _this.dbWrapper.db); }; } }); }; /** * @param {?} storeName * @param {?} key * @return {?} */ NgxNeoIDB.prototype.getByKey = /** * @param {?} storeName * @param {?} key * @return {?} */ function (storeName, key) { var _this = this; return new Promise(function (resolve, reject) { _this.dbWrapper.validateBeforeTransaction(storeName, reject); /** @type {?} */ var transaction = _this.dbWrapper.createTransaction({ storeName: storeName, dbMode: 'readonly', error: function (e) { reject(e); }, complete: function (e) { } }); /** @type {?} */ var objectStore = transaction.objectStore(storeName); /** @type {?} */ var request; request = objectStore.get(key); request.onsuccess = function (event) { resolve((( /** @type {?} */(event.target))).result); }; }); }; /** * @param {?} storeName * @param {?=} keyRange * @param {?=} indexDetails * @return {?} */ NgxNeoIDB.prototype.getAll = /** * @param {?} storeName * @param {?=} keyRange * @param {?=} indexDetails * @return {?} */ function (storeName, keyRange, indexDetails) { var _this = this; return new Promise(function (resolve, reject) { _this.dbWrapper.validateBeforeTransaction(storeName, reject); /** @type {?} */ var transaction = _this.dbWrapper.createTransaction({ storeName: storeName, dbMode: 'readonly', error: function (e) { reject(e); }, complete: function (e) { } }); /** @type {?} */ var objectStore = transaction.objectStore(storeName); /** @type {?} */ var result = []; /** @type {?} */ var request; if (indexDetails) { /** @type {?} */ var index = objectStore.index(indexDetails.indexName); /** @type {?} */ var order = (indexDetails.order === 'desc') ? 'prev' : 'next'; request = index.openCursor(keyRange, ( /** @type {?} */(order))); } else { request = objectStore.openCursor(keyRange); } request.onerror = function (e) { reject(e); }; request.onsuccess = function (evt) { /** @type {?} */ var cursor = (( /** @type {?} */(evt.target))).result; if (cursor) { result.push(cursor.value); cursor['continue'](); } else { resolve(result); } }; }); }; /** * @param {?} storeName * @param {?} value * @param {?=} key * @return {?} */ NgxNeoIDB.prototype.add = /** * @param {?} storeName * @param {?} value * @param {?=} key * @return {?} */ function (storeName, value, key) { var _this = this; return new Promise(function (resolve, reject) { _this.dbWrapper.validateBeforeTransaction(storeName, reject); /** @type {?} */ var transaction = _this.dbWrapper.createTransaction({ storeName: storeName, dbMode: 'readwrite', error: function (e) { reject(e); }, complete: function (e) { resolve({ key: key, value: value }); } }); /** @type {?} */ var objectStore = transaction.objectStore(storeName); /** @type {?} */ var request = objectStore.add(value, key); request.onsuccess = function (evt) { key = evt.target.result; }; }); }; /** * @param {?} storeName * @param {?} value * @param {?=} key * @return {?} */ NgxNeoIDB.prototype.update = /** * @param {?} storeName * @param {?} value * @param {?=} key * @return {?} */ function (storeName, value, key) { var _this = this; return new Promise(function (resolve, reject) { _this.dbWrapper.validateBeforeTransaction(storeName, reject); /** @type {?} */ var transaction = _this.dbWrapper.createTransaction({ storeName: storeName, dbMode: 'readwrite', error: function (e) { reject(e); }, complete: function (e) { resolve(value); }, abort: function (e) { reject(e); } }); /** @type {?} */ var objectStore = transaction.objectStore(storeName); objectStore.put(value, key); }); }; /** * @param {?} storeName * @param {?} key * @return {?} */ NgxNeoIDB.prototype.delete = /** * @param {?} storeName * @param {?} key * @return {?} */ function (storeName, key) { var _this = this; return new Promise(function (resolve, reject) { _this.dbWrapper.validateBeforeTransaction(storeName, reject); /** @type {?} */ var transaction = _this.dbWrapper.createTransaction({ storeName: storeName, dbMode: 'readwrite', error: function (e) { reject(e); }, complete: function (e) { resolve(); }, abort: function (e) { reject(e); } }); /** @type {?} */ var objectStore = transaction.objectStore(storeName); objectStore['delete'](key); }); }; /** * @param {?} storeName * @param {?} cursorCallback * @param {?=} keyRange * @return {?} */ NgxNeoIDB.prototype.openCursor = /** * @param {?} storeName * @param {?} cursorCallback * @param {?=} keyRange * @return {?} */ function (storeName, cursorCallback, keyRange) { var _this = this; return new Promise(function (resolve, reject) { _this.dbWrapper.validateBeforeTransaction(storeName, reject); /** @type {?} */ var transaction = _this.dbWrapper.createTransaction({ storeName: storeName, dbMode: 'readonly', error: function (e) { reject(e); }, complete: function (e) { resolve(); }, abort: function (e) { reject(e); } }); /** @type {?} */ var objectStore = transaction.objectStore(storeName); /** @type {?} */ var request = objectStore.openCursor(keyRange); request.onsuccess = function (evt) { cursorCallback(evt); resolve(); }; }); }; /** * @param {?} storeName * @return {?} */ NgxNeoIDB.prototype.clear = /** * @param {?} storeName * @return {?} */ function (storeName) { var _this = this; return new Promise(function (resolve, reject) { _this.dbWrapper.validateBeforeTransaction(storeName, reject); /** @type {?} */ var transaction = _this.dbWrapper.createTransaction({ storeName: storeName, dbMode: 'readwrite', error: function (e) { reject(e); }, complete: function (e) { resolve(); }, abort: function (e) { reject(e); } }); /** @type {?} */ var objectStore = transaction.objectStore(storeName); objectStore.clear(); resolve(); }); }; /** * @param {?} storeName * @param {?} indexName * @param {?} key * @return {?} */ NgxNeoIDB.prototype.getByIndex = /** * @param {?} storeName * @param {?} indexName * @param {?} key * @return {?} */ function (storeName, indexName, key) { var _this = this; return new Promise(function (resolve, reject) { _this.dbWrapper.validateBeforeTransaction(storeName, reject); /** @type {?} */ var transaction = _this.dbWrapper.createTransaction({ storeName: storeName, dbMode: 'readonly', error: function (e) { reject(e); }, abort: function (e) { reject(e); }, complete: function (e) { } }); /** @type {?} */ var objectStore = transaction.objectStore(storeName); /** @type {?} */ var index = objectStore.index(indexName); /** @type {?} */ var request = index.get(key); request.onsuccess = function (event) { resolve((( /** @type {?} */(event.target))).result); }; }); }; return NgxNeoIDB; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ exports.NgxNeoIndexedDbModule = NgxNeoIndexedDbModule; exports.NgxNeoIDB = NgxNeoIDB; Object.defineProperty(exports, '__esModule', { value: true }); }))); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVvY29tcGxleHgtbmd4LW5lby1pbmRleGVkZGIudW1kLmpzLm1hcCIsInNvdXJjZXMiOlsibmc6Ly9AbmVvY29tcGxleHgvbmd4LW5lby1pbmRleGVkZGIvbGliL25neC1uZW8taW5kZXhlZC1kYi5tb2R1bGUudHMiLCJuZzovL0BuZW9jb21wbGV4eC9uZ3gtbmVvLWluZGV4ZWRkYi9saWIvY2xhc3Nlcy9kYldyYXBwZXIudHMiLCJuZzovL0BuZW9jb21wbGV4eC9uZ3gtbmVvLWluZGV4ZWRkYi9saWIvY2xhc3Nlcy91dGlscy50cyIsIm5nOi8vQG5lb2NvbXBsZXh4L25neC1uZW8taW5kZXhlZGRiL2xpYi9OZ3hJREIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAYXV0aG9yIFNlYmFzdGlhbiBMYXJyaWV1XG4gKiBAZW1haWwgc2xhcnJpZXVAbmVvY29tcGxleHguY29tXG4gKiBAY3JlYXRlIGRhdGUgMjAxOC0xMS0yMiAwODoyMzozMFxuICogQG1vZGlmeSBkYXRlIDIwMTgtMTEtMjIgMDg6MjM6MzBcbiovXG5pbXBvcnQgeyBOZ01vZHVsZSwgTW9kdWxlV2l0aFByb3ZpZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtdLFxuICBpbXBvcnRzOiBbXSxcbiAgZXhwb3J0czogW11cbn0pXG5leHBvcnQgY2xhc3MgTmd4TmVvSW5kZXhlZERiTW9kdWxlIHtcbiAgc3RhdGljIGZvclJvb3QoKTogTW9kdWxlV2l0aFByb3ZpZGVycyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBOZ3hOZW9JbmRleGVkRGJNb2R1bGUsXG4gICAgICBwcm92aWRlcnM6IFtdXG4gICAgfTtcbiAgfVxuIH1cbiIsImV4cG9ydCBjbGFzcyBEYldyYXBwZXIge1xyXG4gICAgZGJOYW1lOiBzdHJpbmc7XHJcbiAgICBkYlZlcnNpb246IG51bWJlcjtcclxuICAgIGRiOiBJREJEYXRhYmFzZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihkYk5hbWU6IHN0cmluZywgdmVyc2lvbjogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5kYk5hbWUgPSBkYk5hbWU7XHJcbiAgICAgICAgdGhpcy5kYlZlcnNpb24gPSB2ZXJzaW9uIHx8IDE7XHJcbiAgICAgICAgdGhpcy5kYiA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgdmFsaWRhdGVTdG9yZU5hbWUoc3RvcmVOYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKHN0b3JlTmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFsaWRhdGVCZWZvcmVUcmFuc2FjdGlvbihzdG9yZU5hbWU6IHN0cmluZywgcmVqZWN0OiBGdW5jdGlvbikge1xyXG4gICAgICAgIGlmICghdGhpcy5kYikge1xyXG4gICAgICAgICAgICByZWplY3QoJ1lvdSBuZWVkIHRvIHVzZSB0aGUgb3BlbkRhdGFiYXNlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIGRhdGFiYXNlIGJlZm9yZSB5b3UgcXVlcnkgaXQhJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy52YWxpZGF0ZVN0b3JlTmFtZShzdG9yZU5hbWUpKSB7XHJcbiAgICAgICAgICAgIHJlamVjdCgoJ29iamVjdFN0b3JlIGRvZXMgbm90IGV4aXN0czogJyArIHN0b3JlTmFtZSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVUcmFuc2FjdGlvbihcclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIHN0b3JlTmFtZTogc3RyaW5nLCBkYk1vZGU6IElEQlRyYW5zYWN0aW9uTW9kZSxcclxuICAgICAgICAgICAgZXJyb3I6IChlOiBFdmVudCkgPT4gYW55LFxyXG4gICAgICAgICAgICBjb21wbGV0ZTogKGU6IEV2ZW50KSA9PiBhbnksXHJcbiAgICAgICAgICAgIGFib3J0PzogKGU6IEV2ZW50KSA9PiBhbnlcclxuICAgICAgICB9KTogSURCVHJhbnNhY3Rpb24ge1xyXG4gICAgICAgIGNvbnN0IHRyYW5zOiBJREJUcmFuc2FjdGlvbiA9IHRoaXMuZGIudHJhbnNhY3Rpb24ob3B0aW9ucy5zdG9yZU5hbWUsIG9wdGlvbnMuZGJNb2RlKTtcclxuICAgICAgICB0cmFucy5vbmVycm9yID0gb3B0aW9ucy5lcnJvcjtcclxuICAgICAgICB0cmFucy5vbmNvbXBsZXRlID0gb3B0aW9ucy5jb21wbGV0ZTtcclxuICAgICAgICB0cmFucy5vbmFib3J0ID0gb3B0aW9ucy5hYm9ydDtcclxuICAgICAgICByZXR1cm4gdHJhbnM7XHJcbiAgICB9XHJcbn1cclxuIiwiZXhwb3J0IGNsYXNzIFV0aWxzIHtcclxuICAgIGluZGV4ZWREQjogSURCRmFjdG9yeTtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuaW5kZXhlZERCID0gd2luZG93LmluZGV4ZWREQiB8fCAoPGFueT53aW5kb3cpLm1vekluZGV4ZWREQiB8fCAoPGFueT53aW5kb3cpLndlYmtpdEluZGV4ZWREQiB8fCAoPGFueT53aW5kb3cpLm1zSW5kZXhlZERCO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IERiV3JhcHBlciB9IGZyb20gJy4vY2xhc3Nlcy9kYldyYXBwZXInO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuL2NsYXNzZXMvdXRpbHMnO1xuaW1wb3J0IHsgSW5kZXhEZXRhaWxzIH0gZnJvbSAnLi9jbGFzc2VzL2luZGV4RGV0YWlscyc7XG5cblxuZXhwb3J0IGNsYXNzIE5neE5lb0lEQiB7XG4gIHV0aWxzOiBVdGlscztcbiAgZGJXcmFwcGVyOiBEYldyYXBwZXI7XG5cbiAgY29uc3RydWN0b3IoZGJOYW1lOiBzdHJpbmcsIHZlcnNpb246IG51bWJlcikge1xuICAgIHRoaXMudXRpbHMgPSBuZXcgVXRpbHMoKTtcbiAgICB0aGlzLmRiV3JhcHBlciA9IG5ldyBEYldyYXBwZXIoZGJOYW1lLCB2ZXJzaW9uKTtcbiAgfVxuXG4gIG9wZW5EYXRhYmFzZSh2ZXJzaW9uOiBudW1iZXIsIHVwZ3JhZGVDYWxsYmFjaz86IEZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5kYldyYXBwZXIuZGJWZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnV0aWxzLmluZGV4ZWREQi5vcGVuKHRoaXMuZGJXcmFwcGVyLmRiTmFtZSwgdmVyc2lvbik7XG4gICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9IChlKSA9PiB7XG4gICAgICAgIHRoaXMuZGJXcmFwcGVyLmRiID0gcmVxdWVzdC5yZXN1bHQ7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH07XG5cbiAgICAgIHJlcXVlc3Qub25lcnJvciA9IChlKSA9PiB7XG4gICAgICAgIHJlamVjdCgnSW5kZXhlZERCIGVycm9yOiAnICsgKDxhbnk+ZS50YXJnZXQpLmVycm9yQ29kZSA/XG4gICAgICAgICAgKDxhbnk+ZS50YXJnZXQpLmVycm9yQ29kZSArICcgKCcgKyAoPGFueT5lLnRhcmdldCkuZXJyb3IgKyAnKScgOlxuICAgICAgICAgICg8YW55PmUudGFyZ2V0KS5lcnJvckNvZGUpO1xuICAgICAgfTtcblxuICAgICAgaWYgKHR5cGVvZiB1cGdyYWRlQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQgPSAoZSkgPT4ge1xuICAgICAgICAgIHVwZ3JhZGVDYWxsYmFjayhlLCB0aGlzLmRiV3JhcHBlci5kYik7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZXRCeUtleShzdG9yZU5hbWU6IHN0cmluZywga2V5OiBhbnkpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmRiV3JhcHBlci52YWxpZGF0ZUJlZm9yZVRyYW5zYWN0aW9uKHN0b3JlTmFtZSwgcmVqZWN0KTtcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5kYldyYXBwZXIuY3JlYXRlVHJhbnNhY3Rpb24oe1xuICAgICAgICBzdG9yZU5hbWU6IHN0b3JlTmFtZSxcbiAgICAgICAgZGJNb2RlOiAncmVhZG9ubHknLFxuICAgICAgICBlcnJvcjogKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9LFxuICAgICAgICBjb21wbGV0ZTogKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uc3Qgb2JqZWN0U3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShzdG9yZU5hbWUpO1xuICAgICAgbGV0IHJlcXVlc3Q6IElEQlJlcXVlc3Q7XG5cbiAgICAgIHJlcXVlc3QgPSBvYmplY3RTdG9yZS5nZXQoa2V5KTtcbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICByZXNvbHZlKCg8YW55PmV2ZW50LnRhcmdldCkucmVzdWx0KTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBnZXRBbGwoc3RvcmVOYW1lOiBzdHJpbmcsIGtleVJhbmdlPzogSURCS2V5UmFuZ2UsIGluZGV4RGV0YWlscz86IEluZGV4RGV0YWlscykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuZGJXcmFwcGVyLnZhbGlkYXRlQmVmb3JlVHJhbnNhY3Rpb24oc3RvcmVOYW1lLCByZWplY3QpO1xuXG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuZGJXcmFwcGVyLmNyZWF0ZVRyYW5zYWN0aW9uKHtcbiAgICAgICAgc3RvcmVOYW1lOiBzdG9yZU5hbWUsXG4gICAgICAgIGRiTW9kZTogJ3JlYWRvbmx5JyxcbiAgICAgICAgZXJyb3I6IChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfSxcbiAgICAgICAgY29tcGxldGU6IChlOiBFdmVudCkgPT4ge1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG9iamVjdFN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoc3RvcmVOYW1lKTtcbiAgICAgIGNvbnN0IHJlc3VsdDogQXJyYXk8YW55PiA9IFtdO1xuICAgICAgbGV0IHJlcXVlc3Q6IElEQlJlcXVlc3Q7XG4gICAgICBpZiAoaW5kZXhEZXRhaWxzKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gb2JqZWN0U3RvcmUuaW5kZXgoaW5kZXhEZXRhaWxzLmluZGV4TmFtZSksXG4gICAgICAgICAgb3JkZXIgPSAoaW5kZXhEZXRhaWxzLm9yZGVyID09PSAnZGVzYycpID8gJ3ByZXYnIDogJ25leHQnO1xuICAgICAgICByZXF1ZXN0ID0gaW5kZXgub3BlbkN1cnNvcihrZXlSYW5nZSwgPElEQkN1cnNvckRpcmVjdGlvbj5vcmRlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXF1ZXN0ID0gb2JqZWN0U3RvcmUub3BlbkN1cnNvcihrZXlSYW5nZSk7XG4gICAgICB9XG5cbiAgICAgIHJlcXVlc3Qub25lcnJvciA9IChlKSA9PiB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH07XG5cbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gIChldnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGN1cnNvcjogYW55ID0gKDxJREJPcGVuREJSZXF1ZXN0PmV2dC50YXJnZXQpLnJlc3VsdDtcbiAgICAgICAgaWYgKGN1cnNvcikge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGN1cnNvci52YWx1ZSk7XG4gICAgICAgICAgY3Vyc29yWydjb250aW51ZSddKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgYWRkKHN0b3JlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBrZXk/OiBhbnkpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmRiV3JhcHBlci52YWxpZGF0ZUJlZm9yZVRyYW5zYWN0aW9uKHN0b3JlTmFtZSwgcmVqZWN0KTtcblxuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0aGlzLmRiV3JhcHBlci5jcmVhdGVUcmFuc2FjdGlvbih7XG4gICAgICAgIHN0b3JlTmFtZTogc3RvcmVOYW1lLFxuICAgICAgICBkYk1vZGU6ICdyZWFkd3JpdGUnLFxuICAgICAgICBlcnJvcjogKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9LFxuICAgICAgICBjb21wbGV0ZTogKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZSh7IGtleToga2V5LCB2YWx1ZTogdmFsdWUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgICBvYmplY3RTdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHN0b3JlTmFtZSk7XG5cbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBvYmplY3RTdG9yZS5hZGQodmFsdWUsIGtleSk7XG4gICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9IChldnQ6IGFueSkgPT4ge1xuICAgICAgICBrZXkgPSBldnQudGFyZ2V0LnJlc3VsdDtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGUoc3RvcmVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIGtleT86IGFueSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuZGJXcmFwcGVyLnZhbGlkYXRlQmVmb3JlVHJhbnNhY3Rpb24oc3RvcmVOYW1lLCByZWplY3QpO1xuXG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuZGJXcmFwcGVyLmNyZWF0ZVRyYW5zYWN0aW9uKHtcbiAgICAgICAgc3RvcmVOYW1lOiBzdG9yZU5hbWUsXG4gICAgICAgIGRiTW9kZTogJ3JlYWR3cml0ZScsXG4gICAgICAgIGVycm9yOiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbXBsZXRlOiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgYWJvcnQ6IChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICAgIG9iamVjdFN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoc3RvcmVOYW1lKTtcblxuICAgICAgb2JqZWN0U3RvcmUucHV0KHZhbHVlLCBrZXkpO1xuICAgIH0pO1xuICB9XG5cbiAgZGVsZXRlKHN0b3JlTmFtZTogc3RyaW5nLCBrZXk6IGFueSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuZGJXcmFwcGVyLnZhbGlkYXRlQmVmb3JlVHJhbnNhY3Rpb24oc3RvcmVOYW1lLCByZWplY3QpO1xuXG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuZGJXcmFwcGVyLmNyZWF0ZVRyYW5zYWN0aW9uKHtcbiAgICAgICAgc3RvcmVOYW1lOiBzdG9yZU5hbWUsXG4gICAgICAgIGRiTW9kZTogJ3JlYWR3cml0ZScsXG4gICAgICAgIGVycm9yOiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbXBsZXRlOiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGFib3J0OiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgICBvYmplY3RTdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHN0b3JlTmFtZSk7XG5cbiAgICAgIG9iamVjdFN0b3JlWydkZWxldGUnXShrZXkpO1xuICAgIH0pO1xuICB9XG5cbiAgb3BlbkN1cnNvcihzdG9yZU5hbWU6IHN0cmluZywgY3Vyc29yQ2FsbGJhY2s6IChldnQ6IEV2ZW50KSA9PiB2b2lkLCBrZXlSYW5nZT86IElEQktleVJhbmdlKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5kYldyYXBwZXIudmFsaWRhdGVCZWZvcmVUcmFuc2FjdGlvbihzdG9yZU5hbWUsIHJlamVjdCk7XG5cbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5kYldyYXBwZXIuY3JlYXRlVHJhbnNhY3Rpb24oe1xuICAgICAgICBzdG9yZU5hbWU6IHN0b3JlTmFtZSxcbiAgICAgICAgZGJNb2RlOiAncmVhZG9ubHknLFxuICAgICAgICBlcnJvcjogKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9LFxuICAgICAgICBjb21wbGV0ZTogKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9LFxuICAgICAgICBhYm9ydDogKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgICAgb2JqZWN0U3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShzdG9yZU5hbWUpLFxuICAgICAgICByZXF1ZXN0ID0gb2JqZWN0U3RvcmUub3BlbkN1cnNvcihrZXlSYW5nZSk7XG5cbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKGV2dDogRXZlbnQpID0+IHtcbiAgICAgICAgY3Vyc29yQ2FsbGJhY2soZXZ0KTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGNsZWFyKHN0b3JlTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5kYldyYXBwZXIudmFsaWRhdGVCZWZvcmVUcmFuc2FjdGlvbihzdG9yZU5hbWUsIHJlamVjdCk7XG5cbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5kYldyYXBwZXIuY3JlYXRlVHJhbnNhY3Rpb24oe1xuICAgICAgICBzdG9yZU5hbWU6IHN0b3JlTmFtZSxcbiAgICAgICAgZGJNb2RlOiAncmVhZHdyaXRlJyxcbiAgICAgICAgZXJyb3I6IChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfSxcbiAgICAgICAgY29tcGxldGU6IChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgYWJvcnQ6IChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICAgIG9iamVjdFN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoc3RvcmVOYW1lKTtcbiAgICAgIG9iamVjdFN0b3JlLmNsZWFyKCk7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRCeUluZGV4KHN0b3JlTmFtZTogc3RyaW5nLCBpbmRleE5hbWU6IHN0cmluZywga2V5OiBhbnkpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmRiV3JhcHBlci52YWxpZGF0ZUJlZm9yZVRyYW5zYWN0aW9uKHN0b3JlTmFtZSwgcmVqZWN0KTtcblxuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0aGlzLmRiV3JhcHBlci5jcmVhdGVUcmFuc2FjdGlvbih7XG4gICAgICAgIHN0b3JlTmFtZTogc3RvcmVOYW1lLFxuICAgICAgICBkYk1vZGU6ICdyZWFkb25seScsXG4gICAgICAgIGVycm9yOiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGFib3J0OiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbXBsZXRlOiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICAgIG9iamVjdFN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoc3RvcmVOYW1lKSxcbiAgICAgICAgaW5kZXggPSBvYmplY3RTdG9yZS5pbmRleChpbmRleE5hbWUpLFxuICAgICAgICByZXF1ZXN0ID0gaW5kZXguZ2V0KGtleSk7XG5cbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIHJlc29sdmUoKDxJREJPcGVuREJSZXF1ZXN0PmV2ZW50LnRhcmdldCkucmVzdWx0KTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJOZ01vZHVsZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7UUFRQTtTQVlFOzs7O1FBTk8sNkJBQU87OztZQUFkO2dCQUNFLE9BQU87b0JBQ0wsUUFBUSxFQUFFLHFCQUFxQjtvQkFDL0IsU0FBUyxFQUFFLEVBQUU7aUJBQ2QsQ0FBQzthQUNIOztvQkFYRkEsYUFBUSxTQUFDO3dCQUNSLFlBQVksRUFBRSxFQUFFO3dCQUNoQixPQUFPLEVBQUUsRUFBRTt3QkFDWCxPQUFPLEVBQUUsRUFBRTtxQkFDWjs7UUFRQSw0QkFBQztLQVpGOzs7Ozs7SUNSQTtRQUtJLG1CQUFZLE1BQWMsRUFBRSxPQUFlO1lBQ3ZDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxJQUFJLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQztTQUNsQjs7Ozs7UUFFRCxxQ0FBaUI7Ozs7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