json-to-table-com
Version:
A JSON-to-Table Converter Package for Converting JSON Data into Tabular Format for Enhanced Visualization
132 lines • 24.3 kB
JavaScript
// Author : Kavindu Yasintha Silva
// Import the core angular services.
import { ChangeDetectionStrategy, Input } from "@angular/core";
import { Component } from "@angular/core";
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class JsonToTableComponent {
// I initialize the json tree component.
constructor(changeDetectorRef) {
this.changeDetectorRef = changeDetectorRef;
this.collapsedEntries = Object.create(null);
this.entryCount = 0;
this.isCollapsed = false;
this.value = "";
this.valueType = this.calculateType(this.value);
// this.changeDetectorRef.detectChanges()
}
// ---
// PUBLIC METHODS.
// ---
// I calculate the Type for the given value.
calculateType(target) {
if (target === null) {
return ("Null");
}
if (typeof (target) === "string") {
return ("String");
}
if (typeof (target) === "number") {
return ("Number");
}
if (typeof (target) === "boolean") {
return ("Boolean");
}
if (Array.isArray(target)) {
return ("Array");
}
return ("Object");
}
// I get called when the input bindings have been updated.
ngOnChanges() {
this.entryCount = 0;
this.isCollapsed = false;
this.valueType = this.calculateType(this.value);
this.clearCollapsedEntries();
if (this.valueType === "Object") {
this.entryCount = Object.keys(this.value).length;
}
else if (this.valueType === "Array") {
this.entryCount = this.value.length;
}
}
// I attempt to parse the current String value as a JSON payload.
// --
// NOTE: This overrides the passed-in state at this point in the JSON Tree.
parseString(event) {
if (!event.metaKey) {
return;
}
try {
this.value = JSON.parse(this.value);
this.ngOnChanges();
console.group("String Parsing");
console.log("The value was successfully parsed as JSON.");
console.log(this.value);
console.groupEnd();
}
catch (error) {
console.group("String Parsing");
console.warn("The value could not be parsed as JSON.");
console.error(error);
console.log(this.value);
console.groupEnd();
}
}
// I toggle the expansion of the given value.
toggle(index) {
// Top-level toggle.
if (index === undefined) {
this.isCollapsed = !this.isCollapsed;
// If we're collapsing the top-level value, then reset any settings for the
// sub-entry visibility.
if (this.isCollapsed) {
this.clearCollapsedEntries();
}
// Sub-entry toggle.
}
else {
this.collapsedEntries[index] = !this.collapsedEntries[index];
}
}
// ---
// PRIVATE METHODS.
// ---
// I clear the collapsed entries index.
clearCollapsedEntries() {
for (var key in this.collapsedEntries) {
delete (this.collapsedEntries[key]);
}
}
ngAfterViewInit() {
}
updateData(apiResponse) {
this.collapsedEntries = Object.create(null);
this.entryCount = 0;
this.isCollapsed = false;
this.value = apiResponse;
console.log(this.value);
this.valueType = this.calculateType(this.value);
// this.changeDetectorRef.detectChanges()
}
assertStringKey(key) {
return key;
}
ngOnInit() {
}
}
JsonToTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: JsonToTableComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
JsonToTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: JsonToTableComponent, selector: "AutoJsonComponent", inputs: { value: "value" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"payload\"\n [ngSwitch]=\"valueType\">\n\n <ng-template ngSwitchCase=\"Null\">\n\n <ng-template [ngIf]=\"( ! isCollapsed )\">\n <div class=\"value is-null\">\n null\n </div>\n </ng-template>\n </ng-template>\n\n <ng-template ngSwitchCase=\"String\">\n\n <ng-template [ngIf]=\"( ! isCollapsed )\">\n <div class=\"value is-string\">\n <a (click)=\"parseString( $event )\">\n {{ value }}\n </a>\n </div>\n </ng-template>\n </ng-template>\n\n <ng-template ngSwitchCase=\"Number\">\n\n <ng-template [ngIf]=\"( ! isCollapsed )\">\n <div class=\"value is-number\">\n {{ value }}\n </div>\n </ng-template>\n </ng-template>\n\n <ng-template ngSwitchCase=\"Boolean\">\n\n <ng-template [ngIf]=\"( ! isCollapsed )\">\n <div class=\"value is-boolean\">\n {{ value }}\n </div>\n </ng-template>\n </ng-template>\n\n <ng-template ngSwitchCase=\"Array\">\n <div\n (click)=\"toggle()\"\n class=\"header is-array\"\n [class.is-collapsed]=\"isCollapsed\">\n <div class=\"type\">\n Array\n </div>\n <div class=\"entry-count\">\n Entries: {{ entryCount }}\n </div>\n </div>\n <ng-template [ngIf]=\"( ! isCollapsed )\">\n <ng-template ngFor let-subvalue let-index=\"index\" [ngForOf]=\"value\">\n <div\n (click)=\"toggle( index )\"\n class=\"label is-array\"\n [class.is-collapsed]=\"collapsedEntries[ index ]\">\n {{ index }}\n </div>\n <ng-template [ngIf]=\"( ! collapsedEntries[ index ] )\">\n <div class=\"value is-array\">\n <AutoJsonComponent [value]=\"subvalue\"></AutoJsonComponent>\n </div>\n </ng-template>\n </ng-template>\n </ng-template>\n </ng-template>\n\n <ng-template ngSwitchCase=\"Object\">\n\n <ng-template [ngIf]=\"!isCollapsed\">\n <ng-template ngFor let-subvalue [ngForOf]=\"value | keyvalue\">\n <div\n (click)=\"toggle(assertStringKey(subvalue.key))\"\n class=\"label is-object\"\n [class.is-collapsed]=\"collapsedEntries[assertStringKey(subvalue.key)]\">\n {{ subvalue.key }}\n </div>\n <ng-template [ngIf]=\"!collapsedEntries[assertStringKey(subvalue.key)]\">\n <div class=\"value is-object\">\n <AutoJsonComponent [value]=\"subvalue.value\"></AutoJsonComponent>\n </div>\n </ng-template>\n </ng-template>\n </ng-template>\n </ng-template>\n\n\n</div>\n", styles: [":host{display:block}.payload{display:inline-grid;grid-gap:0px;grid-template-columns:min-content;border:1px solid #dddddd;width:100%}.header{border:1px solid #dddddd;border-radius:3px;background-color:#dd0330;cursor:pointer;grid-column:1 / span 2;padding:6px}.header.is-null{background-color:#dd0330;border-color:#ddd}.header.is-string{background-color:#dd0330;border-color:#dd0330}.header.is-number{background-color:#df5e73;border-color:#df5e73}.header.is-boolean{background-color:#df5e73;border-color:#df5e73}.header.is-array{background-color:#e58494;border-color:#e58494}.header.is-object{background-color:#cc4c5c;border-color:#cc4c5c}.header.is-collapsed{background-color:#cc2c44;border-color:#cc2c44}.entry-count{margin-top:4px}.label{background-color:#ddd;border:1px solid #dddddd;border-radius:3px;cursor:pointer;grid-column:1 / span 1;padding:4px}.label.is-null{background-color:#ddd;border-color:#ccc}.label.is-string{background-color:#ffc900;border-color:#f3b700}.label.is-number{background-color:#ffc900;border-color:#f3b700}.label.is-boolean{background-color:#ffc900;border-color:#f3b700}.label.is-array{background-color:#df5e73;border-color:#df5e73;color:#fff}.label.is-object{background-color:#fff;border-color:#ddd}.value{background-color:#f0f0f0;border:1px solid #dddddd;border-radius:3px;grid-column:2 / span 1;padding:4px}.value.is-null{background-color:#f2f2f2;border-color:#ddd}.value.is-string{background-color:#f2f2f2;border-color:#ddd}.value.is-number{background-color:#f2f2f2;border-color:#ddd}.value.is-boolean{background-color:#f2f2f2;border-color:#ddd}.value.is-array{background-color:#f2f2f2;border-color:#ddd}.value.is-object{background-color:#fff;border-color:#ddd}.value.is-string a{width:475px;word-wrap:break-word;display:inline-block}\n"], components: [{ type: JsonToTableComponent, selector: "AutoJsonComponent", inputs: ["value"] }], directives: [{ type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "keyvalue": i1.KeyValuePipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: JsonToTableComponent, decorators: [{
type: Component,
args: [{
selector: "AutoJsonComponent",
inputs: ["value"],
changeDetection: ChangeDetectionStrategy.OnPush,
styleUrls: ["./json-to-table.component.css"],
templateUrl: "./json-to-table.component.html"
}]
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { value: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbi10by10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9qc29uLXRvLXRhYmxlL3NyYy9saWIvanNvbi10by10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9qc29uLXRvLXRhYmxlL3NyYy9saWIvanNvbi10by10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxrQ0FBa0M7QUFFbEMsb0NBQW9DO0FBQ3BDLE9BQU8sRUFBZ0IsdUJBQXVCLEVBQXFCLEtBQUssRUFBUyxNQUFNLGVBQWUsQ0FBQztBQUN2RyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUE2QjFDLE1BQU0sT0FBTyxvQkFBb0I7SUFRL0Isd0NBQXdDO0lBQ3hDLFlBQW9CLGlCQUFvQztRQUFwQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3RELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFFLElBQUksQ0FBRSxDQUFDO1FBQzlDLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxLQUFLLEdBQUksRUFBRSxDQUFBO1FBQ2hCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBRSxJQUFJLENBQUMsS0FBSyxDQUFFLENBQUM7UUFDbEQseUNBQXlDO0lBQzNDLENBQUM7SUFHRCxNQUFNO0lBQ04sa0JBQWtCO0lBQ2xCLE1BQU07SUFFTiw0Q0FBNEM7SUFDckMsYUFBYSxDQUFFLE1BQVc7UUFFL0IsSUFBSyxNQUFNLEtBQUssSUFBSSxFQUFHO1lBRXJCLE9BQU0sQ0FBRSxNQUFNLENBQUUsQ0FBQztTQUVsQjtRQUVELElBQUssT0FBTSxDQUFFLE1BQU0sQ0FBRSxLQUFLLFFBQVEsRUFB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L0IscUJBQXFCO1FBRTNCLEtBQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFHO1lBRXZDLE9BQU0sQ0FBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUUsR0FBRyxDQUFFLENBQUUsQ0FBQztTQUV4QztJQUVILENBQUM7SUFFRCxlQUFlO0lBQ2YsQ0FBQztJQUVELFVBQVUsQ0FBQyxXQUFlO1FBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFFLElBQUksQ0FBRSxDQUFDO1FBQzlDLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxLQUFLLEdBQUksV0FBVyxDQUFBO1FBQ3pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBRSxJQUFJLENBQUMsS0FBSyxDQUFFLENBQUM7UUFDbEQseUNBQXlDO0lBRTNDLENBQUM7SUFDRCxlQUFlLENBQUMsR0FBWTtRQUMxQixPQUFPLEdBQWEsQ0FBQztJQUN2QixDQUFDO0lBRUQsUUFBUTtJQUVSLENBQUM7O2tIQWxMVSxvQkFBb0I7c0dBQXBCLG9CQUFvQiwwR0NsQ2pDLHdnRkE0RkEsOHdERDFEYSxvQkFBb0I7NEZBQXBCLG9CQUFvQjtrQkFQaEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsbUJBQW1CO29CQUM3QixNQUFNLEVBQUUsQ0FBRSxPQUFPLENBQUU7b0JBQ25CLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxTQUFTLEVBQUUsQ0FBRSwrQkFBK0IsQ0FBRTtvQkFDOUMsV0FBVyxFQUFFLGdDQUFnQztpQkFDOUM7d0dBTVUsS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiXG4vLyBBdXRob3IgOiBLYXZpbmR1IFlhc2ludGhhIFNpbHZhXG5cbi8vIEltcG9ydCB0aGUgY29yZSBhbmd1bGFyIHNlcnZpY2VzLlxuaW1wb3J0IHtBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIElucHV0LCBPbkluaXR9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuXG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4vLyBDQVVUSU9OOiBUaGUgdmFsdWUgYm91bmQgdGhpcyBjb21wb25lbnQgaXMgQVNTVU1FRCB0byBiZSB0aGUgcmVzdWx0IG9mIGEgSlNPTi5wYXJzZSgpXG4vLyBjYWxsLiBBcyBzdWNoLCBpdCBkb2VzIE5PVCBTVVBQT1JUIHRoZSBmdWxsIHNldCBvZiBKYXZhU2NyaXB0IGRhdGEtdHlwZXMuIEluc3RlYWQsIGl0XG4vLyBvbmx5IHN1cHBvcnRzIHRob3NlIHRoYXQgY2FuIGJlIGVuY29kZWQgaW4gYSBKU09OIHBheWxvYWQuXG50eXBlIFZhbHVlVHlwZSA9XG4gIHwgXCJOdWxsXCJcbiAgfCBcIlN0cmluZ1wiXG4gIHwgXCJOdW1iZXJcIlxuICB8IFwiQm9vbGVhblwiXG4gIHwgXCJBcnJheVwiXG4gIHwgXCJPYmplY3RcIlxuICA7XG5cbmludGVyZmFjZSBDb2xsYXBzZWRFbnRyaWVzIHtcbiAgWyBrZXk6IHN0cmluZyBdOiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwiQXV0b0pzb25Db21wb25lbnRcIixcbiAgaW5wdXRzOiBbIFwidmFsdWVcIiBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3R5bGVVcmxzOiBbIFwiLi9qc29uLXRvLXRhYmxlLmNvbXBvbmVudC5jc3NcIiBdLFxuICB0ZW1wbGF0ZVVybDogXCIuL2pzb24tdG8tdGFibGUuY29tcG9uZW50Lmh0bWxcIlxufSlcbmV4cG9ydCBjbGFzcyBKc29uVG9UYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCxBZnRlclZpZXdJbml0IHtcblxuICBwdWJsaWMgY29sbGFwc2VkRW50cmllczogQ29sbGFwc2VkRW50cmllcztcbiAgcHVibGljIGVudHJ5Q291bnQ6IG51bWJlcjtcbiAgcHVibGljIGlzQ29sbGFwc2VkOiBib29sZWFuO1xuICBASW5wdXQoKSB2YWx1ZTogYW55O1xuICBwdWJsaWMgdmFsdWVUeXBlOiBWYWx1ZVR5cGU7XG5cbiAgLy8gSSBpbml0aWFsaXplIHRoZSBqc29uIHRyZWUgY29tcG9uZW50LlxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICAgIHRoaXMuY29sbGFwc2VkRW50cmllcyA9IE9iamVjdC5jcmVhdGUoIG51bGwgKTtcbiAgICB0aGlzLmVudHJ5Q291bnQgPSAwO1xuICAgIHRoaXMuaXNDb2xsYXBzZWQgPSBmYWxzZTtcbiAgICB0aGlzLnZhbHVlID0gIFwiXCJcbiAgICB0aGlzLnZhbHVlVHlwZSA9IHRoaXMuY2FsY3VsYXRlVHlwZSggdGhpcy52YWx1ZSApO1xuICAgIC8vIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpXG4gIH1cblxuXG4gIC8vIC0tLVxuICAvLyBQVUJMSUMgTUVUSE9EUy5cbiAgLy8gLS0tXG5cbiAgLy8gSSBjYWxjdWxhdGUgdGhlIFR5cGUgZm9yIHRoZSBnaXZlbiB2YWx1ZS5cbiAgcHVibGljIGNhbGN1bGF0ZVR5cGUoIHRhcmdldDogYW55ICkgOiBWYWx1ZVR5cGUge1xuXG4gICAgaWYgKCB0YXJnZXQgPT09IG51bGwgKSB7XG5cbiAgICAgIHJldHVybiggXCJOdWxsXCIgKTtcblxuICAgIH1cblxuICAgIGlmICggdHlwZW9mKCB0YXJnZXQgKSA9PT0gXCJzdHJpbmdcIiApIHtcblxuICAgICAgcmV0dXJuKCBcIlN0cmluZ1wiICk7XG5cbiAgICB9XG5cbiAgICBpZiAoIHR5cGVvZiggdGFyZ2V0ICkgPT09IFwibnVtYmVyXCIgKSB7XG5cbiAgICAgIHJldHVybiggXCJOdW1iZXJcIiApO1xuXG4gICAgfVxuXG4gICAgaWYgKCB0eXBlb2YoIHRhcmdldCApID09PSBcImJvb2xlYW5cIiApIHtcblxuICAgICAgcmV0dXJuKCBcIkJvb2xlYW5cIiApO1xuXG4gICAgfVxuXG4gICAgaWYgKCBBcnJheS5pc0FycmF5KCB0YXJnZXQgKSApIHtcblxuICAgICAgcmV0dXJuKCBcIkFycmF5XCIgKTtcblxuICAgIH1cblxuICAgIHJldHVybiggXCJPYmplY3RcIiApO1xuXG4gIH1cblxuXG4gIC8vIEkgZ2V0IGNhbGxlZCB3aGVuIHRoZSBpbnB1dCBiaW5kaW5ncyBoYXZlIGJlZW4gdXBkYXRlZC5cbiAgcHVibGljIG5nT25DaGFuZ2VzKCkgOiB2b2lkIHtcblxuICAgIHRoaXMuZW50cnlDb3VudCA9IDA7XG4gICAgdGhpcy5pc0NvbGxhcHNlZCA9IGZhbHNlO1xuICAgIHRoaXMudmFsdWVUeXBlID0gdGhpcy5jYWxjdWxhdGVUeXBlKCB0aGlzLnZhbHVlICk7XG4gICAgdGhpcy5jbGVhckNvbGxhcHNlZEVudHJpZXMoKTtcblxuICAgIGlmICggdGhpcy52YWx1ZVR5cGUgPT09IFwiT2JqZWN0XCIgKSB7XG5cbiAgICAgIHRoaXMuZW50cnlDb3VudCA9IE9iamVjdC5rZXlzKCB0aGlzLnZhbHVlICkubGVuZ3RoO1xuXG4gICAgfSBlbHNlIGlmICggdGhpcy52YWx1ZVR5cGUgPT09IFwiQXJyYXlcIiApIHtcblxuICAgICAgdGhpcy5lbnRyeUNvdW50ID0gdGhpcy52YWx1ZS5sZW5ndGg7XG5cbiAgICB9XG5cbiAgfVxuXG5cbiAgLy8gSSBhdHRlbXB0IHRvIHBhcnNlIHRoZSBjdXJyZW50IFN0cmluZyB2YWx1ZSBhcyBhIEpTT04gcGF5bG9hZC5cbiAgLy8gLS1cbiAgLy8gTk9URTogVGhpcyBvdmVycmlkZXMgdGhlIHBhc3NlZC1pbiBzdGF0ZSBhdCB0aGlzIHBvaW50IGluIHRoZSBKU09OIFRyZWUuXG4gIHB1YmxpYyBwYXJzZVN0cmluZyggZXZlbnQ6IGFueSApIDogdm9pZCB7XG5cblxuICAgIGlmICggISBldmVudC5tZXRhS2V5ICkge1xuXG4gICAgICByZXR1cm47XG5cbiAgICB9XG5cblxuXG4gICAgdHJ5IHtcblxuICAgICAgdGhpcy52YWx1ZSA9IEpTT04ucGFyc2UoIHRoaXMudmFsdWUgKTtcbiAgICAgIHRoaXMubmdPbkNoYW5nZXMoKTtcblxuICAgICAgY29uc29sZS5ncm91cCggXCJTdHJpbmcgUGFyc2luZ1wiICk7XG4gICAgICBjb25zb2xlLmxvZyggXCJUaGUgdmFsdWUgd2FzIHN1Y2Nlc3NmdWxseSBwYXJzZWQgYXMgSlNPTi5cIiApO1xuICAgICAgY29uc29sZS5sb2coIHRoaXMudmFsdWUgKTtcbiAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcblxuICAgIH0gY2F0Y2ggKCBlcnJvciApIHtcblxuICAgICAgY29uc29sZS5ncm91cCggXCJTdHJpbmcgUGFyc2luZ1wiICk7XG4gICAgICBjb25zb2xlLndhcm4oIFwiVGhlIHZhbHVlIGNvdWxkIG5vdCBiZSBwYXJzZWQgYXMgSlNPTi5cIiApO1xuICAgICAgY29uc29sZS5lcnJvciggZXJyb3IgKTtcbiAgICAgIGNvbnNvbGUubG9nKCB0aGlzLnZhbHVlICk7XG4gICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG5cbiAgICB9XG5cbiAgfVxuXG5cbiAgLy8gSSB0b2dnbGUgdGhlIGV4cGFuc2lvbiBvZiB0aGUgZ2l2ZW4gdmFsdWUuXG4gIHB1YmxpYyB0b2dnbGUoIGluZGV4Pzogc3RyaW5nIHwgbnVtYmVyICkgOiB2b2lkIHtcblxuICAgIC8vIFRvcC1sZXZlbCB0b2dnbGUuXG4gICAgaWYgKCBpbmRleCA9PT0gdW5kZWZpbmVkICkge1xuXG4gICAgICB0aGlzLmlzQ29sbGFwc2VkID0gISB0aGlzLmlzQ29sbGFwc2VkO1xuXG4gICAgICAvLyBJZiB3ZSdyZSBjb2xsYXBzaW5nIHRoZSB0b3AtbGV2ZWwgdmFsdWUsIHRoZW4gcmVzZXQgYW55IHNldHRpbmdzIGZvciB0aGVcbiAgICAgIC8vIHN1Yi1lbnRyeSB2aXNpYmlsaXR5LlxuICAgICAgaWYgKCB0aGlzLmlzQ29sbGFwc2VkICkge1xuXG4gICAgICAgIHRoaXMuY2xlYXJDb2xsYXBzZWRFbnRyaWVzKCk7XG5cbiAgICAgIH1cblxuICAgICAgLy8gU3ViLWVudHJ5IHRvZ2dsZS5cbiAgICB9IGVsc2Uge1xuXG4gICAgICB0aGlzLmNvbGxhcHNlZEVudHJpZXNbIGluZGV4IF0gPSAhIHRoaXMuY29sbGFwc2VkRW50cmllc1sgaW5kZXggXTtcblxuICAgIH1cblxuICB9XG5cbiAgLy8gLS0tXG4gIC8vIFBSSVZBVEUgTUVUSE9EUy5cbiAgLy8gLS0tXG5cbiAgLy8gSSBjbGVhciB0aGUgY29sbGFwc2VkIGVudHJpZXMgaW5kZXguXG4gIHByaXZhdGUgY2xlYXJDb2xsYXBzZWRFbnRyaWVzKCkgOiB2b2lkIHtcblxuICAgIGZvciAoIHZhciBrZXkgaW4gdGhpcy5jb2xsYXBzZWRFbnRyaWVzICkge1xuXG4gICAgICBkZWxldGUoIHRoaXMuY29sbGFwc2VkRW50cmllc1sga2V5IF0gKTtcblxuICAgIH1cblxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICB9XG5cbiAgdXBkYXRlRGF0YShhcGlSZXNwb25zZTphbnkpOnZvaWR7XG4gICAgdGhpcy5jb2xsYXBzZWRFbnRyaWVzID0gT2JqZWN0LmNyZWF0ZSggbnVsbCApO1xuICAgIHRoaXMuZW50cnlDb3VudCA9IDA7XG4gICAgdGhpcy5pc0NvbGxhcHNlZCA9IGZhbHNlO1xuICAgIHRoaXMudmFsdWUgPSAgYXBpUmVzcG9uc2VcbiAgICBjb25zb2xlLmxvZyh0aGlzLnZhbHVlICk7XG4gICAgdGhpcy52YWx1ZVR5cGUgPSB0aGlzLmNhbGN1bGF0ZVR5cGUoIHRoaXMudmFsdWUgKTtcbiAgICAvLyB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKVxuXG4gIH1cbiAgYXNzZXJ0U3RyaW5nS2V5KGtleTogdW5rbm93bik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGtleSBhcyBzdHJpbmc7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcblxuICB9XG5cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJwYXlsb2FkXCJcbiAgW25nU3dpdGNoXT1cInZhbHVlVHlwZVwiPlxuXG4gIDxuZy10ZW1wbGF0ZSBuZ1N3aXRjaENhc2U9XCJOdWxsXCI+XG5cbiAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiKCAhIGlzQ29sbGFwc2VkIClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ2YWx1ZSBpcy1udWxsXCI+XG4gICAgICAgIG51bGxcbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPG5nLXRlbXBsYXRlIG5nU3dpdGNoQ2FzZT1cIlN0cmluZ1wiPlxuXG4gICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cIiggISBpc0NvbGxhcHNlZCApXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwidmFsdWUgaXMtc3RyaW5nXCI+XG4gICAgICAgIDxhIChjbGljayk9XCJwYXJzZVN0cmluZyggJGV2ZW50IClcIj5cbiAgICAgICAgICB7eyB2YWx1ZSB9fVxuICAgICAgICA8L2E+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L25nLXRlbXBsYXRlPlxuXG4gIDxuZy10ZW1wbGF0ZSBuZ1N3aXRjaENhc2U9XCJOdW1iZXJcIj5cblxuICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCIoICEgaXNDb2xsYXBzZWQgKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInZhbHVlIGlzLW51bWJlclwiPlxuICAgICAgICB7eyB2YWx1ZSB9fVxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8bmctdGVtcGxhdGUgbmdTd2l0Y2hDYXNlPVwiQm9vbGVhblwiPlxuXG4gICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cIiggISBpc0NvbGxhcHNlZCApXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwidmFsdWUgaXMtYm9vbGVhblwiPlxuICAgICAgICB7eyB2YWx1ZSB9fVxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8bmctdGVtcGxhdGUgbmdTd2l0Y2hDYXNlPVwiQXJyYXlcIj5cbiAgICA8ZGl2XG4gICAgICAoY2xpY2spPVwidG9nZ2xlKClcIlxuICAgICAgY2xhc3M9XCJoZWFkZXIgaXMtYXJyYXlcIlxuICAgICAgW2NsYXNzLmlzLWNvbGxhcHNlZF09XCJpc0NvbGxhcHNlZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInR5cGVcIj5cbiAgICAgICAgQXJyYXlcbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImVudHJ5LWNvdW50XCI+XG4gICAgICAgIEVudHJpZXM6IHt7IGVudHJ5Q291bnQgfX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCIoICEgaXNDb2xsYXBzZWQgKVwiPlxuICAgICAgPG5nLXRlbXBsYXRlIG5nRm9yIGxldC1zdWJ2YWx1ZSBsZXQtaW5kZXg9XCJpbmRleFwiIFtuZ0Zvck9mXT1cInZhbHVlXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlKCBpbmRleCApXCJcbiAgICAgICAgICBjbGFzcz1cImxhYmVsIGlzLWFycmF5XCJcbiAgICAgICAgICBbY2xhc3MuaXMtY29sbGFwc2VkXT1cImNvbGxhcHNlZEVudHJpZXNbIGluZGV4IF1cIj5cbiAgICAgICAgICB7eyBpbmRleCB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cIiggISBjb2xsYXBzZWRFbnRyaWVzWyBpbmRleCBdIClcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidmFsdWUgaXMtYXJyYXlcIj5cbiAgICAgICAgICAgIDxBdXRvSnNvbkNvbXBvbmVudCBbdmFsdWVdPVwic3VidmFsdWVcIj48L0F1dG9Kc29uQ29tcG9uZW50PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L25nLXRlbXBsYXRlPlxuXG4gIDxuZy10ZW1wbGF0ZSBuZ1N3aXRjaENhc2U9XCJPYmplY3RcIj5cblxuICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCIhaXNDb2xsYXBzZWRcIj5cbiAgICAgIDxuZy10ZW1wbGF0ZSBuZ0ZvciBsZXQtc3VidmFsdWUgW25nRm9yT2ZdPVwidmFsdWUgfCBrZXl2YWx1ZVwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZShhc3NlcnRTdHJpbmdLZXkoc3VidmFsdWUua2V5KSlcIlxuICAgICAgICAgIGNsYXNzPVwibGFiZWwgaXMtb2JqZWN0XCJcbiAgICAgICAgICBbY2xhc3MuaXMtY29sbGFwc2VkXT1cImNvbGxhcHNlZEVudHJpZXNbYXNzZXJ0U3RyaW5nS2V5KHN1YnZhbHVlLmtleSldXCI+XG4gICAgICAgICAge3sgc3VidmFsdWUua2V5IH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiIWNvbGxhcHNlZEVudHJpZXNbYXNzZXJ0U3RyaW5nS2V5KHN1YnZhbHVlLmtleSldXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZhbHVlIGlzLW9iamVjdFwiPlxuICAgICAgICAgICAgPEF1dG9Kc29uQ29tcG9uZW50IFt2YWx1ZV09XCJzdWJ2YWx1ZS52YWx1ZVwiPjwvQXV0b0pzb25Db21wb25lbnQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvbmctdGVtcGxhdGU+XG5cblxuPC9kaXY+XG4iXX0=