@shaxpir/squilt 1.0.0 → 1.1.0
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/README.md +289 -1
- package/dist/ast/AlterTableQuery.d.ts +32 -0
- package/dist/ast/AlterTableQuery.js +60 -0
- package/dist/ast/BetweenExpression.d.ts +10 -0
- package/dist/ast/BetweenExpression.js +18 -0
- package/dist/ast/CastExpression.d.ts +13 -0
- package/dist/ast/CastExpression.js +25 -0
- package/dist/ast/CollateExpression.d.ts +18 -0
- package/dist/ast/CollateExpression.js +30 -0
- package/dist/ast/CreateIndexQuery.d.ts +25 -0
- package/dist/ast/CreateIndexQuery.js +64 -0
- package/dist/ast/CreateTableQuery.d.ts +57 -0
- package/dist/ast/CreateTableQuery.js +79 -0
- package/dist/ast/CreateViewQuery.d.ts +34 -0
- package/dist/ast/CreateViewQuery.js +61 -0
- package/dist/ast/CreateVirtualTableQuery.d.ts +32 -0
- package/dist/ast/CreateVirtualTableQuery.js +74 -0
- package/dist/ast/DeleteQuery.d.ts +17 -0
- package/dist/ast/DeleteQuery.js +43 -0
- package/dist/ast/DropIndexQuery.d.ts +14 -0
- package/dist/ast/DropIndexQuery.js +35 -0
- package/dist/ast/DropTableQuery.d.ts +14 -0
- package/dist/ast/DropTableQuery.js +35 -0
- package/dist/ast/DropViewQuery.d.ts +11 -0
- package/dist/ast/DropViewQuery.js +24 -0
- package/dist/ast/FunctionExpression.d.ts +21 -0
- package/dist/ast/FunctionExpression.js +40 -1
- package/dist/ast/FunctionName.d.ts +1 -1
- package/dist/ast/FunctionName.js +1 -1
- package/dist/ast/InsertQuery.d.ts +24 -1
- package/dist/ast/InsertQuery.js +49 -1
- package/dist/ast/Operator.d.ts +2 -0
- package/dist/ast/Operator.js +3 -1
- package/dist/ast/SelectQuery.d.ts +4 -0
- package/dist/ast/SelectQuery.js +11 -1
- package/dist/ast/SubqueryExpression.d.ts +18 -0
- package/dist/ast/SubqueryExpression.js +27 -0
- package/dist/ast/UpdateQuery.d.ts +24 -0
- package/dist/ast/UpdateQuery.js +51 -0
- package/dist/ast/WindowExpression.d.ts +51 -0
- package/dist/ast/WindowExpression.js +61 -0
- package/dist/ast/WindowSpecification.d.ts +46 -0
- package/dist/ast/WindowSpecification.js +60 -0
- package/dist/builder/QueryBuilder.d.ts +20 -0
- package/dist/builder/QueryBuilder.js +41 -1
- package/dist/builder/Shorthand.d.ts +51 -0
- package/dist/builder/Shorthand.js +125 -1
- package/dist/index.d.ts +17 -1
- package/dist/index.js +59 -3
- package/dist/renderer/CompactQueryRenderer.d.ts +34 -2
- package/dist/renderer/CompactQueryRenderer.js +272 -2
- package/dist/renderer/IndentedQueryRenderer.d.ts +34 -2
- package/dist/renderer/IndentedQueryRenderer.js +289 -3
- package/dist/renderer/QueryRenderer.d.ts +11 -1
- package/dist/renderer/QueryRenderer.js +1 -1
- package/dist/validate/CommonQueryValidator.d.ts +31 -1
- package/dist/validate/CommonQueryValidator.js +253 -4
- package/dist/validate/QueryValidator.d.ts +10 -1
- package/dist/validate/QueryValidator.js +1 -1
- package/dist/validate/SQLiteQueryValidator.d.ts +16 -1
- package/dist/validate/SQLiteQueryValidator.js +32 -3
- package/dist/visitor/ParamCollector.d.ts +30 -0
- package/dist/visitor/ParamCollector.js +109 -2
- package/dist/visitor/QueryIdentityTransformer.d.ts +30 -0
- package/dist/visitor/QueryIdentityTransformer.js +217 -2
- package/dist/visitor/SqlTreeNodeVisitor.d.ts +30 -0
- package/dist/visitor/SqlTreeNodeVisitor.js +1 -1
- package/package.json +4 -1
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WindowSpecification = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Represents a window specification for window functions.
|
|
6
|
+
*
|
|
7
|
+
* Currently supports:
|
|
8
|
+
* - PARTITION BY clause
|
|
9
|
+
* - ORDER BY clause
|
|
10
|
+
*
|
|
11
|
+
* Not yet implemented:
|
|
12
|
+
* - Frame specifications (ROWS/RANGE/GROUPS BETWEEN ... AND ...)
|
|
13
|
+
* - Named windows (WINDOW clause at query level)
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* // Used via FunctionExpression.over()
|
|
18
|
+
* FN('ROW_NUMBER').over(ORDER_BY('created_at'))
|
|
19
|
+
* FN('RANK').over(PARTITION_BY('category'), ORDER_BY('price', DESC))
|
|
20
|
+
* SUM(COLUMN('amount')).over(PARTITION_BY('user_id'))
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
class WindowSpecification {
|
|
24
|
+
constructor() {
|
|
25
|
+
this._partitionBy = [];
|
|
26
|
+
this._orderBy = [];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Set the PARTITION BY columns
|
|
30
|
+
*/
|
|
31
|
+
setPartitionBy(columns) {
|
|
32
|
+
this._partitionBy = columns;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Add ORDER BY clauses
|
|
36
|
+
*/
|
|
37
|
+
setOrderBy(orderBy) {
|
|
38
|
+
this._orderBy = orderBy;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get the PARTITION BY columns
|
|
42
|
+
*/
|
|
43
|
+
get partitionByColumns() {
|
|
44
|
+
return this._partitionBy;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Get the ORDER BY clauses
|
|
48
|
+
*/
|
|
49
|
+
get orderByColumns() {
|
|
50
|
+
return this._orderBy;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Check if this window specification is empty (no PARTITION BY or ORDER BY)
|
|
54
|
+
*/
|
|
55
|
+
get isEmpty() {
|
|
56
|
+
return this._partitionBy.length === 0 && this._orderBy.length === 0;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
exports.WindowSpecification = WindowSpecification;
|
|
60
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2luZG93U3BlY2lmaWNhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hc3QvV2luZG93U3BlY2lmaWNhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBYSxtQkFBbUI7SUFJOUI7UUFIUSxpQkFBWSxHQUFpQixFQUFFLENBQUM7UUFDaEMsYUFBUSxHQUFjLEVBQUUsQ0FBQztJQUVsQixDQUFDO0lBRWhCOztPQUVHO0lBQ0ksY0FBYyxDQUFDLE9BQXFCO1FBQ3pDLElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDO0lBQzlCLENBQUM7SUFFRDs7T0FFRztJQUNJLFVBQVUsQ0FBQyxPQUFrQjtRQUNsQyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztJQUMxQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLGtCQUFrQjtRQUMzQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxjQUFjO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO0lBQ3RFLENBQUM7Q0FDRjtBQXhDRCxrREF3Q0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFeHByZXNzaW9uIH0gZnJvbSBcIi4vQWJzdHJhY3Rpb25zXCI7XG5pbXBvcnQgeyBPcmRlckJ5IH0gZnJvbSBcIi4vT3JkZXJCeVwiO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSB3aW5kb3cgc3BlY2lmaWNhdGlvbiBmb3Igd2luZG93IGZ1bmN0aW9ucy5cbiAqXG4gKiBDdXJyZW50bHkgc3VwcG9ydHM6XG4gKiAtIFBBUlRJVElPTiBCWSBjbGF1c2VcbiAqIC0gT1JERVIgQlkgY2xhdXNlXG4gKlxuICogTm90IHlldCBpbXBsZW1lbnRlZDpcbiAqIC0gRnJhbWUgc3BlY2lmaWNhdGlvbnMgKFJPV1MvUkFOR0UvR1JPVVBTIEJFVFdFRU4gLi4uIEFORCAuLi4pXG4gKiAtIE5hbWVkIHdpbmRvd3MgKFdJTkRPVyBjbGF1c2UgYXQgcXVlcnkgbGV2ZWwpXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIFVzZWQgdmlhIEZ1bmN0aW9uRXhwcmVzc2lvbi5vdmVyKClcbiAqIEZOKCdST1dfTlVNQkVSJykub3ZlcihPUkRFUl9CWSgnY3JlYXRlZF9hdCcpKVxuICogRk4oJ1JBTksnKS5vdmVyKFBBUlRJVElPTl9CWSgnY2F0ZWdvcnknKSwgT1JERVJfQlkoJ3ByaWNlJywgREVTQykpXG4gKiBTVU0oQ09MVU1OKCdhbW91bnQnKSkub3ZlcihQQVJUSVRJT05fQlkoJ3VzZXJfaWQnKSlcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgV2luZG93U3BlY2lmaWNhdGlvbiB7XG4gIHByaXZhdGUgX3BhcnRpdGlvbkJ5OiBFeHByZXNzaW9uW10gPSBbXTtcbiAgcHJpdmF0ZSBfb3JkZXJCeTogT3JkZXJCeVtdID0gW107XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIFBBUlRJVElPTiBCWSBjb2x1bW5zXG4gICAqL1xuICBwdWJsaWMgc2V0UGFydGl0aW9uQnkoY29sdW1uczogRXhwcmVzc2lvbltdKTogdm9pZCB7XG4gICAgdGhpcy5fcGFydGl0aW9uQnkgPSBjb2x1bW5zO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBPUkRFUiBCWSBjbGF1c2VzXG4gICAqL1xuICBwdWJsaWMgc2V0T3JkZXJCeShvcmRlckJ5OiBPcmRlckJ5W10pOiB2b2lkIHtcbiAgICB0aGlzLl9vcmRlckJ5ID0gb3JkZXJCeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIFBBUlRJVElPTiBCWSBjb2x1bW5zXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhcnRpdGlvbkJ5Q29sdW1ucygpOiBFeHByZXNzaW9uW10ge1xuICAgIHJldHVybiB0aGlzLl9wYXJ0aXRpb25CeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIE9SREVSIEJZIGNsYXVzZXNcbiAgICovXG4gIHB1YmxpYyBnZXQgb3JkZXJCeUNvbHVtbnMoKTogT3JkZXJCeVtdIHtcbiAgICByZXR1cm4gdGhpcy5fb3JkZXJCeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGlzIHdpbmRvdyBzcGVjaWZpY2F0aW9uIGlzIGVtcHR5IChubyBQQVJUSVRJT04gQlkgb3IgT1JERVIgQlkpXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcnRpdGlvbkJ5Lmxlbmd0aCA9PT0gMCAmJiB0aGlzLl9vcmRlckJ5Lmxlbmd0aCA9PT0gMDtcbiAgfVxufVxuIl19
|
|
@@ -1,8 +1,28 @@
|
|
|
1
1
|
import { SelectQuery } from "../ast/SelectQuery";
|
|
2
2
|
import { InsertQuery } from "../ast/InsertQuery";
|
|
3
|
+
import { UpdateQuery } from "../ast/UpdateQuery";
|
|
4
|
+
import { DeleteQuery } from "../ast/DeleteQuery";
|
|
5
|
+
import { CreateTableQuery } from "../ast/CreateTableQuery";
|
|
6
|
+
import { CreateVirtualTableQuery, VirtualTableModule } from "../ast/CreateVirtualTableQuery";
|
|
7
|
+
import { CreateIndexQuery } from "../ast/CreateIndexQuery";
|
|
8
|
+
import { CreateViewQuery } from "../ast/CreateViewQuery";
|
|
9
|
+
import { AlterTableQuery } from "../ast/AlterTableQuery";
|
|
10
|
+
import { DropTableQuery } from "../ast/DropTableQuery";
|
|
11
|
+
import { DropIndexQuery } from "../ast/DropIndexQuery";
|
|
12
|
+
import { DropViewQuery } from "../ast/DropViewQuery";
|
|
3
13
|
import { SqlTreeNode } from "../ast/Abstractions";
|
|
4
14
|
export declare class QueryBuilder {
|
|
5
15
|
static select(): SelectQuery;
|
|
6
16
|
static insertInto(tableName: string): InsertQuery;
|
|
17
|
+
static update(tableName: string): UpdateQuery;
|
|
18
|
+
static deleteFrom(tableName: string): DeleteQuery;
|
|
19
|
+
static createTable(tableName: string): CreateTableQuery;
|
|
20
|
+
static createVirtualTable(tableName: string, module: VirtualTableModule): CreateVirtualTableQuery;
|
|
21
|
+
static createIndex(indexName: string): CreateIndexQuery;
|
|
22
|
+
static alterTable(tableName: string): AlterTableQuery;
|
|
23
|
+
static dropTable(tableName: string): DropTableQuery;
|
|
24
|
+
static dropIndex(indexName: string): DropIndexQuery;
|
|
25
|
+
static createView(viewName: string): CreateViewQuery;
|
|
26
|
+
static dropView(viewName: string): DropViewQuery;
|
|
7
27
|
static clone(node: SqlTreeNode): SqlTreeNode;
|
|
8
28
|
}
|
|
@@ -3,6 +3,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.QueryBuilder = void 0;
|
|
4
4
|
const SelectQuery_1 = require("../ast/SelectQuery");
|
|
5
5
|
const InsertQuery_1 = require("../ast/InsertQuery");
|
|
6
|
+
const UpdateQuery_1 = require("../ast/UpdateQuery");
|
|
7
|
+
const DeleteQuery_1 = require("../ast/DeleteQuery");
|
|
8
|
+
const CreateTableQuery_1 = require("../ast/CreateTableQuery");
|
|
9
|
+
const CreateVirtualTableQuery_1 = require("../ast/CreateVirtualTableQuery");
|
|
10
|
+
const CreateIndexQuery_1 = require("../ast/CreateIndexQuery");
|
|
11
|
+
const CreateViewQuery_1 = require("../ast/CreateViewQuery");
|
|
12
|
+
const AlterTableQuery_1 = require("../ast/AlterTableQuery");
|
|
13
|
+
const DropTableQuery_1 = require("../ast/DropTableQuery");
|
|
14
|
+
const DropIndexQuery_1 = require("../ast/DropIndexQuery");
|
|
15
|
+
const DropViewQuery_1 = require("../ast/DropViewQuery");
|
|
6
16
|
const QueryIdentityTransformer_1 = require("../visitor/QueryIdentityTransformer");
|
|
7
17
|
class QueryBuilder {
|
|
8
18
|
static select() {
|
|
@@ -11,10 +21,40 @@ class QueryBuilder {
|
|
|
11
21
|
static insertInto(tableName) {
|
|
12
22
|
return new InsertQuery_1.InsertQuery(tableName);
|
|
13
23
|
}
|
|
24
|
+
static update(tableName) {
|
|
25
|
+
return new UpdateQuery_1.UpdateQuery(tableName);
|
|
26
|
+
}
|
|
27
|
+
static deleteFrom(tableName) {
|
|
28
|
+
return new DeleteQuery_1.DeleteQuery(tableName);
|
|
29
|
+
}
|
|
30
|
+
static createTable(tableName) {
|
|
31
|
+
return new CreateTableQuery_1.CreateTableQuery(tableName);
|
|
32
|
+
}
|
|
33
|
+
static createVirtualTable(tableName, module) {
|
|
34
|
+
return new CreateVirtualTableQuery_1.CreateVirtualTableQuery(tableName, module);
|
|
35
|
+
}
|
|
36
|
+
static createIndex(indexName) {
|
|
37
|
+
return new CreateIndexQuery_1.CreateIndexQuery(indexName);
|
|
38
|
+
}
|
|
39
|
+
static alterTable(tableName) {
|
|
40
|
+
return new AlterTableQuery_1.AlterTableQuery(tableName);
|
|
41
|
+
}
|
|
42
|
+
static dropTable(tableName) {
|
|
43
|
+
return new DropTableQuery_1.DropTableQuery(tableName);
|
|
44
|
+
}
|
|
45
|
+
static dropIndex(indexName) {
|
|
46
|
+
return new DropIndexQuery_1.DropIndexQuery(indexName);
|
|
47
|
+
}
|
|
48
|
+
static createView(viewName) {
|
|
49
|
+
return new CreateViewQuery_1.CreateViewQuery(viewName);
|
|
50
|
+
}
|
|
51
|
+
static dropView(viewName) {
|
|
52
|
+
return new DropViewQuery_1.DropViewQuery(viewName);
|
|
53
|
+
}
|
|
14
54
|
static clone(node) {
|
|
15
55
|
const transformer = new QueryIdentityTransformer_1.QueryIdentityTransformer();
|
|
16
56
|
return transformer.transform(node);
|
|
17
57
|
}
|
|
18
58
|
}
|
|
19
59
|
exports.QueryBuilder = QueryBuilder;
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
60
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUXVlcnlCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2J1aWxkZXIvUXVlcnlCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG9EQUFpRDtBQUNqRCxvREFBaUQ7QUFDakQsb0RBQWlEO0FBQ2pELG9EQUFpRDtBQUNqRCw4REFBMkQ7QUFDM0QsNEVBQTZGO0FBQzdGLDhEQUEyRDtBQUMzRCw0REFBeUQ7QUFDekQsNERBQXlEO0FBQ3pELDBEQUF1RDtBQUN2RCwwREFBdUQ7QUFDdkQsd0RBQXFEO0FBRXJELGtGQUErRTtBQUUvRSxNQUFhLFlBQVk7SUFFaEIsTUFBTSxDQUFDLE1BQU07UUFDbEIsT0FBTyxJQUFJLHlCQUFXLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRU0sTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFpQjtRQUN4QyxPQUFPLElBQUkseUJBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFpQjtRQUNwQyxPQUFPLElBQUkseUJBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRU0sTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFpQjtRQUN4QyxPQUFPLElBQUkseUJBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRU0sTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFpQjtRQUN6QyxPQUFPLElBQUksbUNBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVNLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxTQUFpQixFQUFFLE1BQTBCO1FBQzVFLE9BQU8sSUFBSSxpREFBdUIsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVNLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBaUI7UUFDekMsT0FBTyxJQUFJLG1DQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFTSxNQUFNLENBQUMsVUFBVSxDQUFDLFNBQWlCO1FBQ3hDLE9BQU8sSUFBSSxpQ0FBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFTSxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQWlCO1FBQ3ZDLE9BQU8sSUFBSSwrQkFBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQWlCO1FBQ3ZDLE9BQU8sSUFBSSwrQkFBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQWdCO1FBQ3ZDLE9BQU8sSUFBSSxpQ0FBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQWdCO1FBQ3JDLE9BQU8sSUFBSSw2QkFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFTSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQWdCO1FBQ2xDLE1BQU0sV0FBVyxHQUFHLElBQUksbURBQXdCLEVBQUUsQ0FBQztRQUNuRCxPQUFPLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckMsQ0FBQztDQUNGO0FBdERELG9DQXNEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNlbGVjdFF1ZXJ5IH0gZnJvbSBcIi4uL2FzdC9TZWxlY3RRdWVyeVwiO1xuaW1wb3J0IHsgSW5zZXJ0UXVlcnkgfSBmcm9tIFwiLi4vYXN0L0luc2VydFF1ZXJ5XCI7XG5pbXBvcnQgeyBVcGRhdGVRdWVyeSB9IGZyb20gXCIuLi9hc3QvVXBkYXRlUXVlcnlcIjtcbmltcG9ydCB7IERlbGV0ZVF1ZXJ5IH0gZnJvbSBcIi4uL2FzdC9EZWxldGVRdWVyeVwiO1xuaW1wb3J0IHsgQ3JlYXRlVGFibGVRdWVyeSB9IGZyb20gXCIuLi9hc3QvQ3JlYXRlVGFibGVRdWVyeVwiO1xuaW1wb3J0IHsgQ3JlYXRlVmlydHVhbFRhYmxlUXVlcnksIFZpcnR1YWxUYWJsZU1vZHVsZSB9IGZyb20gXCIuLi9hc3QvQ3JlYXRlVmlydHVhbFRhYmxlUXVlcnlcIjtcbmltcG9ydCB7IENyZWF0ZUluZGV4UXVlcnkgfSBmcm9tIFwiLi4vYXN0L0NyZWF0ZUluZGV4UXVlcnlcIjtcbmltcG9ydCB7IENyZWF0ZVZpZXdRdWVyeSB9IGZyb20gXCIuLi9hc3QvQ3JlYXRlVmlld1F1ZXJ5XCI7XG5pbXBvcnQgeyBBbHRlclRhYmxlUXVlcnkgfSBmcm9tIFwiLi4vYXN0L0FsdGVyVGFibGVRdWVyeVwiO1xuaW1wb3J0IHsgRHJvcFRhYmxlUXVlcnkgfSBmcm9tIFwiLi4vYXN0L0Ryb3BUYWJsZVF1ZXJ5XCI7XG5pbXBvcnQgeyBEcm9wSW5kZXhRdWVyeSB9IGZyb20gXCIuLi9hc3QvRHJvcEluZGV4UXVlcnlcIjtcbmltcG9ydCB7IERyb3BWaWV3UXVlcnkgfSBmcm9tIFwiLi4vYXN0L0Ryb3BWaWV3UXVlcnlcIjtcbmltcG9ydCB7IFNxbFRyZWVOb2RlIH0gZnJvbSBcIi4uL2FzdC9BYnN0cmFjdGlvbnNcIjtcbmltcG9ydCB7IFF1ZXJ5SWRlbnRpdHlUcmFuc2Zvcm1lciB9IGZyb20gXCIuLi92aXNpdG9yL1F1ZXJ5SWRlbnRpdHlUcmFuc2Zvcm1lclwiO1xuXG5leHBvcnQgY2xhc3MgUXVlcnlCdWlsZGVyIHtcblxuICBwdWJsaWMgc3RhdGljIHNlbGVjdCgpOiBTZWxlY3RRdWVyeSB7XG4gICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeSgpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpbnNlcnRJbnRvKHRhYmxlTmFtZTogc3RyaW5nKTogSW5zZXJ0UXVlcnkge1xuICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnkodGFibGVOYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgdXBkYXRlKHRhYmxlTmFtZTogc3RyaW5nKTogVXBkYXRlUXVlcnkge1xuICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnkodGFibGVOYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZGVsZXRlRnJvbSh0YWJsZU5hbWU6IHN0cmluZyk6IERlbGV0ZVF1ZXJ5IHtcbiAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5KHRhYmxlTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZVRhYmxlKHRhYmxlTmFtZTogc3RyaW5nKTogQ3JlYXRlVGFibGVRdWVyeSB7XG4gICAgcmV0dXJuIG5ldyBDcmVhdGVUYWJsZVF1ZXJ5KHRhYmxlTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZVZpcnR1YWxUYWJsZSh0YWJsZU5hbWU6IHN0cmluZywgbW9kdWxlOiBWaXJ0dWFsVGFibGVNb2R1bGUpOiBDcmVhdGVWaXJ0dWFsVGFibGVRdWVyeSB7XG4gICAgcmV0dXJuIG5ldyBDcmVhdGVWaXJ0dWFsVGFibGVRdWVyeSh0YWJsZU5hbWUsIG1vZHVsZSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZUluZGV4KGluZGV4TmFtZTogc3RyaW5nKTogQ3JlYXRlSW5kZXhRdWVyeSB7XG4gICAgcmV0dXJuIG5ldyBDcmVhdGVJbmRleFF1ZXJ5KGluZGV4TmFtZSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGFsdGVyVGFibGUodGFibGVOYW1lOiBzdHJpbmcpOiBBbHRlclRhYmxlUXVlcnkge1xuICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZVF1ZXJ5KHRhYmxlTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGRyb3BUYWJsZSh0YWJsZU5hbWU6IHN0cmluZyk6IERyb3BUYWJsZVF1ZXJ5IHtcbiAgICByZXR1cm4gbmV3IERyb3BUYWJsZVF1ZXJ5KHRhYmxlTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGRyb3BJbmRleChpbmRleE5hbWU6IHN0cmluZyk6IERyb3BJbmRleFF1ZXJ5IHtcbiAgICByZXR1cm4gbmV3IERyb3BJbmRleFF1ZXJ5KGluZGV4TmFtZSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZVZpZXcodmlld05hbWU6IHN0cmluZyk6IENyZWF0ZVZpZXdRdWVyeSB7XG4gICAgcmV0dXJuIG5ldyBDcmVhdGVWaWV3UXVlcnkodmlld05hbWUpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBkcm9wVmlldyh2aWV3TmFtZTogc3RyaW5nKTogRHJvcFZpZXdRdWVyeSB7XG4gICAgcmV0dXJuIG5ldyBEcm9wVmlld1F1ZXJ5KHZpZXdOYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgY2xvbmUobm9kZTpTcWxUcmVlTm9kZSk6U3FsVHJlZU5vZGUge1xuICAgIGNvbnN0IHRyYW5zZm9ybWVyID0gbmV3IFF1ZXJ5SWRlbnRpdHlUcmFuc2Zvcm1lcigpO1xuICAgIHJldHVybiB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obm9kZSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,9 +1,23 @@
|
|
|
1
1
|
import { AliasableExpression, Expression } from "../ast/Abstractions";
|
|
2
2
|
import { Alias } from "../ast/Alias";
|
|
3
|
+
import { BetweenExpression } from "../ast/BetweenExpression";
|
|
3
4
|
import { BinaryExpression } from "../ast/BinaryExpression";
|
|
4
5
|
import { CaseExpression } from "../ast/CaseExpression";
|
|
6
|
+
import { CastExpression } from "../ast/CastExpression";
|
|
7
|
+
import { CollateExpression } from "../ast/CollateExpression";
|
|
8
|
+
import { SubqueryExpression } from "../ast/SubqueryExpression";
|
|
5
9
|
import { Column, ColumnLike } from "../ast/Column";
|
|
6
10
|
import { Concat } from "../ast/Concat";
|
|
11
|
+
import { AlterTableQuery } from "../ast/AlterTableQuery";
|
|
12
|
+
import { CreateIndexQuery } from "../ast/CreateIndexQuery";
|
|
13
|
+
import { CreateTableQuery } from "../ast/CreateTableQuery";
|
|
14
|
+
import { CreateVirtualTableQuery, VirtualTableModule } from "../ast/CreateVirtualTableQuery";
|
|
15
|
+
import { CreateViewQuery } from "../ast/CreateViewQuery";
|
|
16
|
+
import { DeleteQuery } from "../ast/DeleteQuery";
|
|
17
|
+
import { DropIndexQuery } from "../ast/DropIndexQuery";
|
|
18
|
+
import { DropTableQuery } from "../ast/DropTableQuery";
|
|
19
|
+
import { DropViewQuery } from "../ast/DropViewQuery";
|
|
20
|
+
import { UpdateQuery } from "../ast/UpdateQuery";
|
|
7
21
|
import { ExistsExpression } from "../ast/ExistsExpression";
|
|
8
22
|
import { From, FromLike } from "../ast/From";
|
|
9
23
|
import { FunctionExpression } from "../ast/FunctionExpression";
|
|
@@ -34,6 +48,10 @@ export declare function LT(left: LazyExpression, right: LazyExpression): BinaryE
|
|
|
34
48
|
export declare function GTE(left: LazyExpression, right: LazyExpression): BinaryExpression;
|
|
35
49
|
export declare function LTE(left: LazyExpression, right: LazyExpression): BinaryExpression;
|
|
36
50
|
export declare function LIKE(left: LazyExpression, right: LazyExpression): BinaryExpression;
|
|
51
|
+
export declare function GLOB(left: LazyExpression, right: LazyExpression): BinaryExpression;
|
|
52
|
+
export declare function MATCH(left: LazyExpression, right: LazyExpression): BinaryExpression;
|
|
53
|
+
export declare function BETWEEN(operand: LazyExpression, low: LazyExpression, high: LazyExpression): BetweenExpression;
|
|
54
|
+
export declare function NOT_BETWEEN(operand: LazyExpression, low: LazyExpression, high: LazyExpression): BetweenExpression;
|
|
37
55
|
export declare function IS_NULL(expr: LazyExpression): UnaryExpression;
|
|
38
56
|
export declare function IS_NOT_NULL(expr: LazyExpression): UnaryExpression;
|
|
39
57
|
export declare function PLUS(left: LazyExpression, right?: LazyExpression): AliasableExpression;
|
|
@@ -48,6 +66,8 @@ export declare function SELECT(...args: (FromLike | Join | LazyColumn)[]): Selec
|
|
|
48
66
|
export declare function SELECT_DISTINCT(...args: (FromLike | Join | LazyColumn)[]): SelectQuery;
|
|
49
67
|
export declare function FROM(arg1: LazyFrom, arg2?: string): From | Alias<From>;
|
|
50
68
|
export declare function UNION(...queries: SelectQuery[]): SelectQuery;
|
|
69
|
+
export declare function INTERSECT(...queries: SelectQuery[]): SelectQuery;
|
|
70
|
+
export declare function EXCEPT(...queries: SelectQuery[]): SelectQuery;
|
|
51
71
|
export declare function JOIN(tableName: string, alias: string, on: LazyExpression): Join;
|
|
52
72
|
export declare function LEFT_JOIN(tableName: string, alias: string, on: LazyExpression): Join;
|
|
53
73
|
export declare function CROSS_JOIN(tableName: string, alias: string): Join;
|
|
@@ -59,6 +79,7 @@ export declare function FN_DISTINCT(name: FunctionName, ...args: LazyExpression[
|
|
|
59
79
|
export declare function CONCAT(...args: LazyExpression[]): Concat;
|
|
60
80
|
export declare function PARAM(name?: string): Param;
|
|
61
81
|
export declare function INSERT(tableName: string, columns: string[], values: LazyExpression[]): InsertQuery;
|
|
82
|
+
export declare function INSERT_INTO(tableName: string): InsertQuery;
|
|
62
83
|
export declare function INSERT_OR_REPLACE(database: string, table: string, columns: string[], values: LazyExpression[]): InsertQuery;
|
|
63
84
|
export declare function INSERT_OR_REPLACE(tableName: string, columns: string[], values: LazyExpression[]): InsertQuery;
|
|
64
85
|
export declare function IN(left: LazyExpression, ...values: LazyExpression[]): InExpression;
|
|
@@ -72,6 +93,36 @@ export declare function NOT_IN(left: LazyExpression[], values: SelectQuery): InE
|
|
|
72
93
|
export declare function GROUP_BY(...columns: (Column | string)[]): Column[];
|
|
73
94
|
export declare function HAVING(expr: LazyExpression): Expression;
|
|
74
95
|
export declare function ORDER_BY(column: Column | string, direction?: OrderByDirection): OrderBy;
|
|
96
|
+
/**
|
|
97
|
+
* Creates a PARTITION BY clause for window functions.
|
|
98
|
+
*
|
|
99
|
+
* Returns an Expression[] that can be passed to FunctionExpression.over()
|
|
100
|
+
*
|
|
101
|
+
* @example
|
|
102
|
+
* ```typescript
|
|
103
|
+
* FN('RANK').over(PARTITION_BY('category'), ORDER_BY('price', DESC))
|
|
104
|
+
* // RANK() OVER (PARTITION BY category ORDER BY price DESC)
|
|
105
|
+
*
|
|
106
|
+
* FN('ROW_NUMBER').over(PARTITION_BY('department', 'location'), ORDER_BY('salary'))
|
|
107
|
+
* // ROW_NUMBER() OVER (PARTITION BY department, location ORDER BY salary)
|
|
108
|
+
* ```
|
|
109
|
+
*/
|
|
110
|
+
export declare function PARTITION_BY(...columns: (Column | string)[]): Expression[];
|
|
75
111
|
export declare function CASE(lazyCases: LazyCaseItem[]): CaseExpression;
|
|
76
112
|
export declare function WITH(name: string, query: SelectQuery): With;
|
|
113
|
+
export declare function DELETE_FROM(tableName: string): DeleteQuery;
|
|
114
|
+
export declare function UPDATE(tableName: string): UpdateQuery;
|
|
115
|
+
export declare function CREATE_TABLE(tableName: string): CreateTableQuery;
|
|
116
|
+
export declare function CREATE_VIRTUAL_TABLE(tableName: string, module: VirtualTableModule): CreateVirtualTableQuery;
|
|
117
|
+
export declare function CREATE_INDEX(indexName: string): CreateIndexQuery;
|
|
118
|
+
export declare function ALTER_TABLE(tableName: string): AlterTableQuery;
|
|
119
|
+
export declare function DROP_TABLE(tableName: string): DropTableQuery;
|
|
120
|
+
export declare function DROP_INDEX(indexName: string): DropIndexQuery;
|
|
121
|
+
export declare function CREATE_VIEW(viewName: string): CreateViewQuery;
|
|
122
|
+
export declare function DROP_VIEW(viewName: string): DropViewQuery;
|
|
123
|
+
export declare function ALIAS(referent: AliasableExpression, alias: string): Alias<AliasableExpression>;
|
|
124
|
+
export declare function ALIAS(referent: From, alias: string): Alias<From>;
|
|
125
|
+
export declare function CAST(expr: LazyExpression, targetType: string): CastExpression;
|
|
126
|
+
export declare function COLLATE(expr: LazyExpression, collation: string): CollateExpression;
|
|
127
|
+
export declare function SUBQUERY(query: SelectQuery): SubqueryExpression;
|
|
77
128
|
export {};
|
|
@@ -9,6 +9,10 @@ exports.LT = LT;
|
|
|
9
9
|
exports.GTE = GTE;
|
|
10
10
|
exports.LTE = LTE;
|
|
11
11
|
exports.LIKE = LIKE;
|
|
12
|
+
exports.GLOB = GLOB;
|
|
13
|
+
exports.MATCH = MATCH;
|
|
14
|
+
exports.BETWEEN = BETWEEN;
|
|
15
|
+
exports.NOT_BETWEEN = NOT_BETWEEN;
|
|
12
16
|
exports.IS_NULL = IS_NULL;
|
|
13
17
|
exports.IS_NOT_NULL = IS_NOT_NULL;
|
|
14
18
|
exports.PLUS = PLUS;
|
|
@@ -23,6 +27,8 @@ exports.SELECT = SELECT;
|
|
|
23
27
|
exports.SELECT_DISTINCT = SELECT_DISTINCT;
|
|
24
28
|
exports.FROM = FROM;
|
|
25
29
|
exports.UNION = UNION;
|
|
30
|
+
exports.INTERSECT = INTERSECT;
|
|
31
|
+
exports.EXCEPT = EXCEPT;
|
|
26
32
|
exports.JOIN = JOIN;
|
|
27
33
|
exports.LEFT_JOIN = LEFT_JOIN;
|
|
28
34
|
exports.CROSS_JOIN = CROSS_JOIN;
|
|
@@ -34,18 +40,38 @@ exports.FN_DISTINCT = FN_DISTINCT;
|
|
|
34
40
|
exports.CONCAT = CONCAT;
|
|
35
41
|
exports.PARAM = PARAM;
|
|
36
42
|
exports.INSERT = INSERT;
|
|
43
|
+
exports.INSERT_INTO = INSERT_INTO;
|
|
37
44
|
exports.INSERT_OR_REPLACE = INSERT_OR_REPLACE;
|
|
38
45
|
exports.IN = IN;
|
|
39
46
|
exports.NOT_IN = NOT_IN;
|
|
40
47
|
exports.GROUP_BY = GROUP_BY;
|
|
41
48
|
exports.HAVING = HAVING;
|
|
42
49
|
exports.ORDER_BY = ORDER_BY;
|
|
50
|
+
exports.PARTITION_BY = PARTITION_BY;
|
|
43
51
|
exports.CASE = CASE;
|
|
44
52
|
exports.WITH = WITH;
|
|
53
|
+
exports.DELETE_FROM = DELETE_FROM;
|
|
54
|
+
exports.UPDATE = UPDATE;
|
|
55
|
+
exports.CREATE_TABLE = CREATE_TABLE;
|
|
56
|
+
exports.CREATE_VIRTUAL_TABLE = CREATE_VIRTUAL_TABLE;
|
|
57
|
+
exports.CREATE_INDEX = CREATE_INDEX;
|
|
58
|
+
exports.ALTER_TABLE = ALTER_TABLE;
|
|
59
|
+
exports.DROP_TABLE = DROP_TABLE;
|
|
60
|
+
exports.DROP_INDEX = DROP_INDEX;
|
|
61
|
+
exports.CREATE_VIEW = CREATE_VIEW;
|
|
62
|
+
exports.DROP_VIEW = DROP_VIEW;
|
|
63
|
+
exports.ALIAS = ALIAS;
|
|
64
|
+
exports.CAST = CAST;
|
|
65
|
+
exports.COLLATE = COLLATE;
|
|
66
|
+
exports.SUBQUERY = SUBQUERY;
|
|
45
67
|
const Abstractions_1 = require("../ast/Abstractions");
|
|
46
68
|
const Alias_1 = require("../ast/Alias");
|
|
69
|
+
const BetweenExpression_1 = require("../ast/BetweenExpression");
|
|
47
70
|
const BinaryExpression_1 = require("../ast/BinaryExpression");
|
|
48
71
|
const CaseExpression_1 = require("../ast/CaseExpression");
|
|
72
|
+
const CastExpression_1 = require("../ast/CastExpression");
|
|
73
|
+
const CollateExpression_1 = require("../ast/CollateExpression");
|
|
74
|
+
const SubqueryExpression_1 = require("../ast/SubqueryExpression");
|
|
49
75
|
const Column_1 = require("../ast/Column");
|
|
50
76
|
const Concat_1 = require("../ast/Concat");
|
|
51
77
|
const ExistsExpression_1 = require("../ast/ExistsExpression");
|
|
@@ -88,6 +114,18 @@ function LTE(left, right) {
|
|
|
88
114
|
function LIKE(left, right) {
|
|
89
115
|
return new BinaryExpression_1.BinaryExpression(LAZY(left), Operator_1.Operator.LIKE, LAZY(right));
|
|
90
116
|
}
|
|
117
|
+
function GLOB(left, right) {
|
|
118
|
+
return new BinaryExpression_1.BinaryExpression(LAZY(left), Operator_1.Operator.GLOB, LAZY(right));
|
|
119
|
+
}
|
|
120
|
+
function MATCH(left, right) {
|
|
121
|
+
return new BinaryExpression_1.BinaryExpression(LAZY(left), Operator_1.Operator.MATCH, LAZY(right));
|
|
122
|
+
}
|
|
123
|
+
function BETWEEN(operand, low, high) {
|
|
124
|
+
return new BetweenExpression_1.BetweenExpression(LAZY(operand), LAZY(low), LAZY(high), false);
|
|
125
|
+
}
|
|
126
|
+
function NOT_BETWEEN(operand, low, high) {
|
|
127
|
+
return new BetweenExpression_1.BetweenExpression(LAZY(operand), LAZY(low), LAZY(high), true);
|
|
128
|
+
}
|
|
91
129
|
function IS_NULL(expr) {
|
|
92
130
|
return new UnaryExpression_1.UnaryExpression(Operator_1.Operator.IS_NULL, LAZY(expr));
|
|
93
131
|
}
|
|
@@ -208,6 +246,16 @@ function UNION(...queries) {
|
|
|
208
246
|
queries.forEach(q => query.union(q));
|
|
209
247
|
return query;
|
|
210
248
|
}
|
|
249
|
+
function INTERSECT(...queries) {
|
|
250
|
+
const query = QueryBuilder_1.QueryBuilder.select();
|
|
251
|
+
queries.forEach(q => query.intersect(q));
|
|
252
|
+
return query;
|
|
253
|
+
}
|
|
254
|
+
function EXCEPT(...queries) {
|
|
255
|
+
const query = QueryBuilder_1.QueryBuilder.select();
|
|
256
|
+
queries.forEach(q => query.except(q));
|
|
257
|
+
return query;
|
|
258
|
+
}
|
|
211
259
|
// --- Joins ---
|
|
212
260
|
function JOIN(tableName, alias, on) {
|
|
213
261
|
return new Join_1.Join(Join_1.JoinType.INNER, tableName, alias, LAZY(on));
|
|
@@ -248,6 +296,9 @@ function INSERT(tableName, columns, values) {
|
|
|
248
296
|
.columns(...columns)
|
|
249
297
|
.values(...values.map(LAZY));
|
|
250
298
|
}
|
|
299
|
+
function INSERT_INTO(tableName) {
|
|
300
|
+
return QueryBuilder_1.QueryBuilder.insertInto(tableName);
|
|
301
|
+
}
|
|
251
302
|
function INSERT_OR_REPLACE(arg1, arg2, arg3, arg4) {
|
|
252
303
|
// Four-argument form: INSERT_OR_REPLACE(database, table, columns, values)
|
|
253
304
|
if (typeof arg2 === 'string' && Array.isArray(arg3) && Array.isArray(arg4)) {
|
|
@@ -327,6 +378,23 @@ function HAVING(expr) {
|
|
|
327
378
|
function ORDER_BY(column, direction = OrderBy_1.OrderByDirection.ASC) {
|
|
328
379
|
return new OrderBy_1.OrderBy(typeof column === 'string' ? COLUMN(column) : column, direction);
|
|
329
380
|
}
|
|
381
|
+
/**
|
|
382
|
+
* Creates a PARTITION BY clause for window functions.
|
|
383
|
+
*
|
|
384
|
+
* Returns an Expression[] that can be passed to FunctionExpression.over()
|
|
385
|
+
*
|
|
386
|
+
* @example
|
|
387
|
+
* ```typescript
|
|
388
|
+
* FN('RANK').over(PARTITION_BY('category'), ORDER_BY('price', DESC))
|
|
389
|
+
* // RANK() OVER (PARTITION BY category ORDER BY price DESC)
|
|
390
|
+
*
|
|
391
|
+
* FN('ROW_NUMBER').over(PARTITION_BY('department', 'location'), ORDER_BY('salary'))
|
|
392
|
+
* // ROW_NUMBER() OVER (PARTITION BY department, location ORDER BY salary)
|
|
393
|
+
* ```
|
|
394
|
+
*/
|
|
395
|
+
function PARTITION_BY(...columns) {
|
|
396
|
+
return columns.map(col => (typeof col === 'string' ? COLUMN(col) : col));
|
|
397
|
+
}
|
|
330
398
|
// --- CASE Expressions ---
|
|
331
399
|
function CASE(lazyCases) {
|
|
332
400
|
let elseExpr = undefined;
|
|
@@ -351,6 +419,62 @@ function CASE(lazyCases) {
|
|
|
351
419
|
function WITH(name, query) {
|
|
352
420
|
return new With_1.With(name, query);
|
|
353
421
|
}
|
|
422
|
+
// --- Delete Queries ---
|
|
423
|
+
function DELETE_FROM(tableName) {
|
|
424
|
+
return QueryBuilder_1.QueryBuilder.deleteFrom(tableName);
|
|
425
|
+
}
|
|
426
|
+
// --- Update Queries ---
|
|
427
|
+
function UPDATE(tableName) {
|
|
428
|
+
return QueryBuilder_1.QueryBuilder.update(tableName);
|
|
429
|
+
}
|
|
430
|
+
// --- Create Table Queries ---
|
|
431
|
+
function CREATE_TABLE(tableName) {
|
|
432
|
+
return QueryBuilder_1.QueryBuilder.createTable(tableName);
|
|
433
|
+
}
|
|
434
|
+
// --- Create Virtual Table Queries ---
|
|
435
|
+
function CREATE_VIRTUAL_TABLE(tableName, module) {
|
|
436
|
+
return QueryBuilder_1.QueryBuilder.createVirtualTable(tableName, module);
|
|
437
|
+
}
|
|
438
|
+
// --- Create Index Queries ---
|
|
439
|
+
function CREATE_INDEX(indexName) {
|
|
440
|
+
return QueryBuilder_1.QueryBuilder.createIndex(indexName);
|
|
441
|
+
}
|
|
442
|
+
// --- Alter Table Queries ---
|
|
443
|
+
function ALTER_TABLE(tableName) {
|
|
444
|
+
return QueryBuilder_1.QueryBuilder.alterTable(tableName);
|
|
445
|
+
}
|
|
446
|
+
// --- Drop Queries ---
|
|
447
|
+
function DROP_TABLE(tableName) {
|
|
448
|
+
return QueryBuilder_1.QueryBuilder.dropTable(tableName);
|
|
449
|
+
}
|
|
450
|
+
function DROP_INDEX(indexName) {
|
|
451
|
+
return QueryBuilder_1.QueryBuilder.dropIndex(indexName);
|
|
452
|
+
}
|
|
453
|
+
// --- View Queries ---
|
|
454
|
+
function CREATE_VIEW(viewName) {
|
|
455
|
+
return QueryBuilder_1.QueryBuilder.createView(viewName);
|
|
456
|
+
}
|
|
457
|
+
function DROP_VIEW(viewName) {
|
|
458
|
+
return QueryBuilder_1.QueryBuilder.dropView(viewName);
|
|
459
|
+
}
|
|
460
|
+
function ALIAS(referent, alias) {
|
|
461
|
+
if (referent instanceof From_1.From) {
|
|
462
|
+
return new Alias_1.Alias(referent, alias);
|
|
463
|
+
}
|
|
464
|
+
return new Alias_1.Alias(referent, alias);
|
|
465
|
+
}
|
|
466
|
+
// --- CAST Expressions ---
|
|
467
|
+
function CAST(expr, targetType) {
|
|
468
|
+
return new CastExpression_1.CastExpression(LAZY(expr), targetType);
|
|
469
|
+
}
|
|
470
|
+
// --- COLLATE Expressions ---
|
|
471
|
+
function COLLATE(expr, collation) {
|
|
472
|
+
return new CollateExpression_1.CollateExpression(LAZY(expr), collation);
|
|
473
|
+
}
|
|
474
|
+
// --- Subquery Expressions ---
|
|
475
|
+
function SUBQUERY(query) {
|
|
476
|
+
return new SubqueryExpression_1.SubqueryExpression(query);
|
|
477
|
+
}
|
|
354
478
|
// --- Literal Conversion ---
|
|
355
479
|
function LAZY(value) {
|
|
356
480
|
if (value === null) {
|
|
@@ -372,4 +496,4 @@ function LAZY(value) {
|
|
|
372
496
|
throw new Error(`Unsupported value type: ${typeof value}`);
|
|
373
497
|
}
|
|
374
498
|
}
|
|
375
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2hvcnRoYW5kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2J1aWxkZXIvU2hvcnRoYW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBK0JBLGtCQUVDO0FBSUQsZ0JBRUM7QUFFRCx3QkFFQztBQUVELGtCQUVDO0FBRUQsZ0JBRUM7QUFFRCxnQkFFQztBQUVELGtCQUVDO0FBRUQsa0JBRUM7QUFFRCxvQkFFQztBQUVELDBCQUVDO0FBRUQsa0NBRUM7QUFFRCxvQkFNQztBQUVELHNCQU1DO0FBRUQsNEJBRUM7QUFFRCx3QkFFQztBQUVELGtCQU9DO0FBRUQsZ0JBT0M7QUFJRCx3QkFFQztBQUlELHdCQUVDO0FBSUQsd0JBRUM7QUFFRCwwQ0FFQztBQTJCRCxvQkFzQkM7QUFFRCxzQkFJQztBQUlELG9CQUVDO0FBRUQsOEJBRUM7QUFFRCxnQ0FFQztBQUlELGtCQUVDO0FBRUQsc0JBRUM7QUFFRCxrQkFFQztBQUVELGdCQUVDO0FBRUQsa0NBRUM7QUFJRCx3QkFFQztBQUlELHNCQUVDO0FBSUQsd0JBSUM7QUFJRCw4Q0FtQkM7QUFXRCxnQkFxQkM7QUFTRCx3QkFxQkM7QUFFRCw0QkFFQztBQUVELHdCQUVDO0FBRUQsNEJBRUM7QUFJRCxvQkFpQkM7QUFJRCxvQkFFQztBQXRYRCxzREFBc0U7QUFDdEUsd0NBQXFDO0FBQ3JDLDhEQUEyRDtBQUMzRCwwREFBaUU7QUFDakUsMENBQW1EO0FBQ25ELDBDQUF1QztBQUN2Qyw4REFBMkQ7QUFDM0Qsc0NBQW9GO0FBQ3BGLGtFQUErRDtBQUUvRCxzREFBbUQ7QUFFbkQsc0NBQTZDO0FBQzdDLDhDQUFtRjtBQUNuRiw4Q0FBMkM7QUFDM0MsNENBQTJEO0FBQzNELG9EQUFpRDtBQUNqRCw0REFBeUQ7QUFDekQsc0NBQW1DO0FBQ25DLGlEQUE4QztBQVk5QyxTQUFnQixHQUFHLENBQUMsR0FBbUI7SUFDckMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkIsQ0FBQztB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RUQsNkJBQTZCO0FBRTdCLFNBQVMsSUFBSSxDQUFDLEtBQXFCO0lBQ2pDLElBQUksS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ25CLE9BQU8sc0JBQVcsQ0FBQyxRQUFRLENBQUM7SUFDOUIsQ0FBQztTQUFNLElBQUksT0FBTyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDdEMsT0FBTyxJQUFJLHdCQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFDLENBQUM7U0FBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3JDLE9BQU8sSUFBSSx3QkFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLENBQUM7U0FBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3JDLE9BQU8sSUFBSSx3QkFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLENBQUM7U0FBTSxJQUFJLEtBQUssWUFBWSxrQ0FBbUIsRUFBRSxDQUFDO1FBQ2hELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztTQUFNLENBQUM7UUFDTixNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixPQUFPLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDN0QsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbGlhc2FibGVFeHByZXNzaW9uLCBFeHByZXNzaW9uIH0gZnJvbSBcIi4uL2FzdC9BYnN0cmFjdGlvbnNcIjtcbmltcG9ydCB7IEFsaWFzIH0gZnJvbSBcIi4uL2FzdC9BbGlhc1wiO1xuaW1wb3J0IHsgQmluYXJ5RXhwcmVzc2lvbiB9IGZyb20gXCIuLi9hc3QvQmluYXJ5RXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgQ2FzZUV4cHJlc3Npb24sIENhc2VJdGVtIH0gZnJvbSBcIi4uL2FzdC9DYXNlRXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgQ29sdW1uLCBDb2x1bW5MaWtlIH0gZnJvbSBcIi4uL2FzdC9Db2x1bW5cIjtcbmltcG9ydCB7IENvbmNhdCB9IGZyb20gXCIuLi9hc3QvQ29uY2F0XCI7XG5pbXBvcnQgeyBFeGlzdHNFeHByZXNzaW9uIH0gZnJvbSBcIi4uL2FzdC9FeGlzdHNFeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBGcm9tLCBGcm9tTGlrZSwgSnNvbkVhY2hGcm9tLCBTdWJxdWVyeUZyb20sIFRhYmxlRnJvbSB9IGZyb20gXCIuLi9hc3QvRnJvbVwiO1xuaW1wb3J0IHsgRnVuY3Rpb25FeHByZXNzaW9uIH0gZnJvbSBcIi4uL2FzdC9GdW5jdGlvbkV4cHJlc3Npb25cIjtcbmltcG9ydCB7IEZ1bmN0aW9uTmFtZSB9IGZyb20gXCIuLi9hc3QvRnVuY3Rpb25OYW1lXCI7XG5pbXBvcnQgeyBJbkV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L0luRXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgSW5zZXJ0UXVlcnkgfSBmcm9tIFwiLi4vYXN0L0luc2VydFF1ZXJ5XCI7XG5pbXBvcnQgeyBKb2luLCBKb2luVHlwZSB9IGZyb20gXCIuLi9hc3QvSm9pblwiO1xuaW1wb3J0IHsgTnVsbExpdGVyYWwsIE51bWJlckxpdGVyYWwsIFBhcmFtLCBTdHJpbmdMaXRlcmFsIH0gZnJvbSBcIi4uL2FzdC9MaXRlcmFsc1wiO1xuaW1wb3J0IHsgT3BlcmF0b3IgfSBmcm9tIFwiLi4vYXN0L09wZXJhdG9yXCI7XG5pbXBvcnQgeyBPcmRlckJ5LCBPcmRlckJ5RGlyZWN0aW9uIH0gZnJvbSBcIi4uL2FzdC9PcmRlckJ5XCI7XG5pbXBvcnQgeyBTZWxlY3RRdWVyeSB9IGZyb20gXCIuLi9hc3QvU2VsZWN0UXVlcnlcIjtcbmltcG9ydCB7IFVuYXJ5RXhwcmVzc2lvbiB9IGZyb20gXCIuLi9hc3QvVW5hcnlFeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBXaXRoIH0gZnJvbSBcIi4uL2FzdC9XaXRoXCI7XG5pbXBvcnQgeyBRdWVyeUJ1aWxkZXIgfSBmcm9tIFwiLi9RdWVyeUJ1aWxkZXJcIjtcblxudHlwZSBQcmltaXRpdmVWYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsO1xuXG50eXBlIExhenlFeHByZXNzaW9uID0gRXhwcmVzc2lvbiB8IFByaW1pdGl2ZVZhbHVlO1xuXG50eXBlIExhenlDYXNlSXRlbSA9IHsgV0hFTj86IExhenlFeHByZXNzaW9uOyBUSEVOPzogTGF6eUV4cHJlc3Npb247IEVMU0U/OiBMYXp5RXhwcmVzc2lvbiB9O1xuXG50eXBlIExhenlGcm9tID0gc3RyaW5nIHwgRnJvbSB8IEFsaWFzPEZyb20+IHwgU2VsZWN0UXVlcnk7XG5cbnR5cGUgTGF6eUNvbHVtbiA9IENvbHVtbkxpa2UgfCBQcmltaXRpdmVWYWx1ZTtcblxuZXhwb3J0IGZ1bmN0aW9uIFZBTCh2YWw6IFByaW1pdGl2ZVZhbHVlKTogQWxpYXNhYmxlRXhwcmVzc2lvbiB7XG4gIHJldHVybiBMQVpZKHZhbCk7XG59XG5cbi8vIC0tLSBPcGVyYXRvcnMgLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBFUShsZWZ0OiBMYXp5RXhwcmVzc2lvbiwgcmlnaHQ6IExhenlFeHByZXNzaW9uKTogQmluYXJ5RXhwcmVzc2lvbiB7XG4gIHJldHVybiBuZXcgQmluYXJ5RXhwcmVzc2lvbihMQVpZKGxlZnQpLCBPcGVyYXRvci5FUVVBTFMsIExBWlkocmlnaHQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE5PVF9FUShsZWZ0OiBMYXp5RXhwcmVzc2lvbiwgcmlnaHQ6IExhenlFeHByZXNzaW9uKTogQmluYXJ5RXhwcmVzc2lvbiB7XG4gIHJldHVybiBuZXcgQmluYXJ5RXhwcmVzc2lvbihMQVpZKGxlZnQpLCBPcGVyYXRvci5OT1RfRVFVQUxTLCBMQVpZKHJpZ2h0KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBOT1QoZXhwcjogTGF6eUV4cHJlc3Npb24pOiBVbmFyeUV4cHJlc3Npb24ge1xuICByZXR1cm4gbmV3IFVuYXJ5RXhwcmVzc2lvbihPcGVyYXRvci5OT1QsIExBWlkoZXhwcikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gR1QobGVmdDogTGF6eUV4cHJlc3Npb24sIHJpZ2h0OiBMYXp5RXhwcmVzc2lvbik6IEJpbmFyeUV4cHJlc3Npb24ge1xuICByZXR1cm4gbmV3IEJpbmFyeUV4cHJlc3Npb24oTEFaWShsZWZ0KSwgT3BlcmF0b3IuR1JFQVRFUl9USEFOLCBMQVpZKHJpZ2h0KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBMVChsZWZ0OiBMYXp5RXhwcmVzc2lvbiwgcmlnaHQ6IExhenlFeHByZXNzaW9uKTogQmluYXJ5RXhwcmVzc2lvbiB7XG4gIHJldHVybiBuZXcgQmluYXJ5RXhwcmVzc2lvbihMQVpZKGxlZnQpLCBPcGVyYXRvci5MRVNTX1RIQU4sIExBWlkocmlnaHQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEdURShsZWZ0OiBMYXp5RXhwcmVzc2lvbiwgcmlnaHQ6IExhenlFeHByZXNzaW9uKTogQmluYXJ5RXhwcmVzc2lvbiB7XG4gIHJldHVybiBuZXcgQmluYXJ5RXhwcmVzc2lvbihMQVpZKGxlZnQpLCBPcGVyYXRvci5HUkVBVEVSX1RIQU5fT1JfRVFVQUwsIExBWlkocmlnaHQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIExURShsZWZ0OiBMYXp5RXhwcmVzc2lvbiwgcmlnaHQ6IExhenlFeHByZXNzaW9uKTogQmluYXJ5RXhwcmVzc2lvbiB7XG4gIHJldHVybiBuZXcgQmluYXJ5RXhwcmVzc2lvbihMQVpZKGxlZnQpLCBPcGVyYXRvci5MRVNTX1RIQU5fT1JfRVFVQUwsIExBWlkocmlnaHQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIExJS0UobGVmdDogTGF6eUV4cHJlc3Npb24sIHJpZ2h0OiBMYXp5RXhwcmVzc2lvbik6IEJpbmFyeUV4cHJlc3Npb24ge1xuICByZXR1cm4gbmV3IEJpbmFyeUV4cHJlc3Npb24oTEFaWShsZWZ0KSwgT3BlcmF0b3IuTElLRSwgTEFaWShyaWdodCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gSVNfTlVMTChleHByOiBMYXp5RXhwcmVzc2lvbik6IFVuYXJ5RXhwcmVzc2lvbiB7XG4gIHJldHVybiBuZXcgVW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yLklTX05VTEwsIExBWlkoZXhwcikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gSVNfTk9UX05VTEwoZXhwcjogTGF6eUV4cHJlc3Npb24pOiBVbmFyeUV4cHJlc3Npb24ge1xuICByZXR1cm4gbmV3IFVuYXJ5RXhwcmVzc2lvbihPcGVyYXRvci5JU19OT1RfTlVMTCwgTEFaWShleHByKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBQTFVTKGxlZnQ6IExhenlFeHByZXNzaW9uLCByaWdodD86IExhenlFeHByZXNzaW9uKTogQWxpYXNhYmxlRXhwcmVzc2lvbiB7XG4gIGlmIChyaWdodCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG5ldyBVbmFyeUV4cHJlc3Npb24oT3BlcmF0b3IuUExVUywgTEFaWShsZWZ0KSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBCaW5hcnlFeHByZXNzaW9uKExBWlkobGVmdCksIE9wZXJhdG9yLlBMVVMsIExBWlkocmlnaHQpKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gTUlOVVMobGVmdDogTGF6eUV4cHJlc3Npb24sIHJpZ2h0PzogTGF6eUV4cHJlc3Npb24pOiBBbGlhc2FibGVFeHByZXNzaW9uIHtcbiAgaWYgKHJpZ2h0ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbmV3IFVuYXJ5RXhwcmVzc2lvbihPcGVyYXRvci5NSU5VUywgTEFaWShsZWZ0KSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBCaW5hcnlFeHByZXNzaW9uKExBWlkobGVmdCksIE9wZXJhdG9yLk1JTlVTLCBMQVpZKHJpZ2h0KSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE1VTFRJUExZKGxlZnQ6IExhenlFeHByZXNzaW9uLCByaWdodDogTGF6eUV4cHJlc3Npb24pOiBCaW5hcnlFeHByZXNzaW9uIHtcbiAgcmV0dXJuIG5ldyBCaW5hcnlFeHByZXNzaW9uKExBWlkobGVmdCksIE9wZXJhdG9yLk1VTFRJUExZLCBMQVpZKHJpZ2h0KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBESVZJREUobGVmdDogTGF6eUV4cHJlc3Npb24sIHJpZ2h0OiBMYXp5RXhwcmVzc2lvbik6IEJpbmFyeUV4cHJlc3Npb24ge1xuICByZXR1cm4gbmV3IEJpbmFyeUV4cHJlc3Npb24oTEFaWShsZWZ0KSwgT3BlcmF0b3IuRElWSURFLCBMQVpZKHJpZ2h0KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBBTkQoLi4uYXJnczogTGF6eUV4cHJlc3Npb25bXSk6IEFsaWFzYWJsZUV4cHJlc3Npb24ge1xuICBpZiAoYXJncy5sZW5ndGggPT0gMSkge1xuICAgIHJldHVybiBMQVpZKGFyZ3NbMF0pXG4gIH0gaWYgKGFyZ3MubGVuZ3RoIDwgMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQU5EIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBhcmd1bWVudHMnKTtcbiAgfVxuICByZXR1cm4gYXJncy5yZWR1Y2UoKGxlZnQsIHJpZ2h0KSA9PiBuZXcgQmluYXJ5RXhwcmVzc2lvbihMQVpZKGxlZnQpLCBPcGVyYXRvci5BTkQsIExBWlkocmlnaHQpKSkgYXMgQWxpYXNhYmxlRXhwcmVzc2lvbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE9SKC4uLmFyZ3M6IExhenlFeHByZXNzaW9uW10pOiBBbGlhc2FibGVFeHByZXNzaW9uIHtcbiAgaWYgKGFyZ3MubGVuZ3RoID09IDEpIHtcbiAgICByZXR1cm4gTEFaWShhcmdzWzBdKVxuICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoIDwgMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignT1IgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGFyZ3VtZW50cycpO1xuICB9XG4gIHJldHVybiBhcmdzLnJlZHVjZSgobGVmdCwgcmlnaHQpID0+IG5ldyBCaW5hcnlFeHByZXNzaW9uKExBWlkobGVmdCksIE9wZXJhdG9yLk9SLCBMQVpZKHJpZ2h0KSkpIGFzIEFsaWFzYWJsZUV4cHJlc3Npb247XG59XG5cbi8vIC0tLSBFWElTVFMgLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBFWElTVFMoc3VicXVlcnk6IFNlbGVjdFF1ZXJ5KTogRXhpc3RzRXhwcmVzc2lvbiB7XG4gIHJldHVybiBuZXcgRXhpc3RzRXhwcmVzc2lvbihzdWJxdWVyeSk7XG59XG5cbi8vIC0tLSBDb2x1bW5zIC0tLVxuXG5leHBvcnQgZnVuY3Rpb24gQ09MVU1OKGFyZzE6IHN0cmluZywgYXJnMj86IHN0cmluZyk6IENvbHVtbiB7XG4gIHJldHVybiBuZXcgQ29sdW1uKGFyZzEsIGFyZzIpO1xufVxuXG4vLyAtLS0gU2VsZWN0IFF1ZXJpZXMgLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBTRUxFQ1QoLi4uYXJnczogKEZyb21MaWtlIHwgSm9pbiB8IExhenlDb2x1bW4pW10pOiBTZWxlY3RRdWVyeSB7XG4gIHJldHVybiBhZGRDbGF1c2VzVG9TZWxlY3QoUXVlcnlCdWlsZGVyLnNlbGVjdCgpLCBhcmdzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFNFTEVDVF9ESVNUSU5DVCguLi5hcmdzOiAoRnJvbUxpa2UgfCBKb2luIHwgTGF6eUNvbHVtbilbXSk6IFNlbGVjdFF1ZXJ5IHtcbiAgcmV0dXJuIGFkZENsYXVzZXNUb1NlbGVjdChRdWVyeUJ1aWxkZXIuc2VsZWN0KCkuZGlzdGluY3QoKSwgYXJncyk7XG59XG5cbmZ1bmN0aW9uIGFkZENsYXVzZXNUb1NlbGVjdChxdWVyeTogU2VsZWN0UXVlcnksIGFyZ3M6IChGcm9tTGlrZSB8IEpvaW4gfCBMYXp5Q29sdW1uKVtdKTogU2VsZWN0UXVlcnkge1xuICBmb3IgKGxldCBhcmcgb2YgYXJncykge1xuICAgIGlmIChhcmcgaW5zdGFuY2VvZiBKb2luKSB7XG4gICAgICBxdWVyeS5qb2luKGFyZyk7XG4gICAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBGcm9tKSB7XG4gICAgICBxdWVyeS5mcm9tKGFyZyk7XG4gICAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBDb2x1bW4pIHtcbiAgICAgIHF1ZXJ5LmNvbHVtbihhcmcpO1xuICAgIH0gZWxzZSBpZiAoYXJnIGluc3RhbmNlb2YgQWxpYXMpIHtcbiAgICAgIGNvbnN0IHJlZmVyZW50ID0gYXJnLnJlZmVyZW50IGFzIGFueTtcbiAgICAgIGlmIChyZWZlcmVudCBpbnN0YW5jZW9mIEZyb20pIHtcbiAgICAgICAgcXVlcnkuZnJvbShhcmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVlcnkuY29sdW1uKGFyZyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhcmcgJiYgdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgJ3JlZmVyZW50JyBpbiAoYXJnIGFzIGFueSkgJiYgJ2FsaWFzJyBpbiAoYXJnIGFzIGFueSkpIHtcbiAgICAgIC8vIEhhbmRsZSBDb2x1bW5MaWtlIG9iamVjdCBmb3JtXG4gICAgICBxdWVyeS5jb2x1bW4obmV3IEFsaWFzKChhcmcgYXMgYW55KS5yZWZlcmVudCwgKGFyZyBhcyBhbnkpLmFsaWFzKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5LmNvbHVtbihMQVpZKGFyZyBhcyBMYXp5RXhwcmVzc2lvbikpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcXVlcnk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBGUk9NKGFyZzE6IExhenlGcm9tLCBhcmcyPzogc3RyaW5nKTogRnJvbXxBbGlhczxGcm9tPiB7XG4gIC8vIFR3by1hcmd1bWVudCBmb3JtOiBGUk9NKGRhdGFiYXNlLCB0YWJsZSlcbiAgaWYgKHR5cGVvZiBhcmcxID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgYXJnMiA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbmV3IFRhYmxlRnJvbShgJHthcmcxfS4ke2FyZzJ9YCk7XG4gIH1cblxuICAvLyBTaW5nbGUtYXJndW1lbnQgZm9ybSAoZXhpc3RpbmcgYmVoYXZpb3IpXG4gIGlmICh0eXBlb2YgYXJnMSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbmV3IFRhYmxlRnJvbShhcmcxKTtcbiAgfSBlbHNlIGlmIChhcmcxIGluc3RhbmNlb2YgQWxpYXMpIHtcbiAgICByZXR1cm4gYXJnMTtcbiAgfSBlbHNlIGlmIChhcmcxIGluc3RhbmNlb2YgU2VsZWN0UXVlcnkpIHtcbiAgICByZXR1cm4gbmV3IFN1YnF1ZXJ5RnJvbShhcmcxKTtcbiAgfSBlbHNlIGlmIChcbiAgICBhcmcxIGluc3RhbmNlb2YgVGFibGVGcm9tIHx8XG4gICAgYXJnMSBpbnN0YW5jZW9mIFN1YnF1ZXJ5RnJvbSB8fFxuICAgIGFyZzEgaW5zdGFuY2VvZiBKc29uRWFjaEZyb21cbiAgKSB7XG4gICAgcmV0dXJuIGFyZzE7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1bmV4cGVjdGVkIGFyZ3VtZW50IHR5cGUgZm9yIEZST006ICcgKyBKU09OLnN0cmluZ2lmeShhcmcxKSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFVOSU9OKC4uLnF1ZXJpZXM6IFNlbGVjdFF1ZXJ5W10pOiBTZWxlY3RRdWVyeSB7XG4gIGNvbnN0IHF1ZXJ5ID0gUXVlcnlCdWlsZGVyLnNlbGVjdCgpO1xuICBxdWVyaWVzLmZvckVhY2gocSA9PiBxdWVyeS51bmlvbihxKSk7XG4gIHJldHVybiBxdWVyeTtcbn1cblxuLy8gLS0tIEpvaW5zIC0tLVxuXG5leHBvcnQgZnVuY3Rpb24gSk9JTih0YWJsZU5hbWU6IHN0cmluZywgYWxpYXM6IHN0cmluZywgb246IExhenlFeHByZXNzaW9uKTogSm9pbiB7XG4gIHJldHVybiBuZXcgSm9pbihKb2luVHlwZS5JTk5FUiwgdGFibGVOYW1lLCBhbGlhcywgTEFaWShvbikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gTEVGVF9KT0lOKHRhYmxlTmFtZTogc3RyaW5nLCBhbGlhczogc3RyaW5nLCBvbjogTGF6eUV4cHJlc3Npb24pOiBKb2luIHtcbiAgcmV0dXJuIG5ldyBKb2luKEpvaW5UeXBlLkxFRlQsIHRhYmxlTmFtZSwgYWxpYXMsIExBWlkob24pKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIENST1NTX0pPSU4odGFibGVOYW1lOiBzdHJpbmcsIGFsaWFzOiBzdHJpbmcpOiBKb2luIHtcbiAgcmV0dXJuIG5ldyBKb2luKEpvaW5UeXBlLkNST1NTLCB0YWJsZU5hbWUsIGFsaWFzLCBuZXcgU3RyaW5nTGl0ZXJhbCgnVFJVRScpKTtcbn1cblxuLy8gLS0tIFNRTCBGdW5jdGlvbnMgLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBBQlMoY29sdW1uOkV4cHJlc3Npb24pOiBGdW5jdGlvbkV4cHJlc3Npb24ge1xuICByZXR1cm4gbmV3IEZ1bmN0aW9uRXhwcmVzc2lvbignQUJTJywgWyBjb2x1bW4gXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBDT1VOVChjb2x1bW46Q29sdW1ufEZ1bmN0aW9uRXhwcmVzc2lvbnxBbGlhc2FibGVFeHByZXNzaW9uKTogRnVuY3Rpb25FeHByZXNzaW9uIHtcbiAgcmV0dXJuIG5ldyBGdW5jdGlvbkV4cHJlc3Npb24oJ0NPVU5UJywgWyBjb2x1bW4gXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBTVU0oY29sdW1uOkNvbHVtbnxGdW5jdGlvbkV4cHJlc3Npb258QWxpYXNhYmxlRXhwcmVzc2lvbik6IEZ1bmN0aW9uRXhwcmVzc2lvbiB7XG4gIHJldHVybiBuZXcgRnVuY3Rpb25FeHByZXNzaW9uKCdTVU0nLCBbIGNvbHVtbiBdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZOKG5hbWU6IEZ1bmN0aW9uTmFtZSwgLi4uYXJnczogTGF6eUV4cHJlc3Npb25bXSk6IEZ1bmN0aW9uRXhwcmVzc2lvbiB7XG4gIHJldHVybiBuZXcgRnVuY3Rpb25FeHByZXNzaW9uKG5hbWUsIGFyZ3MubWFwKExBWlkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZOX0RJU1RJTkNUKG5hbWU6IEZ1bmN0aW9uTmFtZSwgLi4uYXJnczogTGF6eUV4cHJlc3Npb25bXSk6IEZ1bmN0aW9uRXhwcmVzc2lvbiB7XG4gIHJldHVybiBuZXcgRnVuY3Rpb25FeHByZXNzaW9uKG5hbWUsIGFyZ3MubWFwKExBWlkpLCB0cnVlKTtcbn1cblxuLy8gLS0tIENvbmNhdGVuYXRpb24gLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBDT05DQVQoLi4uYXJnczogTGF6eUV4cHJlc3Npb25bXSk6IENvbmNhdCB7XG4gIHJldHVybiBuZXcgQ29uY2F0KC4uLmFyZ3MubWFwKExBWlkpKTtcbn1cblxuLy8gLS0tIFBhcmFtZXRlcnMgLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBQQVJBTShuYW1lPzogc3RyaW5nKTogUGFyYW0ge1xuICByZXR1cm4gbmV3IFBhcmFtKG5hbWUpO1xufVxuXG4vLyAtLS0gSW5zZXJ0IFF1ZXJpZXMgLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBJTlNFUlQodGFibGVOYW1lOiBzdHJpbmcsIGNvbHVtbnM6IHN0cmluZ1tdLCB2YWx1ZXM6IExhenlFeHByZXNzaW9uW10pOiBJbnNlcnRRdWVyeSB7XG4gIHJldHVybiBRdWVyeUJ1aWxkZXIuaW5zZXJ0SW50byh0YWJsZU5hbWUpXG4gICAgLmNvbHVtbnMoLi4uY29sdW1ucylcbiAgICAudmFsdWVzKC4uLnZhbHVlcy5tYXAoTEFaWSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gSU5TRVJUX09SX1JFUExBQ0UoZGF0YWJhc2U6IHN0cmluZywgdGFibGU6IHN0cmluZywgY29sdW1uczogc3RyaW5nW10sIHZhbHVlczogTGF6eUV4cHJlc3Npb25bXSk6IEluc2VydFF1ZXJ5O1xuZXhwb3J0IGZ1bmN0aW9uIElOU0VSVF9PUl9SRVBMQUNFKHRhYmxlTmFtZTogc3RyaW5nLCBjb2x1bW5zOiBzdHJpbmdbXSwgdmFsdWVzOiBMYXp5RXhwcmVzc2lvbltdKTogSW5zZXJ0UXVlcnk7XG5leHBvcnQgZnVuY3Rpb24gSU5TRVJUX09SX1JFUExBQ0UoYXJnMTogc3RyaW5nLCBhcmcyOiBzdHJpbmcgfCBzdHJpbmdbXSwgYXJnMz86IHN0cmluZ1tdIHwgTGF6eUV4cHJlc3Npb25bXSwgYXJnND86IExhenlFeHByZXNzaW9uW10pOiBJbnNlcnRRdWVyeSB7XG4gIC8vIEZvdXItYXJndW1lbnQgZm9ybTogSU5TRVJUX09SX1JFUExBQ0UoZGF0YWJhc2UsIHRhYmxlLCBjb2x1bW5zLCB2YWx1ZXMpXG4gIGlmICh0eXBlb2YgYXJnMiA9PT0gJ3N0cmluZycgJiYgQXJyYXkuaXNBcnJheShhcmczKSAmJiBBcnJheS5pc0FycmF5KGFyZzQpKSB7XG4gICAgY29uc3QgcXVhbGlmaWVkVGFibGVOYW1lID0gYCR7YXJnMX0uJHthcmcyfWA7XG4gICAgcmV0dXJuIFF1ZXJ5QnVpbGRlci5pbnNlcnRJbnRvKHF1YWxpZmllZFRhYmxlTmFtZSlcbiAgICAgIC5vclJlcGxhY2UoKVxuICAgICAgLmNvbHVtbnMoLi4uKGFyZzMgYXMgc3RyaW5nW10pKVxuICAgICAgLnZhbHVlcyguLi5hcmc0Lm1hcChMQVpZKSk7XG4gIH1cblxuICAvLyBUaHJlZS1hcmd1bWVudCBmb3JtOiBJTlNFUlRfT1JfUkVQTEFDRSh0YWJsZU5hbWUsIGNvbHVtbnMsIHZhbHVlcylcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJnMikgJiYgQXJyYXkuaXNBcnJheShhcmczKSkge1xuICAgIHJldHVybiBRdWVyeUJ1aWxkZXIuaW5zZXJ0SW50byhhcmcxKVxuICAgICAgLm9yUmVwbGFjZSgpXG4gICAgICAuY29sdW1ucyguLi5hcmcyKVxuICAgICAgLnZhbHVlcyguLi4oYXJnMyBhcyBMYXp5RXhwcmVzc2lvbltdKS5tYXAoTEFaWSkpO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50cyBmb3IgSU5TRVJUX09SX1JFUExBQ0UnKTtcbn1cblxuLy8gLS0tIE90aGVyIENsYXVzZXMgLS0tXG5cbi8vIE92ZXJsb2FkcyBmb3IgSU5cbmV4cG9ydCBmdW5jdGlvbiBJTihsZWZ0OiBMYXp5RXhwcmVzc2lvbiwgLi4udmFsdWVzOiBMYXp5RXhwcmVzc2lvbltdKTogSW5FeHByZXNzaW9uO1xuZXhwb3J0IGZ1bmN0aW9uIElOKGxlZnQ6IExhenlFeHByZXNzaW9uLCB2YWx1ZXM6IFNlbGVjdFF1ZXJ5KTogSW5FeHByZXNzaW9uO1xuZXhwb3J0IGZ1bmN0aW9uIElOKGxlZnQ6IExhenlFeHByZXNzaW9uW10sIHZhbHVlczogTGF6eUV4cHJlc3Npb25bXVtdKTogSW5FeHByZXNzaW9uO1xuZXhwb3J0IGZ1bmN0aW9uIElOKGxlZnQ6IExhenlFeHByZXNzaW9uW10sIHZhbHVlczogU2VsZWN0UXVlcnkpOiBJbkV4cHJlc3Npb247XG5cbi8vIEltcGxlbWVudGF0aW9uIGZvciBJTlxuZXhwb3J0IGZ1bmN0aW9uIElOKGxlZnQ6IExhenlFeHByZXNzaW9uIHwgTGF6eUV4cHJlc3Npb25bXSwgLi4uYXJnczogYW55W10pOiBJbkV4cHJlc3Npb24ge1xuICBjb25zdCBub3QgPSBmYWxzZTtcbiAgY29uc3QgcmVzb2x2ZWRMZWZ0ID0gQXJyYXkuaXNBcnJheShsZWZ0KSA/IGxlZnQubWFwKExBWlkpIDogTEFaWShsZWZ0KTtcbiAgbGV0IHJlc29sdmVkVmFsdWVzOiBFeHByZXNzaW9uW11bXSB8IFNlbGVjdFF1ZXJ5O1xuICBpZiAoQXJyYXkuaXNBcnJheShsZWZ0KSkge1xuICAgIC8vIE11bHRpLWNvbHVtbiBjYXNlXG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxICYmIGFyZ3NbMF0gaW5zdGFuY2VvZiBTZWxlY3RRdWVyeSkge1xuICAgICAgcmVzb2x2ZWRWYWx1ZXMgPSBhcmdzWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB2YWx1ZXNBcmcgPSBhcmdzWzBdIGFzIExhenlFeHByZXNzaW9uW11bXTtcbiAgICAgIHJlc29sdmVkVmFsdWVzID0gdmFsdWVzQXJnLm1hcChzZXQgPT4gc2V0Lm1hcChMQVpZKSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFNpbmdsZS1jb2x1bW4gY2FzZVxuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSAmJiBhcmdzWzBdIGluc3RhbmNlb2YgU2VsZWN0UXVlcnkpIHtcbiAgICAgIHJlc29sdmVkVmFsdWVzID0gYXJnc1swXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzb2x2ZWRWYWx1ZXMgPSBhcmdzLm1hcChMQVpZKS5tYXAodiA9PiBbdl0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmV3IEluRXhwcmVzc2lvbihyZXNvbHZlZExlZnQsIHJlc29sdmVkVmFsdWVzLCBub3QpO1xufVxuXG4vLyBPdmVybG9hZHMgZm9yIE5PVF9JTlxuZXhwb3J0IGZ1bmN0aW9uIE5PVF9JTihsZWZ0OiBMYXp5RXhwcmVzc2lvbiwgLi4udmFsdWVzOiBMYXp5RXhwcmVzc2lvbltdKTogSW5FeHByZXNzaW9uO1xuZXhwb3J0IGZ1bmN0aW9uIE5PVF9JTihsZWZ0OiBMYXp5RXhwcmVzc2lvbiwgdmFsdWVzOiBTZWxlY3RRdWVyeSk6IEluRXhwcmVzc2lvbjtcbmV4cG9ydCBmdW5jdGlvbiBOT1RfSU4obGVmdDogTGF6eUV4cHJlc3Npb25bXSwgdmFsdWVzOiBMYXp5RXhwcmVzc2lvbltdW10pOiBJbkV4cHJlc3Npb247XG5leHBvcnQgZnVuY3Rpb24gTk9UX0lOKGxlZnQ6IExhenlFeHByZXNzaW9uW10sIHZhbHVlczogU2VsZWN0UXVlcnkpOiBJbkV4cHJlc3Npb247XG5cbi8vIEltcGxlbWVudGF0aW9uIGZvciBOT1RfSU5cbmV4cG9ydCBmdW5jdGlvbiBOT1RfSU4obGVmdDogTGF6eUV4cHJlc3Npb24gfCBMYXp5RXhwcmVzc2lvbltdLCAuLi5hcmdzOiBhbnlbXSk6IEluRXhwcmVzc2lvbiB7XG4gIGNvbnN0IG5vdCA9IHRydWU7XG4gIGNvbnN0IHJlc29sdmVkTGVmdCA9IEFycmF5LmlzQXJyYXkobGVmdCkgPyBsZWZ0Lm1hcChMQVpZKSA6IExBWlkobGVmdCk7XG4gIGxldCByZXNvbHZlZFZhbHVlczogRXhwcmVzc2lvbltdW10gfCBTZWxlY3RRdWVyeTtcbiAgaWYgKEFycmF5LmlzQXJyYXkobGVmdCkpIHtcbiAgICAvLyBNdWx0aS1jb2x1bW4gY2FzZVxuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSAmJiBhcmdzWzBdIGluc3RhbmNlb2YgU2VsZWN0UXVlcnkpIHtcbiAgICAgIHJlc29sdmVkVmFsdWVzID0gYXJnc1swXTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdmFsdWVzQXJnID0gYXJnc1swXSBhcyBMYXp5RXhwcmVzc2lvbltdW107XG4gICAgICByZXNvbHZlZFZhbHVlcyA9IHZhbHVlc0FyZy5tYXAoc2V0ID0+IHNldC5tYXAoTEFaWSkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBTaW5nbGUtY29sdW1uIGNhc2VcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgYXJnc1swXSBpbnN0YW5jZW9mIFNlbGVjdFF1ZXJ5KSB7XG4gICAgICByZXNvbHZlZFZhbHVlcyA9IGFyZ3NbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc29sdmVkVmFsdWVzID0gYXJncy5tYXAoTEFaWSkubWFwKHYgPT4gW3ZdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5ldyBJbkV4cHJlc3Npb24ocmVzb2x2ZWRMZWZ0LCByZXNvbHZlZFZhbHVlcywgbm90KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEdST1VQX0JZKC4uLmNvbHVtbnM6IChDb2x1bW4gfCBzdHJpbmcpW10pOiBDb2x1bW5bXSB7XG4gIHJldHVybiBjb2x1bW5zLm1hcChjb2wgPT4gKHR5cGVvZiBjb2wgPT09ICdzdHJpbmcnID8gQ09MVU1OKGNvbCkgOiBjb2wpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEhBVklORyhleHByOiBMYXp5RXhwcmVzc2lvbik6IEV4cHJlc3Npb24ge1xuICByZXR1cm4gTEFaWShleHByKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE9SREVSX0JZKGNvbHVtbjogQ29sdW1uIHwgc3RyaW5nLCBkaXJlY3Rpb246IE9yZGVyQnlEaXJlY3Rpb24gPSBPcmRlckJ5RGlyZWN0aW9uLkFTQyk6IE9yZGVyQnkge1xuICByZXR1cm4gbmV3IE9yZGVyQnkodHlwZW9mIGNvbHVtbiA9PT0gJ3N0cmluZycgPyBDT0xVTU4oY29sdW1uKSA6IGNvbHVtbiwgZGlyZWN0aW9uKTtcbn1cblxuLy8gLS0tIENBU0UgRXhwcmVzc2lvbnMgLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBDQVNFKGxhenlDYXNlczogTGF6eUNhc2VJdGVtW10pOiBDYXNlRXhwcmVzc2lvbiB7XG4gIGxldCBlbHNlRXhwcjogRXhwcmVzc2lvbiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgY29uc3QgY2FzZUl0ZW1zOiBDYXNlSXRlbVtdID0gW107XG4gIGZvciAoY29uc3QgYyBvZiBsYXp5Q2FzZXMpIHtcbiAgICBpZiAoYy5XSEVOICE9PSB1bmRlZmluZWQgJiYgYy5USEVOICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChlbHNlRXhwcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VMU0UgbXVzdCBiZSB0aGUgbGFzdCBjbGF1c2UgaW4gYSBDQVNFIGV4cHJlc3Npb24nKTtcbiAgICAgIH1cbiAgICAgIGNhc2VJdGVtcy5wdXNoKHsgd2hlbjogTEFaWShjLldIRU4pLCB0aGVuOiBMQVpZKGMuVEhFTikgfSk7XG4gICAgfSBlbHNlIGlmIChjLkVMU0UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGVsc2VFeHByKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ0FTRSBleHByZXNzaW9uIGNhbiBvbmx5IGhhdmUgb25lIEVMU0UgY2xhdXNlJyk7XG4gICAgICB9XG4gICAgICBlbHNlRXhwciA9IExBWlkoYy5FTFNFKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5ldyBDYXNlRXhwcmVzc2lvbihjYXNlSXRlbXMsIGVsc2VFeHByKTtcbn1cblxuLy8gLS0tIFN1YnF1ZXJpZXMgYW5kIFdJVEggQ2xhdXNlcyAtLS1cblxuZXhwb3J0IGZ1bmN0aW9uIFdJVEgobmFtZTogc3RyaW5nLCBxdWVyeTogU2VsZWN0UXVlcnkpOiBXaXRoIHtcbiAgcmV0dXJuIG5ldyBXaXRoKG5hbWUsIHF1ZXJ5KTtcbn1cblxuLy8gLS0tIExpdGVyYWwgQ29udmVyc2lvbiAtLS1cblxuZnVuY3Rpb24gTEFaWSh2YWx1ZTogTGF6eUV4cHJlc3Npb24pOiBBbGlhc2FibGVFeHByZXNzaW9uIHtcbiAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIE51bGxMaXRlcmFsLklOU1RBTkNFO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIG5ldyBOdW1iZXJMaXRlcmFsKHZhbHVlID8gMSA6IDApO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbmV3IFN0cmluZ0xpdGVyYWwodmFsdWUpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gbmV3IE51bWJlckxpdGVyYWwodmFsdWUpO1xuICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQWxpYXNhYmxlRXhwcmVzc2lvbikge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHZhbHVlIHR5cGU6ICR7dHlwZW9mIHZhbHVlfWApO1xuICB9XG59XG4iXX0=
|
|
499
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2hvcnRoYW5kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2J1aWxkZXIvU2hvcnRoYW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBNkNBLGtCQUVDO0FBSUQsZ0JBRUM7QUFFRCx3QkFFQztBQUVELGtCQUVDO0FBRUQsZ0JBRUM7QUFFRCxnQkFFQztBQUVELGtCQUVDO0FBRUQsa0JBRUM7QUFFRCxvQkFFQztBQUVELG9CQUVDO0FBRUQsc0JBRUM7QUFFRCwwQkFFQztBQUVELGtDQUVDO0FBRUQsMEJBRUM7QUFFRCxrQ0FFQztBQUVELG9CQU1DO0FBRUQsc0JBTUM7QUFFRCw0QkFFQztBQUVELHdCQUVDO0FBRUQsa0JBT0M7QUFFRCxnQkFPQztBQUlELHdCQUVDO0FBSUQsd0JBRUM7QUFJRCx3QkFFQztBQUVELDBDQUVDO0FBMkJELG9CQXNCQztBQUVELHNCQUlDO0FBRUQsOEJBSUM7QUFFRCx3QkFJQztBQUlELG9CQUVDO0FBRUQsOEJBRUM7QUFFRCxnQ0FFQztBQUlELGtCQUVDO0FBRUQsc0JBRUM7QUFFRCxrQkFFQztBQUVELGdCQUVDO0FBRUQsa0NBRUM7QUFJRCx3QkFFQztBQUlELHNCQUVDO0FBSUQsd0JBSUM7QUFFRCxrQ0FFQztBQUlELDhDQW1CQztBQVdELGdCQXFCQztBQVNELHdCQXFCQztBQUVELDRCQUVDO0FBRUQsd0JBRUM7QUFFRCw0QkFFQztBQWdCRCxvQ0FFQztBQUlELG9CQWlCQztBQUlELG9CQUVDO0FBSUQsa0NBRUM7QUFJRCx3QkFFQztBQUlELG9DQUVDO0FBSUQsb0RBRUM7QUFJRCxvQ0FFQztBQUlELGtDQUVDO0FBSUQsZ0NBRUM7QUFFRCxnQ0FFQztBQUlELGtDQUVDO0FBRUQsOEJBRUM7QUFNRCxzQkFLQztBQUlELG9CQUVDO0FBSUQsMEJBRUM7QUFJRCw0QkFFQztBQTNnQkQsc0RBQXNFO0FBQ3RFLHdDQUFxQztBQUNyQyxnRUFBNkQ7QUFDN0QsOERBQTJEO0FBQzNELDBEQUFpRTtB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SUFDbEMsQ0FBQztTQUFNLElBQUksS0FBSyxZQUFZLGtDQUFtQixFQUFFLENBQUM7UUFDaEQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLE9BQU8sS0FBSyxFQUFFLENBQUMsQ0FBQztJQUM3RCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFsaWFzYWJsZUV4cHJlc3Npb24sIEV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L0Fic3RyYWN0aW9uc1wiO1xuaW1wb3J0IHsgQWxpYXMgfSBmcm9tIFwiLi4vYXN0L0FsaWFzXCI7XG5pbXBvcnQgeyBCZXR3ZWVuRXhwcmVzc2lvbiB9IGZyb20gXCIuLi9hc3QvQmV0d2VlbkV4cHJlc3Npb25cIjtcbmltcG9ydCB7IEJpbmFyeUV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L0JpbmFyeUV4cHJlc3Npb25cIjtcbmltcG9ydCB7IENhc2VFeHByZXNzaW9uLCBDYXNlSXRlbSB9IGZyb20gXCIuLi9hc3QvQ2FzZUV4cHJlc3Npb25cIjtcbmltcG9ydCB7IENhc3RFeHByZXNzaW9uIH0gZnJvbSBcIi4uL2FzdC9DYXN0RXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgQ29sbGF0ZUV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L0NvbGxhdGVFeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBTdWJxdWVyeUV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L1N1YnF1ZXJ5RXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgQ29sdW1uLCBDb2x1bW5MaWtlIH0gZnJvbSBcIi4uL2FzdC9Db2x1bW5cIjtcbmltcG9ydCB7IENvbmNhdCB9IGZyb20gXCIuLi9hc3QvQ29uY2F0XCI7XG5pbXBvcnQgeyBBbHRlclRhYmxlUXVlcnkgfSBmcm9tIFwiLi4vYXN0L0FsdGVyVGFibGVRdWVyeVwiO1xuaW1wb3J0IHsgQ3JlYXRlSW5kZXhRdWVyeSB9IGZyb20gXCIuLi9hc3QvQ3JlYXRlSW5kZXhRdWVyeVwiO1xuaW1wb3J0IHsgQ3JlYXRlVGFibGVRdWVyeSB9IGZyb20gXCIuLi9hc3QvQ3JlYXRlVGFibGVRdWVyeVwiO1xuaW1wb3J0IHsgQ3JlYXRlVmlydHVhbFRhYmxlUXVlcnksIFZpcnR1YWxUYWJsZU1vZHVsZSB9IGZyb20gXCIuLi9hc3QvQ3JlYXRlVmlydHVhbFRhYmxlUXVlcnlcIjtcbmltcG9ydCB7IENyZWF0ZVZpZXdRdWVyeSB9IGZyb20gXCIuLi9hc3QvQ3JlYXRlVmlld1F1ZXJ5XCI7XG5pbXBvcnQgeyBEZWxldGVRdWVyeSB9IGZyb20gXCIuLi9hc3QvRGVsZXRlUXVlcnlcIjtcbmltcG9ydCB7IERyb3BJbmRleFF1ZXJ5IH0gZnJvbSBcIi4uL2FzdC9Ecm9wSW5kZXhRdWVyeVwiO1xuaW1wb3J0IHsgRHJvcFRhYmxlUXVlcnkgfSBmcm9tIFwiLi4vYXN0L0Ryb3BUYWJsZVF1ZXJ5XCI7XG5pbXBvcnQgeyBEcm9wVmlld1F1ZXJ5IH0gZnJvbSBcIi4uL2FzdC9Ecm9wVmlld1F1ZXJ5XCI7XG5pbXBvcnQgeyBVcGRhdGVRdWVyeSB9IGZyb20gXCIuLi9hc3QvVXBkYXRlUXVlcnlcIjtcbmltcG9ydCB7IEV4aXN0c0V4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L0V4aXN0c0V4cHJlc3Npb25cIjtcbmltcG9ydCB7IEZyb20sIEZyb21MaWtlLCBKc29uRWFjaEZyb20sIFN1YnF1ZXJ5RnJvbSwgVGFibGVGcm9tIH0gZnJvbSBcIi4uL2FzdC9Gcm9tXCI7XG5pbXBvcnQgeyBGdW5jdGlvbkV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L0Z1bmN0aW9uRXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgRnVuY3Rpb25OYW1lIH0gZnJvbSBcIi4uL2FzdC9GdW5jdGlvbk5hbWVcIjtcbmltcG9ydCB7IEluRXhwcmVzc2lvbiB9IGZyb20gXCIuLi9hc3QvSW5FeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBJbnNlcnRRdWVyeSB9IGZyb20gXCIuLi9hc3QvSW5zZXJ0UXVlcnlcIjtcbmltcG9ydCB7IEpvaW4sIEpvaW5UeXBlIH0gZnJvbSBcIi4uL2FzdC9Kb2luXCI7XG5pbXBvcnQgeyBOdWxsTGl0ZXJhbCwgTnVtYmVyTGl0ZXJhbCwgUGFyYW0sIFN0cmluZ0xpdGVyYWwgfSBmcm9tIFwiLi4vYXN0L0xpdGVyYWxzXCI7XG5pbXBvcnQgeyBPcGVyYXRvciB9IGZyb20gXCIuLi9hc3QvT3BlcmF0b3JcIjtcbmltcG9ydCB7IE9yZGVyQnksIE9yZGVyQnlEaXJlY3Rpb24gfSBmcm9tIFwiLi4vYXN0L09yZGVyQnlcIjtcbmltcG9ydCB7IFNlbGVjdFF1ZXJ5IH0gZnJvbSBcIi4uL2FzdC9TZWxlY3RRdWVyeVwiO1xuaW1wb3J0IHsgVW5hcnlFeHByZXNzaW9uIH0gZnJvbSBcIi4uL2FzdC9VbmFyeUV4cHJlc3Npb25cIjtcbmltcG9ydCB7IFdpdGggfSBmcm9tIFwiLi4vYXN0L1dpdGhcIjtcbmltcG9ydCB7IFF1ZXJ5QnVpbGRlciB9IGZyb20gXCIuL1F1ZXJ5QnVpbGRlclwiO1xuXG50eXBlIFByaW1pdGl2ZVZhbHVlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGw7XG5cbnR5cGUgTGF6eUV4cHJlc3Npb24gPSBFeHByZXNzaW9uIHwgUHJpbWl0aXZlVmFsdWU7XG5cbnR5cGUgTGF6eUNhc2VJdGVtID0geyBXSEVOPzogTGF6eUV4cHJlc3Npb247IFRIRU4/OiBMYXp5RXhwcmVzc2lvbjsgRUxTRT86IExhenlFeHByZXNzaW9uIH07XG5cbnR5cGUgTGF6eUZyb20gPSBzdHJpbmcgfCBGcm9tIHwgQWxpYXM8RnJvbT4gfCBTZWxlY3RRdWVyeTtcblxudHlwZSBMYXp5Q29sdW1uID0gQ29sdW1uTGlrZSB8IFByaW1pdGl2ZVZhbHVlO1xuXG5leHBvcnQgZnVuY3Rpb24gVkFMKHZhbDogUHJpbWl0aXZlVmFsdWUpOiBBbGlhc2FibGVFeHByZXNzaW9uIHtcbiAgcmV0dXJuIExBWlkodmFsKTtcbn1cblxuLy8gLS0tIE9wZXJhdG9ycyAtLS1cblxuZXhwb3J0IGZ1bmN0aW9uIEVRKGxlZnQ6IExhenlFeHByZXNzaW9uLCByaWdodDogTGF6eUV4cHJlc3Npb24pOiBCaW5hcnlFeHByZXNzaW9uIHtcbiAgcmV0dXJuIG5ldyBCaW5hcnlFeHByZXNzaW9uKExBWlkobGVmdCksIE9wZXJhdG9yLkVRVUFMUywgTEFaWShyaWdodCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gTk9UX0VRKGxlZnQ6IExhenlFeHByZXNzaW9uLCByaWdodDogTGF6eUV4cHJlc3Npb24pOiBCaW5hcnlFeHByZXNzaW9uIHtcbiAgcmV0dXJuIG5ldyBCaW5hcnlFeHByZXNzaW9uKExBWlkobGVmdCksIE9wZXJhdG9yLk5PVF9FUVVBTFMsIExBWlkocmlnaHQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE5PVChleHByOiBMYXp5RXhwcmVzc2lvbik6IFVuYXJ5RXhwcmVzc2lvbiB7XG4gIHJldHVybiBuZXcgVW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yLk5PVCwgTEFaWShleHByKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBHVChsZWZ0OiBMYXp5RXhwcmVzc2lvbiwgcmlnaHQ6IExhenlFeHByZXNzaW9uKTogQmluYXJ5RXhwcmVzc2lvbiB7XG4gIHJldHVybiBuZXcgQmluYXJ5RXhwcmVzc2lvbihMQVpZKGxlZnQpLCBPcGVyYXRvci5HUkVBVEVSX1RIQU4sIExBWlkocmlnaHQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIExUKGxlZnQ6IExhenlFeHByZXNzaW9uLCByaWdodDogTGF6eUV4cHJlc3Npb24pOiBCaW5hcnlFeHByZXNzaW9uIHtcbiAgcmV0dXJuIG5ldyBCaW5hcnlFeHByZXNzaW9uKExBWlkobGVmdCksIE9wZXJhdG9yLkxFU1NfVEhBTiwgTEFaWShyaWdodCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gR1RFKGxlZnQ6IExhenlFeHByZXNzaW9uLCByaWdodDogTGF6eUV4cHJlc3Npb24pOiBCaW5hcnlFeHByZXNzaW9uIHtcbiAgcmV0dXJuIG5ldyBCaW5hcnlFeHByZXNzaW9uKExBWlkobGVmdCksIE9wZXJhdG9yLkdSRUFURVJfVEhBTl9PUl9FUVVBTCwgTEFaWShyaWdodCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gTFRFKGxlZnQ6IExhenlFeHByZXNzaW9uLCByaWdodDogTGF6eUV4cHJlc3Npb24pOiBCaW5hcnlFeHByZXNzaW9uIHtcbiAgcmV0dXJuIG5ldyBCaW5hcnlFeHByZXNzaW9uKExBWlkobGVmdCksIE9wZXJhdG9yLkxFU1NfVEhBTl9PUl9FUVVBTCwgTEFaWShyaWdodCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gTElLRShsZWZ0OiBMYXp5RXhwcmVzc2lvbiwgcmlnaHQ6IExhenlFeHByZXNzaW9uKTogQmluYXJ5RXhwcmVzc2lvbiB7XG4gIHJldHVybiBuZXcgQmluYXJ5RXhwcmVzc2lvbihMQVpZKGxlZnQpLCBPcGVyYXRvci5MSUtFLCBMQVpZKHJpZ2h0KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBHTE9CKGxlZnQ6IExhenlFeHByZXNzaW9uLCByaWdodDogTGF6eUV4cHJlc3Npb24pOiBCaW5hcnlFeHByZXNzaW9uIHtcbiAgcmV0dXJuIG5ldyBCaW5hcnlFeHByZXNzaW9uKExBWlkobGVmdCksIE9wZXJhdG9yLkdMT0IsIExBWlkocmlnaHQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE1BVENIKGxlZnQ6IExhenlFeHByZXNzaW9uLCByaWdodDogTGF6eUV4cHJlc3Npb24pOiBCaW5hcnlFeHByZXNzaW9uIHtcbiAgcmV0dXJuIG5ldyBCaW5hcnlFeHByZXNzaW9uKExBWlkobGVmdCksIE9wZXJhdG9yLk1BVENILCBMQVpZKHJpZ2h0KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBCRVRXRUVOKG9wZXJhbmQ6IExhenlFeHByZXNzaW9uLCBsb3c6IExhenlFeHByZXNzaW9uLCBoaWdoOiBMYXp5RXhwcmVzc2lvbik6IEJldHdlZW5FeHByZXNzaW9uIHtcbiAgcmV0dXJuIG5ldyBCZXR3ZWVuRXhwcmVzc2lvbihMQVpZKG9wZXJhbmQpLCBMQVpZKGxvdyksIExBWlkoaGlnaCksIGZhbHNlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE5PVF9CRVRXRUVOKG9wZXJhbmQ6IExhenlFeHByZXNzaW9uLCBsb3c6IExhenlFeHByZXNzaW9uLCBoaWdoOiBMYXp5RXhwcmVzc2lvbik6IEJldHdlZW5FeHByZXNzaW9uIHtcbiAgcmV0dXJuIG5ldyBCZXR3ZWVuRXhwcmVzc2lvbihMQVpZKG9wZXJhbmQpLCBMQVpZKGxvdyksIExBWlkoaGlnaCksIHRydWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gSVNfTlVMTChleHByOiBMYXp5RXhwcmVzc2lvbik6IFVuYXJ5RXhwcmVzc2lvbiB7XG4gIHJldHVybiBuZXcgVW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yLklTX05VTEwsIExBWlkoZXhwcikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gSVNfTk9UX05VTEwoZXhwcjogTGF6eUV4cHJlc3Npb24pOiBVbmFyeUV4cHJlc3Npb24ge1xuICByZXR1cm4gbmV3IFVuYXJ5RXhwcmVzc2lvbihPcGVyYXRvci5JU19OT1RfTlVMTCwgTEFaWShleHByKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBQTFVTKGxlZnQ6IExhenlFeHByZXNzaW9uLCByaWdodD86IExhenlFeHByZXNzaW9uKTogQWxpYXNhYmxlRXhwcmVzc2lvbiB7XG4gIGlmIChyaWdodCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG5ldyBVbmFyeUV4cHJlc3Npb24oT3BlcmF0b3IuUExVUywgTEFaWShsZWZ0KSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBCaW5hcnlFeHByZXNzaW9uKExBWlkobGVmdCksIE9wZXJhdG9yLlBMVVMsIExBWlkocmlnaHQpKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gTUlOVVMobGVmdDogTGF6eUV4cHJlc3Npb24sIHJpZ2h0PzogTGF6eUV4cHJlc3Npb24pOiBBbGlhc2FibGVFeHByZXNzaW9uIHtcbiAgaWYgKHJpZ2h0ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbmV3IFVuYXJ5RXhwcmVzc2lvbihPcGVyYXRvci5NSU5VUywgTEFaWShsZWZ0KSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBCaW5hcnlFeHByZXNzaW9uKExBWlkobGVmdCksIE9wZXJhdG9yLk1JTlVTLCBMQVpZKHJpZ2h0KSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE1VTFRJUExZKGxlZnQ6IExhenlFeHByZXNzaW9uLCByaWdodDogTGF6eUV4cHJlc3Npb24pOiBCaW5hcnlFeHByZXNzaW9uIHtcbiAgcmV0dXJuIG5ldyBCaW5hcnlFeHByZXNzaW9uKExBWlkobGVmdCksIE9wZXJhdG9yLk1VTFRJUExZLCBMQVpZKHJpZ2h0KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBESVZJREUobGVmdDogTGF6eUV4cHJlc3Npb24sIHJpZ2h0OiBMYXp5RXhwcmVzc2lvbik6IEJpbmFyeUV4cHJlc3Npb24ge1xuICByZXR1cm4gbmV3IEJpbmFyeUV4cHJlc3Npb24oTEFaWShsZWZ0KSwgT3BlcmF0b3IuRElWSURFLCBMQVpZKHJpZ2h0KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBBTkQoLi4uYXJnczogTGF6eUV4cHJlc3Npb25bXSk6IEFsaWFzYWJsZUV4cHJlc3Npb24ge1xuICBpZiAoYXJncy5sZW5ndGggPT0gMSkge1xuICAgIHJldHVybiBMQVpZKGFyZ3NbMF0pXG4gIH0gaWYgKGFyZ3MubGVuZ3RoIDwgMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQU5EIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBhcmd1bWVudHMnKTtcbiAgfVxuICByZXR1cm4gYXJncy5yZWR1Y2UoKGxlZnQsIHJpZ2h0KSA9PiBuZXcgQmluYXJ5RXhwcmVzc2lvbihMQVpZKGxlZnQpLCBPcGVyYXRvci5BTkQsIExBWlkocmlnaHQpKSkgYXMgQWxpYXNhYmxlRXhwcmVzc2lvbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE9SKC4uLmFyZ3M6IExhenlFeHByZXNzaW9uW10pOiBBbGlhc2FibGVFeHByZXNzaW9uIHtcbiAgaWYgKGFyZ3MubGVuZ3RoID09IDEpIHtcbiAgICByZXR1cm4gTEFaWShhcmdzWzBdKVxuICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoIDwgMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignT1IgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGFyZ3VtZW50cycpO1xuICB9XG4gIHJldHVybiBhcmdzLnJlZHVjZSgobGVmdCwgcmlnaHQpID0+IG5ldyBCaW5hcnlFeHByZXNzaW9uKExBWlkobGVmdCksIE9wZXJhdG9yLk9SLCBMQVpZKHJpZ2h0KSkpIGFzIEFsaWFzYWJsZUV4cHJlc3Npb247XG59XG5cbi8vIC0tLSBFWElTVFMgLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBFWElTVFMoc3VicXVlcnk6IFNlbGVjdFF1ZXJ5KTogRXhpc3RzRXhwcmVzc2lvbiB7XG4gIHJldHVybiBuZXcgRXhpc3RzRXhwcmVzc2lvbihzdWJxdWVyeSk7XG59XG5cbi8vIC0tLSBDb2x1bW5zIC0tLVxuXG5leHBvcnQgZnVuY3Rpb24gQ09MVU1OKGFyZzE6IHN0cmluZywgYXJnMj86IHN0cmluZyk6IENvbHVtbiB7XG4gIHJldHVybiBuZXcgQ29sdW1uKGFyZzEsIGFyZzIpO1xufVxuXG4vLyAtLS0gU2VsZWN0IFF1ZXJpZXMgLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBTRUxFQ1QoLi4uYXJnczogKEZyb21MaWtlIHwgSm9pbiB8IExhenlDb2x1bW4pW10pOiBTZWxlY3RRdWVyeSB7XG4gIHJldHVybiBhZGRDbGF1c2VzVG9TZWxlY3QoUXVlcnlCdWlsZGVyLnNlbGVjdCgpLCBhcmdzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFNFTEVDVF9ESVNUSU5DVCguLi5hcmdzOiAoRnJvbUxpa2UgfCBKb2luIHwgTGF6eUNvbHVtbilbXSk6IFNlbGVjdFF1ZXJ5IHtcbiAgcmV0dXJuIGFkZENsYXVzZXNUb1NlbGVjdChRdWVyeUJ1aWxkZXIuc2VsZWN0KCkuZGlzdGluY3QoKSwgYXJncyk7XG59XG5cbmZ1bmN0aW9uIGFkZENsYXVzZXNUb1NlbGVjdChxdWVyeTogU2VsZWN0UXVlcnksIGFyZ3M6IChGcm9tTGlrZSB8IEpvaW4gfCBMYXp5Q29sdW1uKVtdKTogU2VsZWN0UXVlcnkge1xuICBmb3IgKGxldCBhcmcgb2YgYXJncykge1xuICAgIGlmIChhcmcgaW5zdGFuY2VvZiBKb2luKSB7XG4gICAgICBxdWVyeS5qb2luKGFyZyk7XG4gICAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBGcm9tKSB7XG4gICAgICBxdWVyeS5mcm9tKGFyZyk7XG4gICAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBDb2x1bW4pIHtcbiAgICAgIHF1ZXJ5LmNvbHVtbihhcmcpO1xuICAgIH0gZWxzZSBpZiAoYXJnIGluc3RhbmNlb2YgQWxpYXMpIHtcbiAgICAgIGNvbnN0IHJlZmVyZW50ID0gYXJnLnJlZmVyZW50IGFzIGFueTtcbiAgICAgIGlmIChyZWZlcmVudCBpbnN0YW5jZW9mIEZyb20pIHtcbiAgICAgICAgcXVlcnkuZnJvbShhcmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVlcnkuY29sdW1uKGFyZyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhcmcgJiYgdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgJ3JlZmVyZW50JyBpbiAoYXJnIGFzIGFueSkgJiYgJ2FsaWFzJyBpbiAoYXJnIGFzIGFueSkpIHtcbiAgICAgIC8vIEhhbmRsZSBDb2x1bW5MaWtlIG9iamVjdCBmb3JtXG4gICAgICBxdWVyeS5jb2x1bW4obmV3IEFsaWFzKChhcmcgYXMgYW55KS5yZWZlcmVudCwgKGFyZyBhcyBhbnkpLmFsaWFzKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5LmNvbHVtbihMQVpZKGFyZyBhcyBMYXp5RXhwcmVzc2lvbikpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcXVlcnk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBGUk9NKGFyZzE6IExhenlGcm9tLCBhcmcyPzogc3RyaW5nKTogRnJvbXxBbGlhczxGcm9tPiB7XG4gIC8vIFR3by1hcmd1bWVudCBmb3JtOiBGUk9NKGRhdGFiYXNlLCB0YWJsZSlcbiAgaWYgKHR5cGVvZiBhcmcxID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgYXJnMiA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbmV3IFRhYmxlRnJvbShgJHthcmcxfS4ke2FyZzJ9YCk7XG4gIH1cblxuICAvLyBTaW5nbGUtYXJndW1lbnQgZm9ybSAoZXhpc3RpbmcgYmVoYXZpb3IpXG4gIGlmICh0eXBlb2YgYXJnMSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbmV3IFRhYmxlRnJvbShhcmcxKTtcbiAgfSBlbHNlIGlmIChhcmcxIGluc3RhbmNlb2YgQWxpYXMpIHtcbiAgICByZXR1cm4gYXJnMTtcbiAgfSBlbHNlIGlmIChhcmcxIGluc3RhbmNlb2YgU2VsZWN0UXVlcnkpIHtcbiAgICByZXR1cm4gbmV3IFN1YnF1ZXJ5RnJvbShhcmcxKTtcbiAgfSBlbHNlIGlmIChcbiAgICBhcmcxIGluc3RhbmNlb2YgVGFibGVGcm9tIHx8XG4gICAgYXJnMSBpbnN0YW5jZW9mIFN1YnF1ZXJ5RnJvbSB8fFxuICAgIGFyZzEgaW5zdGFuY2VvZiBKc29uRWFjaEZyb21cbiAgKSB7XG4gICAgcmV0dXJuIGFyZzE7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1bmV4cGVjdGVkIGFyZ3VtZW50IHR5cGUgZm9yIEZST006ICcgKyBKU09OLnN0cmluZ2lmeShhcmcxKSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFVOSU9OKC4uLnF1ZXJpZXM6IFNlbGVjdFF1ZXJ5W10pOiBTZWxlY3RRdWVyeSB7XG4gIGNvbnN0IHF1ZXJ5ID0gUXVlcnlCdWlsZGVyLnNlbGVjdCgpO1xuICBxdWVyaWVzLmZvckVhY2gocSA9PiBxdWVyeS51bmlvbihxKSk7XG4gIHJldHVybiBxdWVyeTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIElOVEVSU0VDVCguLi5xdWVyaWVzOiBTZWxlY3RRdWVyeVtdKTogU2VsZWN0UXVlcnkge1xuICBjb25zdCBxdWVyeSA9IFF1ZXJ5QnVpbGRlci5zZWxlY3QoKTtcbiAgcXVlcmllcy5mb3JFYWNoKHEgPT4gcXVlcnkuaW50ZXJzZWN0KHEpKTtcbiAgcmV0dXJuIHF1ZXJ5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRVhDRVBUKC4uLnF1ZXJpZXM6IFNlbGVjdFF1ZXJ5W10pOiBTZWxlY3RRdWVyeSB7XG4gIGNvbnN0IHF1ZXJ5ID0gUXVlcnlCdWlsZGVyLnNlbGVjdCgpO1xuICBxdWVyaWVzLmZvckVhY2gocSA9PiBxdWVyeS5leGNlcHQocSkpO1xuICByZXR1cm4gcXVlcnk7XG59XG5cbi8vIC0tLSBKb2lucyAtLS1cblxuZXhwb3J0IGZ1bmN0aW9uIEpPSU4odGFibGVOYW1lOiBzdHJpbmcsIGFsaWFzOiBzdHJpbmcsIG9uOiBMYXp5RXhwcmVzc2lvbik6IEpvaW4ge1xuICByZXR1cm4gbmV3IEpvaW4oSm9pblR5cGUuSU5ORVIsIHRhYmxlTmFtZSwgYWxpYXMsIExBWlkob24pKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIExFRlRfSk9JTih0YWJsZU5hbWU6IHN0cmluZywgYWxpYXM6IHN0cmluZywgb246IExhenlFeHByZXNzaW9uKTogSm9pbiB7XG4gIHJldHVybiBuZXcgSm9pbihKb2luVHlwZS5MRUZULCB0YWJsZU5hbWUsIGFsaWFzLCBMQVpZKG9uKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBDUk9TU19KT0lOKHRhYmxlTmFtZTogc3RyaW5nLCBhbGlhczogc3RyaW5nKTogSm9pbiB7XG4gIHJldHVybiBuZXcgSm9pbihKb2luVHlwZS5DUk9TUywgdGFibGVOYW1lLCBhbGlhcywgbmV3IFN0cmluZ0xpdGVyYWwoJ1RSVUUnKSk7XG59XG5cbi8vIC0tLSBTUUwgRnVuY3Rpb25zIC0tLVxuXG5leHBvcnQgZnVuY3Rpb24gQUJTKGNvbHVtbjpFeHByZXNzaW9uKTogRnVuY3Rpb25FeHByZXNzaW9uIHtcbiAgcmV0dXJuIG5ldyBGdW5jdGlvbkV4cHJlc3Npb24oJ0FCUycsIFsgY29sdW1uIF0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gQ09VTlQoY29sdW1uOkNvbHVtbnxGdW5jdGlvbkV4cHJlc3Npb258QWxpYXNhYmxlRXhwcmVzc2lvbik6IEZ1bmN0aW9uRXhwcmVzc2lvbiB7XG4gIHJldHVybiBuZXcgRnVuY3Rpb25FeHByZXNzaW9uKCdDT1VOVCcsIFsgY29sdW1uIF0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gU1VNKGNvbHVtbjpDb2x1bW58RnVuY3Rpb25FeHByZXNzaW9ufEFsaWFzYWJsZUV4cHJlc3Npb24pOiBGdW5jdGlvbkV4cHJlc3Npb24ge1xuICByZXR1cm4gbmV3IEZ1bmN0aW9uRXhwcmVzc2lvbignU1VNJywgWyBjb2x1bW4gXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBGTihuYW1lOiBGdW5jdGlvbk5hbWUsIC4uLmFyZ3M6IExhenlFeHByZXNzaW9uW10pOiBGdW5jdGlvbkV4cHJlc3Npb24ge1xuICByZXR1cm4gbmV3IEZ1bmN0aW9uRXhwcmVzc2lvbihuYW1lLCBhcmdzLm1hcChMQVpZKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBGTl9ESVNUSU5DVChuYW1lOiBGdW5jdGlvbk5hbWUsIC4uLmFyZ3M6IExhenlFeHByZXNzaW9uW10pOiBGdW5jdGlvbkV4cHJlc3Npb24ge1xuICByZXR1cm4gbmV3IEZ1bmN0aW9uRXhwcmVzc2lvbihuYW1lLCBhcmdzLm1hcChMQVpZKSwgdHJ1ZSk7XG59XG5cbi8vIC0tLSBDb25jYXRlbmF0aW9uIC0tLVxuXG5leHBvcnQgZnVuY3Rpb24gQ09OQ0FUKC4uLmFyZ3M6IExhenlFeHByZXNzaW9uW10pOiBDb25jYXQge1xuICByZXR1cm4gbmV3IENvbmNhdCguLi5hcmdzLm1hcChMQVpZKSk7XG59XG5cbi8vIC0tLSBQYXJhbWV0ZXJzIC0tLVxuXG5leHBvcnQgZnVuY3Rpb24gUEFSQU0obmFtZT86IHN0cmluZyk6IFBhcmFtIHtcbiAgcmV0dXJuIG5ldyBQYXJhbShuYW1lKTtcbn1cblxuLy8gLS0tIEluc2VydCBRdWVyaWVzIC0tLVxuXG5leHBvcnQgZnVuY3Rpb24gSU5TRVJUKHRhYmxlTmFtZTogc3RyaW5nLCBjb2x1bW5zOiBzdHJpbmdbXSwgdmFsdWVzOiBMYXp5RXhwcmVzc2lvbltdKTogSW5zZXJ0UXVlcnkge1xuICByZXR1cm4gUXVlcnlCdWlsZGVyLmluc2VydEludG8odGFibGVOYW1lKVxuICAgIC5jb2x1bW5zKC4uLmNvbHVtbnMpXG4gICAgLnZhbHVlcyguLi52YWx1ZXMubWFwKExBWlkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIElOU0VSVF9JTlRPKHRhYmxlTmFtZTogc3RyaW5nKTogSW5zZXJ0UXVlcnkge1xuICByZXR1cm4gUXVlcnlCdWlsZGVyLmluc2VydEludG8odGFibGVOYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIElOU0VSVF9PUl9SRVBMQUNFKGRhdGFiYXNlOiBzdHJpbmcsIHRhYmxlOiBzdHJpbmcsIGNvbHVtbnM6IHN0cmluZ1tdLCB2YWx1ZXM6IExhenlFeHByZXNzaW9uW10pOiBJbnNlcnRRdWVyeTtcbmV4cG9ydCBmdW5jdGlvbiBJTlNFUlRfT1JfUkVQTEFDRSh0YWJsZU5hbWU6IHN0cmluZywgY29sdW1uczogc3RyaW5nW10sIHZhbHVlczogTGF6eUV4cHJlc3Npb25bXSk6IEluc2VydFF1ZXJ5O1xuZXhwb3J0IGZ1bmN0aW9uIElOU0VSVF9PUl9SRVBMQUNFKGFyZzE6IHN0cmluZywgYXJnMjogc3RyaW5nIHwgc3RyaW5nW10sIGFyZzM/OiBzdHJpbmdbXSB8IExhenlFeHByZXNzaW9uW10sIGFyZzQ/OiBMYXp5RXhwcmVzc2lvbltdKTogSW5zZXJ0UXVlcnkge1xuICAvLyBGb3VyLWFyZ3VtZW50IGZvcm06IElOU0VSVF9PUl9SRVBMQUNFKGRhdGFiYXNlLCB0YWJsZSwgY29sdW1ucywgdmFsdWVzKVxuICBpZiAodHlwZW9mIGFyZzIgPT09ICdzdHJpbmcnICYmIEFycmF5LmlzQXJyYXkoYXJnMykgJiYgQXJyYXkuaXNBcnJheShhcmc0KSkge1xuICAgIGNvbnN0IHF1YWxpZmllZFRhYmxlTmFtZSA9IGAke2FyZzF9LiR7YXJnMn1gO1xuICAgIHJldHVybiBRdWVyeUJ1aWxkZXIuaW5zZXJ0SW50byhxdWFsaWZpZWRUYWJsZU5hbWUpXG4gICAgICAub3JSZXBsYWNlKClcbiAgICAgIC5jb2x1bW5zKC4uLihhcmczIGFzIHN0cmluZ1tdKSlcbiAgICAgIC52YWx1ZXMoLi4uYXJnNC5tYXAoTEFaWSkpO1xuICB9XG5cbiAgLy8gVGhyZWUtYXJndW1lbnQgZm9ybTogSU5TRVJUX09SX1JFUExBQ0UodGFibGVOYW1lLCBjb2x1bW5zLCB2YWx1ZXMpXG4gIGlmIChBcnJheS5pc0FycmF5KGFyZzIpICYmIEFycmF5LmlzQXJyYXkoYXJnMykpIHtcbiAgICByZXR1cm4gUXVlcnlCdWlsZGVyLmluc2VydEludG8oYXJnMSlcbiAgICAgIC5vclJlcGxhY2UoKVxuICAgICAgLmNvbHVtbnMoLi4uYXJnMilcbiAgICAgIC52YWx1ZXMoLi4uKGFyZzMgYXMgTGF6eUV4cHJlc3Npb25bXSkubWFwKExBWlkpKTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudHMgZm9yIElOU0VSVF9PUl9SRVBMQUNFJyk7XG59XG5cbi8vIC0tLSBPdGhlciBDbGF1c2VzIC0tLVxuXG4vLyBPdmVybG9hZHMgZm9yIElOXG5leHBvcnQgZnVuY3Rpb24gSU4obGVmdDogTGF6eUV4cHJlc3Npb24sIC4uLnZhbHVlczogTGF6eUV4cHJlc3Npb25bXSk6IEluRXhwcmVzc2lvbjtcbmV4cG9ydCBmdW5jdGlvbiBJTihsZWZ0OiBMYXp5RXhwcmVzc2lvbiwgdmFsdWVzOiBTZWxlY3RRdWVyeSk6IEluRXhwcmVzc2lvbjtcbmV4cG9ydCBmdW5jdGlvbiBJTihsZWZ0OiBMYXp5RXhwcmVzc2lvbltdLCB2YWx1ZXM6IExhenlFeHByZXNzaW9uW11bXSk6IEluRXhwcmVzc2lvbjtcbmV4cG9ydCBmdW5jdGlvbiBJTihsZWZ0OiBMYXp5RXhwcmVzc2lvbltdLCB2YWx1ZXM6IFNlbGVjdFF1ZXJ5KTogSW5FeHByZXNzaW9uO1xuXG4vLyBJbXBsZW1lbnRhdGlvbiBmb3IgSU5cbmV4cG9ydCBmdW5jdGlvbiBJTihsZWZ0OiBMYXp5RXhwcmVzc2lvbiB8IExhenlFeHByZXNzaW9uW10sIC4uLmFyZ3M6IGFueVtdKTogSW5FeHByZXNzaW9uIHtcbiAgY29uc3Qgbm90ID0gZmFsc2U7XG4gIGNvbnN0IHJlc29sdmVkTGVmdCA9IEFycmF5LmlzQXJyYXkobGVmdCkgPyBsZWZ0Lm1hcChMQVpZKSA6IExBWlkobGVmdCk7XG4gIGxldCByZXNvbHZlZFZhbHVlczogRXhwcmVzc2lvbltdW10gfCBTZWxlY3RRdWVyeTtcbiAgaWYgKEFycmF5LmlzQXJyYXkobGVmdCkpIHtcbiAgICAvLyBNdWx0aS1jb2x1bW4gY2FzZVxuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSAmJiBhcmdzWzBdIGluc3RhbmNlb2YgU2VsZWN0UXVlcnkpIHtcbiAgICAgIHJlc29sdmVkVmFsdWVzID0gYXJnc1swXTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdmFsdWVzQXJnID0gYXJnc1swXSBhcyBMYXp5RXhwcmVzc2lvbltdW107XG4gICAgICByZXNvbHZlZFZhbHVlcyA9IHZhbHVlc0FyZy5tYXAoc2V0ID0+IHNldC5tYXAoTEFaWSkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBTaW5nbGUtY29sdW1uIGNhc2VcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgYXJnc1swXSBpbnN0YW5jZW9mIFNlbGVjdFF1ZXJ5KSB7XG4gICAgICByZXNvbHZlZFZhbHVlcyA9IGFyZ3NbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc29sdmVkVmFsdWVzID0gYXJncy5tYXAoTEFaWSkubWFwKHYgPT4gW3ZdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5ldyBJbkV4cHJlc3Npb24ocmVzb2x2ZWRMZWZ0LCByZXNvbHZlZFZhbHVlcywgbm90KTtcbn1cblxuLy8gT3ZlcmxvYWRzIGZvciBOT1RfSU5cbmV4cG9ydCBmdW5jdGlvbiBOT1RfSU4obGVmdDogTGF6eUV4cHJlc3Npb24sIC4uLnZhbHVlczogTGF6eUV4cHJlc3Npb25bXSk6IEluRXhwcmVzc2lvbjtcbmV4cG9ydCBmdW5jdGlvbiBOT1RfSU4obGVmdDogTGF6eUV4cHJlc3Npb24sIHZhbHVlczogU2VsZWN0UXVlcnkpOiBJbkV4cHJlc3Npb247XG5leHBvcnQgZnVuY3Rpb24gTk9UX0lOKGxlZnQ6IExhenlFeHByZXNzaW9uW10sIHZhbHVlczogTGF6eUV4cHJlc3Npb25bXVtdKTogSW5FeHByZXNzaW9uO1xuZXhwb3J0IGZ1bmN0aW9uIE5PVF9JTihsZWZ0OiBMYXp5RXhwcmVzc2lvbltdLCB2YWx1ZXM6IFNlbGVjdFF1ZXJ5KTogSW5FeHByZXNzaW9uO1xuXG4vLyBJbXBsZW1lbnRhdGlvbiBmb3IgTk9UX0lOXG5leHBvcnQgZnVuY3Rpb24gTk9UX0lOKGxlZnQ6IExhenlFeHByZXNzaW9uIHwgTGF6eUV4cHJlc3Npb25bXSwgLi4uYXJnczogYW55W10pOiBJbkV4cHJlc3Npb24ge1xuICBjb25zdCBub3QgPSB0cnVlO1xuICBjb25zdCByZXNvbHZlZExlZnQgPSBBcnJheS5pc0FycmF5KGxlZnQpID8gbGVmdC5tYXAoTEFaWSkgOiBMQVpZKGxlZnQpO1xuICBsZXQgcmVzb2x2ZWRWYWx1ZXM6IEV4cHJlc3Npb25bXVtdIHwgU2VsZWN0UXVlcnk7XG4gIGlmIChBcnJheS5pc0FycmF5KGxlZnQpKSB7XG4gICAgLy8gTXVsdGktY29sdW1uIGNhc2VcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgYXJnc1swXSBpbnN0YW5jZW9mIFNlbGVjdFF1ZXJ5KSB7XG4gICAgICByZXNvbHZlZFZhbHVlcyA9IGFyZ3NbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHZhbHVlc0FyZyA9IGFyZ3NbMF0gYXMgTGF6eUV4cHJlc3Npb25bXVtdO1xuICAgICAgcmVzb2x2ZWRWYWx1ZXMgPSB2YWx1ZXNBcmcubWFwKHNldCA9PiBzZXQubWFwKExBWlkpKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gU2luZ2xlLWNvbHVtbiBjYXNlXG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxICYmIGFyZ3NbMF0gaW5zdGFuY2VvZiBTZWxlY3RRdWVyeSkge1xuICAgICAgcmVzb2x2ZWRWYWx1ZXMgPSBhcmdzWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNvbHZlZFZhbHVlcyA9IGFyZ3MubWFwKExBWlkpLm1hcCh2ID0+IFt2XSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXcgSW5FeHByZXNzaW9uKHJlc29sdmVkTGVmdCwgcmVzb2x2ZWRWYWx1ZXMsIG5vdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBHUk9VUF9CWSguLi5jb2x1bW5zOiAoQ29sdW1uIHwgc3RyaW5nKVtdKTogQ29sdW1uW10ge1xuICByZXR1cm4gY29sdW1ucy5tYXAoY29sID0+ICh0eXBlb2YgY29sID09PSAnc3RyaW5nJyA/IENPTFVNTihjb2wpIDogY29sKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBIQVZJTkcoZXhwcjogTGF6eUV4cHJlc3Npb24pOiBFeHByZXNzaW9uIHtcbiAgcmV0dXJuIExBWlkoZXhwcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBPUkRFUl9CWShjb2x1bW46IENvbHVtbiB8IHN0cmluZywgZGlyZWN0aW9uOiBPcmRlckJ5RGlyZWN0aW9uID0gT3JkZXJCeURpcmVjdGlvbi5BU0MpOiBPcmRlckJ5IHtcbiAgcmV0dXJuIG5ldyBPcmRlckJ5KHR5cGVvZiBjb2x1bW4gPT09ICdzdHJpbmcnID8gQ09MVU1OKGNvbHVtbikgOiBjb2x1bW4sIGRpcmVjdGlvbik7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIFBBUlRJVElPTiBCWSBjbGF1c2UgZm9yIHdpbmRvdyBmdW5jdGlvbnMuXG4gKlxuICogUmV0dXJucyBhbiBFeHByZXNzaW9uW10gdGhhdCBjYW4gYmUgcGFzc2VkIHRvIEZ1bmN0aW9uRXhwcmVzc2lvbi5vdmVyKClcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogRk4oJ1JBTksnKS5vdmVyKFBBUlRJVElPTl9CWSgnY2F0ZWdvcnknKSwgT1JERVJfQlkoJ3ByaWNlJywgREVTQykpXG4gKiAvLyBSQU5LKCkgT1ZFUiAoUEFSVElUSU9OIEJZIGNhdGVnb3J5IE9SREVSIEJZIHByaWNlIERFU0MpXG4gKlxuICogRk4oJ1JPV19OVU1CRVInKS5vdmVyKFBBUlRJVElPTl9CWSgnZGVwYXJ0bWVudCcsICdsb2NhdGlvbicpLCBPUkRFUl9CWSgnc2FsYXJ5JykpXG4gKiAvLyBST1dfTlVNQkVSKCkgT1ZFUiAoUEFSVElUSU9OIEJZIGRlcGFydG1lbnQsIGxvY2F0aW9uIE9SREVSIEJZIHNhbGFyeSlcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gUEFSVElUSU9OX0JZKC4uLmNvbHVtbnM6IChDb2x1bW4gfCBzdHJpbmcpW10pOiBFeHByZXNzaW9uW10ge1xuICByZXR1cm4gY29sdW1ucy5tYXAoY29sID0+ICh0eXBlb2YgY29sID09PSAnc3RyaW5nJyA/IENPTFVNTihjb2wpIDogY29sKSk7XG59XG5cbi8vIC0tLSBDQVNFIEV4cHJlc3Npb25zIC0tLVxuXG5leHBvcnQgZnVuY3Rpb24gQ0FTRShsYXp5Q2FzZXM6IExhenlDYXNlSXRlbVtdKTogQ2FzZUV4cHJlc3Npb24ge1xuICBsZXQgZWxzZUV4cHI6IEV4cHJlc3Npb24gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gIGNvbnN0IGNhc2VJdGVtczogQ2FzZUl0ZW1bXSA9IFtdO1xuICBmb3IgKGNvbnN0IGMgb2YgbGF6eUNhc2VzKSB7XG4gICAgaWYgKGMuV0hFTiAhPT0gdW5kZWZpbmVkICYmIGMuVEhFTiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoZWxzZUV4cHIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFTFNFIG11c3QgYmUgdGhlIGxhc3QgY2xhdXNlIGluIGEgQ0FTRSBleHByZXNzaW9uJyk7XG4gICAgICB9XG4gICAgICBjYXNlSXRlbXMucHVzaCh7IHdoZW46IExBWlkoYy5XSEVOKSwgdGhlbjogTEFaWShjLlRIRU4pIH0pO1xuICAgIH0gZWxzZSBpZiAoYy5FTFNFICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChlbHNlRXhwcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NBU0UgZXhwcmVzc2lvbiBjYW4gb25seSBoYXZlIG9uZSBFTFNFIGNsYXVzZScpO1xuICAgICAgfVxuICAgICAgZWxzZUV4cHIgPSBMQVpZKGMuRUxTRSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXcgQ2FzZUV4cHJlc3Npb24oY2FzZUl0ZW1zLCBlbHNlRXhwcik7XG59XG5cbi8vIC0tLSBTdWJxdWVyaWVzIGFuZCBXSVRIIENsYXVzZXMgLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBXSVRIKG5hbWU6IHN0cmluZywgcXVlcnk6IFNlbGVjdFF1ZXJ5KTogV2l0aCB7XG4gIHJldHVybiBuZXcgV2l0aChuYW1lLCBxdWVyeSk7XG59XG5cbi8vIC0tLSBEZWxldGUgUXVlcmllcyAtLS1cblxuZXhwb3J0IGZ1bmN0aW9uIERFTEVURV9GUk9NKHRhYmxlTmFtZTogc3RyaW5nKTogRGVsZXRlUXVlcnkge1xuICByZXR1cm4gUXVlcnlCdWlsZGVyLmRlbGV0ZUZyb20odGFibGVOYW1lKTtcbn1cblxuLy8gLS0tIFVwZGF0ZSBRdWVyaWVzIC0tLVxuXG5leHBvcnQgZnVuY3Rpb24gVVBEQVRFKHRhYmxlTmFtZTogc3RyaW5nKTogVXBkYXRlUXVlcnkge1xuICByZXR1cm4gUXVlcnlCdWlsZGVyLnVwZGF0ZSh0YWJsZU5hbWUpO1xufVxuXG4vLyAtLS0gQ3JlYXRlIFRhYmxlIFF1ZXJpZXMgLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBDUkVBVEVfVEFCTEUodGFibGVOYW1lOiBzdHJpbmcpOiBDcmVhdGVUYWJsZVF1ZXJ5IHtcbiAgcmV0dXJuIFF1ZXJ5QnVpbGRlci5jcmVhdGVUYWJsZSh0YWJsZU5hbWUpO1xufVxuXG4vLyAtLS0gQ3JlYXRlIFZpcnR1YWwgVGFibGUgUXVlcmllcyAtLS1cblxuZXhwb3J0IGZ1bmN0aW9uIENSRUFURV9WSVJUVUFMX1RBQkxFKHRhYmxlTmFtZTogc3RyaW5nLCBtb2R1bGU6IFZpcnR1YWxUYWJsZU1vZHVsZSk6IENyZWF0ZVZpcnR1YWxUYWJsZVF1ZXJ5IHtcbiAgcmV0dXJuIFF1ZXJ5QnVpbGRlci5jcmVhdGVWaXJ0dWFsVGFibGUodGFibGVOYW1lLCBtb2R1bGUpO1xufVxuXG4vLyAtLS0gQ3JlYXRlIEluZGV4IFF1ZXJpZXMgLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBDUkVBVEVfSU5ERVgoaW5kZXhOYW1lOiBzdHJpbmcpOiBDcmVhdGVJbmRleFF1ZXJ5IHtcbiAgcmV0dXJuIFF1ZXJ5QnVpbGRlci5jcmVhdGVJbmRleChpbmRleE5hbWUpO1xufVxuXG4vLyAtLS0gQWx0ZXIgVGFibGUgUXVlcmllcyAtLS1cblxuZXhwb3J0IGZ1bmN0aW9uIEFMVEVSX1RBQkxFKHRhYmxlTmFtZTogc3RyaW5nKTogQWx0ZXJUYWJsZVF1ZXJ5IHtcbiAgcmV0dXJuIFF1ZXJ5QnVpbGRlci5hbHRlclRhYmxlKHRhYmxlTmFtZSk7XG59XG5cbi8vIC0tLSBEcm9wIFF1ZXJpZXMgLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBEUk9QX1RBQkxFKHRhYmxlTmFtZTogc3RyaW5nKTogRHJvcFRhYmxlUXVlcnkge1xuICByZXR1cm4gUXVlcnlCdWlsZGVyLmRyb3BUYWJsZSh0YWJsZU5hbWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRFJPUF9JTkRFWChpbmRleE5hbWU6IHN0cmluZyk6IERyb3BJbmRleFF1ZXJ5IHtcbiAgcmV0dXJuIFF1ZXJ5QnVpbGRlci5kcm9wSW5kZXgoaW5kZXhOYW1lKTtcbn1cblxuLy8gLS0tIFZpZXcgUXVlcmllcyAtLS1cblxuZXhwb3J0IGZ1bmN0aW9uIENSRUFURV9WSUVXKHZpZXdOYW1lOiBzdHJpbmcpOiBDcmVhdGVWaWV3UXVlcnkge1xuICByZXR1cm4gUXVlcnlCdWlsZGVyLmNyZWF0ZVZpZXcodmlld05hbWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRFJPUF9WSUVXKHZpZXdOYW1lOiBzdHJpbmcpOiBEcm9wVmlld1F1ZXJ5IHtcbiAgcmV0dXJuIFF1ZXJ5QnVpbGRlci5kcm9wVmlldyh2aWV3TmFtZSk7XG59XG5cbi8vIC0tLSBBbGlhc2VzIC0tLVxuXG5leHBvcnQgZnVuY3Rpb24gQUxJQVMocmVmZXJlbnQ6IEFsaWFzYWJsZUV4cHJlc3Npb24sIGFsaWFzOiBzdHJpbmcpOiBBbGlhczxBbGlhc2FibGVFeHByZXNzaW9uPjtcbmV4cG9ydCBmdW5jdGlvbiBBTElBUyhyZWZlcmVudDogRnJvbSwgYWxpYXM6IHN0cmluZyk6IEFsaWFzPEZyb20+O1xuZXhwb3J0IGZ1bmN0aW9uIEFMSUFTKHJlZmVyZW50OiBBbGlhc2FibGVFeHByZXNzaW9uIHwgRnJvbSwgYWxpYXM6IHN0cmluZyk6IEFsaWFzPEFsaWFzYWJsZUV4cHJlc3Npb24+IHwgQWxpYXM8RnJvbT4ge1xuICBpZiAocmVmZXJlbnQgaW5zdGFuY2VvZiBGcm9tKSB7XG4gICAgcmV0dXJuIG5ldyBBbGlhczxGcm9tPihyZWZlcmVudCwgYWxpYXMpO1xuICB9XG4gIHJldHVybiBuZXcgQWxpYXM8QWxpYXNhYmxlRXhwcmVzc2lvbj4ocmVmZXJlbnQgYXMgQWxpYXNhYmxlRXhwcmVzc2lvbiwgYWxpYXMpO1xufVxuXG4vLyAtLS0gQ0FTVCBFeHByZXNzaW9ucyAtLS1cblxuZXhwb3J0IGZ1bmN0aW9uIENBU1QoZXhwcjogTGF6eUV4cHJlc3Npb24sIHRhcmdldFR5cGU6IHN0cmluZyk6IENhc3RFeHByZXNzaW9uIHtcbiAgcmV0dXJuIG5ldyBDYXN0RXhwcmVzc2lvbihMQVpZKGV4cHIpLCB0YXJnZXRUeXBlKTtcbn1cblxuLy8gLS0tIENPTExBVEUgRXhwcmVzc2lvbnMgLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBDT0xMQVRFKGV4cHI6IExhenlFeHByZXNzaW9uLCBjb2xsYXRpb246IHN0cmluZyk6IENvbGxhdGVFeHByZXNzaW9uIHtcbiAgcmV0dXJuIG5ldyBDb2xsYXRlRXhwcmVzc2lvbihMQVpZKGV4cHIpLCBjb2xsYXRpb24pO1xufVxuXG4vLyAtLS0gU3VicXVlcnkgRXhwcmVzc2lvbnMgLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBTVUJRVUVSWShxdWVyeTogU2VsZWN0UXVlcnkpOiBTdWJxdWVyeUV4cHJlc3Npb24ge1xuICByZXR1cm4gbmV3IFN1YnF1ZXJ5RXhwcmVzc2lvbihxdWVyeSk7XG59XG5cbi8vIC0tLSBMaXRlcmFsIENvbnZlcnNpb24gLS0tXG5cbmZ1bmN0aW9uIExBWlkodmFsdWU6IExhenlFeHByZXNzaW9uKTogQWxpYXNhYmxlRXhwcmVzc2lvbiB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBOdWxsTGl0ZXJhbC5JTlNUQU5DRTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgIHJldHVybiBuZXcgTnVtYmVyTGl0ZXJhbCh2YWx1ZSA/IDEgOiAwKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG5ldyBTdHJpbmdMaXRlcmFsKHZhbHVlKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIG5ldyBOdW1iZXJMaXRlcmFsKHZhbHVlKTtcbiAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFsaWFzYWJsZUV4cHJlc3Npb24pIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCB2YWx1ZSB0eXBlOiAke3R5cGVvZiB2YWx1ZX1gKTtcbiAgfVxufVxuIl19
|