UNPKG

claire-framework

Version:

- được viết bằng TypeScript - hỗ trợ websocket và HTTP request - hỗ trợ CLI để generate base project (claire-cli)

256 lines 23.8 kB
"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.schema.modelConnection; for (const filter of filters) { dataObjects = filter(dataObjects); } //-- 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; }); } getMany(queries, options) { return __awaiter(this, void 0, void 0, function* () { const filters = queries ? this.getQueryObjectFromQueryConditions(queries) : []; let dataObjects = this.schema.modelConnection; for (const filter of filters) { dataObjects = filter(dataObjects); } 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 dataObjects = this.schema.modelConnection; for (const filter of filters) { dataObjects = filter(dataObjects); } let dataUpdate = this.convertToDataObjects([update])[0]; dataObjects.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 dataObjects.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.reduce((collector, q) => collector.concat(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])); }; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVmYXVsdEluTWVtb3J5RGF0YWJhc2VBZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL2RlZmF1bHQtaW1wbGVtZW50YXRpb25zL0RlZmF1bHRJbk1lbW9yeURhdGFiYXNlQWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBLGlGQUE0RTtBQUM1RSx1REFBa0Q7QUFJbEQsNkNBQWlFO0FBRWpFLDBEQUFxRDtBQUNyRCwwREFBK0Q7QUFDL0QsMkNBQXNDO0FBRXRDLE1BQWEsZUFBbUIsU0FBUSw2QkFBZ0I7SUFNcEQsWUFBbUIsS0FBaUMsRUFBRSxhQUE0QixFQUFFLE1BQWdDO1FBQ2hILEtBQUssQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFMeEIsbUJBQWMsR0FBVyxDQUFDLENBQUM7UUFNL0IsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFTyxNQUFNLENBQUMsVUFBZTtRQUUxQixJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDcEMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDLGFBQWMsQ0FBQztZQUV2QyxtQ0FBbUM7WUFDbkMsSUFBSSxDQUFDLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQyxlQUFlLEVBQUU7Z0JBQ3JDLFVBQVUsQ0FBQyxhQUFhLENBQUMsR0FBRyxhQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLFFBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUN0SCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7YUFDekI7WUFFRCw0QkFBNEI7WUFDNUIsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFO2dCQUNaLHFCQUFxQjtnQkFDckIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEtBQUssVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQzdHLElBQUksT0FBTyxFQUFFO29CQUNULE1BQU0sZ0NBQWdDLGFBQWEsRUFBRSxDQUFDO2lCQUN6RDthQUNKO1lBRUQsOEJBQThCO1lBQzlCLElBQUksQ0FBQyxDQUFDLFFBQVEsSUFBSSxVQUFVLENBQUMsYUFBYSxDQUFDLEtBQUssU0FBUyxFQUFFO2dCQUN2RCxNQUFNLFNBQVMsYUFBYSwwQkFBMEIsQ0FBQzthQUMxRDtRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLFlBQVksQ0FBQyxJQUFXLEVBQUUsSUFBZ0Q7UUFDOUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtZQUNqQixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDZixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQVcsRUFBRSxFQUFFO2dCQUNuQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQ25CLGFBQWE7b0JBQ2IsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSzt3QkFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQ3JDLGFBQWE7b0JBQ2IsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssTUFBTTt3QkFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDO2lCQUN4QztnQkFDRCxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQ25CLGFBQWE7b0JBQ2IsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSzt3QkFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDO29CQUNwQyxhQUFhO29CQUNiLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLE1BQU07d0JBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO2lCQUN6QztnQkFDRCxPQUFPLE1BQU0sS0FBSyxDQUFDLENBQUM7WUFDeEIsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLE1BQU0sQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFWSxVQUFVLENBQUMsT0FBNEI7O1lBQ2hELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDL0UsSUFBSSxXQUFXLEdBQVUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUM7WUFDckQsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUU7Z0JBQzFCLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDckM7WUFDRCwyQkFBMkI7WUFDM0IsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDdEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN2RCxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUU7b0JBQ1osSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDaEQ7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sV0FBVyxDQUFDLE1BQU0sQ0FBQztRQUM5QixDQUFDO0tBQUE7SUFFWSxTQUFTLENBQUMsYUFBZ0I7O1lBQ25DLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDeEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGFBQWMsQ0FBQyxLQUFNLGFBQXFCLENBQUMsVUFBVSxDQUFDLGNBQWUsQ0FBQyxDQUFDLENBQUM7WUFDckosSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFO2dCQUNaLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDaEQ7WUFDRCxPQUFPLGFBQWEsQ0FBQztRQUN6QixDQUFDO0tBQUE7SUFFWSxPQUFPLENBQUMsT0FBNkIsRUFBRSxPQUduRDs7WUFDRyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQy9FLElBQUksV0FBVyxHQUFVLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDO1lBQ3JELEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFO2dCQUMxQixXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ3JDO1lBQ0QsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzNELFlBQVksR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsaUNBQUssSUFBSSxDQUFDLGVBQWUsQ0FBQyxxQkFBcUIsRUFBRSxLQUFFLEdBQUcsSUFBRSxDQUFDLENBQUM7WUFFakcsSUFBSSxPQUFPLEVBQUU7Z0JBQ1QsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFO29CQUNmLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDbEQ7Z0JBQ0QsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFO29CQUNwQixZQUFZLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTt3QkFDbEMsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO3dCQUNuQixPQUFPLENBQUMsVUFBVyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTs0QkFDbkMsYUFBYTs0QkFDYixTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUN4QyxDQUFDLENBQUMsQ0FBQzt3QkFDSCxPQUFPLFNBQVMsQ0FBQztvQkFDckIsQ0FBQyxDQUFDLENBQUM7aUJBQ047Z0JBQ0QsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFO29CQUNmLFlBQVksR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxJQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUN6RzthQUNKO1lBRUQsT0FBTyxZQUFtQixDQUFDO1FBQy9CLENBQUM7S0FBQTtJQUVZLE1BQU0sQ0FBQyxPQUE2QixFQUFFLE9BR2xEOztZQUNHLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDcEQsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckIsQ0FBQztLQUFBO0lBRVksUUFBUSxDQUFDLEtBQVU7O1lBQzVCLE1BQU0sSUFBSSx5QkFBVyxDQUFDLHNCQUFhLENBQUMsQ0FBQztRQUN6QyxDQUFDO0tBQUE7SUFFWSxRQUFRLENBQUMsY0FBNEI7O1lBQzlDLE9BQU8sY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGFBQWtCLEVBQUUsRUFBRTtnQkFDN0MsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEksSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDeEIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLHFCQUFxQixFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDdkYsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO0tBQUE7SUFFWSxPQUFPLENBQUMsYUFBeUI7O1lBQzFDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7WUFDcEQsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckIsQ0FBQztLQUFBO0lBRVksVUFBVSxDQUFDLE9BQTRCLEVBQUUsTUFBa0I7O1lBQ3BFLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDL0UsSUFBSSxXQUFXLEdBQVUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUM7WUFDckQsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUU7Z0JBQzFCLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDckM7WUFDRCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hELFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ3RCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDdkQsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFO29CQUNaLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxtQ0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsR0FBSyxVQUFVLENBQUMsQ0FBQztpQkFDeEY7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sV0FBVyxDQUFDLE1BQU0sQ0FBQztRQUM5QixDQUFDO0tBQUE7SUFFWSxTQUFTLENBQUMsYUFBZ0I7O1lBQ25DLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN4RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsYUFBYyxDQUFDLEtBQU0sYUFBcUIsQ0FBQyxVQUFVLENBQUMsY0FBZSxDQUFDLENBQUMsQ0FBQztZQUNySixJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7Z0JBQ1gsTUFBTSxJQUFJLHlCQUFXLENBQUMseUJBQWdCLENBQUMsQ0FBQzthQUMzQztZQUNELElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxtQ0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsR0FBSyxVQUFVLENBQUMsQ0FBQztZQUM1Rix1Q0FBVyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUssYUFBYSxFQUFFO1FBQ3RHLENBQUM7S0FBQTtJQUVTLGlDQUFpQyxDQUFDLE9BQTRCO1FBQ3BFLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUMxQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDeEMsYUFBYTtZQUNiLE1BQU0sUUFBUSxHQUFrQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdkMsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUUsQ0FBQyxhQUFjLENBQUM7WUFDNUUsUUFBUSxRQUFRLENBQUMsUUFBUSxFQUFFO2dCQUN2QixLQUFLLHdCQUFRLENBQUMsZUFBZTtvQkFDekIsT0FBTyxDQUFDLE9BQWMsRUFBRSxFQUFFO3dCQUN0QixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3JFLENBQUMsQ0FBQztnQkFDTixLQUFLLHdCQUFRLENBQUMsYUFBYTtvQkFDdkIsT0FBTyxDQUFDLE9BQWMsRUFBRSxFQUFFO3dCQUN0QixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzNFLENBQUMsQ0FBQztnQkFDTixLQUFLLHdCQUFRLENBQUMsaUJBQWlCO29CQUMzQixPQUFPLENBQUMsT0FBYyxFQUFFLEVBQUU7d0JBQ3RCLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDckUsQ0FBQyxDQUFDO2dCQUNOLEtBQUssd0JBQVEsQ0FBQyxTQUFTO29CQUNuQixPQUFPLENBQUMsT0FBYyxFQUFFLEVBQUU7d0JBQ3RCLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDbkUsQ0FBQyxDQUFDO2dCQUNOLEtBQUssd0JBQVEsQ0FBQyxTQUFTO29CQUNuQixPQUFPLENBQUMsT0FBYyxFQUFFLEVBQUU7d0JBQ3RCLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDbkUsQ0FBQyxDQUFDO2dCQUNOLEtBQUssd0JBQVEsQ0FBQyxVQUFVO29CQUNwQixPQUFPLENBQUMsT0FBYyxFQUFFLEVBQUU7d0JBQ3RCLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDcEUsQ0FBQyxDQUFDO2dCQUNOLEtBQUssd0JBQVEsQ0FBQyxVQUFVO29CQUNwQixPQUFPLENBQUMsT0FBYyxFQUFFLEVBQUU7d0JBQ3RCLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDcEUsQ0FBQyxDQUFDO2dCQUNOLEtBQUssd0JBQVEsQ0FBQyxjQUFjO29CQUN4QixPQUFPLENBQUMsT0FBYyxFQUFFLEVBQUU7d0JBQ3RCLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7b0JBQy9FLENBQUMsQ0FBQztnQkFDTixLQUFLLHdCQUFRLENBQUMsWUFBWTtvQkFDdEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN4QyxPQUFPLENBQUMsT0FBYyxFQUFFLEVBQUU7d0JBQ3RCLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDL0QsQ0FBQyxDQUFDO2dCQUNOO29CQUNJLE9BQU8sQ0FBQyxPQUFjLEVBQUUsRUFBRTt3QkFDdEIsT0FBTyxPQUFPLENBQUM7b0JBQ25CLENBQUMsQ0FBQzthQUNUO1FBQ0wsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNqQixDQUFDO0NBQ0o7QUFoT0QsMENBZ09DO0FBRUQsTUFBYSw4QkFBK0IsU0FBUSxpREFBdUI7SUFJdkU7UUFDSSxLQUFLLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFTSxHQUFHLENBQTBCLEtBQWlDO1FBQ2pFLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0RCxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckYsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNmLFlBQVksR0FBRyxJQUFJLGVBQWUsQ0FBSSxLQUFLLEVBQUUsYUFBYyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDdkYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztTQUNwRDtRQUNELGFBQWE7UUFDYixPQUFPLFlBQVksQ0FBQztJQUN4QixDQUFDO0lBRU0saUJBQWlCO1FBQ3BCLE1BQU0sSUFBSSx5QkFBVyxDQUFDLHNCQUFhLENBQUMsQ0FBQztJQUN6QyxDQUFDO0NBRUo7QUF2QkQsd0VBdUJDIn0=