ftpd-lite 1.0.4 → 1.0.8

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.
@@ -40,7 +40,7 @@ const path = __importStar(require("path"));
40
40
  const DEFAULT_USERS = [
41
41
  {
42
42
  username: 'admin',
43
- password: 'admin123',
43
+ password: 'admin',
44
44
  homeDir: path.join(__dirname, '../files/admin'),
45
45
  permissions: {
46
46
  read: true,
@@ -56,36 +56,56 @@ const DEFAULT_USERS = [
56
56
  deletemyfiles: true,
57
57
  },
58
58
  isActive: true,
59
- },
60
- {
61
- username: 'guest',
62
- password: 'guest123',
63
- homeDir: path.join(__dirname, '../files/guest'),
64
- permissions: {
65
- read: true,
66
- write: false,
67
- list: true,
68
- create: false,
69
- append: false,
70
- delete: false,
71
- chmod: false,
72
- mkd: false,
73
- rmdir: false,
74
- rename: false,
75
- deletemyfiles: false,
76
- },
77
- isActive: true,
78
- },
59
+ }
79
60
  ];
80
61
  class UserManager {
81
62
  constructor(userFile) {
82
63
  this.users = [];
83
- this.userFile = userFile;
84
- this.load();
64
+ if (typeof userFile === 'string') {
65
+ this.userFile = userFile;
66
+ this.persist = true;
67
+ this.load();
68
+ }
69
+ else {
70
+ this.userFile = null;
71
+ this.persist = false;
72
+ this.data = this.normalizeData(userFile);
73
+ this.users = this.data.users || [];
74
+ if (!this.users || this.users.length === 0) {
75
+ this.users = DEFAULT_USERS;
76
+ this.data = { users: DEFAULT_USERS, lastUpdated: new Date().toISOString() };
77
+ }
78
+ console.log(`[UserManager] ${this.users.length} users loaded (in-memory)`);
79
+ }
80
+ }
81
+ normalizeData(input) {
82
+ try {
83
+ if (input && Array.isArray(input.users)) {
84
+ return {
85
+ users: input.users,
86
+ lastUpdated: input.lastUpdated || new Date().toISOString(),
87
+ };
88
+ }
89
+ if (Array.isArray(input)) {
90
+ return {
91
+ users: input,
92
+ lastUpdated: new Date().toISOString(),
93
+ };
94
+ }
95
+ if (input && input.data && Array.isArray(input.data.users)) {
96
+ return {
97
+ users: input.data.users,
98
+ lastUpdated: input.data.lastUpdated || new Date().toISOString(),
99
+ };
100
+ }
101
+ }
102
+ catch (e) {
103
+ }
104
+ return { users: DEFAULT_USERS, lastUpdated: new Date().toISOString() };
85
105
  }
86
106
  load() {
87
107
  try {
88
- if (fs.existsSync(this.userFile)) {
108
+ if (this.userFile && fs.existsSync(this.userFile)) {
89
109
  const content = fs.readFileSync(this.userFile, 'utf-8');
90
110
  this.data = JSON.parse(content);
91
111
  this.users = this.data.users || [];
@@ -96,6 +116,7 @@ class UserManager {
96
116
  users: DEFAULT_USERS,
97
117
  lastUpdated: new Date().toISOString(),
98
118
  };
119
+ this.users = DEFAULT_USERS;
99
120
  this.save();
100
121
  console.log(`[UserManager] Default ${this.users.length} users created`);
101
122
  }
@@ -110,13 +131,16 @@ class UserManager {
110
131
  }
111
132
  }
112
133
  save() {
134
+ if (!this.persist || !this.userFile) {
135
+ return;
136
+ }
113
137
  try {
114
138
  this.data.lastUpdated = new Date().toISOString();
115
139
  fs.writeFileSync(this.userFile, JSON.stringify(this.data, null, 2));
116
- console.log(`[UserManager] Save error:`);
140
+ console.log(`[UserManager] Data saved`);
117
141
  }
118
142
  catch (error) {
119
- console.error(`[UserManager] Empty username`);
143
+ console.error(`[UserManager] Save error:`, error);
120
144
  }
121
145
  }
122
146
  findUser(username) {
@@ -140,7 +164,7 @@ class UserManager {
140
164
  }
141
165
  const existing = this.findUser(username);
142
166
  if (existing) {
143
- console.log(`[UserManager] User added: ${username}`);
167
+ console.error(`[UserManager] User already exists: ${username}`);
144
168
  return false;
145
169
  }
146
170
  const newUser = {
@@ -152,35 +176,35 @@ class UserManager {
152
176
  };
153
177
  this.users.push(newUser);
154
178
  this.save();
155
- console.log(`[UserManager] User not found: ${username}`);
179
+ console.log(`[UserManager] User added: ${username}`);
156
180
  return true;
157
181
  }
158
182
  deleteUser(username) {
159
183
  const user = this.findUser(username);
160
184
  if (!user) {
161
- console.log(`[UserManager] User deleted: ${username}`);
185
+ console.log(`[UserManager] User not found: ${username}`);
162
186
  return false;
163
187
  }
164
188
  this.users = this.users.filter((u) => u.username !== username);
165
189
  this.save();
166
- console.log(`[UserManager] User not found: ${username}`);
190
+ console.log(`[UserManager] User deleted: ${username}`);
167
191
  return true;
168
192
  }
169
193
  toggleUserStatus(username, isActive) {
170
194
  const user = this.findUser(username);
171
195
  if (!user) {
172
- console.log(`[UserManager] User status changed: ${username} (${isActive ? 'active' : 'passive'})`);
196
+ console.log(`[UserManager] User not found: ${username}`);
173
197
  return false;
174
198
  }
175
199
  user.isActive = isActive;
176
200
  this.save();
177
- console.log(`[UserManager] User not found: ${username}`);
201
+ console.log(`[UserManager] User status changed: ${username} (${isActive ? 'active' : 'passive'})`);
178
202
  return true;
179
203
  }
180
204
  updatePermissions(username, permissions) {
181
205
  const user = this.findUser(username);
182
206
  if (!user) {
183
- console.log(`[UserManager] Permissions updated: ${username}`);
207
+ console.log(`[UserManager] User not found: ${username}`);
184
208
  return false;
185
209
  }
186
210
  const currentPermissions = user.permissions || {};
@@ -190,7 +214,7 @@ class UserManager {
190
214
  };
191
215
  user.permissions = newPermissions;
192
216
  this.save();
193
- console.log(`[UserManager] Permission check failed - user not found: ${username}`);
217
+ console.log(`[UserManager] Permissions updated: ${username}`);
194
218
  return true;
195
219
  }
196
220
  checkPermission(username, permission) {
@@ -224,7 +248,7 @@ class UserManager {
224
248
  changeUsername(oldUsername, newUsername) {
225
249
  const user = this.findUser(oldUsername);
226
250
  if (!user) {
227
- console.log(`[UserManager] Username already exists: ${newUsername}`);
251
+ console.log(`[UserManager] User not found: ${oldUsername}`);
228
252
  return false;
229
253
  }
230
254
  const existing = this.findUser(newUsername);
@@ -240,12 +264,12 @@ class UserManager {
240
264
  changePassword(username, newPassword) {
241
265
  const user = this.findUser(username);
242
266
  if (!user) {
243
- console.log(`[UserManager] Password changed: ${username}`);
267
+ console.log(`[UserManager] User not found: ${username}`);
244
268
  return false;
245
269
  }
246
270
  user.password = newPassword;
247
271
  this.save();
248
- console.log(`[UserManager] User not found: ${username}`);
272
+ console.log(`[UserManager] Password changed: ${username}`);
249
273
  return true;
250
274
  }
251
275
  changeHomeDir(username, newHomeDir) {
@@ -284,4 +308,4 @@ async function getUserManager(userFile) {
284
308
  }
285
309
  return userManagerInitPromise;
286
310
  }
287
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlck1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXNlck1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE1BQVksRUFBRSwrQkFBVztBQUN6QixNQUFZLElBQUksaUNBQWE7QUFNN0IsTUFBTSxhQUFhLEdBQVc7SUFDNUI7UUFDRSxRQUFRLEVBQUUsT0FBTztRQUNqQixRQUFRLEVBQUUsVUFBVTtRQUNwQixPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLENBQUM7UUFDL0MsV0FBVyxFQUFFO1lBQ1gsSUFBSSxFQUFFLElBQUk7WUFDVixLQUFLLEVBQUUsSUFBSTtZQUNYLElBQUksRUFBRSxJQUFJO1lBQ1YsTUFBTSxFQUFFLElBQUk7WUFDWixNQUFNLEVBQUUsSUFBSTtZQUNaLE1BQU0sRUFBRSxJQUFJO1lBQ1osS0FBSyxFQUFFLElBQUk7WUFDWCxHQUFHLEVBQUUsSUFBSTtZQUNULEtBQUssRUFBRSxJQUFJO1lBQ1gsTUFBTSxFQUFFLElBQUk7WUFDWixhQUFhLEVBQUUsSUFBSTtTQUNwQjtRQUNELFFBQVEsRUFBRSxJQUFJO0tBQ2Y7SUFDRDtRQUNFLFFBQVEsRUFBRSxPQUFPO1FBQ2pCLFFBQVEsRUFBRSxVQUFVO1FBQ3BCLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQztRQUMvQyxXQUFXLEVBQUU7WUFDWCxJQUFJLEVBQUUsSUFBSTtZQUNWLEtBQUssRUFBRSxLQUFLO1lBQ1osSUFBSSxFQUFFLElBQUk7WUFDVixNQUFNLEVBQUUsS0FBSztZQUNiLE1BQU0sRUFBRSxLQUFLO1lBQ2IsTUFBTSxFQUFFLEtBQUs7WUFDYixLQUFLLEVBQUUsS0FBSztZQUNaLEdBQUcsRUFBRSxLQUFLO1lBQ1YsS0FBSyxFQUFFLEtBQUs7WUFDWixNQUFNLEVBQUUs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QUNELE9BQU8sV0FBVyxDQUFDLFNBQVMsQ0FBQztJQUMvQixDQUFDO0NBR0Y7O0FBRGdCLHFCQUFTLEdBQXVCLElBQUksQUFBM0IsQ0FBNEI7QUFJdEQsSUFBSSxtQkFBbUIsR0FBdUIsSUFBSSxDQUFDO0FBQ25ELElBQUksc0JBQXNCLEdBQWdDLElBQUksQ0FBQztBQUV4RCxLQUFLLHlCQUF5QixRQUFpQjtJQUNwRCxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUM1QixzQkFBc0IsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ25DLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ2QsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGVBQWUsQ0FBQyxDQUFDO2dCQUNuRCxDQUFDO2dCQUNELG1CQUFtQixHQUFHLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2xELENBQUM7WUFDRCxPQUFPLG1CQUFtQixDQUFDO1FBQzdCLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDUCxDQUFDO0lBQ0QsT0FBTyxzQkFBc0IsQ0FBQztBQUNoQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IFVzZXIsIFVzZXJQZXJtaXNzaW9ucywgVXNlck1hbmFnZXJEYXRhLCBQZXJtaXNzaW9uIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogRGVmYXVsdCBrdWxsYW7EsWPEsWxhclxuICovXG5jb25zdCBERUZBVUxUX1VTRVJTOiBVc2VyW10gPSBbXG4gIHtcbiAgICB1c2VybmFtZTogJ2FkbWluJyxcbiAgICBwYXNzd29yZDogJ2FkbWluMTIzJyxcbiAgICBob21lRGlyOiBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vZmlsZXMvYWRtaW4nKSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgcmVhZDogdHJ1ZSxcbiAgICAgIHdyaXRlOiB0cnVlLFxuICAgICAgbGlzdDogdHJ1ZSxcbiAgICAgIGNyZWF0ZTogdHJ1ZSxcbiAgICAgIGFwcGVuZDogdHJ1ZSxcbiAgICAgIGRlbGV0ZTogdHJ1ZSxcbiAgICAgIGNobW9kOiB0cnVlLFxuICAgICAgbWtkOiB0cnVlLFxuICAgICAgcm1kaXI6IHRydWUsXG4gICAgICByZW5hbWU6IHRydWUsXG4gICAgICBkZWxldGVteWZpbGVzOiB0cnVlLFxuICAgIH0sXG4gICAgaXNBY3RpdmU6IHRydWUsXG4gIH0sXG4gIHtcbiAgICB1c2VybmFtZTogJ2d1ZXN0JyxcbiAgICBwYXNzd29yZDogJ2d1ZXN0MTIzJyxcbiAgICBob21lRGlyOiBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vZmlsZXMvZ3Vlc3QnKSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgcmVhZDogdHJ1ZSxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIGxpc3Q6IHRydWUsXG4gICAgICBjcmVhdGU6IGZhbHNlLFxuICAgICAgYXBwZW5kOiBmYWxzZSxcbiAgICAgIGRlbGV0ZTogZmFsc2UsXG4gICAgICBjaG1vZDogZmFsc2UsXG4gICAgICBta2Q6IGZhbHNlLFxuICAgICAgcm1kaXI6IGZhbHNlLFxuICAgICAgcmVuYW1lOiBmYWxzZSxcbiAgICAgIGRlbGV0ZW15ZmlsZXM6IGZhbHNlLFxuICAgIH0sXG4gICAgaXNBY3RpdmU6IHRydWUsXG4gIH0sXG5dO1xuXG4vKipcbiAqIFVzZXJNYW5hZ2VyIGNsYXNzIC0gS3VsbGFuxLFjxLEgecO2bmV0aW1pXG4gKi9cbmV4cG9ydCBjbGFzcyBVc2VyTWFuYWdlciB7XG4gIHByaXZhdGUgdXNlckZpbGU6IHN0cmluZztcbiAgcHJpdmF0ZSB1c2VyczogVXNlcltdID0gW107XG4gIHByaXZhdGUgZGF0YTogVXNlck1hbmFnZXJEYXRhO1xuXG4gIGNvbnN0cnVjdG9yKHVzZXJGaWxlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnVzZXJGaWxlID0gdXNlckZpbGU7XG4gICAgdGhpcy5sb2FkKCk7XG4gIH1cblxuICAvKipcbiAgICogS3VsbGFuxLFjxLEgdmVyaWxlcmluaSB5w7xrbGVcbiAgICovXG4gIHByaXZhdGUgbG9hZCgpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmModGhpcy51c2VyRmlsZSkpIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyh0aGlzLnVzZXJGaWxlLCAndXRmLTgnKTtcbiAgICAgICAgdGhpcy5kYXRhID0gSlNPTi5wYXJzZShjb250ZW50KTtcbiAgICAgICAgdGhpcy51c2VycyA9IHRoaXMuZGF0YS51c2VycyB8fCBbXTtcbiAgICAgICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gJHt0aGlzLnVzZXJzLmxlbmd0aH0gdXNlcnMgbG9hZGVkYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBWYXJzYXnEsWxhbiBrdWxsYW7EsWPEsWxhcsSxIG9sdcWfdHVyXG4gICAgICAgIHRoaXMuZGF0YSA9IHtcbiAgICAgICAgICB1c2VyczogREVGQVVMVF9VU0VSUyxcbiAgICAgICAgICBsYXN0VXBkYXRlZDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnNhdmUoKTtcbiAgICAgICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gRGVmYXVsdCAke3RoaXMudXNlcnMubGVuZ3RofSB1c2VycyBjcmVhdGVkYCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFtVc2VyTWFuYWdlcl0gTG9hZCBlcnJvcjpgKTtcbiAgICAgIHRoaXMudXNlcnMgPSBERUZBVUxUX1VTRVJTO1xuICAgICAgdGhpcy5kYXRhID0ge1xuICAgICAgICB1c2VyczogREVGQVVMVF9VU0VSUyxcbiAgICAgICAgbGFzdFVwZGF0ZWQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEt1bGxhbsSxY8SxIHZlcmlsZXJpbmkga2F5ZGV0XG4gICAqL1xuICBwcml2YXRlIHNhdmUoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZGF0YS5sYXN0VXBkYXRlZCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy51c2VyRmlsZSwgSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLCBudWxsLCAyKSk7XG4gICAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBTYXZlIGVycm9yOmApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBbVXNlck1hbmFnZXJdIEVtcHR5IHVzZXJuYW1lYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEt1bGxhbsSxY8SxIGJ1bFxuICAgKi9cbiAgcHVibGljIGZpbmRVc2VyKHVzZXJuYW1lOiBzdHJpbmcpOiBVc2VyIHwgbnVsbCB7XG4gICAgaWYgKCF1c2VybmFtZSB8fCB1c2VybmFtZS50cmltKCkgPT09ICcnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBbVXNlck1hbmFnZXJdIFVzZXIgbm90IGZvdW5kOiAke3VzZXJuYW1lfWApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlciA9IHRoaXMudXNlcnMuZmluZChcbiAgICAgICh1KSA9PiB1LnVzZXJuYW1lLnRvTG93ZXJDYXNlKCkgPT09IHVzZXJuYW1lLnRvTG93ZXJDYXNlKCkgJiYgdS5pc0FjdGl2ZVxuICAgICkgYXMgVXNlciB8IG51bGw7XG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBbVXNlck1hbmFnZXJdIFVzZXIgbm90IGZvdW5kOiAke3VzZXJuYW1lfWApO1xuICAgIH1cblxuICAgIGlmICghdXNlcikge1xuICAgICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gRW1wdHkgdXNlcm5hbWUgb3IgcGFzc3dvcmRgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXNlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBLdWxsYW7EsWPEsSBla2xlXG4gICAqL1xuICBwdWJsaWMgYWRkVXNlcih1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nLCBob21lRGlyOiBzdHJpbmcsIHBlcm1pc3Npb25zOiBVc2VyUGVybWlzc2lvbnMpOiBib29sZWFuIHtcbiAgICBpZiAoIXVzZXJuYW1lIHx8ICFwYXNzd29yZCkge1xuICAgICAgY29uc29sZS5lcnJvcihgW1VzZXJNYW5hZ2VyXSBVc2VyIGFscmVhZHkgZXhpc3RzOiAke3VzZXJuYW1lfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEt1bGxhbsSxY8SxIGFkxLEgemF0ZW4gdmFyc2Ega29udHJvbCBldFxuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5maW5kVXNlcih1c2VybmFtZSk7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBVc2VyIGFkZGVkOiAke3VzZXJuYW1lfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld1VzZXI6IFVzZXIgPSB7XG4gICAgICB1c2VybmFtZSxcbiAgICAgIHBhc3N3b3JkLFxuICAgICAgaG9tZURpcjogcGF0aC5yZXNvbHZlKGhvbWVEaXIpLFxuICAgICAgcGVybWlzc2lvbnM6IHsgLi4ucGVybWlzc2lvbnMgfSxcbiAgICAgIGlzQWN0aXZlOiB0cnVlLFxuICAgIH07XG5cbiAgICB0aGlzLnVzZXJzLnB1c2gobmV3VXNlcik7XG4gICAgdGhpcy5zYXZlKCk7XG4gICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gVXNlciBub3QgZm91bmQ6ICR7dXNlcm5hbWV9YCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogS3VsbGFuxLFjxLEgc2lsXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlVXNlcih1c2VybmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdXNlciA9IHRoaXMuZmluZFVzZXIodXNlcm5hbWUpO1xuICAgIGlmICghdXNlcikge1xuICAgICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gVXNlciBkZWxldGVkOiAke3VzZXJuYW1lfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMudXNlcnMgPSB0aGlzLnVzZXJzLmZpbHRlcigodSkgPT4gdS51c2VybmFtZSAhPT0gdXNlcm5hbWUpO1xuICAgIHRoaXMuc2F2ZSgpO1xuICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdIFVzZXIgbm90IGZvdW5kOiAke3VzZXJuYW1lfWApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEt1bGxhbsSxY8SxIGFrdGlmL3Bhc2lmIHlhcFxuICAgKi9cbiAgcHVibGljIHRvZ2dsZVVzZXJTdGF0dXModXNlcm5hbWU6IHN0cmluZywgaXNBY3RpdmU6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICBjb25zdCB1c2VyID0gdGhpcy5maW5kVXNlcih1c2VybmFtZSk7XG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBVc2VyIHN0YXR1cyBjaGFuZ2VkOiAke3VzZXJuYW1lfSAoJHtpc0FjdGl2ZSA/ICdhY3RpdmUnIDogJ3Bhc3NpdmUnfSlgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB1c2VyLmlzQWN0aXZlID0gaXNBY3RpdmU7XG4gICAgdGhpcy5zYXZlKCk7XG4gICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gVXNlciBub3QgZm91bmQ6ICR7dXNlcm5hbWV9YCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogS3VsbGFuxLFjxLEgaXppbmxlcmluaSBnw7xuY2VsbGVcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVQZXJtaXNzaW9ucyh1c2VybmFtZTogc3RyaW5nLCBwZXJtaXNzaW9uczogVXNlclBlcm1pc3Npb25zKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdXNlciA9IHRoaXMuZmluZFVzZXIodXNlcm5hbWUpO1xuICAgIGlmICghdXNlcikge1xuICAgICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gUGVybWlzc2lvbnMgdXBkYXRlZDogJHt1c2VybmFtZX1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBNZXZjdXQgaXppbmxlcmkga29weWFsYVxuICAgIGNvbnN0IGN1cnJlbnRQZXJtaXNzaW9ucyA9IHVzZXIucGVybWlzc2lvbnMgfHwge307XG4gICAgXG4gICAgLy8gWWVuaSBpemlubGVyaSBiaXJsZcWfdGlyICh5ZW5pIGl6aW4gdmFyc2EgZ8O8bmNlbGxlLCB5b2tzYSBtZXZjdXQga29ydSlcbiAgICBjb25zdCBuZXdQZXJtaXNzaW9ucyA9IHtcbiAgICAgIC4uLmN1cnJlbnRQZXJtaXNzaW9ucyxcbiAgICAgIC4uLnBlcm1pc3Npb25zLFxuICAgIH0gYXMgVXNlclBlcm1pc3Npb25zO1xuXG4gICAgdXNlci5wZXJtaXNzaW9ucyA9IG5ld1Blcm1pc3Npb25zO1xuICAgIHRoaXMuc2F2ZSgpO1xuICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdIFBlcm1pc3Npb24gY2hlY2sgZmFpbGVkIC0gdXNlciBub3QgZm91bmQ6ICR7dXNlcm5hbWV9YCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogS3VsbGFuxLFjxLEgaXppbmxlcmluaSBrb250cm9sIGV0XG4gICAqL1xuICBwdWJsaWMgY2hlY2tQZXJtaXNzaW9uKHVzZXJuYW1lOiBzdHJpbmcsIHBlcm1pc3Npb246IFBlcm1pc3Npb24pOiBib29sZWFuIHtcbiAgICBjb25zdCB1c2VyID0gdGhpcy5maW5kVXNlcih1c2VybmFtZSk7XG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBVc2VyIG5vdCBmb3VuZDogJHt1c2VybmFtZX1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNQZXJtaXNzaW9uID0gdXNlci5wZXJtaXNzaW9ucz8uW3Blcm1pc3Npb25dID09PSB0cnVlO1xuXG4gICAgaWYgKCFoYXNQZXJtaXNzaW9uKSB7XG4gICAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBQZXJtaXNzaW9uIGRlbmllZDogJHt1c2VybmFtZX0gLSAke3Blcm1pc3Npb259YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdIFBlcm1pc3Npb24gZ3JhbnRlZDogJHt1c2VybmFtZX0gLSAke3Blcm1pc3Npb259YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhhc1Blcm1pc3Npb247XG4gIH1cblxuICAvKipcbiAgICogVMO8bSBrdWxsYW7EsWPEsWxhcsSxIGxpc3RlbGVcbiAgICovXG4gIHB1YmxpYyBsaXN0VXNlcnMoKTogVXNlcltdIHtcbiAgICByZXR1cm4gdGhpcy51c2Vycy5maWx0ZXIoKHUpID0+IHUuaXNBY3RpdmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEt1bGxhbsSxY8SxIGlzdGF0aXN0aWtsZXJpXG4gICAqL1xuICBwdWJsaWMgZ2V0VXNlclN0YXRzKCk6IE1hcDxzdHJpbmcsIG51bWJlcj4ge1xuICAgIGNvbnN0IHN0YXRzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICB0aGlzLnVzZXJzLmZvckVhY2goKHVzZXIpID0+IHtcbiAgICAgIHN0YXRzLnNldCh1c2VyLnVzZXJuYW1lLCBPYmplY3Qua2V5cyh1c2VyLnBlcm1pc3Npb25zIHx8IHt9KS5sZW5ndGgpO1xuICAgIH0pO1xuICAgIHJldHVybiBzdGF0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBLdWxsYW7EsWPEsSBzYXnEsXPEsW7EsSBhbFxuICAgKi9cbiAgcHVibGljIGdldFVzZXJDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnVzZXJzLmZpbHRlcigodSkgPT4gdS5pc0FjdGl2ZSkubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIEt1bGxhbsSxY8SxIGFkxLFuxLEgZGXEn2nFn3RpclxuICAgKi9cbiAgcHVibGljIGNoYW5nZVVzZXJuYW1lKG9sZFVzZXJuYW1lOiBzdHJpbmcsIG5ld1VzZXJuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCB1c2VyID0gdGhpcy5maW5kVXNlcihvbGRVc2VybmFtZSk7XG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBVc2VybmFtZSBhbHJlYWR5IGV4aXN0czogJHtuZXdVc2VybmFtZX1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBZZW5pIGt1bGxhbsSxY8SxIGFkxLEgemF0ZW4gdmFyc2Ega29udHJvbCBldFxuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5maW5kVXNlcihuZXdVc2VybmFtZSk7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBVc2VybmFtZSBhbHJlYWR5IGV4aXN0czogJHtuZXdVc2VybmFtZX1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB1c2VyLnVzZXJuYW1lID0gbmV3VXNlcm5hbWU7XG4gICAgdGhpcy5zYXZlKCk7XG4gICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gVXNlcm5hbWUgY2hhbmdlZDogJHtvbGRVc2VybmFtZX0gLT4gJHtuZXdVc2VybmFtZX1gKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBLdWxsYW7EsWPEsSDFn2lmcmVzaW5pIGRlxJ9pxZ90aXJcbiAgICovXG4gIHB1YmxpYyBjaGFuZ2VQYXNzd29yZCh1c2VybmFtZTogc3RyaW5nLCBuZXdQYXNzd29yZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdXNlciA9IHRoaXMuZmluZFVzZXIodXNlcm5hbWUpO1xuICAgIGlmICghdXNlcikge1xuICAgICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gUGFzc3dvcmQgY2hhbmdlZDogJHt1c2VybmFtZX1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB1c2VyLnBhc3N3b3JkID0gbmV3UGFzc3dvcmQ7XG4gICAgdGhpcy5zYXZlKCk7XG4gICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gVXNlciBub3QgZm91bmQ6ICR7dXNlcm5hbWV9YCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogS3VsbGFuxLFjxLEgZGl6aW5pbmkgZGXEn2nFn3RpclxuICAgKi9cbiAgcHVibGljIGNoYW5nZUhvbWVEaXIodXNlcm5hbWU6IHN0cmluZywgbmV3SG9tZURpcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdXNlciA9IHRoaXMuZmluZFVzZXIodXNlcm5hbWUpO1xuICAgIGlmICghdXNlcikge1xuICAgICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gVXNlciBub3QgZm91bmQ6ICR7dXNlcm5hbWV9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdXNlci5ob21lRGlyID0gcGF0aC5yZXNvbHZlKG5ld0hvbWVEaXIpO1xuICAgIHRoaXMuc2F2ZSgpO1xuICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdIERpcmVjdG9yeSBjaGFuZ2VkOiAke3VzZXJuYW1lfSAtPiAke3VzZXIuaG9tZURpcn1gKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VyTWFuYWdlciDDtnJuZcSfaSBvbHXFn3R1ciAoc2luZ2xldG9uKVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSh1c2VyRmlsZTogc3RyaW5nKTogVXNlck1hbmFnZXIge1xuICAgIGlmICghVXNlck1hbmFnZXIuX2luc3RhbmNlKSB7XG4gICAgICBVc2VyTWFuYWdlci5faW5zdGFuY2UgPSBuZXcgVXNlck1hbmFnZXIodXNlckZpbGUpO1xuICAgIH1cbiAgICByZXR1cm4gVXNlck1hbmFnZXIuX2luc3RhbmNlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBVc2VyTWFuYWdlciB8IG51bGwgPSBudWxsO1xufVxuXG4vLyBTaW5nbGV0b24gaW5zdGFuY2Ugb2x1xZ90dXJtYSAtIGTDtm5nw7wgYmHEn8SxbWzEsWzEscSfxLFuZGFuIGthw6fEsW5tYWsgacOnaW5cbmxldCB1c2VyTWFuYWdlckluc3RhbmNlOiBVc2VyTWFuYWdlciB8IG51bGwgPSBudWxsO1xubGV0IHVzZXJNYW5hZ2VySW5pdFByb21pc2U6IFByb21pc2U8VXNlck1hbmFnZXI+IHwgbnVsbCA9IG51bGw7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRVc2VyTWFuYWdlcih1c2VyRmlsZT86IHN0cmluZyk6IFByb21pc2U8VXNlck1hbmFnZXI+IHtcbiAgaWYgKCF1c2VyTWFuYWdlckluaXRQcm9taXNlKSB7XG4gICAgdXNlck1hbmFnZXJJbml0UHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIXVzZXJNYW5hZ2VySW5zdGFuY2UpIHtcbiAgICAgICAgaWYgKCF1c2VyRmlsZSkge1xuICAgICAgICAgIHVzZXJGaWxlID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL3VzZXJzLmpzb24nKTtcbiAgICAgICAgfVxuICAgICAgICB1c2VyTWFuYWdlckluc3RhbmNlID0gbmV3IFVzZXJNYW5hZ2VyKHVzZXJGaWxlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1c2VyTWFuYWdlckluc3RhbmNlO1xuICAgIH0pKCk7XG4gIH1cbiAgcmV0dXJuIHVzZXJNYW5hZ2VySW5pdFByb21pc2U7XG59XG4iXX0=
311
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlck1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXNlck1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE1BQVksRUFBRSwrQkFBVztBQUN6QixNQUFZLElBQUksaUNBQWE7QUFNN0IsTUFBTSxhQUFhLEdBQVc7SUFDNUI7UUFDRSxRQUFRLEVBQUUsT0FBTztRQUNqQixRQUFRLEVBQUUsT0FBTztRQUNqQixPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLENBQUM7UUFDL0MsV0FBVyxFQUFFO1lBQ1gsSUFBSSxFQUFFLElBQUk7WUFDVixLQUFLLEVBQUUsSUFBSTtZQUNYLElBQUksRUFBRSxJQUFJO1lBQ1YsTUFBTSxFQUFFLElBQUk7WUFDWixNQUFNLEVBQUUsSUFBSTtZQUNaLE1BQU0sRUFBRSxJQUFJO1lBQ1osS0FBSyxFQUFFLElBQUk7WUFDWCxHQUFHLEVBQUUsSUFBSTtZQUNULEtBQUssRUFBRSxJQUFJO1lBQ1gsTUFBTSxFQUFFLElBQUk7WUFDWixhQUFhLEVBQUUsSUFBSTtTQUNwQjtRQUNELFFBQVEsRUFBRSxJQUFJO0tBQ2Y7Q0FDRixDQUFDO0FBS0Y7SUFNRSxZQUFZLFFBQXdDO1FBSDVDLFVBQUssR0FBVyxFQUFFLENBQUM7UUFJekIsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztZQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNwQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDZCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxJQUFJLEdB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QztRQUN4QyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDWixPQUFPLENBQUMsR0FBRyxDQUFDLG9DQUFvQyxRQUFRLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDL0UsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBS00sTUFBTSxDQUFDLFdBQVcsQ0FBQyxRQUFnQjtRQUN4QyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzNCLFdBQVcsQ0FBQyxTQUFTLEdBQUcsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUNELE9BQU8sV0FBVyxDQUFDLFNBQVMsQ0FBQztJQUMvQixDQUFDO0NBR0Y7O0FBRGdCLHFCQUFTLEdBQXVCLElBQUksQUFBM0IsQ0FBNEI7QUFJdEQsSUFBSSxtQkFBbUIsR0FBdUIsSUFBSSxDQUFDO0FBQ25ELElBQUksc0JBQXNCLEdBQWdDLElBQUksQ0FBQztBQUV4RCxLQUFLLHlCQUF5QixRQUFpQjtJQUNwRCxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUM1QixzQkFBc0IsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ25DLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ2QsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGVBQWUsQ0FBQyxDQUFDO2dCQUNuRCxDQUFDO2dCQUNELG1CQUFtQixHQUFHLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2xELENBQUM7WUFDRCxPQUFPLG1CQUFtQixDQUFDO1FBQzdCLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDUCxDQUFDO0lBQ0QsT0FBTyxzQkFBc0IsQ0FBQztBQUNoQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IFVzZXIsIFVzZXJQZXJtaXNzaW9ucywgVXNlck1hbmFnZXJEYXRhLCBQZXJtaXNzaW9uIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogRGVmYXVsdCBrdWxsYW7EsWPEsWxhclxuICovXG5jb25zdCBERUZBVUxUX1VTRVJTOiBVc2VyW10gPSBbXG4gIHtcbiAgICB1c2VybmFtZTogJ2FkbWluJyxcbiAgICBwYXNzd29yZDogJ2FkbWluJyxcbiAgICBob21lRGlyOiBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vZmlsZXMvYWRtaW4nKSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgcmVhZDogdHJ1ZSxcbiAgICAgIHdyaXRlOiB0cnVlLFxuICAgICAgbGlzdDogdHJ1ZSxcbiAgICAgIGNyZWF0ZTogdHJ1ZSxcbiAgICAgIGFwcGVuZDogdHJ1ZSxcbiAgICAgIGRlbGV0ZTogdHJ1ZSxcbiAgICAgIGNobW9kOiB0cnVlLFxuICAgICAgbWtkOiB0cnVlLFxuICAgICAgcm1kaXI6IHRydWUsXG4gICAgICByZW5hbWU6IHRydWUsXG4gICAgICBkZWxldGVteWZpbGVzOiB0cnVlLFxuICAgIH0sXG4gICAgaXNBY3RpdmU6IHRydWUsXG4gIH1cbl07XG5cbi8qKlxuICogVXNlck1hbmFnZXIgY2xhc3MgLSBLdWxsYW7EsWPEsSB5w7ZuZXRpbWlcbiAqL1xuZXhwb3J0IGNsYXNzIFVzZXJNYW5hZ2VyIHtcbiAgcHJpdmF0ZSB1c2VyRmlsZTogc3RyaW5nIHwgbnVsbDtcbiAgcHJpdmF0ZSBwZXJzaXN0OiBib29sZWFuO1xuICBwcml2YXRlIHVzZXJzOiBVc2VyW10gPSBbXTtcbiAgcHJpdmF0ZSBkYXRhOiBVc2VyTWFuYWdlckRhdGE7XG5cbiAgY29uc3RydWN0b3IodXNlckZpbGU6IHN0cmluZyB8IFVzZXJNYW5hZ2VyRGF0YSB8IGFueSkge1xuICAgIGlmICh0eXBlb2YgdXNlckZpbGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLnVzZXJGaWxlID0gdXNlckZpbGU7XG4gICAgICB0aGlzLnBlcnNpc3QgPSB0cnVlO1xuICAgICAgdGhpcy5sb2FkKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXNlckZpbGUgPSBudWxsO1xuICAgICAgdGhpcy5wZXJzaXN0ID0gZmFsc2U7XG4gICAgICB0aGlzLmRhdGEgPSB0aGlzLm5vcm1hbGl6ZURhdGEodXNlckZpbGUpO1xuICAgICAgdGhpcy51c2VycyA9IHRoaXMuZGF0YS51c2VycyB8fCBbXTtcbiAgICAgIGlmICghdGhpcy51c2VycyB8fCB0aGlzLnVzZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLnVzZXJzID0gREVGQVVMVF9VU0VSUztcbiAgICAgICAgdGhpcy5kYXRhID0geyB1c2VyczogREVGQVVMVF9VU0VSUywgbGFzdFVwZGF0ZWQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9O1xuICAgICAgfVxuICAgICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gJHt0aGlzLnVzZXJzLmxlbmd0aH0gdXNlcnMgbG9hZGVkIChpbi1tZW1vcnkpYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdlbGVuIHlhcMSxbGFuZMSxcm1hc8SxbsSxIFVzZXJNYW5hZ2VyRGF0YSBiacOnaW1pbmUgbm9ybWFsaXplIGV0XG4gICAqL1xuICBwcml2YXRlIG5vcm1hbGl6ZURhdGEoaW5wdXQ6IGFueSk6IFVzZXJNYW5hZ2VyRGF0YSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChpbnB1dCAmJiBBcnJheS5pc0FycmF5KGlucHV0LnVzZXJzKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVzZXJzOiBpbnB1dC51c2VycyxcbiAgICAgICAgICBsYXN0VXBkYXRlZDogaW5wdXQubGFzdFVwZGF0ZWQgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdXNlcnM6IGlucHV0IGFzIFVzZXJbXSxcbiAgICAgICAgICBsYXN0VXBkYXRlZDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGlucHV0ICYmIGlucHV0LmRhdGEgJiYgQXJyYXkuaXNBcnJheShpbnB1dC5kYXRhLnVzZXJzKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVzZXJzOiBpbnB1dC5kYXRhLnVzZXJzLFxuICAgICAgICAgIGxhc3RVcGRhdGVkOiBpbnB1dC5kYXRhLmxhc3RVcGRhdGVkIHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyB5b2tzYXlcbiAgICB9XG4gICAgcmV0dXJuIHsgdXNlcnM6IERFRkFVTFRfVVNFUlMsIGxhc3RVcGRhdGVkOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBLdWxsYW7EsWPEsSB2ZXJpbGVyaW5pIHnDvGtsZVxuICAgKi9cbiAgcHJpdmF0ZSBsb2FkKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy51c2VyRmlsZSAmJiBmcy5leGlzdHNTeW5jKHRoaXMudXNlckZpbGUpKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmModGhpcy51c2VyRmlsZSwgJ3V0Zi04Jyk7XG4gICAgICAgIHRoaXMuZGF0YSA9IEpTT04ucGFyc2UoY29udGVudCk7XG4gICAgICAgIHRoaXMudXNlcnMgPSB0aGlzLmRhdGEudXNlcnMgfHwgW107XG4gICAgICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdICR7dGhpcy51c2Vycy5sZW5ndGh9IHVzZXJzIGxvYWRlZGApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVmFyc2F5xLFsYW4ga3VsbGFuxLFjxLFsYXLEsSBvbHXFn3R1clxuICAgICAgICB0aGlzLmRhdGEgPSB7XG4gICAgICAgICAgdXNlcnM6IERFRkFVTFRfVVNFUlMsXG4gICAgICAgICAgbGFzdFVwZGF0ZWQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy51c2VycyA9IERFRkFVTFRfVVNFUlM7XG4gICAgICAgIHRoaXMuc2F2ZSgpO1xuICAgICAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBEZWZhdWx0ICR7dGhpcy51c2Vycy5sZW5ndGh9IHVzZXJzIGNyZWF0ZWRgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihgW1VzZXJNYW5hZ2VyXSBMb2FkIGVycm9yOmApO1xuICAgICAgdGhpcy51c2VycyA9IERFRkFVTFRfVVNFUlM7XG4gICAgICB0aGlzLmRhdGEgPSB7XG4gICAgICAgIHVzZXJzOiBERUZBVUxUX1VTRVJTLFxuICAgICAgICBsYXN0VXBkYXRlZDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogS3VsbGFuxLFjxLEgdmVyaWxlcmluaSBrYXlkZXRcbiAgICovXG4gIHByaXZhdGUgc2F2ZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGVyc2lzdCB8fCAhdGhpcy51c2VyRmlsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgdGhpcy5kYXRhLmxhc3RVcGRhdGVkID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgZnMud3JpdGVGaWxlU3luYyh0aGlzLnVzZXJGaWxlLCBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEsIG51bGwsIDIpKTtcbiAgICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdIERhdGEgc2F2ZWRgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihgW1VzZXJNYW5hZ2VyXSBTYXZlIGVycm9yOmAsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogS3VsbGFuxLFjxLEgYnVsXG4gICAqL1xuICBwdWJsaWMgZmluZFVzZXIodXNlcm5hbWU6IHN0cmluZyk6IFVzZXIgfCBudWxsIHtcbiAgICBpZiAoIXVzZXJuYW1lIHx8IHVzZXJuYW1lLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFtVc2VyTWFuYWdlcl0gVXNlciBub3QgZm91bmQ6ICR7dXNlcm5hbWV9YCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VyID0gdGhpcy51c2Vycy5maW5kKFxuICAgICAgKHUpID0+IHUudXNlcm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gdXNlcm5hbWUudG9Mb3dlckNhc2UoKSAmJiB1LmlzQWN0aXZlXG4gICAgKSBhcyBVc2VyIHwgbnVsbDtcbiAgICBpZiAoIXVzZXIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFtVc2VyTWFuYWdlcl0gVXNlciBub3QgZm91bmQ6ICR7dXNlcm5hbWV9YCk7XG4gICAgfVxuXG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBFbXB0eSB1c2VybmFtZSBvciBwYXNzd29yZGApO1xuICAgIH1cblxuICAgIHJldHVybiB1c2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEt1bGxhbsSxY8SxIGVrbGVcbiAgICovXG4gIHB1YmxpYyBhZGRVc2VyKHVzZXJuYW1lOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcsIGhvbWVEaXI6IHN0cmluZywgcGVybWlzc2lvbnM6IFVzZXJQZXJtaXNzaW9ucyk6IGJvb2xlYW4ge1xuICAgIGlmICghdXNlcm5hbWUgfHwgIXBhc3N3b3JkKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBbVXNlck1hbmFnZXJdIFVzZXIgYWxyZWFkeSBleGlzdHM6ICR7dXNlcm5hbWV9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gS3VsbGFuxLFjxLEgYWTEsSB6YXRlbiB2YXJzYSBrb250cm9sIGV0XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmZpbmRVc2VyKHVzZXJuYW1lKTtcbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFtVc2VyTWFuYWdlcl0gVXNlciBhbHJlYWR5IGV4aXN0czogJHt1c2VybmFtZX1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdVc2VyOiBVc2VyID0ge1xuICAgICAgdXNlcm5hbWUsXG4gICAgICBwYXNzd29yZCxcbiAgICAgIGhvbWVEaXI6IHBhdGgucmVzb2x2ZShob21lRGlyKSxcbiAgICAgIHBlcm1pc3Npb25zOiB7IC4uLnBlcm1pc3Npb25zIH0sXG4gICAgICBpc0FjdGl2ZTogdHJ1ZSxcbiAgICB9O1xuXG4gICAgdGhpcy51c2Vycy5wdXNoKG5ld1VzZXIpO1xuICAgIHRoaXMuc2F2ZSgpO1xuICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdIFVzZXIgYWRkZWQ6ICR7dXNlcm5hbWV9YCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogS3VsbGFuxLFjxLEgc2lsXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlVXNlcih1c2VybmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdXNlciA9IHRoaXMuZmluZFVzZXIodXNlcm5hbWUpO1xuICAgIGlmICghdXNlcikge1xuICAgICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gVXNlciBub3QgZm91bmQ6ICR7dXNlcm5hbWV9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy51c2VycyA9IHRoaXMudXNlcnMuZmlsdGVyKCh1KSA9PiB1LnVzZXJuYW1lICE9PSB1c2VybmFtZSk7XG4gICAgdGhpcy5zYXZlKCk7XG4gICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gVXNlciBkZWxldGVkOiAke3VzZXJuYW1lfWApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEt1bGxhbsSxY8SxIGFrdGlmL3Bhc2lmIHlhcFxuICAgKi9cbiAgcHVibGljIHRvZ2dsZVVzZXJTdGF0dXModXNlcm5hbWU6IHN0cmluZywgaXNBY3RpdmU6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICBjb25zdCB1c2VyID0gdGhpcy5maW5kVXNlcih1c2VybmFtZSk7XG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBVc2VyIG5vdCBmb3VuZDogJHt1c2VybmFtZX1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB1c2VyLmlzQWN0aXZlID0gaXNBY3RpdmU7XG4gICAgdGhpcy5zYXZlKCk7XG4gICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gVXNlciBzdGF0dXMgY2hhbmdlZDogJHt1c2VybmFtZX0gKCR7aXNBY3RpdmUgPyAnYWN0aXZlJyA6ICdwYXNzaXZlJ30pYCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogS3VsbGFuxLFjxLEgaXppbmxlcmluaSBnw7xuY2VsbGVcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVQZXJtaXNzaW9ucyh1c2VybmFtZTogc3RyaW5nLCBwZXJtaXNzaW9uczogVXNlclBlcm1pc3Npb25zKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdXNlciA9IHRoaXMuZmluZFVzZXIodXNlcm5hbWUpO1xuICAgIGlmICghdXNlcikge1xuICAgICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gVXNlciBub3QgZm91bmQ6ICR7dXNlcm5hbWV9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gTWV2Y3V0IGl6aW5sZXJpIGtvcHlhbGFcbiAgICBjb25zdCBjdXJyZW50UGVybWlzc2lvbnMgPSB1c2VyLnBlcm1pc3Npb25zIHx8IHt9O1xuICAgIFxuICAgIC8vIFllbmkgaXppbmxlcmkgYmlybGXFn3RpciAoeWVuaSBpemluIHZhcnNhIGfDvG5jZWxsZSwgeW9rc2EgbWV2Y3V0IGtvcnUpXG4gICAgY29uc3QgbmV3UGVybWlzc2lvbnMgPSB7XG4gICAgICAuLi5jdXJyZW50UGVybWlzc2lvbnMsXG4gICAgICAuLi5wZXJtaXNzaW9ucyxcbiAgICB9IGFzIFVzZXJQZXJtaXNzaW9ucztcblxuICAgIHVzZXIucGVybWlzc2lvbnMgPSBuZXdQZXJtaXNzaW9ucztcbiAgICB0aGlzLnNhdmUoKTtcbiAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBQZXJtaXNzaW9ucyB1cGRhdGVkOiAke3VzZXJuYW1lfWApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEt1bGxhbsSxY8SxIGl6aW5sZXJpbmkga29udHJvbCBldFxuICAgKi9cbiAgcHVibGljIGNoZWNrUGVybWlzc2lvbih1c2VybmFtZTogc3RyaW5nLCBwZXJtaXNzaW9uOiBQZXJtaXNzaW9uKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdXNlciA9IHRoaXMuZmluZFVzZXIodXNlcm5hbWUpO1xuICAgIGlmICghdXNlcikge1xuICAgICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gVXNlciBub3QgZm91bmQ6ICR7dXNlcm5hbWV9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgaGFzUGVybWlzc2lvbiA9IHVzZXIucGVybWlzc2lvbnM/LltwZXJtaXNzaW9uXSA9PT0gdHJ1ZTtcblxuICAgIGlmICghaGFzUGVybWlzc2lvbikge1xuICAgICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gUGVybWlzc2lvbiBkZW5pZWQ6ICR7dXNlcm5hbWV9IC0gJHtwZXJtaXNzaW9ufWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBQZXJtaXNzaW9uIGdyYW50ZWQ6ICR7dXNlcm5hbWV9IC0gJHtwZXJtaXNzaW9ufWApO1xuICAgIH1cblxuICAgIHJldHVybiBoYXNQZXJtaXNzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFTDvG0ga3VsbGFuxLFjxLFsYXLEsSBsaXN0ZWxlXG4gICAqL1xuICBwdWJsaWMgbGlzdFVzZXJzKCk6IFVzZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMudXNlcnMuZmlsdGVyKCh1KSA9PiB1LmlzQWN0aXZlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBLdWxsYW7EsWPEsSBpc3RhdGlzdGlrbGVyaVxuICAgKi9cbiAgcHVibGljIGdldFVzZXJTdGF0cygpOiBNYXA8c3RyaW5nLCBudW1iZXI+IHtcbiAgICBjb25zdCBzdGF0cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgdGhpcy51c2Vycy5mb3JFYWNoKCh1c2VyKSA9PiB7XG4gICAgICBzdGF0cy5zZXQodXNlci51c2VybmFtZSwgT2JqZWN0LmtleXModXNlci5wZXJtaXNzaW9ucyB8fCB7fSkubGVuZ3RoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gc3RhdHM7XG4gIH1cblxuICAvKipcbiAgICogS3VsbGFuxLFjxLEgc2F5xLFzxLFuxLEgYWxcbiAgICovXG4gIHB1YmxpYyBnZXRVc2VyQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy51c2Vycy5maWx0ZXIoKHUpID0+IHUuaXNBY3RpdmUpLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBLdWxsYW7EsWPEsSBhZMSxbsSxIGRlxJ9pxZ90aXJcbiAgICovXG4gIHB1YmxpYyBjaGFuZ2VVc2VybmFtZShvbGRVc2VybmFtZTogc3RyaW5nLCBuZXdVc2VybmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdXNlciA9IHRoaXMuZmluZFVzZXIob2xkVXNlcm5hbWUpO1xuICAgIGlmICghdXNlcikge1xuICAgICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gVXNlciBub3QgZm91bmQ6ICR7b2xkVXNlcm5hbWV9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gWWVuaSBrdWxsYW7EsWPEsSBhZMSxIHphdGVuIHZhcnNhIGtvbnRyb2wgZXRcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZmluZFVzZXIobmV3VXNlcm5hbWUpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gVXNlcm5hbWUgYWxyZWFkeSBleGlzdHM6ICR7bmV3VXNlcm5hbWV9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdXNlci51c2VybmFtZSA9IG5ld1VzZXJuYW1lO1xuICAgIHRoaXMuc2F2ZSgpO1xuICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdIFVzZXJuYW1lIGNoYW5nZWQ6ICR7b2xkVXNlcm5hbWV9IC0+ICR7bmV3VXNlcm5hbWV9YCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogS3VsbGFuxLFjxLEgxZ9pZnJlc2luaSBkZcSfacWfdGlyXG4gICAqL1xuICBwdWJsaWMgY2hhbmdlUGFzc3dvcmQodXNlcm5hbWU6IHN0cmluZywgbmV3UGFzc3dvcmQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmZpbmRVc2VyKHVzZXJuYW1lKTtcbiAgICBpZiAoIXVzZXIpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdIFVzZXIgbm90IGZvdW5kOiAke3VzZXJuYW1lfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHVzZXIucGFzc3dvcmQgPSBuZXdQYXNzd29yZDtcbiAgICB0aGlzLnNhdmUoKTtcbiAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBQYXNzd29yZCBjaGFuZ2VkOiAke3VzZXJuYW1lfWApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEt1bGxhbsSxY8SxIGRpemluaW5pIGRlxJ9pxZ90aXJcbiAgICovXG4gIHB1YmxpYyBjaGFuZ2VIb21lRGlyKHVzZXJuYW1lOiBzdHJpbmcsIG5ld0hvbWVEaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmZpbmRVc2VyKHVzZXJuYW1lKTtcbiAgICBpZiAoIXVzZXIpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdIFVzZXIgbm90IGZvdW5kOiAke3VzZXJuYW1lfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHVzZXIuaG9tZURpciA9IHBhdGgucmVzb2x2ZShuZXdIb21lRGlyKTtcbiAgICB0aGlzLnNhdmUoKTtcbiAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBEaXJlY3RvcnkgY2hhbmdlZDogJHt1c2VybmFtZX0gLT4gJHt1c2VyLmhvbWVEaXJ9YCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVXNlck1hbmFnZXIgw7ZybmXEn2kgb2x1xZ90dXIgKHNpbmdsZXRvbilcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UodXNlckZpbGU6IHN0cmluZyk6IFVzZXJNYW5hZ2VyIHtcbiAgICBpZiAoIVVzZXJNYW5hZ2VyLl9pbnN0YW5jZSkge1xuICAgICAgVXNlck1hbmFnZXIuX2luc3RhbmNlID0gbmV3IFVzZXJNYW5hZ2VyKHVzZXJGaWxlKTtcbiAgICB9XG4gICAgcmV0dXJuIFVzZXJNYW5hZ2VyLl9pbnN0YW5jZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogVXNlck1hbmFnZXIgfCBudWxsID0gbnVsbDtcbn1cblxuLy8gU2luZ2xldG9uIGluc3RhbmNlIG9sdcWfdHVybWEgLSBkw7ZuZ8O8IGJhxJ/EsW1sxLFsxLHEn8SxbmRhbiBrYcOnxLFubWFrIGnDp2luXG5sZXQgdXNlck1hbmFnZXJJbnN0YW5jZTogVXNlck1hbmFnZXIgfCBudWxsID0gbnVsbDtcbmxldCB1c2VyTWFuYWdlckluaXRQcm9taXNlOiBQcm9taXNlPFVzZXJNYW5hZ2VyPiB8IG51bGwgPSBudWxsO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0VXNlck1hbmFnZXIodXNlckZpbGU/OiBzdHJpbmcpOiBQcm9taXNlPFVzZXJNYW5hZ2VyPiB7XG4gIGlmICghdXNlck1hbmFnZXJJbml0UHJvbWlzZSkge1xuICAgIHVzZXJNYW5hZ2VySW5pdFByb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCF1c2VyTWFuYWdlckluc3RhbmNlKSB7XG4gICAgICAgIGlmICghdXNlckZpbGUpIHtcbiAgICAgICAgICB1c2VyRmlsZSA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi91c2Vycy5qc29uJyk7XG4gICAgICAgIH1cbiAgICAgICAgdXNlck1hbmFnZXJJbnN0YW5jZSA9IG5ldyBVc2VyTWFuYWdlcih1c2VyRmlsZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdXNlck1hbmFnZXJJbnN0YW5jZTtcbiAgICB9KSgpO1xuICB9XG4gIHJldHVybiB1c2VyTWFuYWdlckluaXRQcm9taXNlO1xufVxuIl19
@@ -1,28 +0,0 @@
1
- import * as net from 'net';
2
- import { FtpConnection, DataConnection } from './types';
3
- export declare class ConnectionPool {
4
- private connections;
5
- private dataConnections;
6
- private config;
7
- constructor(config?: {
8
- maxConnections?: number;
9
- maxDataConnections?: number;
10
- dataPort?: number;
11
- });
12
- createFtpConnection(socket: net.Socket, connId: string, user: string | null, homeDir: string): FtpConnection;
13
- getFtpConnection(connId: string): FtpConnection | null;
14
- removeFtpConnection(connId: string): void;
15
- getActiveConnections(): number;
16
- listConnections(): Map<string, FtpConnection>;
17
- createDataConnection(socket: net.Socket, connId: string, passive: boolean): DataConnection;
18
- getDataConnection(connId: string): DataConnection | null;
19
- closeDataConnection(connId: string): void;
20
- checkDataConnectionLimit(): boolean;
21
- getStats(): {
22
- ftpConnections: number;
23
- dataConnections: number;
24
- totalConnections: number;
25
- };
26
- clearAll(): void;
27
- }
28
- export declare const connectionPool: ConnectionPool;
package/src/connection.js DELETED
@@ -1,133 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.connectionPool = exports.ConnectionPool = void 0;
37
- const net = __importStar(require("net"));
38
- class ConnectionPool {
39
- constructor(config = {}) {
40
- this.connections = new Map();
41
- this.dataConnections = new Map();
42
- this.config = {
43
- maxConnections: config.maxConnections || 100,
44
- maxDataConnections: config.maxDataConnections || 50,
45
- dataPort: config.dataPort || 20,
46
- };
47
- console.log(`[ConnectionPool] Max connections: ${this.config.maxConnections}`);
48
- console.log(`[ConnectionPool] Max data connections: ${this.config.maxDataConnections}`);
49
- }
50
- createFtpConnection(socket, connId, user, homeDir) {
51
- const connection = {
52
- socket,
53
- user,
54
- pass: null,
55
- homeDir,
56
- currentDir: homeDir,
57
- permissions: {},
58
- transferMode: null,
59
- transferSize: 0,
60
- lastReply: 0,
61
- lastMessage: '',
62
- };
63
- this.connections.set(connId, connection);
64
- console.log(`[ConnectionPool] FTP connection created: ${connId}`);
65
- return connection;
66
- }
67
- getFtpConnection(connId) {
68
- return this.connections.get(connId) || null;
69
- }
70
- removeFtpConnection(connId) {
71
- this.connections.delete(connId);
72
- console.log(`[ConnectionPool] FTP connection deleted: ${connId}`);
73
- }
74
- getActiveConnections() {
75
- return this.connections.size;
76
- }
77
- listConnections() {
78
- return new Map(this.connections);
79
- }
80
- createDataConnection(socket, connId, passive) {
81
- const dataSocket = net.createConnection(this.config.dataPort, '127.0.0.1');
82
- dataSocket.on('connect', () => {
83
- console.log(`[ConnectionPool] Data connection connected: ${connId}`);
84
- });
85
- const dataConnection = {
86
- socket: dataSocket,
87
- passive,
88
- localPort: this.config.dataPort,
89
- state: 'listening',
90
- };
91
- this.dataConnections.set(connId, dataConnection);
92
- return dataConnection;
93
- }
94
- getDataConnection(connId) {
95
- return this.dataConnections.get(connId) || null;
96
- }
97
- closeDataConnection(connId) {
98
- const dataConn = this.dataConnections.get(connId);
99
- if (dataConn) {
100
- dataConn.socket.end();
101
- this.dataConnections.delete(connId);
102
- console.log(`[ConnectionPool] Data connection closed: ${connId}`);
103
- }
104
- }
105
- checkDataConnectionLimit() {
106
- if (this.dataConnections.size >= this.config.maxDataConnections) {
107
- console.log(`[ConnectionPool] Data connection limit exceeded: ${this.dataConnections.size}/${this.config.maxDataConnections}`);
108
- return false;
109
- }
110
- return true;
111
- }
112
- getStats() {
113
- return {
114
- ftpConnections: this.connections.size,
115
- dataConnections: this.dataConnections.size,
116
- totalConnections: this.connections.size + this.dataConnections.size,
117
- };
118
- }
119
- clearAll() {
120
- console.log('[ConnectionPool] Cleaning all connections...');
121
- this.connections.forEach((conn, connId) => {
122
- conn.socket.end();
123
- });
124
- this.connections.clear();
125
- this.dataConnections.forEach((dataConn, connId) => {
126
- dataConn.socket.end();
127
- });
128
- this.dataConnections.clear();
129
- }
130
- }
131
- exports.ConnectionPool = ConnectionPool;
132
- exports.connectionPool = new ConnectionPool();
133
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25uZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE1BQVksR0FBRyxnQ0FBWTtBQU8zQjtJQVNFLFlBQVksTUFBTSxHQUlkLEVBQUU7UUFaRSxnQkFBVyxHQUErQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3BELG9CQUFlLEdBQWdDLElBQUksR0FBRyxFQUFFLENBQUM7UUFZL0QsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNaLGNBQWMsRUFBRSxNQUFNLENBQUMsY0FBYyxJQUFJLEdBQUc7WUFDNUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLGtCQUFrQixJQUFJLEVBQUU7WUFDbkQsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLElBQUksRUFBRTtTQUNoQyxDQUFDO1FBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQ0FBcUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBQy9FLE9BQU8sQ0FBQyxHQUFHLENBQUMsMENBQTBDLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO0lBQzFGLENBQUM7SUFLTSxtQkFBbUIsQ0FDeEIsTUFBa0IsRUFDbEIsTUFBYyxFQUNkLElBQW1CLEVBQ25CLE9BQWU7UUFFZixNQUFNLFVBQVUsR0FBa0I7WUFDaEMsTUFBTTtZQUNOLElBQUk7WUFDSixJQUFJLEVBQUUsSUFBSTtZQUNWLE9BQU87WUFDUCxVQUFVLEVBQUUsT0FBTztZQUNuQixXQUFXLEVBQUUsRUFBRTtZQUNmLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFlBQVksRUFBRSxDQUFDO1lBQ2YsU0FBUyxFQUFFLENBQUM7WUFDWixXQUFXLEVBQUUsRUFBRTtTQUNoQixDQUFDO1FBRUYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFF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QUcsQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3hDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDcEIsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ2hELFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDeEIsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQy9CLENBQUM7Q0FDRjs7QUFHWSxRQUFBLGNBQWMsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgbmV0IGZyb20gJ25ldCc7XG5pbXBvcnQgeyBGdHBDb25uZWN0aW9uLCBEYXRhQ29ubmVjdGlvbiB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgVXNlck1hbmFnZXIgfSBmcm9tICcuL3VzZXJNYW5hZ2VyJztcblxuLyoqXG4gKiBDb25uZWN0aW9uUG9vbCAtIEJhxJ9sYW50xLEgaGF2dXp1IHnDtm5ldGltaVxuICovXG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvblBvb2wge1xuICBwcml2YXRlIGNvbm5lY3Rpb25zOiBNYXA8c3RyaW5nLCBGdHBDb25uZWN0aW9uPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBkYXRhQ29ubmVjdGlvbnM6IE1hcDxzdHJpbmcsIERhdGFDb25uZWN0aW9uPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBjb25maWc6IHtcbiAgICBtYXhDb25uZWN0aW9uczogbnVtYmVyO1xuICAgIG1heERhdGFDb25uZWN0aW9uczogbnVtYmVyO1xuICAgIGRhdGFQb3J0OiBudW1iZXI7XG4gIH07XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiB7XG4gICAgbWF4Q29ubmVjdGlvbnM/OiBudW1iZXI7XG4gICAgbWF4RGF0YUNvbm5lY3Rpb25zPzogbnVtYmVyO1xuICAgIGRhdGFQb3J0PzogbnVtYmVyO1xuICB9ID0ge30pIHtcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIG1heENvbm5lY3Rpb25zOiBjb25maWcubWF4Q29ubmVjdGlvbnMgfHwgMTAwLFxuICAgICAgbWF4RGF0YUNvbm5lY3Rpb25zOiBjb25maWcubWF4RGF0YUNvbm5lY3Rpb25zIHx8IDUwLFxuICAgICAgZGF0YVBvcnQ6IGNvbmZpZy5kYXRhUG9ydCB8fCAyMCxcbiAgICB9O1xuICAgIGNvbnNvbGUubG9nKGBbQ29ubmVjdGlvblBvb2xdIE1heCBjb25uZWN0aW9uczogJHt0aGlzLmNvbmZpZy5tYXhDb25uZWN0aW9uc31gKTtcbiAgICBjb25zb2xlLmxvZyhgW0Nvbm5lY3Rpb25Qb29sXSBNYXggZGF0YSBjb25uZWN0aW9uczogJHt0aGlzLmNvbmZpZy5tYXhEYXRhQ29ubmVjdGlvbnN9YCk7XG4gIH1cblxuICAvKipcbiAgICogWWVuaSBGVFAgYmHEn2xhbnTEsXPEsSBvbHXFn3R1clxuICAgKi9cbiAgcHVibGljIGNyZWF0ZUZ0cENvbm5lY3Rpb24oXG4gICAgc29ja2V0OiBuZXQuU29ja2V0LFxuICAgIGNvbm5JZDogc3RyaW5nLFxuICAgIHVzZXI6IHN0cmluZyB8IG51bGwsXG4gICAgaG9tZURpcjogc3RyaW5nXG4gICk6IEZ0cENvbm5lY3Rpb24ge1xuICAgIGNvbnN0IGNvbm5lY3Rpb246IEZ0cENvbm5lY3Rpb24gPSB7XG4gICAgICBzb2NrZXQsXG4gICAgICB1c2VyLFxuICAgICAgcGFzczogbnVsbCxcbiAgICAgIGhvbWVEaXIsXG4gICAgICBjdXJyZW50RGlyOiBob21lRGlyLFxuICAgICAgcGVybWlzc2lvbnM6IHt9LFxuICAgICAgdHJhbnNmZXJNb2RlOiBudWxsLFxuICAgICAgdHJhbnNmZXJTaXplOiAwLFxuICAgICAgbGFzdFJlcGx5OiAwLFxuICAgICAgbGFzdE1lc3NhZ2U6ICcnLFxuICAgIH07XG5cbiAgICB0aGlzLmNvbm5lY3Rpb25zLnNldChjb25uSWQsIGNvbm5lY3Rpb24pO1xuICAgIGNvbnNvbGUubG9nKGBbQ29ubmVjdGlvblBvb2xdIEZUUCBjb25uZWN0aW9uIGNyZWF0ZWQ6ICR7Y29ubklkfWApO1xuICAgIHJldHVybiBjb25uZWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEJhxJ9sYW50xLF5xLEgYWxcbiAgICovXG4gIHB1YmxpYyBnZXRGdHBDb25uZWN0aW9uKGNvbm5JZDogc3RyaW5nKTogRnRwQ29ubmVjdGlvbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25zLmdldChjb25uSWQpIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQmHEn2xhbnTEsXnEsSBzaWxcbiAgICovXG4gIHB1YmxpYyByZW1vdmVGdHBDb25uZWN0aW9uKGNvbm5JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jb25uZWN0aW9ucy5kZWxldGUoY29ubklkKTtcbiAgICBjb25zb2xlLmxvZyhgW0Nvbm5lY3Rpb25Qb29sXSBGVFAgY29ubmVjdGlvbiBkZWxldGVkOiAke2Nvbm5JZH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBa3RpZiBiYcSfbGFudMSxIHNhecSxc8SxXG4gICAqL1xuICBwdWJsaWMgZ2V0QWN0aXZlQ29ubmVjdGlvbnMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9ucy5zaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIFTDvG0gYmHEn2xhbnTEsWxhcsSxIGxpc3RlbGVcbiAgICovXG4gIHB1YmxpYyBsaXN0Q29ubmVjdGlvbnMoKTogTWFwPHN0cmluZywgRnRwQ29ubmVjdGlvbj4ge1xuICAgIHJldHVybiBuZXcgTWFwKHRoaXMuY29ubmVjdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFllbmkgdmVyaSBiYcSfbGFudMSxc8SxIG9sdcWfdHVyIChQQVNWL1BBU1NJVkUpXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlRGF0YUNvbm5lY3Rpb24oXG4gICAgc29ja2V0OiBuZXQuU29ja2V0LFxuICAgIGNvbm5JZDogc3RyaW5nLFxuICAgIHBhc3NpdmU6IGJvb2xlYW5cbiAgKTogRGF0YUNvbm5lY3Rpb24ge1xuICAgIGNvbnN0IGRhdGFTb2NrZXQgPSBuZXQuY3JlYXRlQ29ubmVjdGlvbih0aGlzLmNvbmZpZy5kYXRhUG9ydCwgJzEyNy4wLjAuMScpO1xuICAgIGRhdGFTb2NrZXQub24oJ2Nvbm5lY3QnLCAoKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhgW0Nvbm5lY3Rpb25Qb29sXSBEYXRhIGNvbm5lY3Rpb24gY29ubmVjdGVkOiAke2Nvbm5JZH1gKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGRhdGFDb25uZWN0aW9uOiBEYXRhQ29ubmVjdGlvbiA9IHtcbiAgICAgIHNvY2tldDogZGF0YVNvY2tldCxcbiAgICAgIHBhc3NpdmUsXG4gICAgICBsb2NhbFBvcnQ6IHRoaXMuY29uZmlnLmRhdGFQb3J0LFxuICAgICAgc3RhdGU6ICdsaXN0ZW5pbmcnLFxuICAgIH07XG5cbiAgICB0aGlzLmRhdGFDb25uZWN0aW9ucy5zZXQoY29ubklkLCBkYXRhQ29ubmVjdGlvbik7XG4gICAgcmV0dXJuIGRhdGFDb25uZWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmkgYmHEn2xhbnTEsXPEsW7EsSBhbFxuICAgKi9cbiAgcHVibGljIGdldERhdGFDb25uZWN0aW9uKGNvbm5JZDogc3RyaW5nKTogRGF0YUNvbm5lY3Rpb24gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhQ29ubmVjdGlvbnMuZ2V0KGNvbm5JZCkgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpIGJhxJ9sYW50xLFzxLFuxLEga2FwYXRcbiAgICovXG4gIHB1YmxpYyBjbG9zZURhdGFDb25uZWN0aW9uKGNvbm5JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZGF0YUNvbm4gPSB0aGlzLmRhdGFDb25uZWN0aW9ucy5nZXQoY29ubklkKTtcbiAgICBpZiAoZGF0YUNvbm4pIHtcbiAgICAgIGRhdGFDb25uLnNvY2tldC5lbmQoKTtcbiAgICAgIHRoaXMuZGF0YUNvbm5lY3Rpb25zLmRlbGV0ZShjb25uSWQpO1xuICAgICAgY29uc29sZS5sb2coYFtDb25uZWN0aW9uUG9vbF0gRGF0YSBjb25uZWN0aW9uIGNsb3NlZDogJHtjb25uSWR9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1ha3NpbXVtIHZlcmkgYmHEn2xhbnTEsXPEsSBrb250cm9sw7xcbiAgICovXG4gIHB1YmxpYyBjaGVja0RhdGFDb25uZWN0aW9uTGltaXQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuZGF0YUNvbm5lY3Rpb25zLnNpemUgPj0gdGhpcy5jb25maWcubWF4RGF0YUNvbm5lY3Rpb25zKSB7XG4gICAgICBjb25zb2xlLmxvZyhgW0Nvbm5lY3Rpb25Qb29sXSBEYXRhIGNvbm5lY3Rpb24gbGltaXQgZXhjZWVkZWQ6ICR7dGhpcy5kYXRhQ29ubmVjdGlvbnMuc2l6ZX0vJHt0aGlzLmNvbmZpZy5tYXhEYXRhQ29ubmVjdGlvbnN9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEJhxJ9sYW50xLEgaXN0YXRpc3Rpa2xlcmlcbiAgICovXG4gIHB1YmxpYyBnZXRTdGF0cygpOiB7XG4gICAgZnRwQ29ubmVjdGlvbnM6IG51bWJlcjtcbiAgICBkYXRhQ29ubmVjdGlvbnM6IG51bWJlcjtcbiAgICB0b3RhbENvbm5lY3Rpb25zOiBudW1iZXI7XG4gIH0ge1xuICAgIHJldHVybiB7XG4gICAgICBmdHBDb25uZWN0aW9uczogdGhpcy5jb25uZWN0aW9ucy5zaXplLFxuICAgICAgZGF0YUNvbm5lY3Rpb25zOiB0aGlzLmRhdGFDb25uZWN0aW9ucy5zaXplLFxuICAgICAgdG90YWxDb25uZWN0aW9uczogdGhpcy5jb25uZWN0aW9ucy5zaXplICsgdGhpcy5kYXRhQ29ubmVjdGlvbnMuc2l6ZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFTDvG0gYmHEn2xhbnTEsWxhcsSxIHRlbWl6bGVcbiAgICovXG4gIHB1YmxpYyBjbGVhckFsbCgpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnW0Nvbm5lY3Rpb25Qb29sXSBDbGVhbmluZyBhbGwgY29ubmVjdGlvbnMuLi4nKTtcbiAgICB0aGlzLmNvbm5lY3Rpb25zLmZvckVhY2goKGNvbm4sIGNvbm5JZCkgPT4ge1xuICAgICAgY29ubi5zb2NrZXQuZW5kKCk7XG4gICAgfSk7XG4gICAgdGhpcy5jb25uZWN0aW9ucy5jbGVhcigpO1xuICAgIHRoaXMuZGF0YUNvbm5lY3Rpb25zLmZvckVhY2goKGRhdGFDb25uLCBjb25uSWQpID0+IHtcbiAgICAgIGRhdGFDb25uLnNvY2tldC5lbmQoKTtcbiAgICB9KTtcbiAgICB0aGlzLmRhdGFDb25uZWN0aW9ucy5jbGVhcigpO1xuICB9XG59XG5cbi8vIFNpbmdsZXRvbiBpbnN0YW5jZVxuZXhwb3J0IGNvbnN0IGNvbm5lY3Rpb25Qb29sID0gbmV3IENvbm5lY3Rpb25Qb29sKCk7Il19
@@ -1,7 +0,0 @@
1
- export declare class DataServer {
2
- private server;
3
- private port;
4
- constructor(port: number);
5
- start(): void;
6
- stop(): void;
7
- }
@@ -1,76 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.DataServer = void 0;
37
- const net = __importStar(require("net"));
38
- const logger_1 = require("../utils/logger");
39
- class DataServer {
40
- constructor(port) {
41
- this.server = null;
42
- this.port = port;
43
- }
44
- start() {
45
- try {
46
- this.server = net.createServer((socket) => {
47
- logger_1.Logger.info(`[DataServer] Data connection established: port ${this.port}`);
48
- socket.on('data', (data) => {
49
- });
50
- socket.on('error', (err) => {
51
- logger_1.Logger.error(`[DataServer] Data connection error: ${err.message}`);
52
- });
53
- socket.on('close', () => {
54
- logger_1.Logger.info('[DataServer] Data connection closed');
55
- });
56
- });
57
- this.server.listen(this.port, () => {
58
- logger_1.Logger.info(`[DataServer] Data server started: port ${this.port}`);
59
- });
60
- this.server.on('error', (err) => {
61
- logger_1.Logger.error(`[DataServer] Server error: ${err.message}`);
62
- });
63
- }
64
- catch (error) {
65
- logger_1.Logger.error('[DataServer] Startup error:', error);
66
- }
67
- }
68
- stop() {
69
- if (this.server) {
70
- this.server.close();
71
- logger_1.Logger.info('[DataServer] Data server closed');
72
- }
73
- }
74
- }
75
- exports.DataServer = DataServer;
76
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGF0YVNlcnZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL0RhdGFTZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsTUFBWSxHQUFHLGdDQUFZO0FBQzNCLDRDQUF5QztBQUt6QztJQUlFLFlBQVksSUFBWTtRQUhoQixXQUFNLEdBQXNCLElBQUksQ0FBQztRQUl2QyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRU0sS0FBSztRQUNWLElBQUksQ0FBQztZQUNILElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUN4QyxlQUFNLENBQUMsSUFBSSxDQUFDLGtEQUFrRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDM0UsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFZLEVBQUUsRUFBRTtnQkFFbkMsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtvQkFDekIsZUFBTSxDQUFDLEtBQUssQ0FBQyx1Q0FBdUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQ3JFLENBQUMsQ0FBQyxDQUFDO2dCQUVILE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRTtvQkFDdEIsZUFBTSxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO2dCQUNyRCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUU7Z0JBQ2pDLGVBQU0sQ0FBQyxJQUFJLENBQUMsMENBQTBDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3JFLENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQzlCLGVBQU0sQ0FBQyxLQUFLLENBQUMsOEJBQThCLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQzVELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixlQUFNLENBQUMsS0FBSyxDQUFDLDZCQUE2QixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3JELENBQUM7SUFDSCxDQUFDO0lBRU0sSUFBSTtRQUNULElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDcEIsZUFBTSxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1FBQ2pELENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBuZXQgZnJvbSAnbmV0JztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlcic7XG5cbi8qKlxuICogRGF0YSBTdW51Y3VzdSBjbGFzc1xuICovXG5leHBvcnQgY2xhc3MgRGF0YVNlcnZlciB7XG4gIHByaXZhdGUgc2VydmVyOiBuZXQuU2VydmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcG9ydDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHBvcnQ6IG51bWJlcikge1xuICAgIHRoaXMucG9ydCA9IHBvcnQ7XG4gIH1cblxuICBwdWJsaWMgc3RhcnQoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuc2VydmVyID0gbmV0LmNyZWF0ZVNlcnZlcigoc29ja2V0KSA9PiB7XG4gICAgICAgIExvZ2dlci5pbmZvKGBbRGF0YVNlcnZlcl0gRGF0YSBjb25uZWN0aW9uIGVzdGFibGlzaGVkOiBwb3J0ICR7dGhpcy5wb3J0fWApO1xuICAgICAgICBzb2NrZXQub24oJ2RhdGEnLCAoZGF0YTogQnVmZmVyKSA9PiB7XG4gICAgICAgICAgLy8gRGF0YSB0cmFuc2ZlciBpxZ9sZW1sZXJpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNvY2tldC5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgICAgTG9nZ2VyLmVycm9yKGBbRGF0YVNlcnZlcl0gRGF0YSBjb25uZWN0aW9uIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICB9KTtcblxuICAgICAgICBzb2NrZXQub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICAgIExvZ2dlci5pbmZvKCdbRGF0YVNlcnZlcl0gRGF0YSBjb25uZWN0aW9uIGNsb3NlZCcpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNlcnZlci5saXN0ZW4odGhpcy5wb3J0LCAoKSA9PiB7XG4gICAgICAgIExvZ2dlci5pbmZvKGBbRGF0YVNlcnZlcl0gRGF0YSBzZXJ2ZXIgc3RhcnRlZDogcG9ydCAke3RoaXMucG9ydH1gKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNlcnZlci5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgIExvZ2dlci5lcnJvcihgW0RhdGFTZXJ2ZXJdIFNlcnZlciBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBMb2dnZXIuZXJyb3IoJ1tEYXRhU2VydmVyXSBTdGFydHVwIGVycm9yOicsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RvcCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZXJ2ZXIpIHtcbiAgICAgIHRoaXMuc2VydmVyLmNsb3NlKCk7XG4gICAgICBMb2dnZXIuaW5mbygnW0RhdGFTZXJ2ZXJdIERhdGEgc2VydmVyIGNsb3NlZCcpO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -1,2 +0,0 @@
1
- export * from './FtpServer';
2
- export * from './DataServer';
package/src/core/index.js DELETED
@@ -1,19 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./FtpServer"), exports);
18
- __exportStar(require("./DataServer"), exports);
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29yZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsOENBQTRCO0FBQzVCLCtDQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vRnRwU2VydmVyJztcbmV4cG9ydCAqIGZyb20gJy4vRGF0YVNlcnZlcic7XG4iXX0=
@@ -1,15 +0,0 @@
1
- import { FtpConnection } from './types';
2
- export declare class FileTransfer {
3
- private userManager;
4
- constructor();
5
- private getUserManager;
6
- private checkPermission;
7
- uploadFile(conn: FtpConnection, remotePath: string, data: Buffer): Promise<void>;
8
- downloadFile(conn: FtpConnection, remotePath: string): Promise<void>;
9
- deleteFile(conn: FtpConnection, remotePath: string): Promise<void>;
10
- createDirectory(conn: FtpConnection, remotePath: string): Promise<void>;
11
- removeDirectory(conn: FtpConnection, remotePath: string): Promise<void>;
12
- renameFile(conn: FtpConnection, oldPath: string, newPath: string): Promise<void>;
13
- changeFileMode(conn: FtpConnection, remotePath: string, mode: number): Promise<void>;
14
- }
15
- export declare const fileTransfer: FileTransfer;