123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331 |
- "use strict";
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.default = void 0;
- var _MongoCollection = _interopRequireDefault(require("./MongoCollection"));
- var _node = _interopRequireDefault(require("parse/node"));
- const _excluded = ["type", "targetClass"];
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
- function _objectDestructuringEmpty(t) { if (null == t) throw new TypeError("Cannot destructure " + t); }
- function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
- function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], t.indexOf(o) >= 0 || {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
- function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (e.indexOf(n) >= 0) continue; t[n] = r[n]; } return t; }
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
- function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
- function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
- function mongoFieldToParseSchemaField(type) {
- if (type[0] === '*') {
- return {
- type: 'Pointer',
- targetClass: type.slice(1)
- };
- }
- if (type.startsWith('relation<')) {
- return {
- type: 'Relation',
- targetClass: type.slice('relation<'.length, type.length - 1)
- };
- }
- switch (type) {
- case 'number':
- return {
- type: 'Number'
- };
- case 'string':
- return {
- type: 'String'
- };
- case 'boolean':
- return {
- type: 'Boolean'
- };
- case 'date':
- return {
- type: 'Date'
- };
- case 'map':
- case 'object':
- return {
- type: 'Object'
- };
- case 'array':
- return {
- type: 'Array'
- };
- case 'geopoint':
- return {
- type: 'GeoPoint'
- };
- case 'file':
- return {
- type: 'File'
- };
- case 'bytes':
- return {
- type: 'Bytes'
- };
- case 'polygon':
- return {
- type: 'Polygon'
- };
- }
- }
- const nonFieldSchemaKeys = ['_id', '_metadata', '_client_permissions'];
- function mongoSchemaFieldsToParseSchemaFields(schema) {
- var fieldNames = Object.keys(schema).filter(key => nonFieldSchemaKeys.indexOf(key) === -1);
- var response = fieldNames.reduce((obj, fieldName) => {
- obj[fieldName] = mongoFieldToParseSchemaField(schema[fieldName]);
- if (schema._metadata && schema._metadata.fields_options && schema._metadata.fields_options[fieldName]) {
- obj[fieldName] = Object.assign({}, obj[fieldName], schema._metadata.fields_options[fieldName]);
- }
- return obj;
- }, {});
- response.ACL = {
- type: 'ACL'
- };
- response.createdAt = {
- type: 'Date'
- };
- response.updatedAt = {
- type: 'Date'
- };
- response.objectId = {
- type: 'String'
- };
- return response;
- }
- const emptyCLPS = Object.freeze({
- find: {},
- count: {},
- get: {},
- create: {},
- update: {},
- delete: {},
- addField: {},
- protectedFields: {}
- });
- const defaultCLPS = Object.freeze({
- find: {
- '*': true
- },
- count: {
- '*': true
- },
- get: {
- '*': true
- },
- create: {
- '*': true
- },
- update: {
- '*': true
- },
- delete: {
- '*': true
- },
- addField: {
- '*': true
- },
- protectedFields: {
- '*': []
- }
- });
- function mongoSchemaToParseSchema(mongoSchema) {
- let clps = defaultCLPS;
- let indexes = {};
- if (mongoSchema._metadata) {
- if (mongoSchema._metadata.class_permissions) {
- clps = _objectSpread(_objectSpread({}, emptyCLPS), mongoSchema._metadata.class_permissions);
- }
- if (mongoSchema._metadata.indexes) {
- indexes = _objectSpread({}, mongoSchema._metadata.indexes);
- }
- }
- return {
- className: mongoSchema._id,
- fields: mongoSchemaFieldsToParseSchemaFields(mongoSchema),
- classLevelPermissions: clps,
- indexes: indexes
- };
- }
- function _mongoSchemaQueryFromNameQuery(name, query) {
- const object = {
- _id: name
- };
- if (query) {
- Object.keys(query).forEach(key => {
- object[key] = query[key];
- });
- }
- return object;
- }
- // Returns a type suitable for inserting into mongo _SCHEMA collection.
- // Does no validation. That is expected to be done in Parse Server.
- function parseFieldTypeToMongoFieldType({
- type,
- targetClass
- }) {
- switch (type) {
- case 'Pointer':
- return `*${targetClass}`;
- case 'Relation':
- return `relation<${targetClass}>`;
- case 'Number':
- return 'number';
- case 'String':
- return 'string';
- case 'Boolean':
- return 'boolean';
- case 'Date':
- return 'date';
- case 'Object':
- return 'object';
- case 'Array':
- return 'array';
- case 'GeoPoint':
- return 'geopoint';
- case 'File':
- return 'file';
- case 'Bytes':
- return 'bytes';
- case 'Polygon':
- return 'polygon';
- }
- }
- class MongoSchemaCollection {
- constructor(collection) {
- this._collection = collection;
- }
- _fetchAllSchemasFrom_SCHEMA() {
- return this._collection._rawFind({}).then(schemas => schemas.map(mongoSchemaToParseSchema));
- }
- _fetchOneSchemaFrom_SCHEMA(name) {
- return this._collection._rawFind(_mongoSchemaQueryFromNameQuery(name), {
- limit: 1
- }).then(results => {
- if (results.length === 1) {
- return mongoSchemaToParseSchema(results[0]);
- } else {
- throw undefined;
- }
- });
- }
- // Atomically find and delete an object based on query.
- findAndDeleteSchema(name) {
- return this._collection._mongoCollection.findOneAndDelete(_mongoSchemaQueryFromNameQuery(name));
- }
- insertSchema(schema) {
- return this._collection.insertOne(schema).then(() => mongoSchemaToParseSchema(schema)).catch(error => {
- if (error.code === 11000) {
- //Mongo's duplicate key error
- throw new _node.default.Error(_node.default.Error.DUPLICATE_VALUE, 'Class already exists.');
- } else {
- throw error;
- }
- });
- }
- updateSchema(name, update) {
- return this._collection.updateOne(_mongoSchemaQueryFromNameQuery(name), update);
- }
- upsertSchema(name, query, update) {
- return this._collection.upsertOne(_mongoSchemaQueryFromNameQuery(name, query), update);
- }
- // Add a field to the schema. If database does not support the field
- // type (e.g. mongo doesn't support more than one GeoPoint in a class) reject with an "Incorrect Type"
- // Parse error with a desciptive message. If the field already exists, this function must
- // not modify the schema, and must reject with DUPLICATE_VALUE error.
- // If this is called for a class that doesn't exist, this function must create that class.
- // TODO: throw an error if an unsupported field type is passed. Deciding whether a type is supported
- // should be the job of the adapter. Some adapters may not support GeoPoint at all. Others may
- // Support additional types that Mongo doesn't, like Money, or something.
- // TODO: don't spend an extra query on finding the schema if the type we are trying to add isn't a GeoPoint.
- addFieldIfNotExists(className, fieldName, fieldType) {
- return this._fetchOneSchemaFrom_SCHEMA(className).then(schema => {
- // If a field with this name already exists, it will be handled elsewhere.
- if (schema.fields[fieldName] !== undefined) {
- return;
- }
- // The schema exists. Check for existing GeoPoints.
- if (fieldType.type === 'GeoPoint') {
- // Make sure there are not other geopoint fields
- if (Object.keys(schema.fields).some(existingField => schema.fields[existingField].type === 'GeoPoint')) {
- throw new _node.default.Error(_node.default.Error.INCORRECT_TYPE, 'MongoDB only supports one GeoPoint field in a class.');
- }
- }
- return;
- }, error => {
- // If error is undefined, the schema doesn't exist, and we can create the schema with the field.
- // If some other error, reject with it.
- if (error === undefined) {
- return;
- }
- throw error;
- }).then(() => {
- const {
- type,
- targetClass
- } = fieldType,
- fieldOptions = _objectWithoutProperties(fieldType, _excluded);
- // We use $exists and $set to avoid overwriting the field type if it
- // already exists. (it could have added inbetween the last query and the update)
- if (fieldOptions && Object.keys(fieldOptions).length > 0) {
- return this.upsertSchema(className, {
- [fieldName]: {
- $exists: false
- }
- }, {
- $set: {
- [fieldName]: parseFieldTypeToMongoFieldType({
- type,
- targetClass
- }),
- [`_metadata.fields_options.${fieldName}`]: fieldOptions
- }
- });
- } else {
- return this.upsertSchema(className, {
- [fieldName]: {
- $exists: false
- }
- }, {
- $set: {
- [fieldName]: parseFieldTypeToMongoFieldType({
- type,
- targetClass
- })
- }
- });
- }
- });
- }
- async updateFieldOptions(className, fieldName, fieldType) {
- const fieldOptions = _extends({}, (_objectDestructuringEmpty(fieldType), fieldType));
- delete fieldOptions.type;
- delete fieldOptions.targetClass;
- await this.upsertSchema(className, {
- [fieldName]: {
- $exists: true
- }
- }, {
- $set: {
- [`_metadata.fields_options.${fieldName}`]: fieldOptions
- }
- });
- }
- }
- // Exported for testing reasons and because we haven't moved all mongo schema format
- // related logic into the database adapter yet.
- MongoSchemaCollection._TESTmongoSchemaToParseSchema = mongoSchemaToParseSchema;
- MongoSchemaCollection.parseFieldTypeToMongoFieldType = parseFieldTypeToMongoFieldType;
- var _default = exports.default = MongoSchemaCollection;
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfTW9uZ29Db2xsZWN0aW9uIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfbm9kZSIsIl9leGNsdWRlZCIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIl9vYmplY3REZXN0cnVjdHVyaW5nRW1wdHkiLCJ0IiwiVHlwZUVycm9yIiwiX2V4dGVuZHMiLCJPYmplY3QiLCJhc3NpZ24iLCJiaW5kIiwibiIsImFyZ3VtZW50cyIsImxlbmd0aCIsInIiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJhcHBseSIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllcyIsIm8iLCJpIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJpbmRleE9mIiwicHJvcGVydHlJc0VudW1lcmFibGUiLCJvd25LZXlzIiwia2V5cyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiX29iamVjdFNwcmVhZCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiX3RvUHJvcGVydHlLZXkiLCJ2YWx1ZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiX3RvUHJpbWl0aXZlIiwiU3ltYm9sIiwidG9QcmltaXRpdmUiLCJTdHJpbmciLCJOdW1iZXIiLCJtb25nb0ZpZWxkVG9QYXJzZVNjaGVtYUZpZWxkIiwidHlwZSIsInRhcmdldENsYXNzIiwic2xpY2UiLCJzdGFydHNXaXRoIiwibm9uRmllbGRTY2hlbWFLZXlzIiwibW9uZ29TY2hlbWFGaWVsZHNUb1BhcnNlU2NoZW1hRmllbGRzIiwic2NoZW1hIiwiZmllbGROYW1lcyIsImtleSIsInJlc3BvbnNlIiwicmVkdWNlIiwib2JqIiwiZmllbGROYW1lIiwiX21ldGFkYXRhIiwiZmllbGRzX29wdGlvbnMiLCJBQ0wiLCJjcmVhdGVkQXQiLCJ1cGRhdGVkQXQiLCJvYmplY3RJZCIsImVtcHR5Q0xQUyIsImZyZWV6ZSIsImZpbmQiLCJjb3VudCIsImdldCIsImNyZWF0ZSIsInVwZGF0ZSIsImRlbGV0ZSIsImFkZEZpZWxkIiwicHJvdGVjdGVkRmllbGRzIiwiZGVmYXVsdENMUFMiLCJtb25nb1NjaGVtYVRvUGFyc2VTY2hlbWEiLCJtb25nb1NjaGVtYSIsImNscHMiLCJpbmRleGVzIiwiY2xhc3NfcGVybWlzc2lvbnMiLCJjbGFzc05hbWUiLCJfaWQiLCJmaWVsZHMiLCJjbGFzc0xldmVsUGVybWlzc2lvbnMiLCJfbW9uZ29TY2hlbWFRdWVyeUZyb21OYW1lUXVlcnkiLCJuYW1lIiwicXVlcnkiLCJvYmplY3QiLCJwYXJzZUZpZWxkVHlwZVRvTW9uZ29GaWVsZFR5cGUiLCJNb25nb1NjaGVtYUNvbGxlY3Rpb24iLCJjb25zdHJ1Y3RvciIsImNvbGxlY3Rpb24iLCJfY29sbGVjdGlvbiIsIl9mZXRjaEFsbFNjaGVtYXNGcm9tX1NDSEVNQSIsIl9yYXdGaW5kIiwidGhlbiIsInNjaGVtYXMiLCJtYXAiLCJfZmV0Y2hPbmVTY2hlbWFGcm9tX1NDSEVNQSIsImxpbWl0IiwicmVzdWx0cyIsInVuZGVmaW5lZCIsImZpbmRBbmREZWxldGVTY2hlbWEiLCJfbW9uZ29Db2xsZWN0aW9uIiwiZmluZE9uZUFuZERlbGV0ZSIsImluc2VydFNjaGVtYSIsImluc2VydE9uZSIsImNhdGNoIiwiZXJyb3IiLCJjb2RlIiwiUGFyc2UiLCJFcnJvciIsIkRVUExJQ0FURV9WQUxVRSIsInVwZGF0ZVNjaGVtYSIsInVwZGF0ZU9uZSIsInVwc2VydFNjaGVtYSIsInVwc2VydE9uZSIsImFkZEZpZWxkSWZOb3RFeGlzdHMiLCJmaWVsZFR5cGUiLCJzb21lIiwiZXhpc3RpbmdGaWVsZCIsIklOQ09SUkVDVF9UWVBFIiwiZmllbGRPcHRpb25zIiwiJGV4aXN0cyIsIiRzZXQiLCJ1cGRhdGVGaWVsZE9wdGlvbnMiLCJfVEVTVG1vbmdvU2NoZW1hVG9QYXJzZVNjaGVtYSIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9BZGFwdGVycy9TdG9yYWdlL01vbmdvL01vbmdvU2NoZW1hQ29sbGVjdGlvbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTW9uZ29Db2xsZWN0aW9uIGZyb20gJy4vTW9uZ29Db2xsZWN0aW9uJztcbmltcG9ydCBQYXJzZSBmcm9tICdwYXJzZS9ub2RlJztcblxuZnVuY3Rpb24gbW9uZ29GaWVsZFRvUGFyc2VTY2hlbWFGaWVsZCh0eXBlKSB7XG4gIGlmICh0eXBlWzBdID09PSAnKicpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ1BvaW50ZXInLFxuICAgICAgdGFyZ2V0Q2xhc3M6IHR5cGUuc2xpY2UoMSksXG4gICAgfTtcbiAgfVxuICBpZiAodHlwZS5zdGFydHNXaXRoKCdyZWxhdGlvbjwnKSkge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnUmVsYXRpb24nLFxuICAgICAgdGFyZ2V0Q2xhc3M6IHR5cGUuc2xpY2UoJ3JlbGF0aW9uPCcubGVuZ3RoLCB0eXBlLmxlbmd0aCAtIDEpLFxuICAgIH07XG4gIH1cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIHJldHVybiB7IHR5cGU6ICdOdW1iZXInIH07XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIHJldHVybiB7IHR5cGU6ICdTdHJpbmcnIH07XG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICByZXR1cm4geyB0eXBlOiAnQm9vbGVhbicgfTtcbiAgICBjYXNlICdkYXRlJzpcbiAgICAgIHJldHVybiB7IHR5cGU6ICdEYXRlJyB9O1xuICAgIGNhc2UgJ21hcCc6XG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgIHJldHVybiB7IHR5cGU6ICdPYmplY3QnIH07XG4gICAgY2FzZSAnYXJyYXknOlxuICAgICAgcmV0dXJuIHsgdHlwZTogJ0FycmF5JyB9O1xuICAgIGNhc2UgJ2dlb3BvaW50JzpcbiAgICAgIHJldHVybiB7IHR5cGU6ICdHZW9Qb2ludCcgfTtcbiAgICBjYXNlICdmaWxlJzpcbiAgICAgIHJldHVybiB7IHR5cGU6ICdGaWxlJyB9O1xuICAgIGNhc2UgJ2J5dGVzJzpcbiAgICAgIHJldHVybiB7IHR5cGU6ICdCeXRlcycgfTtcbiAgICBjYXNlICdwb2x5Z29uJzpcbiAgICAgIHJldHVybiB7IHR5cGU6ICdQb2x5Z29uJyB9O1xuICB9XG59XG5cbmNvbnN0IG5vbkZpZWxkU2NoZW1hS2V5cyA9IFsnX2lkJywgJ19tZXRhZGF0YScsICdfY2xpZW50X3Blcm1pc3Npb25zJ107XG5mdW5jdGlvbiBtb25nb1NjaGVtYUZpZWxkc1RvUGFyc2VTY2hlbWFGaWVsZHMoc2NoZW1hKSB7XG4gIHZhciBmaWVsZE5hbWVzID0gT2JqZWN0LmtleXMoc2NoZW1hKS5maWx0ZXIoa2V5ID0+IG5vbkZpZWxkU2NoZW1hS2V5cy5pbmRleE9mKGtleSkgPT09IC0xKTtcbiAgdmFyIHJlc3BvbnNlID0gZmllbGROYW1lcy5yZWR1Y2UoKG9iaiwgZmllbGROYW1lKSA9PiB7XG4gICAgb2JqW2ZpZWxkTmFtZV0gPSBtb25nb0ZpZWxkVG9QYXJzZVNjaGVtYUZpZWxkKHNjaGVtYVtmaWVsZE5hbWVdKTtcbiAgICBpZiAoXG4gICAgICBzY2hlbWEuX21ldGFkYXRhICYmXG4gICAgICBzY2hlbWEuX21ldGFkYXRhLmZpZWxkc19vcHRpb25zICYmXG4gICAgICBzY2hlbWEuX21ldGFkYXRhLmZpZWxkc19vcHRpb25zW2ZpZWxkTmFtZV1cbiAgICApIHtcbiAgICAgIG9ialtmaWVsZE5hbWVdID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAge30sXG4gICAgICAgIG9ialtmaWVsZE5hbWVdLFxuICAgICAgICBzY2hlbWEuX21ldGFkYXRhLmZpZWxkc19vcHRpb25zW2ZpZWxkTmFtZV1cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG4gIH0sIHt9KTtcbiAgcmVzcG9uc2UuQUNMID0geyB0eXBlOiAnQUNMJyB9O1xuICByZXNwb25zZS5jcmVhdGVkQXQgPSB7IHR5cGU6ICdEYXRlJyB9O1xuICByZXNwb25zZS51cGRhdGVkQXQgPSB7IHR5cGU6ICdEYXRlJyB9O1xuICByZXNwb25zZS5vYmplY3RJZCA9IHsgdHlwZTogJ1N0cmluZycgfTtcbiAgcmV0dXJuIHJlc3BvbnNlO1xufVxuXG5jb25zdCBlbXB0eUNMUFMgPSBPYmplY3QuZnJlZXplKHtcbiAgZmluZDoge30sXG4gIGNvdW50OiB7fSxcbiAgZ2V0OiB7fSxcbiAgY3JlYXRlOiB7fSxcbiAgdXBkYXRlOiB7fSxcbiAgZGVsZXRlOiB7fSxcbiAgYWRkRmllbGQ6IHt9LFxuICBwcm90ZWN0ZWRGaWVsZHM6IHt9LFxufSk7XG5cbmNvbnN0IGRlZmF1bHRDTFBTID0gT2JqZWN0LmZyZWV6ZSh7XG4gIGZpbmQ6IHsgJyonOiB0cnVlIH0sXG4gIGNvdW50OiB7ICcqJzogdHJ1ZSB9LFxuICBnZXQ6IHsgJyonOiB0cnVlIH0sXG4gIGNyZWF0ZTogeyAnKic6IHRydWUgfSxcbiAgdXBkYXRlOiB7ICcqJzogdHJ1ZSB9LFxuICBkZWxldGU6IHsgJyonOiB0cnVlIH0sXG4gIGFkZEZpZWxkOiB7ICcqJzogdHJ1ZSB9LFxuICBwcm90ZWN0ZWRGaWVsZHM6IHsgJyonOiBbXSB9LFxufSk7XG5cbmZ1bmN0aW9uIG1vbmdvU2NoZW1hVG9QYXJzZVNjaGVtYShtb25nb1NjaGVtYSkge1xuICBsZXQgY2xwcyA9IGRlZmF1bHRDTFBTO1xuICBsZXQgaW5kZXhlcyA9IHt9O1xuICBpZiAobW9uZ29TY2hlbWEuX21ldGFkYXRhKSB7XG4gICAgaWYgKG1vbmdvU2NoZW1hLl9tZXRhZGF0YS5jbGFzc19wZXJtaXNzaW9ucykge1xuICAgICAgY2xwcyA9IHsgLi4uZW1wdHlDTFBTLCAuLi5tb25nb1NjaGVtYS5fbWV0YWRhdGEuY2xhc3NfcGVybWlzc2lvbnMgfTtcbiAgICB9XG4gICAgaWYgKG1vbmdvU2NoZW1hLl9tZXRhZGF0YS5pbmRleGVzKSB7XG4gICAgICBpbmRleGVzID0geyAuLi5tb25nb1NjaGVtYS5fbWV0YWRhdGEuaW5kZXhlcyB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGNsYXNzTmFtZTogbW9uZ29TY2hlbWEuX2lkLFxuICAgIGZpZWxkczogbW9uZ29TY2hlbWFGaWVsZHNUb1BhcnNlU2NoZW1hRmllbGRzKG1vbmdvU2NoZW1hKSxcbiAgICBjbGFzc0xldmVsUGVybWlzc2lvbnM6IGNscHMsXG4gICAgaW5kZXhlczogaW5kZXhlcyxcbiAgfTtcbn1cblxuZnVuY3Rpb24gX21vbmdvU2NoZW1hUXVlcnlGcm9tTmFtZVF1ZXJ5KG5hbWU6IHN0cmluZywgcXVlcnkpIHtcbiAgY29uc3Qgb2JqZWN0ID0geyBfaWQ6IG5hbWUgfTtcbiAgaWYgKHF1ZXJ5KSB7XG4gICAgT2JqZWN0LmtleXMocXVlcnkpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIG9iamVjdFtrZXldID0gcXVlcnlba2V5XTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gb2JqZWN0O1xufVxuXG4vLyBSZXR1cm5zIGEgdHlwZSBzdWl0YWJsZSBmb3IgaW5zZXJ0aW5nIGludG8gbW9uZ28gX1NDSEVNQSBjb2xsZWN0aW9uLlxuLy8gRG9lcyBubyB2YWxpZGF0aW9uLiBUaGF0IGlzIGV4cGVjdGVkIHRvIGJlIGRvbmUgaW4gUGFyc2UgU2VydmVyLlxuZnVuY3Rpb24gcGFyc2VGaWVsZFR5cGVUb01vbmdvRmllbGRUeXBlKHsgdHlwZSwgdGFyZ2V0Q2xhc3MgfSkge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdQb2ludGVyJzpcbiAgICAgIHJldHVybiBgKiR7dGFyZ2V0Q2xhc3N9YDtcbiAgICBjYXNlICdSZWxhdGlvbic6XG4gICAgICByZXR1cm4gYHJlbGF0aW9uPCR7dGFyZ2V0Q2xhc3N9PmA7XG4gICAgY2FzZSAnTnVtYmVyJzpcbiAgICAgIHJldHVybiAnbnVtYmVyJztcbiAgICBjYXNlICdTdHJpbmcnOlxuICAgICAgcmV0dXJuICdzdHJpbmcnO1xuICAgIGNhc2UgJ0Jvb2xlYW4nOlxuICAgICAgcmV0dXJuICdib29sZWFuJztcbiAgICBjYXNlICdEYXRlJzpcbiAgICAgIHJldHVybiAnZGF0ZSc7XG4gICAgY2FzZSAnT2JqZWN0JzpcbiAgICAgIHJldHVybiAnb2JqZWN0JztcbiAgICBjYXNlICdBcnJheSc6XG4gICAgICByZXR1cm4gJ2FycmF5JztcbiAgICBjYXNlICdHZW9Qb2ludCc6XG4gICAgICByZXR1cm4gJ2dlb3BvaW50JztcbiAgICBjYXNlICdGaWxlJzpcbiAgICAgIHJldHVybiAnZmlsZSc7XG4gICAgY2FzZSAnQnl0ZXMnOlxuICAgICAgcmV0dXJuICdieXRlcyc7XG4gICAgY2FzZSAnUG9seWdvbic6XG4gICAgICByZXR1cm4gJ3BvbHlnb24nO1xuICB9XG59XG5cbmNsYXNzIE1vbmdvU2NoZW1hQ29sbGVjdGlvbiB7XG4gIF9jb2xsZWN0aW9uOiBNb25nb0NvbGxlY3Rpb247XG5cbiAgY29uc3RydWN0b3IoY29sbGVjdGlvbjogTW9uZ29Db2xsZWN0aW9uKSB7XG4gICAgdGhpcy5fY29sbGVjdGlvbiA9IGNvbGxlY3Rpb247XG4gIH1cblxuICBfZmV0Y2hBbGxTY2hlbWFzRnJvbV9TQ0hFTUEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbGxlY3Rpb24uX3Jhd0ZpbmQoe30pLnRoZW4oc2NoZW1hcyA9PiBzY2hlbWFzLm1hcChtb25nb1NjaGVtYVRvUGFyc2VTY2hlbWEpKTtcbiAgfVxuXG4gIF9mZXRjaE9uZVNjaGVtYUZyb21fU0NIRU1BKG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9jb2xsZWN0aW9uXG4gICAgICAuX3Jhd0ZpbmQoX21vbmdvU2NoZW1hUXVlcnlGcm9tTmFtZVF1ZXJ5KG5hbWUpLCB7IGxpbWl0OiAxIH0pXG4gICAgICAudGhlbihyZXN1bHRzID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIG1vbmdvU2NoZW1hVG9QYXJzZVNjaGVtYShyZXN1bHRzWzBdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gQXRvbWljYWxseSBmaW5kIGFuZCBkZWxldGUgYW4gb2JqZWN0IGJhc2VkIG9uIHF1ZXJ5LlxuICBmaW5kQW5kRGVsZXRlU2NoZW1hKG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9jb2xsZWN0aW9uLl9tb25nb0NvbGxlY3Rpb24uZmluZE9uZUFuZERlbGV0ZShfbW9uZ29TY2hlbWFRdWVyeUZyb21OYW1lUXVlcnkobmFtZSkpO1xuICB9XG5cbiAgaW5zZXJ0U2NoZW1hKHNjaGVtYTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbGxlY3Rpb25cbiAgICAgIC5pbnNlcnRPbmUoc2NoZW1hKVxuICAgICAgLnRoZW4oKCkgPT4gbW9uZ29TY2hlbWFUb1BhcnNlU2NoZW1hKHNjaGVtYSkpXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gMTEwMDApIHtcbiAgICAgICAgICAvL01vbmdvJ3MgZHVwbGljYXRlIGtleSBlcnJvclxuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5EVVBMSUNBVEVfVkFMVUUsICdDbGFzcyBhbHJlYWR5IGV4aXN0cy4nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICB1cGRhdGVTY2hlbWEobmFtZTogc3RyaW5nLCB1cGRhdGUpIHtcbiAgICByZXR1cm4gdGhpcy5fY29sbGVjdGlvbi51cGRhdGVPbmUoX21vbmdvU2NoZW1hUXVlcnlGcm9tTmFtZVF1ZXJ5KG5hbWUpLCB1cGRhdGUpO1xuICB9XG5cbiAgdXBzZXJ0U2NoZW1hKG5hbWU6IHN0cmluZywgcXVlcnk6IHN0cmluZywgdXBkYXRlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbGxlY3Rpb24udXBzZXJ0T25lKF9tb25nb1NjaGVtYVF1ZXJ5RnJvbU5hbWVRdWVyeShuYW1lLCBxdWVyeSksIHVwZGF0ZSk7XG4gIH1cblxuICAvLyBBZGQgYSBmaWVsZCB0byB0aGUgc2NoZW1hLiBJZiBkYXRhYmFzZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBmaWVsZFxuICAvLyB0eXBlIChlLmcuIG1vbmdvIGRvZXNuJ3Qgc3VwcG9ydCBtb3JlIHRoYW4gb25lIEdlb1BvaW50IGluIGEgY2xhc3MpIHJlamVjdCB3aXRoIGFuIFwiSW5jb3JyZWN0IFR5cGVcIlxuICAvLyBQYXJzZSBlcnJvciB3aXRoIGEgZGVzY2lwdGl2ZSBtZXNzYWdlLiBJZiB0aGUgZmllbGQgYWxyZWFkeSBleGlzdHMsIHRoaXMgZnVuY3Rpb24gbXVzdFxuICAvLyBub3QgbW9kaWZ5IHRoZSBzY2hlbWEsIGFuZCBtdXN0IHJlamVjdCB3aXRoIERVUExJQ0FURV9WQUxVRSBlcnJvci5cbiAgLy8gSWYgdGhpcyBpcyBjYWxsZWQgZm9yIGEgY2xhc3MgdGhhdCBkb2Vzbid0IGV4aXN0LCB0aGlzIGZ1bmN0aW9uIG11c3QgY3JlYXRlIHRoYXQgY2xhc3MuXG5cbiAgLy8gVE9ETzogdGhyb3cgYW4gZXJyb3IgaWYgYW4gdW5zdXBwb3J0ZWQgZmllbGQgdHlwZSBpcyBwYXNzZWQuIERlY2lkaW5nIHdoZXRoZXIgYSB0eXBlIGlzIHN1cHBvcnRlZFxuICAvLyBzaG91bGQgYmUgdGhlIGpvYiBvZiB0aGUgYWRhcHRlci4gU29tZSBhZGFwdGVycyBtYXkgbm90IHN1cHBvcnQgR2VvUG9pbnQgYXQgYWxsLiBPdGhlcnMgbWF5XG4gIC8vIFN1cHBvcnQgYWRkaXRpb25hbCB0eXBlcyB0aGF0IE1vbmdvIGRvZXNuJ3QsIGxpa2UgTW9uZXksIG9yIHNvbWV0aGluZy5cblxuICAvLyBUT0RPOiBkb24ndCBzcGVuZCBhbiBleHRyYSBxdWVyeSBvbiBmaW5kaW5nIHRoZSBzY2hlbWEgaWYgdGhlIHR5cGUgd2UgYXJlIHRyeWluZyB0byBhZGQgaXNuJ3QgYSBHZW9Qb2ludC5cbiAgYWRkRmllbGRJZk5vdEV4aXN0cyhjbGFzc05hbWU6IHN0cmluZywgZmllbGROYW1lOiBzdHJpbmcsIGZpZWxkVHlwZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZldGNoT25lU2NoZW1hRnJvbV9TQ0hFTUEoY2xhc3NOYW1lKVxuICAgICAgLnRoZW4oXG4gICAgICAgIHNjaGVtYSA9PiB7XG4gICAgICAgICAgLy8gSWYgYSBmaWVsZCB3aXRoIHRoaXMgbmFtZSBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSBoYW5kbGVkIGVsc2V3aGVyZS5cbiAgICAgICAgICBpZiAoc2NoZW1hLmZpZWxkc1tmaWVsZE5hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gVGhlIHNjaGVtYSBleGlzdHMuIENoZWNrIGZvciBleGlzdGluZyBHZW9Qb2ludHMuXG4gICAgICAgICAgaWYgKGZpZWxkVHlwZS50eXBlID09PSAnR2VvUG9pbnQnKSB7XG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlcmUgYXJlIG5vdCBvdGhlciBnZW9wb2ludCBmaWVsZHNcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgT2JqZWN0LmtleXMoc2NoZW1hLmZpZWxkcykuc29tZShcbiAgICAgICAgICAgICAgICBleGlzdGluZ0ZpZWxkID0+IHNjaGVtYS5maWVsZHNbZXhpc3RpbmdGaWVsZF0udHlwZSA9PT0gJ0dlb1BvaW50J1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgICAgIFBhcnNlLkVycm9yLklOQ09SUkVDVF9UWVBFLFxuICAgICAgICAgICAgICAgICdNb25nb0RCIG9ubHkgc3VwcG9ydHMgb25lIEdlb1BvaW50IGZpZWxkIGluIGEgY2xhc3MuJ1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yID0+IHtcbiAgICAgICAgICAvLyBJZiBlcnJvciBpcyB1bmRlZmluZWQsIHRoZSBzY2hlbWEgZG9lc24ndCBleGlzdCwgYW5kIHdlIGNhbiBjcmVhdGUgdGhlIHNjaGVtYSB3aXRoIHRoZSBmaWVsZC5cbiAgICAgICAgICAvLyBJZiBzb21lIG90aGVyIGVycm9yLCByZWplY3Qgd2l0aCBpdC5cbiAgICAgICAgICBpZiAoZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICBjb25zdCB7IHR5cGUsIHRhcmdldENsYXNzLCAuLi5maWVsZE9wdGlvbnMgfSA9IGZpZWxkVHlwZTtcbiAgICAgICAgLy8gV2UgdXNlICRleGlzdHMgYW5kICRzZXQgdG8gYXZvaWQgb3ZlcndyaXRpbmcgdGhlIGZpZWxkIHR5cGUgaWYgaXRcbiAgICAgICAgLy8gYWxyZWFkeSBleGlzdHMuIChpdCBjb3VsZCBoYXZlIGFkZGVkIGluYmV0d2VlbiB0aGUgbGFzdCBxdWVyeSBhbmQgdGhlIHVwZGF0ZSlcbiAgICAgICAgaWYgKGZpZWxkT3B0aW9ucyAmJiBPYmplY3Qua2V5cyhmaWVsZE9wdGlvbnMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy51cHNlcnRTY2hlbWEoXG4gICAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgICB7IFtmaWVsZE5hbWVdOiB7ICRleGlzdHM6IGZhbHNlIH0gfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgJHNldDoge1xuICAgICAgICAgICAgICAgIFtmaWVsZE5hbWVdOiBwYXJzZUZpZWxkVHlwZVRvTW9uZ29GaWVsZFR5cGUoe1xuICAgICAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgICAgIHRhcmdldENsYXNzLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIFtgX21ldGFkYXRhLmZpZWxkc19vcHRpb25zLiR7ZmllbGROYW1lfWBdOiBmaWVsZE9wdGlvbnMsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy51cHNlcnRTY2hlbWEoXG4gICAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgICB7IFtmaWVsZE5hbWVdOiB7ICRleGlzdHM6IGZhbHNlIH0gfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgJHNldDoge1xuICAgICAgICAgICAgICAgIFtmaWVsZE5hbWVdOiBwYXJzZUZpZWxkVHlwZVRvTW9uZ29GaWVsZFR5cGUoe1xuICAgICAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgICAgIHRhcmdldENsYXNzLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlRmllbGRPcHRpb25zKGNsYXNzTmFtZTogc3RyaW5nLCBmaWVsZE5hbWU6IHN0cmluZywgZmllbGRUeXBlOiBhbnkpIHtcbiAgICBjb25zdCB7IC4uLmZpZWxkT3B0aW9ucyB9ID0gZmllbGRUeXBlO1xuICAgIGRlbGV0ZSBmaWVsZE9wdGlvbnMudHlwZTtcbiAgICBkZWxldGUgZmllbGRPcHRpb25zLnRhcmdldENsYXNzO1xuXG4gICAgYXdhaXQgdGhpcy51cHNlcnRTY2hlbWEoXG4gICAgICBjbGFzc05hbWUsXG4gICAgICB7IFtmaWVsZE5hbWVdOiB7ICRleGlzdHM6IHRydWUgfSB9LFxuICAgICAge1xuICAgICAgICAkc2V0OiB7XG4gICAgICAgICAgW2BfbWV0YWRhdGEuZmllbGRzX29wdGlvbnMuJHtmaWVsZE5hbWV9YF06IGZpZWxkT3B0aW9ucyxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG5cbi8vIEV4cG9ydGVkIGZvciB0ZXN0aW5nIHJlYXNvbnMgYW5kIGJlY2F1c2Ugd2UgaGF2ZW4ndCBtb3ZlZCBhbGwgbW9uZ28gc2NoZW1hIGZvcm1hdFxuLy8gcmVsYXRlZCBsb2dpYyBpbnRvIHRoZSBkYXRhYmFzZSBhZGFwdGVyIHlldC5cbk1vbmdvU2NoZW1hQ29sbGVjdGlvbi5fVEVTVG1vbmdvU2NoZW1hVG9QYXJzZVNjaGVtYSA9IG1vbmdvU2NoZW1hVG9QYXJzZVNjaGVtYTtcbk1vbmdvU2NoZW1hQ29sbGVjdGlvbi5wYXJzZUZpZWxkVHlwZVRvTW9uZ29GaWVsZFR5cGUgPSBwYXJzZUZpZWxkVHlwZVRvTW9uZ29GaWVsZFR5cGU7XG5cbmV4cG9ydCBkZWZhdWx0IE1vbmdvU2NoZW1hQ29sbGVjdGlvbjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsSUFBQUEsZ0JBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLEtBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUErQixNQUFBRSxTQUFBO0FBQUEsU0FBQUgsdUJBQUFJLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxLQUFBRSxPQUFBLEVBQUFGLENBQUE7QUFBQSxTQUFBRywwQkFBQUMsQ0FBQSxnQkFBQUEsQ0FBQSxZQUFBQyxTQUFBLHlCQUFBRCxDQUFBO0FBQUEsU0FBQUUsU0FBQSxXQUFBQSxRQUFBLEdBQUFDLE1BQUEsQ0FBQUMsTUFBQSxHQUFBRCxNQUFBLENBQUFDLE1BQUEsQ0FBQUMsSUFBQSxlQUFBQyxDQUFBLGFBQUFWLENBQUEsTUFBQUEsQ0FBQSxHQUFBVyxTQUFBLENBQUFDLE1BQUEsRUFBQVosQ0FBQSxVQUFBSSxDQUFBLEdBQUFPLFNBQUEsQ0FBQVgsQ0FBQSxZQUFB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
|