ftpd-lite 0.0.0-stage → 1.0.3
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/LICENSE +201 -0
- package/README.md +121 -2
- package/examples/basic.js +28 -0
- package/package.json +47 -4
- package/src/commands/CwdCommand.d.ts +3 -0
- package/src/commands/CwdCommand.js +91 -0
- package/src/commands/DeleCommand.d.ts +3 -0
- package/src/commands/DeleCommand.js +85 -0
- package/src/commands/FeatCommand.d.ts +2 -0
- package/src/commands/FeatCommand.js +30 -0
- package/src/commands/ListCommand.d.ts +4 -0
- package/src/commands/ListCommand.js +92 -0
- package/src/commands/MkdCommand.d.ts +3 -0
- package/src/commands/MkdCommand.js +97 -0
- package/src/commands/NoopCommand.d.ts +2 -0
- package/src/commands/NoopCommand.js +12 -0
- package/src/commands/PassCommand.d.ts +3 -0
- package/src/commands/PassCommand.js +43 -0
- package/src/commands/PasvCommand.d.ts +2 -0
- package/src/commands/PasvCommand.js +27 -0
- package/src/commands/PortCommand.d.ts +2 -0
- package/src/commands/PortCommand.js +34 -0
- package/src/commands/PwdCommand.d.ts +2 -0
- package/src/commands/PwdCommand.js +30 -0
- package/src/commands/QuitCommand.d.ts +2 -0
- package/src/commands/QuitCommand.js +21 -0
- package/src/commands/RetrCommand.d.ts +3 -0
- package/src/commands/RetrCommand.js +83 -0
- package/src/commands/RmdCommand.d.ts +3 -0
- package/src/commands/RmdCommand.js +97 -0
- package/src/commands/RnfrCommand.d.ts +3 -0
- package/src/commands/RnfrCommand.js +85 -0
- package/src/commands/RntoCommand.d.ts +3 -0
- package/src/commands/RntoCommand.js +104 -0
- package/src/commands/StorCommand.d.ts +3 -0
- package/src/commands/StorCommand.js +87 -0
- package/src/commands/SystCommand.d.ts +2 -0
- package/src/commands/SystCommand.js +22 -0
- package/src/commands/TypeCommand.d.ts +2 -0
- package/src/commands/TypeCommand.js +29 -0
- package/src/commands/UserCommand.d.ts +3 -0
- package/src/commands/UserCommand.js +79 -0
- package/src/commands/index.d.ts +19 -0
- package/src/commands/index.js +36 -0
- package/src/connection.d.ts +28 -0
- package/src/connection.js +133 -0
- package/src/core/DataServer.d.ts +7 -0
- package/src/core/DataServer.js +76 -0
- package/src/core/FtpServer.d.ts +44 -0
- package/src/core/FtpServer.js +502 -0
- package/src/core/index.d.ts +2 -0
- package/src/core/index.js +19 -0
- package/src/fileTransfer.d.ts +15 -0
- package/src/fileTransfer.js +120 -0
- package/src/index.d.ts +6 -0
- package/src/index.js +16 -0
- package/src/types/index.d.ts +119 -0
- package/src/types/index.js +53 -0
- package/src/types.d.ts +130 -0
- package/src/types.js +53 -0
- package/src/userManager.d.ts +24 -0
- package/src/userManager.js +287 -0
- package/src/utils/logger.d.ts +14 -0
- package/src/utils/logger.js +36 -0
- package/src/utils/pathUtils.d.ts +7 -0
- package/src/utils/pathUtils.js +145 -0
|
@@ -0,0 +1,287 @@
|
|
|
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.UserManager = void 0;
|
|
37
|
+
exports.getUserManager = getUserManager;
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const DEFAULT_USERS = [
|
|
41
|
+
{
|
|
42
|
+
username: 'admin',
|
|
43
|
+
password: 'admin123',
|
|
44
|
+
homeDir: path.join(__dirname, '../files/admin'),
|
|
45
|
+
permissions: {
|
|
46
|
+
read: true,
|
|
47
|
+
write: true,
|
|
48
|
+
list: true,
|
|
49
|
+
create: true,
|
|
50
|
+
append: true,
|
|
51
|
+
delete: true,
|
|
52
|
+
chmod: true,
|
|
53
|
+
mkd: true,
|
|
54
|
+
rmdir: true,
|
|
55
|
+
rename: true,
|
|
56
|
+
deletemyfiles: true,
|
|
57
|
+
},
|
|
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
|
+
},
|
|
79
|
+
];
|
|
80
|
+
class UserManager {
|
|
81
|
+
constructor(userFile) {
|
|
82
|
+
this.users = [];
|
|
83
|
+
this.userFile = userFile;
|
|
84
|
+
this.load();
|
|
85
|
+
}
|
|
86
|
+
load() {
|
|
87
|
+
try {
|
|
88
|
+
if (fs.existsSync(this.userFile)) {
|
|
89
|
+
const content = fs.readFileSync(this.userFile, 'utf-8');
|
|
90
|
+
this.data = JSON.parse(content);
|
|
91
|
+
this.users = this.data.users || [];
|
|
92
|
+
console.log(`[UserManager] ${this.users.length} kullanıcı yüklendi`);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
this.data = {
|
|
96
|
+
users: DEFAULT_USERS,
|
|
97
|
+
lastUpdated: new Date().toISOString(),
|
|
98
|
+
};
|
|
99
|
+
this.save();
|
|
100
|
+
console.log(`[UserManager] Varsayılan ${this.users.length} kullanıcı oluşturuldu`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
console.error('[UserManager] Yükleme hatası:', error);
|
|
105
|
+
this.users = DEFAULT_USERS;
|
|
106
|
+
this.data = {
|
|
107
|
+
users: DEFAULT_USERS,
|
|
108
|
+
lastUpdated: new Date().toISOString(),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
save() {
|
|
113
|
+
try {
|
|
114
|
+
this.data.lastUpdated = new Date().toISOString();
|
|
115
|
+
fs.writeFileSync(this.userFile, JSON.stringify(this.data, null, 2));
|
|
116
|
+
console.log(`[UserManager] Veriler kaydedildi: ${this.userFile}`);
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
console.error('[UserManager] Kaydetme hatası:', error);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
findUser(username) {
|
|
123
|
+
if (!username || username.trim() === '') {
|
|
124
|
+
console.error('[UserManager] Boş kullanıcı adı');
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
const user = this.users.find((u) => u.username.toLowerCase() === username.toLowerCase() && u.isActive);
|
|
128
|
+
if (!user) {
|
|
129
|
+
console.error('[UserManager] Kullanıcı bulunamadı: ' + username);
|
|
130
|
+
}
|
|
131
|
+
if (!user) {
|
|
132
|
+
console.log(`[UserManager] Kullanıcı bulunamadı: ${username}`);
|
|
133
|
+
}
|
|
134
|
+
return user;
|
|
135
|
+
}
|
|
136
|
+
addUser(username, password, homeDir, permissions) {
|
|
137
|
+
if (!username || !password) {
|
|
138
|
+
console.error('[UserManager] Boş kullanıcı adı veya şifre');
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
const existing = this.findUser(username);
|
|
142
|
+
if (existing) {
|
|
143
|
+
console.log(`[UserManager] Kullanıcı zaten var: ${username}`);
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
const newUser = {
|
|
147
|
+
username,
|
|
148
|
+
password,
|
|
149
|
+
homeDir: path.resolve(homeDir),
|
|
150
|
+
permissions: { ...permissions },
|
|
151
|
+
isActive: true,
|
|
152
|
+
};
|
|
153
|
+
this.users.push(newUser);
|
|
154
|
+
this.save();
|
|
155
|
+
console.log(`[UserManager] Kullanıcı eklendi: ${username}`);
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
deleteUser(username) {
|
|
159
|
+
const user = this.findUser(username);
|
|
160
|
+
if (!user) {
|
|
161
|
+
console.log(`[UserManager] Kullanıcı bulunamadı: ${username}`);
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
this.users = this.users.filter((u) => u.username !== username);
|
|
165
|
+
this.save();
|
|
166
|
+
console.log(`[UserManager] Kullanıcı silindi: ${username}`);
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
toggleUserStatus(username, isActive) {
|
|
170
|
+
const user = this.findUser(username);
|
|
171
|
+
if (!user) {
|
|
172
|
+
console.log(`[UserManager] Kullanıcı bulunamadı: ${username}`);
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
user.isActive = isActive;
|
|
176
|
+
this.save();
|
|
177
|
+
console.log(`[UserManager] Kullanıcı durumu değiştirildi: ${username} (${isActive ? 'aktif' : 'pasif'})`);
|
|
178
|
+
return true;
|
|
179
|
+
}
|
|
180
|
+
updatePermissions(username, permissions) {
|
|
181
|
+
const user = this.findUser(username);
|
|
182
|
+
if (!user) {
|
|
183
|
+
console.log(`[UserManager] Kullanıcı bulunamadı: ${username}`);
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
const currentPermissions = user.permissions || {};
|
|
187
|
+
const newPermissions = {
|
|
188
|
+
...currentPermissions,
|
|
189
|
+
...permissions,
|
|
190
|
+
};
|
|
191
|
+
user.permissions = newPermissions;
|
|
192
|
+
this.save();
|
|
193
|
+
console.log(`[UserManager] İzinler güncellendi: ${username}`);
|
|
194
|
+
return true;
|
|
195
|
+
}
|
|
196
|
+
checkPermission(username, permission) {
|
|
197
|
+
const user = this.findUser(username);
|
|
198
|
+
if (!user) {
|
|
199
|
+
console.log(`[UserManager] İzin kontrolü başarısız - kullanıcı bulunamadı: ${username}`);
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
const hasPermission = user.permissions?.[permission] === true;
|
|
203
|
+
if (!hasPermission) {
|
|
204
|
+
console.log(`[UserManager] İzin reddedildi: ${username} - ${permission}`);
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
console.log(`[UserManager] İzin onaylandı: ${username} - ${permission}`);
|
|
208
|
+
}
|
|
209
|
+
return hasPermission;
|
|
210
|
+
}
|
|
211
|
+
listUsers() {
|
|
212
|
+
return this.users.filter((u) => u.isActive);
|
|
213
|
+
}
|
|
214
|
+
getUserStats() {
|
|
215
|
+
const stats = new Map();
|
|
216
|
+
this.users.forEach((user) => {
|
|
217
|
+
stats.set(user.username, Object.keys(user.permissions || {}).length);
|
|
218
|
+
});
|
|
219
|
+
return stats;
|
|
220
|
+
}
|
|
221
|
+
getUserCount() {
|
|
222
|
+
return this.users.filter((u) => u.isActive).length;
|
|
223
|
+
}
|
|
224
|
+
changeUsername(oldUsername, newUsername) {
|
|
225
|
+
const user = this.findUser(oldUsername);
|
|
226
|
+
if (!user) {
|
|
227
|
+
console.log(`[UserManager] Kullanıcı bulunamadı: ${oldUsername}`);
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
const existing = this.findUser(newUsername);
|
|
231
|
+
if (existing) {
|
|
232
|
+
console.log(`[UserManager] Kullanıcı adı zaten var: ${newUsername}`);
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
user.username = newUsername;
|
|
236
|
+
this.save();
|
|
237
|
+
console.log(`[UserManager] Kullanıcı adı değiştirildi: ${oldUsername} -> ${newUsername}`);
|
|
238
|
+
return true;
|
|
239
|
+
}
|
|
240
|
+
changePassword(username, newPassword) {
|
|
241
|
+
const user = this.findUser(username);
|
|
242
|
+
if (!user) {
|
|
243
|
+
console.log(`[UserManager] Kullanıcı bulunamadı: ${username}`);
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
user.password = newPassword;
|
|
247
|
+
this.save();
|
|
248
|
+
console.log(`[UserManager] Şifre değiştirildi: ${username}`);
|
|
249
|
+
return true;
|
|
250
|
+
}
|
|
251
|
+
changeHomeDir(username, newHomeDir) {
|
|
252
|
+
const user = this.findUser(username);
|
|
253
|
+
if (!user) {
|
|
254
|
+
console.log(`[UserManager] Kullanıcı bulunamadı: ${username}`);
|
|
255
|
+
return false;
|
|
256
|
+
}
|
|
257
|
+
user.homeDir = path.resolve(newHomeDir);
|
|
258
|
+
this.save();
|
|
259
|
+
console.log(`[UserManager] Dizin değiştirildi: ${username} -> ${user.homeDir}`);
|
|
260
|
+
return true;
|
|
261
|
+
}
|
|
262
|
+
static getInstance(userFile) {
|
|
263
|
+
if (!UserManager._instance) {
|
|
264
|
+
UserManager._instance = new UserManager(userFile);
|
|
265
|
+
}
|
|
266
|
+
return UserManager._instance;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
exports.UserManager = UserManager;
|
|
270
|
+
UserManager._instance = null;
|
|
271
|
+
let userManagerInstance = null;
|
|
272
|
+
let userManagerInitPromise = null;
|
|
273
|
+
async function getUserManager(userFile) {
|
|
274
|
+
if (!userManagerInitPromise) {
|
|
275
|
+
userManagerInitPromise = (async () => {
|
|
276
|
+
if (!userManagerInstance) {
|
|
277
|
+
if (!userFile) {
|
|
278
|
+
userFile = path.join(__dirname, '../users.json');
|
|
279
|
+
}
|
|
280
|
+
userManagerInstance = new UserManager(userFile);
|
|
281
|
+
}
|
|
282
|
+
return userManagerInstance;
|
|
283
|
+
})();
|
|
284
|
+
}
|
|
285
|
+
return userManagerInitPromise;
|
|
286
|
+
}
|
|
287
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlck1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXNlck1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE1BQVksRUFBRSwrQkFBVztBQUN6QixNQUFZLElBQUksaUNBQWE7QUFNN0IsTUFBTSxhQUFhLEdBQVc7SUFDNUI7UUFDRSxRQUFRLEVBQUUsT0FBTztRQUNqQixRQUFRLEVBQUUsVUFBVTtRQUNwQixPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLENBQUM7UUFDL0MsV0FBVyxFQUFFO1lBQ1gsSUFBSSxFQUFFLElBQUk7WUFDVixLQUFLLEVBQUUsSUFBSTtZQUNYLElBQUksRUFBRSxJQUFJO1lBQ1YsTUFBTSxFQUFFLElBQUk7WUFDWixNQUFNLEVBQUUsSUFBSTtZQUNaLE1BQU0sRUFBRSxJQUFJO1lBQ1osS0FBSyxFQUFFLElBQUk7WUFDWCxHQUFHLEVBQUUsSUFBSTtZQUNULEtBQUssRUFBRSxJQUFJO1lBQ1gsTUFBTSxFQUFFLElBQUk7WUFDWixhQUFhLEVBQUUsSUFBSTtTQUNwQjtRQUNELFFBQVEsRUFBRSxJQUFJO0tBQ2Y7SUFDRDtRQUNFLFFBQVEsRUFBRSxPQUFPO1FBQ2pCLFFBQVEsRUFBRSxVQUFVO1FBQ3BCLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQztRQUMvQyxXQUFXLEVBQUU7WUFDWCxJQUFJLEVBQUUsSUFBSTtZQUNWLEtBQUssRUFBRSxLQUFLO1lBQ1osSUFBSSxFQUFFLElBQUk7WUFDVixNQUFNLEVBQUUsS0FBSztZQUNiLE1BQU0sRUFBRSxLQUFLO1lBQ2IsTUFBTSxFQUFFLEtBQUs7WUFDYixLQUFLLEVBQUUsS0FBSztZQUNaLEdBQUcsRUFBRSxLQUFLO1lBQ1YsS0FBSyxFQUFFLEtBQUs7WUFDWixNQUFNLEVBQUUs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Q0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBQ0QsT0FBTyxXQUFXLENBQUMsU0FBUyxDQUFDO0lBQy9CLENBQUM7Q0FHRjs7QUFEZ0IscUJBQVMsR0FBdUIsSUFBSSxBQUEzQixDQUE0QjtBQUl0RCxJQUFJLG1CQUFtQixHQUF1QixJQUFJLENBQUM7QUFDbkQsSUFBSSxzQkFBc0IsR0FBZ0MsSUFBSSxDQUFDO0FBRXhELEtBQUsseUJBQXlCLFFBQWlCO0lBQ3BELElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQzVCLHNCQUFzQixHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDbkMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDZCxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsZUFBZSxDQUFDLENBQUM7Z0JBQ25ELENBQUM7Z0JBQ0QsbUJBQW1CLEdBQUcsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbEQsQ0FBQztZQUNELE9BQU8sbUJBQW1CLENBQUM7UUFDN0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNQLENBQUM7SUFDRCxPQUFPLHNCQUFzQixDQUFDO0FBQ2hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XHJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCB7IFVzZXIsIFVzZXJQZXJtaXNzaW9ucywgVXNlck1hbmFnZXJEYXRhLCBQZXJtaXNzaW9uIH0gZnJvbSAnLi90eXBlcyc7XHJcblxyXG4vKipcclxuICogRGVmYXVsdCBrdWxsYW7EsWPEsWxhclxyXG4gKi9cclxuY29uc3QgREVGQVVMVF9VU0VSUzogVXNlcltdID0gW1xyXG4gIHtcclxuICAgIHVzZXJuYW1lOiAnYWRtaW4nLFxyXG4gICAgcGFzc3dvcmQ6ICdhZG1pbjEyMycsXHJcbiAgICBob21lRGlyOiBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vZmlsZXMvYWRtaW4nKSxcclxuICAgIHBlcm1pc3Npb25zOiB7XHJcbiAgICAgIHJlYWQ6IHRydWUsXHJcbiAgICAgIHdyaXRlOiB0cnVlLFxyXG4gICAgICBsaXN0OiB0cnVlLFxyXG4gICAgICBjcmVhdGU6IHRydWUsXHJcbiAgICAgIGFwcGVuZDogdHJ1ZSxcclxuICAgICAgZGVsZXRlOiB0cnVlLFxyXG4gICAgICBjaG1vZDogdHJ1ZSxcclxuICAgICAgbWtkOiB0cnVlLFxyXG4gICAgICBybWRpcjogdHJ1ZSxcclxuICAgICAgcmVuYW1lOiB0cnVlLFxyXG4gICAgICBkZWxldGVteWZpbGVzOiB0cnVlLFxyXG4gICAgfSxcclxuICAgIGlzQWN0aXZlOiB0cnVlLFxyXG4gIH0sXHJcbiAge1xyXG4gICAgdXNlcm5hbWU6ICdndWVzdCcsXHJcbiAgICBwYXNzd29yZDogJ2d1ZXN0MTIzJyxcclxuICAgIGhvbWVEaXI6IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi9maWxlcy9ndWVzdCcpLFxyXG4gICAgcGVybWlzc2lvbnM6IHtcclxuICAgICAgcmVhZDogdHJ1ZSxcclxuICAgICAgd3JpdGU6IGZhbHNlLFxyXG4gICAgICBsaXN0OiB0cnVlLFxyXG4gICAgICBjcmVhdGU6IGZhbHNlLFxyXG4gICAgICBhcHBlbmQ6IGZhbHNlLFxyXG4gICAgICBkZWxldGU6IGZhbHNlLFxyXG4gICAgICBjaG1vZDogZmFsc2UsXHJcbiAgICAgIG1rZDogZmFsc2UsXHJcbiAgICAgIHJtZGlyOiBmYWxzZSxcclxuICAgICAgcmVuYW1lOiBmYWxzZSxcclxuICAgICAgZGVsZXRlbXlmaWxlczogZmFsc2UsXHJcbiAgICB9LFxyXG4gICAgaXNBY3RpdmU6IHRydWUsXHJcbiAgfSxcclxuXTtcclxuXHJcbi8qKlxyXG4gKiBVc2VyTWFuYWdlciBjbGFzcyAtIEt1bGxhbsSxY8SxIHnDtm5ldGltaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFVzZXJNYW5hZ2VyIHtcclxuICBwcml2YXRlIHVzZXJGaWxlOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSB1c2VyczogVXNlcltdID0gW107XHJcbiAgcHJpdmF0ZSBkYXRhOiBVc2VyTWFuYWdlckRhdGE7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHVzZXJGaWxlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMudXNlckZpbGUgPSB1c2VyRmlsZTtcclxuICAgIHRoaXMubG9hZCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogS3VsbGFuxLFjxLEgdmVyaWxlcmluaSB5w7xrbGVcclxuICAgKi9cclxuICBwcml2YXRlIGxvYWQoKTogdm9pZCB7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyh0aGlzLnVzZXJGaWxlKSkge1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmModGhpcy51c2VyRmlsZSwgJ3V0Zi04Jyk7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gSlNPTi5wYXJzZShjb250ZW50KTtcclxuICAgICAgICB0aGlzLnVzZXJzID0gdGhpcy5kYXRhLnVzZXJzIHx8IFtdO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdICR7dGhpcy51c2Vycy5sZW5ndGh9IGt1bGxhbsSxY8SxIHnDvGtsZW5kaWApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIFZhcnNhecSxbGFuIGt1bGxhbsSxY8SxbGFyxLEgb2x1xZ90dXJcclxuICAgICAgICB0aGlzLmRhdGEgPSB7XHJcbiAgICAgICAgICB1c2VyczogREVGQVVMVF9VU0VSUyxcclxuICAgICAgICAgIGxhc3RVcGRhdGVkOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnNhdmUoKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBWYXJzYXnEsWxhbiAke3RoaXMudXNlcnMubGVuZ3RofSBrdWxsYW7EsWPEsSBvbHXFn3R1cnVsZHVgKTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignW1VzZXJNYW5hZ2VyXSBZw7xrbGVtZSBoYXRhc8SxOicsIGVycm9yKTtcclxuICAgICAgdGhpcy51c2VycyA9IERFRkFVTFRfVVNFUlM7XHJcbiAgICAgIHRoaXMuZGF0YSA9IHtcclxuICAgICAgICB1c2VyczogREVGQVVMVF9VU0VSUyxcclxuICAgICAgICBsYXN0VXBkYXRlZDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogS3VsbGFuxLFjxLEgdmVyaWxlcmluaSBrYXlkZXRcclxuICAgKi9cclxuICBwcml2YXRlIHNhdmUoKTogdm9pZCB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLmRhdGEubGFzdFVwZGF0ZWQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XHJcbiAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy51c2VyRmlsZSwgSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLCBudWxsLCAyKSk7XHJcbiAgICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdIFZlcmlsZXIga2F5ZGVkaWxkaTogJHt0aGlzLnVzZXJGaWxlfWApO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignW1VzZXJNYW5hZ2VyXSBLYXlkZXRtZSBoYXRhc8SxOicsIGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEt1bGxhbsSxY8SxIGJ1bFxyXG4gICAqL1xyXG4gIHB1YmxpYyBmaW5kVXNlcih1c2VybmFtZTogc3RyaW5nKTogVXNlciB8IG51bGwge1xyXG4gICAgaWYgKCF1c2VybmFtZSB8fCB1c2VybmFtZS50cmltKCkgPT09ICcnKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tVc2VyTWFuYWdlcl0gQm/FnyBrdWxsYW7EsWPEsSBhZMSxJyk7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHVzZXIgPSB0aGlzLnVzZXJzLmZpbmQoXHJcbiAgICAgICh1KSA9PiB1LnVzZXJuYW1lLnRvTG93ZXJDYXNlKCkgPT09IHVzZXJuYW1lLnRvTG93ZXJDYXNlKCkgJiYgdS5pc0FjdGl2ZVxyXG4gICAgKSBhcyBVc2VyIHwgbnVsbDtcclxuICAgIGlmICghdXNlcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdbVXNlck1hbmFnZXJdIEt1bGxhbsSxY8SxIGJ1bHVuYW1hZMSxOiAnICsgdXNlcm5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdXNlcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBLdWxsYW7EsWPEsSBidWx1bmFtYWTEsTogJHt1c2VybmFtZX1gKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdXNlcjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEt1bGxhbsSxY8SxIGVrbGVcclxuICAgKi9cclxuICBwdWJsaWMgYWRkVXNlcih1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nLCBob21lRGlyOiBzdHJpbmcsIHBlcm1pc3Npb25zOiBVc2VyUGVybWlzc2lvbnMpOiBib29sZWFuIHtcclxuICAgIGlmICghdXNlcm5hbWUgfHwgIXBhc3N3b3JkKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tVc2VyTWFuYWdlcl0gQm/FnyBrdWxsYW7EsWPEsSBhZMSxIHZleWEgxZ9pZnJlJyk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBLdWxsYW7EsWPEsSBhZMSxIHphdGVuIHZhcnNhIGtvbnRyb2wgZXRcclxuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5maW5kVXNlcih1c2VybmFtZSk7XHJcbiAgICBpZiAoZXhpc3RpbmcpIHtcclxuICAgICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gS3VsbGFuxLFjxLEgemF0ZW4gdmFyOiAke3VzZXJuYW1lfWApO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbmV3VXNlcjogVXNlciA9IHtcclxuICAgICAgdXNlcm5hbWUsXHJcbiAgICAgIHBhc3N3b3JkLFxyXG4gICAgICBob21lRGlyOiBwYXRoLnJlc29sdmUoaG9tZURpciksXHJcbiAgICAgIHBlcm1pc3Npb25zOiB7IC4uLnBlcm1pc3Npb25zIH0sXHJcbiAgICAgIGlzQWN0aXZlOiB0cnVlLFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLnVzZXJzLnB1c2gobmV3VXNlcik7XHJcbiAgICB0aGlzLnNhdmUoKTtcclxuICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdIEt1bGxhbsSxY8SxIGVrbGVuZGk6ICR7dXNlcm5hbWV9YCk7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEt1bGxhbsSxY8SxIHNpbFxyXG4gICAqL1xyXG4gIHB1YmxpYyBkZWxldGVVc2VyKHVzZXJuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmZpbmRVc2VyKHVzZXJuYW1lKTtcclxuICAgIGlmICghdXNlcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBLdWxsYW7EsWPEsSBidWx1bmFtYWTEsTogJHt1c2VybmFtZX1gKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXNlcnMgPSB0aGlzLnVzZXJzLmZpbHRlcigodSkgPT4gdS51c2VybmFtZSAhPT0gdXNlcm5hbWUpO1xyXG4gICAgdGhpcy5zYXZlKCk7XHJcbiAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBLdWxsYW7EsWPEsSBzaWxpbmRpOiAke3VzZXJuYW1lfWApO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBLdWxsYW7EsWPEsSBha3RpZi9wYXNpZiB5YXBcclxuICAgKi9cclxuICBwdWJsaWMgdG9nZ2xlVXNlclN0YXR1cyh1c2VybmFtZTogc3RyaW5nLCBpc0FjdGl2ZTogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgdXNlciA9IHRoaXMuZmluZFVzZXIodXNlcm5hbWUpO1xyXG4gICAgaWYgKCF1c2VyKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdIEt1bGxhbsSxY8SxIGJ1bHVuYW1hZMSxOiAke3VzZXJuYW1lfWApO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgdXNlci5pc0FjdGl2ZSA9IGlzQWN0aXZlO1xyXG4gICAgdGhpcy5zYXZlKCk7XHJcbiAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBLdWxsYW7EsWPEsSBkdXJ1bXUgZGXEn2nFn3RpcmlsZGk6ICR7dXNlcm5hbWV9ICgke2lzQWN0aXZlID8gJ2FrdGlmJyA6ICdwYXNpZid9KWApO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBLdWxsYW7EsWPEsSBpemlubGVyaW5pIGfDvG5jZWxsZVxyXG4gICAqL1xyXG4gIHB1YmxpYyB1cGRhdGVQZXJtaXNzaW9ucyh1c2VybmFtZTogc3RyaW5nLCBwZXJtaXNzaW9uczogVXNlclBlcm1pc3Npb25zKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCB1c2VyID0gdGhpcy5maW5kVXNlcih1c2VybmFtZSk7XHJcbiAgICBpZiAoIXVzZXIpIHtcclxuICAgICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gS3VsbGFuxLFjxLEgYnVsdW5hbWFkxLE6ICR7dXNlcm5hbWV9YCk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBNZXZjdXQgaXppbmxlcmkga29weWFsYVxyXG4gICAgY29uc3QgY3VycmVudFBlcm1pc3Npb25zID0gdXNlci5wZXJtaXNzaW9ucyB8fCB7fTtcclxuICAgIFxyXG4gICAgLy8gWWVuaSBpemlubGVyaSBiaXJsZcWfdGlyICh5ZW5pIGl6aW4gdmFyc2EgZ8O8bmNlbGxlLCB5b2tzYSBtZXZjdXQga29ydSlcclxuICAgIGNvbnN0IG5ld1Blcm1pc3Npb25zID0ge1xyXG4gICAgICAuLi5jdXJyZW50UGVybWlzc2lvbnMsXHJcbiAgICAgIC4uLnBlcm1pc3Npb25zLFxyXG4gICAgfSBhcyBVc2VyUGVybWlzc2lvbnM7XHJcblxyXG4gICAgdXNlci5wZXJtaXNzaW9ucyA9IG5ld1Blcm1pc3Npb25zO1xyXG4gICAgdGhpcy5zYXZlKCk7XHJcbiAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSDEsHppbmxlciBnw7xuY2VsbGVuZGk6ICR7dXNlcm5hbWV9YCk7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEt1bGxhbsSxY8SxIGl6aW5sZXJpbmkga29udHJvbCBldFxyXG4gICAqL1xyXG4gIHB1YmxpYyBjaGVja1Blcm1pc3Npb24odXNlcm5hbWU6IHN0cmluZywgcGVybWlzc2lvbjogUGVybWlzc2lvbik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgdXNlciA9IHRoaXMuZmluZFVzZXIodXNlcm5hbWUpO1xyXG4gICAgaWYgKCF1c2VyKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdIMSwemluIGtvbnRyb2zDvCBiYcWfYXLEsXPEsXogLSBrdWxsYW7EsWPEsSBidWx1bmFtYWTEsTogJHt1c2VybmFtZX1gKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGhhc1Blcm1pc3Npb24gPSB1c2VyLnBlcm1pc3Npb25zPy5bcGVybWlzc2lvbl0gPT09IHRydWU7XHJcbiAgICBcclxuICAgIGlmICghaGFzUGVybWlzc2lvbikge1xyXG4gICAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSDEsHppbiByZWRkZWRpbGRpOiAke3VzZXJuYW1lfSAtICR7cGVybWlzc2lvbn1gKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdIMSwemluIG9uYXlsYW5kxLE6ICR7dXNlcm5hbWV9IC0gJHtwZXJtaXNzaW9ufWApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBoYXNQZXJtaXNzaW9uO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVMO8bSBrdWxsYW7EsWPEsWxhcsSxIGxpc3RlbGVcclxuICAgKi9cclxuICBwdWJsaWMgbGlzdFVzZXJzKCk6IFVzZXJbXSB7XHJcbiAgICByZXR1cm4gdGhpcy51c2Vycy5maWx0ZXIoKHUpID0+IHUuaXNBY3RpdmUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogS3VsbGFuxLFjxLEgaXN0YXRpc3Rpa2xlcmlcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0VXNlclN0YXRzKCk6IE1hcDxzdHJpbmcsIG51bWJlcj4ge1xyXG4gICAgY29uc3Qgc3RhdHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xyXG4gICAgdGhpcy51c2Vycy5mb3JFYWNoKCh1c2VyKSA9PiB7XHJcbiAgICAgIHN0YXRzLnNldCh1c2VyLnVzZXJuYW1lLCBPYmplY3Qua2V5cyh1c2VyLnBlcm1pc3Npb25zIHx8IHt9KS5sZW5ndGgpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gc3RhdHM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBLdWxsYW7EsWPEsSBzYXnEsXPEsW7EsSBhbFxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRVc2VyQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnVzZXJzLmZpbHRlcigodSkgPT4gdS5pc0FjdGl2ZSkubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogS3VsbGFuxLFjxLEgYWTEsW7EsSBkZcSfacWfdGlyXHJcbiAgICovXHJcbiAgcHVibGljIGNoYW5nZVVzZXJuYW1lKG9sZFVzZXJuYW1lOiBzdHJpbmcsIG5ld1VzZXJuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmZpbmRVc2VyKG9sZFVzZXJuYW1lKTtcclxuICAgIGlmICghdXNlcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBLdWxsYW7EsWPEsSBidWx1bmFtYWTEsTogJHtvbGRVc2VybmFtZX1gKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFllbmkga3VsbGFuxLFjxLEgYWTEsSB6YXRlbiB2YXJzYSBrb250cm9sIGV0XHJcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZmluZFVzZXIobmV3VXNlcm5hbWUpO1xyXG4gICAgaWYgKGV4aXN0aW5nKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdIEt1bGxhbsSxY8SxIGFkxLEgemF0ZW4gdmFyOiAke25ld1VzZXJuYW1lfWApO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgdXNlci51c2VybmFtZSA9IG5ld1VzZXJuYW1lO1xyXG4gICAgdGhpcy5zYXZlKCk7XHJcbiAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBLdWxsYW7EsWPEsSBhZMSxIGRlxJ9pxZ90aXJpbGRpOiAke29sZFVzZXJuYW1lfSAtPiAke25ld1VzZXJuYW1lfWApO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBLdWxsYW7EsWPEsSDFn2lmcmVzaW5pIGRlxJ9pxZ90aXJcclxuICAgKi9cclxuICBwdWJsaWMgY2hhbmdlUGFzc3dvcmQodXNlcm5hbWU6IHN0cmluZywgbmV3UGFzc3dvcmQ6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgdXNlciA9IHRoaXMuZmluZFVzZXIodXNlcm5hbWUpO1xyXG4gICAgaWYgKCF1c2VyKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdIEt1bGxhbsSxY8SxIGJ1bHVuYW1hZMSxOiAke3VzZXJuYW1lfWApO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgdXNlci5wYXNzd29yZCA9IG5ld1Bhc3N3b3JkO1xyXG4gICAgdGhpcy5zYXZlKCk7XHJcbiAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSDFnmlmcmUgZGXEn2nFn3RpcmlsZGk6ICR7dXNlcm5hbWV9YCk7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEt1bGxhbsSxY8SxIGRpemluaW5pIGRlxJ9pxZ90aXJcclxuICAgKi9cclxuICBwdWJsaWMgY2hhbmdlSG9tZURpcih1c2VybmFtZTogc3RyaW5nLCBuZXdIb21lRGlyOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmZpbmRVc2VyKHVzZXJuYW1lKTtcclxuICAgIGlmICghdXNlcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBLdWxsYW7EsWPEsSBidWx1bmFtYWTEsTogJHt1c2VybmFtZX1gKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHVzZXIuaG9tZURpciA9IHBhdGgucmVzb2x2ZShuZXdIb21lRGlyKTtcclxuICAgIHRoaXMuc2F2ZSgpO1xyXG4gICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gRGl6aW4gZGXEn2nFn3RpcmlsZGk6ICR7dXNlcm5hbWV9IC0+ICR7dXNlci5ob21lRGlyfWApO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVc2VyTWFuYWdlciDDtnJuZcSfaSBvbHXFn3R1ciAoc2luZ2xldG9uKVxyXG4gICAqL1xyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UodXNlckZpbGU6IHN0cmluZyk6IFVzZXJNYW5hZ2VyIHtcclxuICAgIGlmICghVXNlck1hbmFnZXIuX2luc3RhbmNlKSB7XHJcbiAgICAgIFVzZXJNYW5hZ2VyLl9pbnN0YW5jZSA9IG5ldyBVc2VyTWFuYWdlcih1c2VyRmlsZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVXNlck1hbmFnZXIuX2luc3RhbmNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBVc2VyTWFuYWdlciB8IG51bGwgPSBudWxsO1xyXG59XHJcblxyXG4vLyBTaW5nbGV0b24gaW5zdGFuY2Ugb2x1xZ90dXJtYSAtIGTDtm5nw7wgYmHEn8SxbWzEsWzEscSfxLFuZGFuIGthw6fEsW5tYWsgacOnaW5cclxubGV0IHVzZXJNYW5hZ2VySW5zdGFuY2U6IFVzZXJNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XHJcbmxldCB1c2VyTWFuYWdlckluaXRQcm9taXNlOiBQcm9taXNlPFVzZXJNYW5hZ2VyPiB8IG51bGwgPSBudWxsO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFVzZXJNYW5hZ2VyKHVzZXJGaWxlPzogc3RyaW5nKTogUHJvbWlzZTxVc2VyTWFuYWdlcj4ge1xyXG4gIGlmICghdXNlck1hbmFnZXJJbml0UHJvbWlzZSkge1xyXG4gICAgdXNlck1hbmFnZXJJbml0UHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XHJcbiAgICAgIGlmICghdXNlck1hbmFnZXJJbnN0YW5jZSkge1xyXG4gICAgICAgIGlmICghdXNlckZpbGUpIHtcclxuICAgICAgICAgIHVzZXJGaWxlID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL3VzZXJzLmpzb24nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdXNlck1hbmFnZXJJbnN0YW5jZSA9IG5ldyBVc2VyTWFuYWdlcih1c2VyRmlsZSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHVzZXJNYW5hZ2VySW5zdGFuY2U7XHJcbiAgICB9KSgpO1xyXG4gIH1cclxuICByZXR1cm4gdXNlck1hbmFnZXJJbml0UHJvbWlzZTtcclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare enum LogLevel {
|
|
2
|
+
DEBUG = "debug",
|
|
3
|
+
INFO = "info",
|
|
4
|
+
WARN = "warn",
|
|
5
|
+
ERROR = "error"
|
|
6
|
+
}
|
|
7
|
+
export declare class Logger {
|
|
8
|
+
private static level;
|
|
9
|
+
static setLevel(level: LogLevel): void;
|
|
10
|
+
static debug(message: string, ...args: unknown[]): void;
|
|
11
|
+
static info(message: string, ...args: unknown[]): void;
|
|
12
|
+
static warn(message: string, ...args: unknown[]): void;
|
|
13
|
+
static error(message: string, ...args: unknown[]): void;
|
|
14
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Logger = exports.LogLevel = void 0;
|
|
4
|
+
var LogLevel;
|
|
5
|
+
(function (LogLevel) {
|
|
6
|
+
LogLevel["DEBUG"] = "debug";
|
|
7
|
+
LogLevel["INFO"] = "info";
|
|
8
|
+
LogLevel["WARN"] = "warn";
|
|
9
|
+
LogLevel["ERROR"] = "error";
|
|
10
|
+
})(LogLevel || (exports.LogLevel = LogLevel = {}));
|
|
11
|
+
class Logger {
|
|
12
|
+
static setLevel(level) {
|
|
13
|
+
this.level = level;
|
|
14
|
+
}
|
|
15
|
+
static debug(message, ...args) {
|
|
16
|
+
if (this.level === LogLevel.DEBUG) {
|
|
17
|
+
console.log(`[DEBUG] ${message}`, ...args);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
static info(message, ...args) {
|
|
21
|
+
if (this.level === LogLevel.DEBUG || this.level === LogLevel.INFO) {
|
|
22
|
+
console.log(`[INFO] ${message}`, ...args);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
static warn(message, ...args) {
|
|
26
|
+
if (this.level === LogLevel.DEBUG || this.level === LogLevel.INFO || this.level === LogLevel.WARN) {
|
|
27
|
+
console.warn(`[WARN] ${message}`, ...args);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
static error(message, ...args) {
|
|
31
|
+
console.error(`[ERROR] ${message}`, ...args);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.Logger = Logger;
|
|
35
|
+
Logger.level = LogLevel.INFO;
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2xvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSxJQUFZLFFBS1g7QUFMRCxXQUFZLFFBQVE7SUFDbEIsMkJBQWUsQ0FBQTtJQUNmLHlCQUFhLENBQUE7SUFDYix5QkFBYSxDQUFBO0lBQ2IsMkJBQWUsQ0FBQTtBQUNqQixDQUFDLEVBTFcsUUFBUSxhQUFSLFFBQVEsR0FBUixRQUFRLFFBS25CO0FBS0Q7SUFHUyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQWU7UUFDcEMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDckIsQ0FBQztJQUVNLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBZSxFQUFFLEdBQUcsSUFBZTtRQUNyRCxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2xDLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxPQUFPLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzdDLENBQUM7SUFDSCxDQUFDO0lBRU0sTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFlLEVBQUUsR0FBRyxJQUFlO1FBQ3BELElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xFLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxPQUFPLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0lBRU0sTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFlLEVBQUUsR0FBRyxJQUFlO1FBQ3BELElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsRyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsT0FBTyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUM3QyxDQUFDO0lBQ0gsQ0FBQztJQUVNLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBZSxFQUFFLEdBQUcsSUFBZTtRQUNyRCxPQUFPLENBQUMsS0FBSyxDQUFDLFdBQVcsT0FBTyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUMvQyxDQUFDO0NBQ0Y7O0FBM0JnQixZQUFLLEdBQWEsUUFBUSxDQUFDLElBQUksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTG9nIHNldml5ZWxlcmlcbiAqL1xuZXhwb3J0IGVudW0gTG9nTGV2ZWwge1xuICBERUJVRyA9ICdkZWJ1ZycsXG4gIElORk8gPSAnaW5mbycsXG4gIFdBUk4gPSAnd2FybicsXG4gIEVSUk9SID0gJ2Vycm9yJyxcbn1cblxuLyoqXG4gKiBMb2dnZXIgdXRpbGl0eVxuICovXG5leHBvcnQgY2xhc3MgTG9nZ2VyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgbGV2ZWw6IExvZ0xldmVsID0gTG9nTGV2ZWwuSU5GTztcblxuICBwdWJsaWMgc3RhdGljIHNldExldmVsKGxldmVsOiBMb2dMZXZlbCk6IHZvaWQge1xuICAgIHRoaXMubGV2ZWwgPSBsZXZlbDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZGVidWcobWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sZXZlbCA9PT0gTG9nTGV2ZWwuREVCVUcpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBbREVCVUddICR7bWVzc2FnZX1gLCAuLi5hcmdzKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGluZm8obWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sZXZlbCA9PT0gTG9nTGV2ZWwuREVCVUcgfHwgdGhpcy5sZXZlbCA9PT0gTG9nTGV2ZWwuSU5GTykge1xuICAgICAgY29uc29sZS5sb2coYFtJTkZPXSAke21lc3NhZ2V9YCwgLi4uYXJncyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubGV2ZWwgPT09IExvZ0xldmVsLkRFQlVHIHx8IHRoaXMubGV2ZWwgPT09IExvZ0xldmVsLklORk8gfHwgdGhpcy5sZXZlbCA9PT0gTG9nTGV2ZWwuV0FSTikge1xuICAgICAgY29uc29sZS53YXJuKGBbV0FSTl0gJHttZXNzYWdlfWAsIC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZXJyb3IobWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICBjb25zb2xlLmVycm9yKGBbRVJST1JdICR7bWVzc2FnZX1gLCAuLi5hcmdzKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function normalizeDirPath(dirPath: string): string;
|
|
2
|
+
export declare function robustPathNormalize(dirPath: string): string;
|
|
3
|
+
export declare function isPathWithinHome(targetPath: string, homeDir: string): boolean;
|
|
4
|
+
export declare function ensureDirectoryExists(dirPath: string): Promise<void>;
|
|
5
|
+
export declare function getFullPath(baseDir: string, filePath: string): string;
|
|
6
|
+
export declare function resolveFtpPath(targetPath: string, currentDir: string, homeDir: string): string;
|
|
7
|
+
export declare function toVirtualPath(fsPath: string, homeDir: string): string;
|
|
@@ -0,0 +1,145 @@
|
|
|
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.normalizeDirPath = normalizeDirPath;
|
|
37
|
+
exports.robustPathNormalize = robustPathNormalize;
|
|
38
|
+
exports.isPathWithinHome = isPathWithinHome;
|
|
39
|
+
exports.ensureDirectoryExists = ensureDirectoryExists;
|
|
40
|
+
exports.getFullPath = getFullPath;
|
|
41
|
+
exports.resolveFtpPath = resolveFtpPath;
|
|
42
|
+
exports.toVirtualPath = toVirtualPath;
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const fs = __importStar(require("fs"));
|
|
45
|
+
function normalizeDirPath(dirPath) {
|
|
46
|
+
if (!dirPath || typeof dirPath !== 'string') {
|
|
47
|
+
return '';
|
|
48
|
+
}
|
|
49
|
+
let normalized = dirPath.replace(/\\/g, '/');
|
|
50
|
+
if (/^[a-zA-Z]:\//.test(normalized) || /^([a-zA-Z]:\.)|([a-zA-Z]:\/)/.test(normalized)) {
|
|
51
|
+
return normalized;
|
|
52
|
+
}
|
|
53
|
+
if (normalized.startsWith('./')) {
|
|
54
|
+
normalized = normalized.slice(2);
|
|
55
|
+
}
|
|
56
|
+
if (!normalized.startsWith('/') && !/^[a-zA-Z]:\//.test(normalized)) {
|
|
57
|
+
normalized = '/' + normalized;
|
|
58
|
+
}
|
|
59
|
+
return normalized;
|
|
60
|
+
}
|
|
61
|
+
function robustPathNormalize(dirPath) {
|
|
62
|
+
if (!dirPath || typeof dirPath !== 'string') {
|
|
63
|
+
return '';
|
|
64
|
+
}
|
|
65
|
+
let normalized = dirPath.replace(/\\/g, '/');
|
|
66
|
+
normalized = normalized.replace(/\/+/g, '/');
|
|
67
|
+
normalized = normalized.replace(/\/\.\//g, '/').replace(/\.\//g, '');
|
|
68
|
+
if (normalized === 'files/admin' || normalized === 'files/guest') {
|
|
69
|
+
normalized = '/files/admin';
|
|
70
|
+
}
|
|
71
|
+
else if (normalized === 'files' || normalized === 'admin' || normalized === 'guest') {
|
|
72
|
+
normalized = '/files';
|
|
73
|
+
}
|
|
74
|
+
else if (normalized === '') {
|
|
75
|
+
normalized = '/';
|
|
76
|
+
}
|
|
77
|
+
if (normalized.startsWith('/')) {
|
|
78
|
+
return normalized;
|
|
79
|
+
}
|
|
80
|
+
if (/^[a-zA-Z]:\/\//.test(normalized) || /^[a-zA-Z]:\/\./.test(normalized)) {
|
|
81
|
+
return normalized;
|
|
82
|
+
}
|
|
83
|
+
if (!normalized.startsWith('.') && !normalized.startsWith('/')) {
|
|
84
|
+
normalized = './' + normalized;
|
|
85
|
+
}
|
|
86
|
+
return normalized;
|
|
87
|
+
}
|
|
88
|
+
function isPathWithinHome(targetPath, homeDir) {
|
|
89
|
+
const targetNormalized = targetPath.replace(/\\/g, '/');
|
|
90
|
+
const homeNormalized = (homeDir || '.').replace(/\\/g, '/');
|
|
91
|
+
const targetClean = targetNormalized.replace(/\/+$/, '');
|
|
92
|
+
const homeClean = homeNormalized.replace(/\/+$/, '');
|
|
93
|
+
if (targetClean === homeClean) {
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
if (homeClean !== '' && targetClean.startsWith(homeClean + '/')) {
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
async function ensureDirectoryExists(dirPath) {
|
|
102
|
+
try {
|
|
103
|
+
await fs.promises.mkdir(dirPath, { recursive: true });
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
if (error.code !== 'EEXIST') {
|
|
107
|
+
throw error;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function getFullPath(baseDir, filePath) {
|
|
112
|
+
if (!baseDir || !filePath) {
|
|
113
|
+
return '';
|
|
114
|
+
}
|
|
115
|
+
return path.resolve(baseDir, filePath);
|
|
116
|
+
}
|
|
117
|
+
function resolveFtpPath(targetPath, currentDir, homeDir) {
|
|
118
|
+
const home = path.resolve(homeDir || '.');
|
|
119
|
+
const current = path.resolve(currentDir || home);
|
|
120
|
+
const raw = (targetPath || '').trim().replace(/\\/g, '/').replace(/\/{2,}/g, '/');
|
|
121
|
+
if (!raw || raw === '.') {
|
|
122
|
+
return current;
|
|
123
|
+
}
|
|
124
|
+
if (/^[a-zA-Z]:\//.test(raw)) {
|
|
125
|
+
return path.resolve(raw);
|
|
126
|
+
}
|
|
127
|
+
if (raw.startsWith('/')) {
|
|
128
|
+
const asFileSystemPath = path.resolve(raw);
|
|
129
|
+
if (isPathWithinHome(asFileSystemPath, home)) {
|
|
130
|
+
return asFileSystemPath;
|
|
131
|
+
}
|
|
132
|
+
return path.resolve(home, raw.replace(/^\/+/, ''));
|
|
133
|
+
}
|
|
134
|
+
return path.resolve(current, raw);
|
|
135
|
+
}
|
|
136
|
+
function toVirtualPath(fsPath, homeDir) {
|
|
137
|
+
const home = path.resolve(homeDir || '.');
|
|
138
|
+
const target = path.resolve(fsPath || home);
|
|
139
|
+
const relative = path.relative(home, target);
|
|
140
|
+
if (!relative || relative.startsWith('..') || path.isAbsolute(relative)) {
|
|
141
|
+
return '/';
|
|
142
|
+
}
|
|
143
|
+
return '/' + relative.replace(/\\/g, '/');
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aFV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3BhdGhVdGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxNQUFZLElBQUksaUNBQWE7QUFDN0IsTUFBWSxFQUFFLCtCQUFXO0FBTXpCLDBCQUFpQyxPQUFlO0lBQzlDLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDNUMsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBR0QsSUFBSSxVQUFVLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFHN0MsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLDhCQUE4QixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBRXZGLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFHRCxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNoQyxVQUFVLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBR0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDcEUsVUFBVSxHQUFHLEdBQUcsR0FBRyxVQUFVLENBQUM7SUFDaEMsQ0FBQztJQUVELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFNRCw2QkFBb0MsT0FBZTtJQUNqRCxJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzVDLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUdELElBQUksVUFBVSxHQUFH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LE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQzFDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxDQUFDO0lBQzVDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzdDLElBQUksQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDeEUsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBQ0QsT0FBTyxHQUFHLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDNUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcclxuXHJcbi8qKlxyXG4gKiBEaXppbiB5b2x1bnUgbm9ybWFsaXplIGV0XHJcbiAqIFdpbmRvd3MgYWJzb2x1dGUgcGF0aCdsZXJpIG11dGxhayBvbGFyYWsga2Fsc8SxbiwgLi8gcHJlZml4J2kga2FsZMSxciwgcm9vdCd0YW4gYmHFn2xhdFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZURpclBhdGgoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcclxuICBpZiAoIWRpclBhdGggfHwgdHlwZW9mIGRpclBhdGggIT09ICdzdHJpbmcnKSB7XHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICAvLyAxLiBXaW5kb3dzIGFic29sdXRlIHBhdGgnbGVyaSBub3JtYWxpemUgZXQgKEM6XFwuLi4gLT4gQzovLi4uKVxyXG4gIGxldCBub3JtYWxpemVkID0gZGlyUGF0aC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XHJcblxyXG4gIC8vIDIuIFdpbmRvd3MgZHJpdmUgbGV0dGVyIHBhdGgga29udHJvbMO8IChDOi8uLi4gdmV5YSBDOi4uLilcclxuICBpZiAoL15bYS16QS1aXTpcXC8vLnRlc3Qobm9ybWFsaXplZCkgfHwgL14oW2EtekEtWl06XFwuKXwoW2EtekEtWl06XFwvKS8udGVzdChub3JtYWxpemVkKSkge1xyXG4gICAgLy8gV2luZG93cyBhYnNvbHV0ZSBwYXRoLCBtdXRsYWsgb2xhcmFrIGthbHPEsW46IEM6L1VzZXJzLy4uLi9maWxlcy9hZG1pblxyXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWQ7XHJcbiAgfVxyXG5cclxuICAvLyAzLiAuLyBwcmVmaXgnaSBrYWxkxLFyXHJcbiAgaWYgKG5vcm1hbGl6ZWQuc3RhcnRzV2l0aCgnLi8nKSkge1xyXG4gICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQuc2xpY2UoMik7XHJcbiAgfVxyXG5cclxuICAvLyA0LiBFxJ9lciBhYnNvbHV0ZSBkZcSfaWxzZSwgcm9vdCdkYW4gYmHFn2xhdFxyXG4gIGlmICghbm9ybWFsaXplZC5zdGFydHNXaXRoKCcvJykgJiYgIS9eW2EtekEtWl06XFwvLy50ZXN0KG5vcm1hbGl6ZWQpKSB7XHJcbiAgICBub3JtYWxpemVkID0gJy8nICsgbm9ybWFsaXplZDtcclxuICB9XHJcbiAgXHJcbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBMaW51eCB2ZSBXaW5kb3dzIHBhdGgnbGVyaW5pIGfDvMOnbMO8IMWfZWtpbGRlIG5vcm1hbGl6ZSBldFxyXG4gKiBCYWNrc2xhc2ggLT4gZm9yd2FyZCBzbGFzaCwgLi8gdmUgLi4vIMOnw7Z6LCByZWxhdGl2ZSBwYXRoIHlhcCAoUE9TSVggLyB5ZXJpbmUgV2luZG93cyB1eXVtbHUpXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcm9idXN0UGF0aE5vcm1hbGl6ZShkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIGlmICghZGlyUGF0aCB8fCB0eXBlb2YgZGlyUGF0aCAhPT0gJ3N0cmluZycpIHtcclxuICAgIHJldHVybiAnJztcclxuICB9XHJcblxyXG4gIC8vIDEuIEJhY2tzbGFzaCdsZXJpIGZvcndhcmQgc2xhc2gnZSDDp2V2aXJcclxuICBsZXQgbm9ybWFsaXplZCA9IGRpclBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xyXG5cclxuICAvLyAyLiAuLyB2ZSAuLi8gc2VnbWVudCdsZXJpbmkgw6fDtnpcclxuICAvLyByZXBlYXRlZCAvIC0+IHNpbmdsZSAvXHJcbiAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQucmVwbGFjZSgvXFwvKy9nLCAnLycpO1xyXG4gIC8vIC4vIHNlZ21lbnQnbGVyaW5pIGthbGTEsXJcclxuICBub3JtYWxpemVkID0gbm9ybWFsaXplZC5yZXBsYWNlKC9cXC9cXC5cXC8vZywgJy8nKS5yZXBsYWNlKC9cXC5cXC8vZywgJycpO1xyXG4gIC8vIC4uLyBzZWdtZW50J2xlcmluaSBpxZ9sZSAoYmFzaXTDp2UsIHBhdGgucmVzb2x2ZSBoYWxsZWRlY2VrKVxyXG4gIC8vIE5vdGU6IC4vZmlsZXMvYWRtaW4gLT4gZmlsZXMvYWRtaW4sIHRoZW4gd2UnbGwgY29udmVydCB0byBhYnNvbHV0ZSBiZWxvd1xyXG5cclxuICAvLyAzLiAuL2ZpbGVzL2FkbWluIGdpYmkgcmVsYXRpdmUgeW9sIHZhcnNhLCBtdXRsYWsgaGFsZSDDp2V2aXJcclxuICBpZiAobm9ybWFsaXplZCA9PT0gJ2ZpbGVzL2FkbWluJyB8fCBub3JtYWxpemVkID09PSAnZmlsZXMvZ3Vlc3QnKSB7XHJcbiAgICAvLyAuL2ZpbGVzL2FkbWluIG5vcm1hbGl6ZSBlZGlsaW5jZSBmaWxlcy9hZG1pbiBvbGR1LCBidW51IG11dGxhayBoYWxlIMOnZXZpclxyXG4gICAgbm9ybWFsaXplZCA9ICcvZmlsZXMvYWRtaW4nO1xyXG4gIH0gZWxzZSBpZiAobm9ybWFsaXplZCA9PT0gJ2ZpbGVzJyB8fCBub3JtYWxpemVkID09PSAnYWRtaW4nIHx8IG5vcm1hbGl6ZWQgPT09ICdndWVzdCcpIHtcclxuICAgIC8vIGZpbGVzIG5vcm1hbGl6ZSBlZGlsaW5jZSwgL2ZpbGVzIG9sYXJhayDDp2V2aXJcclxuICAgIG5vcm1hbGl6ZWQgPSAnL2ZpbGVzJztcclxuICB9IGVsc2UgaWYgKG5vcm1hbGl6ZWQgPT09ICcnKSB7XHJcbiAgICAvLyBlbXB0eSAtPiAvXHJcbiAgICBub3JtYWxpemVkID0gJy8nO1xyXG4gIH1cclxuXHJcbiAgLy8gNC4gUE9TSVggYWJzb2x1dGUgcGF0aCBrb250cm9sw7wgKC9maWxlcy9hZG1pbiBnaWJpKVxyXG4gIGlmIChub3JtYWxpemVkLnN0YXJ0c1dpdGgoJy8nKSkge1xyXG4gICAgLy8gUE9TSVggbXV0bGFrIHlvbCBvbGFyYWsga2Fsc8SxbjogL2ZpbGVzL2FkbWluXHJcbiAgICByZXR1cm4gbm9ybWFsaXplZDtcclxuICB9XHJcblxyXG4gIC8vIDUuIFdpbmRvd3MgYWJzb2x1dGUgcGF0aCBrb250cm9sw7wgKEM6L2ZpbGVzL2FkbWluIGdpYmkpXHJcbiAgaWYgKC9eW2EtekEtWl06XFwvXFwvLy50ZXN0KG5vcm1hbGl6ZWQpIHx8IC9eW2EtekEtWl06XFwvXFwuLy50ZXN0KG5vcm1hbGl6ZWQpKSB7XHJcbiAgICAvLyBXaW5kb3dzIG11dGxhayB5b2wgb2xhcmFrIGthbHPEsW46IEM6L2ZpbGVzL2FkbWluXHJcbiAgICByZXR1cm4gbm9ybWFsaXplZDtcclxuICB9XHJcblxyXG4gIC8vIDYuIFJlbGF0aXZlIHBhdGggaXNlIC4vIGlsZSBiYcWfbGF0IChXaW5kb3dzIHV5dW1sdSlcclxuICBpZiAoIW5vcm1hbGl6ZWQuc3RhcnRzV2l0aCgnLicpICYmICFub3JtYWxpemVkLnN0YXJ0c1dpdGgoJy8nKSkge1xyXG4gICAgbm9ybWFsaXplZCA9ICcuLycgKyBub3JtYWxpemVkO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHw5xWRU5MxLBLOiBQYXRoJ2luIGhvbWVEaXIgacOnaW5kZSBvbHVwIG9sbWFkxLHEn8SxbsSxIGtvbnRyb2wgZXRcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1BhdGhXaXRoaW5Ib21lKHRhcmdldFBhdGg6IHN0cmluZywgaG9tZURpcjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgLy8gTm9ybWFsaXplIGJvdGggcGF0aHMgdG8gZm9yd2FyZCBzbGFzaGVzIGZvciBjcm9zcy1wbGF0Zm9ybSBjb21wYXJpc29uXHJcbiAgY29uc3QgdGFyZ2V0Tm9ybWFsaXplZCA9IHRhcmdldFBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xyXG4gIGNvbnN0IGhvbWVOb3JtYWxpemVkID0gKGhvbWVEaXIgfHwgJy4nKS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XHJcblxyXG4gIC8vIFN0cmlwIHRyYWlsaW5nIHNsYXNoZXNcclxuICBjb25zdCB0YXJnZXRDbGVhbiA9IHRhcmdldE5vcm1hbGl6ZWQucmVwbGFjZSgvXFwvKyQvLCAnJyk7XHJcbiAgY29uc3QgaG9tZUNsZWFuID0gaG9tZU5vcm1hbGl6ZWQucmVwbGFjZSgvXFwvKyQvLCAnJyk7XHJcblxyXG4gIC8vIElmIHBhdGhzIGFyZSBlcXVhbCwgdGFyZ2V0IGlzIHdpdGhpbiBob21lXHJcbiAgaWYgKHRhcmdldENsZWFuID09PSBob21lQ2xlYW4pIHtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8gQ2hlY2sgaWYgdGFyZ2V0IHN0YXJ0cyB3aXRoIGhvbWUgKyAnLycgKGkuZS4sIHRhcmdldCBpcyBpbnNpZGUgaG9tZSlcclxuICBpZiAoaG9tZUNsZWFuICE9PSAnJyAmJiB0YXJnZXRDbGVhbi5zdGFydHNXaXRoKGhvbWVDbGVhbiArICcvJykpIHtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGZhbHNlO1xyXG59XHJcblxyXG4vKipcclxuICogRGl6aW4gdmFybMSxxJ/EsW5kYW4gZW1pbiBvbFxyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZURpcmVjdG9yeUV4aXN0cyhkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICB0cnkge1xyXG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XHJcbiAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgIC8vIFphdGVuIHZhcnNhIGhhdGEgdmVybWV6XHJcbiAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSAhPT0gJ0VFWElTVCcpIHtcclxuICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogVGFtIHlvbCBvbHXFn3R1clxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEZ1bGxQYXRoKGJhc2VEaXI6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgaWYgKCFiYXNlRGlyIHx8ICFmaWxlUGF0aCkge1xyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuICByZXR1cm4gcGF0aC5yZXNvbHZlKGJhc2VEaXIsIGZpbGVQYXRoKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEZUUCBpc3RlbWNpc2luaW4gZ8O2bmRlcmRpxJ9pIHlvbHUgZG9zeWEgc2lzdGVtaSBtdXRsYWsgeW9sdW5hIMOnZXZpci5cclxuICpcclxuICogLSBNdXRsYWsgV2luZG93cyB5b2x1IChDOi8uLi4gdmV5YSBDOlxcXFwuLi4pIGhlciB6YW1hbiBkb3N5YSBzaXN0ZW1pIHlvbHVkdXIuXHJcbiAqIC0gTXV0bGFrIFBPU0lYIHlvbHUgKC9hbHQvZGl6aW4pIMO2bmNlIGRvc3lhIHNpc3RlbWkgeW9sdSBvbGFyYWsgZGVuZW5pcjtcclxuICogICBrdWxsYW7EsWPEsW7EsW4gaG9tZURpcidpIGnDp2luZGUgZGXEn2lsc2Ugc2FuYWwga8O2ayAoaG9tZURpcikgw7x6ZXJpbmRlbiDDp8O2esO8bMO8ci5cclxuICogLSBHw7ZyZWxpIHlvbCBoZXIgemFtYW4gY3VycmVudERpciDDvHplcmluZGVuIMOnw7Z6w7xsw7xyLlxyXG4gKlxyXG4gKiBEw7ZuZW4gZGXEn2VyIG11dGxhayBkb3N5YSBzaXN0ZW1pIHlvbHVkdXI7IGhvbWVEaXIgacOnaW5kZSBvbHVwIG9sbWFkxLHEn8SxbsSxXHJcbiAqIMOnYcSfxLFyYW4ga29udHJvbCBlZGVyIChpc1BhdGhXaXRoaW5Ib21lKS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRnRwUGF0aCh0YXJnZXRQYXRoOiBzdHJpbmcsIGN1cnJlbnREaXI6IHN0cmluZywgaG9tZURpcjogc3RyaW5nKTogc3RyaW5nIHtcclxuICBjb25zdCBob21lID0gcGF0aC5yZXNvbHZlKGhvbWVEaXIgfHwgJy4nKTtcclxuICBjb25zdCBjdXJyZW50ID0gcGF0aC5yZXNvbHZlKGN1cnJlbnREaXIgfHwgaG9tZSk7XHJcblxyXG4gIC8vIEJhY2tzbGFzaCAtPiBzbGFzaCwgdGVrcmFyIGVkZW4gc2xhc2ggLT4gdGVrIHNsYXNoXHJcbiAgY29uc3QgcmF3ID0gKHRhcmdldFBhdGggfHwgJycpLnRyaW0oKS5yZXBsYWNlKC9cXFxcL2csICcvJykucmVwbGFjZSgvXFwvezIsfS9nLCAnLycpO1xyXG4gIGlmICghcmF3IHx8IHJhdyA9PT0gJy4nKSB7XHJcbiAgICByZXR1cm4gY3VycmVudDtcclxuICB9XHJcblxyXG4gIC8vIFPDvHLDvGPDvCBoYXJmaSAoQzovLi4uKSBkb3N5YSBzaXN0ZW1pIHlvbHVkdXJcclxuICBpZiAoL15bYS16QS1aXTpcXC8vLnRlc3QocmF3KSkge1xyXG4gICAgcmV0dXJuIHBhdGgucmVzb2x2ZShyYXcpO1xyXG4gIH1cclxuXHJcbiAgLy8gUE9TSVggbXV0bGFrIHlvbFxyXG4gIGlmIChyYXcuc3RhcnRzV2l0aCgnLycpKSB7XHJcbiAgICBjb25zdCBhc0ZpbGVTeXN0ZW1QYXRoID0gcGF0aC5yZXNvbHZlKHJhdyk7XHJcbiAgICAvLyBob21lRGlyIGnDp2luZGV5c2UgZ2Vyw6dlayBkb3N5YSBzaXN0ZW1pIHlvbHUgb2xhcmFrIGt1bGxhblxyXG4gICAgaWYgKGlzUGF0aFdpdGhpbkhvbWUoYXNGaWxlU3lzdGVtUGF0aCwgaG9tZSkpIHtcclxuICAgICAgcmV0dXJuIGFzRmlsZVN5c3RlbVBhdGg7XHJcbiAgICB9XHJcbiAgICAvLyBEZcSfaWxzZSBzYW5hbCBrw7ZrID0ga3VsbGFuxLFjxLFuxLFuIGhvbWVEaXInaVxyXG4gICAgcmV0dXJuIHBhdGgucmVzb2x2ZShob21lLCByYXcucmVwbGFjZSgvXlxcLysvLCAnJykpO1xyXG4gIH1cclxuXHJcbiAgLy8gR8O2cmVsaSB5b2w6IGJ1bHVuZHXEn3UgZGl6aW5kZW4gw6fDtnrDvG1sZVxyXG4gIHJldHVybiBwYXRoLnJlc29sdmUoY3VycmVudCwgcmF3KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIERvc3lhIHNpc3RlbWkgeW9sdW51IGlzdGVtY2luaW4gZ8O2cmVjZcSfaSBzYW5hbCAoLyBrw7ZrbMO8KSB5b2xhIMOnZXZpci5cclxuICogaG9tZURpciBrw7ZrIGRpemluIG9sZHXEn3UgacOnaW4gZMSxxZ9hcsSxZGEga2FsYW4geW9sbGFyIFwiL1wiIGTDtm5lci5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB0b1ZpcnR1YWxQYXRoKGZzUGF0aDogc3RyaW5nLCBob21lRGlyOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIGNvbnN0IGhvbWUgPSBwYXRoLnJlc29sdmUoaG9tZURpciB8fCAnLicpO1xyXG4gIGNvbnN0IHRhcmdldCA9IHBhdGgucmVzb2x2ZShmc1BhdGggfHwgaG9tZSk7XHJcbiAgY29uc3QgcmVsYXRpdmUgPSBwYXRoLnJlbGF0aXZlKGhvbWUsIHRhcmdldCk7XHJcbiAgaWYgKCFyZWxhdGl2ZSB8fCByZWxhdGl2ZS5zdGFydHNXaXRoKCcuLicpIHx8IHBhdGguaXNBYnNvbHV0ZShyZWxhdGl2ZSkpIHtcclxuICAgIHJldHVybiAnLyc7XHJcbiAgfVxyXG4gIHJldHVybiAnLycgKyByZWxhdGl2ZS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XHJcbn1cclxuIl19
|