claire-framework
Version:
- được viết bằng TypeScript - hỗ trợ websocket và HTTP request - hỗ trợ CLI để generate base project (claire-cli)
266 lines • 24.9 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const AbstractDatabaseAdapter_1 = require("../database/AbstractDatabaseAdapter");
const ClaireError_1 = require("../system/ClaireError");
const errors_1 = require("../system/errors");
const AbstractQuery_1 = require("../model/AbstractQuery");
const QueryOperator_1 = require("../model/QueryOperator");
const Utils_1 = require("../system/Utils");
class InMemoryAdapter extends AbstractQuery_1.AbstractQuery {
constructor(model, modelMetadata, schema) {
super(model, modelMetadata);
this.autoPrimaryKey = 1;
this.model = model;
this.schema = schema;
this.schema.modelConnection = [];
}
insert(dataObject) {
this.currentMetadata.fields.forEach(f => {
const fieldDataName = f.fieldDataName;
//-- populate automatic primary key
if (f.isPrimaryKey && f.isAutoIncrement) {
dataObject[fieldDataName] = Utils_1.Utils.isIntegerDataTypes(f.dataType) ? this.autoPrimaryKey : String(this.autoPrimaryKey);
this.autoPrimaryKey++;
}
//-- check unique constraint
if (f.isUnique) {
//-- find in the data
const matched = this.schema.modelConnection.find((r) => r[fieldDataName] === dataObject[fieldDataName]);
if (matched) {
throw `Unique constraint failed for ${fieldDataName}`;
}
}
//-- check nullable constraint
if (f.nullable && dataObject[fieldDataName] === undefined) {
throw `Field ${fieldDataName} is required but missing`;
}
});
}
multipleSort(data, sort) {
data.sort((d1, d2) => {
let result = 0;
Object.keys(sort).some((key) => {
if (d1[key] < d2[key]) {
// @ts-ignore
if (sort[key] === "asc")
result = -1;
// @ts-ignore
if (sort[key] === "desc")
result = 1;
}
if (d1[key] > d2[key]) {
// @ts-ignore
if (sort[key] === "asc")
result = 1;
// @ts-ignore
if (sort[key] === "desc")
result = -1;
}
return result !== 0;
});
return result;
});
}
deleteMany(queries) {
return __awaiter(this, void 0, void 0, function* () {
const filters = queries ? this.getQueryObjectFromQueryConditions(queries) : [];
let dataObjects = this.getObjectsFromFilters(this.schema.modelConnection, filters);
//-- remove from collection
dataObjects.forEach(obj => {
const index = this.schema.modelConnection.indexOf(obj);
if (index >= 0) {
this.schema.modelConnection.splice(index, 1);
}
});
return dataObjects.length;
});
}
deleteOne(modelInstance) {
return __awaiter(this, void 0, void 0, function* () {
const primaryKey = this.currentMetadata.getPrimaryKey();
const index = this.schema.modelConnection.findIndex((r) => r[primaryKey.fieldDataName] === modelInstance[primaryKey.fieldLogicName]);
if (index >= 0) {
this.schema.modelConnection.splice(index, 1);
}
return modelInstance;
});
}
getObjectsFromFilters(objects, filters) {
let result = [];
for (const filterArray of filters) {
let allObjects = objects.slice();
for (const filter of filterArray) {
allObjects = filter(allObjects);
}
allObjects.forEach(obj => {
if (!result.includes(obj)) {
result.push(obj);
}
});
}
return result;
}
getMany(queries, options) {
return __awaiter(this, void 0, void 0, function* () {
const filters = queries ? this.getQueryObjectFromQueryConditions(queries) : [];
let dataObjects = this.getObjectsFromFilters(this.schema.modelConnection, filters);
let logicObjects = this.convertToLogicObjects(dataObjects);
logicObjects = logicObjects.map(obj => (Object.assign(Object.assign({}, this.currentMetadata.getDefaultLogicValues()), { obj })));
if (options) {
if (options.order) {
this.multipleSort(logicObjects, options.order);
}
if (options.projection) {
logicObjects = logicObjects.map(obj => {
let projected = {};
options.projection.forEach(logicKey => {
// @ts-ignore
projected[logicKey] = obj[logicKey];
});
return projected;
});
}
if (options.limit) {
logicObjects = logicObjects.slice((options.page - 1) * options.limit, options.page * options.limit);
}
}
return logicObjects;
});
}
getOne(queries, options) {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this.getMany(queries, options);
return result[0];
});
}
rawQuery(query) {
return __awaiter(this, void 0, void 0, function* () {
throw new ClaireError_1.ClaireError(errors_1.NOT_SUPPORTED);
});
}
saveMany(modelInstances) {
return __awaiter(this, void 0, void 0, function* () {
return modelInstances.map((modelInstance) => {
const dataObject = this.convertToDataObjects([Object.assign({}, this.currentMetadata.getDefaultLogicValues(), modelInstance)])[0];
this.insert(dataObject);
return Object.assign({}, this.currentMetadata.getDefaultLogicValues(), dataObject);
});
});
}
saveOne(modelInstance) {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this.saveMany([modelInstance]);
return result[0];
});
}
updateMany(queries, update) {
return __awaiter(this, void 0, void 0, function* () {
const filters = queries ? this.getQueryObjectFromQueryConditions(queries) : [];
let objects = this.getObjectsFromFilters(this.schema.modelConnection, filters);
let dataUpdate = this.convertToDataObjects([update])[0];
objects.forEach(obj => {
const index = this.schema.modelConnection.indexOf(obj);
if (index >= 0) {
this.schema.modelConnection = Object.assign(Object.assign({}, this.schema.modelConnection[index]), dataUpdate);
}
});
return objects.length;
});
}
updateOne(modelInstance) {
return __awaiter(this, void 0, void 0, function* () {
let dataObject = this.convertToDataObjects([modelInstance])[0];
const primaryKey = this.currentMetadata.getPrimaryKey();
const index = this.schema.modelConnection.findIndex((r) => r[primaryKey.fieldDataName] === modelInstance[primaryKey.fieldLogicName]);
if (index < 0) {
throw new ClaireError_1.ClaireError(errors_1.RECORD_NOT_FOUND);
}
this.schema.modelConnection[index] = Object.assign(Object.assign({}, this.schema.modelConnection[index]), dataObject);
return Object.assign(Object.assign({}, this.convertToLogicObjects([this.schema.modelConnection[index]])[0]), modelInstance);
});
}
getQueryObjectFromQueryConditions(queries) {
return queries.map((q) => Object.keys(q).map((key) => {
// @ts-ignore
const operator = q[key];
let dataKey = this.currentMetadata.getFieldByLogicName(key).fieldDataName;
switch (operator.operator) {
case QueryOperator_1.Operator.COMMON_EQUALITY:
return (records) => {
return records.filter((r) => r[dataKey] === operator.value);
};
case QueryOperator_1.Operator.COMMON_BELONG:
return (records) => {
return records.filter((r) => operator.value.includes(r[dataKey]));
};
case QueryOperator_1.Operator.COMMON_INEQUALITY:
return (records) => {
return records.filter((r) => r[dataKey] !== operator.value);
};
case QueryOperator_1.Operator.NUMBER_GT:
return (records) => {
return records.filter((r) => r[dataKey] > operator.value);
};
case QueryOperator_1.Operator.NUMBER_LT:
return (records) => {
return records.filter((r) => r[dataKey] < operator.value);
};
case QueryOperator_1.Operator.NUMBER_GTE:
return (records) => {
return records.filter((r) => r[dataKey] >= operator.value);
};
case QueryOperator_1.Operator.NUMBER_LTE:
return (records) => {
return records.filter((r) => r[dataKey] <= operator.value);
};
case QueryOperator_1.Operator.STRING_CONTAIN:
return (records) => {
return records.filter((r) => r[dataKey].indexOf(operator.value) >= 0);
};
case QueryOperator_1.Operator.STRING_REGEX:
const regx = new RegExp(operator.value);
return (records) => {
return records.filter((r) => !!regx.exec(r[dataKey]));
};
case QueryOperator_1.Operator.NUMBER_BETWEEN:
return (records) => {
return records.filter((r) => r[dataKey] >= operator.value.start && r[dataKey] <= operator.value.end);
};
default:
return (records) => {
return records;
};
}
}));
}
}
exports.InMemoryAdapter = InMemoryAdapter;
class DefaultInMemoryDatabaseAdapter extends AbstractDatabaseAdapter_1.AbstractDatabaseAdapter {
constructor() {
super();
}
use(model) {
let modelAdapter = this.modelAdapters.get(model.name);
let modelMetaData = this.modelMetadata.find((meta) => meta.modelName === model.name);
if (!modelAdapter) {
modelAdapter = new InMemoryAdapter(model, modelMetaData, this.schemas[model.name]);
this.modelAdapters.set(model.name, modelAdapter);
}
// @ts-ignore
return modelAdapter;
}
createTransaction() {
throw new ClaireError_1.ClaireError(errors_1.NOT_SUPPORTED);
}
}
exports.DefaultInMemoryDatabaseAdapter = DefaultInMemoryDatabaseAdapter;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVmYXVsdEluTWVtb3J5RGF0YWJhc2VBZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL2RlZmF1bHQtaW1wbGVtZW50YXRpb25zL0RlZmF1bHRJbk1lbW9yeURhdGFiYXNlQWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBLGlGQUE0RTtBQUM1RSx1REFBa0Q7QUFJbEQsNkNBQWlFO0FBRWpFLDBEQUFxRDtBQUNyRCwwREFBK0Q7QUFDL0QsMkNBQXNDO0FBRXRDLE1BQWEsZUFBbUIsU0FBUSw2QkFBZ0I7SUFNcEQsWUFBbUIsS0FBaUMsRUFBRSxhQUE0QixFQUFFLE1BQWdDO1FBQ2hILEtBQUssQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFMeEIsbUJBQWMsR0FBVyxDQUFDLENBQUM7UUFNL0IsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFTyxNQUFNLENBQUMsVUFBZTtRQUUxQixJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDcEMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDLGFBQWMsQ0FBQztZQUV2QyxtQ0FBbUM7WUFDbkMsSUFBSSxDQUFDLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQyxlQUFlLEVBQUU7Z0JBQ3JDLFVBQVUsQ0FBQyxhQUFhLENBQUMsR0FBRyxhQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLFFBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUN0SCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7YUFDekI7WUFFRCw0QkFBNEI7WUFDNUIsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFO2dCQUNaLHFCQUFxQjtnQkFDckIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEtBQUssVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQzdHLElBQUksT0FBTyxFQUFFO29CQUNULE1BQU0sZ0NBQWdDLGFBQWEsRUFBRSxDQUFDO2lCQUN6RDthQUNKO1lBRUQsOEJBQThCO1lBQzlCLElBQUksQ0FBQyxDQUFDLFFBQVEsSUFBSSxVQUFVLENBQUMsYUFBYSxDQUFDLEtBQUssU0FBUyxFQUFFO2dCQUN2RCxNQUFNLFNBQVMsYUFBYSwwQkFBMEIsQ0FBQzthQUMxRDtRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLFlBQVksQ0FBQyxJQUFXLEVBQUUsSUFBZ0Q7UUFDOUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtZQUNqQixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDZixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQVcsRUFBRSxFQUFFO2dCQUNuQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQ25CLGFBQWE7b0JBQ2IsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSzt3QkFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQ3JDLGFBQWE7b0JBQ2IsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssTUFBTTt3QkFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDO2lCQUN4QztnQkFDRCxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQ25CLGFBQWE7b0JBQ2IsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSzt3QkFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDO29CQUNwQyxhQUFhO29CQUNiLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLE1BQU07d0JBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO2lCQUN6QztnQkFDRCxPQUFPLE1BQU0sS0FBSyxDQUFDLENBQUM7WUFDeEIsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLE1BQU0sQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFWSxVQUFVLENBQUMsT0FBNEI7O1lBQ2hELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDL0UsSUFBSSxXQUFXLEdBQVUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzFGLDJCQUEyQjtZQUMzQixXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUN0QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3ZELElBQUksS0FBSyxJQUFJLENBQUMsRUFBRTtvQkFDWixJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUNoRDtZQUNMLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxXQUFXLENBQUMsTUFBTSxDQUFDO1FBQzlCLENBQUM7S0FBQTtJQUVZLFNBQVMsQ0FBQyxhQUFnQjs7WUFDbkMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN4RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsYUFBYyxDQUFDLEtBQU0sYUFBcUIsQ0FBQyxVQUFVLENBQUMsY0FBZSxDQUFDLENBQUMsQ0FBQztZQUNySixJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQzthQUNoRDtZQUNELE9BQU8sYUFBYSxDQUFDO1FBQ3pCLENBQUM7S0FBQTtJQUVPLHFCQUFxQixDQUFDLE9BQWMsRUFBRSxPQUF3QztRQUNsRixJQUFJLE1BQU0sR0FBVSxFQUFFLENBQUM7UUFDdkIsS0FBSyxNQUFNLFdBQVcsSUFBSSxPQUFPLEVBQUU7WUFDL0IsSUFBSSxVQUFVLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2pDLEtBQUssTUFBTSxNQUFNLElBQUksV0FBVyxFQUFFO2dCQUM5QixVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ25DO1lBQ0QsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQ3ZCLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQ3BCO1lBQ0wsQ0FBQyxDQUFDLENBQUM7U0FDTjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFWSxPQUFPLENBQUMsT0FBNkIsRUFBRSxPQUduRDs7WUFDRyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQy9FLElBQUksV0FBVyxHQUFVLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUMxRixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDM0QsWUFBWSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxpQ0FBSyxJQUFJLENBQUMsZUFBZSxDQUFDLHFCQUFxQixFQUFFLEtBQUUsR0FBRyxJQUFFLENBQUMsQ0FBQztZQUVqRyxJQUFJLE9BQU8sRUFBRTtnQkFDVCxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUU7b0JBQ2YsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUNsRDtnQkFDRCxJQUFJLE9BQU8sQ0FBQyxVQUFVLEVBQUU7b0JBQ3BCLFlBQVksR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO3dCQUNsQyxJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7d0JBQ25CLE9BQU8sQ0FBQyxVQUFXLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFOzRCQUNuQyxhQUFhOzRCQUNiLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7d0JBQ3hDLENBQUMsQ0FBQyxDQUFDO3dCQUNILE9BQU8sU0FBUyxDQUFDO29CQUNyQixDQUFDLENBQUMsQ0FBQztpQkFDTjtnQkFDRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUU7b0JBQ2YsWUFBWSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLElBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ3pHO2FBQ0o7WUFFRCxPQUFPLFlBQW1CLENBQUM7UUFDL0IsQ0FBQztLQUFBO0lBRVksTUFBTSxDQUFDLE9BQTZCLEVBQUUsT0FHbEQ7O1lBQ0csTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNwRCxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQixDQUFDO0tBQUE7SUFFWSxRQUFRLENBQUMsS0FBVTs7WUFDNUIsTUFBTSxJQUFJLHlCQUFXLENBQUMsc0JBQWEsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7S0FBQTtJQUVZLFFBQVEsQ0FBQyxjQUE0Qjs7WUFDOUMsT0FBTyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsYUFBa0IsRUFBRSxFQUFFO2dCQUM3QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLHFCQUFxQixFQUFFLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNsSSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN4QixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMscUJBQXFCLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUN2RixDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7S0FBQTtJQUVZLE9BQU8sQ0FBQyxhQUF5Qjs7WUFDMUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztZQUNwRCxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQixDQUFDO0tBQUE7SUFFWSxVQUFVLENBQUMsT0FBNEIsRUFBRSxNQUFrQjs7WUFDcEUsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUNBQWlDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMvRSxJQUFJLE9BQU8sR0FBVSxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFFdEYsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4RCxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNsQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3ZELElBQUksS0FBSyxJQUFJLENBQUMsRUFBRTtvQkFDWixJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsbUNBQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEdBQUssVUFBVSxDQUFDLENBQUM7aUJBQ3hGO1lBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDMUIsQ0FBQztLQUFBO0lBRVksU0FBUyxDQUFDLGFBQWdCOztZQUNuQyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9ELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDeEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGFBQWMsQ0FBQyxLQUFNLGFBQXFCLENBQUMsVUFBVSxDQUFDLGNBQWUsQ0FBQyxDQUFDLENBQUM7WUFDckosSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO2dCQUNYLE1BQU0sSUFBSSx5QkFBVyxDQUFDLHlCQUFnQixDQUFDLENBQUM7YUFDM0M7WUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsbUNBQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEdBQUssVUFBVSxDQUFDLENBQUM7WUFDNUYsdUNBQVcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFLLGFBQWEsRUFBRTtRQUN0RyxDQUFDO0tBQUE7SUFFUyxpQ0FBaUMsQ0FBQyxPQUE0QjtRQUNwRSxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQVEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUM1QixNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3ZCLGFBQWE7WUFDYixNQUFNLFFBQVEsR0FBa0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFFLENBQUMsYUFBYyxDQUFDO1lBQzVFLFFBQVEsUUFBUSxDQUFDLFFBQVEsRUFBRTtnQkFDdkIsS0FBSyx3QkFBUSxDQUFDLGVBQWU7b0JBQ3pCLE9BQU8sQ0FBQyxPQUFjLEVBQUUsRUFBRTt3QkFDdEIsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNyRSxDQUFDLENBQUM7Z0JBQ04sS0FBSyx3QkFBUSxDQUFDLGFBQWE7b0JBQ3ZCLE9BQU8sQ0FBQyxPQUFjLEVBQUUsRUFBRTt3QkFDdEIsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUMzRSxDQUFDLENBQUM7Z0JBQ04sS0FBSyx3QkFBUSxDQUFDLGlCQUFpQjtvQkFDM0IsT0FBTyxDQUFDLE9BQWMsRUFBRSxFQUFFO3dCQUN0QixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3JFLENBQUMsQ0FBQztnQkFDTixLQUFLLHdCQUFRLENBQUMsU0FBUztvQkFDbkIsT0FBTyxDQUFDLE9BQWMsRUFBRSxFQUFFO3dCQUN0QixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ25FLENBQUMsQ0FBQztnQkFDTixLQUFLLHdCQUFRLENBQUMsU0FBUztvQkFDbkIsT0FBTyxDQUFDLE9BQWMsRUFBRSxFQUFFO3dCQUN0QixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ25FLENBQUMsQ0FBQztnQkFDTixLQUFLLHdCQUFRLENBQUMsVUFBVTtvQkFDcEIsT0FBTyxDQUFDLE9BQWMsRUFBRSxFQUFFO3dCQUN0QixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3BFLENBQUMsQ0FBQztnQkFDTixLQUFLLHdCQUFRLENBQUMsVUFBVTtvQkFDcEIsT0FBTyxDQUFDLE9BQWMsRUFBRSxFQUFFO3dCQUN0QixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3BFLENBQUMsQ0FBQztnQkFDTixLQUFLLHdCQUFRLENBQUMsY0FBYztvQkFDeEIsT0FBTyxDQUFDLE9BQWMsRUFBRSxFQUFFO3dCQUN0QixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO29CQUMvRSxDQUFDLENBQUM7Z0JBQ04sS0FBSyx3QkFBUSxDQUFDLFlBQVk7b0JBQ3RCLE1BQU0sSUFBSSxHQUFHLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDeEMsT0FBTyxDQUFDLE9BQWMsRUFBRSxFQUFFO3dCQUN0QixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQy9ELENBQUMsQ0FBQztnQkFDTixLQUFLLHdCQUFRLENBQUMsY0FBYztvQkFDeEIsT0FBTyxDQUFDLE9BQWMsRUFBRSxFQUFFO3dCQUN0QixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDOUcsQ0FBQyxDQUFDO2dCQUNOO29CQUNJLE9BQU8sQ0FBQyxPQUFjLEVBQUUsRUFBRTt3QkFDdEIsT0FBTyxPQUFPLENBQUM7b0JBQ25CLENBQUMsQ0FBQzthQUNUO1FBQ0wsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUM7Q0FDSjtBQTVPRCwwQ0E0T0M7QUFFRCxNQUFhLDhCQUErQixTQUFRLGlEQUF1QjtJQUl2RTtRQUNJLEtBQUssRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVNLEdBQUcsQ0FBMEIsS0FBaUM7UUFDakUsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RELElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxLQUFLLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRixJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ2YsWUFBWSxHQUFHLElBQUksZUFBZSxDQUFJLEtBQUssRUFBRSxhQUFjLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN2RixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO1NBQ3BEO1FBQ0QsYUFBYTtRQUNiLE9BQU8sWUFBWSxDQUFDO0lBQ3hCLENBQUM7SUFFTSxpQkFBaUI7UUFDcEIsTUFBTSxJQUFJLHlCQUFXLENBQUMsc0JBQWEsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7Q0FFSjtBQXZCRCx3RUF1QkMifQ==