mnemonica 1.0.6 → 1.0.8
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/.ai/AGENTS.md +1 -1
- package/.ai/ONBOARDING.md +2 -1
- package/.ai/PROTOTYPE-CHAIN.md +122 -0
- package/.ai/TACTICA-DEEP-DIVE.md +52 -49
- package/.ai/TACTICA-RULES.md +8 -8
- package/.ai/rules-skill/lookup-typed.md +17 -19
- package/AGENTS.md +19 -13
- package/CONTRIBUTING.md +1 -1
- package/FOR_HUMANS.md +51 -20
- package/README.md +14 -12
- package/SKILL.md +4 -4
- package/build/api/types/createInstanceModificator.js +1 -1
- package/build/descriptors/types/index.js +1 -1
- package/build/index.d.ts +6 -7
- package/build/index.js +6 -13
- package/build/types/index.d.ts +25 -2
- package/build/types/index.js +1 -1
- package/build/utils/parent.d.ts +4 -1
- package/build/utils/parent.js +5 -6
- package/docs/UTILS.md +1 -1
- package/docs/ai-learning-trajectory.md +8 -8
- package/docs/async-constructors.md +18 -0
- package/docs/prototype-chain.md +127 -0
- package/docs/purpose.md +4 -4
- package/docs/tactica-pattern.md +10 -10
- package/docs/typed-lookup.md +19 -15
- package/module/index.js +0 -1
- package/package.json +2 -1
- package/src/api/types/createInstanceModificator.ts +13 -0
- package/src/descriptors/types/index.ts +1 -1
- package/src/index.ts +35 -53
- package/src/types/index.ts +88 -2
- package/src/utils/parent.ts +13 -2
package/build/types/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuLyogZXNsaW50IG5vLXVudXNlZC12YXJzOiBcIm9mZlwiICovXG5cbi8vIFByb3BzIHR5cGUgZm9yIGdldFByb3BzL3NldFByb3BzXG5leHBvcnQgdHlwZSBQcm9wc1R5cGUgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuLy8gQ29yZSB0eXBlIGRlZmluaXRpb25zIGZvciBtbmVtb25pY2FcblxuLy8gQmFzZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiB0eXBlIC0gY2FuIGJlIGEgY2xhc3MgY29uc3RydWN0b3Igb3IgYSBmdW5jdGlvbi5cbi8vIEFyZ3MgZGVmYXVsdHMgdG8gdW5rbm93bltdIHNvIElERUY8VD4gaXMgYmFja3dhcmRzIGNvbXBhdGlibGU7XG4vLyBzdXBwbHkgQXJncyB0byBnZXQgdHlwZWQgY29uc3RydWN0b3IgcGFyYW1zOiBJREVGPE15VHlwZSwgW3N0cmluZywgbnVtYmVyXT5cbmV4cG9ydCB0eXBlIElERUY8VCwgQXJncyBleHRlbmRzIHVua25vd25bXSA9IHVua25vd25bXT4gPSB7IG5ldygpOiBUIH0gfCB7ICh0aGlzOiBULCAuLi5hcmdzOiBBcmdzKTogdm9pZCB9O1xuXG4vLyBFcnJvciBtZXNzYWdlIHR5cGVzIC0gYWxsIGVycm9yIG1lc3NhZ2VzIGFyZSBzdHJpbmdzXG5leHBvcnQgdHlwZSBFcnJvck1lc3NhZ2VLZXkgPVxuXHR8ICdCQVNFX0VSUk9SX01FU1NBR0UnXG5cdHwgJ0hBTkRMRVJfTVVTVF9CRV9BX0ZVTkNUSU9OJ1xuXHR8ICdXUk9OR19UWVBFX0RFRklOSVRJT04nXG5cdHwgJ1dST05HX0lOU1RBTkNFX0lOVk9DQVRJT04nXG5cdHwgJ1dST05HX01PRElGSUNBVElPTl9QQVRURVJOJ1xuXHR8ICdBTFJFQURZX0RFQ0xBUkVEJ1xuXHR8ICdXUk9OR19BUkdVTUVOVFNfVVNFRCdcblx0fCAnV1JPTkdfSE9PS19UWVBFJ1xuXHR8ICdNSVNTSU5HX0hPT0tfQ0FMTEJBQ0snXG5cdHwgJ01JU1NJTkdfQ0FMTEJBQ0tfQVJHVU1FTlQnXG5cdHwgJ09QVElPTlNfRVJST1InXG5cdHwgJ1dST05HX1NUQUNLX0NMRUFORVInO1xuXHQvLyB8ICdUWVBFTkFNRV9NVVNUX0JFX0FfU1RSSU5HJ1xuXHQvLyB8ICdGTE9XX0NIRUNLRVJfUkVERUZJTklUSU9OJ1xuXG4vLyBFcnJvciBtZXNzYWdlcyBvYmplY3QgdHlwZVxuZXhwb3J0IHR5cGUgRXJyb3JNZXNzYWdlcyA9IFJlY29yZDxFcnJvck1lc3NhZ2VLZXksIHN0cmluZz47XG5cbi8vIEhvb2sgY2FsbGJhY2sg4oCUIHBhc3NlZCB0byByZWdpc3Rlckhvb2sgYW5kIGludm9rZWQgYnkgaW52b2tlSG9va1xuZXhwb3J0IGludGVyZmFjZSBob29rIGV4dGVuZHMgQ2FsbGFibGVGdW5jdGlvbiB7XG5cdChvcHRzOiBob29rc09wdHMpOiB1bmtub3duO1xufVxuXG4vLyBFcnJvciBjb25zdHJ1Y3RvciBmcm9tIGNvbnN0cnVjdEVycm9yIC0gY29uc3RydWN0YWJsZSBmdW5jdGlvbiB3aXRoIHByb3RvdHlwZVxuZXhwb3J0IGludGVyZmFjZSBNbmVtb25pY2FFcnJvckNvbnN0cnVjdG9yIHtcblx0bmV3KGFkZGl0aW9uPzogc3RyaW5nLCBzdGFjaz86IHN0cmluZyB8IHN0cmluZ1tdKTogRXJyb3I7XG5cdChuYW1lOiBzdHJpbmcpOiBFcnJvcjtcblx0cHJvdG90eXBlOiB7XG5cdFx0Y29uc3RydWN0b3I6IE1uZW1vbmljYUVycm9yQ29uc3RydWN0b3I7XG5cdH07XG59XG5cbi8vIEVycm9ycyB0eXBlcyBtYXAgLSBpbmRleGFibGUgcmVjb3JkIG9mIGVycm9yIGNvbnN0cnVjdG9yc1xuZXhwb3J0IHR5cGUgRXJyb3JzVHlwZXNNYXAgPSBSZWNvcmQ8c3RyaW5nLCBNbmVtb25pY2FFcnJvckNvbnN0cnVjdG9yPjtcblxuLy8gTW5lbW9uaWNhIGVycm9yIGludGVyZmFjZSBmb3IgZXh0ZW5kZWQgRXJyb3Igb2JqZWN0c1xuZXhwb3J0IGludGVyZmFjZSBNbmVtb25pY2FFcnJvciBleHRlbmRzIEVycm9yIHtcblx0ZXhjZXB0aW9uUmVhc29uPzogRXJyb3I7XG5cdHJlYXNvbnM/OiBFcnJvcltdO1xuXHRzdXJwbHVzPzogRXJyb3JbXTtcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBUeXBlIENvbnN0cnVjdG9yLlxuICogXCJUeXBlXCIgaGVyZSBpcyB1c2VkIGluIHRoZSBDb21wdXRlciBTY2llbmNlIHNlbnNlIOKAlCBhbiBpbnRlcmZhY2UvY29udHJhY3RcbiAqIGRlc2NyaWJpbmcgd2hhdCBhIGNvbnN0cnVjdG9yIG11c3Qgc2F0aXNmeSAoYm90aCBgbmV3YC1hYmxlIGFuZCBjYWxsYWJsZSkuXG4gKiBUQyA9IFR5cGUgQ29uc3RydWN0b3I7IFwiSW50ZXJuYWxcIiBtZWFucyB0aGlzIGlzIHRoZSBsaWJyYXJ5J3Mgb3duIGNvbnN0cnVjdG9yXG4gKiBzaGFwZSwgZGlzdGluY3QgZnJvbSB1c2VyLWZhY2luZyBUeXBlQ29uc3RydWN0b3IgYmVsb3cuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgX0ludGVybmFsX1RDXzxDb25zdHJ1Y3Rvckluc3RhbmNlIGV4dGVuZHMgb2JqZWN0PiB7XG5cdG5ldyguLi5hcmdzOiB1bmtub3duW10pOiBDb25zdHJ1Y3Rvckluc3RhbmNlO1xuXHQodGhpczogQ29uc3RydWN0b3JJbnN0YW5jZSwgLi4uYXJnczogdW5rbm93bltdKTogQ29uc3RydWN0b3JJbnN0YW5jZTtcblx0cmVhZG9ubHkgcHJvdG90eXBlOiBDb25zdHJ1Y3Rvckluc3RhbmNlICYge1xuXHRcdHJlYWRvbmx5IGNvbnN0cnVjdG9yOiBfSW50ZXJuYWxfVENfPENvbnN0cnVjdG9ySW5zdGFuY2U+XG5cdH07XG59XG5cbi8qKlxuICogUHVibGljIGFsaWFzIGZvciBfSW50ZXJuYWxfVENfIOKAlCB0aGUgc2hhcGUgb2YgY29uc3RydWN0b3IgZnVuY3Rpb25zIHJldHVybmVkIGJ5IGBkZWZpbmUoKWAuXG4gKiBBdWdtZW50ZWQgYnkgdGFjdGljYS1nZW5lcmF0ZWQgVHlwZVJlZ2lzdHJ5IHRvIGJlY29tZSB1c2VyLXNwZWNpZmljIHR5cGVzLlxuICogS2VwdCBhcyBhIG5hbWVkIGFsaWFzIChyYXRoZXIgdGhhbiBpbmxpbmluZyBfSW50ZXJuYWxfVENfKSBzbyB0YWN0aWNhIGNhbiByZWZlcmVuY2UgaXRcbiAqIGNsZWFubHkgaW4gZ2VuZXJhdGVkIGRlY2xhcmF0aW9uIGZpbGVzLlxuICovXG5leHBvcnQgdHlwZSBUeXBlQ29uc3RydWN0b3I8Q29uc3RydWN0b3JJbnN0YW5jZSBleHRlbmRzIG9iamVjdD4gPSBfSW50ZXJuYWxfVENfPENvbnN0cnVjdG9ySW5zdGFuY2U+O1xuXG4vLyBIb29rIHR5cGVzXG5leHBvcnQgdHlwZSBob29rc1R5cGVzID0gJ3ByZUNyZWF0aW9uJyB8ICdwb3N0Q3JlYXRpb24nIHwgJ2NyZWF0aW9uRXJyb3InO1xuXG4vLyBIb29rIG9wdGlvbnMgcGFzc2VkIHRvIGhvb2sgY2FsbGJhY2tzXG4vLyBQID0gcGFyZW50IC8gZXhpc3RlbnQgaW5zdGFuY2UgKHByb3RvKVxuLy8gVCA9IGNoaWxkIC8gaW5oZXJpdGVkIGluc3RhbmNlICh0eXBlIGJlaW5nIGNyZWF0ZWQpXG5leHBvcnQgdHlwZSBob29rc09wdHM8UCA9IG9iamVjdCwgVCA9IFA+ID0ge1xuXHRUeXBlTmFtZTogc3RyaW5nO1xuXHR0eXBlOiBUeXBlRGVmO1xuXHRhcmdzOiB1bmtub3duW107XG5cdGV4aXN0ZW50SW5zdGFuY2U6IFA7XG5cdGluaGVyaXRlZEluc3RhbmNlPzogVDtcblx0Y3JlYXRvcj86IHsgdGhyb3dNb2RpZmljYXRpb25FcnJvcihlcnJvcjogRXJyb3IpOiB2b2lkIH07XG59O1xuXG4vLyBDYWxsYmFjayBwYXNzZWQgaW50byBNb2RpZmljYXRpb25Db25zdHJ1Y3RvciB0byBhdHRhY2ggaW50ZXJuYWwgcHJvcHMgdG8gdGhlIHByb3RvdHlwZVxuZXhwb3J0IGludGVyZmFjZSBBZGRQcm9wc0NhbGxiYWNrIGV4dGVuZHMgQ2FsbGFibGVGdW5jdGlvbiB7XG5cdChwcm90bzogb2JqZWN0KTogdm9pZDtcbn1cblxuLy8gTW9kaWZpY2F0aW9uQ29uc3RydWN0b3I6IHdpcmVzIHByb3RvdHlwZSBjaGFpbiBkdXJpbmcgaW5zdGFuY2UgY3JlYXRpb25cbmV4cG9ydCBpbnRlcmZhY2UgTW9kaWZpY2F0aW9uQ29uc3RydWN0b3IgZXh0ZW5kcyBDYWxsYWJsZUZ1bmN0aW9uIHtcblx0KFxuXHRcdHRoaXM6IG9iamVjdCxcblx0XHRNb2RpZmljYXRvclR5cGU6IE1uZW1vbmljYUNvbnN0cnVjdG9yLFxuXHRcdE1vZGlmaWNhdG9yVHlwZVByb3RvdHlwZTogb2JqZWN0LFxuXHRcdF9hZGRQcm9wczogQWRkUHJvcHNDYWxsYmFja1xuXHQpOiBNbmVtb25pY2FDb25zdHJ1Y3Rvcjtcbn1cblxuLy8gRmFjdG9yeSB0aGF0IHJldHVybnMgYSBNb2RpZmljYXRpb25Db25zdHJ1Y3RvciAodXNlZCBpbiBjb25zdHJ1Y3Rvck9wdGlvbnMpXG5leHBvcnQgaW50ZXJmYWNlIE1vZGlmaWNhdGlvbkNvbnN0cnVjdG9yRmFjdG9yeSBleHRlbmRzIENhbGxhYmxlRnVuY3Rpb24ge1xuXHQoKTogTW9kaWZpY2F0aW9uQ29uc3RydWN0b3I7XG59XG5cbi8vIEZhY3RvcnkgdGhhdCByZXR1cm5zIGEgTW5lbW9uaWNhQ29uc3RydWN0b3IgKHN0b3JlZCBpbiBUeXBlRGVmLmNvbnN0cnVjdEhhbmRsZXIpXG5leHBvcnQgaW50ZXJmYWNlIE1uZW1vbmljYUNvbnN0cnVjdG9yRmFjdG9yeSBleHRlbmRzIENhbGxhYmxlRnVuY3Rpb24ge1xuXHQoKTogTW5lbW9uaWNhQ29uc3RydWN0b3I7XG59XG5cbi8vIE1hcmtzIHRoZSB0b3Agb2YgYSBjYXB0dXJlZCBzdGFjayB0cmFjZSAocGFzc2VkIHRvIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlIGFzIGNvbnN0cnVjdG9yT3B0KVxuZXhwb3J0IGludGVyZmFjZSBTdGFja0JvdW5kYXJ5IGV4dGVuZHMgQ2FsbGFibGVGdW5jdGlvbiB7fVxuXG4vLyBBIHdyYXBwYWJsZSB1dGlsaXR5IG1ldGhvZCDigJQgYW55IGNhbGxhYmxlIHRoYXQgd3JhcFRoaXMoKSBjYW4gcHJveHlcbmV4cG9ydCBpbnRlcmZhY2UgV3JhcHBhYmxlTWV0aG9kIGV4dGVuZHMgQ2FsbGFibGVGdW5jdGlvbiB7fVxuXG4vLyBDb25zdHJ1Y3RvciBvcHRpb25zIGZvciBkZWZpbmVcbmV4cG9ydCB0eXBlIGNvbnN0cnVjdG9yT3B0aW9ucyA9IHtcblx0Ly8gZXhwbGljaXQgZGVjbGFyYXRpb24gd2Ugd2lzaCB1c2Vcblx0Ly8gYW4gb2xkIHN0eWxlIGJhc2VkIGNvbnN0cnVjdG9yc1xuXHRNb2RpZmljYXRpb25Db25zdHJ1Y3Rvcj86IE1vZGlmaWNhdGlvbkNvbnN0cnVjdG9yRmFjdG9yeSxcblx0Ly8gc2hhbGwgb3Igbm90IHdlIHVzZSBzdHJpY3QgY2hlY2tpbmdcblx0Ly8gZm9yIGNyZWF0aW9uIHN1Yi1pbnN0YW5jZXMgT25seSBmcm9tIGN1cnJlbnQgdHlwZVxuXHQvLyBvciB3ZSBtaWdodCB1c2UgdXAtbmVzdGVkIHN1Yi1pbnN0YW5jZXMgZnJvbSBjaGFpblxuXHRzdHJpY3RDaGFpbj86IGJvb2xlYW4sXG5cdC8vIHNob3VsZCB3ZSB1c2UgZm9yY2VkIGVycm9ycyBjaGVja2luZ1xuXHQvLyB0byBtYWtlIGFsbCBpbmhlcml0ZWQgdHlwZXMgZXJyb3JlZFxuXHQvLyBpZiB0aGVyZSBpcyBhbiBlcnJvciBzb21ld2hlcmUgaW4gY2hhaW5cblx0YmxvY2tFcnJvcnM/OiBib29sZWFuLFxuXHQvLyBpZiBpdCBpcyBuZWNlc3NhcnkgdG8gY29sbGVjdCBzdGFja1xuXHQvLyBhcyBhIF9fc3RhY2tfXyBwcm90b3R5cGUgcHJvcGVydHlcblx0Ly8gZHVyaW5nIHRoZSBwcm9jZXNzIG9mIGluc3RhbmNlIGNyZWF0aW9uXG5cdHN1Ym1pdFN0YWNrPzogYm9vbGVhbixcblx0Ly8gYXdhaXQgbmV3IENvbnN0cnVjdG9yKClcblx0Ly8gbXVzdCByZXR1cm4gdmFsdWVcblx0YXdhaXRSZXR1cm4/OiBib29sZWFuLFxuXHQvLyBGb3JjZSBjbGFzcyBtb2RlIChhdXRvLWRldGVjdGVkIGJ5IGRlZmF1bHQpXG5cdGFzQ2xhc3M/OiBib29sZWFuLFxufTtcblxuLy8gU3VidHlwZXMgbWFwIC0gcmVwcmVzZW50cyB0aGUgc3VidHlwZXMgcHJvcGVydHlcbmV4cG9ydCB0eXBlIFN1YnR5cGVzTWFwID0gTWFwPHN0cmluZywgVHlwZUNsYXNzPjtcblxuLy8gVHlwZSBkZWZpbml0aW9uIG9iamVjdCAoaW50ZXJuYWwgcHJvcGVydGllcylcbmV4cG9ydCB0eXBlIFR5cGVEZWYgPSB7XG5cdFR5cGVOYW1lOiBzdHJpbmc7XG5cdHByb3RvOiBvYmplY3Q7XG5cdGlzU3ViVHlwZTogYm9vbGVhbjtcblx0c3VidHlwZXM6IFN1YnR5cGVzTWFwO1xuXHRjb2xsZWN0aW9uOiBDb2xsZWN0aW9uRGVmO1xuXHRjb25maWc6IGNvbnN0cnVjdG9yT3B0aW9ucztcblx0cGFyZW50VHlwZT86IFR5cGVEZWY7XG5cdGNvbnN0cnVjdEhhbmRsZXI6IE1uZW1vbmljYUNvbnN0cnVjdG9yRmFjdG9yeTtcblx0dGl0bGU6IHN0cmluZztcblx0aG9va3M6IFJlY29yZDxzdHJpbmcsIFNldDxob29rPj47XG5cdGludm9rZUhvb2s6IChob29rVHlwZTogaG9va3NUeXBlcywgb3B0czogaG9va3NPcHRzKSA9PiBTZXQ8dW5rbm93bj47XG5cdHByb3RvdHlwZTogdW5rbm93bjtcblx0c3RhY2s/OiBzdHJpbmc7XG5cdFtTeW1ib2wuaGFzSW5zdGFuY2VdOiAoaW5zdGFuY2U6IG9iamVjdCkgPT4gYm9vbGVhbjtcbn07XG5cbi8vIENvbGxlY3Rpb24gZGVmaW5pdGlvblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvbkRlZiA9IEhvb2thYmxlICYge1xuXHRkZWZpbmU6IFR5cGVBYnNvcmJlcjtcblx0bG9va3VwOiBUeXBlTG9va3VwO1xuXHRzdWJ0eXBlczogU3VidHlwZXNNYXA7XG5cdFtrZXk6IHN0cmluZ106IHVua25vd247XG59O1xuXG4vLyBUeXBlIGxvb2t1cCBmdW5jdGlvbiB0eXBlOiBtYXkgaGF2ZSBhdWdtZW50YXRpb24gYnkgVGFjdGljYSByZS1kZWZpbml0aW9uXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVMb29rdXAgZXh0ZW5kcyBDYWxsYWJsZUZ1bmN0aW9uIHtcblx0KHRoaXM6IE1hcDxzdHJpbmcsIHVua25vd24+LCBUeXBlTmVzdGVkUGF0aDogc3RyaW5nKTogVHlwZUNsYXNzIHwgdW5kZWZpbmVkO1xufVxuXG4vLyBTcGVjaWZpY2F0aW9uIGZvciBjaGFpbmVkIHN1YnR5cGUgY3JlYXRpb24gd2l0aCAudGhlbigpXG5leHBvcnQgaW50ZXJmYWNlIFRoZW5TcGVjIHtcblx0c3VidHlwZTogb2JqZWN0O1xuXHRhcmdzOiB1bmtub3duW107XG5cdG5hbWU/OiBzdHJpbmc7XG59XG5cbi8vIENvbnRleHQgb2JqZWN0IHBhc3NlZCB0aHJvdWdoIHRoZSBJbnN0YW5jZUNyZWF0b3IgcGlwZWxpbmVcbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGFuY2VDcmVhdG9yQ29udGV4dCB7XG5cdHR5cGU6IFR5cGVEZWY7XG5cdFR5cGVOYW1lOiBzdHJpbmc7XG5cdGV4aXN0ZW50SW5zdGFuY2U6IG9iamVjdDtcblx0YXJnczogdW5rbm93bltdO1xuXHRNb2RpZmljYXRpb25Db25zdHJ1Y3RvcjogTW9kaWZpY2F0aW9uQ29uc3RydWN0b3I7XG5cdE1vZGlmaWNhdG9yVHlwZTogTW5lbW9uaWNhQ29uc3RydWN0b3I7XG5cdEluc3RhbmNlTW9kaWZpY2F0b3I6IE1uZW1vbmljYUNvbnN0cnVjdG9yO1xuXHRpbmhlcml0ZWRJbnN0YW5jZTogb2JqZWN0IHwgUHJvbWlzZTxvYmplY3Q+O1xuXHRjb25maWc6IGNvbnN0cnVjdG9yT3B0aW9ucztcblx0cHJvdG86IG9iamVjdDtcblx0X19wcm90b19wcm90b19fPzogb2JqZWN0O1xuXHRzdGFjaz86IHN0cmluZ1tdO1xuXG5cdGdldEV4aXN0ZW50QXN5bmNTdGFjayhleGlzdGVudEluc3RhbmNlOiBvYmplY3QpOiB1bmtub3duO1xuXHRwb3N0UHJvY2Vzc2luZyhjb250aW51YXRpb25PZj86IFR5cGVEZWYpOiB2b2lkO1xuXHRtYWtlQXdhaXRlcih0eXBlOiBUeXBlRGVmLCB0aGVuPzogVGhlblNwZWMpOiBQcm9taXNlPG9iamVjdD47XG5cdGFkZFRoZW4odGhlbjogVGhlblNwZWMpOiB2b2lkO1xuXHRpbnZva2VQcmVIb29rcygpOiB2b2lkO1xuXHRpbnZva2VQb3N0SG9va3MoKTogeyB0eXBlOiBTZXQ8dW5rbm93bj47IGNvbGxlY3Rpb246IFNldDx1bmtub3duPiB9O1xuXHR0aHJvd01vZGlmaWNhdGlvbkVycm9yKGVycm9yOiBNbmVtb25pY2FFcnJvcik6IHZvaWQ7XG59XG5cbi8qKlxuICogUHJvdG8gbWVyZ2UgdHlwZSAtIGNvbWJpbmVzIHBhcmVudCBhbmQgY2hpbGQgdHlwZXMgd2l0aG91dCBwcm9wZXJ0eSBjb25mbGljdHMuXG4gKlxuICogV2hlbiBhIHN1YnR5cGUgaXMgZGVmaW5lZCBmcm9tIGEgcGFyZW50IGluc3RhbmNlLCB3ZSB3YW50IHRoZSBjaGlsZCBwcm9wZXJ0aWVzXG4gKiB0byB0YWtlIHByZWNlZGVuY2UuIGBFeGNsdWRlPGtleW9mIFAsIGtleW9mIFQ+YCByZW1vdmVzIG92ZXJsYXBwaW5nIGtleXMgZnJvbSBQLFxuICogc28gYFBpY2s8UCwgLi4uPmAgb25seSBicmluZ3MgaW4gcGFyZW50IHByb3BlcnRpZXMgdGhhdCBkb24ndCBjbGFzaCB3aXRoIGNoaWxkLlxuICpcbiAqIFJlc3VsdDogY2hpbGQgVCBnZXRzIGFsbCBpdHMgb3duIHByb3BzLCBwbHVzIHBhcmVudCdzIG5vbi1vdmVybGFwcGluZyBwcm9wcy5cbiAqL1xuZXhwb3J0IHR5cGUgUHJvdG88UCBleHRlbmRzIG9iamVjdCwgVCBleHRlbmRzIG9iamVjdD4gPSBUICYgUGljazxQLCBFeGNsdWRlPGtleW9mIFAsIGtleW9mIFQ+PjtcblxuXG4vLyBleHBvcnQgdHlwZSBQcm90b0ZsYXQ8XG4vLyBcdFAgZXh0ZW5kcyBvYmplY3QsXG4vLyBcdFQgZXh0ZW5kcyBvYmplY3QsXG4vLyBcdEYgZXh0ZW5kcyBQcm90bzxQLCBUPiA9IFByb3RvPFAsIFQ+XG4vLyA+ID0geyBba2V5IGluIGtleW9mIEZdOiBGW2tleV19IDtcblxuZXhwb3J0IHR5cGUgUHJvdG9GbGF0PFxuXHRQIGV4dGVuZHMgb2JqZWN0LFxuXHRUIGV4dGVuZHMgb2JqZWN0LFxuXHRMIGV4dGVuZHMgRXhjbHVkZTxrZXlvZiBQLCBrZXlvZiBUPiA9IEV4Y2x1ZGU8a2V5b2YgUCwga2V5b2YgVD4sXG4+ID0ge1xuICAgIFtrZXkgaW4ga2V5b2YgVF06IFRba2V5XTtcbn0gJiB7XG5cdFtrZXkgaW4gTF06IFBba2V5XTtcbn07XG5cbi8vIE1uZW1vbmljYSBpbnN0YW5jZSBtZXRob2Qga2V5cy4gVGhlc2UgYXJlIGZpbHRlcmVkIG91dCBvZiBleHRyYWN0ZWQvbWVyZ2VkXG4vLyBmaWVsZC1vbmx5IHZpZXdzIGJlY2F1c2UgdGhleSBiZWxvbmcgdG8gdGhlIHByb3RvdHlwZSwgbm90IHRvIHRoZSB1c2VyJ3Ncbi8vIGVudW1lcmFibGUgZGF0YSBwcm9wZXJ0aWVzLlxuZXhwb3J0IHR5cGUgTW5lbW9uaWNhSW5zdGFuY2VNZXRob2RLZXlzID1cblx0J2V4dHJhY3QnIHwgJ3BpY2snIHwgJ3BhcmVudCcgfCAnY2xvbmUnIHwgJ2ZvcmsnIHwgJ2V4Y2VwdGlvbicgfCAnc2libGluZyc7XG5cbmV4cG9ydCB0eXBlIEZsYXR0ZW48Rj4gPSB7IFtrZXkgaW4ga2V5b2YgRl06IEZba2V5XSB9XG5cbi8vIEV4dHJhY3RlZDxUPjogdGhlIHNoYXBlIHJldHVybmVkIGJ5IHV0aWxzLmV4dHJhY3QoaW5zdGFuY2UpLlxuLy8gSXQgY29udGFpbnMgdGhlIGVudW1lcmFibGUgc3RyaW5nLWtleWVkIHVzZXIgcHJvcGVydGllcyBvZiB0aGUgaW5zdGFuY2UsXG4vLyBvbWl0dGluZyBNbmVtb25pY2FJbnN0YW5jZSBtZXRob2RzIChleHRyYWN0LCBwaWNrLCBwYXJlbnQsIGNsb25lLCBmb3JrLFxuLy8gZXhjZXB0aW9uLCBzaWJsaW5nKS4gT3B0aW9uYWxpdHkgaXMgcHJlc2VydmVkIGZyb20gdGhlIHNvdXJjZSB0eXBlLlxuLy8gVGhlIGAmIHt9YCB0cmljayBmb3JjZXMgVHlwZVNjcmlwdCB0byBleHBhbmQgdGhlIGFsaWFzIGluIGhvdmVyIHRvb2x0aXBzXG4vLyBzbyBpdCByZW5kZXJzIGFzIGEgcGxhaW4gb2JqZWN0IGxpdGVyYWwgaW5zdGVhZCBvZiBcIkV4dHJhY3RlZDx7Li4ufT5cIi5cbmV4cG9ydCB0eXBlIEV4dHJhY3RlZDxUIGV4dGVuZHMgb2JqZWN0PiA9IHtcblx0W0sgaW4ga2V5b2YgVCBhcyBLIGV4dGVuZHMgc3RyaW5nID8gKEsgZXh0ZW5kcyBNbmVtb25pY2FJbnN0YW5jZU1ldGhvZEtleXMgPyBuZXZlciA6IEspIDogbmV2ZXJdOiBUW0tdO1xufSAmIHt9O1xuXG4vLyBQYXJzZWQ8VD46IHRoZSBzaGFwZSByZXR1cm5lZCBieSB1dGlscy5wYXJzZShpbnN0YW5jZSkuXG4vLyBJdCBpcyBhIG9uZS1sZXZlbCBzbmFwc2hvdCBvZiB0aGUgaW5zdGFuY2UncyBwcm90b3R5cGUgY2hhaW4uXG4vLyBgcHJvcHNgIGNvbnRhaW5zIHRoZSBpbnN0YW5jZSdzIGVudW1lcmFibGUgdXNlciBwcm9wZXJ0aWVzO1xuLy8gYGpvaW50YCBjb250YWlucyBlbnVtZXJhYmxlIHByb3BlcnRpZXMgY29waWVkIGZyb20gdGhlIGltbWVkaWF0ZSBwcm90b3R5cGU7XG4vLyBgcGFyZW50YCBpcyB0aGUgbmV4dCBsaW5rIHVwIHRoZSBjaGFpbiAoY3VycmVudGx5IG5vdCByZWN1cnNpdmVseSBwYXJzZWQpLlxuZXhwb3J0IHR5cGUgUGFyc2VkPFQgZXh0ZW5kcyBvYmplY3Q+ID0ge1xuXHRuYW1lOiBzdHJpbmc7XG5cdHByb3BzOiBFeHRyYWN0ZWQ8VD47XG5cdHNlbGY6IFQ7XG5cdHByb3RvOiBvYmplY3Q7XG5cdGpvaW50OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0cGFyZW50OiBvYmplY3QgfCB1bmRlZmluZWQ7XG59O1xuXG4vLyBTaWJsaW5nIHR5cGUgYWNjZXNzb3JcbmV4cG9ydCBpbnRlcmZhY2UgU2libGluZ0FjY2Vzc29yIHtcblx0KFNpYmxpbmdUeXBlTmFtZTogc3RyaW5nKTogVHlwZUNsYXNzIHwgdW5kZWZpbmVkO1xuXHRba2V5OiBzdHJpbmddOiBUeXBlQ2xhc3MgfCB1bmRlZmluZWQ7XG59XG5cbi8vIE1uZW1vbmljYSBpbnN0YW5jZSBtZXRob2RzIGludGVyZmFjZSAob3B0LWluKS5cbi8vIFRoZXNlIG1ldGhvZHMgdXNlZCB0byBiZSBhdXRvLWluamVjdGVkIG9udG8gZXZlcnkgaW5zdGFuY2UuIFRoZXkgYXJlIG5vd1xuLy8gYXZhaWxhYmxlIG9ubHkgd2hlbiBhIHR5cGUgZXhwbGljaXRseSBhZGRzIHRoZW0gdG8gaXRzIHByb3RvdHlwZS5cbi8vIFVzZXJzIGNhbiBzdGlsbCB1c2UgdGhpcyBpbnRlcmZhY2UgdG8gdHlwZSB0aGVpciBvd24gcm9vdC1sZXZlbCBoZWxwZXJzLlxuZXhwb3J0IGludGVyZmFjZSBNbmVtb25pY2FJbnN0YW5jZTxUIGV4dGVuZHMgb2JqZWN0ID0gb2JqZWN0PiB7XG5cdGV4dHJhY3QoKTogRXh0cmFjdGVkPFQ+O1xuXHRwaWNrPEsgZXh0ZW5kcyBrZXlvZiBUPiguLi5rZXlzOiAoSyB8IEtbXSlbXSk6IHsgW1AgaW4gS106IFRbUF0gfSAmIHt9O1xuXHRwaWNrKC4uLmtleXM6IHN0cmluZ1tdKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdHBhcmVudCgpOiBvYmplY3QgfCB1bmRlZmluZWQ7XG5cdHBhcmVudChjb25zdHJ1Y3Rvckxvb2t1cFBhdGg6IHN0cmluZyk6IG9iamVjdCB8IHVuZGVmaW5lZDtcblx0cmVhZG9ubHkgY2xvbmU6IHRoaXM7XG5cdGZvcmsoLi4uZm9ya0FyZ3M6IHVua25vd25bXSk6IHRoaXM7XG5cdGV4Y2VwdGlvbihlcnJvcjogRXJyb3IsIC4uLmFyZ3M6IHVua25vd25bXSk6IEVycm9yO1xuXHRyZWFkb25seSBzaWJsaW5nOiBTaWJsaW5nQWNjZXNzb3I7XG59XG5cbi8vIEluc3RhbmNlIHByb3BlcnRpZXMgZm9yIF9fc2VsZl9fIHJlZmVyZW5jZVxuLy8gVGhpcyBtZXJnZXMgaW50ZXJuYWwgcHJvcHMgd2l0aCB0aGUgaW5zdGFuY2UgbWV0aG9kc1xuLy8gSW50ZXJuYWwgaW5zdGFuY2UgcHJvcGVydGllcyAobm9uLWVudW1lcmFibGUpXG4vLyBUaGVzZSBhcmUgYWx3YXlzIHByZXNlbnQgb24gaW5zdGFuY2VzIGJ1dCBhY2Nlc3NlZCB2aWEgZ2V0UHJvcHMvc2V0UHJvcHNcbmV4cG9ydCB0eXBlIEluc3RhbmNlSW50ZXJuYWxQcm9wcyA9IHtcblx0X19wcm90b19wcm90b19fOiBvYmplY3Q7XG5cdF9fYXJnc19fOiB1bmtub3duW107XG5cdF9fY29sbGVjdGlvbl9fOiBDb2xsZWN0aW9uRGVmO1xuXHRfX3N1YnR5cGVzX186IE1hcDxzdHJpbmcsIG9iamVjdD47XG5cdF9fdHlwZV9fOiBUeXBlRGVmO1xuXHRfX3BhcmVudF9fOiBvYmplY3Q7XG5cdF9fc3RhY2tfXz86IHN0cmluZztcblx0X19jcmVhdG9yX186IEluc3RhbmNlQ3JlYXRvckNvbnRleHQ7XG5cdF9fdGltZXN0YW1wX186IG51bWJlcjtcbn07XG5cbi8vIENvbWJpbmVkIFByb3BzIHR5cGUgZm9yIGludGVybmFsIHVzZSBpbnNpZGUgLi9zcmNcbmV4cG9ydCB0eXBlIFByb3BzID0gSW5zdGFuY2VJbnRlcm5hbFByb3BzICYge1xuXHRfX3NlbGZfXzogSW5zdGFuY2VJbnRlcm5hbFByb3BzO1xuXHRba2V5OiBzdHJpbmddOiB1bmtub3duO1xufTtcblxuLy8gQ29tYmluZWQgaW5zdGFuY2UgdHlwZTogcGxhaW4gb2JqZWN0IHdpdGggdGhlIHVzZXIncyBmaWVsZHMgb25seS5cbi8vIEluc3RhbmNlIG1ldGhvZHMgKGV4dHJhY3QsIHBpY2ssIGZvcmssIGV0Yy4pIGFyZSBubyBsb25nZXIgYXV0by1pbmplY3RlZC5cbi8vIFRoZSBpbmxpbmUgbWFwcGVkIHR5cGUgaXMgdXNlZCBpbnN0ZWFkIG9mIHRoZSBGbGF0dGVuIGFsaWFzIHNvIHRoYXQgaG92ZXJcbi8vIHRvb2x0aXBzIHNob3cgdGhlIGFjdHVhbCBmaWVsZCBvYmplY3QgbGl0ZXJhbCBmaXJzdCwgbm90IFwiRmxhdHRlbjx7Li4ufT5cIi5cbmV4cG9ydCB0eXBlIEluc3RhbmNlUmVzdWx0PFxuICBOIGV4dGVuZHMgb2JqZWN0LFxuPiA9IHsgW0sgaW4ga2V5b2YgTl06IE5bS10gfTtcblxuLy8gRGVmaW5pdG9yIGluc3RhbmNlIC0gdGhlIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIHJldHVybmVkIGJ5IGRlZmluZVxuLy8gTiA9IGluc3RhbmNlIHR5cGUgKHByb3BlcnRpZXMgYXZhaWxhYmxlIG9uIGluc3RhbmNlcylcbi8vIFMgPSBzdWJ0eXBlcyBtYXBcbmV4cG9ydCBpbnRlcmZhY2UgSURlZmluaXRvckluc3RhbmNlPFxuXHROIGV4dGVuZHMgb2JqZWN0LFxuXHRSIGV4dGVuZHMgSW5zdGFuY2VSZXN1bHQ8Tj4gPSBJbnN0YW5jZVJlc3VsdDxOPlxuPiB7XG5cblx0VHlwZU5hbWU6IHN0cmluZztcblx0cHJvdG90eXBlOiBOO1xuXG5cdFxuXHQvLyB0aGUgbGluZSBiZWxvdyBkZWNsYXJlcyBhIGBuZXcgLi4uYCBpbnZvY2F0aW9uLFxuXHQvLyBzbyBtYWtlcyBpbnRlcmZhY2UgY29uc3RydWN0aWJsZVxuXHQvLyBuZXcoLi4uYXJnczogdW5rbm93bltdKTogeyBba2V5IGluIGtleW9mIFJdOiBSW2tleV0gfTtcblx0bmV3KC4uLmFyZ3M6IHVua25vd25bXSk6IFI7XG5cblx0XG5cdC8vIFRPRE86IG5lZWQgY2hlY2sgaWYgbGluZSBiZWxvdyB3b3Jrc1xuXHQvLyBhbHNvIFRTIGhpbnRpbmcgY2hlY2sgYXMgd2VsbFxuXHQvLyB0aGUgbGluZSBiZWxvdyBzaG91bGQgbWFrZSBpcyBhIEBkZWNvcmF0ZSBkZWNvcmF0b3Igd29ya2luZ1xuXHQoLi4uYXJnczogdW5rbm93bltdKTogSURlZmluaXRvckluc3RhbmNlPFI+O1xuXG5cblx0Ly8gRGVmaW5lIG1ldGhvZCB0aGF0IGNvbWJpbmVzIHBhcmVudCBOIHdpdGggbmV3IHR5cGUgVCB1c2luZyBQcm90b1xuXHRkZWZpbmU8XG5cdFx0VCBleHRlbmRzIG9iamVjdCxcblxuXHRcdC8vIHRoaXMgd2lsbCBiZSBpbnN0YW5jZSB0eXBlIGZvciBzdWItdHlwZSAhISFcblx0XHQvLyBGIGV4dGVuZHMgRmxhdHRlbjxQcm90bzxOLCBUPj5cblx0XHRGIGV4dGVuZHMgUHJvdG88TiwgVD5cblx0Pihcblx0XHRUeXBlT3JUeXBlTmFtZTogc3RyaW5nIHwgQ2FsbGFibGVGdW5jdGlvbixcblx0XHRjb25zdHJ1Y3RIYW5kbGVyT3JDb25maWc/OiBJREVGPFQ+IHwgb2JqZWN0IHwgYm9vbGVhbiB8IENhbGxhYmxlRnVuY3Rpb24sXG5cdFx0Y29uZmlnT3JVbmRlZmluZWQ/OiBjb25zdHJ1Y3Rvck9wdGlvbnMgfCBDYWxsYWJsZUZ1bmN0aW9uIHwgYm9vbGVhblxuXHQpOiBJRGVmaW5pdG9ySW5zdGFuY2U8Rj47XG5cdFxuXHRsb29rdXA6IFR5cGVMb29rdXA7XG5cdFxuXHRyZWdpc3Rlckhvb2soaG9va1R5cGU6IGhvb2tzVHlwZXMsIGNiOiBob29rKTogdm9pZDtcblx0XG5cdFxuXHRzdWJ0eXBlczogU3VidHlwZXNNYXA7XG5cdFxuXHQvLyBJbnRlcm5hbCBwcm9wZXJ0aWVzIGFjY2Vzc2VkIGJ5IHRlc3RzXG5cdF9fdHlwZV9fPzogVHlwZURlZjtcblx0Y29sbGVjdGlvbj86IENvbGxlY3Rpb25EZWY7XG5cblx0Lypcblx0Ly8gQWxsb3cgZHluYW1pYyBwcm9wZXJ0eSBhY2Nlc3MgZm9yIHN1YnR5cGVzXG5cdFtrZXk6IHN0cmluZ106IHVua25vd247XG5cdCovXG59XG5cbi8vIFR5cGUgYWJzb3JiZXIgZnVuY3Rpb24gdHlwZSAtIHVzZWQgZm9yIGRlZmluaW5nIHN1YnR5cGVzXG4vLyBTdXBwb3J0cyBtdWx0aXBsZSBjYWxsaW5nIGNvbnZlbnRpb25zOlxuLy8gMS4gTW9kZXJuOiBkZWZpbmUoVHlwZU5hbWUsIGNvbnN0cnVjdEhhbmRsZXIsIGNvbmZpZz8pXG4vLyAyLiBMZWdhY3k6IGRlZmluZShjb25zdHJ1Y3RIYW5kbGVyLCBjb25maWc/KSAtIFR5cGVOYW1lIGZyb20gY29uc3RydWN0b3IgbmFtZVxuLy8gMy4gTmVzdGVkOiBwYXJlbnRUeXBlLmRlZmluZShUeXBlTmFtZSwgY29uc3RydWN0SGFuZGxlciwgY29uZmlnPylcbmV4cG9ydCBpbnRlcmZhY2UgVHlwZUFic29yYmVyIGV4dGVuZHMgQ2FsbGFibGVGdW5jdGlvbiB7XG5cdDxUIGV4dGVuZHMgb2JqZWN0Pihcblx0XHR0aGlzOiB1bmtub3duLFxuXHRcdFR5cGVPclR5cGVOYW1lOiBzdHJpbmcgfCBDYWxsYWJsZUZ1bmN0aW9uLFxuXHRcdGNvbnN0cnVjdEhhbmRsZXJPckNvbmZpZz86IElERUY8VD4gfCBvYmplY3QgfCBib29sZWFuIHwgQ2FsbGFibGVGdW5jdGlvbixcblx0XHRjb25maWdPclVuZGVmaW5lZD86IGNvbnN0cnVjdG9yT3B0aW9ucyB8IENhbGxhYmxlRnVuY3Rpb24gfCBib29sZWFuXG5cdCk6IElEZWZpbml0b3JJbnN0YW5jZTxUPjtcbn1cblxuLy8gVHlwZXNDb2xsZWN0aW9uIGludGVyZmFjZSBmb3IgY3JlYXRlVHlwZXNDb2xsZWN0aW9uXG4vLyBUaGlzIHJlcHJlc2VudHMgdGhlIGFjdHVhbCByZXR1cm4gdHlwZSBvZiBjcmVhdGVUeXBlc0NvbGxlY3Rpb25cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZXNDb2xsZWN0aW9uIGV4dGVuZHMgSG9va2FibGUge1xuXHRkZWZpbmU6IFR5cGVBYnNvcmJlcjtcblx0bG9va3VwOiBUeXBlTG9va3VwO1xuXHRzdWJ0eXBlczogU3VidHlwZXNNYXA7XG5cdFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbi8vIFNoYXJlZCBpbnRlcmZhY2UgZm9yIG9iamVjdHMgdGhhdCBzdXBwb3J0IGhvb2tzIChUeXBlRGVmIGFuZCBDb2xsZWN0aW9uRGVmKVxuZXhwb3J0IGludGVyZmFjZSBIb29rYWJsZSB7XG5cdGhvb2tzOiBSZWNvcmQ8c3RyaW5nLCBTZXQ8aG9vaz4+O1xuXHRpbnZva2VIb29rKGhvb2tUeXBlOiBob29rc1R5cGVzLCBvcHRzOiBob29rc09wdHMpOiBTZXQ8dW5rbm93bj47XG5cdHJlZ2lzdGVySG9vayhob29rVHlwZTogaG9va3NUeXBlcywgY2I6IGhvb2spOiB2b2lkO1xuXHRyZWdpc3RlckZsb3dDaGVja2VyKGNiOiAob3B0czogb2JqZWN0KSA9PiB1bmtub3duKTogdm9pZDtcbn1cblxuLy8gY3JlYXRlVHlwZXNDb2xsZWN0aW9uIGZ1bmN0aW9uIHR5cGVcbmV4cG9ydCB0eXBlIENyZWF0ZVR5cGVzQ29sbGVjdGlvbkZ1bmN0aW9uID0gKGNvbmZpZz86IGNvbnN0cnVjdG9yT3B0aW9ucykgPT4gVHlwZXNDb2xsZWN0aW9uO1xuXG4vLyBUeXBlIGNsYXNzIC0gYmFzZSB0eXBlIGNvbnN0cnVjdG9yXG5leHBvcnQgdHlwZSBUeXBlQ2xhc3MgPSBJRGVmaW5pdG9ySW5zdGFuY2U8b2JqZWN0PjtcblxuLy8gTW5lbW9uaWNhIGNvbnN0cnVjdG9yIOKAlCB0aGUgY29uc3RydWN0b3IgZnVuY3Rpb24gcmV0dXJuZWQgYnkgY29uc3RydWN0SGFuZGxlcigpXG4vLyBIYXMgU3ltYm9sQ29uc3RydWN0b3JOYW1lIGF0dGFjaGVkIGFuZCBpcyBib3RoIG5ld2FibGUgYW5kIGNhbGxhYmxlXG5leHBvcnQgaW50ZXJmYWNlIE1uZW1vbmljYUNvbnN0cnVjdG9yIGV4dGVuZHMgTmV3YWJsZUZ1bmN0aW9uIHtcblx0bmV3ICguLi5hcmdzOiB1bmtub3duW10pOiBvYmplY3Q7XG5cdCh0aGlzOiBvYmplY3QsIC4uLmFyZ3M6IHVua25vd25bXSk6IHVua25vd247XG5cdFtrZXk6IHN5bWJvbF06IHVua25vd247XG59XG5cbi8vIFR5cGUgZGVzY3JpcHRvciBpbnN0YW5jZSDigJQgaW50ZXJuYWwgc2hhcGUgb2YgVHlwZURlc2NyaXB0b3Igb2JqZWN0c1xuZXhwb3J0IGludGVyZmFjZSBUeXBlRGVzY3JpcHRvckRlZmluZSBleHRlbmRzIENhbGxhYmxlRnVuY3Rpb24ge1xuXHQoXG5cdFx0VHlwZU9yVHlwZU5hbWU6IHN0cmluZyB8IENhbGxhYmxlRnVuY3Rpb24sXG5cdFx0Y29uc3RydWN0SGFuZGxlck9yQ29uZmlnPzogQ2FsbGFibGVGdW5jdGlvbiB8IG9iamVjdCxcblx0XHRjb25maWc/OiBvYmplY3Rcblx0KTogVHlwZUNsYXNzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVEZXNjcmlwdG9yTG9va3VwIGV4dGVuZHMgQ2FsbGFibGVGdW5jdGlvbiB7XG5cdChUeXBlTmVzdGVkUGF0aDogc3RyaW5nKTogVHlwZUNsYXNzIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgdHlwZSBUeXBlRGVzY3JpcHRvckluc3RhbmNlID0ge1xuXHRkZWZpbmU6IFR5cGVEZXNjcmlwdG9yRGVmaW5lO1xuXHRsb29rdXA6IFR5cGVEZXNjcmlwdG9yTG9va3VwO1xuXHRzdWJ0eXBlczogTWFwPHN0cmluZywgb2JqZWN0Pjtcblx0VHlwZU5hbWU6IHN0cmluZztcbn07XG5cbi8vIENvbnN0cnVjdG9yIHR5cGUgZm9yIGRlY29yYXRlIGZ1bmN0aW9uXG5leHBvcnQgdHlwZSBDb25zdHJ1Y3RvcjxUID0gb2JqZWN0PiA9IG5ldyAoLi4uYXJnczogdW5rbm93bltdKSA9PiBUO1xuXG4vLyBEZWNvcmF0ZWQgY2xhc3MgdHlwZSAtIGluY2x1ZGVzIGNhbGwgc2lnbmF0dXJlIGZvciBkZWNvcmF0b3IgcGF0dGVyblxuZXhwb3J0IHR5cGUgRGVjb3JhdGVkQ2xhc3M8VCBleHRlbmRzIENvbnN0cnVjdG9yPG9iamVjdD4+ID1cblx0VCAmXG5cdCg8VSBleHRlbmRzIENvbnN0cnVjdG9yPG9iamVjdD4+KHRhcmdldDogVSkgPT4gRGVjb3JhdGVkQ2xhc3M8VT4pICYge1xuXHRcdGRlZmluZTogVHlwZUFic29yYmVyO1xuXHRcdHJlZ2lzdGVySG9vayhob29rVHlwZTogaG9va3NUeXBlcywgY2I6IGhvb2spOiB2b2lkO1xuXHRcdGxvb2t1cDogVHlwZUxvb2t1cDtcblx0XHRUeXBlTmFtZTogc3RyaW5nO1xuXHR9O1xuXG4vLyBIZWxwZXI6IG1lcmdlIHBhcmVudCBlbnRpdHkgKEUpIGFuZCBjaGlsZCBjb25zdHJ1Y3RvciBpbnN0YW5jZSAoVCkgaW50byBhXG4vLyBzaW5nbGUgZmxhdCBvYmplY3QgdHlwZSwgZmlsdGVyaW5nIG91dCBNbmVtb25pY2FJbnN0YW5jZSBtZXRob2QgbmFtZXMuXG4vLyBVc2VkIGJ5IGFwcGx5L2NhbGwvYmluZC5cbmV4cG9ydCB0eXBlIE1lcmdlPEUgZXh0ZW5kcyBvYmplY3QsIFQgZXh0ZW5kcyBvYmplY3Q+ID0ge1xuXHRbSyBpbiBrZXlvZiBUIHwga2V5b2YgRSBhcyBLIGV4dGVuZHMgTW5lbW9uaWNhSW5zdGFuY2VNZXRob2RLZXlzID8gbmV2ZXIgOiBLXTpcblx0XHRLIGV4dGVuZHMga2V5b2YgVCA/IFRbS10gOiBFW0sgJiBrZXlvZiBFXTtcbn07XG5cbi8vIEFwcGx5L0NhbGwvQmluZCBmdW5jdGlvbiB0eXBlc1xuLy8gVGhlIHJldHVybiB0eXBlIG1lcmdlcyB0aGUgcGFyZW50IGVudGl0eSBmaWVsZHMgd2l0aCB0aGUgY2hpbGQgY29uc3RydWN0b3Jcbi8vIGZpZWxkcyAoZmlsdGVyaW5nIG91dCBNbmVtb25pY2FJbnN0YW5jZSBtZXRob2QgbmFtZXMpLCBwcm9kdWNpbmcgdGhlIHNhbWVcbi8vIGB7IGZpZWxkcyB9YCBob3ZlciBzdHlsZSBhcyBgbmV3IFR5cGUoKWAuXG5leHBvcnQgaW50ZXJmYWNlIEFwcGx5RnVuY3Rpb24gZXh0ZW5kcyBDYWxsYWJsZUZ1bmN0aW9uIHtcblx0PEUgZXh0ZW5kcyBvYmplY3QsIFQgZXh0ZW5kcyBvYmplY3Q+KFxuXHRcdGVudGl0eTogRSxcblx0XHRDb25zdHJ1Y3RvcjogSURFRjxUPixcblx0XHRhcmdzPzogdW5rbm93bltdXG5cdCk6IEluc3RhbmNlUmVzdWx0PE1lcmdlPEUsIFQ+Pjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYWxsRnVuY3Rpb24gZXh0ZW5kcyBDYWxsYWJsZUZ1bmN0aW9uIHtcblx0PEUgZXh0ZW5kcyBvYmplY3QsIFQgZXh0ZW5kcyBvYmplY3Q+KFxuXHRcdGVudGl0eTogRSxcblx0XHRDb25zdHJ1Y3RvcjogSURFRjxUPixcblx0XHQuLi5hcmdzOiB1bmtub3duW11cblx0KTogSW5zdGFuY2VSZXN1bHQ8TWVyZ2U8RSwgVD4+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJpbmRGdW5jdGlvbiBleHRlbmRzIENhbGxhYmxlRnVuY3Rpb24ge1xuXHQ8RSBleHRlbmRzIG9iamVjdCwgVCBleHRlbmRzIG9iamVjdD4oXG5cdFx0ZW50aXR5OiBFLFxuXHRcdENvbnN0cnVjdG9yOiBJREVGPFQ+XG5cdCk6ICguLi5hcmdzOiB1bmtub3duW10pID0+IEluc3RhbmNlUmVzdWx0PE1lcmdlPEUsIFQ+Pjtcbn1cblxuLy8gVXRpbHMgb2JqZWN0IHR5cGVcbmV4cG9ydCBpbnRlcmZhY2UgVXRpbHNDb2xsZWN0aW9uIHtcblx0ZXh0cmFjdDxUIGV4dGVuZHMgb2JqZWN0PihpbnN0YW5jZTogVCk6IEV4dHJhY3RlZDxUPjtcblx0cGljazxUIGV4dGVuZHMgb2JqZWN0LCBLIGV4dGVuZHMga2V5b2YgVD4oaW5zdGFuY2U6IFQsIC4uLmFyZ3M6IChLIHwgS1tdKVtdKTogeyBbUCBpbiBLXTogVFtQXSB9ICYge307XG5cdHBpY2s8VCBleHRlbmRzIG9iamVjdD4oaW5zdGFuY2U6IFQsIC4uLmFyZ3M6IChzdHJpbmcgfCBzdHJpbmdbXSlbXSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRjbG9uZTxUIGV4dGVuZHMgb2JqZWN0PihpbnN0YW5jZTogVCk6IFQ7XG5cdGZvcms8VCBleHRlbmRzIG9iamVjdD4oaW5zdGFuY2U6IFQpOiAodGhpczogb2JqZWN0LCAuLi5mb3JrQXJnczogdW5rbm93bltdKSA9PiBUO1xuXHRzaWJsaW5nKGluc3RhbmNlOiBvYmplY3QpOiBTaWJsaW5nQWNjZXNzb3I7XG5cdGNvbGxlY3RDb25zdHJ1Y3RvcnM6IChpbnN0YW5jZTogb2JqZWN0LCBmbGF0PzogYm9vbGVhbikgPT4gKENhbGxhYmxlRnVuY3Rpb24gfCBzdHJpbmcpW107XG5cdG1lcmdlPEEgZXh0ZW5kcyBvYmplY3QsIEIgZXh0ZW5kcyBvYmplY3Q+KFxuXHRcdGE6IEEsXG5cdFx0YjogQixcblx0XHQuLi5hcmdzOiB1bmtub3duW11cblx0KTogSW5zdGFuY2VSZXN1bHQ8TWVyZ2U8QiwgQT4+O1xuXHRwYXJzZTxUIGV4dGVuZHMgb2JqZWN0PihzZWxmOiBUKTogUGFyc2VkPFQ+O1xuXHRwYXJlbnQ8VCBleHRlbmRzIG9iamVjdD4oaW5zdGFuY2U6IFQsIHBhdGg/OiBzdHJpbmcpOiBvYmplY3QgfCB1bmRlZmluZWQ7XG5cdHRvSlNPTjxUIGV4dGVuZHMgb2JqZWN0PihpbnN0YW5jZTogVCk6IHN0cmluZztcblx0W2tleTogc3RyaW5nXTogQ2FsbGFibGVGdW5jdGlvbjtcbn1cblxuLy8gTWFpbiBtbmVtb25pY2EgbW9kdWxlIGludGVyZmFjZSAtIHJlcHJlc2VudHMgdGhlIGV4cG9ydGVkIG1vZHVsZSBvYmplY3RcbmV4cG9ydCBpbnRlcmZhY2UgTW5lbW9uaWNhTW9kdWxlIHtcblx0Ly8gQ29yZSBmdW5jdGlvbnNcblx0ZGVmaW5lOiBUeXBlQWJzb3JiZXI7XG5cdGxvb2t1cDogKFR5cGVOZXN0ZWRQYXRoOiBzdHJpbmcpID0+IFR5cGVDbGFzcyB8IHVuZGVmaW5lZDtcblx0YXBwbHk6IEFwcGx5RnVuY3Rpb247XG5cdGNhbGw6IENhbGxGdW5jdGlvbjtcblx0YmluZDogQmluZEZ1bmN0aW9uO1xuXHRkZWNvcmF0ZTogPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxvYmplY3Q+IHwgY29uc3RydWN0b3JPcHRpb25zIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkPihcblx0XHR0YXJnZXQ/OiBULFxuXHRcdGNvbmZpZz86IGNvbnN0cnVjdG9yT3B0aW9uc1xuXHQpID0+IDxVIGV4dGVuZHMgQ29uc3RydWN0b3I8b2JqZWN0Pj4oY3N0cjogVSkgPT4gRGVjb3JhdGVkQ2xhc3M8VT47XG5cdHJlZ2lzdGVySG9vazogPFQgZXh0ZW5kcyBvYmplY3Q+KENvbnN0cnVjdG9yOiBJREVGPFQ+LCBob29rVHlwZTogaG9va3NUeXBlcywgY2I6IGhvb2spID0+IHZvaWQ7XG5cblx0Ly8gRGVzY3JpcHRvcnNcblx0ZGVmYXVsdFR5cGVzOiBUeXBlc0NvbGxlY3Rpb247XG5cblx0Ly8gRXJyb3JzXG5cdEJBU0VfTU5FTU9OSUNBX0VSUk9SOiBNbmVtb25pY2FFcnJvckNvbnN0cnVjdG9yO1xuXHRXUk9OR19UWVBFX0RFRklOSVRJT046IE1uZW1vbmljYUVycm9yQ29uc3RydWN0b3I7XG5cdFdST05HX0lOU1RBTkNFX0lOVk9DQVRJT046IE1uZW1vbmljYUVycm9yQ29uc3RydWN0b3I7XG5cdFdST05HX01PRElGSUNBVElPTl9QQVRURVJOOiBNbmVtb25pY2FFcnJvckNvbnN0cnVjdG9yO1xuXHRBTFJFQURZX0RFQ0xBUkVEOiBNbmVtb25pY2FFcnJvckNvbnN0cnVjdG9yO1xuXHRXUk9OR19BUkdVTUVOVFNfVVNFRDogTW5lbW9uaWNhRXJyb3JDb25zdHJ1Y3Rvcjtcblx0V1JPTkdfSE9PS19UWVBFOiBNbmVtb25pY2FFcnJvckNvbnN0cnVjdG9yO1xuXHRNSVNTSU5HX0NBTExCQUNLX0FSR1VNRU5UOiBNbmVtb25pY2FFcnJvckNvbnN0cnVjdG9yO1xuXHQvLyBGTE9XX0NIRUNLRVJfUkVERUZJTklUSU9OOiBNbmVtb25pY2FFcnJvckNvbnN0cnVjdG9yO1xuXHRNSVNTSU5HX0hPT0tfQ0FMTEJBQ0s6IE1uZW1vbmljYUVycm9yQ29uc3RydWN0b3I7XG5cdFRZUEVOQU1FX01VU1RfQkVfQV9TVFJJTkc6IE1uZW1vbmljYUVycm9yQ29uc3RydWN0b3I7XG5cdEhBTkRMRVJfTVVTVF9CRV9BX0ZVTkNUSU9OOiBNbmVtb25pY2FFcnJvckNvbnN0cnVjdG9yO1xuXHRPUFRJT05TX0VSUk9SOiBNbmVtb25pY2FFcnJvckNvbnN0cnVjdG9yO1xuXHRXUk9OR19TVEFDS19DTEVBTkVSOiBNbmVtb25pY2FFcnJvckNvbnN0cnVjdG9yO1xuXG5cdC8vIENvbnN0YW50c1xuXHRNTkVNT05JQ0E6IHN0cmluZztcblx0TU5FTU9TWU5FOiBzdHJpbmc7XG5cdFN5bWJvbFBhcmVudFR5cGU6IHN5bWJvbDtcblx0U3ltYm9sQ29uc3RydWN0b3JOYW1lOiBzeW1ib2w7XG5cdFN5bWJvbERlZmF1bHRUeXBlc0NvbGxlY3Rpb246IHN5bWJvbDtcblx0U3ltYm9sQ29uZmlnOiBzeW1ib2w7XG5cdFRZUEVfVElUTEVfUFJFRklYOiBzdHJpbmc7XG5cdEVycm9yTWVzc2FnZXM6IEVycm9yTWVzc2FnZXM7XG5cblx0Ly8gVXRpbHNcblx0dXRpbHM6IFV0aWxzQ29sbGVjdGlvbjtcblx0Z2V0UHJvcHM6IChpbnN0YW5jZTogb2JqZWN0KSA9PiBQcm9wc1R5cGUgfCB1bmRlZmluZWQ7XG5cdHNldFByb3BzOiAoaW5zdGFuY2U6IG9iamVjdCwgdmFsdWVzOiBvYmplY3QpID0+IHN0cmluZ1tdIHwgZmFsc2U7XG5cdGZpbmRTdWJUeXBlRnJvbVBhcmVudDogKGluc3RhbmNlOiBvYmplY3QgfCB1bmRlZmluZWQsIHN1YlR5cGU6IHN0cmluZykgPT4gb2JqZWN0IHwgbnVsbDtcblx0aXNDbGFzczogKGZuOiBDYWxsYWJsZUZ1bmN0aW9uKSA9PiBib29sZWFuO1xuXG5cdC8vIGNyZWF0ZVR5cGVzQ29sbGVjdGlvblxuXHRjcmVhdGVUeXBlc0NvbGxlY3Rpb246IENyZWF0ZVR5cGVzQ29sbGVjdGlvbkZ1bmN0aW9uO1xuXG5cdC8vIEFsbG93IGFkZGl0aW9uYWwgcHJvcGVydGllc1xuXHRba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuIl19
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuLyogZXNsaW50IG5vLXVudXNlZC12YXJzOiBcIm9mZlwiICovXG5cbmltcG9ydCB0eXBlIHsgVHlwZVJlZ2lzdHJ5IH0gZnJvbSAnLi4vaW5kZXgnO1xuXG4vLyBQcm9wcyB0eXBlIGZvciBnZXRQcm9wcy9zZXRQcm9wc1xuZXhwb3J0IHR5cGUgUHJvcHNUeXBlID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbi8vIENvcmUgdHlwZSBkZWZpbml0aW9ucyBmb3IgbW5lbW9uaWNhXG5cbi8vIEJhc2UgY29uc3RydWN0b3IgZnVuY3Rpb24gdHlwZSAtIGNhbiBiZSBhIGNsYXNzIGNvbnN0cnVjdG9yIG9yIGEgZnVuY3Rpb24uXG4vLyBBcmdzIGRlZmF1bHRzIHRvIHVua25vd25bXSBzbyBJREVGPFQ+IGlzIGJhY2t3YXJkcyBjb21wYXRpYmxlO1xuLy8gc3VwcGx5IEFyZ3MgdG8gZ2V0IHR5cGVkIGNvbnN0cnVjdG9yIHBhcmFtczogSURFRjxNeVR5cGUsIFtzdHJpbmcsIG51bWJlcl0+XG5leHBvcnQgdHlwZSBJREVGPFQsIEFyZ3MgZXh0ZW5kcyB1bmtub3duW10gPSB1bmtub3duW10+ID0geyBuZXcoKTogVCB9IHwgeyAodGhpczogVCwgLi4uYXJnczogQXJncyk6IHZvaWQgfTtcblxuLy8gRXJyb3IgbWVzc2FnZSB0eXBlcyAtIGFsbCBlcnJvciBtZXNzYWdlcyBhcmUgc3RyaW5nc1xuZXhwb3J0IHR5cGUgRXJyb3JNZXNzYWdlS2V5ID1cblx0fCAnQkFTRV9FUlJPUl9NRVNTQUdFJ1xuXHR8ICdIQU5ETEVSX01VU1RfQkVfQV9GVU5DVElPTidcblx0fCAnV1JPTkdfVFlQRV9ERUZJTklUSU9OJ1xuXHR8ICdXUk9OR19JTlNUQU5DRV9JTlZPQ0FUSU9OJ1xuXHR8ICdXUk9OR19NT0RJRklDQVRJT05fUEFUVEVSTidcblx0fCAnQUxSRUFEWV9ERUNMQVJFRCdcblx0fCAnV1JPTkdfQVJHVU1FTlRTX1VTRUQnXG5cdHwgJ1dST05HX0hPT0tfVFlQRSdcblx0fCAnTUlTU0lOR19IT09LX0NBTExCQUNLJ1xuXHR8ICdNSVNTSU5HX0NBTExCQUNLX0FSR1VNRU5UJ1xuXHR8ICdPUFRJT05TX0VSUk9SJ1xuXHR8ICdXUk9OR19TVEFDS19DTEVBTkVSJztcblx0Ly8gfCAnVFlQRU5BTUVfTVVTVF9CRV9BX1NUUklORydcblx0Ly8gfCAnRkxPV19DSEVDS0VSX1JFREVGSU5JVElPTidcblxuLy8gRXJyb3IgbWVzc2FnZXMgb2JqZWN0IHR5cGVcbmV4cG9ydCB0eXBlIEVycm9yTWVzc2FnZXMgPSBSZWNvcmQ8RXJyb3JNZXNzYWdlS2V5LCBzdHJpbmc+O1xuXG4vLyBIb29rIGNhbGxiYWNrIOKAlCBwYXNzZWQgdG8gcmVnaXN0ZXJIb29rIGFuZCBpbnZva2VkIGJ5IGludm9rZUhvb2tcbmV4cG9ydCBpbnRlcmZhY2UgaG9vayBleHRlbmRzIENhbGxhYmxlRnVuY3Rpb24ge1xuXHQob3B0czogaG9va3NPcHRzKTogdW5rbm93bjtcbn1cblxuLy8gRXJyb3IgY29uc3RydWN0b3IgZnJvbSBjb25zdHJ1Y3RFcnJvciAtIGNvbnN0cnVjdGFibGUgZnVuY3Rpb24gd2l0aCBwcm90b3R5cGVcbmV4cG9ydCBpbnRlcmZhY2UgTW5lbW9uaWNhRXJyb3JDb25zdHJ1Y3RvciB7XG5cdG5ldyhhZGRpdGlvbj86IHN0cmluZywgc3RhY2s/OiBzdHJpbmcgfCBzdHJpbmdbXSk6IEVycm9yO1xuXHQobmFtZTogc3RyaW5nKTogRXJyb3I7XG5cdHByb3RvdHlwZToge1xuXHRcdGNvbnN0cnVjdG9yOiBNbmVtb25pY2FFcnJvckNvbnN0cnVjdG9yO1xuXHR9O1xufVxuXG4vLyBFcnJvcnMgdHlwZXMgbWFwIC0gaW5kZXhhYmxlIHJlY29yZCBvZiBlcnJvciBjb25zdHJ1Y3RvcnNcbmV4cG9ydCB0eXBlIEVycm9yc1R5cGVzTWFwID0gUmVjb3JkPHN0cmluZywgTW5lbW9uaWNhRXJyb3JDb25zdHJ1Y3Rvcj47XG5cbi8vIE1uZW1vbmljYSBlcnJvciBpbnRlcmZhY2UgZm9yIGV4dGVuZGVkIEVycm9yIG9iamVjdHNcbmV4cG9ydCBpbnRlcmZhY2UgTW5lbW9uaWNhRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG5cdGV4Y2VwdGlvblJlYXNvbj86IEVycm9yO1xuXHRyZWFzb25zPzogRXJyb3JbXTtcblx0c3VycGx1cz86IEVycm9yW107XG59XG5cbi8qKlxuICogSW50ZXJuYWwgVHlwZSBDb25zdHJ1Y3Rvci5cbiAqIFwiVHlwZVwiIGhlcmUgaXMgdXNlZCBpbiB0aGUgQ29tcHV0ZXIgU2NpZW5jZSBzZW5zZSDigJQgYW4gaW50ZXJmYWNlL2NvbnRyYWN0XG4gKiBkZXNjcmliaW5nIHdoYXQgYSBjb25zdHJ1Y3RvciBtdXN0IHNhdGlzZnkgKGJvdGggYG5ld2AtYWJsZSBhbmQgY2FsbGFibGUpLlxuICogVEMgPSBUeXBlIENvbnN0cnVjdG9yOyBcIkludGVybmFsXCIgbWVhbnMgdGhpcyBpcyB0aGUgbGlicmFyeSdzIG93biBjb25zdHJ1Y3RvclxuICogc2hhcGUsIGRpc3RpbmN0IGZyb20gdXNlci1mYWNpbmcgVHlwZUNvbnN0cnVjdG9yIGJlbG93LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIF9JbnRlcm5hbF9UQ188Q29uc3RydWN0b3JJbnN0YW5jZSBleHRlbmRzIG9iamVjdD4ge1xuXHRuZXcoLi4uYXJnczogdW5rbm93bltdKTogQ29uc3RydWN0b3JJbnN0YW5jZTtcblx0KHRoaXM6IENvbnN0cnVjdG9ySW5zdGFuY2UsIC4uLmFyZ3M6IHVua25vd25bXSk6IENvbnN0cnVjdG9ySW5zdGFuY2U7XG5cdHJlYWRvbmx5IHByb3RvdHlwZTogQ29uc3RydWN0b3JJbnN0YW5jZSAmIHtcblx0XHRyZWFkb25seSBjb25zdHJ1Y3RvcjogX0ludGVybmFsX1RDXzxDb25zdHJ1Y3Rvckluc3RhbmNlPlxuXHR9O1xufVxuXG4vKipcbiAqIFB1YmxpYyBhbGlhcyBmb3IgX0ludGVybmFsX1RDXyDigJQgdGhlIHNoYXBlIG9mIGNvbnN0cnVjdG9yIGZ1bmN0aW9ucyByZXR1cm5lZCBieSBgZGVmaW5lKClgLlxuICogQXVnbWVudGVkIGJ5IHRhY3RpY2EtZ2VuZXJhdGVkIFR5cGVSZWdpc3RyeSB0byBiZWNvbWUgdXNlci1zcGVjaWZpYyB0eXBlcy5cbiAqIEtlcHQgYXMgYSBuYW1lZCBhbGlhcyAocmF0aGVyIHRoYW4gaW5saW5pbmcgX0ludGVybmFsX1RDXykgc28gdGFjdGljYSBjYW4gcmVmZXJlbmNlIGl0XG4gKiBjbGVhbmx5IGluIGdlbmVyYXRlZCBkZWNsYXJhdGlvbiBmaWxlcy5cbiAqL1xuZXhwb3J0IHR5cGUgVHlwZUNvbnN0cnVjdG9yPENvbnN0cnVjdG9ySW5zdGFuY2UgZXh0ZW5kcyBvYmplY3Q+ID0gX0ludGVybmFsX1RDXzxDb25zdHJ1Y3Rvckluc3RhbmNlPjtcblxuLyoqXG4gKiBNaW5pbWFsIGNvbnN0cnVjdG9yIHNoYXBlIHVzZWQgZm9yIHRoZSBUeXBlUmVnaXN0cnkgaW5kZXggc2lnbmF0dXJlLlxuICogSXQgYWNjZXB0cyBhbnkgbW5lbW9uaWNhLWNvbXBhdGlibGUgY29uc3RydWN0b3IsIGJ1dCBkZWxpYmVyYXRlbHkgcmV0dXJuc1xuICogYG9iamVjdGAgc28gdW5hdWdtZW50ZWQgcmVnaXN0cnkgbG9va3VwcyBhcmUgbm90IHVzZWZ1bCB3aXRob3V0IGFuIGV4cGxpY2l0XG4gKiBwZXIta2V5IGNvbnN0cnVjdG9yIHR5cGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZUNvbnN0cnVjdG9yQmFzZSB7XG5cdG5ldyAoLi4uYXJnczogdW5rbm93bltdKTogb2JqZWN0O1xufVxuXG4vKipcbiAqIEluc3RhbmNlIHR5cGUgcHJvZHVjZWQgYnkgYSBUeXBlUmVnaXN0cnkgY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCB0eXBlIEluc3RhbmNlT2ZUeXBlUmVnaXN0cnk8SyBleHRlbmRzIGtleW9mIFR5cGVSZWdpc3RyeT4gPVxuXHRUeXBlUmVnaXN0cnlbS10gZXh0ZW5kcyBuZXcgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gaW5mZXIgUiA/IFIgOiBuZXZlcjtcblxuXG4vKipcbiAqIEV4dHJhY3Qgb25seSB0aGUgbGl0ZXJhbCBzdHJpbmcga2V5cyBvZiBhIHR5cGUsIGZpbHRlcmluZyBvdXQgZ2VuZXJpY1xuICogaW5kZXggc2lnbmF0dXJlcy4gVGhpcyBsZXRzIHVzIGl0ZXJhdGUgb3ZlciBhdWdtZW50ZWQgVHlwZVJlZ2lzdHJ5IGtleXNcbiAqIHdpdGhvdXQgcGlja2luZyB1cCB0aGUgYFtrZXk6IHN0cmluZ11gIHNpZ25hdHVyZS5cbiAqL1xuZXhwb3J0IHR5cGUgTGl0ZXJhbEtleXNPZjxUPiA9IGtleW9mIFQgZXh0ZW5kcyBpbmZlciBLXG5cdD8gSyBleHRlbmRzIHN0cmluZ1xuXHRcdD8gc3RyaW5nIGV4dGVuZHMgSyA/IG5ldmVyIDogS1xuXHRcdDogbmV2ZXJcblx0OiBuZXZlcjtcblxuLyoqXG4gKiBHaXZlbiBhIGRvdHRlZCBUeXBlUmVnaXN0cnkga2V5LCBleHRyYWN0IHRoZSBwYXJlbnQgcGF0aC5cbiAqIGBQYXJlbnRQYXRoPCdBLkIuQyc+YCDihpIgYCdBLkInYC5cbiAqL1xuZXhwb3J0IHR5cGUgUGFyZW50UGF0aDxLIGV4dGVuZHMgc3RyaW5nPiA9XG5cdEsgZXh0ZW5kcyBgJHtpbmZlciBQfS4ke3N0cmluZ31gID8gUCA6IG5ldmVyO1xuXG4vKipcbiAqIEdpdmVuIGEgZG90dGVkIFR5cGVSZWdpc3RyeSBrZXksIHJldHVybiB0aGUgdW5pb24gb2YgYWxsIGFuY2VzdG9yIHByZWZpeGVzLlxuICogYEFsbFBhcmVudFByZWZpeGVzPCdBLkIuQyc+YCDihpIgYCdBJyB8ICdBLkInYC5cbiAqL1xuZXhwb3J0IHR5cGUgQWxsUGFyZW50UHJlZml4ZXM8SyBleHRlbmRzIHN0cmluZz4gPVxuXHRLIGV4dGVuZHMgYCR7aW5mZXIgUH0uJHtzdHJpbmd9YCA/IFAgfCBBbGxQYXJlbnRQcmVmaXhlczxQPiA6IG5ldmVyO1xuXG4vKipcbiAqIEdpdmVuIGEgcGFyZW50IHBhdGgsIHJldHVybiB0aGUgdW5pb24gb2YgVHlwZVJlZ2lzdHJ5IGtleXMgdGhhdCBhcmUgZGlyZWN0XG4gKiBvciBpbmRpcmVjdCBjaGlsZHJlbiBvZiB0aGF0IHBhdGguXG4gKi9cbmV4cG9ydCB0eXBlIENoaWxkS2V5c09mPFAgZXh0ZW5kcyBzdHJpbmc+ID0ge1xuXHRbSyBpbiBrZXlvZiBUeXBlUmVnaXN0cnldOiBLIGV4dGVuZHMgYCR7UH0uJHtzdHJpbmd9YCA/IEsgOiBuZXZlclxufVtrZXlvZiBUeXBlUmVnaXN0cnldO1xuXG4vKipcbiAqIEdpdmVuIGFuIGluc3RhbmNlIHR5cGUsIGZpbmQgdGhlIFR5cGVSZWdpc3RyeSBrZXkocykgd2hvc2UgY29uc3RydWN0b3JcbiAqIHJldHVybnMgdGhhdCBpbnN0YW5jZSB0eXBlLiBUaGlzIGludmVydHMgdGhlIHJlZ2lzdHJ5IGF0IHRoZSB0eXBlIGxldmVsXG4gKiBzbyB1dGlsaXRpZXMgbGlrZSBgcGFyZW50KClgIGNhbiBkZXJpdmUgYW4gaW5zdGFuY2UncyBwYXRoIGZyb20gaXRzXG4gKiB0eXBlIGFsb25lLlxuICovXG5leHBvcnQgdHlwZSBQYXRoT2ZJbnN0YW5jZTxUIGV4dGVuZHMgb2JqZWN0PiA9IHtcblx0W0sgaW4gTGl0ZXJhbEtleXNPZjxUeXBlUmVnaXN0cnk+XTogVHlwZVJlZ2lzdHJ5W0tdIGV4dGVuZHMgbmV3ICguLi5hcmdzOiB1bmtub3duW10pID0+IGluZmVyIFJcblx0XHQ/IFQgZXh0ZW5kcyBSID8gSyA6IG5ldmVyXG5cdFx0OiBuZXZlclxufVtMaXRlcmFsS2V5c09mPFR5cGVSZWdpc3RyeT5dO1xuXG4vKipcbiAqIEdpdmVuIGFuIGluc3RhbmNlIHR5cGUsIHJldHVybiB0aGUgdW5pb24gb2YgVHlwZVJlZ2lzdHJ5IHBhdGhzIHRoYXQgYXJlXG4gKiB2YWxpZCBwYXJlbnQgbG9va3VwcyBmb3IgdGhhdCBpbnN0YW5jZS4gUm9vdCB0eXBlcyBwcm9kdWNlIGBuZXZlcmAgYmVjYXVzZVxuICogdGhleSBoYXZlIG5vIHBhcmVudCBwYXRoLlxuICovXG5leHBvcnQgdHlwZSBQYXJlbnRQYXRoT2ZJbnN0YW5jZTxUIGV4dGVuZHMgb2JqZWN0PiA9IHtcblx0W0sgaW4gTGl0ZXJhbEtleXNPZjxUeXBlUmVnaXN0cnk+XTogVHlwZVJlZ2lzdHJ5W0tdIGV4dGVuZHMgbmV3ICguLi5hcmdzOiB1bmtub3duW10pID0+IGluZmVyIFJcblx0XHQ/IFQgZXh0ZW5kcyBSID8gQWxsUGFyZW50UHJlZml4ZXM8Sz4gOiBuZXZlclxuXHRcdDogbmV2ZXJcbn1bTGl0ZXJhbEtleXNPZjxUeXBlUmVnaXN0cnk+XTtcblxuLy8gSG9vayB0eXBlc1xuZXhwb3J0IHR5cGUgaG9va3NUeXBlcyA9ICdwcmVDcmVhdGlvbicgfCAncG9zdENyZWF0aW9uJyB8ICdjcmVhdGlvbkVycm9yJztcblxuLy8gSG9vayBvcHRpb25zIHBhc3NlZCB0byBob29rIGNhbGxiYWNrc1xuLy8gUCA9IHBhcmVudCAvIGV4aXN0ZW50IGluc3RhbmNlIChwcm90bylcbi8vIFQgPSBjaGlsZCAvIGluaGVyaXRlZCBpbnN0YW5jZSAodHlwZSBiZWluZyBjcmVhdGVkKVxuZXhwb3J0IHR5cGUgaG9va3NPcHRzPFAgPSBvYmplY3QsIFQgPSBQPiA9IHtcblx0VHlwZU5hbWU6IHN0cmluZztcblx0dHlwZTogVHlwZURlZjtcblx0YXJnczogdW5rbm93bltdO1xuXHRleGlzdGVudEluc3RhbmNlOiBQO1xuXHRpbmhlcml0ZWRJbnN0YW5jZT86IFQ7XG5cdGNyZWF0b3I/OiB7IHRocm93TW9kaWZpY2F0aW9uRXJyb3IoZXJyb3I6IEVycm9yKTogdm9pZCB9O1xufTtcblxuLy8gQ2FsbGJhY2sgcGFzc2VkIGludG8gTW9kaWZpY2F0aW9uQ29uc3RydWN0b3IgdG8gYXR0YWNoIGludGVybmFsIHByb3BzIHRvIHRoZSBwcm90b3R5cGVcbmV4cG9ydCBpbnRlcmZhY2UgQWRkUHJvcHNDYWxsYmFjayBleHRlbmRzIENhbGxhYmxlRnVuY3Rpb24ge1xuXHQocHJvdG86IG9iamVjdCk6IHZvaWQ7XG59XG5cbi8vIE1vZGlmaWNhdGlvbkNvbnN0cnVjdG9yOiB3aXJlcyBwcm90b3R5cGUgY2hhaW4gZHVyaW5nIGluc3RhbmNlIGNyZWF0aW9uXG5leHBvcnQgaW50ZXJmYWNlIE1vZGlmaWNhdGlvbkNvbnN0cnVjdG9yIGV4dGVuZHMgQ2FsbGFibGVGdW5jdGlvbiB7XG5cdChcblx0XHR0aGlzOiBvYmplY3QsXG5cdFx0TW9kaWZpY2F0b3JUeXBlOiBNbmVtb25pY2FDb25zdHJ1Y3Rvcixcblx0XHRNb2RpZmljYXRvclR5cGVQcm90b3R5cGU6IG9iamVjdCxcblx0XHRfYWRkUHJvcHM6IEFkZFByb3BzQ2FsbGJhY2tcblx0KTogTW5lbW9uaWNhQ29uc3RydWN0b3I7XG59XG5cbi8vIEZhY3RvcnkgdGhhdCByZXR1cm5zIGEgTW9kaWZpY2F0aW9uQ29uc3RydWN0b3IgKHVzZWQgaW4gY29uc3RydWN0b3JPcHRpb25zKVxuZXhwb3J0IGludGVyZmFjZSBNb2RpZmljYXRpb25Db25zdHJ1Y3RvckZhY3RvcnkgZXh0ZW5kcyBDYWxsYWJsZUZ1bmN0aW9uIHtcblx0KCk6IE1vZGlmaWNhdGlvbkNvbnN0cnVjdG9yO1xufVxuXG4vLyBGYWN0b3J5IHRoYXQgcmV0dXJucyBhIE1uZW1vbmljYUNvbnN0cnVjdG9yIChzdG9yZWQgaW4gVHlwZURlZi5jb25zdHJ1Y3RIYW5kbGVyKVxuZXhwb3J0IGludGVyZmFjZSBNbmVtb25pY2FDb25zdHJ1Y3RvckZhY3RvcnkgZXh0ZW5kcyBDYWxsYWJsZUZ1bmN0aW9uIHtcblx0KCk6IE1uZW1vbmljYUNvbnN0cnVjdG9yO1xufVxuXG4vLyBNYXJrcyB0aGUgdG9wIG9mIGEgY2FwdHVyZWQgc3RhY2sgdHJhY2UgKHBhc3NlZCB0byBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSBhcyBjb25zdHJ1Y3Rvck9wdClcbmV4cG9ydCBpbnRlcmZhY2UgU3RhY2tCb3VuZGFyeSBleHRlbmRzIENhbGxhYmxlRnVuY3Rpb24ge31cblxuLy8gQSB3cmFwcGFibGUgdXRpbGl0eSBtZXRob2Qg4oCUIGFueSBjYWxsYWJsZSB0aGF0IHdyYXBUaGlzKCkgY2FuIHByb3h5XG5leHBvcnQgaW50ZXJmYWNlIFdyYXBwYWJsZU1ldGhvZCBleHRlbmRzIENhbGxhYmxlRnVuY3Rpb24ge31cblxuLy8gQ29uc3RydWN0b3Igb3B0aW9ucyBmb3IgZGVmaW5lXG5leHBvcnQgdHlwZSBjb25zdHJ1Y3Rvck9wdGlvbnMgPSB7XG5cdC8vIGV4cGxpY2l0IGRlY2xhcmF0aW9uIHdlIHdpc2ggdXNlXG5cdC8vIGFuIG9sZCBzdHlsZSBiYXNlZCBjb25zdHJ1Y3RvcnNcblx0TW9kaWZpY2F0aW9uQ29uc3RydWN0b3I/OiBNb2RpZmljYXRpb25Db25zdHJ1Y3RvckZhY3RvcnksXG5cdC8vIHNoYWxsIG9yIG5vdCB3ZSB1c2Ugc3RyaWN0IGNoZWNraW5nXG5cdC8vIGZvciBjcmVhdGlvbiBzdWItaW5zdGFuY2VzIE9ubHkgZnJvbSBjdXJyZW50IHR5cGVcblx0Ly8gb3Igd2UgbWlnaHQgdXNlIHVwLW5lc3RlZCBzdWItaW5zdGFuY2VzIGZyb20gY2hhaW5cblx0c3RyaWN0Q2hhaW4/OiBib29sZWFuLFxuXHQvLyBzaG91bGQgd2UgdXNlIGZvcmNlZCBlcnJvcnMgY2hlY2tpbmdcblx0Ly8gdG8gbWFrZSBhbGwgaW5oZXJpdGVkIHR5cGVzIGVycm9yZWRcblx0Ly8gaWYgdGhlcmUgaXMgYW4gZXJyb3Igc29tZXdoZXJlIGluIGNoYWluXG5cdGJsb2NrRXJyb3JzPzogYm9vbGVhbixcblx0Ly8gaWYgaXQgaXMgbmVjZXNzYXJ5IHRvIGNvbGxlY3Qgc3RhY2tcblx0Ly8gYXMgYSBfX3N0YWNrX18gcHJvdG90eXBlIHByb3BlcnR5XG5cdC8vIGR1cmluZyB0aGUgcHJvY2VzcyBvZiBpbnN0YW5jZSBjcmVhdGlvblxuXHRzdWJtaXRTdGFjaz86IGJvb2xlYW4sXG5cdC8vIGF3YWl0IG5ldyBDb25zdHJ1Y3RvcigpXG5cdC8vIG11c3QgcmV0dXJuIHZhbHVlXG5cdGF3YWl0UmV0dXJuPzogYm9vbGVhbixcblx0Ly8gRm9yY2UgY2xhc3MgbW9kZSAoYXV0by1kZXRlY3RlZCBieSBkZWZhdWx0KVxuXHRhc0NsYXNzPzogYm9vbGVhbixcbn07XG5cbi8vIFN1YnR5cGVzIG1hcCAtIHJlcHJlc2VudHMgdGhlIHN1YnR5cGVzIHByb3BlcnR5XG5leHBvcnQgdHlwZSBTdWJ0eXBlc01hcCA9IE1hcDxzdHJpbmcsIFR5cGVDbGFzcz47XG5cbi8vIFR5cGUgZGVmaW5pdGlvbiBvYmplY3QgKGludGVybmFsIHByb3BlcnRpZXMpXG5leHBvcnQgdHlwZSBUeXBlRGVmID0ge1xuXHRUeXBlTmFtZTogc3RyaW5nO1xuXHRwcm90bzogb2JqZWN0O1xuXHRpc1N1YlR5cGU6IGJvb2xlYW47XG5cdHN1YnR5cGVzOiBTdWJ0eXBlc01hcDtcblx0Y29sbGVjdGlvbjogQ29sbGVjdGlvbkRlZjtcblx0Y29uZmlnOiBjb25zdHJ1Y3Rvck9wdGlvbnM7XG5cdHBhcmVudFR5cGU/OiBUeXBlRGVmO1xuXHRjb25zdHJ1Y3RIYW5kbGVyOiBNbmVtb25pY2FDb25zdHJ1Y3RvckZhY3Rvcnk7XG5cdHRpdGxlOiBzdHJpbmc7XG5cdGhvb2tzOiBSZWNvcmQ8c3RyaW5nLCBTZXQ8aG9vaz4+O1xuXHRpbnZva2VIb29rOiAoaG9va1R5cGU6IGhvb2tzVHlwZXMsIG9wdHM6IGhvb2tzT3B0cykgPT4gU2V0PHVua25vd24+O1xuXHRwcm90b3R5cGU6IHVua25vd247XG5cdHN0YWNrPzogc3RyaW5nO1xuXHRbU3ltYm9sLmhhc0luc3RhbmNlXTogKGluc3RhbmNlOiBvYmplY3QpID0+IGJvb2xlYW47XG59O1xuXG4vLyBDb2xsZWN0aW9uIGRlZmluaXRpb25cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb25EZWYgPSBIb29rYWJsZSAmIHtcblx0ZGVmaW5lOiBUeXBlQWJzb3JiZXI7XG5cdGxvb2t1cDogVHlwZUxvb2t1cDtcblx0c3VidHlwZXM6IFN1YnR5cGVzTWFwO1xuXHRba2V5OiBzdHJpbmddOiB1bmtub3duO1xufTtcblxuLy8gVHlwZSBsb29rdXAgZnVuY3Rpb24gdHlwZTogbWF5IGhhdmUgYXVnbWVudGF0aW9uIGJ5IFRhY3RpY2EgcmUtZGVmaW5pdGlvblxuZXhwb3J0IGludGVyZmFjZSBUeXBlTG9va3VwIGV4dGVuZHMgQ2FsbGFibGVGdW5jdGlvbiB7XG5cdCh0aGlzOiBNYXA8c3RyaW5nLCB1bmtub3duPiwgVHlwZU5lc3RlZFBhdGg6IHN0cmluZyk6IFR5cGVDbGFzcyB8IHVuZGVmaW5lZDtcbn1cblxuLy8gU3BlY2lmaWNhdGlvbiBmb3IgY2hhaW5lZCBzdWJ0eXBlIGNyZWF0aW9uIHdpdGggLnRoZW4oKVxuZXhwb3J0IGludGVyZmFjZSBUaGVuU3BlYyB7XG5cdHN1YnR5cGU6IG9iamVjdDtcblx0YXJnczogdW5rbm93bltdO1xuXHRuYW1lPzogc3RyaW5nO1xufVxuXG4vLyBDb250ZXh0IG9iamVjdCBwYXNzZWQgdGhyb3VnaCB0aGUgSW5zdGFuY2VDcmVhdG9yIHBpcGVsaW5lXG5leHBvcnQgaW50ZXJmYWNlIEluc3RhbmNlQ3JlYXRvckNvbnRleHQge1xuXHR0eXBlOiBUeXBlRGVmO1xuXHRUeXBlTmFtZTogc3RyaW5nO1xuXHRleGlzdGVudEluc3RhbmNlOiBvYmplY3Q7XG5cdGFyZ3M6IHVua25vd25bXTtcblx0TW9kaWZpY2F0aW9uQ29uc3RydWN0b3I6IE1vZGlmaWNhdGlvbkNvbnN0cnVjdG9yO1xuXHRNb2RpZmljYXRvclR5cGU6IE1uZW1vbmljYUNvbnN0cnVjdG9yO1xuXHRJbnN0YW5jZU1vZGlmaWNhdG9yOiBNbmVtb25pY2FDb25zdHJ1Y3Rvcjtcblx0aW5oZXJpdGVkSW5zdGFuY2U6IG9iamVjdCB8IFByb21pc2U8b2JqZWN0Pjtcblx0Y29uZmlnOiBjb25zdHJ1Y3Rvck9wdGlvbnM7XG5cdHByb3RvOiBvYmplY3Q7XG5cdF9fcHJvdG9fcHJvdG9fXz86IG9iamVjdDtcblx0c3RhY2s/OiBzdHJpbmdbXTtcblxuXHRnZXRFeGlzdGVudEFzeW5jU3RhY2soZXhpc3RlbnRJbnN0YW5jZTogb2JqZWN0KTogdW5rbm93bjtcblx0cG9zdFByb2Nlc3NpbmcoY29udGludWF0aW9uT2Y/OiBUeXBlRGVmKTogdm9pZDtcblx0bWFrZUF3YWl0ZXIodHlwZTogVHlwZURlZiwgdGhlbj86IFRoZW5TcGVjKTogUHJvbWlzZTxvYmplY3Q+O1xuXHRhZGRUaGVuKHRoZW46IFRoZW5TcGVjKTogdm9pZDtcblx0aW52b2tlUHJlSG9va3MoKTogdm9pZDtcblx0aW52b2tlUG9zdEhvb2tzKCk6IHsgdHlwZTogU2V0PHVua25vd24+OyBjb2xsZWN0aW9uOiBTZXQ8dW5rbm93bj4gfTtcblx0dGhyb3dNb2RpZmljYXRpb25FcnJvcihlcnJvcjogTW5lbW9uaWNhRXJyb3IpOiB2b2lkO1xufVxuXG4vKipcbiAqIFByb3RvIG1lcmdlIHR5cGUgLSBjb21iaW5lcyBwYXJlbnQgYW5kIGNoaWxkIHR5cGVzIHdpdGhvdXQgcHJvcGVydHkgY29uZmxpY3RzLlxuICpcbiAqIFdoZW4gYSBzdWJ0eXBlIGlzIGRlZmluZWQgZnJvbSBhIHBhcmVudCBpbnN0YW5jZSwgd2Ugd2FudCB0aGUgY2hpbGQgcHJvcGVydGllc1xuICogdG8gdGFrZSBwcmVjZWRlbmNlLiBgRXhjbHVkZTxrZXlvZiBQLCBrZXlvZiBUPmAgcmVtb3ZlcyBvdmVybGFwcGluZyBrZXlzIGZyb20gUCxcbiAqIHNvIGBQaWNrPFAsIC4uLj5gIG9ubHkgYnJpbmdzIGluIHBhcmVudCBwcm9wZXJ0aWVzIHRoYXQgZG9uJ3QgY2xhc2ggd2l0aCBjaGlsZC5cbiAqXG4gKiBSZXN1bHQ6IGNoaWxkIFQgZ2V0cyBhbGwgaXRzIG93biBwcm9wcywgcGx1cyBwYXJlbnQncyBub24tb3ZlcmxhcHBpbmcgcHJvcHMuXG4gKi9cbmV4cG9ydCB0eXBlIFByb3RvPFAgZXh0ZW5kcyBvYmplY3QsIFQgZXh0ZW5kcyBvYmplY3Q+ID0gVCAmIFBpY2s8UCwgRXhjbHVkZTxrZXlvZiBQLCBrZXlvZiBUPj47XG5cblxuLy8gZXhwb3J0IHR5cGUgUHJvdG9GbGF0PFxuLy8gXHRQIGV4dGVuZHMgb2JqZWN0LFxuLy8gXHRUIGV4dGVuZHMgb2JqZWN0LFxuLy8gXHRGIGV4dGVuZHMgUHJvdG88UCwgVD4gPSBQcm90bzxQLCBUPlxuLy8gPiA9IHsgW2tleSBpbiBrZXlvZiBGXTogRltrZXldfSA7XG5cbmV4cG9ydCB0eXBlIFByb3RvRmxhdDxcblx0UCBleHRlbmRzIG9iamVjdCxcblx0VCBleHRlbmRzIG9iamVjdCxcblx0TCBleHRlbmRzIEV4Y2x1ZGU8a2V5b2YgUCwga2V5b2YgVD4gPSBFeGNsdWRlPGtleW9mIFAsIGtleW9mIFQ+LFxuPiA9IHtcbiAgICBba2V5IGluIGtleW9mIFRdOiBUW2tleV07XG59ICYge1xuXHRba2V5IGluIExdOiBQW2tleV07XG59O1xuXG4vLyBNbmVtb25pY2EgaW5zdGFuY2UgbWV0aG9kIGtleXMuIFRoZXNlIGFyZSBmaWx0ZXJlZCBvdXQgb2YgZXh0cmFjdGVkL21lcmdlZFxuLy8gZmllbGQtb25seSB2aWV3cyBiZWNhdXNlIHRoZXkgYmVsb25nIHRvIHRoZSBwcm90b3R5cGUsIG5vdCB0byB0aGUgdXNlcidzXG4vLyBlbnVtZXJhYmxlIGRhdGEgcHJvcGVydGllcy5cbmV4cG9ydCB0eXBlIE1uZW1vbmljYUluc3RhbmNlTWV0aG9kS2V5cyA9XG5cdCdleHRyYWN0JyB8ICdwaWNrJyB8ICdwYXJlbnQnIHwgJ2Nsb25lJyB8ICdmb3JrJyB8ICdleGNlcHRpb24nIHwgJ3NpYmxpbmcnO1xuXG5leHBvcnQgdHlwZSBGbGF0dGVuPEY+ID0geyBba2V5IGluIGtleW9mIEZdOiBGW2tleV0gfVxuXG4vLyBFeHRyYWN0ZWQ8VD46IHRoZSBzaGFwZSByZXR1cm5lZCBieSB1dGlscy5leHRyYWN0KGluc3RhbmNlKS5cbi8vIEl0IGNvbnRhaW5zIHRoZSBlbnVtZXJhYmxlIHN0cmluZy1rZXllZCB1c2VyIHByb3BlcnRpZXMgb2YgdGhlIGluc3RhbmNlLFxuLy8gb21pdHRpbmcgTW5lbW9uaWNhSW5zdGFuY2UgbWV0aG9kcyAoZXh0cmFjdCwgcGljaywgcGFyZW50LCBjbG9uZSwgZm9yayxcbi8vIGV4Y2VwdGlvbiwgc2libGluZykuIE9wdGlvbmFsaXR5IGlzIHByZXNlcnZlZCBmcm9tIHRoZSBzb3VyY2UgdHlwZS5cbi8vIFRoZSBgJiB7fWAgdHJpY2sgZm9yY2VzIFR5cGVTY3JpcHQgdG8gZXhwYW5kIHRoZSBhbGlhcyBpbiBob3ZlciB0b29sdGlwc1xuLy8gc28gaXQgcmVuZGVycyBhcyBhIHBsYWluIG9iamVjdCBsaXRlcmFsIGluc3RlYWQgb2YgXCJFeHRyYWN0ZWQ8ey4uLn0+XCIuXG5leHBvcnQgdHlwZSBFeHRyYWN0ZWQ8VCBleHRlbmRzIG9iamVjdD4gPSB7XG5cdFtLIGluIGtleW9mIFQgYXMgSyBleHRlbmRzIHN0cmluZyA/IChLIGV4dGVuZHMgTW5lbW9uaWNhSW5zdGFuY2VNZXRob2RLZXlzID8gbmV2ZXIgOiBLKSA6IG5ldmVyXTogVFtLXTtcbn0gJiB7fTtcblxuLy8gUGFyc2VkPFQ+OiB0aGUgc2hhcGUgcmV0dXJuZWQgYnkgdXRpbHMucGFyc2UoaW5zdGFuY2UpLlxuLy8gSXQgaXMgYSBvbmUtbGV2ZWwgc25hcHNob3Qgb2YgdGhlIGluc3RhbmNlJ3MgcHJvdG90eXBlIGNoYWluLlxuLy8gYHByb3BzYCBjb250YWlucyB0aGUgaW5zdGFuY2UncyBlbnVtZXJhYmxlIHVzZXIgcHJvcGVydGllcztcbi8vIGBqb2ludGAgY29udGFpbnMgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIGNvcGllZCBmcm9tIHRoZSBpbW1lZGlhdGUgcHJvdG90eXBlO1xuLy8gYHBhcmVudGAgaXMgdGhlIG5leHQgbGluayB1cCB0aGUgY2hhaW4gKGN1cnJlbnRseSBub3QgcmVjdXJzaXZlbHkgcGFyc2VkKS5cbmV4cG9ydCB0eXBlIFBhcnNlZDxUIGV4dGVuZHMgb2JqZWN0PiA9IHtcblx0bmFtZTogc3RyaW5nO1xuXHRwcm9wczogRXh0cmFjdGVkPFQ+O1xuXHRzZWxmOiBUO1xuXHRwcm90bzogb2JqZWN0O1xuXHRqb2ludDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdHBhcmVudDogb2JqZWN0IHwgdW5kZWZpbmVkO1xufTtcblxuLy8gU2libGluZyB0eXBlIGFjY2Vzc29yXG5leHBvcnQgaW50ZXJmYWNlIFNpYmxpbmdBY2Nlc3NvciB7XG5cdChTaWJsaW5nVHlwZU5hbWU6IHN0cmluZyk6IFR5cGVDbGFzcyB8IHVuZGVmaW5lZDtcblx0W2tleTogc3RyaW5nXTogVHlwZUNsYXNzIHwgdW5kZWZpbmVkO1xufVxuXG4vLyBNbmVtb25pY2EgaW5zdGFuY2UgbWV0aG9kcyBpbnRlcmZhY2UgKG9wdC1pbikuXG4vLyBUaGVzZSBtZXRob2RzIHVzZWQgdG8gYmUgYXV0by1pbmplY3RlZCBvbnRvIGV2ZXJ5IGluc3RhbmNlLiBUaGV5IGFyZSBub3dcbi8vIGF2YWlsYWJsZSBvbmx5IHdoZW4gYSB0eXBlIGV4cGxpY2l0bHkgYWRkcyB0aGVtIHRvIGl0cyBwcm90b3R5cGUuXG4vLyBVc2VycyBjYW4gc3RpbGwgdXNlIHRoaXMgaW50ZXJmYWNlIHRvIHR5cGUgdGhlaXIgb3duIHJvb3QtbGV2ZWwgaGVscGVycy5cbmV4cG9ydCBpbnRlcmZhY2UgTW5lbW9uaWNhSW5zdGFuY2U8VCBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4ge1xuXHRleHRyYWN0KCk6IEV4dHJhY3RlZDxUPjtcblx0cGljazxLIGV4dGVuZHMga2V5b2YgVD4oLi4ua2V5czogKEsgfCBLW10pW10pOiB7IFtQIGluIEtdOiBUW1BdIH0gJiB7fTtcblx0cGljayguLi5rZXlzOiBzdHJpbmdbXSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRwYXJlbnQoKTogb2JqZWN0IHwgdW5kZWZpbmVkO1xuXHRwYXJlbnQ8SyBleHRlbmRzIFBhcmVudFBhdGhPZkluc3RhbmNlPHRoaXM+ICYgc3RyaW5nPihcblx0XHRjb25zdHJ1Y3Rvckxvb2t1cFBhdGg6IEtcblx0KTogSW5zdGFuY2VPZlR5cGVSZWdpc3RyeTxLPiB8IHVuZGVmaW5lZDtcblx0cGFyZW50KGNvbnN0cnVjdG9yTG9va3VwUGF0aDogc3RyaW5nKTogb2JqZWN0IHwgdW5kZWZpbmVkO1xuXHRyZWFkb25seSBjbG9uZTogdGhpcztcblx0Zm9yayguLi5mb3JrQXJnczogdW5rbm93bltdKTogdGhpcztcblx0ZXhjZXB0aW9uKGVycm9yOiBFcnJvciwgLi4uYXJnczogdW5rbm93bltdKTogRXJyb3I7XG5cdHJlYWRvbmx5IHNpYmxpbmc6IFNpYmxpbmdBY2Nlc3Nvcjtcbn1cblxuLy8gSW5zdGFuY2UgcHJvcGVydGllcyBmb3IgX19zZWxmX18gcmVmZXJlbmNlXG4vLyBUaGlzIG1lcmdlcyBpbnRlcm5hbCBwcm9wcyB3aXRoIHRoZSBpbnN0YW5jZSBtZXRob2RzXG4vLyBJbnRlcm5hbCBpbnN0YW5jZSBwcm9wZXJ0aWVzIChub24tZW51bWVyYWJsZSlcbi8vIFRoZXNlIGFyZSBhbHdheXMgcHJlc2VudCBvbiBpbnN0YW5jZXMgYnV0IGFjY2Vzc2VkIHZpYSBnZXRQcm9wcy9zZXRQcm9wc1xuZXhwb3J0IHR5cGUgSW5zdGFuY2VJbnRlcm5hbFByb3BzID0ge1xuXHRfX3Byb3RvX3Byb3RvX186IG9iamVjdDtcblx0X19hcmdzX186IHVua25vd25bXTtcblx0X19jb2xsZWN0aW9uX186IENvbGxlY3Rpb25EZWY7XG5cdF9fc3VidHlwZXNfXzogTWFwPHN0cmluZywgb2JqZWN0Pjtcblx0X190eXBlX186IFR5cGVEZWY7XG5cdF9fcGFyZW50X186IG9iamVjdDtcblx0X19zdGFja19fPzogc3RyaW5nO1xuXHRfX2NyZWF0b3JfXzogSW5zdGFuY2VDcmVhdG9yQ29udGV4dDtcblx0X190aW1lc3RhbXBfXzogbnVtYmVyO1xufTtcblxuLy8gQ29tYmluZWQgUHJvcHMgdHlwZSBmb3IgaW50ZXJuYWwgdXNlIGluc2lkZSAuL3NyY1xuZXhwb3J0IHR5cGUgUHJvcHMgPSBJbnN0YW5jZUludGVybmFsUHJvcHMgJiB7XG5cdF9fc2VsZl9fOiBJbnN0YW5jZUludGVybmFsUHJvcHM7XG5cdFtrZXk6IHN0cmluZ106IHVua25vd247XG59O1xuXG4vLyBDb21iaW5lZCBpbnN0YW5jZSB0eXBlOiBwbGFpbiBvYmplY3Qgd2l0aCB0aGUgdXNlcidzIGZpZWxkcyBvbmx5LlxuLy8gSW5zdGFuY2UgbWV0aG9kcyAoZXh0cmFjdCwgcGljaywgZm9yaywgZXRjLikgYXJlIG5vIGxvbmdlciBhdXRvLWluamVjdGVkLlxuLy8gVGhlIGlubGluZSBtYXBwZWQgdHlwZSBpcyB1c2VkIGluc3RlYWQgb2YgdGhlIEZsYXR0ZW4gYWxpYXMgc28gdGhhdCBob3ZlclxuLy8gdG9vbHRpcHMgc2hvdyB0aGUgYWN0dWFsIGZpZWxkIG9iamVjdCBsaXRlcmFsIGZpcnN0LCBub3QgXCJGbGF0dGVuPHsuLi59PlwiLlxuZXhwb3J0IHR5cGUgSW5zdGFuY2VSZXN1bHQ8XG4gIE4gZXh0ZW5kcyBvYmplY3QsXG4+ID0geyBbSyBpbiBrZXlvZiBOXTogTltLXSB9O1xuXG4vLyBEZWZpbml0b3IgaW5zdGFuY2UgLSB0aGUgY29uc3RydWN0b3IgZnVuY3Rpb24gcmV0dXJuZWQgYnkgZGVmaW5lXG4vLyBOID0gaW5zdGFuY2UgdHlwZSAocHJvcGVydGllcyBhdmFpbGFibGUgb24gaW5zdGFuY2VzKVxuLy8gUyA9IHN1YnR5cGVzIG1hcFxuZXhwb3J0IGludGVyZmFjZSBJRGVmaW5pdG9ySW5zdGFuY2U8XG5cdE4gZXh0ZW5kcyBvYmplY3QsXG5cdFIgZXh0ZW5kcyBJbnN0YW5jZVJlc3VsdDxOPiA9IEluc3RhbmNlUmVzdWx0PE4+XG4+IHtcblxuXHRUeXBlTmFtZTogc3RyaW5nO1xuXHRwcm90b3R5cGU6IE47XG5cblx0XG5cdC8vIHRoZSBsaW5lIGJlbG93IGRlY2xhcmVzIGEgYG5ldyAuLi5gIGludm9jYXRpb24sXG5cdC8vIHNvIG1ha2VzIGludGVyZmFjZSBjb25zdHJ1Y3RpYmxlXG5cdC8vIG5ldyguLi5hcmdzOiB1bmtub3duW10pOiB7IFtrZXkgaW4ga2V5b2YgUl06IFJba2V5XSB9O1xuXHRuZXcoLi4uYXJnczogdW5rbm93bltdKTogUjtcblxuXHRcblx0Ly8gVE9ETzogbmVlZCBjaGVjayBpZiBsaW5lIGJlbG93IHdvcmtzXG5cdC8vIGFsc28gVFMgaGludGluZyBjaGVjayBhcyB3ZWxsXG5cdC8vIHRoZSBsaW5lIGJlbG93IHNob3VsZCBtYWtlIGlzIGEgQGRlY29yYXRlIGRlY29yYXRvciB3b3JraW5nXG5cdCguLi5hcmdzOiB1bmtub3duW10pOiBJRGVmaW5pdG9ySW5zdGFuY2U8Uj47XG5cblxuXHQvLyBEZWZpbmUgbWV0aG9kIHRoYXQgY29tYmluZXMgcGFyZW50IE4gd2l0aCBuZXcgdHlwZSBUIHVzaW5nIFByb3RvXG5cdGRlZmluZTxcblx0XHRUIGV4dGVuZHMgb2JqZWN0LFxuXG5cdFx0Ly8gdGhpcyB3aWxsIGJlIGluc3RhbmNlIHR5cGUgZm9yIHN1Yi10eXBlICEhIVxuXHRcdC8vIEYgZXh0ZW5kcyBGbGF0dGVuPFByb3RvPE4sIFQ+PlxuXHRcdEYgZXh0ZW5kcyBQcm90bzxOLCBUPlxuXHQ+KFxuXHRcdFR5cGVPclR5cGVOYW1lOiBzdHJpbmcgfCBDYWxsYWJsZUZ1bmN0aW9uLFxuXHRcdGNvbnN0cnVjdEhhbmRsZXJPckNvbmZpZz86IElERUY8VD4gfCBvYmplY3QgfCBib29sZWFuIHwgQ2FsbGFibGVGdW5jdGlvbixcblx0XHRjb25maWdPclVuZGVmaW5lZD86IGNvbnN0cnVjdG9yT3B0aW9ucyB8IENhbGxhYmxlRnVuY3Rpb24gfCBib29sZWFuXG5cdCk6IElEZWZpbml0b3JJbnN0YW5jZTxGPjtcblx0XG5cdGxvb2t1cDogVHlwZUxvb2t1cDtcblx0XG5cdHJlZ2lzdGVySG9vayhob29rVHlwZTogaG9va3NUeXBlcywgY2I6IGhvb2spOiB2b2lkO1xuXHRcblx0XG5cdHN1YnR5cGVzOiBTdWJ0eXBlc01hcDtcblx0XG5cdC8vIEludGVybmFsIHByb3BlcnRpZXMgYWNjZXNzZWQgYnkgdGVzdHNcblx0X190eXBlX18/OiBUeXBlRGVmO1xuXHRjb2xsZWN0aW9uPzogQ29sbGVjdGlvbkRlZjtcblxuXHQvKlxuXHQvLyBBbGxvdyBkeW5hbWljIHByb3BlcnR5IGFjY2VzcyBmb3Igc3VidHlwZXNcblx0W2tleTogc3RyaW5nXTogdW5rbm93bjtcblx0Ki9cbn1cblxuLy8gVHlwZSBhYnNvcmJlciBmdW5jdGlvbiB0eXBlIC0gdXNlZCBmb3IgZGVmaW5pbmcgc3VidHlwZXNcbi8vIFN1cHBvcnRzIG11bHRpcGxlIGNhbGxpbmcgY29udmVudGlvbnM6XG4vLyAxLiBNb2Rlcm46IGRlZmluZShUeXBlTmFtZSwgY29uc3RydWN0SGFuZGxlciwgY29uZmlnPylcbi8vIDIuIExlZ2FjeTogZGVmaW5lKGNvbnN0cnVjdEhhbmRsZXIsIGNvbmZpZz8pIC0gVHlwZU5hbWUgZnJvbSBjb25zdHJ1Y3RvciBuYW1lXG4vLyAzLiBOZXN0ZWQ6IHBhcmVudFR5cGUuZGVmaW5lKFR5cGVOYW1lLCBjb25zdHJ1Y3RIYW5kbGVyLCBjb25maWc/KVxuZXhwb3J0IGludGVyZmFjZSBUeXBlQWJzb3JiZXIgZXh0ZW5kcyBDYWxsYWJsZUZ1bmN0aW9uIHtcblx0PFQgZXh0ZW5kcyBvYmplY3Q+KFxuXHRcdHRoaXM6IHVua25vd24sXG5cdFx0VHlwZU9yVHlwZU5hbWU6IHN0cmluZyB8IENhbGxhYmxlRnVuY3Rpb24sXG5cdFx0Y29uc3RydWN0SGFuZGxlck9yQ29uZmlnPzogSURFRjxUPiB8IG9iamVjdCB8IGJvb2xlYW4gfCBDYWxsYWJsZUZ1bmN0aW9uLFxuXHRcdGNvbmZpZ09yVW5kZWZpbmVkPzogY29uc3RydWN0b3JPcHRpb25zIHwgQ2FsbGFibGVGdW5jdGlvbiB8IGJvb2xlYW5cblx0KTogSURlZmluaXRvckluc3RhbmNlPFQ+O1xufVxuXG4vLyBUeXBlc0NvbGxlY3Rpb24gaW50ZXJmYWNlIGZvciBjcmVhdGVUeXBlc0NvbGxlY3Rpb25cbi8vIFRoaXMgcmVwcmVzZW50cyB0aGUgYWN0dWFsIHJldHVybiB0eXBlIG9mIGNyZWF0ZVR5cGVzQ29sbGVjdGlvblxuZXhwb3J0IGludGVyZmFjZSBUeXBlc0NvbGxlY3Rpb24gZXh0ZW5kcyBIb29rYWJsZSB7XG5cdGRlZmluZTogVHlwZUFic29yYmVyO1xuXHRsb29rdXA6IFR5cGVMb29rdXA7XG5cdHN1YnR5cGVzOiBTdWJ0eXBlc01hcDtcblx0W2tleTogc3RyaW5nXTogdW5rbm93bjtcbn1cblxuLy8gU2hhcmVkIGludGVyZmFjZSBmb3Igb2JqZWN0cyB0aGF0IHN1cHBvcnQgaG9va3MgKFR5cGVEZWYgYW5kIENvbGxlY3Rpb25EZWYpXG5leHBvcnQgaW50ZXJmYWNlIEhvb2thYmxlIHtcblx0aG9va3M6IFJlY29yZDxzdHJpbmcsIFNldDxob29rPj47XG5cdGludm9rZUhvb2soaG9va1R5cGU6IGhvb2tzVHlwZXMsIG9wdHM6IGhvb2tzT3B0cyk6IFNldDx1bmtub3duPjtcblx0cmVnaXN0ZXJIb29rKGhvb2tUeXBlOiBob29rc1R5cGVzLCBjYjogaG9vayk6IHZvaWQ7XG5cdHJlZ2lzdGVyRmxvd0NoZWNrZXIoY2I6IChvcHRzOiBvYmplY3QpID0+IHVua25vd24pOiB2b2lkO1xufVxuXG4vLyBjcmVhdGVUeXBlc0NvbGxlY3Rpb24gZnVuY3Rpb24gdHlwZVxuZXhwb3J0IHR5cGUgQ3JlYXRlVHlwZXNDb2xsZWN0aW9uRnVuY3Rpb24gPSAoY29uZmlnPzogY29uc3RydWN0b3JPcHRpb25zKSA9PiBUeXBlc0NvbGxlY3Rpb247XG5cbi8vIFR5cGUgY2xhc3MgLSBiYXNlIHR5cGUgY29uc3RydWN0b3JcbmV4cG9ydCB0eXBlIFR5cGVDbGFzcyA9IElEZWZpbml0b3JJbnN0YW5jZTxvYmplY3Q+O1xuXG4vLyBNbmVtb25pY2EgY29uc3RydWN0b3Ig4oCUIHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiByZXR1cm5lZCBieSBjb25zdHJ1Y3RIYW5kbGVyKClcbi8vIEhhcyBTeW1ib2xDb25zdHJ1Y3Rvck5hbWUgYXR0YWNoZWQgYW5kIGlzIGJvdGggbmV3YWJsZSBhbmQgY2FsbGFibGVcbmV4cG9ydCBpbnRlcmZhY2UgTW5lbW9uaWNhQ29uc3RydWN0b3IgZXh0ZW5kcyBOZXdhYmxlRnVuY3Rpb24ge1xuXHRuZXcgKC4uLmFyZ3M6IHVua25vd25bXSk6IG9iamVjdDtcblx0KHRoaXM6IG9iamVjdCwgLi4uYXJnczogdW5rbm93bltdKTogdW5rbm93bjtcblx0W2tleTogc3ltYm9sXTogdW5rbm93bjtcbn1cblxuLy8gVHlwZSBkZXNjcmlwdG9yIGluc3RhbmNlIOKAlCBpbnRlcm5hbCBzaGFwZSBvZiBUeXBlRGVzY3JpcHRvciBvYmplY3RzXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVEZXNjcmlwdG9yRGVmaW5lIGV4dGVuZHMgQ2FsbGFibGVGdW5jdGlvbiB7XG5cdChcblx0XHRUeXBlT3JUeXBlTmFtZTogc3RyaW5nIHwgQ2FsbGFibGVGdW5jdGlvbixcblx0XHRjb25zdHJ1Y3RIYW5kbGVyT3JDb25maWc/OiBDYWxsYWJsZUZ1bmN0aW9uIHwgb2JqZWN0LFxuXHRcdGNvbmZpZz86IG9iamVjdFxuXHQpOiBUeXBlQ2xhc3M7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZURlc2NyaXB0b3JMb29rdXAgZXh0ZW5kcyBDYWxsYWJsZUZ1bmN0aW9uIHtcblx0KFR5cGVOZXN0ZWRQYXRoOiBzdHJpbmcpOiBUeXBlQ2xhc3MgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCB0eXBlIFR5cGVEZXNjcmlwdG9ySW5zdGFuY2UgPSB7XG5cdGRlZmluZTogVHlwZURlc2NyaXB0b3JEZWZpbmU7XG5cdGxvb2t1cDogVHlwZURlc2NyaXB0b3JMb29rdXA7XG5cdHN1YnR5cGVzOiBNYXA8c3RyaW5nLCBvYmplY3Q+O1xuXHRUeXBlTmFtZTogc3RyaW5nO1xufTtcblxuLy8gQ29uc3RydWN0b3IgdHlwZSBmb3IgZGVjb3JhdGUgZnVuY3Rpb25cbmV4cG9ydCB0eXBlIENvbnN0cnVjdG9yPFQgPSBvYmplY3Q+ID0gbmV3ICguLi5hcmdzOiB1bmtub3duW10pID0+IFQ7XG5cbi8vIERlY29yYXRlZCBjbGFzcyB0eXBlIC0gaW5jbHVkZXMgY2FsbCBzaWduYXR1cmUgZm9yIGRlY29yYXRvciBwYXR0ZXJuXG5leHBvcnQgdHlwZSBEZWNvcmF0ZWRDbGFzczxUIGV4dGVuZHMgQ29uc3RydWN0b3I8b2JqZWN0Pj4gPVxuXHRUICZcblx0KDxVIGV4dGVuZHMgQ29uc3RydWN0b3I8b2JqZWN0Pj4odGFyZ2V0OiBVKSA9PiBEZWNvcmF0ZWRDbGFzczxVPikgJiB7XG5cdFx0ZGVmaW5lOiBUeXBlQWJzb3JiZXI7XG5cdFx0cmVnaXN0ZXJIb29rKGhvb2tUeXBlOiBob29rc1R5cGVzLCBjYjogaG9vayk6IHZvaWQ7XG5cdFx0bG9va3VwOiBUeXBlTG9va3VwO1xuXHRcdFR5cGVOYW1lOiBzdHJpbmc7XG5cdH07XG5cbi8vIEhlbHBlcjogbWVyZ2UgcGFyZW50IGVudGl0eSAoRSkgYW5kIGNoaWxkIGNvbnN0cnVjdG9yIGluc3RhbmNlIChUKSBpbnRvIGFcbi8vIHNpbmdsZSBmbGF0IG9iamVjdCB0eXBlLCBmaWx0ZXJpbmcgb3V0IE1uZW1vbmljYUluc3RhbmNlIG1ldGhvZCBuYW1lcy5cbi8vIFVzZWQgYnkgYXBwbHkvY2FsbC9iaW5kLlxuZXhwb3J0IHR5cGUgTWVyZ2U8RSBleHRlbmRzIG9iamVjdCwgVCBleHRlbmRzIG9iamVjdD4gPSB7XG5cdFtLIGluIGtleW9mIFQgfCBrZXlvZiBFIGFzIEsgZXh0ZW5kcyBNbmVtb25pY2FJbnN0YW5jZU1ldGhvZEtleXMgPyBuZXZlciA6IEtdOlxuXHRcdEsgZXh0ZW5kcyBrZXlvZiBUID8gVFtLXSA6IEVbSyAmIGtleW9mIEVdO1xufTtcblxuLy8gQXBwbHkvQ2FsbC9CaW5kIGZ1bmN0aW9uIHR5cGVzXG4vLyBUaGUgcmV0dXJuIHR5cGUgbWVyZ2VzIHRoZSBwYXJlbnQgZW50aXR5IGZpZWxkcyB3aXRoIHRoZSBjaGlsZCBjb25zdHJ1Y3RvclxuLy8gZmllbGRzIChmaWx0ZXJpbmcgb3V0IE1uZW1vbmljYUluc3RhbmNlIG1ldGhvZCBuYW1lcyksIHByb2R1Y2luZyB0aGUgc2FtZVxuLy8gYHsgZmllbGRzIH1gIGhvdmVyIHN0eWxlIGFzIGBuZXcgVHlwZSgpYC5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwbHlGdW5jdGlvbiBleHRlbmRzIENhbGxhYmxlRnVuY3Rpb24ge1xuXHQ8RSBleHRlbmRzIG9iamVjdCwgVCBleHRlbmRzIG9iamVjdD4oXG5cdFx0ZW50aXR5OiBFLFxuXHRcdENvbnN0cnVjdG9yOiBJREVGPFQ+LFxuXHRcdGFyZ3M/OiB1bmtub3duW11cblx0KTogSW5zdGFuY2VSZXN1bHQ8TWVyZ2U8RSwgVD4+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhbGxGdW5jdGlvbiBleHRlbmRzIENhbGxhYmxlRnVuY3Rpb24ge1xuXHQ8RSBleHRlbmRzIG9iamVjdCwgVCBleHRlbmRzIG9iamVjdD4oXG5cdFx0ZW50aXR5OiBFLFxuXHRcdENvbnN0cnVjdG9yOiBJREVGPFQ+LFxuXHRcdC4uLmFyZ3M6IHVua25vd25bXVxuXHQpOiBJbnN0YW5jZVJlc3VsdDxNZXJnZTxFLCBUPj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmluZEZ1bmN0aW9uIGV4dGVuZHMgQ2FsbGFibGVGdW5jdGlvbiB7XG5cdDxFIGV4dGVuZHMgb2JqZWN0LCBUIGV4dGVuZHMgb2JqZWN0Pihcblx0XHRlbnRpdHk6IEUsXG5cdFx0Q29uc3RydWN0b3I6IElERUY8VD5cblx0KTogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gSW5zdGFuY2VSZXN1bHQ8TWVyZ2U8RSwgVD4+O1xufVxuXG4vLyBVdGlscyBvYmplY3QgdHlwZVxuZXhwb3J0IGludGVyZmFjZSBVdGlsc0NvbGxlY3Rpb24ge1xuXHRleHRyYWN0PFQgZXh0ZW5kcyBvYmplY3Q+KGluc3RhbmNlOiBUKTogRXh0cmFjdGVkPFQ+O1xuXHRwaWNrPFQgZXh0ZW5kcyBvYmplY3QsIEsgZXh0ZW5kcyBrZXlvZiBUPihpbnN0YW5jZTogVCwgLi4uYXJnczogKEsgfCBLW10pW10pOiB7IFtQIGluIEtdOiBUW1BdIH0gJiB7fTtcblx0cGljazxUIGV4dGVuZHMgb2JqZWN0PihpbnN0YW5jZTogVCwgLi4uYXJnczogKHN0cmluZyB8IHN0cmluZ1tdKVtdKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdGNsb25lPFQgZXh0ZW5kcyBvYmplY3Q+KGluc3RhbmNlOiBUKTogVDtcblx0Zm9yazxUIGV4dGVuZHMgb2JqZWN0PihpbnN0YW5jZTogVCk6ICh0aGlzOiBvYmplY3QsIC4uLmZvcmtBcmdzOiB1bmtub3duW10pID0+IFQ7XG5cdHNpYmxpbmcoaW5zdGFuY2U6IG9iamVjdCk6IFNpYmxpbmdBY2Nlc3Nvcjtcblx0Y29sbGVjdENvbnN0cnVjdG9yczogKGluc3RhbmNlOiBvYmplY3QsIGZsYXQ/OiBib29sZWFuKSA9PiAoQ2FsbGFibGVGdW5jdGlvbiB8IHN0cmluZylbXTtcblx0bWVyZ2U8QSBleHRlbmRzIG9iamVjdCwgQiBleHRlbmRzIG9iamVjdD4oXG5cdFx0YTogQSxcblx0XHRiOiBCLFxuXHRcdC4uLmFyZ3M6IHVua25vd25bXVxuXHQpOiBJbnN0YW5jZVJlc3VsdDxNZXJnZTxCLCBBPj47XG5cdHBhcnNlPFQgZXh0ZW5kcyBvYmplY3Q+KHNlbGY6IFQpOiBQYXJzZWQ8VD47XG5cdHBhcmVudDxUIGV4dGVuZHMgb2JqZWN0PihpbnN0YW5jZTogVCk6IG9iamVjdCB8IHVuZGVmaW5lZDtcblx0cGFyZW50PFQgZXh0ZW5kcyBvYmplY3QsIEsgZXh0ZW5kcyBQYXJlbnRQYXRoT2ZJbnN0YW5jZTxUPiAmIHN0cmluZz4oXG5cdFx0aW5zdGFuY2U6IFQsXG5cdFx0cGF0aDogS1xuXHQpOiBJbnN0YW5jZU9mVHlwZVJlZ2lzdHJ5PEs+IHwgdW5kZWZpbmVkO1xuXHRwYXJlbnQ8VCBleHRlbmRzIG9iamVjdD4oaW5zdGFuY2U6IFQsIHBhdGg6IHN0cmluZyk6IG9iamVjdCB8IHVuZGVmaW5lZDtcblx0dG9KU09OPFQgZXh0ZW5kcyBvYmplY3Q+KGluc3RhbmNlOiBUKTogc3RyaW5nO1xuXHRba2V5OiBzdHJpbmddOiBDYWxsYWJsZUZ1bmN0aW9uO1xufVxuXG4vLyBNYWluIG1uZW1vbmljYSBtb2R1bGUgaW50ZXJmYWNlIC0gcmVwcmVzZW50cyB0aGUgZXhwb3J0ZWQgbW9kdWxlIG9iamVjdFxuZXhwb3J0IGludGVyZmFjZSBNbmVtb25pY2FNb2R1bGUge1xuXHQvLyBDb3JlIGZ1bmN0aW9uc1xuXHRkZWZpbmU6IFR5cGVBYnNvcmJlcjtcblx0bG9va3VwOiB7XG5cdFx0KFR5cGVOZXN0ZWRQYXRoOiBzdHJpbmcpOiBUeXBlQ2xhc3MgfCB1bmRlZmluZWQ7XG5cdFx0PGNvbnN0IEsgZXh0ZW5kcyBrZXlvZiBUeXBlUmVnaXN0cnk+KFR5cGVOZXN0ZWRQYXRoOiBLKTogVHlwZVJlZ2lzdHJ5W0tdO1xuXHR9O1xuXHRhcHBseTogQXBwbHlGdW5jdGlvbjtcblx0Y2FsbDogQ2FsbEZ1bmN0aW9uO1xuXHRiaW5kOiBCaW5kRnVuY3Rpb247XG5cdGRlY29yYXRlOiA8VCBleHRlbmRzIENvbnN0cnVjdG9yPG9iamVjdD4gfCBjb25zdHJ1Y3Rvck9wdGlvbnMgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ+KFxuXHRcdHRhcmdldD86IFQsXG5cdFx0Y29uZmlnPzogY29uc3RydWN0b3JPcHRpb25zXG5cdCkgPT4gPFUgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxvYmplY3Q+Pihjc3RyOiBVKSA9PiBEZWNvcmF0ZWRDbGFzczxVPjtcblx0cmVnaXN0ZXJIb29rOiA8VCBleHRlbmRzIG9iamVjdD4oQ29uc3RydWN0b3I6IElERUY8VD4sIGhvb2tUeXBlOiBob29rc1R5cGVzLCBjYjogaG9vaykgPT4gdm9pZDtcblxuXHQvLyBEZXNjcmlwdG9yc1xuXHRkZWZhdWx0VHlwZXM6IFR5cGVzQ29sbGVjdGlvbjtcblxuXHQvLyBFcnJvcnNcblx0QkFTRV9NTkVNT05JQ0FfRVJST1I6IE1uZW1vbmljYUVycm9yQ29uc3RydWN0b3I7XG5cdFdST05HX1RZUEVfREVGSU5JVElPTjogTW5lbW9uaWNhRXJyb3JDb25zdHJ1Y3Rvcjtcblx0V1JPTkdfSU5TVEFOQ0VfSU5WT0NBVElPTjogTW5lbW9uaWNhRXJyb3JDb25zdHJ1Y3Rvcjtcblx0V1JPTkdfTU9ESUZJQ0FUSU9OX1BBVFRFUk46IE1uZW1vbmljYUVycm9yQ29uc3RydWN0b3I7XG5cdEFMUkVBRFlfREVDTEFSRUQ6IE1uZW1vbmljYUVycm9yQ29uc3RydWN0b3I7XG5cdFdST05HX0FSR1VNRU5UU19VU0VEOiBNbmVtb25pY2FFcnJvckNvbnN0cnVjdG9yO1xuXHRXUk9OR19IT09LX1RZUEU6IE1uZW1vbmljYUVycm9yQ29uc3RydWN0b3I7XG5cdE1JU1NJTkdfQ0FMTEJBQ0tfQVJHVU1FTlQ6IE1uZW1vbmljYUVycm9yQ29uc3RydWN0b3I7XG5cdC8vIEZMT1dfQ0hFQ0tFUl9SRURFRklOSVRJT046IE1uZW1vbmljYUVycm9yQ29uc3RydWN0b3I7XG5cdE1JU1NJTkdfSE9PS19DQUxMQkFDSzogTW5lbW9uaWNhRXJyb3JDb25zdHJ1Y3Rvcjtcblx0VFlQRU5BTUVfTVVTVF9CRV9BX1NUUklORzogTW5lbW9uaWNhRXJyb3JDb25zdHJ1Y3Rvcjtcblx0SEFORExFUl9NVVNUX0JFX0FfRlVOQ1RJT046IE1uZW1vbmljYUVycm9yQ29uc3RydWN0b3I7XG5cdE9QVElPTlNfRVJST1I6IE1uZW1vbmljYUVycm9yQ29uc3RydWN0b3I7XG5cdFdST05HX1NUQUNLX0NMRUFORVI6IE1uZW1vbmljYUVycm9yQ29uc3RydWN0b3I7XG5cblx0Ly8gQ29uc3RhbnRzXG5cdE1ORU1PTklDQTogc3RyaW5nO1xuXHRNTkVNT1NZTkU6IHN0cmluZztcblx0U3ltYm9sUGFyZW50VHlwZTogc3ltYm9sO1xuXHRTeW1ib2xDb25zdHJ1Y3Rvck5hbWU6IHN5bWJvbDtcblx0U3ltYm9sRGVmYXVsdFR5cGVzQ29sbGVjdGlvbjogc3ltYm9sO1xuXHRTeW1ib2xDb25maWc6IHN5bWJvbDtcblx0VFlQRV9USVRMRV9QUkVGSVg6IHN0cmluZztcblx0RXJyb3JNZXNzYWdlczogRXJyb3JNZXNzYWdlcztcblxuXHQvLyBVdGlsc1xuXHR1dGlsczogVXRpbHNDb2xsZWN0aW9uO1xuXHRnZXRQcm9wczogKGluc3RhbmNlOiBvYmplY3QpID0+IFByb3BzVHlwZSB8IHVuZGVmaW5lZDtcblx0c2V0UHJvcHM6IChpbnN0YW5jZTogb2JqZWN0LCB2YWx1ZXM6IG9iamVjdCkgPT4gc3RyaW5nW10gfCBmYWxzZTtcblx0ZmluZFN1YlR5cGVGcm9tUGFyZW50OiAoaW5zdGFuY2U6IG9iamVjdCB8IHVuZGVmaW5lZCwgc3ViVHlwZTogc3RyaW5nKSA9PiBvYmplY3QgfCBudWxsO1xuXHRpc0NsYXNzOiAoZm46IENhbGxhYmxlRnVuY3Rpb24pID0+IGJvb2xlYW47XG5cblx0Ly8gY3JlYXRlVHlwZXNDb2xsZWN0aW9uXG5cdGNyZWF0ZVR5cGVzQ29sbGVjdGlvbjogQ3JlYXRlVHlwZXNDb2xsZWN0aW9uRnVuY3Rpb247XG5cblx0Ly8gQWxsb3cgYWRkaXRpb25hbCBwcm9wZXJ0aWVzXG5cdFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG4iXX0=
|
package/build/utils/parent.d.ts
CHANGED
|
@@ -1 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
import type { InstanceOfTypeRegistry, ParentPathOfInstance } from '../types';
|
|
2
|
+
export declare function parent<T extends object>(instance: T): object | undefined;
|
|
3
|
+
export declare function parent<T extends object, K extends ParentPathOfInstance<T> & string>(instance: T, path: K): InstanceOfTypeRegistry<K> | undefined;
|
|
4
|
+
export declare function parent(instance: object, path: string): object | undefined;
|
package/build/utils/parent.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.parent =
|
|
3
|
+
exports.parent = parent;
|
|
4
4
|
const errors_1 = require("../descriptors/errors");
|
|
5
5
|
const { WRONG_INSTANCE_INVOCATION } = errors_1.ErrorsTypes;
|
|
6
6
|
const Props_1 = require("../api/types/Props");
|
|
7
|
-
|
|
7
|
+
function parent(instance, path) {
|
|
8
8
|
if (instance !== Object(instance)) {
|
|
9
9
|
throw new WRONG_INSTANCE_INVOCATION;
|
|
10
10
|
}
|
|
@@ -18,8 +18,7 @@ const parent = (instance, path) => {
|
|
|
18
18
|
}
|
|
19
19
|
const { constructor: { name } } = p;
|
|
20
20
|
const result = name === path ?
|
|
21
|
-
p :
|
|
21
|
+
p : parent(p, path);
|
|
22
22
|
return result;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3BhcmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7OztBQUViLGtEQUFvRDtBQUNwRCxNQUFNLEVBQUUseUJBQXlCLEVBQUUsR0FBRyxvQkFBVyxDQUFDO0FBRWxELDhDQUU0QjtBQUtyQixNQUFNLE1BQU0sR0FBRyxDQUFvQixRQUFXLEVBQUUsSUFBYSxFQUF1QixFQUFFO0lBRzVGLElBQUssUUFBUSxLQUFLLE1BQU0sQ0FBRSxRQUFRLENBQUUsRUFBRyxDQUFDO1FBQ3ZDLE1BQU0sSUFBSSx5QkFBeUIsQ0FBQztJQUNyQyxDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQUcsSUFBQSxpQkFBUyxFQUFDLFFBQVEsQ0FBVSxDQUFDO0lBRTNDLElBQUssQ0FBQyxLQUFLLEVBQUcsQ0FBQztRQUNkLE9BQU87SUFDUixDQUFDO0lBRUQsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUM7SUFFaEMsSUFBSyxDQUFDLElBQUksRUFBRyxDQUFDO1FBQ2IsT0FBTyxDQUFDLENBQUM7SUFDVixDQUFDO0lBRUQsTUFBTSxFQUFFLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBSXBDLE1BQU0sTUFBTSxHQUFHLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUEsY0FBTSxFQUFFLENBQVcsRUFBRSxJQUFJLENBQUUsQ0FBQztJQUNqQyxPQUFPLE1BQU0sQ0FBQztBQUVmLENBQUMsQ0FBQztBQTNCVyxRQUFBLE1BQU0sVUEyQmpCIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgeyBFcnJvcnNUeXBlcyB9IGZyb20gJy4uL2Rlc2NyaXB0b3JzL2Vycm9ycyc7XG5jb25zdCB7IFdST05HX0lOU1RBTkNFX0lOVk9DQVRJT04gfSA9IEVycm9yc1R5cGVzO1xuXG5pbXBvcnQge1xuXHRfZ2V0UHJvcHMsIFByb3BzIFxufSBmcm9tICcuLi9hcGkvdHlwZXMvUHJvcHMnO1xuXG4vLyBzZWVrIGZvciBmaXJ0cyBwYXJlbnQgaW5zdGFuY2Vcbi8vIG9mIGluc3RhbmNlIHByb3RvdHlwZSBjaGFpblxuLy8gd2l0aCBjb25zdHJ1Y3RvcnMgb2YgcGF0aFxuZXhwb3J0IGNvbnN0IHBhcmVudCA9IDxUIGV4dGVuZHMgb2JqZWN0PiggaW5zdGFuY2U6IFQsIHBhdGg/OiBzdHJpbmcgKTogb2JqZWN0IHwgdW5kZWZpbmVkID0+IHtcblxuXHQvLyBhdCB0aGlzIHNpdHVhdGlvbiB0aGlzIGNoZWNrIGlzIGVub3VnaFxuXHRpZiAoIGluc3RhbmNlICE9PSBPYmplY3QoIGluc3RhbmNlICkgKSB7XG5cdFx0dGhyb3cgbmV3IFdST05HX0lOU1RBTkNFX0lOVk9DQVRJT047XG5cdH1cblxuXHRjb25zdCBwcm9wcyA9IF9nZXRQcm9wcyhpbnN0YW5jZSkgYXMgUHJvcHM7XG5cblx0aWYgKCAhcHJvcHMgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgeyBfX3BhcmVudF9fOiBwIH0gPSBwcm9wcztcblxuXHRpZiAoICFwYXRoICkge1xuXHRcdHJldHVybiBwO1xuXHR9XG5cblx0Y29uc3QgeyBjb25zdHJ1Y3RvcjogeyBuYW1lIH0gfSA9IHA7XG5cblx0Ly8gc2VlayB0aHJvdWggcGFyZW50IGluc3RhbmNlc1xuXHQvLyBhYm91dCB0aGUgZmlzdCBjb25zdHJ1Y3RvciB3aXRoIHRoaXMgbmFtZVxuXHRjb25zdCByZXN1bHQgPSBuYW1lID09PSBwYXRoID9cblx0XHRwIDogcGFyZW50KCBwIGFzIG9iamVjdCwgcGF0aCApO1xuXHRyZXR1cm4gcmVzdWx0O1xuXG59O1xuIl19
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3BhcmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7O0FBdUJiLHdCQTJCQztBQTNDRCxrREFBb0Q7QUFDcEQsTUFBTSxFQUFFLHlCQUF5QixFQUFFLEdBQUcsb0JBQVcsQ0FBQztBQUVsRCw4Q0FFNEI7QUFXNUIsU0FBZ0IsTUFBTSxDQUFxQixRQUFXLEVBQUUsSUFBYTtJQUdwRSxJQUFLLFFBQVEsS0FBSyxNQUFNLENBQUUsUUFBUSxDQUFFLEVBQUcsQ0FBQztRQUN2QyxNQUFNLElBQUkseUJBQXlCLENBQUM7SUFDckMsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLElBQUEsaUJBQVMsRUFBQyxRQUFRLENBQVUsQ0FBQztJQUUzQyxJQUFLLENBQUMsS0FBSyxFQUFHLENBQUM7UUFDZCxPQUFPO0lBQ1IsQ0FBQztJQUVELE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDO0lBRWhDLElBQUssQ0FBQyxJQUFJLEVBQUcsQ0FBQztRQUNiLE9BQU8sQ0FBQyxDQUFDO0lBQ1YsQ0FBQztJQUVELE1BQU0sRUFBRSxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUlwQyxNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUUsQ0FBVyxFQUFFLElBQUksQ0FBRSxDQUFDO0lBQ2pDLE9BQU8sTUFBTSxDQUFDO0FBRWYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHR5cGUge1xuXHRJbnN0YW5jZU9mVHlwZVJlZ2lzdHJ5LFxuXHRQYXJlbnRQYXRoT2ZJbnN0YW5jZVxufSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7IEVycm9yc1R5cGVzIH0gZnJvbSAnLi4vZGVzY3JpcHRvcnMvZXJyb3JzJztcbmNvbnN0IHsgV1JPTkdfSU5TVEFOQ0VfSU5WT0NBVElPTiB9ID0gRXJyb3JzVHlwZXM7XG5cbmltcG9ydCB7XG5cdF9nZXRQcm9wcywgUHJvcHMgXG59IGZyb20gJy4uL2FwaS90eXBlcy9Qcm9wcyc7XG5cbi8vIHNlZWsgZm9yIGZpcnRzIHBhcmVudCBpbnN0YW5jZVxuLy8gb2YgaW5zdGFuY2UgcHJvdG90eXBlIGNoYWluXG4vLyB3aXRoIGNvbnN0cnVjdG9ycyBvZiBwYXRoXG5leHBvcnQgZnVuY3Rpb24gcGFyZW50IDxUIGV4dGVuZHMgb2JqZWN0PiAoaW5zdGFuY2U6IFQpOiBvYmplY3QgfCB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gcGFyZW50IDxUIGV4dGVuZHMgb2JqZWN0LCBLIGV4dGVuZHMgUGFyZW50UGF0aE9mSW5zdGFuY2U8VD4gJiBzdHJpbmc+IChcblx0aW5zdGFuY2U6IFQsXG5cdHBhdGg6IEtcbik6IEluc3RhbmNlT2ZUeXBlUmVnaXN0cnk8Sz4gfCB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gcGFyZW50IChpbnN0YW5jZTogb2JqZWN0LCBwYXRoOiBzdHJpbmcpOiBvYmplY3QgfCB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gcGFyZW50IDxUIGV4dGVuZHMgb2JqZWN0PiAoaW5zdGFuY2U6IFQsIHBhdGg/OiBzdHJpbmcpOiBvYmplY3QgfCB1bmRlZmluZWQge1xuXG5cdC8vIGF0IHRoaXMgc2l0dWF0aW9uIHRoaXMgY2hlY2sgaXMgZW5vdWdoXG5cdGlmICggaW5zdGFuY2UgIT09IE9iamVjdCggaW5zdGFuY2UgKSApIHtcblx0XHR0aHJvdyBuZXcgV1JPTkdfSU5TVEFOQ0VfSU5WT0NBVElPTjtcblx0fVxuXG5cdGNvbnN0IHByb3BzID0gX2dldFByb3BzKGluc3RhbmNlKSBhcyBQcm9wcztcblxuXHRpZiAoICFwcm9wcyApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCB7IF9fcGFyZW50X186IHAgfSA9IHByb3BzO1xuXG5cdGlmICggIXBhdGggKSB7XG5cdFx0cmV0dXJuIHA7XG5cdH1cblxuXHRjb25zdCB7IGNvbnN0cnVjdG9yOiB7IG5hbWUgfSB9ID0gcDtcblxuXHQvLyBzZWVrIHRocm91aCBwYXJlbnQgaW5zdGFuY2VzXG5cdC8vIGFib3V0IHRoZSBmaXN0IGNvbnN0cnVjdG9yIHdpdGggdGhpcyBuYW1lXG5cdGNvbnN0IHJlc3VsdCA9IG5hbWUgPT09IHBhdGggP1xuXHRcdHAgOiBwYXJlbnQoIHAgYXMgb2JqZWN0LCBwYXRoICk7XG5cdHJldHVybiByZXN1bHQ7XG5cbn1cbiJdfQ==
|
package/docs/UTILS.md
CHANGED
|
@@ -176,7 +176,7 @@ const parent: object | undefined = parsed.parent;
|
|
|
176
176
|
|
|
177
177
|
- `utils.parent(instance, 'TypeName')` cannot return a specific nominal parent
|
|
178
178
|
type without a user-augmented `TypeRegistry`. This is the same limitation as
|
|
179
|
-
`
|
|
179
|
+
`lookup()`: TypeScript cannot retroactively learn the type graph created
|
|
180
180
|
by `define()` calls. See [`./typed-lookup.md`](./typed-lookup.md).
|
|
181
181
|
- `utils.parse()` returns `parent` as `object | undefined` because deep recursive
|
|
182
182
|
parsing is not implemented at runtime.
|
|
@@ -57,22 +57,22 @@ The user says: "Why are you still casting?"
|
|
|
57
57
|
|
|
58
58
|
The agent's internal model: "Direct import gives me the constructor. The generated type gives me the shape. I need both, so I bridge them with a cast."
|
|
59
59
|
|
|
60
|
-
This is wrong. The agent is thinking in two separate worlds — runtime and compile-time — instead of seeing that `
|
|
60
|
+
This is wrong. The agent is thinking in two separate worlds — runtime and compile-time — instead of seeing that `lookup` unifies them.
|
|
61
61
|
|
|
62
62
|
---
|
|
63
63
|
|
|
64
64
|
## Phase 3: The Correction (Session 6)
|
|
65
65
|
|
|
66
|
-
The user insists: "Use `
|
|
66
|
+
The user insists: "Use `lookup`."
|
|
67
67
|
|
|
68
|
-
The agent resists. "But I need the constructor for decoration too. `
|
|
68
|
+
The agent resists. "But I need the constructor for decoration too. `lookup` is just for lookup, right?"
|
|
69
69
|
|
|
70
70
|
The user: "Try it. Move it to module level."
|
|
71
71
|
|
|
72
72
|
The agent tries:
|
|
73
73
|
|
|
74
74
|
```typescript
|
|
75
|
-
const RequestData =
|
|
75
|
+
const RequestData = lookup('RequestData');
|
|
76
76
|
app.decorate('RequestData', RequestData);
|
|
77
77
|
const requestData = new RequestData({ ... });
|
|
78
78
|
const routeData = new requestData.RouteData({ ... });
|
|
@@ -82,7 +82,7 @@ It compiles. No cast. TypeScript knows `.RouteData`. TypeScript knows the proper
|
|
|
82
82
|
|
|
83
83
|
The agent checks: `RequestData === import('./collections/requestTypes.js').RequestData`? Yes. Same object.
|
|
84
84
|
|
|
85
|
-
The epiphany: **The runtime object is identical. The only difference is TypeScript's knowledge.** `
|
|
85
|
+
The epiphany: **The runtime object is identical. The only difference is TypeScript's knowledge.** `lookup` doesn't change the runtime. It changes the compile-time view.
|
|
86
86
|
|
|
87
87
|
---
|
|
88
88
|
|
|
@@ -92,7 +92,7 @@ The agent documents everything:
|
|
|
92
92
|
- `core/.ai/TACTICA-DEEP-DIVE.md` — comprehensive technical guide
|
|
93
93
|
- `core/.ai/TACTICA-RULES.md` — agent instructions
|
|
94
94
|
- `core/docs/tactica-pattern.md` — human-friendly explanation
|
|
95
|
-
- `tactica/docs/
|
|
95
|
+
- `tactica/docs/lookup-pattern.md` — consumption guide
|
|
96
96
|
|
|
97
97
|
The agent realizes: the pattern is simple, but the path to understanding it is not. The difficulty was not in the code. It was in unlearning the habit of casting.
|
|
98
98
|
|
|
@@ -131,11 +131,11 @@ If you are reading this, you are likely at Phase 0, 1, or 2.
|
|
|
131
131
|
1. Read `core/.ai/TACTICA-RULES.md` (agent instructions)
|
|
132
132
|
2. Read `core/docs/tactica-pattern.md` (human explanation)
|
|
133
133
|
3. Check if `.tactica/` exists. If not, run `npx tactica`.
|
|
134
|
-
4. Replace all direct imports + casts with `
|
|
134
|
+
4. Replace all direct imports + casts with `lookup`.
|
|
135
135
|
5. Run `tsc --noEmit`. Fix errors. Do not cast.
|
|
136
136
|
6. Run tests. Verify.
|
|
137
137
|
|
|
138
|
-
If you find yourself writing `as unknown as`, you have taken a wrong turn. Stop. Use `
|
|
138
|
+
If you find yourself writing `as unknown as`, you have taken a wrong turn. Stop. Use `lookup`. Trust the registry.
|
|
139
139
|
|
|
140
140
|
---
|
|
141
141
|
|
|
@@ -175,6 +175,24 @@ console.log(child instanceof AsyncChild); // true
|
|
|
175
175
|
|
|
176
176
|
---
|
|
177
177
|
|
|
178
|
+
## Why Async Constructors Don't Double-Initialize: `_setSelf`
|
|
179
|
+
|
|
180
|
+
When a constructor returns a Promise, the initial result of `new Constructor()` is that Promise. mnemonica's async pipeline waits for it to resolve, then must run validation and lifecycle hooks. But it must not run them again if the resolved instance is ever re-examined.
|
|
181
|
+
|
|
182
|
+
`_setSelf(instance)` solves this by adding a `__self__` getter to the instance's internal props that returns the instance itself, and by storing the props under the instance in the internal `WeakMap`. `makeAwaiter` then checks:
|
|
183
|
+
|
|
184
|
+
```js
|
|
185
|
+
if (props.__self__ !== self.inheritedInstance) {
|
|
186
|
+
self.postProcessing(type);
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
If `__self__` is missing or does not match the resolved instance, post-processing has not run yet, so mnemonica runs it. If it matches, post-processing has already happened and is skipped.
|
|
191
|
+
|
|
192
|
+
This is how mnemonica handles a problem that has been open in TC39 for years: the constructor can return a Promise, and the library finalizes the instance only after the Promise resolves, using `__self__` as a completion marker.
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
178
196
|
## Async Chains with Single Await
|
|
179
197
|
|
|
180
198
|
mnemonica's most powerful async feature is chainable awaits:
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# The Prototype Chain
|
|
2
|
+
|
|
3
|
+
Every mnemonica instance is the tip of a private prototype chain. This document explains what that chain looks like, what the intermediate layers do, and why they are necessary.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## A normal class chain vs a mnemonica chain
|
|
8
|
+
|
|
9
|
+
In normal JavaScript classes:
|
|
10
|
+
|
|
11
|
+
```js
|
|
12
|
+
const alice = new Employee({ name: 'Alice' });
|
|
13
|
+
// alice → Employee.prototype → Object.prototype
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Every `Employee` instance shares the same `Employee.prototype`. If one request mutates that prototype, all instances are affected.
|
|
17
|
+
|
|
18
|
+
In mnemonica:
|
|
19
|
+
|
|
20
|
+
```js
|
|
21
|
+
const UserType = define('UserType', function (data) {
|
|
22
|
+
Object.assign(this, data);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
const user = new UserType({ name: 'Alice' });
|
|
26
|
+
const admin = new user.AdminType({ role: 'admin' });
|
|
27
|
+
const superadmin = new admin.SuperAdminType({ level: 9000 });
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Each instance has its own fresh prototype objects above it. The chain for `superadmin` is:
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
superadmin
|
|
34
|
+
└── SuperAdminType.prototype
|
|
35
|
+
└── SuperAdmin memory layer
|
|
36
|
+
└── admin
|
|
37
|
+
└── AdminType.prototype
|
|
38
|
+
└── Admin memory layer
|
|
39
|
+
└── user
|
|
40
|
+
└── UserType.prototype
|
|
41
|
+
└── User memory layer
|
|
42
|
+
└── root Mnemosyne proxy
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## What each layer does
|
|
48
|
+
|
|
49
|
+
### 1. The instance itself
|
|
50
|
+
|
|
51
|
+
This is the object returned by `new user.AdminType(...)`. It holds only the properties your constructor assigned:
|
|
52
|
+
|
|
53
|
+
```js
|
|
54
|
+
superadmin.level === 9000;
|
|
55
|
+
admin.role === 'admin';
|
|
56
|
+
user.name === 'Alice';
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### 2. The user prototype layer
|
|
60
|
+
|
|
61
|
+
This layer holds the methods and getters you put on the type when you defined it:
|
|
62
|
+
|
|
63
|
+
```js
|
|
64
|
+
const AdminType = UserType.define('AdminType', function (data) {
|
|
65
|
+
Object.assign(this, data);
|
|
66
|
+
}, {
|
|
67
|
+
proto: {
|
|
68
|
+
isAdmin() { return true; }
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
`admin.isAdmin()` resolves on this layer. This prototype is **fresh per instance**, so one `admin` cannot pollute the prototype of another.
|
|
74
|
+
|
|
75
|
+
### 3. The memory layer
|
|
76
|
+
|
|
77
|
+
This is the invisible layer that makes mnemonica work. It:
|
|
78
|
+
|
|
79
|
+
- stores the internal construction context (`__type__`, `__parent__`, `__args__`, `__timestamp__`, etc.) in a `WeakMap`, keyed by this layer;
|
|
80
|
+
- provides `constructor` so `admin.constructor.name === 'AdminType'`;
|
|
81
|
+
- links the instance to its parent instance, so `admin instanceof UserType` works.
|
|
82
|
+
|
|
83
|
+
Because the props live in a `WeakMap` attached to the memory layer, they do **not** show up in `Object.keys(instance)` or `JSON.stringify(instance)`.
|
|
84
|
+
|
|
85
|
+
For async constructors, the memory layer also receives a `__self__` marker after the Promise resolves. This lets mnemonica defer finalization until the async work is done without running validation and hooks twice.
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Why three layers per type?
|
|
90
|
+
|
|
91
|
+
Normal JavaScript collapses these into one shared `prototype`. mnemonica separates them for three reasons:
|
|
92
|
+
|
|
93
|
+
1. **Isolation.** Each construction gets fresh prototype objects, so mutations cannot leak between instances or between concurrent requests.
|
|
94
|
+
2. **Identity-as-path.** The parent instance is physically in the prototype chain. `admin instanceof UserType` is true because `admin`’s chain walks up to the exact `user` instance it came from, not to a shared class prototype.
|
|
95
|
+
3. **Clean enumeration.** Internal metadata is stored in a `WeakMap` keyed by the memory layer, not as own properties on the instance.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Subtype lookup
|
|
100
|
+
|
|
101
|
+
When you write `admin.SuperAdminType`, JavaScript walks the prototype chain until it reaches the **root Mnemosyne proxy**. That proxy looks up `SuperAdminType` in the type’s `__subtypes__` Map and returns a `SubTypeProxy`. When you call `new` on it, the proxy creates the new chain with `admin` as the parent.
|
|
102
|
+
|
|
103
|
+
Only the root has a Proxy. All intermediate memory layers are plain objects; the root Proxy handles lookups for the whole branch.
|
|
104
|
+
|
|
105
|
+
The Proxy is kept for an important reason: **subtypes can be defined after an instance already exists**, and the Proxy makes those new subtypes visible on existing instances by doing a live lookup in the type’s `__subtypes__` Map. If subtype constructors were attached to the memory layer at construction time, old instances would miss any subtypes added later.
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Your constructor’s `.prototype` is untouched
|
|
110
|
+
|
|
111
|
+
When you call `define('AdminType', AdminConstructor)`, mnemonica takes a snapshot of `AdminConstructor.prototype`. During each construction it copies that snapshot onto a fresh `AdminType.prototype`. The original `AdminConstructor.prototype` is restored afterward. This is why you can reuse the same constructor function for several type definitions without cross-contamination.
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## Classes and functions produce the same chain
|
|
116
|
+
|
|
117
|
+
Whether you define a type with a `function` or a `class`, the final chain has the same shape. For classes, mnemonica generates a wrapper class that extends your class so `super()` works; after construction it rewires the chain to the same three-layer form.
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Summary
|
|
122
|
+
|
|
123
|
+
- Each instance sits on a private, per-construction prototype stack.
|
|
124
|
+
- The visible layer is the user prototype (methods and getters).
|
|
125
|
+
- The invisible layer is the memory layer (internal props, parent link, constructor).
|
|
126
|
+
- The root has a Proxy that answers all subtype lookups for its branch.
|
|
127
|
+
- This design makes `instanceof`, `parent`, and path-based identity correct while keeping instance enumeration clean.
|
package/docs/purpose.md
CHANGED
|
@@ -417,16 +417,16 @@ npx tactica # Analyze and generate types
|
|
|
417
417
|
|
|
418
418
|
**Generated Files**:
|
|
419
419
|
- `types.ts` - Complete TypeScript interfaces
|
|
420
|
-
- `registry.ts` - TypeRegistry augmentation for `
|
|
420
|
+
- `registry.ts` - TypeRegistry augmentation for `lookup()`
|
|
421
421
|
- `definitions.json` - Type metadata (properties, location)
|
|
422
422
|
- `usages.json` - Where types are instantiated
|
|
423
423
|
|
|
424
|
-
**The Magic**: Enables type-safe `
|
|
424
|
+
**The Magic**: Enables type-safe `lookup()`:
|
|
425
425
|
```typescript
|
|
426
|
-
import {
|
|
426
|
+
import { lookup } from 'mnemonica';
|
|
427
427
|
import './.tactica/registry'; // Augments TypeRegistry
|
|
428
428
|
|
|
429
|
-
const UserType =
|
|
429
|
+
const UserType = lookup('UserType'); // TypeScript knows the type!
|
|
430
430
|
const user = new UserType({ name: 'Alice' }); // Full intellisense!
|
|
431
431
|
```
|
|
432
432
|
|
package/docs/tactica-pattern.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# How `
|
|
1
|
+
# How `lookup` works (and where tactica fits)
|
|
2
2
|
|
|
3
|
-
> The runtime Trie that mnemonica builds is invisible to TypeScript by default. The fix is one TypeScript-level pattern: declaration-merge mnemonica's `TypeRegistry` interface so that `
|
|
3
|
+
> The runtime Trie that mnemonica builds is invisible to TypeScript by default. The fix is one TypeScript-level pattern: declaration-merge mnemonica's `TypeRegistry` interface so that `lookup(path)` resolves to a fully-typed constructor. The augmentation can be hand-written or generated by [`@mnemonica/tactica`](https://www.npmjs.com/package/@mnemonica/tactica). The runtime behaviour is identical either way.
|
|
4
4
|
>
|
|
5
5
|
> For a side-by-side recipe of both paths, see [`./typed-lookup.md`](./typed-lookup.md).
|
|
6
6
|
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
## The problem in one sentence
|
|
10
10
|
|
|
11
|
-
mnemonica builds a Trie of constructors at runtime. TypeScript has no idea the Trie exists. `
|
|
11
|
+
mnemonica builds a Trie of constructors at runtime. TypeScript has no idea the Trie exists. `lookup` + an augmented `TypeRegistry` tells TypeScript.
|
|
12
12
|
|
|
13
13
|
Without that bridge, every chain operation requires a cast.
|
|
14
14
|
|
|
@@ -39,9 +39,9 @@ This is not type safety. This is type suppression.
|
|
|
39
39
|
## What the bridge looks like
|
|
40
40
|
|
|
41
41
|
```typescript
|
|
42
|
-
import {
|
|
42
|
+
import { lookup } from 'mnemonica';
|
|
43
43
|
|
|
44
|
-
const RequestData =
|
|
44
|
+
const RequestData = lookup('RequestData');
|
|
45
45
|
|
|
46
46
|
const requestData = new RequestData({ method: 'GET', url: '/' });
|
|
47
47
|
const routeData = new requestData.RouteData({ pagePath: '/' });
|
|
@@ -111,13 +111,13 @@ See [`./typed-lookup.md`](./typed-lookup.md) for a side-by-side recipe with both
|
|
|
111
111
|
|
|
112
112
|
## The runtime is identical
|
|
113
113
|
|
|
114
|
-
`
|
|
114
|
+
`lookup('RequestData')` and `import { RequestData }` return the **same constructor object** at runtime. The only difference is what TypeScript sees at compile time:
|
|
115
115
|
|
|
116
116
|
| Approach | Runtime | Compile-time |
|
|
117
117
|
|---|---|---|
|
|
118
118
|
| Direct import without augmentation | ✅ Constructor works | ❌ TypeScript blind to sub-types |
|
|
119
|
-
| `
|
|
120
|
-
| `
|
|
119
|
+
| `lookup` with augmentation (manual) | ✅ Same constructor | ✅ TypeScript knows the Trie |
|
|
120
|
+
| `lookup` with augmentation (tactica) | ✅ Same constructor | ✅ TypeScript knows the Trie |
|
|
121
121
|
|
|
122
122
|
There is no runtime cost. There is no indirection. There is only **type safety, conditional on the augmentation being present**.
|
|
123
123
|
|
|
@@ -128,7 +128,7 @@ There is no runtime cost. There is no indirection. There is only **type safety,
|
|
|
128
128
|
The anti-patterns are the same whether you augment by hand or via tactica:
|
|
129
129
|
|
|
130
130
|
- Do not write `as unknown as` casts on mnemonica types.
|
|
131
|
-
- Do not import constructors directly from collection files when `
|
|
131
|
+
- Do not import constructors directly from collection files when `lookup` would work.
|
|
132
132
|
- Do not accept "it compiles with casts" as good enough.
|
|
133
133
|
|
|
134
134
|
What changes is how you keep the `TypeRegistry` augmentation in sync with your code:
|
|
@@ -142,6 +142,6 @@ Pick whichever fits your project. Both are first-class.
|
|
|
142
142
|
|
|
143
143
|
## Learn more
|
|
144
144
|
|
|
145
|
-
- [`./typed-lookup.md`](./typed-lookup.md) — `
|
|
145
|
+
- [`./typed-lookup.md`](./typed-lookup.md) — `lookup` with or without tactica (canonical side-by-side reference)
|
|
146
146
|
- [`../.ai/TACTICA-RULES.md`](../.ai/TACTICA-RULES.md) — anti-patterns and "when to insist on what"
|
|
147
147
|
- [`../.ai/TACTICA-DEEP-DIVE.md`](../.ai/TACTICA-DEEP-DIVE.md) — comprehensive technical guide, declaration-merging deep dive
|
package/docs/typed-lookup.md
CHANGED
|
@@ -1,21 +1,25 @@
|
|
|
1
|
-
# Typed lookup with `
|
|
1
|
+
# Typed lookup with `lookup()` — with or without tactica
|
|
2
2
|
|
|
3
|
-
`
|
|
3
|
+
`lookup()` is a runtime lookup with compile-time type safety. The type safety comes from one mechanism: declaration merging on the `TypeRegistry` interface that mnemonica exports. The path argument may use dots, slashes, colons, or bracket notation (e.g. `'UserType.AdminType'`, `'UserType/AdminType'`, `'UserType:AdminType'`, or `'UserType[AdminType]'`), and a single-segment name is resolved relative to the collection or type constructor the lookup is called on.
|
|
4
4
|
|
|
5
5
|
```typescript
|
|
6
6
|
// src/index.ts (mnemonica core)
|
|
7
7
|
export interface TypeRegistry {
|
|
8
|
-
|
|
8
|
+
// Intentionally empty. Augment this interface via declaration merging
|
|
9
|
+
// (hand-written or generated by @mnemonica/tactica).
|
|
9
10
|
}
|
|
10
11
|
|
|
11
|
-
export
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
export function lookup<const K extends keyof TypeRegistry>(
|
|
13
|
+
this: unknown,
|
|
14
|
+
TypeNestedPath: K
|
|
15
|
+
): TypeRegistry[K];
|
|
16
|
+
export function lookup(
|
|
17
|
+
this: unknown,
|
|
18
|
+
TypeNestedPath: string
|
|
19
|
+
): TypeClass | undefined;
|
|
16
20
|
```
|
|
17
21
|
|
|
18
|
-
|
|
22
|
+
Until you (or a tool) augment `TypeRegistry`, `lookup('Anything')` falls back to the broad `TypeClass | undefined` return type.
|
|
19
23
|
|
|
20
24
|
Two ways to do the augmentation: **by hand**, or via **[`@mnemonica/tactica`](https://www.npmjs.com/package/@mnemonica/tactica)**. Runtime behavior is identical. The trade-off is purely maintenance overhead.
|
|
21
25
|
|
|
@@ -44,7 +48,7 @@ Write a `.d.ts` file (or any `.ts` file outside the build output) with the augme
|
|
|
44
48
|
// types/mnemonica-registry.d.ts
|
|
45
49
|
import type { ProtoFlat } from 'mnemonica';
|
|
46
50
|
|
|
47
|
-
// Instance shapes — what `
|
|
51
|
+
// Instance shapes — what `lookup` returns will construct.
|
|
48
52
|
export type PersonInstance = {
|
|
49
53
|
name : string;
|
|
50
54
|
// Subtypes available on instances of this type:
|
|
@@ -75,10 +79,10 @@ Include the `.d.ts` in `tsconfig.json`:
|
|
|
75
79
|
Use it:
|
|
76
80
|
|
|
77
81
|
```typescript
|
|
78
|
-
import {
|
|
82
|
+
import { lookup } from 'mnemonica';
|
|
79
83
|
|
|
80
|
-
const Person =
|
|
81
|
-
const Employee =
|
|
84
|
+
const Person = lookup('Person'); // fully typed
|
|
85
|
+
const Employee = lookup('Person.Employee'); // fully typed
|
|
82
86
|
|
|
83
87
|
const alice = new Person({ name: 'Alice' });
|
|
84
88
|
const engineer = new alice.Employee({ role: 'Engineer' }); // alice.Employee is typed
|
|
@@ -122,7 +126,7 @@ You write nothing for the augmentation; tactica regenerates as your types evolve
|
|
|
122
126
|
**Hand-augmented** is fine for:
|
|
123
127
|
|
|
124
128
|
- Small projects (a handful of types)
|
|
125
|
-
- Bootstrap / learning — writing the augmentation by hand is the fastest way to understand what `
|
|
129
|
+
- Bootstrap / learning — writing the augmentation by hand is the fastest way to understand what `lookup()` actually does
|
|
126
130
|
- Projects that want to keep the `TypeRegistry` surface stable and curated, independent of source-code churn
|
|
127
131
|
- Environments where running a CLI/codegen utility is inconvenient
|
|
128
132
|
|
|
@@ -149,7 +153,7 @@ const child = new (instance as any).Child({ ... });
|
|
|
149
153
|
|
|
150
154
|
```typescript
|
|
151
155
|
// ✓ instead
|
|
152
|
-
const RequestData =
|
|
156
|
+
const RequestData = lookup('RequestData');
|
|
153
157
|
const requestData = new RequestData({ ... });
|
|
154
158
|
const child = new requestData.Child({ ... });
|
|
155
159
|
```
|
package/module/index.js
CHANGED
|
@@ -25,7 +25,6 @@ const m = mnemonicaModule;
|
|
|
25
25
|
// defaultTypes` picks the namespace object (which has `.define` pointing back).
|
|
26
26
|
export const define = m.define.bind(undefined);
|
|
27
27
|
export const lookup = m.lookup.bind(undefined);
|
|
28
|
-
export const lookupTyped = m.lookupTyped.bind(undefined);
|
|
29
28
|
export const apply = m.apply.bind(undefined);
|
|
30
29
|
export const call = m.call.bind(undefined);
|
|
31
30
|
export const bind = m.bind.bind(undefined);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mnemonica",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.8",
|
|
4
4
|
"description": "AI-agent ready instance inheritance system for JavaScript/TypeScript via prototype chains",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"main": "./build/index.js",
|
|
@@ -98,6 +98,7 @@
|
|
|
98
98
|
"devDependencies": {
|
|
99
99
|
"@eslint/eslintrc": "^3.3.5",
|
|
100
100
|
"@eslint/js": "^9.21.0",
|
|
101
|
+
"@mnemonica/tactica": "^0.1.2",
|
|
101
102
|
"@types/jest": "^29.5.14",
|
|
102
103
|
"@types/node": "^22.19.21",
|
|
103
104
|
"@typescript-eslint/eslint-plugin": "^8.61.1",
|
|
@@ -22,6 +22,19 @@ export default function () {
|
|
|
22
22
|
const existentInstance = this;
|
|
23
23
|
|
|
24
24
|
// inherited
|
|
25
|
+
// TODO: subtype constructors could be attached directly to this
|
|
26
|
+
// Mnemosyne object as non-enumerable getters, which would let us
|
|
27
|
+
// remove the root Mnemosyne Proxy entirely and rely on normal
|
|
28
|
+
// prototype-chain lookup for `instance.SubType`. Getters give lazy
|
|
29
|
+
// initialization, prevent accidental re-definition, and let each
|
|
30
|
+
// access rely on the current runtime state of the type graph
|
|
31
|
+
// (ModificatorType, ModificatorTypePrototype, and any factories that
|
|
32
|
+
// may produce new fields or constructors). That would simplify
|
|
33
|
+
// subtype access but would increase cyclomatic complexity here and
|
|
34
|
+
// would lose the ability to define new subtypes after the instance
|
|
35
|
+
// is created. Users who need dynamic post-creation definitions can
|
|
36
|
+
// use `.fork()` or `.clone()` to get fresh instances that carry the
|
|
37
|
+
// updated constructors on their chain.
|
|
25
38
|
const Mnemosyne = {};
|
|
26
39
|
Reflect.setPrototypeOf(
|
|
27
40
|
Mnemosyne,
|
|
@@ -257,7 +257,7 @@ interface TypesCollectionTarget {
|
|
|
257
257
|
const typesCollectionProxyHandler = {
|
|
258
258
|
get ( target: TypesCollectionTarget, prop: string ) {
|
|
259
259
|
if ( target.subtypes.has( prop ) ) {
|
|
260
|
-
// access to
|
|
260
|
+
// access to subtype
|
|
261
261
|
// for new call or defining new type
|
|
262
262
|
const subtypeResult = target.subtypes.get( prop );
|
|
263
263
|
return subtypeResult;
|