UNPKG

@glimmer/runtime

Version:

Minimal runtime needed to render Glimmer templates

190 lines (158 loc) 21.3 kB
var _a; import { DEBUG } from '@glimmer/env'; import { assert, symbol } from '@glimmer/util'; import { track, updateTag } from '@glimmer/validator'; import { DOMChangesImpl, DOMTreeConstruction } from './dom/helper'; import { RuntimeProgramImpl } from '@glimmer/program'; import DebugRenderTree from './debug-render-tree'; export const TRANSACTION = symbol('TRANSACTION'); class TransactionImpl { constructor() { this.scheduledInstallModifiers = []; this.scheduledUpdateModifiers = []; this.createdComponents = []; this.updatedComponents = []; } didCreate(component) { this.createdComponents.push(component); } didUpdate(component) { this.updatedComponents.push(component); } scheduleInstallModifier(modifier) { this.scheduledInstallModifiers.push(modifier); } scheduleUpdateModifier(modifier) { this.scheduledUpdateModifiers.push(modifier); } commit() { let { createdComponents, updatedComponents } = this; for (let i = 0; i < createdComponents.length; i++) { let { manager, state } = createdComponents[i]; manager.didCreate(state); } for (let i = 0; i < updatedComponents.length; i++) { let { manager, state } = updatedComponents[i]; manager.didUpdate(state); } let { scheduledInstallModifiers, scheduledUpdateModifiers } = this; // Prevent a transpilation issue we guard against in Ember, the // throw-if-closure-required issue let manager, state; for (let i = 0; i < scheduledInstallModifiers.length; i++) { let modifier = scheduledInstallModifiers[i]; manager = modifier.manager; state = modifier.state; let modifierTag = manager.getTag(state); if (modifierTag !== null) { let tag = track( // eslint-disable-next-line no-loop-func () => manager.install(state), DEBUG && `- While rendering:\n (instance of a \`${modifier.definition.resolvedName || manager.getDebugName(modifier.definition.state)}\` modifier)`); updateTag(modifierTag, tag); } else { manager.install(state); } } for (let i = 0; i < scheduledUpdateModifiers.length; i++) { let modifier = scheduledUpdateModifiers[i]; manager = modifier.manager; state = modifier.state; let modifierTag = manager.getTag(state); if (modifierTag !== null) { let tag = track( // eslint-disable-next-line no-loop-func () => manager.update(state), DEBUG && `- While rendering:\n (instance of a \`${modifier.definition.resolvedName || manager.getDebugName(modifier.definition.state)}\` modifier)`); updateTag(modifierTag, tag); } else { manager.update(state); } } } } export class EnvironmentImpl { constructor(options, delegate) { this.delegate = delegate; this[_a] = null; // Delegate methods and values this.isInteractive = this.delegate.isInteractive; this.debugRenderTree = this.delegate.enableDebugTooling ? new DebugRenderTree() : undefined; if (options.appendOperations) { this.appendOperations = options.appendOperations; this.updateOperations = options.updateOperations; } else if (options.document) { this.appendOperations = new DOMTreeConstruction(options.document); this.updateOperations = new DOMChangesImpl(options.document); } else if (DEBUG) { throw new Error('you must pass document or appendOperations to a new runtime'); } } getAppendOperations() { return this.appendOperations; } getDOM() { return this.updateOperations; } begin() { var _b; (false && assert(!this[TRANSACTION], 'A glimmer transaction was begun, but one already exists. You may have a nested transaction, possibly caused by an earlier runtime exception while rendering. Please check your console for the stack trace of any prior exceptions.')); (_b = this.debugRenderTree) === null || _b === void 0 ? void 0 : _b.begin(); this[TRANSACTION] = new TransactionImpl(); } get transaction() { return this[TRANSACTION]; } didCreate(component) { this.transaction.didCreate(component); } didUpdate(component) { this.transaction.didUpdate(component); } scheduleInstallModifier(modifier) { if (this.isInteractive) { this.transaction.scheduleInstallModifier(modifier); } } scheduleUpdateModifier(modifier) { if (this.isInteractive) { this.transaction.scheduleUpdateModifier(modifier); } } commit() { var _b; let transaction = this.transaction; this[TRANSACTION] = null; transaction.commit(); (_b = this.debugRenderTree) === null || _b === void 0 ? void 0 : _b.commit(); this.delegate.onTransactionCommit(); } } _a = TRANSACTION; export function runtimeContext(options, delegate, artifacts, resolver) { return { env: new EnvironmentImpl(options, delegate), program: new RuntimeProgramImpl(artifacts.constants, artifacts.heap), resolver: resolver }; } export function inTransaction(env, cb) { if (!env[TRANSACTION]) { env.begin(); try { cb(); } finally { env.commit(); } } else { cb(); } } export default EnvironmentImpl; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL2Vudmlyb25tZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsU0FBUyxLQUFULFFBQXNCLGNBQXRCO0FBaUJBLFNBQVMsTUFBVCxFQUF5QixNQUF6QixRQUF1QyxlQUF2QztBQUNBLFNBQVMsS0FBVCxFQUFnQixTQUFoQixRQUFpQyxvQkFBakM7QUFDQSxTQUFTLGNBQVQsRUFBeUIsbUJBQXpCLFFBQW9ELGNBQXBEO0FBQ0EsU0FBUyxrQkFBVCxRQUFtQyxrQkFBbkM7QUFDQSxPQUFPLGVBQVAsTUFBNEIscUJBQTVCO0FBRUEsT0FBTyxNQUFNLFdBQVcsR0FBc0IsTUFBTSxDQUFDLGFBQUQsQ0FBN0M7O0FBRVAsTUFBTSxlQUFOLENBQXFCO0FBQXJCLEVBQUEsV0FBQSxHQUFBO0FBQ1MsU0FBQSx5QkFBQSxHQUFnRCxFQUFoRDtBQUNBLFNBQUEsd0JBQUEsR0FBK0MsRUFBL0M7QUFDQSxTQUFBLGlCQUFBLEdBQW1ELEVBQW5EO0FBQ0EsU0FBQSxpQkFBQSxHQUFtRCxFQUFuRDtBQWlGUjs7QUEvRUMsRUFBQSxTQUFTLENBQUMsU0FBRCxFQUF1QztBQUM5QyxTQUFLLGlCQUFMLENBQXVCLElBQXZCLENBQTRCLFNBQTVCO0FBQ0Q7O0FBRUQsRUFBQSxTQUFTLENBQUMsU0FBRCxFQUF1QztBQUM5QyxTQUFLLGlCQUFMLENBQXVCLElBQXZCLENBQTRCLFNBQTVCO0FBQ0Q7O0FBRUQsRUFBQSx1QkFBdUIsQ0FBQyxRQUFELEVBQTJCO0FBQ2hELFNBQUsseUJBQUwsQ0FBK0IsSUFBL0IsQ0FBb0MsUUFBcEM7QUFDRDs7QUFFRCxFQUFBLHNCQUFzQixDQUFDLFFBQUQsRUFBMkI7QUFDL0MsU0FBSyx3QkFBTCxDQUE4QixJQUE5QixDQUFtQyxRQUFuQztBQUNEOztBQUVELEVBQUEsTUFBTSxHQUFBO0FBQ0osUUFBSTtBQUFFLE1BQUEsaUJBQUY7QUFBcUIsTUFBQTtBQUFy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R0FBeEIsRUFBMEMsRUFBMUMsRUFBd0Q7QUFDNUQsTUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFELENBQVIsRUFBdUI7QUFDckIsSUFBQSxHQUFHLENBQUMsS0FBSjs7QUFDQSxRQUFJO0FBQ0YsTUFBQSxFQUFFO0FBQ0gsS0FGRCxTQUVVO0FBQ1IsTUFBQSxHQUFHLENBQUMsTUFBSjtBQUNEO0FBQ0YsR0FQRCxNQU9PO0FBQ0wsSUFBQSxFQUFFO0FBQ0g7QUFDRjtBQUVELGVBQWUsZUFBZiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERFQlVHIH0gZnJvbSAnQGdsaW1tZXIvZW52JztcbmltcG9ydCB7XG4gIEVudmlyb25tZW50LFxuICBFbnZpcm9ubWVudE9wdGlvbnMsXG4gIEdsaW1tZXJUcmVlQ2hhbmdlcyxcbiAgR2xpbW1lclRyZWVDb25zdHJ1Y3Rpb24sXG4gIFRyYW5zYWN0aW9uLFxuICBUcmFuc2FjdGlvblN5bWJvbCxcbiAgUnVudGltZUNvbnRleHQsXG4gIFJ1bnRpbWVSZXNvbHZlcixcbiAgT3B0aW9uLFxuICBSdW50aW1lQXJ0aWZhY3RzLFxuICBDb21wb25lbnRJbnN0YW5jZVdpdGhDcmVhdGUsXG4gIE1vZGlmaWVySW5zdGFuY2UsXG4gIEludGVybmFsTW9kaWZpZXJNYW5hZ2VyLFxuICBNb2RpZmllckluc3RhbmNlU3RhdGUsXG59IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgYXNzZXJ0LCBleHBlY3QsIHN5bWJvbCB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuaW1wb3J0IHsgdHJhY2ssIHVwZGF0ZVRhZyB9IGZyb20gJ0BnbGltbWVyL3ZhbGlkYXRvcic7XG5pbXBvcnQgeyBET01DaGFuZ2VzSW1wbCwgRE9NVHJlZUNvbnN0cnVjdGlvbiB9IGZyb20gJy4vZG9tL2hlbHBlcic7XG5pbXBvcnQgeyBSdW50aW1lUHJvZ3JhbUltcGwgfSBmcm9tICdAZ2xpbW1lci9wcm9ncmFtJztcbmltcG9ydCBEZWJ1Z1JlbmRlclRyZWUgZnJvbSAnLi9kZWJ1Zy1yZW5kZXItdHJlZSc7XG5cbmV4cG9ydCBjb25zdCBUUkFOU0FDVElPTjogVHJhbnNhY3Rpb25TeW1ib2wgPSBzeW1ib2woJ1RSQU5TQUNUSU9OJyk7XG5cbmNsYXNzIFRyYW5zYWN0aW9uSW1wbCBpbXBsZW1lbnRzIFRyYW5zYWN0aW9uIHtcbiAgcHVibGljIHNjaGVkdWxlZEluc3RhbGxNb2RpZmllcnM6IE1vZGlmaWVySW5zdGFuY2VbXSA9IFtdO1xuICBwdWJsaWMgc2NoZWR1bGVkVXBkYXRlTW9kaWZpZXJzOiBNb2RpZmllckluc3RhbmNlW10gPSBbXTtcbiAgcHVibGljIGNyZWF0ZWRDb21wb25lbnRzOiBDb21wb25lbnRJbnN0YW5jZVdpdGhDcmVhdGVbXSA9IFtdO1xuICBwdWJsaWMgdXBkYXRlZENvbXBvbmVudHM6IENvbXBvbmVudEluc3RhbmNlV2l0aENyZWF0ZVtdID0gW107XG5cbiAgZGlkQ3JlYXRlKGNvbXBvbmVudDogQ29tcG9uZW50SW5zdGFuY2VXaXRoQ3JlYXRlKSB7XG4gICAgdGhpcy5jcmVhdGVkQ29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG4gIH1cblxuICBkaWRVcGRhdGUoY29tcG9uZW50OiBDb21wb25lbnRJbnN0YW5jZVdpdGhDcmVhdGUpIHtcbiAgICB0aGlzLnVwZGF0ZWRDb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcbiAgfVxuXG4gIHNjaGVkdWxlSW5zdGFsbE1vZGlmaWVyKG1vZGlmaWVyOiBNb2RpZmllckluc3RhbmNlKSB7XG4gICAgdGhpcy5zY2hlZHVsZWRJbnN0YWxsTW9kaWZpZXJzLnB1c2gobW9kaWZpZXIpO1xuICB9XG5cbiAgc2NoZWR1bGVVcGRhdGVNb2RpZmllcihtb2RpZmllcjogTW9kaWZpZXJJbnN0YW5jZSkge1xuICAgIHRoaXMuc2NoZWR1bGVkVXBkYXRlTW9kaWZpZXJzLnB1c2gobW9kaWZpZXIpO1xuICB9XG5cbiAgY29tbWl0KCkge1xuICAgIGxldCB7IGNyZWF0ZWRDb21wb25lbnRzLCB1cGRhdGVkQ29tcG9uZW50cyB9ID0gdGhpcztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY3JlYXRlZENvbXBvbmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCB7IG1hbmFnZXIsIHN0YXRlIH0gPSBjcmVhdGVkQ29tcG9uZW50c1tpXTtcbiAgICAgIG1hbmFnZXIuZGlkQ3JlYXRlKHN0YXRlKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVwZGF0ZWRDb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgeyBtYW5hZ2VyLCBzdGF0ZSB9ID0gdXBkYXRlZENvbXBvbmVudHNbaV07XG4gICAgICBtYW5hZ2VyLmRpZFVwZGF0ZShzdGF0ZSk7XG4gICAgfVxuXG4gICAgbGV0IHsgc2NoZWR1bGVkSW5zdGFsbE1vZGlmaWVycywgc2NoZWR1bGVkVXBkYXRlTW9kaWZpZXJzIH0gPSB0aGlzO1xuXG4gICAgLy8gUHJldmVudCBhIHRyYW5zcGlsYXRpb24gaXNzdWUgd2UgZ3VhcmQgYWdhaW5zdCBpbiBFbWJlciwgdGhlXG4gICAgLy8gdGhyb3ctaWYtY2xvc3VyZS1yZXF1aXJlZCBpc3N1ZVxuICAgIGxldCBtYW5hZ2VyOiBJbnRlcm5hbE1vZGlmaWVyTWFuYWdlciwgc3RhdGU6IE1vZGlmaWVySW5zdGFuY2VTdGF0ZTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZWR1bGVkSW5zdGFsbE1vZGlmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IG1vZGlmaWVyID0gc2NoZWR1bGVkSW5zdGFsbE1vZGlmaWVyc1tpXTtcbiAgICAgIG1hbmFnZXIgPSBtb2RpZmllci5tYW5hZ2VyO1xuICAgICAgc3RhdGUgPSBtb2RpZmllci5zdGF0ZTtcblxuICAgICAgbGV0IG1vZGlmaWVyVGFnID0gbWFuYWdlci5nZXRUYWcoc3RhdGUpO1xuXG4gICAgICBpZiAobW9kaWZpZXJUYWcgIT09IG51bGwpIHtcbiAgICAgICAgbGV0IHRhZyA9IHRyYWNrKFxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1sb29wLWZ1bmNcbiAgICAgICAgICAoKSA9PiBtYW5hZ2VyLmluc3RhbGwoc3RhdGUpLFxuICAgICAgICAgIERFQlVHICYmXG4gICAgICAgICAgICBgLSBXaGlsZSByZW5kZXJpbmc6XFxuICAoaW5zdGFuY2Ugb2YgYSBcXGAke1xuICAgICAgICAgICAgICBtb2RpZmllci5kZWZpbml0aW9uLnJlc29sdmVkTmFtZSB8fCBtYW5hZ2VyLmdldERlYnVnTmFtZShtb2RpZmllci5kZWZpbml0aW9uLnN0YXRlKVxuICAgICAgICAgICAgfVxcYCBtb2RpZmllcilgXG4gICAgICAgICk7XG4gICAgICAgIHVwZGF0ZVRhZyhtb2RpZmllclRhZywgdGFnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1hbmFnZXIuaW5zdGFsbChzdGF0ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2hlZHVsZWRVcGRhdGVNb2RpZmllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBtb2RpZmllciA9IHNjaGVkdWxlZFVwZGF0ZU1vZGlmaWVyc1tpXTtcbiAgICAgIG1hbmFnZXIgPSBtb2RpZmllci5tYW5hZ2VyO1xuICAgICAgc3RhdGUgPSBtb2RpZmllci5zdGF0ZTtcblxuICAgICAgbGV0IG1vZGlmaWVyVGFnID0gbWFuYWdlci5nZXRUYWcoc3RhdGUpO1xuXG4gICAgICBpZiAobW9kaWZpZXJUYWcgIT09IG51bGwpIHtcbiAgICAgICAgbGV0IHRhZyA9IHRyYWNrKFxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1sb29wLWZ1bmNcbiAgICAgICAgICAoKSA9PiBtYW5hZ2VyLnVwZGF0ZShzdGF0ZSksXG4gICAgICAgICAgREVCVUcgJiZcbiAgICAgICAgICAgIGAtIFdoaWxlIHJlbmRlcmluZzpcXG4gIChpbnN0YW5jZSBvZiBhIFxcYCR7XG4gICAgICAgICAgICAgIG1vZGlmaWVyLmRlZmluaXRpb24ucmVzb2x2ZWROYW1lIHx8IG1hbmFnZXIuZ2V0RGVidWdOYW1lKG1vZGlmaWVyLmRlZmluaXRpb24uc3RhdGUpXG4gICAgICAgICAgICB9XFxgIG1vZGlmaWVyKWBcbiAgICAgICAgKTtcbiAgICAgICAgdXBkYXRlVGFnKG1vZGlmaWVyVGFnLCB0YWcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWFuYWdlci51cGRhdGUoc3RhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRW52aXJvbm1lbnRJbXBsIGltcGxlbWVudHMgRW52aXJvbm1lbnQge1xuICBbVFJBTlNBQ1RJT05dOiBPcHRpb248VHJhbnNhY3Rpb25JbXBsPiA9IG51bGw7XG5cbiAgcHJvdGVjdGVkIGFwcGVuZE9wZXJhdGlvbnMhOiBHbGltbWVyVHJlZUNvbnN0cnVjdGlvbjtcbiAgcHJvdGVjdGVkIHVwZGF0ZU9wZXJhdGlvbnM/OiBHbGltbWVyVHJlZUNoYW5nZXM7XG5cbiAgLy8gRGVsZWdhdGUgbWV0aG9kcyBhbmQgdmFsdWVzXG4gIHB1YmxpYyBpc0ludGVyYWN0aXZlID0gdGhpcy5kZWxlZ2F0ZS5pc0ludGVyYWN0aXZlO1xuXG4gIGRlYnVnUmVuZGVyVHJlZSA9IHRoaXMuZGVsZWdhdGUuZW5hYmxlRGVidWdUb29saW5nID8gbmV3IERlYnVnUmVuZGVyVHJlZSgpIDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEVudmlyb25tZW50T3B0aW9ucywgcHJpdmF0ZSBkZWxlZ2F0ZTogRW52aXJvbm1lbnREZWxlZ2F0ZSkge1xuICAgIGlmIChvcHRpb25zLmFwcGVuZE9wZXJhdGlvbnMpIHtcbiAgICAgIHRoaXMuYXBwZW5kT3BlcmF0aW9ucyA9IG9wdGlvbnMuYXBwZW5kT3BlcmF0aW9ucztcbiAgICAgIHRoaXMudXBkYXRlT3BlcmF0aW9ucyA9IG9wdGlvbnMudXBkYXRlT3BlcmF0aW9ucztcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuZG9jdW1lbnQpIHtcbiAgICAgIHRoaXMuYXBwZW5kT3BlcmF0aW9ucyA9IG5ldyBET01UcmVlQ29uc3RydWN0aW9uKG9wdGlvbnMuZG9jdW1lbnQpO1xuICAgICAgdGhpcy51cGRhdGVPcGVyYXRpb25zID0gbmV3IERPTUNoYW5nZXNJbXBsKG9wdGlvbnMuZG9jdW1lbnQpO1xuICAgIH0gZWxzZSBpZiAoREVCVUcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigneW91IG11c3QgcGFzcyBkb2N1bWVudCBvciBhcHBlbmRPcGVyYXRpb25zIHRvIGEgbmV3IHJ1bnRpbWUnKTtcbiAgICB9XG4gIH1cblxuICBnZXRBcHBlbmRPcGVyYXRpb25zKCk6IEdsaW1tZXJUcmVlQ29uc3RydWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5hcHBlbmRPcGVyYXRpb25zO1xuICB9XG5cbiAgZ2V0RE9NKCk6IEdsaW1tZXJUcmVlQ2hhbmdlcyB7XG4gICAgcmV0dXJuIGV4cGVjdChcbiAgICAgIHRoaXMudXBkYXRlT3BlcmF0aW9ucyxcbiAgICAgICdBdHRlbXB0ZWQgdG8gZ2V0IERPTSB1cGRhdGVPcGVyYXRpb25zLCBidXQgdGhleSB3ZXJlIG5vdCBwcm92aWRlZCBieSB0aGUgZW52aXJvbm1lbnQuIFlvdSBtYXkgYmUgYXR0ZW1wdGluZyB0byByZXJlbmRlciBpbiBhbiBlbnZpcm9ubWVudCB3aGljaCBkb2VzIG5vdCBzdXBwb3J0IHJlcmVuZGVyaW5nLCBzdWNoIGFzIFNTUi4nXG4gICAgKTtcbiAgfVxuXG4gIGJlZ2luKCkge1xuICAgIGFzc2VydChcbiAgICAgICF0aGlzW1RSQU5TQUNUSU9OXSxcbiAgICAgICdBIGdsaW1tZXIgdHJhbnNhY3Rpb24gd2FzIGJlZ3VuLCBidXQgb25lIGFscmVhZHkgZXhpc3RzLiBZb3UgbWF5IGhhdmUgYSBuZXN0ZWQgdHJhbnNhY3Rpb24sIHBvc3NpYmx5IGNhdXNlZCBieSBhbiBlYXJsaWVyIHJ1bnRpbWUgZXhjZXB0aW9uIHdoaWxlIHJlbmRlcmluZy4gUGxlYXNlIGNoZWNrIHlvdXIgY29uc29sZSBmb3IgdGhlIHN0YWNrIHRyYWNlIG9mIGFueSBwcmlvciBleGNlcHRpb25zLidcbiAgICApO1xuXG4gICAgdGhpcy5kZWJ1Z1JlbmRlclRyZWU/LmJlZ2luKCk7XG5cbiAgICB0aGlzW1RSQU5TQUNUSU9OXSA9IG5ldyBUcmFuc2FjdGlvbkltcGwoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHRyYW5zYWN0aW9uKCk6IFRyYW5zYWN0aW9uSW1wbCB7XG4gICAgcmV0dXJuIGV4cGVjdCh0aGlzW1RSQU5TQUNUSU9OXSEsICdtdXN0IGJlIGluIGEgdHJhbnNhY3Rpb24nKTtcbiAgfVxuXG4gIGRpZENyZWF0ZShjb21wb25lbnQ6IENvbXBvbmVudEluc3RhbmNlV2l0aENyZWF0ZSkge1xuICAgIHRoaXMudHJhbnNhY3Rpb24uZGlkQ3JlYXRlKGNvbXBvbmVudCk7XG4gIH1cblxuICBkaWRVcGRhdGUoY29tcG9uZW50OiBDb21wb25lbnRJbnN0YW5jZVdpdGhDcmVhdGUpIHtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLmRpZFVwZGF0ZShjb21wb25lbnQpO1xuICB9XG5cbiAgc2NoZWR1bGVJbnN0YWxsTW9kaWZpZXIobW9kaWZpZXI6IE1vZGlmaWVySW5zdGFuY2UpIHtcbiAgICBpZiAodGhpcy5pc0ludGVyYWN0aXZlKSB7XG4gICAgICB0aGlzLnRyYW5zYWN0aW9uLnNjaGVkdWxlSW5zdGFsbE1vZGlmaWVyKG1vZGlmaWVyKTtcbiAgICB9XG4gIH1cblxuICBzY2hlZHVsZVVwZGF0ZU1vZGlmaWVyKG1vZGlmaWVyOiBNb2RpZmllckluc3RhbmNlKSB7XG4gICAgaWYgKHRoaXMuaXNJbnRlcmFjdGl2ZSkge1xuICAgICAgdGhpcy50cmFuc2FjdGlvbi5zY2hlZHVsZVVwZGF0ZU1vZGlmaWVyKG1vZGlmaWVyKTtcbiAgICB9XG4gIH1cblxuICBjb21taXQoKSB7XG4gICAgbGV0IHRyYW5zYWN0aW9uID0gdGhpcy50cmFuc2FjdGlvbjtcbiAgICB0aGlzW1RSQU5TQUNUSU9OXSA9IG51bGw7XG4gICAgdHJhbnNhY3Rpb24uY29tbWl0KCk7XG5cbiAgICB0aGlzLmRlYnVnUmVuZGVyVHJlZT8uY29tbWl0KCk7XG5cbiAgICB0aGlzLmRlbGVnYXRlLm9uVHJhbnNhY3Rpb25Db21taXQoKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVudmlyb25tZW50RGVsZWdhdGUge1xuICAvKipcbiAgICogVXNlZCB0byBkZXRlcm1pbmUgdGhlIHRoZSBlbnZpcm9ubWVudCBpcyBpbnRlcmFjdGl2ZSAoZS5nLiBTU1IgaXMgbm90XG4gICAqIGludGVyYWN0aXZlKS4gSW50ZXJhY3RpdmUgZW52aXJvbm1lbnRzIHNjaGVkdWxlIG1vZGlmaWVycywgYW1vbmcgb3RoZXIgdGhpbmdzLlxuICAgKi9cbiAgaXNJbnRlcmFjdGl2ZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogVXNlZCB0byBlbmFibGUgZGVidWcgdG9vbGluZ1xuICAgKi9cbiAgZW5hYmxlRGVidWdUb29saW5nOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiBhbiBlbnZpcm9ubWVudCB0cmFuc2FjdGlvbiBjb21taXRzXG4gICAqL1xuICBvblRyYW5zYWN0aW9uQ29tbWl0OiAoKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVudGltZUNvbnRleHQoXG4gIG9wdGlvbnM6IEVudmlyb25tZW50T3B0aW9ucyxcbiAgZGVsZWdhdGU6IEVudmlyb25tZW50RGVsZWdhdGUsXG4gIGFydGlmYWN0czogUnVudGltZUFydGlmYWN0cyxcbiAgcmVzb2x2ZXI6IFJ1bnRpbWVSZXNvbHZlclxuKTogUnVudGltZUNvbnRleHQge1xuICByZXR1cm4ge1xuICAgIGVudjogbmV3IEVudmlyb25tZW50SW1wbChvcHRpb25zLCBkZWxlZ2F0ZSksXG4gICAgcHJvZ3JhbTogbmV3IFJ1bnRpbWVQcm9ncmFtSW1wbChhcnRpZmFjdHMuY29uc3RhbnRzLCBhcnRpZmFjdHMuaGVhcCksXG4gICAgcmVzb2x2ZXI6IHJlc29sdmVyLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5UcmFuc2FjdGlvbihlbnY6IEVudmlyb25tZW50LCBjYjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICBpZiAoIWVudltUUkFOU0FDVElPTl0pIHtcbiAgICBlbnYuYmVnaW4oKTtcbiAgICB0cnkge1xuICAgICAgY2IoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZW52LmNvbW1pdCgpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjYigpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEVudmlyb25tZW50SW1wbDtcbiJdLCJzb3VyY2VSb290IjoiIn0=