UNPKG

@decaf-ts/for-couchdb

Version:
183 lines 22 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.reAuth = reAuth; exports.wrapDocumentScope = wrapDocumentScope; exports.testReservedAttributes = testReservedAttributes; exports.generateIndexName = generateIndexName; exports.generateIndexDoc = generateIndexDoc; const core_1 = require("@decaf-ts/core"); const constants_1 = require("./constants.cjs"); const db_decorators_1 = require("@decaf-ts/db-decorators"); const constants_2 = require("./query/constants.cjs"); /** * @description Re-authenticates a connection to CouchDB * @summary Refreshes the authentication for a CouchDB connection using the provided credentials * @param {any} con - The CouchDB connection object * @param {string} user - The username for authentication * @param {string} pass - The password for authentication * @return {Promise<any>} A promise that resolves to the authentication result * @function reAuth * @memberOf module:for-couchdb */ async function reAuth(con, user, pass) { return con.auth(user, pass); } /** * @description Wraps a CouchDB database connection with automatic re-authentication * @summary Creates a proxy around a CouchDB database connection that automatically re-authenticates before each operation * @param {any} con - The CouchDB connection object * @param {string} dbName - The name of the database to use * @param {string} user - The username for authentication * @param {string} pass - The password for authentication * @return {any} The wrapped database connection object * @function wrapDocumentScope * @memberOf module:for-couchdb * @mermaid * sequenceDiagram * participant Client * participant wrapDocumentScope * participant DB * participant reAuth * * Client->>wrapDocumentScope: con, dbName, user, pass * wrapDocumentScope->>DB: con.use(dbName) * Note over wrapDocumentScope: Wrap DB methods with re-auth * * loop For each method (insert, get, put, destroy, find) * wrapDocumentScope->>wrapDocumentScope: Store original method * wrapDocumentScope->>wrapDocumentScope: Define new method with re-auth * end * * wrapDocumentScope->>wrapDocumentScope: Add NATIVE property with con value * wrapDocumentScope-->>Client: Return wrapped DB * * Note over Client: Later when client uses DB methods * Client->>DB: Any wrapped method call * DB->>reAuth: Authenticate before operation * reAuth-->>DB: Authentication complete * DB->>DB: Call original method * DB-->>Client: Return result */ function wrapDocumentScope(con, dbName, user, pass) { const db = con.use(dbName); ["insert", "get", "put", "destroy", "find"].forEach((k) => { const original = db[k]; Object.defineProperty(db, k, { enumerable: false, configurable: true, value: async (...args) => { await reAuth(con, user, pass); return original.call(db, ...args); }, }); }); Object.defineProperty(db, constants_1.CouchDBKeys.NATIVE, { enumerable: false, configurable: false, writable: false, value: con, }); return db; } /** * @description Tests if an attribute name is reserved in CouchDB * @summary Checks if an attribute name starts with an underscore, which indicates it's a reserved attribute in CouchDB * @param {string} attr - The attribute name to test * @return {RegExpMatchArray|null} The match result or null if no match * @function testReservedAttributes * @memberOf module:for-couchdb */ function testReservedAttributes(attr) { const regexp = /^_.*$/g; return attr.match(regexp); } /** * @description Generates a name for a CouchDB index * @summary Creates a standardized name for a CouchDB index based on the table, attribute, compositions, and order * @param {string} attribute - The primary attribute for the index * @param {string} tableName - The name of the table * @param {string[]} [compositions] - Optional additional attributes to include in the index * @param {OrderDirection} [order] - Optional sort order for the index * @param {string} [separator=DefaultSeparator] - The separator to use between parts of the index name * @return {string} The generated index name * @function generateIndexName * @memberOf module:for-couchdb */ function generateIndexName(attribute, tableName, compositions, order, separator = db_decorators_1.DefaultSeparator) { const attr = [core_1.PersistenceKeys.INDEX, tableName, attribute]; if (compositions) attr.push(...compositions); if (order) attr.push(order); return attr.join(separator); } /** * @description Generates a CouchDB index configuration * @summary Creates a complete CreateIndexRequest object for defining a CouchDB index based on specified parameters * @param {string} attribute - The primary attribute for the index * @param {string} tableName - The name of the table * @param {string[]} [compositions] - Optional additional attributes to include in the index * @param {OrderDirection} [order] - Optional sort order for the index * @param {string} [separator=DefaultSeparator] - The separator to use between parts of the index name * @return {CreateIndexRequest} The complete index configuration object * @function generateIndexDoc * @memberOf module:for-couchdb * @mermaid * sequenceDiagram * participant Caller * participant generateIndexDoc * participant generateIndexName * * Caller->>generateIndexDoc: attribute, tableName, compositions, order, separator * * Note over generateIndexDoc: Create partial filter selector * generateIndexDoc->>generateIndexDoc: Set up filter for tableName * * alt order is specified * Note over generateIndexDoc: Create ordered fields array * generateIndexDoc->>generateIndexDoc: Create orderProp for attribute * generateIndexDoc->>generateIndexDoc: Map compositions to ordered props * generateIndexDoc->>generateIndexDoc: Create sortedTable for table field * generateIndexDoc->>generateIndexDoc: Combine all ordered fields * else * Note over generateIndexDoc: Create simple fields array * generateIndexDoc->>generateIndexDoc: Use attribute, compositions, and table as strings * end * * generateIndexDoc->>generateIndexName: Generate index name * generateIndexName-->>generateIndexDoc: Return name * * Note over generateIndexDoc: Create final index request * generateIndexDoc-->>Caller: Return CreateIndexRequest */ function generateIndexDoc(attribute, tableName, compositions, order, separator = db_decorators_1.DefaultSeparator) { const partialFilterSelector = {}; partialFilterSelector[constants_1.CouchDBKeys.TABLE] = {}; partialFilterSelector[constants_1.CouchDBKeys.TABLE][constants_2.CouchDBOperator.EQUAL] = tableName; let fields; if (order) { const orderProp = {}; orderProp[attribute] = order; const sortedCompositions = (compositions || []).map((c) => { const r = {}; r[c] = order; return r; }); const sortedTable = {}; sortedTable[constants_1.CouchDBKeys.TABLE] = order; fields = [orderProp, ...sortedCompositions, sortedTable]; } else { fields = [attribute, ...(compositions || []), constants_1.CouchDBKeys.TABLE]; } const name = generateIndexName(attribute, tableName, compositions, order, separator); return { index: { fields: fields, // partial_filter_selector: partialFilterSelector, }, ddoc: [name, constants_1.CouchDBKeys.DDOC].join(separator), name: name, }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFnQkEsd0JBRUM7QUFzQ0QsOENBeUJDO0FBVUQsd0RBR0M7QUFjRCw4Q0FXQztBQXlDRCw0Q0EwQ0M7QUExTUQseUNBQWlFO0FBQ2pFLCtDQUEwQztBQUMxQywyREFBMkQ7QUFDM0QscURBQW9EO0FBR3BEOzs7Ozs7Ozs7R0FTRztBQUNJLEtBQUssVUFBVSxNQUFNLENBQUMsR0FBUSxFQUFFLElBQVksRUFBRSxJQUFZO0lBQy9ELE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDOUIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1DRztBQUNILFNBQWdCLGlCQUFpQixDQUMvQixHQUFRLEVBQ1IsTUFBYyxFQUNkLElBQVksRUFDWixJQUFZO0lBRVosTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzQixDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtRQUN4RCxNQUFNLFFBQVEsR0FBSSxFQUEwQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRTtZQUMzQixVQUFVLEVBQUUsS0FBSztZQUNqQixZQUFZLEVBQUUsSUFBSTtZQUNsQixLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBVyxFQUFFLEVBQUU7Z0JBQzlCLE1BQU0sTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzlCLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMs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QUFXLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUM5QyxJQUFJLEVBQUUsSUFBSTtLQUNYLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3JkZXJEaXJlY3Rpb24sIFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgQ291Y2hEQktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IERlZmF1bHRTZXBhcmF0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvdWNoREJPcGVyYXRvciB9IGZyb20gXCIuL3F1ZXJ5L2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ3JlYXRlSW5kZXhSZXF1ZXN0LCBNYW5nb1NlbGVjdG9yLCBTb3J0T3JkZXIgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZS1hdXRoZW50aWNhdGVzIGEgY29ubmVjdGlvbiB0byBDb3VjaERCXG4gKiBAc3VtbWFyeSBSZWZyZXNoZXMgdGhlIGF1dGhlbnRpY2F0aW9uIGZvciBhIENvdWNoREIgY29ubmVjdGlvbiB1c2luZyB0aGUgcHJvdmlkZWQgY3JlZGVudGlhbHNcbiAqIEBwYXJhbSB7YW55fSBjb24gLSBUaGUgQ291Y2hEQiBjb25uZWN0aW9uIG9iamVjdFxuICogQHBhcmFtIHtzdHJpbmd9IHVzZXIgLSBUaGUgdXNlcm5hbWUgZm9yIGF1dGhlbnRpY2F0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gcGFzcyAtIFRoZSBwYXNzd29yZCBmb3IgYXV0aGVudGljYXRpb25cbiAqIEByZXR1cm4ge1Byb21pc2U8YW55Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGF1dGhlbnRpY2F0aW9uIHJlc3VsdFxuICogQGZ1bmN0aW9uIHJlQXV0aFxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItY291Y2hkYlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVBdXRoKGNvbjogYW55LCB1c2VyOiBzdHJpbmcsIHBhc3M6IHN0cmluZykge1xuICByZXR1cm4gY29uLmF1dGgodXNlciwgcGFzcyk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFdyYXBzIGEgQ291Y2hEQiBkYXRhYmFzZSBjb25uZWN0aW9uIHdpdGggYXV0b21hdGljIHJlLWF1dGhlbnRpY2F0aW9uXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgcHJveHkgYXJvdW5kIGEgQ291Y2hEQiBkYXRhYmFzZSBjb25uZWN0aW9uIHRoYXQgYXV0b21hdGljYWxseSByZS1hdXRoZW50aWNhdGVzIGJlZm9yZSBlYWNoIG9wZXJhdGlvblxuICogQHBhcmFtIHthbnl9IGNvbiAtIFRoZSBDb3VjaERCIGNvbm5lY3Rpb24gb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gZGJOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGRhdGFiYXNlIHRvIHVzZVxuICogQHBhcmFtIHtzdHJpbmd9IHVzZXIgLSBUaGUgdXNlcm5hbWUgZm9yIGF1dGhlbnRpY2F0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gcGFzcyAtIFRoZSBwYXNzd29yZCBmb3IgYXV0aGVudGljYXRpb25cbiAqIEByZXR1cm4ge2FueX0gVGhlIHdyYXBwZWQgZGF0YWJhc2UgY29ubmVjdGlvbiBvYmplY3RcbiAqIEBmdW5jdGlvbiB3cmFwRG9jdW1lbnRTY29wZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItY291Y2hkYlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgd3JhcERvY3VtZW50U2NvcGVcbiAqICAgcGFydGljaXBhbnQgREJcbiAqICAgcGFydGljaXBhbnQgcmVBdXRoXG4gKiAgIFxuICogICBDbGllbnQtPj53cmFwRG9jdW1lbnRTY29wZTogY29uLCBkYk5hbWUsIHVzZXIsIHBhc3NcbiAqICAgd3JhcERvY3VtZW50U2NvcGUtPj5EQjogY29uLnVzZShkYk5hbWUpXG4gKiAgIE5vdGUgb3ZlciB3cmFwRG9jdW1lbnRTY29wZTogV3JhcCBEQiBtZXRob2RzIHdpdGggcmUtYXV0aFxuICogICBcbiAqICAgbG9vcCBGb3IgZWFjaCBtZXRob2QgKGluc2VydCwgZ2V0LCBwdXQsIGRlc3Ryb3ksIGZpbmQpXG4gKiAgICAgd3JhcERvY3VtZW50U2NvcGUtPj53cmFwRG9jdW1lbnRTY29wZTogU3RvcmUgb3JpZ2luYWwgbWV0aG9kXG4gKiAgICAgd3JhcERvY3VtZW50U2NvcGUtPj53cmFwRG9jdW1lbnRTY29wZTogRGVmaW5lIG5ldyBtZXRob2Qgd2l0aCByZS1hdXRoXG4gKiAgIGVuZFxuICogICBcbiAqICAgd3JhcERvY3VtZW50U2NvcGUtPj53cmFwRG9jdW1lbnRTY29wZTogQWRkIE5BVElWRSBwcm9wZXJ0eSB3aXRoIGNvbiB2YWx1ZVxuICogICB3cmFwRG9jdW1lbnRTY29wZS0tPj5DbGllbnQ6IFJldHVybiB3cmFwcGVkIERCXG4gKiAgIFxuICogICBOb3RlIG92ZXIgQ2xpZW50OiBMYXRlciB3aGVuIGNsaWVudCB1c2VzIERCIG1ldGhvZHNcbiAqICAgQ2xpZW50LT4+REI6IEFueSB3cmFwcGVkIG1ldGhvZCBjYWxsXG4gKiAgIERCLT4+cmVBdXRoOiBBdXRoZW50aWNhdGUgYmVmb3JlIG9wZXJhdGlvblxuICogICByZUF1dGgtLT4+REI6IEF1dGhlbnRpY2F0aW9uIGNvbXBsZXRlXG4gKiAgIERCLT4+REI6IENhbGwgb3JpZ2luYWwgbWV0aG9kXG4gKiAgIERCLS0+PkNsaWVudDogUmV0dXJuIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JhcERvY3VtZW50U2NvcGUoXG4gIGNvbjogYW55LFxuICBkYk5hbWU6IHN0cmluZyxcbiAgdXNlcjogc3RyaW5nLFxuICBwYXNzOiBzdHJpbmdcbik6IGFueSB7XG4gIGNvbnN0IGRiID0gY29uLnVzZShkYk5hbWUpO1xuICBbXCJpbnNlcnRcIiwgXCJnZXRcIiwgXCJwdXRcIiwgXCJkZXN0cm95XCIsIFwiZmluZFwiXS5mb3JFYWNoKChrKSA9PiB7XG4gICAgY29uc3Qgb3JpZ2luYWwgPSAoZGIgYXMgUmVjb3JkPHN0cmluZywgYW55Pilba107XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRiLCBrLCB7XG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiBhc3luYyAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgICAgYXdhaXQgcmVBdXRoKGNvbiwgdXNlciwgcGFzcyk7XG4gICAgICAgIHJldHVybiBvcmlnaW5hbC5jYWxsKGRiLCAuLi5hcmdzKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGIsIENvdWNoREJLZXlzLk5BVElWRSwge1xuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiBjb24sXG4gIH0pO1xuICByZXR1cm4gZGI7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFRlc3RzIGlmIGFuIGF0dHJpYnV0ZSBuYW1lIGlzIHJlc2VydmVkIGluIENvdWNoREJcbiAqIEBzdW1tYXJ5IENoZWNrcyBpZiBhbiBhdHRyaWJ1dGUgbmFtZSBzdGFydHMgd2l0aCBhbiB1bmRlcnNjb3JlLCB3aGljaCBpbmRpY2F0ZXMgaXQncyBhIHJlc2VydmVkIGF0dHJpYnV0ZSBpbiBDb3VjaERCXG4gKiBAcGFyYW0ge3N0cmluZ30gYXR0ciAtIFRoZSBhdHRyaWJ1dGUgbmFtZSB0byB0ZXN0XG4gKiBAcmV0dXJuIHtSZWdFeHBNYXRjaEFycmF5fG51bGx9IFRoZSBtYXRjaCByZXN1bHQgb3IgbnVsbCBpZiBubyBtYXRjaFxuICogQGZ1bmN0aW9uIHRlc3RSZXNlcnZlZEF0dHJpYnV0ZXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWNvdWNoZGJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlc3RSZXNlcnZlZEF0dHJpYnV0ZXMoYXR0cjogc3RyaW5nKSB7XG4gIGNvbnN0IHJlZ2V4cCA9IC9eXy4qJC9nO1xuICByZXR1cm4gYXR0ci5tYXRjaChyZWdleHApO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSBuYW1lIGZvciBhIENvdWNoREIgaW5kZXhcbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBzdGFuZGFyZGl6ZWQgbmFtZSBmb3IgYSBDb3VjaERCIGluZGV4IGJhc2VkIG9uIHRoZSB0YWJsZSwgYXR0cmlidXRlLCBjb21wb3NpdGlvbnMsIGFuZCBvcmRlclxuICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSAtIFRoZSBwcmltYXJ5IGF0dHJpYnV0ZSBmb3IgdGhlIGluZGV4XG4gKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBbY29tcG9zaXRpb25zXSAtIE9wdGlvbmFsIGFkZGl0aW9uYWwgYXR0cmlidXRlcyB0byBpbmNsdWRlIGluIHRoZSBpbmRleFxuICogQHBhcmFtIHtPcmRlckRpcmVjdGlvbn0gW29yZGVyXSAtIE9wdGlvbmFsIHNvcnQgb3JkZXIgZm9yIHRoZSBpbmRleFxuICogQHBhcmFtIHtzdHJpbmd9IFtzZXBhcmF0b3I9RGVmYXVsdFNlcGFyYXRvcl0gLSBUaGUgc2VwYXJhdG9yIHRvIHVzZSBiZXR3ZWVuIHBhcnRzIG9mIHRoZSBpbmRleCBuYW1lXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBnZW5lcmF0ZWQgaW5kZXggbmFtZVxuICogQGZ1bmN0aW9uIGdlbmVyYXRlSW5kZXhOYW1lXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1jb3VjaGRiXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUluZGV4TmFtZShcbiAgYXR0cmlidXRlOiBzdHJpbmcsXG4gIHRhYmxlTmFtZTogc3RyaW5nLFxuICBjb21wb3NpdGlvbnM/OiBzdHJpbmdbXSxcbiAgb3JkZXI/OiBPcmRlckRpcmVjdGlvbixcbiAgc2VwYXJhdG9yID0gRGVmYXVsdFNlcGFyYXRvclxuKTogc3RyaW5nIHtcbiAgY29uc3QgYXR0ciA9IFtQZXJzaXN0ZW5jZUtleXMuSU5ERVgsIHRhYmxlTmFtZSwgYXR0cmlidXRlXTtcbiAgaWYgKGNvbXBvc2l0aW9ucykgYXR0ci5wdXNoKC4uLmNvbXBvc2l0aW9ucyk7XG4gIGlmIChvcmRlcikgYXR0ci5wdXNoKG9yZGVyKTtcbiAgcmV0dXJuIGF0dHIuam9pbihzZXBhcmF0b3IpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSBDb3VjaERCIGluZGV4IGNvbmZpZ3VyYXRpb25cbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBjb21wbGV0ZSBDcmVhdGVJbmRleFJlcXVlc3Qgb2JqZWN0IGZvciBkZWZpbmluZyBhIENvdWNoREIgaW5kZXggYmFzZWQgb24gc3BlY2lmaWVkIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGUgLSBUaGUgcHJpbWFyeSBhdHRyaWJ1dGUgZm9yIHRoZSBpbmRleFxuICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZVxuICogQHBhcmFtIHtzdHJpbmdbXX0gW2NvbXBvc2l0aW9uc10gLSBPcHRpb25hbCBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgdG8gaW5jbHVkZSBpbiB0aGUgaW5kZXhcbiAqIEBwYXJhbSB7T3JkZXJEaXJlY3Rpb259IFtvcmRlcl0gLSBPcHRpb25hbCBzb3J0IG9yZGVyIGZvciB0aGUgaW5kZXhcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc2VwYXJhdG9yPURlZmF1bHRTZXBhcmF0b3JdIC0gVGhlIHNlcGFyYXRvciB0byB1c2UgYmV0d2VlbiBwYXJ0cyBvZiB0aGUgaW5kZXggbmFtZVxuICogQHJldHVybiB7Q3JlYXRlSW5kZXhSZXF1ZXN0fSBUaGUgY29tcGxldGUgaW5kZXggY29uZmlndXJhdGlvbiBvYmplY3RcbiAqIEBmdW5jdGlvbiBnZW5lcmF0ZUluZGV4RG9jXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1jb3VjaGRiXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBnZW5lcmF0ZUluZGV4RG9jXG4gKiAgIHBhcnRpY2lwYW50IGdlbmVyYXRlSW5kZXhOYW1lXG4gKiAgIFxuICogICBDYWxsZXItPj5nZW5lcmF0ZUluZGV4RG9jOiBhdHRyaWJ1dGUsIHRhYmxlTmFtZSwgY29tcG9zaXRpb25zLCBvcmRlciwgc2VwYXJhdG9yXG4gKiAgIFxuICogICBOb3RlIG92ZXIgZ2VuZXJhdGVJbmRleERvYzogQ3JlYXRlIHBhcnRpYWwgZmlsdGVyIHNlbGVjdG9yXG4gKiAgIGdlbmVyYXRlSW5kZXhEb2MtPj5nZW5lcmF0ZUluZGV4RG9jOiBTZXQgdXAgZmlsdGVyIGZvciB0YWJsZU5hbWVcbiAqICAgXG4gKiAgIGFsdCBvcmRlciBpcyBzcGVjaWZpZWRcbiAqICAgICBOb3RlIG92ZXIgZ2VuZXJhdGVJbmRleERvYzogQ3JlYXRlIG9yZGVyZWQgZmllbGRzIGFycmF5XG4gKiAgICAgZ2VuZXJhdGVJbmRleERvYy0+PmdlbmVyYXRlSW5kZXhEb2M6IENyZWF0ZSBvcmRlclByb3AgZm9yIGF0dHJpYnV0ZVxuICogICAgIGdlbmVyYXRlSW5kZXhEb2MtPj5nZW5lcmF0ZUluZGV4RG9jOiBNYXAgY29tcG9zaXRpb25zIHRvIG9yZGVyZWQgcHJvcHNcbiAqICAgICBnZW5lcmF0ZUluZGV4RG9jLT4+Z2VuZXJhdGVJbmRleERvYzogQ3JlYXRlIHNvcnRlZFRhYmxlIGZvciB0YWJsZSBmaWVsZFxuICogICAgIGdlbmVyYXRlSW5kZXhEb2MtPj5nZW5lcmF0ZUluZGV4RG9jOiBDb21iaW5lIGFsbCBvcmRlcmVkIGZpZWxkc1xuICogICBlbHNlXG4gKiAgICAgTm90ZSBvdmVyIGdlbmVyYXRlSW5kZXhEb2M6IENyZWF0ZSBzaW1wbGUgZmllbGRzIGFycmF5XG4gKiAgICAgZ2VuZXJhdGVJbmRleERvYy0+PmdlbmVyYXRlSW5kZXhEb2M6IFVzZSBhdHRyaWJ1dGUsIGNvbXBvc2l0aW9ucywgYW5kIHRhYmxlIGFzIHN0cmluZ3NcbiAqICAgZW5kXG4gKiAgIFxuICogICBnZW5lcmF0ZUluZGV4RG9jLT4+Z2VuZXJhdGVJbmRleE5hbWU6IEdlbmVyYXRlIGluZGV4IG5hbWVcbiAqICAgZ2VuZXJhdGVJbmRleE5hbWUtLT4+Z2VuZXJhdGVJbmRleERvYzogUmV0dXJuIG5hbWVcbiAqICAgXG4gKiAgIE5vdGUgb3ZlciBnZW5lcmF0ZUluZGV4RG9jOiBDcmVhdGUgZmluYWwgaW5kZXggcmVxdWVzdFxuICogICBnZW5lcmF0ZUluZGV4RG9jLS0+PkNhbGxlcjogUmV0dXJuIENyZWF0ZUluZGV4UmVxdWVzdFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVJbmRleERvYyhcbiAgYXR0cmlidXRlOiBzdHJpbmcsXG4gIHRhYmxlTmFtZTogc3RyaW5nLFxuICBjb21wb3NpdGlvbnM/OiBzdHJpbmdbXSxcbiAgb3JkZXI/OiBPcmRlckRpcmVjdGlvbixcbiAgc2VwYXJhdG9yID0gRGVmYXVsdFNlcGFyYXRvclxuKTogQ3JlYXRlSW5kZXhSZXF1ZXN0IHtcbiAgY29uc3QgcGFydGlhbEZpbHRlclNlbGVjdG9yOiBNYW5nb1NlbGVjdG9yID0ge307XG4gIHBhcnRpYWxGaWx0ZXJTZWxlY3RvcltDb3VjaERCS2V5cy5UQUJMRV0gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAocGFydGlhbEZpbHRlclNlbGVjdG9yW0NvdWNoREJLZXlzLlRBQkxFXSBhcyBNYW5nb1NlbGVjdG9yKVtcbiAgICBDb3VjaERCT3BlcmF0b3IuRVFVQUxcbiAgXSA9IHRhYmxlTmFtZTtcbiAgbGV0IGZpZWxkczogU29ydE9yZGVyW107XG4gIGlmIChvcmRlcikge1xuICAgIGNvbnN0IG9yZGVyUHJvcDogU29ydE9yZGVyID0ge307XG4gICAgb3JkZXJQcm9wW2F0dHJpYnV0ZV0gPSBvcmRlciBhcyBcImFzY1wiIHwgXCJkZXNjXCI7XG4gICAgY29uc3Qgc29ydGVkQ29tcG9zaXRpb25zOiBTb3J0T3JkZXJbXSA9IChjb21wb3NpdGlvbnMgfHwgW10pLm1hcCgoYykgPT4ge1xuICAgICAgY29uc3QgcjogU29ydE9yZGVyID0ge307XG4gICAgICByW2NdID0gb3JkZXIgYXMgXCJhc2NcIiB8IFwiZGVzY1wiO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfSk7XG4gICAgY29uc3Qgc29ydGVkVGFibGU6IFNvcnRPcmRlciA9IHt9O1xuICAgIHNvcnRlZFRhYmxlW0NvdWNoREJLZXlzLlRBQkxFXSA9IG9yZGVyIGFzIFwiYXNjXCIgfCBcImRlc2NcIjtcbiAgICBmaWVsZHMgPSBbb3JkZXJQcm9wLCAuLi5zb3J0ZWRDb21wb3NpdGlvbnMsIHNvcnRlZFRhYmxlXTtcbiAgfSBlbHNlIHtcbiAgICBmaWVsZHMgPSBbYXR0cmlidXRlLCAuLi4oY29tcG9zaXRpb25zIHx8IFtdKSwgQ291Y2hEQktleXMuVEFCTEVdO1xuICB9XG4gIGNvbnN0IG5hbWUgPSBnZW5lcmF0ZUluZGV4TmFtZShcbiAgICBhdHRyaWJ1dGUsXG4gICAgdGFibGVOYW1lLFxuICAgIGNvbXBvc2l0aW9ucyxcbiAgICBvcmRlcixcbiAgICBzZXBhcmF0b3JcbiAgKTtcbiAgcmV0dXJuIHtcbiAgICBpbmRleDoge1xuICAgICAgZmllbGRzOiBmaWVsZHMsXG4gICAgICAvLyBwYXJ0aWFsX2ZpbHRlcl9zZWxlY3RvcjogcGFydGlhbEZpbHRlclNlbGVjdG9yLFxuICAgIH0sXG4gICAgZGRvYzogW25hbWUsIENvdWNoREJLZXlzLkRET0NdLmpvaW4oc2VwYXJhdG9yKSxcbiAgICBuYW1lOiBuYW1lLFxuICB9O1xufVxuIl19