@paddls/ngx-easy-table
Version:
Angular easy table
119 lines • 16.6 kB
JavaScript
import { Pipe } from "@angular/core";
import * as i0 from "@angular/core";
import * as i1 from "./pagination.service";
const LARGE_NUMBER = Number.MAX_SAFE_INTEGER;
export class PaginatePipe {
constructor(service) {
this.service = service;
// store the values from the last time the pipe was invoked
this.state = {};
}
transform(collection, args) {
// When an observable is passed through the AsyncPipe, it will output
// `null` until the subscription resolves. In this case, we want to
// use the cached data from the `state` object to prevent the NgFor
// from flashing empty until the real values arrive.
if (!(collection instanceof Array)) {
let _id = args.id || this.service.defaultId();
if (this.state[_id]) {
return this.state[_id].slice;
}
else {
return collection;
}
}
let serverSideMode = args.totalItems && args.totalItems !== collection.length;
let instance = this.createInstance(collection, args);
let id = instance.id;
let start, end;
let perPage = instance.itemsPerPage;
let emitChange = this.service.register(instance);
if (!serverSideMode && collection instanceof Array) {
perPage = +perPage || LARGE_NUMBER;
start = (instance.currentPage - 1) * perPage;
end = start + perPage;
let isIdentical = this.stateIsIdentical(id, collection, start, end);
if (isIdentical) {
return this.state[id].slice;
}
else {
let slice = collection.slice(start, end);
this.saveState(id, collection, slice, start, end);
this.service.change.emit(id);
return slice;
}
}
else {
if (emitChange) {
this.service.change.emit(id);
}
// save the state for server-side collection to avoid null
// flash as new data loads.
this.saveState(id, collection, collection, start, end);
return collection;
}
}
/**
* Create an PaginationInstance object, using defaults for any optional properties not supplied.
*/
createInstance(collection, config) {
this.checkConfig(config);
return {
id: config.id != null ? config.id : this.service.defaultId(),
itemsPerPage: Number(config.itemsPerPage) || 0,
currentPage: Number(config.currentPage) || 1,
totalItems: Number(config.totalItems) || collection.length
};
}
/**
* Ensure the argument passed to the filter contains the required properties.
*/
checkConfig(config) {
const required = ['itemsPerPage', 'currentPage'];
const missing = required.filter(prop => !(prop in config));
if (0 < missing.length) {
throw new Error(`PaginatePipe: Argument is missing the following required properties: ${missing.join(', ')}`);
}
}
/**
* To avoid returning a brand new array each time the pipe is run, we store the state of the sliced
* array for a given id. This means that the next time the pipe is run on this collection & id, we just
* need to check that the collection, start and end points are all identical, and if so, return the
* last sliced array.
*/
saveState(id, collection, slice, start, end) {
this.state[id] = {
collection,
size: collection.length,
slice,
start,
end
};
}
/**
* For a given id, returns true if the collection, size, start and end values are identical.
*/
stateIsIdentical(id, collection, start, end) {
let state = this.state[id];
if (!state) {
return false;
}
let isMetaDataIdentical = state.size === collection.length &&
state.start === start &&
state.end === end;
if (!isMetaDataIdentical) {
return false;
}
return state.slice.every((element, index) => element === collection[start + index]);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: PaginatePipe, deps: [{ token: i1.PaginationService }], target: i0.ɵɵFactoryTarget.Pipe }); }
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: PaginatePipe, name: "paginate", pure: false }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: PaginatePipe, decorators: [{
type: Pipe,
args: [{
name: 'paginate',
pure: false
}]
}], ctorParameters: function () { return [{ type: i1.PaginationService }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGUucGlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1lYXN5LXRhYmxlL3NyYy9saWIvZmVhdHVyZXMvcGFnaW5hdGlvbi9wYWdpbmF0ZS5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7OztBQUluQyxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7QUF1QjdDLE1BQU0sT0FBTyxZQUFZO0lBS3JCLFlBQW9CLE9BQTBCO1FBQTFCLFlBQU8sR0FBUCxPQUFPLENBQW1CO1FBSDlDLDJEQUEyRDtRQUNuRCxVQUFLLEdBQWdDLEVBQUUsQ0FBQztJQUdoRCxDQUFDO0lBRU0sU0FBUyxDQUE2QixVQUFhLEVBQUUsSUFBc0I7UUFFOUUscUVBQXFFO1FBQ3JFLG1FQUFtRTtRQUNuRSxtRUFBbUU7UUFDbkUsb0RBQW9EO1FBQ3BELElBQUksQ0FBQyxDQUFDLFVBQVUsWUFBWSxLQUFLLENBQUMsRUFBRTtZQUNoQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDOUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNqQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBVSxDQUFDO2FBQ3JDO2lCQUFNO2dCQUNILE9BQU8sVUFBVSxDQUFDO2FBQ3JCO1NBQ0o7UUFFRCxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUM5RSxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNyRCxJQUFJLEVBQUUsR0FB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RSxHQUFXO1FBQ3ZHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUc7WUFDYixVQUFVO1lBQ1YsSUFBSSxFQUFFLFVBQVUsQ0FBQyxNQUFNO1lBQ3ZCLEtBQUs7WUFDTCxLQUFLO1lBQ0wsR0FBRztTQUNOLENBQUM7SUFDTixDQUFDO0lBRUQ7O09BRUc7SUFDSyxnQkFBZ0IsQ0FBQyxFQUFVLEVBQUUsVUFBMEIsRUFBRSxLQUFhLEVBQUUsR0FBVztRQUN2RixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDUixPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUNELElBQUksbUJBQW1CLEdBQUcsS0FBSyxDQUFDLElBQUksS0FBSyxVQUFVLENBQUMsTUFBTTtZQUN0RCxLQUFLLENBQUMsS0FBSyxLQUFLLEtBQUs7WUFDckIsS0FBSyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUM7UUFFdEIsSUFBRyxDQUFDLG1CQUFtQixFQUFFO1lBQ3JCLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBRUQsT0FBUSxLQUFLLENBQUMsS0FBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxPQUFPLEtBQUssVUFBVSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3hHLENBQUM7OEdBdEhRLFlBQVk7NEdBQVosWUFBWTs7MkZBQVosWUFBWTtrQkFKeEIsSUFBSTttQkFBQztvQkFDRixJQUFJLEVBQUUsVUFBVTtvQkFDaEIsSUFBSSxFQUFFLEtBQUs7aUJBQ2QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1BpcGV9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQge1BhZ2luYXRpb25TZXJ2aWNlfSBmcm9tIFwiLi9wYWdpbmF0aW9uLnNlcnZpY2VcIjtcbmltcG9ydCB7UGFnaW5hdGlvbkluc3RhbmNlSW50ZXJmYWNlfSBmcm9tICcuL2ludGVyZmFjZXMvcGFnaW5hdGlvbi1pbnN0YW5jZS5pbnRlcmZhY2UnO1xuXG5jb25zdCBMQVJHRV9OVU1CRVIgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvbjxUPiA9IFRbXSB8IFJlYWRvbmx5QXJyYXk8VD47XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5hdGVQaXBlQXJncyB7XG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgaXRlbXNQZXJQYWdlPzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIGN1cnJlbnRQYWdlPzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIHRvdGFsSXRlbXM/OiBzdHJpbmcgfCBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZVN0YXRlIHtcbiAgICBjb2xsZWN0aW9uOiBBcnJheUxpa2U8YW55PjtcbiAgICBzaXplOiBudW1iZXI7XG4gICAgc3RhcnQ6IG51bWJlcjtcbiAgICBlbmQ6IG51bWJlcjtcbiAgICBzbGljZTogQXJyYXlMaWtlPGFueT47XG59XG5cbkBQaXBlKHtcbiAgICBuYW1lOiAncGFnaW5hdGUnLFxuICAgIHB1cmU6IGZhbHNlXG59KVxuZXhwb3J0IGNsYXNzIFBhZ2luYXRlUGlwZSB7XG5cbiAgICAvLyBzdG9yZSB0aGUgdmFsdWVzIGZyb20gdGhlIGxhc3QgdGltZSB0aGUgcGlwZSB3YXMgaW52b2tlZFxuICAgIHByaXZhdGUgc3RhdGU6IHsgW2lkOiBzdHJpbmddOiBQaXBlU3RhdGUgfSA9IHt9O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBzZXJ2aWNlOiBQYWdpbmF0aW9uU2VydmljZSkge1xuICAgIH1cblxuICAgIHB1YmxpYyB0cmFuc2Zvcm08VCwgVSBleHRlbmRzIENvbGxlY3Rpb248VD4+KGNvbGxlY3Rpb246IFUsIGFyZ3M6IFBhZ2luYXRlUGlwZUFyZ3MpOiBVIHtcblxuICAgICAgICAvLyBXaGVuIGFuIG9ic2VydmFibGUgaXMgcGFzc2VkIHRocm91Z2ggdGhlIEFzeW5jUGlwZSwgaXQgd2lsbCBvdXRwdXRcbiAgICAgICAgLy8gYG51bGxgIHVudGlsIHRoZSBzdWJzY3JpcHRpb24gcmVzb2x2ZXMuIEluIHRoaXMgY2FzZSwgd2Ugd2FudCB0b1xuICAgICAgICAvLyB1c2UgdGhlIGNhY2hlZCBkYXRhIGZyb20gdGhlIGBzdGF0ZWAgb2JqZWN0IHRvIHByZXZlbnQgdGhlIE5nRm9yXG4gICAgICAgIC8vIGZyb20gZmxhc2hpbmcgZW1wdHkgdW50aWwgdGhlIHJlYWwgdmFsdWVzIGFycml2ZS5cbiAgICAgICAgaWYgKCEoY29sbGVjdGlvbiBpbnN0YW5jZW9mIEFycmF5KSkge1xuICAgICAgICAgICAgbGV0IF9pZCA9IGFyZ3MuaWQgfHwgdGhpcy5zZXJ2aWNlLmRlZmF1bHRJZCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGVbX2lkXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRlW19pZF0uc2xpY2UgYXMgVTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2VydmVyU2lkZU1vZGUgPSBhcmdzLnRvdGFsSXRlbXMgJiYgYXJncy50b3RhbEl0ZW1zICE9PSBjb2xsZWN0aW9uLmxlbmd0aDtcbiAgICAgICAgbGV0IGluc3RhbmNlID0gdGhpcy5jcmVhdGVJbnN0YW5jZShjb2xsZWN0aW9uLCBhcmdzKTtcbiAgICAgICAgbGV0IGlkID0gaW5zdGFuY2UuaWQ7XG5cbiAgICAgICAgbGV0IHN0YXJ0LCBlbmQ7XG4gICAgICAgIGxldCBwZXJQYWdlID0gaW5zdGFuY2UuaXRlbXNQZXJQYWdlO1xuXG4gICAgICAgIGxldCBlbWl0Q2hhbmdlID0gdGhpcy5zZXJ2aWNlLnJlZ2lzdGVyKGluc3RhbmNlKTtcblxuICAgICAgICBpZiAoIXNlcnZlclNpZGVNb2RlICYmIGNvbGxlY3Rpb24gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgcGVyUGFnZSA9ICtwZXJQYWdlIHx8IExBUkdFX05VTUJFUjtcbiAgICAgICAgICAgIHN0YXJ0ID0gKGluc3RhbmNlLmN1cnJlbnRQYWdlIC0gMSkgKiBwZXJQYWdlO1xuICAgICAgICAgICAgZW5kID0gc3RhcnQgKyBwZXJQYWdlO1xuXG4gICAgICAgICAgICBsZXQgaXNJZGVudGljYWwgPSB0aGlzLnN0YXRlSXNJZGVudGljYWwoaWQhLCBjb2xsZWN0aW9uLCBzdGFydCwgZW5kKTtcbiAgICAgICAgICAgIGlmIChpc0lkZW50aWNhbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRlW2lkIV0uc2xpY2UgYXMgVTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHNsaWNlID0gY29sbGVjdGlvbi5zbGljZShzdGFydCwgZW5kKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNhdmVTdGF0ZShpZCEsIGNvbGxlY3Rpb24sIHNsaWNlLCBzdGFydCwgZW5kKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2UuY2hhbmdlLmVtaXQoaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBzbGljZSBhcyBVO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGVtaXRDaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2UuY2hhbmdlLmVtaXQoaWQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBzYXZlIHRoZSBzdGF0ZSBmb3Igc2VydmVyLXNpZGUgY29sbGVjdGlvbiB0byBhdm9pZCBudWxsXG4gICAgICAgICAgICAvLyBmbGFzaCBhcyBuZXcgZGF0YSBsb2Fkcy5cbiAgICAgICAgICAgIHRoaXMuc2F2ZVN0YXRlKGlkISwgY29sbGVjdGlvbiwgY29sbGVjdGlvbiwgc3RhcnQsIGVuZCk7XG5cbiAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFuIFBhZ2luYXRpb25JbnN0YW5jZSBvYmplY3QsIHVzaW5nIGRlZmF1bHRzIGZvciBhbnkgb3B0aW9uYWwgcHJvcGVydGllcyBub3Qgc3VwcGxpZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVJbnN0YW5jZShjb2xsZWN0aW9uOiByZWFkb25seSBhbnlbXSwgY29uZmlnOiBQYWdpbmF0ZVBpcGVBcmdzKTogUGFnaW5hdGlvbkluc3RhbmNlSW50ZXJmYWNlIHtcbiAgICAgICAgdGhpcy5jaGVja0NvbmZpZyhjb25maWcpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogY29uZmlnLmlkICE9IG51bGwgPyBjb25maWcuaWQgOiB0aGlzLnNlcnZpY2UuZGVmYXVsdElkKCksXG4gICAgICAgICAgICBpdGVtc1BlclBhZ2U6IE51bWJlcihjb25maWcuaXRlbXNQZXJQYWdlKSB8fCAwLFxuICAgICAgICAgICAgY3VycmVudFBhZ2U6IE51bWJlcihjb25maWcuY3VycmVudFBhZ2UpIHx8IDEsXG4gICAgICAgICAgICB0b3RhbEl0ZW1zOiBOdW1iZXIoY29uZmlnLnRvdGFsSXRlbXMpIHx8IGNvbGxlY3Rpb24ubGVuZ3RoXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5zdXJlIHRoZSBhcmd1bWVudCBwYXNzZWQgdG8gdGhlIGZpbHRlciBjb250YWlucyB0aGUgcmVxdWlyZWQgcHJvcGVydGllcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNoZWNrQ29uZmlnKGNvbmZpZzogUGFnaW5hdGVQaXBlQXJncyk6IHZvaWQge1xuICAgICAgICBjb25zdCByZXF1aXJlZCA9IFsnaXRlbXNQZXJQYWdlJywgJ2N1cnJlbnRQYWdlJ107XG5cbiAgICAgICAgY29uc3QgbWlzc2luZyA9IHJlcXVpcmVkLmZpbHRlcihwcm9wID0+ICEocHJvcCBpbiBjb25maWcpKTtcbiAgICAgICAgaWYgKDAgPCBtaXNzaW5nLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYWdpbmF0ZVBpcGU6IEFyZ3VtZW50IGlzIG1pc3NpbmcgdGhlIGZvbGxvd2luZyByZXF1aXJlZCBwcm9wZXJ0aWVzOiAke21pc3Npbmcuam9pbignLCAnKX1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvIGF2b2lkIHJldHVybmluZyBhIGJyYW5kIG5ldyBhcnJheSBlYWNoIHRpbWUgdGhlIHBpcGUgaXMgcnVuLCB3ZSBzdG9yZSB0aGUgc3RhdGUgb2YgdGhlIHNsaWNlZFxuICAgICAqIGFycmF5IGZvciBhIGdpdmVuIGlkLiBUaGlzIG1lYW5zIHRoYXQgdGhlIG5leHQgdGltZSB0aGUgcGlwZSBpcyBydW4gb24gdGhpcyBjb2xsZWN0aW9uICYgaWQsIHdlIGp1c3RcbiAgICAgKiBuZWVkIHRvIGNoZWNrIHRoYXQgdGhlIGNvbGxlY3Rpb24sIHN0YXJ0IGFuZCBlbmQgcG9pbnRzIGFyZSBhbGwgaWRlbnRpY2FsLCBhbmQgaWYgc28sIHJldHVybiB0aGVcbiAgICAgKiBsYXN0IHNsaWNlZCBhcnJheS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHNhdmVTdGF0ZShpZDogc3RyaW5nLCBjb2xsZWN0aW9uOiBBcnJheUxpa2U8YW55Piwgc2xpY2U6IEFycmF5TGlrZTxhbnk+LCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLnN0YXRlW2lkXSA9IHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgICAgICBzaXplOiBjb2xsZWN0aW9uLmxlbmd0aCxcbiAgICAgICAgICAgIHNsaWNlLFxuICAgICAgICAgICAgc3RhcnQsXG4gICAgICAgICAgICBlbmRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3IgYSBnaXZlbiBpZCwgcmV0dXJucyB0cnVlIGlmIHRoZSBjb2xsZWN0aW9uLCBzaXplLCBzdGFydCBhbmQgZW5kIHZhbHVlcyBhcmUgaWRlbnRpY2FsLlxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGVJc0lkZW50aWNhbChpZDogc3RyaW5nLCBjb2xsZWN0aW9uOiBBcnJheUxpa2U8YW55Piwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zdGF0ZVtpZF07XG4gICAgICAgIGlmICghc3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaXNNZXRhRGF0YUlkZW50aWNhbCA9IHN0YXRlLnNpemUgPT09IGNvbGxlY3Rpb24ubGVuZ3RoICYmXG4gICAgICAgICAgICBzdGF0ZS5zdGFydCA9PT0gc3RhcnQgJiZcbiAgICAgICAgICAgIHN0YXRlLmVuZCA9PT0gZW5kO1xuXG4gICAgICAgIGlmKCFpc01ldGFEYXRhSWRlbnRpY2FsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKHN0YXRlLnNsaWNlIGFzIEFycmF5PGFueT4pLmV2ZXJ5KChlbGVtZW50LCBpbmRleCkgPT4gZWxlbWVudCA9PT0gY29sbGVjdGlvbltzdGFydCArIGluZGV4XSk7XG4gICAgfVxufVxuIl19