@resolveio/client-lib-core 16.0.0 → 21.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/resolveio-client-lib-core.min.mjs +1 -0
- package/package.json +10 -8
- package/types/resolveio-client-lib-core.d.ts +1904 -0
- package/esm2022/lib/account-manager.service.mjs +0 -229
- package/esm2022/lib/auth/auth-guard.service.mjs +0 -174
- package/esm2022/lib/auth/auth-permissions.service.mjs +0 -23
- package/esm2022/lib/auth/auth.service.mjs +0 -251
- package/esm2022/lib/auth/auth365.component.mjs +0 -51
- package/esm2022/lib/auth/can-deactivate-guard.service.mjs +0 -13
- package/esm2022/lib/auth/enroll.component.mjs +0 -88
- package/esm2022/lib/auth/forgot-password.component.mjs +0 -89
- package/esm2022/lib/core.component.mjs +0 -404
- package/esm2022/lib/core.module.mjs +0 -176
- package/esm2022/lib/core.service.mjs +0 -88
- package/esm2022/lib/directive/focus.mjs +0 -24
- package/esm2022/lib/directive/scroll.mjs +0 -54
- package/esm2022/lib/home/home.component.mjs +0 -84
- package/esm2022/lib/logger/logger.component.mjs +0 -229
- package/esm2022/lib/models/app-status.model.mjs +0 -2
- package/esm2022/lib/models/collection-document.model.mjs +0 -2
- package/esm2022/lib/models/cron-job.model.mjs +0 -2
- package/esm2022/lib/models/dialog.model.mjs +0 -2
- package/esm2022/lib/models/file.model.mjs +0 -2
- package/esm2022/lib/models/log-method-latency.model.mjs +0 -2
- package/esm2022/lib/models/navbar-main-tab.model.mjs +0 -2
- package/esm2022/lib/models/pagination.model.mjs +0 -2
- package/esm2022/lib/models/permission.model.mjs +0 -2
- package/esm2022/lib/models/select-data-label.model.mjs +0 -2
- package/esm2022/lib/models/subscription.model.mjs +0 -2
- package/esm2022/lib/models/support-ticket.model.mjs +0 -2
- package/esm2022/lib/models/user-group.model.mjs +0 -2
- package/esm2022/lib/models/user.model.mjs +0 -2
- package/esm2022/lib/offline-db.mjs +0 -519
- package/esm2022/lib/offline-manager.service.mjs +0 -109
- package/esm2022/lib/pipes/domsanitizor.pipe.mjs +0 -29
- package/esm2022/lib/pipes/filter.pipe.mjs +0 -36
- package/esm2022/lib/pipes/json-parse.pipe.mjs +0 -29
- package/esm2022/lib/pipes/minus-currency.pipe.mjs +0 -16
- package/esm2022/lib/pipes/phone.pipe.mjs +0 -47
- package/esm2022/lib/pipes/pipe.module.mjs +0 -54
- package/esm2022/lib/pipes/reverse-list.pipe.mjs +0 -17
- package/esm2022/lib/pipes/titlecase.pipe.mjs +0 -22
- package/esm2022/lib/report-builder.permission.mjs +0 -13
- package/esm2022/lib/resolveio-class.mjs +0 -50
- package/esm2022/lib/shared/shared.module.mjs +0 -96
- package/esm2022/lib/socket-manager.service.mjs +0 -340
- package/esm2022/lib/socket.service.mjs +0 -200
- package/esm2022/lib/super-admin.permission.mjs +0 -9
- package/esm2022/lib/support-ticket/detail/support-ticket-detail.component.mjs +0 -211
- package/esm2022/lib/support-ticket/edit/support-ticket-edit.component.mjs +0 -131
- package/esm2022/lib/support-ticket/list/support-ticket-list.component.mjs +0 -142
- package/esm2022/lib/support-ticket/new/support-ticket-new.component.mjs +0 -121
- package/esm2022/lib/support-ticket/support-ticket.component.mjs +0 -67
- package/esm2022/lib/support-ticket/support-ticket.module.mjs +0 -50
- package/esm2022/lib/support-ticket/support-ticket.routing.mjs +0 -20
- package/esm2022/lib/support-ticket/support-ticket.service.mjs +0 -16
- package/esm2022/lib/token-manager.service.mjs +0 -25
- package/esm2022/lib/user-settings/settings/users-settings.component.mjs +0 -302
- package/esm2022/lib/user-settings/user-settings.component.mjs +0 -61
- package/esm2022/lib/user-settings/user-settings.module.mjs +0 -41
- package/esm2022/lib/user-settings/user-settings.permission.mjs +0 -10
- package/esm2022/lib/user-settings/user-settings.routing.mjs +0 -14
- package/esm2022/lib/user-settings/user-settings.service.mjs +0 -16
- package/esm2022/lib/util/action-name.helper.mjs +0 -9
- package/esm2022/lib/util/aws.service.mjs +0 -80
- package/esm2022/lib/util/common.helper.mjs +0 -133
- package/esm2022/lib/util/validation.service.mjs +0 -185
- package/esm2022/lib/util/window-resize.service.mjs +0 -38
- package/esm2022/lib/util/window.service.mjs +0 -16
- package/esm2022/lib/widgets/alert/alert.model.mjs +0 -2
- package/esm2022/lib/widgets/alert/alert.service.mjs +0 -79
- package/esm2022/lib/widgets/collapse-table/collapse-table.component.mjs +0 -83
- package/esm2022/lib/widgets/collapse-table/collapse-table.module.mjs +0 -34
- package/esm2022/lib/widgets/data-table/data-table.component.mjs +0 -84
- package/esm2022/lib/widgets/data-table/data-table.model.mjs +0 -2
- package/esm2022/lib/widgets/data-table/data-table.module.mjs +0 -41
- package/esm2022/lib/widgets/date-shortcut/date-shortcut.component.mjs +0 -198
- package/esm2022/lib/widgets/date-shortcut/date-shortcut.module.mjs +0 -32
- package/esm2022/lib/widgets/dialog/dialog.confirm.content.mjs +0 -67
- package/esm2022/lib/widgets/dialog/dialog.error.content.mjs +0 -60
- package/esm2022/lib/widgets/dialog/dialog.input.content.mjs +0 -200
- package/esm2022/lib/widgets/dialog/dialog.login.content.mjs +0 -354
- package/esm2022/lib/widgets/dialog/dialog.notify.content.mjs +0 -60
- package/esm2022/lib/widgets/dialog/dialog.register.content.mjs +0 -333
- package/esm2022/lib/widgets/dialog/dialog.select-array-objs.content.mjs +0 -203
- package/esm2022/lib/widgets/dialog/dialog.select-array.content.mjs +0 -310
- package/esm2022/lib/widgets/dialog/dialog.select-data-labels.content.mjs +0 -196
- package/esm2022/lib/widgets/dialog/dialog.select-datetime.content.mjs +0 -191
- package/esm2022/lib/widgets/dialog/dialog.select-with-buttons-url.content.mjs +0 -166
- package/esm2022/lib/widgets/dialog/dialog.service.mjs +0 -98
- package/esm2022/lib/widgets/file/file-upload.component.mjs +0 -433
- package/esm2022/lib/widgets/file/file-upload.module.mjs +0 -48
- package/esm2022/lib/widgets/form-button/form-button.component.mjs +0 -97
- package/esm2022/lib/widgets/form-button/form-button.module.mjs +0 -28
- package/esm2022/lib/widgets/navbar-main/navbar-main.component.mjs +0 -222
- package/esm2022/lib/widgets/navbar-module/navbar-module.component.mjs +0 -108
- package/esm2022/lib/widgets/navbar-module/navbar-module.model.mjs +0 -2
- package/esm2022/lib/widgets/responsive-button-group/responsive-button-group.component.mjs +0 -41
- package/esm2022/lib/widgets/responsive-button-group/responsive-button-group.module.mjs +0 -24
- package/esm2022/lib/widgets/scheduler/scheduler.component.mjs +0 -186
- package/esm2022/lib/widgets/scheduler/scheduler.module.mjs +0 -37
- package/esm2022/lib/widgets/sort-table/sort-table-header.component.mjs +0 -72
- package/esm2022/lib/widgets/sort-table/sort-table-ngfor.component.mjs +0 -49
- package/esm2022/lib/widgets/sort-table/sort-table.directive.mjs +0 -177
- package/esm2022/lib/widgets/sort-table/sort-table.module.mjs +0 -38
- package/esm2022/lib/widgets/user-role/user-role.component.mjs +0 -29
- package/esm2022/lib/widgets/user-role/user-role.module.mjs +0 -24
- package/esm2022/public_api.mjs +0 -91
- package/esm2022/resolveio-client-lib-core.mjs +0 -5
- package/fesm2022/resolveio-client-lib-core.mjs +0 -9019
- package/fesm2022/resolveio-client-lib-core.mjs.map +0 -1
- package/index.d.ts +0 -5
- package/lib/account-manager.service.d.ts +0 -41
- package/lib/auth/auth-guard.service.d.ts +0 -26
- package/lib/auth/auth-permissions.service.d.ts +0 -10
- package/lib/auth/auth.service.d.ts +0 -30
- package/lib/auth/auth365.component.d.ts +0 -20
- package/lib/auth/can-deactivate-guard.service.d.ts +0 -10
- package/lib/auth/enroll.component.d.ts +0 -28
- package/lib/auth/forgot-password.component.d.ts +0 -28
- package/lib/core.component.d.ts +0 -63
- package/lib/core.module.d.ts +0 -34
- package/lib/core.service.d.ts +0 -49
- package/lib/directive/focus.d.ts +0 -10
- package/lib/directive/scroll.d.ts +0 -20
- package/lib/home/home.component.d.ts +0 -28
- package/lib/logger/logger.component.d.ts +0 -37
- package/lib/models/app-status.model.d.ts +0 -4
- package/lib/models/collection-document.model.d.ts +0 -6
- package/lib/models/cron-job.model.d.ts +0 -13
- package/lib/models/dialog.model.d.ts +0 -23
- package/lib/models/file.model.d.ts +0 -9
- package/lib/models/log-method-latency.model.d.ts +0 -7
- package/lib/models/navbar-main-tab.model.d.ts +0 -14
- package/lib/models/pagination.model.d.ts +0 -17
- package/lib/models/permission.model.d.ts +0 -14
- package/lib/models/select-data-label.model.d.ts +0 -9
- package/lib/models/subscription.model.d.ts +0 -19
- package/lib/models/support-ticket.model.d.ts +0 -71
- package/lib/models/user-group.model.d.ts +0 -19
- package/lib/models/user.model.d.ts +0 -70
- package/lib/offline-db.d.ts +0 -28
- package/lib/offline-manager.service.d.ts +0 -23
- package/lib/pipes/domsanitizor.pipe.d.ts +0 -10
- package/lib/pipes/filter.pipe.d.ts +0 -12
- package/lib/pipes/json-parse.pipe.d.ts +0 -7
- package/lib/pipes/minus-currency.pipe.d.ts +0 -7
- package/lib/pipes/phone.pipe.d.ts +0 -7
- package/lib/pipes/pipe.module.d.ts +0 -13
- package/lib/pipes/reverse-list.pipe.d.ts +0 -6
- package/lib/pipes/titlecase.pipe.d.ts +0 -7
- package/lib/report-builder.permission.d.ts +0 -2
- package/lib/resolveio-class.d.ts +0 -26
- package/lib/shared/shared.module.d.ts +0 -17
- package/lib/socket-manager.service.d.ts +0 -36
- package/lib/socket.service.d.ts +0 -38
- package/lib/super-admin.permission.d.ts +0 -2
- package/lib/support-ticket/detail/support-ticket-detail.component.d.ts +0 -32
- package/lib/support-ticket/edit/support-ticket-edit.component.d.ts +0 -30
- package/lib/support-ticket/list/support-ticket-list.component.d.ts +0 -26
- package/lib/support-ticket/new/support-ticket-new.component.d.ts +0 -26
- package/lib/support-ticket/support-ticket.component.d.ts +0 -20
- package/lib/support-ticket/support-ticket.module.d.ts +0 -15
- package/lib/support-ticket/support-ticket.routing.d.ts +0 -3
- package/lib/support-ticket/support-ticket.service.d.ts +0 -9
- package/lib/token-manager.service.d.ts +0 -11
- package/lib/user-settings/settings/users-settings.component.d.ts +0 -54
- package/lib/user-settings/user-settings.component.d.ts +0 -20
- package/lib/user-settings/user-settings.module.d.ts +0 -12
- package/lib/user-settings/user-settings.permission.d.ts +0 -2
- package/lib/user-settings/user-settings.routing.d.ts +0 -3
- package/lib/user-settings/user-settings.service.d.ts +0 -9
- package/lib/util/action-name.helper.d.ts +0 -1
- package/lib/util/aws.service.d.ts +0 -16
- package/lib/util/common.helper.d.ts +0 -12
- package/lib/util/validation.service.d.ts +0 -88
- package/lib/util/window-resize.service.d.ts +0 -13
- package/lib/util/window.service.d.ts +0 -6
- package/lib/widgets/alert/alert.model.d.ts +0 -1
- package/lib/widgets/alert/alert.service.d.ts +0 -11
- package/lib/widgets/collapse-table/collapse-table.component.d.ts +0 -23
- package/lib/widgets/collapse-table/collapse-table.module.d.ts +0 -9
- package/lib/widgets/data-table/data-table.component.d.ts +0 -23
- package/lib/widgets/data-table/data-table.model.d.ts +0 -13
- package/lib/widgets/data-table/data-table.module.d.ts +0 -12
- package/lib/widgets/date-shortcut/date-shortcut.component.d.ts +0 -20
- package/lib/widgets/date-shortcut/date-shortcut.module.d.ts +0 -10
- package/lib/widgets/dialog/dialog.confirm.content.d.ts +0 -12
- package/lib/widgets/dialog/dialog.error.content.d.ts +0 -11
- package/lib/widgets/dialog/dialog.input.content.d.ts +0 -18
- package/lib/widgets/dialog/dialog.login.content.d.ts +0 -17
- package/lib/widgets/dialog/dialog.notify.content.d.ts +0 -11
- package/lib/widgets/dialog/dialog.register.content.d.ts +0 -13
- package/lib/widgets/dialog/dialog.select-array-objs.content.d.ts +0 -23
- package/lib/widgets/dialog/dialog.select-array.content.d.ts +0 -31
- package/lib/widgets/dialog/dialog.select-data-labels.content.d.ts +0 -22
- package/lib/widgets/dialog/dialog.select-datetime.content.d.ts +0 -21
- package/lib/widgets/dialog/dialog.select-with-buttons-url.content.d.ts +0 -25
- package/lib/widgets/dialog/dialog.service.d.ts +0 -21
- package/lib/widgets/file/file-upload.component.d.ts +0 -49
- package/lib/widgets/file/file-upload.module.d.ts +0 -14
- package/lib/widgets/form-button/form-button.component.d.ts +0 -15
- package/lib/widgets/form-button/form-button.module.d.ts +0 -9
- package/lib/widgets/navbar-main/navbar-main.component.d.ts +0 -52
- package/lib/widgets/navbar-module/navbar-module.component.d.ts +0 -24
- package/lib/widgets/navbar-module/navbar-module.model.d.ts +0 -13
- package/lib/widgets/responsive-button-group/responsive-button-group.component.d.ts +0 -17
- package/lib/widgets/responsive-button-group/responsive-button-group.module.d.ts +0 -8
- package/lib/widgets/scheduler/scheduler.component.d.ts +0 -50
- package/lib/widgets/scheduler/scheduler.module.d.ts +0 -11
- package/lib/widgets/sort-table/sort-table-header.component.d.ts +0 -23
- package/lib/widgets/sort-table/sort-table-ngfor.component.d.ts +0 -17
- package/lib/widgets/sort-table/sort-table.directive.d.ts +0 -48
- package/lib/widgets/sort-table/sort-table.module.d.ts +0 -11
- package/lib/widgets/user-role/user-role.component.d.ts +0 -10
- package/lib/widgets/user-role/user-role.module.d.ts +0 -8
- package/public_api.d.ts +0 -87
|
@@ -1,519 +0,0 @@
|
|
|
1
|
-
import { dateReviver } from './util/common.helper';
|
|
2
|
-
export class StorageDB {
|
|
3
|
-
storage = null;
|
|
4
|
-
database = null;
|
|
5
|
-
primaryKey = null;
|
|
6
|
-
sep = '';
|
|
7
|
-
constructor(opts) {
|
|
8
|
-
opts = opts || {};
|
|
9
|
-
this.storage = opts.storage || window && window.localStorage;
|
|
10
|
-
this.database = opts.database || 'db';
|
|
11
|
-
this.primaryKey = opts.primaryKey || '_id';
|
|
12
|
-
this.sep = opts.sep || ':';
|
|
13
|
-
if (!isSupported(this.storage)) {
|
|
14
|
-
this.storage = null;
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
get(name, opts) {
|
|
18
|
-
return new Collection(this, name, opts);
|
|
19
|
-
}
|
|
20
|
-
getCollections() {
|
|
21
|
-
let collections = [];
|
|
22
|
-
Object.keys(this.storage).filter(a => a.split(':').length > 2).forEach(key => {
|
|
23
|
-
if (!collections.some(b => b === key.split(':')[1])) {
|
|
24
|
-
collections.push(key.split(':')[1]);
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
return collections;
|
|
28
|
-
}
|
|
29
|
-
collection(name, opts) {
|
|
30
|
-
return this.get(name, opts);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
class Collection {
|
|
34
|
-
name = '';
|
|
35
|
-
storage = null;
|
|
36
|
-
path = '';
|
|
37
|
-
primaryKey = '';
|
|
38
|
-
cache = {};
|
|
39
|
-
cacheable = false;
|
|
40
|
-
constructor(db, name, opts) {
|
|
41
|
-
opts = opts || {};
|
|
42
|
-
this.name = name;
|
|
43
|
-
this.storage = db.storage || new MockStorage();
|
|
44
|
-
this.path = db.database + db.sep + name + db.sep;
|
|
45
|
-
this.primaryKey = opts.primaryKey || db.primaryKey;
|
|
46
|
-
this.cache = {};
|
|
47
|
-
this.cacheable = !db.storage;
|
|
48
|
-
}
|
|
49
|
-
_initCache() {
|
|
50
|
-
let cache = {};
|
|
51
|
-
let filterExp = new RegExp('^' + this.path);
|
|
52
|
-
for (let key of Object.keys(this.storage)) {
|
|
53
|
-
if (filterExp.test(key)) {
|
|
54
|
-
cache[key] = JSON.parse(this.storage.getItem(key), dateReviver);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
this.cache = cache;
|
|
58
|
-
this.cacheable = true;
|
|
59
|
-
}
|
|
60
|
-
_filter(filter, opts) {
|
|
61
|
-
opts.type = opts.type || 'data'; // data, id;
|
|
62
|
-
opts.multi = opts.multi || false;
|
|
63
|
-
if (!this.cacheable) {
|
|
64
|
-
this._initCache();
|
|
65
|
-
}
|
|
66
|
-
let res = [];
|
|
67
|
-
let isFnFilter;
|
|
68
|
-
let isTypeId = opts.type === 'id';
|
|
69
|
-
if (typeof filter === 'string') {
|
|
70
|
-
filter = new RegExp(filter);
|
|
71
|
-
}
|
|
72
|
-
else if (typeof filter === 'function') {
|
|
73
|
-
isFnFilter = true;
|
|
74
|
-
}
|
|
75
|
-
else if (!filter) {
|
|
76
|
-
let ret = isTypeId ? Object.keys(this.cache) : Object.values(this.cache);
|
|
77
|
-
if (opts.multi) {
|
|
78
|
-
return ret;
|
|
79
|
-
}
|
|
80
|
-
else {
|
|
81
|
-
return ret[0] || null;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
for (let key of Object.keys(this.cache)) {
|
|
85
|
-
let val = this.cache[key];
|
|
86
|
-
if (isFnFilter) {
|
|
87
|
-
if (filter(key, val['data'])) {
|
|
88
|
-
let ret = isTypeId ? key : val;
|
|
89
|
-
if (opts.multi) {
|
|
90
|
-
res.push(ret);
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
return ret;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
else {
|
|
98
|
-
if (filter.test(key)) {
|
|
99
|
-
let ret = isTypeId ? key : val;
|
|
100
|
-
if (opts.multi) {
|
|
101
|
-
res.push(ret);
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
return ret;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
return opts.multi ? res : null;
|
|
110
|
-
}
|
|
111
|
-
insert(data, expiresDate, opts) {
|
|
112
|
-
let arrayInsert = data instanceof Array;
|
|
113
|
-
if (arrayInsert) {
|
|
114
|
-
if (data.length === 0) {
|
|
115
|
-
return [];
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
else {
|
|
119
|
-
data = [data];
|
|
120
|
-
}
|
|
121
|
-
let pk = this.primaryKey;
|
|
122
|
-
let cacheable = this.cacheable;
|
|
123
|
-
for (let row of data) {
|
|
124
|
-
if (!isObject(row)) {
|
|
125
|
-
throw new Error('TypeError: insert data must be an object or an object array');
|
|
126
|
-
}
|
|
127
|
-
if (typeof row[pk] === 'undefined') {
|
|
128
|
-
row[pk] = new ID().toString();
|
|
129
|
-
}
|
|
130
|
-
let now = new Date();
|
|
131
|
-
if (cacheable) {
|
|
132
|
-
this.cache[this.path + row[pk]] = {
|
|
133
|
-
offlineDate: now,
|
|
134
|
-
offlineDateExpires: expiresDate ? expiresDate : new Date(now.getTime() + 604800000),
|
|
135
|
-
data: row
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
this.storage.setItem(this.path + row[pk], JSON.stringify({
|
|
139
|
-
offlineDate: now,
|
|
140
|
-
offlineDateExpires: expiresDate ? expiresDate : new Date(now.getTime() + 604800000),
|
|
141
|
-
data: row
|
|
142
|
-
}));
|
|
143
|
-
}
|
|
144
|
-
return arrayInsert ? data.map(a => a._id) : data[0]._id;
|
|
145
|
-
}
|
|
146
|
-
find(query, opts, total) {
|
|
147
|
-
query = query || {};
|
|
148
|
-
opts = opts || {};
|
|
149
|
-
opts.skip = opts.skip || 0;
|
|
150
|
-
opts.limit = opts.limit;
|
|
151
|
-
opts.sort = opts.sort;
|
|
152
|
-
if (opts.sort instanceof Array) {
|
|
153
|
-
opts.sort = opts.sort.reduce((res, item) => {
|
|
154
|
-
if (typeof item === 'string') {
|
|
155
|
-
res[item] = 1;
|
|
156
|
-
}
|
|
157
|
-
else if (item instanceof Array && item.length) {
|
|
158
|
-
res[item[0]] = item[1] || 1;
|
|
159
|
-
}
|
|
160
|
-
return res;
|
|
161
|
-
}, {});
|
|
162
|
-
}
|
|
163
|
-
let data;
|
|
164
|
-
let ids = isObject(query) ? null : (query instanceof Array ? query : [query]);
|
|
165
|
-
let filterOpts = {
|
|
166
|
-
type: opts._filterType || 'data',
|
|
167
|
-
multi: true
|
|
168
|
-
};
|
|
169
|
-
if (ids) {
|
|
170
|
-
// by id array
|
|
171
|
-
let filterRegExp = new RegExp('^' + this.path + '(' + ids.join('|') + ')$');
|
|
172
|
-
data = this._filter(filterRegExp, filterOpts);
|
|
173
|
-
}
|
|
174
|
-
else if (Object.keys(query).length) {
|
|
175
|
-
// by query
|
|
176
|
-
data = this._filter((key, val) => {
|
|
177
|
-
return queryMatch(query, val);
|
|
178
|
-
}, filterOpts);
|
|
179
|
-
}
|
|
180
|
-
else {
|
|
181
|
-
data = this._filter(null, filterOpts);
|
|
182
|
-
}
|
|
183
|
-
if (!total) {
|
|
184
|
-
data = data.map(a => a.data);
|
|
185
|
-
}
|
|
186
|
-
// sort
|
|
187
|
-
if (opts.sort) {
|
|
188
|
-
data.sort((a, b) => {
|
|
189
|
-
return sortCompare(opts.sort, a, b);
|
|
190
|
-
});
|
|
191
|
-
}
|
|
192
|
-
if (opts.limit) {
|
|
193
|
-
data = data.slice(opts.skip, opts.skip + opts.limit);
|
|
194
|
-
}
|
|
195
|
-
else if (opts.skip) {
|
|
196
|
-
data = data.slice(opts.skip);
|
|
197
|
-
}
|
|
198
|
-
return data;
|
|
199
|
-
}
|
|
200
|
-
findOne(query, opts) {
|
|
201
|
-
query = query || {};
|
|
202
|
-
opts = opts || {};
|
|
203
|
-
let data;
|
|
204
|
-
let id = isObject(query) ? null : query;
|
|
205
|
-
let queryFields = isObject(query) ? Object.keys(query) : [];
|
|
206
|
-
let quickTarget = false;
|
|
207
|
-
let needsSort = !!opts.sort;
|
|
208
|
-
let filterOpts = {
|
|
209
|
-
type: opts._filterType || 'data',
|
|
210
|
-
multi: false
|
|
211
|
-
};
|
|
212
|
-
if (queryFields.length && queryFields.includes(this.primaryKey)) {
|
|
213
|
-
id = query[this.primaryKey];
|
|
214
|
-
quickTarget = true;
|
|
215
|
-
}
|
|
216
|
-
if (id) {
|
|
217
|
-
// by id
|
|
218
|
-
data = this.storage.getItem(this.path + id);
|
|
219
|
-
data = data ? JSON.parse(data, dateReviver).data : null;
|
|
220
|
-
if (data && quickTarget && !queryMatch(query, data)) {
|
|
221
|
-
return null;
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
else if (queryFields.length) {
|
|
225
|
-
// by query
|
|
226
|
-
if (needsSort) {
|
|
227
|
-
data = this.find(query, opts);
|
|
228
|
-
}
|
|
229
|
-
else {
|
|
230
|
-
data = this._filter((key, val) => {
|
|
231
|
-
return queryMatch(query, val);
|
|
232
|
-
}, filterOpts);
|
|
233
|
-
if (Array.isArray(data)) {
|
|
234
|
-
data = data.map(a => a.data);
|
|
235
|
-
}
|
|
236
|
-
else if (data) {
|
|
237
|
-
data = data.data;
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
else {
|
|
242
|
-
if (needsSort) {
|
|
243
|
-
data = this.find(query, opts);
|
|
244
|
-
}
|
|
245
|
-
else {
|
|
246
|
-
data = this._filter(null, filterOpts);
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
if (!id && needsSort && data) {
|
|
250
|
-
data = data[0].data || null;
|
|
251
|
-
}
|
|
252
|
-
if (data && filterOpts.type === 'id') {
|
|
253
|
-
data = this.path + data[this.primaryKey];
|
|
254
|
-
}
|
|
255
|
-
return data;
|
|
256
|
-
}
|
|
257
|
-
remove(query, opts) {
|
|
258
|
-
if (!query) {
|
|
259
|
-
throw new Error('remove needs a query');
|
|
260
|
-
}
|
|
261
|
-
opts = opts || {};
|
|
262
|
-
opts.multi = (typeof opts.multi === 'undefined') ? true : opts.multi;
|
|
263
|
-
let findMethod = opts.multi ? 'find' : 'findOne';
|
|
264
|
-
let ids = null;
|
|
265
|
-
if (findMethod === 'find') {
|
|
266
|
-
ids = this[findMethod](query, {
|
|
267
|
-
_filterType: 'id'
|
|
268
|
-
}, true);
|
|
269
|
-
}
|
|
270
|
-
else {
|
|
271
|
-
ids = this[findMethod](query, {
|
|
272
|
-
_filterType: 'id'
|
|
273
|
-
});
|
|
274
|
-
}
|
|
275
|
-
let cacheable = this.cacheable;
|
|
276
|
-
if ((opts.multi && !ids.length) || (!opts.multi && !ids)) {
|
|
277
|
-
return 0;
|
|
278
|
-
}
|
|
279
|
-
if (!opts.multi) {
|
|
280
|
-
ids = [ids];
|
|
281
|
-
}
|
|
282
|
-
for (let id of ids) {
|
|
283
|
-
if (cacheable) {
|
|
284
|
-
delete this.cache[id];
|
|
285
|
-
}
|
|
286
|
-
this.storage.removeItem(id);
|
|
287
|
-
}
|
|
288
|
-
return ids.length;
|
|
289
|
-
}
|
|
290
|
-
update(query, values, opts) {
|
|
291
|
-
if (!query) {
|
|
292
|
-
throw new Error('update needs a query');
|
|
293
|
-
}
|
|
294
|
-
if (!values || !isObject(values)) {
|
|
295
|
-
throw new Error('update needs an object');
|
|
296
|
-
}
|
|
297
|
-
opts = opts || {};
|
|
298
|
-
opts.multi = (typeof opts.multi === 'undefined') ? false : opts.multi;
|
|
299
|
-
let findMethod = opts.multi ? 'find' : 'findOne';
|
|
300
|
-
let ids = this[findMethod](query, {
|
|
301
|
-
_filterType: 'id'
|
|
302
|
-
});
|
|
303
|
-
let pk = this.primaryKey;
|
|
304
|
-
let cacheable = this.cacheable;
|
|
305
|
-
if ((opts.multi && !ids.length) || (!opts.multi && !ids)) {
|
|
306
|
-
return 0;
|
|
307
|
-
}
|
|
308
|
-
if (!opts.multi) {
|
|
309
|
-
let id = ids;
|
|
310
|
-
let row = cacheable ? this.cache[id] : JSON.parse(this.storage.getItem(id), dateReviver);
|
|
311
|
-
let isIdUpdated = values[pk] && values[pk] !== row.data[pk];
|
|
312
|
-
let newId = isIdUpdated ? this.path + values[pk] : id;
|
|
313
|
-
// check exist
|
|
314
|
-
if (isIdUpdated && this.findOne(values[pk])) {
|
|
315
|
-
throw new Error('Duplicate value \'' + values[pk] + '\' for unique field \'' + pk + '\'');
|
|
316
|
-
}
|
|
317
|
-
let data = Object.assign({}, row.data, values);
|
|
318
|
-
if (cacheable) {
|
|
319
|
-
this.cache[newId] = {
|
|
320
|
-
offlineDate: row.offlineDate,
|
|
321
|
-
offlineDateExpires: row.offlineDateExpires,
|
|
322
|
-
data: data
|
|
323
|
-
};
|
|
324
|
-
if (isIdUpdated) {
|
|
325
|
-
delete this.cache[id];
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
this.storage.setItem(newId, JSON.stringify({
|
|
329
|
-
offlineDate: row.offlineDate,
|
|
330
|
-
offlineDateExpires: row.offlineDateExpires,
|
|
331
|
-
data: data
|
|
332
|
-
}));
|
|
333
|
-
if (isIdUpdated) {
|
|
334
|
-
this.storage.removeItem(id);
|
|
335
|
-
}
|
|
336
|
-
return data;
|
|
337
|
-
}
|
|
338
|
-
else {
|
|
339
|
-
delete values[pk];
|
|
340
|
-
if (!Object.keys(values).length) {
|
|
341
|
-
return 0;
|
|
342
|
-
}
|
|
343
|
-
for (let id of ids) {
|
|
344
|
-
let row = cacheable ? this.cache[id] : JSON.parse(this.storage.getItem(id), dateReviver);
|
|
345
|
-
let data = Object.assign({}, row.data, values);
|
|
346
|
-
if (cacheable) {
|
|
347
|
-
this.cache[id] = {
|
|
348
|
-
offlineDate: row.offlineDate,
|
|
349
|
-
offlineDateExpires: row.offlineDateExpires,
|
|
350
|
-
data: data
|
|
351
|
-
};
|
|
352
|
-
}
|
|
353
|
-
this.storage.setItem(id, JSON.stringify({
|
|
354
|
-
offlineDate: row.offlineDate,
|
|
355
|
-
offlineDateExpires: row.offlineDateExpires,
|
|
356
|
-
data: data
|
|
357
|
-
}));
|
|
358
|
-
}
|
|
359
|
-
return ids.length;
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
drop() {
|
|
363
|
-
this.remove({});
|
|
364
|
-
return true;
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
class ID {
|
|
368
|
-
constructor() {
|
|
369
|
-
}
|
|
370
|
-
toString() {
|
|
371
|
-
return (new Date().getTime() / 1000).toString(16).substr(-4) + Math.random().toString(16).substr(2, 12);
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
class MockStorage {
|
|
375
|
-
length = 0;
|
|
376
|
-
constructor() {
|
|
377
|
-
this.length = 0;
|
|
378
|
-
}
|
|
379
|
-
key() { }
|
|
380
|
-
setItem() { }
|
|
381
|
-
getItem() { }
|
|
382
|
-
removeItem() { }
|
|
383
|
-
}
|
|
384
|
-
const isSupported = (storage) => {
|
|
385
|
-
if (!storage || !(storage instanceof Object)) {
|
|
386
|
-
return false;
|
|
387
|
-
}
|
|
388
|
-
try {
|
|
389
|
-
storage.setItem('_supported', '1');
|
|
390
|
-
storage.removeItem('_supported');
|
|
391
|
-
return true;
|
|
392
|
-
}
|
|
393
|
-
catch (e) {
|
|
394
|
-
return false;
|
|
395
|
-
}
|
|
396
|
-
};
|
|
397
|
-
const isObject = (object) => {
|
|
398
|
-
return object instanceof Object && object.constructor.name === 'Object';
|
|
399
|
-
};
|
|
400
|
-
const queryMatch = (query, target) => {
|
|
401
|
-
if (!query || !Object.keys(query).length) {
|
|
402
|
-
return true;
|
|
403
|
-
}
|
|
404
|
-
for (let field of Object.keys(query)) {
|
|
405
|
-
let val = query[field];
|
|
406
|
-
let tar = target[field];
|
|
407
|
-
if (!tar) {
|
|
408
|
-
field.split('.').forEach(path => {
|
|
409
|
-
if (!tar) {
|
|
410
|
-
tar = target[path];
|
|
411
|
-
}
|
|
412
|
-
else {
|
|
413
|
-
tar = tar[path];
|
|
414
|
-
}
|
|
415
|
-
});
|
|
416
|
-
}
|
|
417
|
-
if (val instanceof RegExp) {
|
|
418
|
-
if (!val.test(tar)) {
|
|
419
|
-
return false;
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
else if (isObject(val)) {
|
|
423
|
-
for (let op of Object.keys(val)) {
|
|
424
|
-
if (Operator._checkExist(op) && !Operator[op](val[op], tar)) {
|
|
425
|
-
return false;
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
else if (val !== tar) {
|
|
430
|
-
return false;
|
|
431
|
-
}
|
|
432
|
-
}
|
|
433
|
-
return true;
|
|
434
|
-
};
|
|
435
|
-
const sortCompare = (sort, a, b, i, fields) => {
|
|
436
|
-
i = i || 0;
|
|
437
|
-
fields = fields || Object.keys(sort);
|
|
438
|
-
let field = fields[i];
|
|
439
|
-
if (!field) {
|
|
440
|
-
return 0;
|
|
441
|
-
}
|
|
442
|
-
if (a[field] === b[field]) {
|
|
443
|
-
i++;
|
|
444
|
-
return sortCompare(sort, a, b, i, fields);
|
|
445
|
-
}
|
|
446
|
-
if (sort[field] === 1) {
|
|
447
|
-
return a[field] - b[field];
|
|
448
|
-
}
|
|
449
|
-
if (sort[field] === -1) {
|
|
450
|
-
return b[field] - a[field];
|
|
451
|
-
}
|
|
452
|
-
};
|
|
453
|
-
/*
|
|
454
|
-
Query Selectors
|
|
455
|
-
|
|
456
|
-
$eq Matches vals that are equal to a specified val.
|
|
457
|
-
$gt Matches vals that are greater than a specified val.
|
|
458
|
-
$gte Matches vals that are greater than or equal to a specified val.
|
|
459
|
-
$in Matches any of the vals specified in an array.
|
|
460
|
-
$lt Matches vals that are less than a specified val.
|
|
461
|
-
$lte Matches vals that are less than or equal to a specified val.
|
|
462
|
-
$ne Matches all vals that are not equal to a specified val.
|
|
463
|
-
$nin Matches none of the vals specified in an array.
|
|
464
|
-
*/
|
|
465
|
-
const ops = ['$eq', '$gt', '$gte', '$in', '$lt', '$lte', '$ne', '$nin'];
|
|
466
|
-
const isNotNumber = (val) => {
|
|
467
|
-
return typeof val !== 'number';
|
|
468
|
-
};
|
|
469
|
-
class Operator {
|
|
470
|
-
static $eq(val, tar) {
|
|
471
|
-
return tar === val;
|
|
472
|
-
}
|
|
473
|
-
static $gt(val, tar) {
|
|
474
|
-
if (isNotNumber(val)) {
|
|
475
|
-
throw new Error('\'$gt\' value must be a number');
|
|
476
|
-
}
|
|
477
|
-
return tar > val;
|
|
478
|
-
}
|
|
479
|
-
static $gte(val, tar) {
|
|
480
|
-
if (isNotNumber(val)) {
|
|
481
|
-
throw new Error('\'$gte\' value must be a number');
|
|
482
|
-
}
|
|
483
|
-
return tar >= val;
|
|
484
|
-
}
|
|
485
|
-
static $in(val, tar) {
|
|
486
|
-
if (!(val instanceof Array)) {
|
|
487
|
-
throw new Error('\'$in\' value must be an array');
|
|
488
|
-
}
|
|
489
|
-
return val.includes(tar);
|
|
490
|
-
}
|
|
491
|
-
static $lt(val, tar) {
|
|
492
|
-
if (isNotNumber(val)) {
|
|
493
|
-
throw new Error('\'$lt\' value must be a number');
|
|
494
|
-
}
|
|
495
|
-
return tar < val;
|
|
496
|
-
}
|
|
497
|
-
static $lte(val, tar) {
|
|
498
|
-
if (isNotNumber(val)) {
|
|
499
|
-
throw new Error('\'$lte\' value must be a number');
|
|
500
|
-
}
|
|
501
|
-
return tar <= val;
|
|
502
|
-
}
|
|
503
|
-
static $ne(val, tar) {
|
|
504
|
-
return tar !== val;
|
|
505
|
-
}
|
|
506
|
-
static $nin(val, tar) {
|
|
507
|
-
if (!(val instanceof Array)) {
|
|
508
|
-
throw new Error('\'$nin\' value must be an array');
|
|
509
|
-
}
|
|
510
|
-
return !val.includes(tar);
|
|
511
|
-
}
|
|
512
|
-
static _checkExist(op) {
|
|
513
|
-
if (ops.includes(op)) {
|
|
514
|
-
return true;
|
|
515
|
-
}
|
|
516
|
-
throw new Error('unknown operator: \'' + op + '\'');
|
|
517
|
-
}
|
|
518
|
-
}
|
|
519
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ZmbGluZS1kYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL2xpYi9vZmZsaW5lLWRiLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVuRCxNQUFNLE9BQU8sU0FBUztJQUVyQixPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ2YsUUFBUSxHQUFHLElBQUksQ0FBQztJQUNoQixVQUFVLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFFVCxZQUFhLElBQUk7UUFDaEIsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFFbEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDO1FBQzdELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUM7UUFDdEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQztRQUMzQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDO1FBRTNCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQy9CLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1NBQ3BCO0lBQ0YsQ0FBQztJQUVELEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSTtRQUNiLE9BQU8sSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsY0FBYztRQUNiLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUVyQixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENB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QUFNLENBQUMsV0FBVyxDQUFDLEVBQUU7UUFDcEIsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ3JCLE9BQU8sSUFBSSxDQUFDO1NBQ1o7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUNyRCxDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkYXRlUmV2aXZlciB9IGZyb20gJy4vdXRpbC9jb21tb24uaGVscGVyJztcblxuZXhwb3J0IGNsYXNzIFN0b3JhZ2VEQiB7XG5cblx0c3RvcmFnZSA9IG51bGw7XG5cdGRhdGFiYXNlID0gbnVsbDtcblx0cHJpbWFyeUtleSA9IG51bGw7XG5cdHNlcCA9ICcnO1xuXG5cdGNvbnN0cnVjdG9yIChvcHRzKSB7XG5cdFx0b3B0cyA9IG9wdHMgfHwge307XG5cblx0XHR0aGlzLnN0b3JhZ2UgPSBvcHRzLnN0b3JhZ2UgfHwgd2luZG93ICYmIHdpbmRvdy5sb2NhbFN0b3JhZ2U7XG5cdFx0dGhpcy5kYXRhYmFzZSA9IG9wdHMuZGF0YWJhc2UgfHwgJ2RiJztcblx0XHR0aGlzLnByaW1hcnlLZXkgPSBvcHRzLnByaW1hcnlLZXkgfHwgJ19pZCc7XG5cdFx0dGhpcy5zZXAgPSBvcHRzLnNlcCB8fCAnOic7XG5cblx0XHRpZiAoIWlzU3VwcG9ydGVkKHRoaXMuc3RvcmFnZSkpIHtcblx0XHRcdHRoaXMuc3RvcmFnZSA9IG51bGw7XG5cdFx0fVxuXHR9XG5cblx0Z2V0KG5hbWUsIG9wdHMpIHtcblx0XHRyZXR1cm4gbmV3IENvbGxlY3Rpb24odGhpcywgbmFtZSwgb3B0cyk7XG5cdH1cblxuXHRnZXRDb2xsZWN0aW9ucygpIHtcblx0XHRsZXQgY29sbGVjdGlvbnMgPSBbXTtcblxuXHRcdE9iamVjdC5rZXlzKHRoaXMuc3RvcmFnZSkuZmlsdGVyKGEgPT4gYS5zcGxpdCgnOicpLmxlbmd0aCA+IDIpLmZvckVhY2goa2V5ID0+IHtcblx0XHRcdGlmICghY29sbGVjdGlvbnMuc29tZShiID0+IGIgPT09IGtleS5zcGxpdCgnOicpWzFdKSkge1xuXHRcdFx0XHRjb2xsZWN0aW9ucy5wdXNoKGtleS5zcGxpdCgnOicpWzFdKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHJldHVybiBjb2xsZWN0aW9ucztcblx0fVxuXG5cdGNvbGxlY3Rpb24obmFtZSwgb3B0cykge1xuXHRcdHJldHVybiB0aGlzLmdldChuYW1lLCBvcHRzKTtcblx0fVxufVxuXG5jbGFzcyBDb2xsZWN0aW9uIHtcblxuXHRuYW1lID0gJyc7XG5cdHN0b3JhZ2UgPSBudWxsO1xuXHRwYXRoID0gJyc7XG5cdHByaW1hcnlLZXkgPSAnJztcblx0Y2FjaGUgPSB7fTtcblx0Y2FjaGVhYmxlID0gZmFsc2U7XG5cblx0Y29uc3RydWN0b3IgKGRiLCBuYW1lLCBvcHRzKSB7XG5cdFx0b3B0cyA9IG9wdHMgfHwge307XG5cblx0XHR0aGlzLm5hbWUgPSBuYW1lO1xuXHRcdHRoaXMuc3RvcmFnZSA9IGRiLnN0b3JhZ2UgfHwgbmV3IE1vY2tTdG9yYWdlKCk7XG5cdFx0dGhpcy5wYXRoID0gZGIuZGF0YWJhc2UgKyBkYi5zZXAgKyBuYW1lICsgZGIuc2VwO1xuXHRcdHRoaXMucHJpbWFyeUtleSA9IG9wdHMucHJpbWFyeUtleSB8fCBkYi5wcmltYXJ5S2V5O1xuXHRcdHRoaXMuY2FjaGUgPSB7fTtcblx0XHR0aGlzLmNhY2hlYWJsZSA9ICFkYi5zdG9yYWdlO1xuXHR9XG5cblxuXHRfaW5pdENhY2hlICgpIHtcblx0XHRsZXQgY2FjaGUgPSB7fTtcblx0XHRsZXQgZmlsdGVyRXhwID0gbmV3IFJlZ0V4cCgnXicgKyB0aGlzLnBhdGgpO1xuXG5cdFx0Zm9yIChsZXQga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuc3RvcmFnZSkpIHtcblx0XHRcdGlmIChmaWx0ZXJFeHAudGVzdChrZXkpKSB7XG5cdFx0XHRcdGNhY2hlW2tleV0gPSBKU09OLnBhcnNlKHRoaXMuc3RvcmFnZS5nZXRJdGVtKGtleSksIGRhdGVSZXZpdmVyKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLmNhY2hlID0gY2FjaGU7XG5cdFx0dGhpcy5jYWNoZWFibGUgPSB0cnVlO1xuXHR9XG5cblxuXHRfZmlsdGVyIChmaWx0ZXIsIG9wdHMpIHtcblx0XHRvcHRzLnR5cGUgPSBvcHRzLnR5cGUgfHwgJ2RhdGEnOyAvLyBkYXRhLCBpZDtcblx0XHRvcHRzLm11bHRpID0gb3B0cy5tdWx0aSB8fCBmYWxzZTtcblxuXHRcdGlmICghdGhpcy5jYWNoZWFibGUpIHtcblx0XHRcdHRoaXMuX2luaXRDYWNoZSgpO1xuXHRcdH1cblxuXHRcdGxldCByZXMgPSBbXTtcblx0XHRsZXQgaXNGbkZpbHRlcjtcblx0XHRsZXQgaXNUeXBlSWQgPSBvcHRzLnR5cGUgPT09ICdpZCc7XG5cblx0XHRpZiAodHlwZW9mIGZpbHRlciA9PT0gJ3N0cmluZycpIHtcblx0XHRcdGZpbHRlciA9IG5ldyBSZWdFeHAoZmlsdGVyKTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBmaWx0ZXIgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdGlzRm5GaWx0ZXIgPSB0cnVlO1xuXHRcdH0gZWxzZSBpZiAoIWZpbHRlcikge1xuXHRcdFx0bGV0IHJldCA9IGlzVHlwZUlkID8gT2JqZWN0LmtleXModGhpcy5jYWNoZSkgOiBPYmplY3QudmFsdWVzKHRoaXMuY2FjaGUpO1xuXG5cdFx0XHRpZiAob3B0cy5tdWx0aSkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIHJldFswXSB8fCBudWxsO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAobGV0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmNhY2hlKSkge1xuXHRcdFx0bGV0IHZhbCA9IHRoaXMuY2FjaGVba2V5XTtcblxuXHRcdFx0aWYgKGlzRm5GaWx0ZXIpIHtcblx0XHRcdFx0aWYgKGZpbHRlcihrZXksIHZhbFsnZGF0YSddKSkge1xuXHRcdFx0XHRcdGxldCByZXQgPSBpc1R5cGVJZCA/IGtleSA6IHZhbDtcblxuXHRcdFx0XHRcdGlmIChvcHRzLm11bHRpKSB7XG5cdFx0XHRcdFx0XHRyZXMucHVzaChyZXQpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKGZpbHRlci50ZXN0KGtleSkpIHtcblx0XHRcdFx0XHRsZXQgcmV0ID0gaXNUeXBlSWQgPyBrZXkgOiB2YWw7XG5cblx0XHRcdFx0XHRpZiAob3B0cy5tdWx0aSkge1xuXHRcdFx0XHRcdFx0cmVzLnB1c2gocmV0KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gb3B0cy5tdWx0aSA/IHJlcyA6IG51bGw7XG5cdH1cblxuXG5cdGluc2VydChkYXRhLCBleHBpcmVzRGF0ZT8sIG9wdHM/KSB7XG5cdFx0bGV0IGFycmF5SW5zZXJ0ID0gZGF0YSBpbnN0YW5jZW9mIEFycmF5O1xuXG5cdFx0aWYgKGFycmF5SW5zZXJ0KSB7XG5cdFx0XHRpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0cmV0dXJuIFtdO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRkYXRhID0gW2RhdGFdO1xuXHRcdH1cblxuXHRcdGxldCBwayA9IHRoaXMucHJpbWFyeUtleTtcblx0XHRsZXQgY2FjaGVhYmxlID0gdGhpcy5jYWNoZWFibGU7XG5cblx0XHRmb3IgKGxldCByb3cgb2YgZGF0YSkge1xuXHRcdFx0aWYgKCFpc09iamVjdChyb3cpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignVHlwZUVycm9yOiBpbnNlcnQgZGF0YSBtdXN0IGJlIGFuIG9iamVjdCBvciBhbiBvYmplY3QgYXJyYXknKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHR5cGVvZiByb3dbcGtdID09PSAndW5kZWZpbmVkJykge1xuXHRcdFx0XHRyb3dbcGtdID0gbmV3IElEKCkudG9TdHJpbmcoKTtcblx0XHRcdH1cblxuXHRcdFx0bGV0IG5vdyA9IG5ldyBEYXRlKCk7XG5cblx0XHRcdGlmIChjYWNoZWFibGUpIHtcblx0XHRcdFx0dGhpcy5jYWNoZVt0aGlzLnBhdGggKyByb3dbcGtdXSA9IHtcblx0XHRcdFx0XHRvZmZsaW5lRGF0ZTogbm93LFxuXHRcdFx0XHRcdG9mZmxpbmVEYXRlRXhwaXJlczogZXhwaXJlc0RhdGUgPyBleHBpcmVzRGF0ZSA6IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgKyA2MDQ4MDAwMDApLFxuXHRcdFx0XHRcdGRhdGE6IHJvd1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnN0b3JhZ2Uuc2V0SXRlbSh0aGlzLnBhdGggKyByb3dbcGtdLCBKU09OLnN0cmluZ2lmeSh7XG5cdFx0XHRcdG9mZmxpbmVEYXRlOiBub3csXG5cdFx0XHRcdG9mZmxpbmVEYXRlRXhwaXJlczogZXhwaXJlc0RhdGUgPyBleHBpcmVzRGF0ZSA6IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgKyA2MDQ4MDAwMDApLFxuXHRcdFx0XHRkYXRhOiByb3dcblx0XHRcdH0pKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gYXJyYXlJbnNlcnQgPyBkYXRhLm1hcChhID0+IGEuX2lkKSA6IGRhdGFbMF0uX2lkO1xuXHR9XG5cblxuXHRmaW5kKHF1ZXJ5LCBvcHRzPywgdG90YWw/KSB7XG5cdFx0cXVlcnkgPSBxdWVyeSB8fCB7fTtcblx0XHRvcHRzID0gb3B0cyB8fCB7fTtcblx0XHRvcHRzLnNraXAgPSBvcHRzLnNraXAgfHwgMDtcblx0XHRvcHRzLmxpbWl0ID0gb3B0cy5saW1pdDtcblx0XHRvcHRzLnNvcnQgPSBvcHRzLnNvcnQ7XG5cblx0XHRpZiAob3B0cy5zb3J0IGluc3RhbmNlb2YgQXJyYXkpIHtcblx0XHRcdG9wdHMuc29ydCA9IG9wdHMuc29ydC5yZWR1Y2UoKHJlcywgaXRlbSkgPT4ge1xuXHRcdFx0XHRpZiAodHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdFx0cmVzW2l0ZW1dID0gMTtcblx0XHRcdFx0fSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQXJyYXkgJiYgaXRlbS5sZW5ndGgpIHtcblx0XHRcdFx0XHRyZXNbaXRlbVswXV0gPSBpdGVtWzFdIHx8IDE7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHJlcztcblx0XHRcdH0sIHt9KTtcblx0XHR9XG5cblx0XHRsZXQgZGF0YTtcblx0XHRsZXQgaWRzID0gaXNPYmplY3QocXVlcnkpID8gbnVsbCA6IChxdWVyeSBpbnN0YW5jZW9mIEFycmF5ID8gcXVlcnkgOiBbcXVlcnldKTtcblx0XHRsZXQgZmlsdGVyT3B0cyA9IHtcblx0XHRcdHR5cGU6IG9wdHMuX2ZpbHRlclR5cGUgfHwgJ2RhdGEnLFxuXHRcdFx0bXVsdGk6IHRydWVcblx0XHR9O1xuXG5cdFx0aWYgKGlkcykge1xuXHRcdFx0Ly8gYnkgaWQgYXJyYXlcblx0XHRcdGxldCBmaWx0ZXJSZWdFeHAgPSBuZXcgUmVnRXhwKCdeJyArIHRoaXMucGF0aCArICcoJyArIGlkcy5qb2luKCd8JykgKyAnKSQnKTtcblx0XHRcdGRhdGEgPSB0aGlzLl9maWx0ZXIoZmlsdGVyUmVnRXhwLCBmaWx0ZXJPcHRzKTtcblxuXHRcdH0gZWxzZSBpZiAoT2JqZWN0LmtleXMocXVlcnkpLmxlbmd0aCkge1xuXHRcdFx0Ly8gYnkgcXVlcnlcblx0XHRcdGRhdGEgPSB0aGlzLl9maWx0ZXIoKGtleSwgdmFsKSA9PiB7XG5cdFx0XHRcdHJldHVybiBxdWVyeU1hdGNoKHF1ZXJ5LCB2YWwpO1xuXHRcdFx0fSwgZmlsdGVyT3B0cyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRhdGEgPSB0aGlzLl9maWx0ZXIobnVsbCwgZmlsdGVyT3B0cyk7XG5cdFx0fVxuXG5cdFx0aWYgKCF0b3RhbCkge1xuXHRcdFx0ZGF0YSA9IGRhdGEubWFwKGEgPT4gYS5kYXRhKTtcblx0XHR9XG5cblx0XHQvLyBzb3J0XG5cdFx0aWYgKG9wdHMuc29ydCkge1xuXHRcdFx0ZGF0YS5zb3J0KChhLCBiKSA9PiB7XG5cdFx0XHRcdHJldHVybiBzb3J0Q29tcGFyZShvcHRzLnNvcnQsIGEsIGIpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0aWYgKG9wdHMubGltaXQpIHtcblx0XHRcdGRhdGEgPSBkYXRhLnNsaWNlKG9wdHMuc2tpcCwgb3B0cy5za2lwICsgb3B0cy5saW1pdCk7XG5cdFx0fSBlbHNlIGlmIChvcHRzLnNraXApIHtcblx0XHRcdGRhdGEgPSBkYXRhLnNsaWNlKG9wdHMuc2tpcCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGE7XG5cdH1cblxuXG5cdGZpbmRPbmUocXVlcnksIG9wdHM/KSB7XG5cdFx0cXVlcnkgPSBxdWVyeSB8fCB7fTtcblx0XHRvcHRzID0gb3B0cyB8fCB7fTtcblxuXHRcdGxldCBkYXRhO1xuXHRcdGxldCBpZCA9IGlzT2JqZWN0KHF1ZXJ5KSA/IG51bGwgOiBxdWVyeTtcblx0XHRsZXQgcXVlcnlGaWVsZHMgPSBpc09iamVjdChxdWVyeSkgPyBPYmplY3Qua2V5cyhxdWVyeSkgOiBbXTtcblx0XHRsZXQgcXVpY2tUYXJnZXQgPSBmYWxzZTtcblx0XHRsZXQgbmVlZHNTb3J0ID0gISFvcHRzLnNvcnQ7XG5cdFx0bGV0IGZpbHRlck9wdHMgPSB7XG5cdFx0XHR0eXBlOiBvcHRzLl9maWx0ZXJUeXBlIHx8ICdkYXRhJyxcblx0XHRcdG11bHRpOiBmYWxzZVxuXHRcdH07XG5cblx0XHRpZiAocXVlcnlGaWVsZHMubGVuZ3RoICYmIHF1ZXJ5RmllbGRzLmluY2x1ZGVzKHRoaXMucHJpbWFyeUtleSkpIHtcblx0XHRcdGlkID0gcXVlcnlbdGhpcy5wcmltYXJ5S2V5XTtcblx0XHRcdHF1aWNrVGFyZ2V0ID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAoaWQpIHtcblx0XHRcdC8vIGJ5IGlkXG5cdFx0XHRkYXRhID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0odGhpcy5wYXRoICsgaWQpO1xuXHRcdFx0ZGF0YSA9IGRhdGEgPyBKU09OLnBhcnNlKGRhdGEsIGRhdGVSZXZpdmVyKS5kYXRhIDogbnVsbDtcblxuXHRcdFx0aWYgKGRhdGEgJiYgcXVpY2tUYXJnZXQgJiYgIXF1ZXJ5TWF0Y2gocXVlcnksIGRhdGEpKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAocXVlcnlGaWVsZHMubGVuZ3RoKSB7XG5cdFx0XHQvLyBieSBxdWVyeVxuXHRcdFx0aWYgKG5lZWRzU29ydCkge1xuXHRcdFx0XHRkYXRhID0gdGhpcy5maW5kKHF1ZXJ5LCBvcHRzKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRhdGEgPSB0aGlzLl9maWx0ZXIoKGtleSwgdmFsKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHF1ZXJ5TWF0Y2gocXVlcnksIHZhbCk7XG5cdFx0XHRcdH0sIGZpbHRlck9wdHMpO1xuXG5cdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG5cdFx0XHRcdFx0ZGF0YSA9IGRhdGEubWFwKGEgPT4gYS5kYXRhKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIGlmIChkYXRhKSB7XG5cdFx0XHRcdFx0ZGF0YSA9IGRhdGEuZGF0YTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAobmVlZHNTb3J0KSB7XG5cdFx0XHRcdGRhdGEgPSB0aGlzLmZpbmQocXVlcnksIG9wdHMpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGF0YSA9IHRoaXMuX2ZpbHRlcihudWxsLCBmaWx0ZXJPcHRzKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0XG5cdFx0aWYgKCFpZCAmJiBuZWVkc1NvcnQgJiYgZGF0YSkge1xuXHRcdFx0ZGF0YSA9IGRhdGFbMF0uZGF0YSB8fCBudWxsO1xuXHRcdH1cblxuXHRcdGlmIChkYXRhICYmIGZpbHRlck9wdHMudHlwZSA9PT0gJ2lkJykge1xuXHRcdFx0ZGF0YSA9IHRoaXMucGF0aCArIGRhdGFbdGhpcy5wcmltYXJ5S2V5XTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGF0YTtcblx0fVxuXG5cblx0cmVtb3ZlKHF1ZXJ5LCBvcHRzPykge1xuXHRcdGlmICghcXVlcnkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcigncmVtb3ZlIG5lZWRzIGEgcXVlcnknKTtcblx0XHR9XG5cblx0XHRvcHRzID0gb3B0cyB8fCB7fTtcblx0XHRvcHRzLm11bHRpID0gKHR5cGVvZiBvcHRzLm11bHRpID09PSAndW5kZWZpbmVkJykgPyB0cnVlIDogb3B0cy5tdWx0aTtcblxuXHRcdGxldCBmaW5kTWV0aG9kID0gb3B0cy5tdWx0aSA/ICdmaW5kJyA6ICdmaW5kT25lJztcblx0XHRsZXQgaWRzID0gbnVsbDtcblx0XHRpZiAoZmluZE1ldGhvZCA9PT0gJ2ZpbmQnKSB7XG5cdFx0XHRpZHMgPSB0aGlzW2ZpbmRNZXRob2RdKHF1ZXJ5LCB7XG5cdFx0XHRcdF9maWx0ZXJUeXBlOiAnaWQnXG5cdFx0XHR9LCB0cnVlKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRpZHMgPSB0aGlzW2ZpbmRNZXRob2RdKHF1ZXJ5LCB7XG5cdFx0XHRcdF9maWx0ZXJUeXBlOiAnaWQnXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0bGV0IGNhY2hlYWJsZSA9IHRoaXMuY2FjaGVhYmxlO1xuXG5cdFx0aWYgKChvcHRzLm11bHRpICYmICFpZHMubGVuZ3RoKSB8fCAoIW9wdHMubXVsdGkgJiYgIWlkcykpIHtcblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblxuXHRcdGlmICghb3B0cy5tdWx0aSkge1xuXHRcdFx0aWRzID0gW2lkc107XG5cdFx0fVxuXG5cdFx0Zm9yIChsZXQgaWQgb2YgaWRzKSB7XG5cdFx0XHRpZiAoY2FjaGVhYmxlKSB7XG5cdFx0XHRcdGRlbGV0ZSB0aGlzLmNhY2hlW2lkXTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5zdG9yYWdlLnJlbW92ZUl0ZW0oaWQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBpZHMubGVuZ3RoO1xuXHR9XG5cblxuXHR1cGRhdGUocXVlcnksIHZhbHVlcywgb3B0cz8pIHtcblx0XHRpZiAoIXF1ZXJ5KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ3VwZGF0ZSBuZWVkcyBhIHF1ZXJ5Jyk7XG5cdFx0fVxuXHRcdGlmICghdmFsdWVzIHx8ICFpc09iamVjdCh2YWx1ZXMpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ3VwZGF0ZSBuZWVkcyBhbiBvYmplY3QnKTtcblx0XHR9XG5cblx0XHRvcHRzID0gb3B0cyB8fCB7fTtcblx0XHRvcHRzLm11bHRpID0gKHR5cGVvZiBvcHRzLm11bHRpID09PSAndW5kZWZpbmVkJykgPyBmYWxzZSA6IG9wdHMubXVsdGk7XG5cblx0XHRsZXQgZmluZE1ldGhvZCA9IG9wdHMubXVsdGkgPyAnZmluZCcgOiAnZmluZE9uZSc7XG5cdFx0bGV0IGlkcyA9IHRoaXNbZmluZE1ldGhvZF0ocXVlcnksIHtcblx0XHRcdF9maWx0ZXJUeXBlOiAnaWQnXG5cdFx0fSk7XG5cdFx0bGV0IHBrID0gdGhpcy5wcmltYXJ5S2V5O1xuXHRcdGxldCBjYWNoZWFibGUgPSB0aGlzLmNhY2hlYWJsZTtcblxuXHRcdGlmICgob3B0cy5tdWx0aSAmJiAhaWRzLmxlbmd0aCkgfHwgKCFvcHRzLm11bHRpICYmICFpZHMpKSB7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHRpZiAoIW9wdHMubXVsdGkpIHtcblx0XHRcdGxldCBpZCA9IGlkcztcblx0XHRcdGxldCByb3cgPSBjYWNoZWFibGUgPyB0aGlzLmNhY2hlW2lkXSA6IEpTT04ucGFyc2UodGhpcy5zdG9yYWdlLmdldEl0ZW0oaWQpLCBkYXRlUmV2aXZlcik7XG5cdFx0XHRsZXQgaXNJZFVwZGF0ZWQgPSB2YWx1ZXNbcGtdICYmIHZhbHVlc1twa10gIT09IHJvdy5kYXRhW3BrXTtcblx0XHRcdGxldCBuZXdJZCA9IGlzSWRVcGRhdGVkID8gdGhpcy5wYXRoICsgdmFsdWVzW3BrXSA6IGlkO1xuXG5cdFx0XHQvLyBjaGVjayBleGlzdFxuXHRcdFx0aWYgKGlzSWRVcGRhdGVkICYmIHRoaXMuZmluZE9uZSh2YWx1ZXNbcGtdKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0R1cGxpY2F0ZSB2YWx1ZSBcXCcnICsgdmFsdWVzW3BrXSArICdcXCcgZm9yIHVuaXF1ZSBmaWVsZCBcXCcnICsgcGsgKyAnXFwnJyk7XG5cdFx0XHR9XG5cblx0XHRcdGxldCBkYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgcm93LmRhdGEsIHZhbHVlcyk7XG5cblx0XHRcdGlmIChjYWNoZWFibGUpIHtcblx0XHRcdFx0dGhpcy5jYWNoZVtuZXdJZF0gPSB7XG5cdFx0XHRcdFx0b2ZmbGluZURhdGU6IHJvdy5vZmZsaW5lRGF0ZSxcblx0XHRcdFx0XHRvZmZsaW5lRGF0ZUV4cGlyZXM6IHJvdy5vZmZsaW5lRGF0ZUV4cGlyZXMsXG5cdFx0XHRcdFx0ZGF0YTogZGF0YVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRpZiAoaXNJZFVwZGF0ZWQpIHtcblx0XHRcdFx0XHRkZWxldGUgdGhpcy5jYWNoZVtpZF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5zdG9yYWdlLnNldEl0ZW0obmV3SWQsIEpTT04uc3RyaW5naWZ5KHtcblx0XHRcdFx0b2ZmbGluZURhdGU6IHJvdy5vZmZsaW5lRGF0ZSxcblx0XHRcdFx0b2ZmbGluZURhdGVFeHBpcmVzOiByb3cub2ZmbGluZURhdGVFeHBpcmVzLFxuXHRcdFx0XHRkYXRhOiBkYXRhXG5cdFx0XHR9KSk7XG5cblx0XHRcdGlmIChpc0lkVXBkYXRlZCkge1xuXHRcdFx0XHR0aGlzLnN0b3JhZ2UucmVtb3ZlSXRlbShpZCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBkYXRhO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdGRlbGV0ZSB2YWx1ZXNbcGtdO1xuXG5cdFx0XHRpZiAoIU9iamVjdC5rZXlzKHZhbHVlcykubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybiAwO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKGxldCBpZCBvZiBpZHMpIHtcblx0XHRcdFx0bGV0IHJvdyA9IGNhY2hlYWJsZSA/IHRoaXMuY2FjaGVbaWRdIDogSlNPTi5wYXJzZSh0aGlzLnN0b3JhZ2UuZ2V0SXRlbShpZCksIGRhdGVSZXZpdmVyKTtcblxuXHRcdFx0XHRsZXQgZGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIHJvdy5kYXRhLCB2YWx1ZXMpO1xuXG5cdFx0XHRcdGlmIChjYWNoZWFibGUpIHtcblx0XHRcdFx0XHR0aGlzLmNhY2hlW2lkXSA9IHtcblx0XHRcdFx0XHRcdG9mZmxpbmVEYXRlOiByb3cub2ZmbGluZURhdGUsXG5cdFx0XHRcdFx0XHRvZmZsaW5lRGF0ZUV4cGlyZXM6IHJvdy5vZmZsaW5lRGF0ZUV4cGlyZXMsXG5cdFx0XHRcdFx0XHRkYXRhOiBkYXRhXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuc3RvcmFnZS5zZXRJdGVtKGlkLCBKU09OLnN0cmluZ2lmeSh7XG5cdFx0XHRcdFx0b2ZmbGluZURhdGU6IHJvdy5vZmZsaW5lRGF0ZSxcblx0XHRcdFx0XHRvZmZsaW5lRGF0ZUV4cGlyZXM6IHJvdy5vZmZsaW5lRGF0ZUV4cGlyZXMsXG5cdFx0XHRcdFx0ZGF0YTogZGF0YVxuXHRcdFx0XHR9KSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBpZHMubGVuZ3RoO1xuXHRcdH1cblx0fVxuXG5cdGRyb3AoKSB7XG5cdFx0dGhpcy5yZW1vdmUoe30pO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG59XG5cbmNsYXNzIElEIHtcblx0Y29uc3RydWN0b3IoKSB7XG5cdH1cblxuXHR0b1N0cmluZygpIHtcblx0XHRyZXR1cm4gKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC8gMTAwMCkudG9TdHJpbmcoMTYpLnN1YnN0cigtNCkgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDE2KS5zdWJzdHIoMiwgMTIpO1xuXHR9XG59XG5cbmNsYXNzIE1vY2tTdG9yYWdlIHtcblx0bGVuZ3RoID0gMDtcblxuXHRjb25zdHJ1Y3RvciAoKSB7XG5cdFx0dGhpcy5sZW5ndGggPSAwO1xuXHR9XG5cblx0a2V5KCkge31cblx0c2V0SXRlbSgpIHt9XG5cdGdldEl0ZW0oKSB7fVxuXHRyZW1vdmVJdGVtKCkge31cbn1cblxuY29uc3QgaXNTdXBwb3J0ZWQgPSAoc3RvcmFnZSkgPT4ge1xuXHRpZiAoIXN0b3JhZ2UgfHwgIShzdG9yYWdlIGluc3RhbmNlb2YgT2JqZWN0KSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHRyeSB7XG5cdFx0c3RvcmFnZS5zZXRJdGVtKCdfc3VwcG9ydGVkJywgJzEnKTtcblx0XHRzdG9yYWdlLnJlbW92ZUl0ZW0oJ19zdXBwb3J0ZWQnKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxuY29uc3QgaXNPYmplY3QgPSAob2JqZWN0KSA9PiB7XG5cdHJldHVybiBvYmplY3QgaW5zdGFuY2VvZiBPYmplY3QgJiYgb2JqZWN0LmNvbnN0cnVjdG9yLm5hbWUgPT09ICdPYmplY3QnO1xufTtcblxuY29uc3QgcXVlcnlNYXRjaCA9IChxdWVyeSwgdGFyZ2V0KSA9PiB7XG5cdGlmICghcXVlcnkgfHwgIU9iamVjdC5rZXlzKHF1ZXJ5KS5sZW5ndGgpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGZvciAobGV0IGZpZWxkIG9mIE9iamVjdC5rZXlzKHF1ZXJ5KSkge1xuXHRcdGxldCB2YWwgPSBxdWVyeVtmaWVsZF07XG5cdFx0bGV0IHRhciA9IHRhcmdldFtmaWVsZF07XG5cblx0XHRpZiAoIXRhcikge1xuXHRcdFx0ZmllbGQuc3BsaXQoJy4nKS5mb3JFYWNoKHBhdGggPT4ge1xuXHRcdFx0XHRpZiAoIXRhcikge1xuXHRcdFx0XHRcdHRhciA9IHRhcmdldFtwYXRoXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHR0YXIgPSB0YXJbcGF0aF07XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGlmICh2YWwgaW5zdGFuY2VvZiBSZWdFeHApIHtcblx0XHRcdGlmICghdmFsLnRlc3QodGFyKSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChpc09iamVjdCh2YWwpKSB7XG5cdFx0XHRmb3IgKGxldCBvcCBvZiBPYmplY3Qua2V5cyh2YWwpKSB7XG5cdFx0XHRcdGlmIChPcGVyYXRvci5fY2hlY2tFeGlzdChvcCkgJiYgIU9wZXJhdG9yW29wXSh2YWxbb3BdLCB0YXIpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICh2YWwgIT09IHRhcikge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0cnVlO1xufTtcblxuY29uc3Qgc29ydENvbXBhcmUgPSAoc29ydCwgYSwgYiwgaT8sIGZpZWxkcz8pID0+IHtcblx0aSA9IGkgfHwgMDtcblx0ZmllbGRzID0gZmllbGRzIHx8IE9iamVjdC5rZXlzKHNvcnQpO1xuXG5cdGxldCBmaWVsZCA9IGZpZWxkc1tpXTtcblxuXHRpZiAoIWZpZWxkKSB7XG5cdFx0cmV0dXJuIDA7XG5cdH1cblxuXHRpZiAoYVtmaWVsZF0gPT09IGJbZmllbGRdKSB7XG5cdFx0aSsrO1xuXHRcdHJldHVybiBzb3J0Q29tcGFyZShzb3J0LCBhLCBiLCBpLCBmaWVsZHMpO1xuXHR9XG5cblx0aWYgKHNvcnRbZmllbGRdID09PSAxKSB7XG5cdFx0cmV0dXJuIGFbZmllbGRdIC0gYltmaWVsZF07XG5cdH1cblxuXHRpZiAoc29ydFtmaWVsZF0gPT09IC0xKSB7XG5cdFx0cmV0dXJuIGJbZmllbGRdIC0gYVtmaWVsZF07XG5cdH1cbn07XG5cbi8qXG5cdFF1ZXJ5IFNlbGVjdG9yc1xuXG5cdCRlcVx0XHRNYXRjaGVzIHZhbHMgdGhhdCBhcmUgZXF1YWwgdG8gYSBzcGVjaWZpZWQgdmFsLlxuXHQkZ3RcdFx0TWF0Y2hlcyB2YWxzIHRoYXQgYXJlIGdyZWF0ZXIgdGhhbiBhIHNwZWNpZmllZCB2YWwuXG5cdCRndGVcdE1hdGNoZXMgdmFscyB0aGF0IGFyZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYSBzcGVjaWZpZWQgdmFsLlxuXHQkaW5cdFx0TWF0Y2hlcyBhbnkgb2YgdGhlIHZhbHMgc3BlY2lmaWVkIGluIGFuIGFycmF5LlxuXHQkbHRcdFx0TWF0Y2hlcyB2YWxzIHRoYXQgYXJlIGxlc3MgdGhhbiBhIHNwZWNpZmllZCB2YWwuXG5cdCRsdGVcdE1hdGNoZXMgdmFscyB0aGF0IGFyZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYSBzcGVjaWZpZWQgdmFsLlxuXHQkbmVcdFx0TWF0Y2hlcyBhbGwgdmFscyB0aGF0IGFyZSBub3QgZXF1YWwgdG8gYSBzcGVjaWZpZWQgdmFsLlxuXHQkbmluXHRNYXRjaGVzIG5vbmUgb2YgdGhlIHZhbHMgc3BlY2lmaWVkIGluIGFuIGFycmF5LlxuKi9cblxuY29uc3Qgb3BzID0gWyckZXEnLCAnJGd0JywgJyRndGUnLCAnJGluJywgJyRsdCcsICckbHRlJywgJyRuZScsICckbmluJ107XG5cbmNvbnN0IGlzTm90TnVtYmVyID0gKHZhbCkgPT4ge1xuXHRyZXR1cm4gdHlwZW9mIHZhbCAhPT0gJ251bWJlcic7XG59O1xuXG5jbGFzcyBPcGVyYXRvciB7XG5cdHN0YXRpYyAkZXEodmFsLCB0YXIpIHtcblx0XHRyZXR1cm4gdGFyID09PSB2YWw7XG5cdH1cblxuXHRzdGF0aWMgJGd0KHZhbCwgdGFyKSB7XG5cdFx0aWYgKGlzTm90TnVtYmVyKHZhbCkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignXFwnJGd0XFwnIHZhbHVlIG11c3QgYmUgYSBudW1iZXInKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRhciA+IHZhbDtcblx0fVxuXG5cdHN0YXRpYyAkZ3RlKHZhbCwgdGFyKSB7XG5cdFx0aWYgKGlzTm90TnVtYmVyKHZhbCkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignXFwnJGd0ZVxcJyB2YWx1ZSBtdXN0IGJlIGEgbnVtYmVyJyk7XG5cdFx0fVxuXHRcdHJldHVybiB0YXIgPj0gdmFsO1xuXHR9XG5cblx0c3RhdGljICRpbih2YWwsIHRhcikge1xuXHRcdGlmICghKHZhbCBpbnN0YW5jZW9mIEFycmF5KSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdcXCckaW5cXCcgdmFsdWUgbXVzdCBiZSBhbiBhcnJheScpO1xuXHRcdH1cblx0XHRyZXR1cm4gdmFsLmluY2x1ZGVzKHRhcik7XG5cdH1cblxuXHRzdGF0aWMgJGx0KHZhbCwgdGFyKSB7XG5cdFx0aWYgKGlzTm90TnVtYmVyKHZhbCkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignXFwnJGx0XFwnIHZhbHVlIG11c3QgYmUgYSBudW1iZXInKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRhciA8IHZhbDtcblx0fVxuXG5cdHN0YXRpYyAkbHRlKHZhbCwgdGFyKSB7XG5cdFx0aWYgKGlzTm90TnVtYmVyKHZhbCkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignXFwnJGx0ZVxcJyB2YWx1ZSBtdXN0IGJlIGEgbnVtYmVyJyk7XG5cdFx0fVxuXHRcdHJldHVybiB0YXIgPD0gdmFsO1xuXHR9XG5cblx0c3RhdGljICRuZSh2YWwsIHRhcikge1xuXHRcdHJldHVybiB0YXIgIT09IHZhbDtcblx0fVxuXG5cdHN0YXRpYyAkbmluKHZhbCwgdGFyKSB7XG5cdFx0aWYgKCEodmFsIGluc3RhbmNlb2YgQXJyYXkpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1xcJyRuaW5cXCcgdmFsdWUgbXVzdCBiZSBhbiBhcnJheScpO1xuXHRcdH1cblx0XHRyZXR1cm4gIXZhbC5pbmNsdWRlcyh0YXIpO1xuXHR9XG5cblx0c3RhdGljIF9jaGVja0V4aXN0KG9wKSB7XG5cdFx0aWYgKG9wcy5pbmNsdWRlcyhvcCkpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHR0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gb3BlcmF0b3I6IFxcJycgKyBvcCArICdcXCcnKTtcblx0fVxufSJdfQ==
|