keflag commited on
Commit
9bf3f0d
·
verified ·
1 Parent(s): 4aa56f0

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +7 -6
Dockerfile CHANGED
@@ -1,13 +1,14 @@
1
  FROM n8nio/n8n:latest
 
2
  USER root
3
 
4
- # 输出 license.js 内容
5
- RUN echo "====== 1. license.js ======" && cat /usr/local/lib/node_modules/n8n/dist/license.js 2>/dev/null || true
6
 
7
- # 输出 frontend.service.js 内容
8
- RUN echo -e "\n====== 2. frontend.service.js ======" && cat /usr/local/lib/node_modules/n8n/dist/services/frontend.service.js 2>/dev/null || true
9
 
10
- # 输出 license-state.js 内容
11
- RUN echo -e "\n====== 3. license-state.js ======" && cat /usr/local/lib/node_modules/n8n/node_modules/.pnpm/@n8n+backend-common@file+packages+@n8n+backend-common/node_modules/@n8n/backend-common/dist/license-state.js 2>/dev/null || true
12
 
13
  USER node
 
1
  FROM n8nio/n8n:latest
2
+
3
  USER root
4
 
5
+ RUN printf '%s' "77u/InVzZSBzdHJpY3QiOwp2YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7CiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrOwogICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspOwogICAgaWYgKCFkZXNjIHx8ICgiZ2V0IiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7CiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07CiAgICB9CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpOwp9KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikgewogICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gazsKICAgIG9bazJdID0gbVtrXTsKfSkpOwp2YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCAiZGVmYXVsdCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7Cn0pIDogZnVuY3Rpb24obywgdikgewogICAgb1siZGVmYXVsdCJdID0gdjsKfSk7CnZhciBfX2RlY29yYXRlID0gKHRoaXMgJiYgdGhpcy5fX2RlY29yYXRlKSB8fCBmdW5jdGlvbiAoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHsKICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7CiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICJvYmplY3QiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSAiZnVuY3Rpb24iKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7CiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByOwogICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjsKfTsKdmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCAoZnVuY3Rpb24gKCkgewogICAgdmFyIG93bktleXMgPSBmdW5jdGlvbihvKSB7CiAgICAgICAgb3duS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIChvKSB7CiAgICAgICAgICAgIHZhciBhciA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBrIGluIG8pIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgaykpIGFyW2FyLmxlbmd0aF0gPSBrOwogICAgICAgICAgICByZXR1cm4gYXI7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gb3duS2V5cyhvKTsKICAgIH07CiAgICByZXR1cm4gZnVuY3Rpb24gKG1vZCkgewogICAgICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7CiAgICAgICAgdmFyIHJlc3VsdCA9IHt9OwogICAgICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayA9IG93bktleXMobW9kKSwgaSA9IDA7IGkgPCBrLmxlbmd0aDsgaSsrKSBpZiAoa1tpXSAhPT0gImRlZmF1bHQiKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGtbaV0pOwogICAgICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH07Cn0pKCk7CnZhciBfX21ldGFkYXRhID0gKHRoaXMgJiYgdGhpcy5fX21ldGFkYXRhKSB8fCBmdW5jdGlvbiAoaywgdikgewogICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAib2JqZWN0IiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gImZ1bmN0aW9uIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEoaywgdik7Cn07Ck9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CmV4cG9ydHMuTGljZW5zZSA9IHZvaWQgMDsKY29uc3QgYmFja2VuZF9jb21tb25fMSA9IHJlcXVpcmUoIkBuOG4vYmFja2VuZC1jb21tb24iKTsKY29uc3QgY29uZmlnXzEgPSByZXF1aXJlKCJAbjhuL2NvbmZpZyIpOwpjb25zdCBjb25zdGFudHNfMSA9IHJlcXVpcmUoIkBuOG4vY29uc3RhbnRzIik7CmNvbnN0IGRiXzEgPSByZXF1aXJlKCJAbjhuL2RiIik7CmNvbnN0IGRlY29yYXRvcnNfMSA9IHJlcXVpcmUoIkBuOG4vZGVjb3JhdG9ycyIpOwpjb25zdCBkaV8xID0gcmVxdWlyZSgiQG44bi9kaSIpOwpjb25zdCBsaWNlbnNlX3Nka18xID0gcmVxdWlyZSgiQG44bl9pby9saWNlbnNlLXNkayIpOwpjb25zdCBuOG5fY29yZV8xID0gcmVxdWlyZSgibjhuLWNvcmUiKTsKY29uc3QgbGljZW5zZV9tZXRyaWNzX3NlcnZpY2VfMSA9IHJlcXVpcmUoIi4vbWV0cmljcy9saWNlbnNlLW1ldHJpY3Muc2VydmljZSIpOwpjb25zdCBjb25zdGFudHNfMiA9IHJlcXVpcmUoIi4vY29uc3RhbnRzIik7CmNvbnN0IExJQ0VOU0VfUkVORVdBTF9ESVNBQkxFRF9XQVJOSU5HID0gJ0F1dG9tYXRpYyBsaWNlbnNlIHJlbmV3YWwgaXMgZGlzYWJsZWQuIFRoZSBsaWNlbnNlIHdpbGwgbm90IHJlbmV3IGF1dG9tYXRpY2FsbHksIGFuZCBhY2Nlc3MgdG8gbGljZW5zZWQgZmVhdHVyZXMgbWF5IGJlIGxvc3QhJzsKbGV0IExpY2Vuc2UgPSBjbGFzcyBMaWNlbnNlIHsKICAgIGNvbnN0cnVjdG9yKGxvZ2dlciwgaW5zdGFuY2VTZXR0aW5ncywgc2V0dGluZ3NSZXBvc2l0b3J5LCBsaWNlbnNlTWV0cmljc1NlcnZpY2UsIGdsb2JhbENvbmZpZykgewogICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyOwogICAgICAgIHRoaXMuaW5zdGFuY2VTZXR0aW5ncyA9IGluc3RhbmNlU2V0dGluZ3M7CiAgICAgICAgdGhpcy5zZXR0aW5nc1JlcG9zaXRvcnkgPSBzZXR0aW5nc1JlcG9zaXRvcnk7CiAgICAgICAgdGhpcy5saWNlbnNlTWV0cmljc1NlcnZpY2UgPSBsaWNlbnNlTWV0cmljc1NlcnZpY2U7CiAgICAgICAgdGhpcy5nbG9iYWxDb25maWcgPSBnbG9iYWxDb25maWc7CiAgICAgICAgdGhpcy5pc1NodXR0aW5nRG93biA9IGZhbHNlOwogICAgICAgIHRoaXMucmVmcmVzaENhbGxiYWNrcyA9IFtdOwogICAgICAgIHRoaXMubG9nZ2VyID0gdGhpcy5sb2dnZXIuc2NvcGVkKCdsaWNlbnNlJyk7CiAgICB9CiAgICBhc3luYyBpbml0KHsgZm9yY2VSZWNyZWF0ZSA9IGZhbHNlLCBpc0NsaSA9IGZhbHNlLCB9ID0ge30pIHsKICAgICAgICBpZiAodGhpcy5tYW5hZ2VyICYmICFmb3JjZVJlY3JlYXRlKSB7CiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ0xpY2Vuc2UgbWFuYWdlciBhbHJlYWR5IGluaXRpYWxpemVkIG9yIHNodXR0aW5nIGRvd24nKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5pc1NodXR0aW5nRG93bikgewogICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdMaWNlbnNlIG1hbmFnZXIgYWxyZWFkeSBzaHV0dGluZyBkb3duJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QgeyBpbnN0YW5jZVR5cGUgfSA9IHRoaXMuaW5zdGFuY2VTZXR0aW5nczsKICAgICAgICBjb25zdCBpc01haW5JbnN0YW5jZSA9IGluc3RhbmNlVHlwZSA9PT0gJ21haW4nOwogICAgICAgIGNvbnN0IHNlcnZlciA9IHRoaXMuZ2xvYmFsQ29uZmlnLmxpY2Vuc2Uuc2VydmVyVXJsOwogICAgICAgIGNvbnN0IG9mZmxpbmVNb2RlID0gIWlzTWFpbkluc3RhbmNlOwogICAgICAgIGNvbnN0IGF1dG9SZW5ld09mZnNldCA9IDcyICogY29uc3RhbnRzXzEuVGltZS5ob3Vycy50b1NlY29uZHM7CiAgICAgICAgY29uc3Qgc2F2ZUNlcnRTdHIgPSBpc01haW5JbnN0YW5jZQogICAgICAgICAgICA/IGFzeW5jICh2YWx1ZSkgPT4gYXdhaXQgdGhpcy5zYXZlQ2VydFN0cih2YWx1ZSkKICAgICAgICAgICAgOiBhc3luYyAoKSA9PiB7IH07CiAgICAgICAgY29uc3Qgb25GZWF0dXJlQ2hhbmdlID0gaXNNYWluSW5zdGFuY2UKICAgICAgICAgICAgPyBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLm9uRmVhdHVyZUNoYW5nZSgpCiAgICAgICAgICAgIDogYXN5bmMgKCkgPT4geyB9OwogICAgICAgIGNvbnN0IG9uTGljZW5zZVJlbmV3ZWQgPSBpc01haW5JbnN0YW5jZQogICAgICAgICAgICA/IGFzeW5jICgpID0+IGF3YWl0IHRoaXMub25MaWNlbnNlUmVuZXdlZCgpCiAgICAgICAgICAgIDogYXN5bmMgKCkgPT4geyB9OwogICAgICAgIGNvbnN0IGNvbGxlY3RVc2FnZU1ldHJpY3MgPSBpc01haW5JbnN0YW5jZQogICAgICAgICAgICA/IGFzeW5jICgpID0+IGF3YWl0IHRoaXMubGljZW5zZU1ldHJpY3NTZXJ2aWNlLmNvbGxlY3RVc2FnZU1ldHJpY3MoKQogICAgICAgICAgICA6IGFzeW5jICgpID0+IFtdOwogICAgICAgIGNvbnN0IGNvbGxlY3RQYXNzdGhyb3VnaERhdGEgPSBpc01haW5JbnN0YW5jZQogICAgICAgICAgICA/IGFzeW5jICgpID0+IGF3YWl0IHRoaXMubGljZW5zZU1ldHJpY3NTZXJ2aWNlLmNvbGxlY3RQYXNzdGhyb3VnaERhdGEoKQogICAgICAgICAgICA6IGFzeW5jICgpID0+ICh7fSk7CiAgICAgICAgY29uc3Qgb25FeHBpcnlTb29uID0gIXRoaXMuaW5zdGFuY2VTZXR0aW5ncy5pc0xlYWRlciA/ICgpID0+IHRoaXMub25FeHBpcnlTb29uKCkgOiB1bmRlZmluZWQ7CiAgICAgICAgY29uc3QgZXhwaXJ5U29vbk9mZnNldE1pbnMgPSAhdGhpcy5pbnN0YW5jZVNldHRpbmdzLmlzTGVhZGVyID8gMTIwIDogdW5kZWZpbmVkOwogICAgICAgIGNvbnN0IHsgaXNMZWFkZXIgfSA9IHRoaXMuaW5zdGFuY2VTZXR0aW5nczsKICAgICAgICBjb25zdCB7IGF1dG9SZW5ld2FsRW5hYmxlZCB9ID0gdGhpcy5nbG9iYWxDb25maWcubGljZW5zZTsKICAgICAgICBjb25zdCBlbGlnaWJsZVRvUmVuZXcgPSBpc0NsaSB8fCBpc0xlYWRlcjsKICAgICAgICBjb25zdCBzaG91bGRSZW5ldyA9IGVsaWdpYmxlVG9SZW5ldyAmJiBhdXRvUmVuZXdhbEVuYWJsZWQ7CiAgICAgICAgaWYgKGVsaWdpYmxlVG9SZW5ldyAmJiAhYXV0b1JlbmV3YWxFbmFibGVkKSB7CiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oTElDRU5TRV9SRU5FV0FMX0RJU0FCTEVEX1dBUk5JTkcpOwogICAgICAgIH0KICAgICAgICB0cnkgewogICAgICAgICAgICB0aGlzLm1hbmFnZXIgPSBuZXcgbGljZW5zZV9zZGtfMS5MaWNlbnNlTWFuYWdlcih7CiAgICAgICAgICAgICAgICBzZXJ2ZXIsCiAgICAgICAgICAgICAgICB0ZW5hbnRJZDogdGhpcy5nbG9iYWxDb25maWcubGljZW5zZS50ZW5hbnRJZCwKICAgICAgICAgICAgICAgIHByb2R1Y3RJZGVudGlmaWVyOiBgbjhuLSR7Y29uc3RhbnRzXzIuTjhOX1ZFUlNJT059YCwKICAgICAgICAgICAgICAgIGF1dG9SZW5ld0VuYWJsZWQ6IHNob3VsZFJlbmV3LAogICAgICAgICAgICAgICAgcmVuZXdPbkluaXQ6IHNob3VsZFJlbmV3LAogICAgICAgICAgICAgICAgYXV0b1JlbmV3T2Zmc2V0LAogICAgICAgICAgICAgICAgZGV0YWNoRmxvYXRpbmdPblNodXRkb3duOiB0aGlzLmdsb2JhbENvbmZpZy5saWNlbnNlLmRldGFjaEZsb2F0aW5nT25TaHV0ZG93biwKICAgICAgICAgICAgICAgIG9mZmxpbmVNb2RlLAogICAgICAgICAgICAgICAgbG9nZ2VyOiB0aGlzLmxvZ2dlciwKICAgICAgICAgICAgICAgIGxvYWRDZXJ0U3RyOiBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmxvYWRDZXJ0U3RyKCksCiAgICAgICAgICAgICAgICBzYXZlQ2VydFN0ciwKICAgICAgICAgICAgICAgIGRldmljZUZpbmdlcnByaW50OiAoKSA9PiB0aGlzLmluc3RhbmNlU2V0dGluZ3MuaW5zdGFuY2VJZCwKICAgICAgICAgICAgICAgIGNvbGxlY3RVc2FnZU1ldHJpY3MsCiAgICAgICAgICAgICAgICBjb2xsZWN0UGFzc3Rocm91Z2hEYXRhLAogICAgICAgICAgICAgICAgb25GZWF0dXJlQ2hhbmdlLAogICAgICAgICAgICAgICAgb25MaWNlbnNlUmVuZXdlZCwKICAgICAgICAgICAgICAgIG9uRXhwaXJ5U29vbiwKICAgICAgICAgICAgICAgIGV4cGlyeVNvb25PZmZzZXRNaW5zLAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgYXdhaXQgdGhpcy5tYW5hZ2VyLmluaXRpYWxpemUoKTsKICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0xpY2Vuc2UgaW5pdGlhbGl6ZWQnKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7CiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignQ291bGQgbm90IGluaXRpYWxpemUgbGljZW5zZSBtYW5hZ2VyIHNkaycsIHsgZXJyb3IgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBhc3luYyBsb2FkQ2VydFN0cigpIHsKICAgICAgICBjb25zdCBlcGhlbWVyYWxMaWNlbnNlID0gdGhpcy5nbG9iYWxDb25maWcubGljZW5zZS5jZXJ0OwogICAgICAgIGlmIChlcGhlbWVyYWxMaWNlbnNlKSB7CiAgICAgICAgICAgIHJldHVybiBlcGhlbWVyYWxMaWNlbnNlOwogICAgICAgIH0KICAgICAgICBjb25zdCBkYXRhYmFzZVNldHRpbmdzID0gYXdhaXQgdGhpcy5zZXR0aW5nc1JlcG9zaXRvcnkuZmluZE9uZSh7CiAgICAgICAgICAgIHdoZXJlOiB7CiAgICAgICAgICAgICAgICBrZXk6IGNvbnN0YW50c18yLlNFVFRJTkdTX0xJQ0VOU0VfQ0VSVF9LRVksCiAgICAgICAgICAgIH0sCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGRhdGFiYXNlU2V0dGluZ3M/LnZhbHVlID8/ICcnOwogICAgfQogICAgYXN5bmMgb25GZWF0dXJlQ2hhbmdlKCkgewogICAgICAgIHZvaWQgdGhpcy5icm9hZGNhc3RSZWxvYWRMaWNlbnNlQ29tbWFuZCgpOwogICAgICAgIGF3YWl0IHRoaXMubm90aWZ5UmVmcmVzaENhbGxiYWNrcygpOwogICAgfQogICAgYXN5bmMgb25MaWNlbnNlUmVuZXdlZCgpIHsKICAgICAgICB2b2lkIHRoaXMuYnJvYWRjYXN0UmVsb2FkTGljZW5zZUNvbW1hbmQoKTsKICAgICAgICBhd2FpdCB0aGlzLm5vdGlmeVJlZnJlc2hDYWxsYmFja3MoKTsKICAgIH0KICAgIGFzeW5jIGJyb2FkY2FzdFJlbG9hZExpY2Vuc2VDb21tYW5kKCkgewogICAgICAgIGlmICh0aGlzLmdsb2JhbENvbmZpZy5leGVjdXRpb25zLm1vZGUgPT09ICdxdWV1ZScgJiYgdGhpcy5pbnN0YW5jZVNldHRpbmdzLmlzTGVhZGVyKSB7CiAgICAgICAgICAgIGNvbnN0IHsgUHVibGlzaGVyIH0gPSBhd2FpdCBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IF9faW1wb3J0U3RhcihyZXF1aXJlKCcuL3NjYWxpbmcvcHVic3ViL3B1Ymxpc2hlci5zZXJ2aWNlJykpKTsKICAgICAgICAgICAgYXdhaXQgZGlfMS5Db250YWluZXIuZ2V0KFB1Ymxpc2hlcikucHVibGlzaENvbW1hbmQoeyBjb21tYW5kOiAncmVsb2FkLWxpY2Vuc2UnIH0pOwogICAgICAgIH0KICAgIH0KICAgIGFzeW5jIHNhdmVDZXJ0U3RyKHZhbHVlKSB7CiAgICAgICAgaWYgKHRoaXMuZ2xvYmFsQ29uZmlnLmxpY2Vuc2UuY2VydCkKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIGF3YWl0IHRoaXMuc2V0dGluZ3NSZXBvc2l0b3J5LnVwc2VydCh7CiAgICAgICAgICAgIGtleTogY29uc3RhbnRzXzIuU0VUVElOR1NfTElDRU5TRV9DRVJUX0tFWSwKICAgICAgICAgICAgdmFsdWUsCiAgICAgICAgICAgIGxvYWRPblN0YXJ0dXA6IGZhbHNlLAogICAgICAgIH0sIFsna2V5J10pOwogICAgfQogICAgb25DZXJ0UmVmcmVzaChyZWZyZXNoQ2FsbGJhY2spIHsKICAgICAgICB0aGlzLnJlZnJlc2hDYWxsYmFja3MucHVzaChyZWZyZXNoQ2FsbGJhY2spOwogICAgICAgIHJldHVybiAoKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yZWZyZXNoQ2FsbGJhY2tzLmluZGV4T2YocmVmcmVzaENhbGxiYWNrKTsKICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHsKICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaENhbGxiYWNrcy5zcGxpY2UoaW5kZXgsIDEpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KICAgIGFzeW5jIG5vdGlmeVJlZnJlc2hDYWxsYmFja3MoKSB7CiAgICAgICAgY29uc3QgY2VydCA9IGF3YWl0IHRoaXMubG9hZENlcnRTdHIoKTsKICAgICAgICBmb3IgKGNvbnN0IHJlZnJlc2hDYWxsYmFjayBvZiB0aGlzLnJlZnJlc2hDYWxsYmFja3MpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHJlZnJlc2hDYWxsYmFjayhjZXJ0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdFcnJvciBpbiBsaWNlbnNlIHJlZnJlc2ggY2FsbGJhY2snLCB7IGVycm9yIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgYXN5bmMgYWN0aXZhdGUoYWN0aXZhdGlvbktleSwgZXVsYVVyaSwgdXNlckVtYWlsKSB7CiAgICAgICAgaWYgKCF0aGlzLm1hbmFnZXIpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBhd2FpdCB0aGlzLm1hbmFnZXIuYWN0aXZhdGUoYWN0aXZhdGlvbktleSwgeyBldWxhVXJpLCBlbWFpbDogdXNlckVtYWlsIH0pOwogICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdMaWNlbnNlIGFjdGl2YXRlZCcpOwogICAgfQogICAgYXN5bmMgcmVsb2FkKCkgewogICAgICAgIGlmICghdGhpcy5tYW5hZ2VyKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgYXdhaXQgdGhpcy5tYW5hZ2VyLnJlbG9hZCgpOwogICAgICAgIGF3YWl0IHRoaXMubm90aWZ5UmVmcmVzaENhbGxiYWNrcygpOwogICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdMaWNlbnNlIHJlbG9hZGVkJyk7CiAgICB9CiAgICBhc3luYyByZW5ldygpIHsKICAgICAgICBpZiAoIXRoaXMubWFuYWdlcikgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGF3YWl0IHRoaXMubWFuYWdlci5yZW5ldygpOwogICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdMaWNlbnNlIHJlbmV3ZWQnKTsKICAgIH0KICAgIGFzeW5jIGNsZWFyKCkgewogICAgICAgIGlmICghdGhpcy5tYW5hZ2VyKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgYXdhaXQgdGhpcy5tYW5hZ2VyLmNsZWFyKCk7CiAgICAgICAgdGhpcy5sb2dnZXIuaW5mbygnTGljZW5zZSBjbGVhcmVkJyk7CiAgICB9CiAgICBhc3luYyBzaHV0ZG93bigpIHsKICAgICAgICB0aGlzLmlzU2h1dHRpbmdEb3duID0gdHJ1ZTsKICAgICAgICBpZiAoIXRoaXMubWFuYWdlcikgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGF3YWl0IHRoaXMubWFuYWdlci5zaHV0ZG93bigpOwogICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdMaWNlbnNlIHNodXQgZG93bicpOwogICAgfQogICAgaXNMaWNlbnNlZChmZWF0dXJlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlcj8uaGFzRmVhdHVyZUVuYWJsZWQoZmVhdHVyZSkgPz8gZmFsc2U7CiAgICB9CiAgICBpc0R5bmFtaWNDcmVkZW50aWFsc0VuYWJsZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNMaWNlbnNlZChjb25zdGFudHNfMS5MSUNFTlNFX0ZFQVRVUkVTLkRZTkFNSUNfQ1JFREVOVElBTFMpOwogICAgfQogICAgaXNTaGFyaW5nRW5hYmxlZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5pc0xpY2Vuc2VkKGNvbnN0YW50c18xLkxJQ0VOU0VfRkVBVFVSRVMuU0hBUklORyk7CiAgICB9CiAgICBpc0xvZ1N0cmVhbWluZ0VuYWJsZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNMaWNlbnNlZChjb25zdGFudHNfMS5MSUNFTlNFX0ZFQVRVUkVTLkxPR19TVFJFQU1JTkcpOwogICAgfQogICAgaXNMZGFwRW5hYmxlZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5pc0xpY2Vuc2VkKGNvbnN0YW50c18xLkxJQ0VOU0VfRkVBVFVSRVMuTERBUCk7CiAgICB9CiAgICBpc1NhbWxFbmFibGVkKCkgewogICAgICAgIHJldHVybiB0aGlzLmlzTGljZW5zZWQoY29uc3RhbnRzXzEuTElDRU5TRV9GRUFUVVJFUy5TQU1MKTsKICAgIH0KICAgIGlzQWlBc3Npc3RhbnRFbmFibGVkKCkgewogICAgICAgIHJldHVybiB0aGlzLmlzTGljZW5zZWQoY29uc3RhbnRzXzEuTElDRU5TRV9GRUFUVVJFUy5BSV9BU1NJU1RBTlQpOwogICAgfQogICAgaXNBc2tBaUVuYWJsZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNMaWNlbnNlZChjb25zdGFudHNfMS5MSUNFTlNFX0ZFQVRVUkVTLkFTS19BSSk7CiAgICB9CiAgICBpc0FpQ3JlZGl0c0VuYWJsZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNMaWNlbnNlZChjb25zdGFudHNfMS5MSUNFTlNFX0ZFQVRVUkVTLkFJX0NSRURJVFMpOwogICAgfQogICAgaXNBZHZhbmNlZEV4ZWN1dGlvbkZpbHRlcnNFbmFibGVkKCkgewogICAgICAgIHJldHVybiB0aGlzLmlzTGljZW5zZWQoY29uc3RhbnRzXzEuTElDRU5TRV9GRUFUVVJFUy5BRFZBTkNFRF9FWEVDVVRJT05fRklMVEVSUyk7CiAgICB9CiAgICBpc0FkdmFuY2VkUGVybWlzc2lvbnNMaWNlbnNlZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5pc0xpY2Vuc2VkKGNvbnN0YW50c18xLkxJQ0VOU0VfRkVBVFVSRVMuQURWQU5DRURfUEVSTUlTU0lPTlMpOwogICAgfQogICAgaXNEZWJ1Z0luRWRpdG9yTGljZW5zZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNMaWNlbnNlZChjb25zdGFudHNfMS5MSUNFTlNFX0ZFQVRVUkVTLkRFQlVHX0lOX0VESVRPUik7CiAgICB9CiAgICBpc0JpbmFyeURhdGFTM0xpY2Vuc2VkKCkgewogICAgICAgIHJldHVybiB0aGlzLmlzTGljZW5zZWQoY29uc3RhbnRzXzEuTElDRU5TRV9GRUFUVVJFUy5CSU5BUllfREFUQV9TMyk7CiAgICB9CiAgICBpc011bHRpTWFpbkxpY2Vuc2VkKCkgewogICAgICAgIHJldHVybiB0aGlzLmlzTGljZW5zZWQoY29uc3RhbnRzXzEuTElDRU5TRV9GRUFUVVJFUy5NVUxUSVBMRV9NQUlOX0lOU1RBTkNFUyk7CiAgICB9CiAgICBpc1ZhcmlhYmxlc0VuYWJsZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNMaWNlbnNlZChjb25zdGFudHNfMS5MSUNFTlNFX0ZFQVRVUkVTLlZBUklBQkxFUyk7CiAgICB9CiAgICBpc1NvdXJjZUNvbnRyb2xMaWNlbnNlZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5pc0xpY2Vuc2VkKGNvbnN0YW50c18xLkxJQ0VOU0VfRkVBVFVSRVMuU09VUkNFX0NPTlRST0wpOwogICAgfQogICAgaXNFeHRlcm5hbFNlY3JldHNFbmFibGVkKCkgewogICAgICAgIHJldHVybiB0aGlzLmlzTGljZW5zZWQoY29uc3RhbnRzXzEuTElDRU5TRV9GRUFUVVJFUy5FWFRFUk5BTF9TRUNSRVRTKTsKICAgIH0KICAgIGlzQVBJRGlzYWJsZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNMaWNlbnNlZChjb25zdGFudHNfMS5MSUNFTlNFX0ZFQVRVUkVTLkFQSV9ESVNBQkxFRCk7CiAgICB9CiAgICBpc1dvcmtlclZpZXdMaWNlbnNlZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5pc0xpY2Vuc2VkKGNvbnN0YW50c18xLkxJQ0VOU0VfRkVBVFVSRVMuV09SS0VSX1ZJRVcpOwogICAgfQogICAgaXNQcm9qZWN0Um9sZUFkbWluTGljZW5zZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNMaWNlbnNlZChjb25zdGFudHNfMS5MSUNFTlNFX0ZFQVRVUkVTLlBST0pFQ1RfUk9MRV9BRE1JTik7CiAgICB9CiAgICBpc1Byb2plY3RSb2xlRWRpdG9yTGljZW5zZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNMaWNlbnNlZChjb25zdGFudHNfMS5MSUNFTlNFX0ZFQVRVUkVTLlBST0pFQ1RfUk9MRV9FRElUT1IpOwogICAgfQogICAgaXNQcm9qZWN0Um9sZVZpZXdlckxpY2Vuc2VkKCkgewogICAgICAgIHJldHVybiB0aGlzLmlzTGljZW5zZWQoY29uc3RhbnRzXzEuTElDRU5TRV9GRUFUVVJFUy5QUk9KRUNUX1JPTEVfVklFV0VSKTsKICAgIH0KICAgIGlzQ3VzdG9tTnBtUmVnaXN0cnlFbmFibGVkKCkgewogICAgICAgIHJldHVybiB0aGlzLmlzTGljZW5zZWQoY29uc3RhbnRzXzEuTElDRU5TRV9GRUFUVVJFUy5DT01NVU5JVFlfTk9ERVNfQ1VTVE9NX1JFR0lTVFJZKTsKICAgIH0KICAgIGlzRm9sZGVyc0VuYWJsZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNMaWNlbnNlZChjb25zdGFudHNfMS5MSUNFTlNFX0ZFQVRVUkVTLkZPTERFUlMpOwogICAgfQogICAgZ2V0Q3VycmVudEVudGl0bGVtZW50cygpIHsKICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyPy5nZXRDdXJyZW50RW50aXRsZW1lbnRzKCkgPz8gW107CiAgICB9CiAgICBnZXRWYWx1ZShmZWF0dXJlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlcj8uZ2V0RmVhdHVyZVZhbHVlKGZlYXR1cmUpOwogICAgfQogICAgZ2V0TWFuYWdlbWVudEp3dCgpIHsKICAgICAgICBpZiAoIXRoaXMubWFuYWdlcikgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIuZ2V0TWFuYWdlbWVudEp3dCgpOwogICAgfQogICAgZ2V0TWFpblBsYW4oKSB7CiAgICAgICAgaWYgKCF0aGlzLm1hbmFnZXIpIHsKICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgICAgY29uc3QgZW50aXRsZW1lbnRzID0gdGhpcy5nZXRDdXJyZW50RW50aXRsZW1lbnRzKCk7CiAgICAgICAgaWYgKCFlbnRpdGxlbWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgfQogICAgICAgIGVudGl0bGVtZW50cy5zb3J0KChhLCBiKSA9PiBiLnZhbGlkRnJvbS5nZXRUaW1lKCkgLSBhLnZhbGlkRnJvbS5nZXRUaW1lKCkpOwogICAgICAgIHJldHVybiBlbnRpdGxlbWVudHMuZmluZCgoZW50aXRsZW1lbnQpID0+IGVudGl0bGVtZW50LnByb2R1Y3RNZXRhZGF0YT8udGVybXM/LmlzTWFpblBsYW4pOwogICAgfQogICAgZ2V0Q29uc3VtZXJJZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyPy5nZXRDb25zdW1lcklkKCkgPz8gJ3Vua25vd24nOwogICAgfQogICAgZ2V0VXNlcnNMaW1pdCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZShjb25zdGFudHNfMS5MSUNFTlNFX1FVT1RBUy5VU0VSU19MSU1JVCkgPz8gY29uc3RhbnRzXzEuVU5MSU1JVEVEX0xJQ0VOU0VfUVVPVEE7CiAgICB9CiAgICBnZXRUcmlnZ2VyTGltaXQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWUoY29uc3RhbnRzXzEuTElDRU5TRV9RVU9UQVMuVFJJR0dFUl9MSU1JVCkgPz8gY29uc3RhbnRzXzEuVU5MSU1JVEVEX0xJQ0VOU0VfUVVPVEE7CiAgICB9CiAgICBnZXRWYXJpYWJsZXNMaW1pdCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZShjb25zdGFudHNfMS5MSUNFTlNFX1FVT1RBUy5WQVJJQUJMRVNfTElNSVQpID8/IGNvbnN0YW50c18xLlVOTElNSVRFRF9MSUNFTlNFX1FVT1RBOwogICAgfQogICAgZ2V0QWlDcmVkaXRzKCkgewogICAgICAgIHJldHVybiB0aGlzLmdldFZhbHVlKGNvbnN0YW50c18xLkxJQ0VOU0VfUVVPVEFTLkFJX0NSRURJVFMpID8/IDA7CiAgICB9CiAgICBnZXRXb3JrZmxvd0hpc3RvcnlQcnVuZUxpbWl0KCkgewogICAgICAgIHJldHVybiAodGhpcy5nZXRWYWx1ZShjb25zdGFudHNfMS5MSUNFTlNFX1FVT1RBUy5XT1JLRkxPV19ISVNUT1JZX1BSVU5FX0xJTUlUKSA/PwogICAgICAgICAgICBjb25zdGFudHNfMS5ERUZBVUxUX1dPUktGTE9XX0hJU1RPUllfUFJVTkVfTElNSVQpOwogICAgfQogICAgZ2V0VGVhbVByb2plY3RMaW1pdCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZShjb25zdGFudHNfMS5MSUNFTlNFX1FVT1RBUy5URUFNX1BST0pFQ1RfTElNSVQpID8/IDA7CiAgICB9CiAgICBnZXRQbGFuTmFtZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZSgncGxhbk5hbWUnKSA/PyAnQ29tbXVuaXR5JzsKICAgIH0KICAgIGdldEV4cGlyeURhdGUoKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlcj8uZ2V0RXhwaXJ5RGF0ZSgpID8/IG51bGw7CiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgfQogICAgZ2V0VGVybWluYXRpb25EYXRlKCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXI/LmdldFRlcm1pbmF0aW9uRGF0ZSgpID8/IG51bGw7CiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgfQogICAgZ2V0RXhwaXJpbmdJbkRheXMoKSB7CiAgICAgICAgY29uc3QgZXhwaXJ5RGF0ZSA9IHRoaXMuZ2V0RXhwaXJ5RGF0ZSgpOwogICAgICAgIGlmICghZXhwaXJ5RGF0ZSkKICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICBjb25zdCBleHBpcnlUaW1lID0gZXhwaXJ5RGF0ZS5nZXRUaW1lKCk7CiAgICAgICAgaWYgKE51bWJlci5pc05hTihleHBpcnlUaW1lKSkKICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpOwogICAgICAgIGNvbnN0IGRpZmZNcyA9IGV4cGlyeVRpbWUgLSBub3cuZ2V0VGltZSgpOwogICAgICAgIGNvbnN0IGRpZmZEYXlzID0gTWF0aC5jZWlsKGRpZmZNcyAvICgxMDAwICogNjAgKiA2MCAqIDI0KSk7CiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIGRpZmZEYXlzKTsKICAgIH0KICAgIGdldFRlcm1pbmF0aW5nSW5EYXlzKCkgewogICAgICAgIGNvbnN0IHRlcm1pbmF0aW9uRGF0ZSA9IHRoaXMuZ2V0VGVybWluYXRpb25EYXRlKCk7CiAgICAgICAgaWYgKCF0ZXJtaW5hdGlvbkRhdGUpCiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgY29uc3QgdGVybWluYXRpb25UaW1lID0gdGVybWluYXRpb25EYXRlLmdldFRpbWUoKTsKICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHRlcm1pbmF0aW9uVGltZSkpCiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTsKICAgICAgICBjb25zdCBkaWZmTXMgPSB0ZXJtaW5hdGlvblRpbWUgLSBub3cuZ2V0VGltZSgpOwogICAgICAgIGNvbnN0IGRpZmZEYXlzID0gTWF0aC5jZWlsKGRpZmZNcyAvICgxMDAwICogNjAgKiA2MCAqIDI0KSk7CiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIGRpZmZEYXlzKTsKICAgIH0KICAgIGdldEluZm8oKSB7CiAgICAgICAgaWYgKCF0aGlzLm1hbmFnZXIpIHsKICAgICAgICAgICAgcmV0dXJuICduL2EnOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLnRvU3RyaW5nKCk7CiAgICB9CiAgICBpc1dpdGhpblVzZXJzTGltaXQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VXNlcnNMaW1pdCgpID09PSBjb25zdGFudHNfMS5VTkxJTUlURURfTElDRU5TRV9RVU9UQTsKICAgIH0KICAgIGVuYWJsZUF1dG9SZW5ld2FscygpIHsKICAgICAgICB0aGlzLm1hbmFnZXI/LmVuYWJsZUF1dG9SZW5ld2FscygpOwogICAgfQogICAgZGlzYWJsZUF1dG9SZW5ld2FscygpIHsKICAgICAgICB0aGlzLm1hbmFnZXI/LmRpc2FibGVBdXRvUmVuZXdhbHMoKTsKICAgIH0KICAgIG9uRXhwaXJ5U29vbigpIHsKICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKCdMaWNlbnNlIGlzIGFib3V0IHRvIGV4cGlyZSBzb29uLCByZWxvYWRpbmcgbGljZW5zZS4uLicpOwogICAgICAgIHZvaWQgdGhpcy5yZWxvYWQoKQogICAgICAgICAgICAudGhlbigoKSA9PiB7CiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ1JlbG9hZGVkIGxpY2Vuc2Ugb24gZXhwaXJ5IHNvb24nKTsKICAgICAgICB9KQogICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7CiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gcmVsb2FkIGxpY2Vuc2Ugb24gZXhwaXJ5IHNvb24nLCB7CiAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvciwKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICB9Cn07CmV4cG9ydHMuTGljZW5zZSA9IExpY2Vuc2U7Cl9fZGVjb3JhdGUoWwogICAgKDAsIGRlY29yYXRvcnNfMS5PblB1YlN1YkV2ZW50KSgncmVsb2FkLWxpY2Vuc2UnKSwKICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgRnVuY3Rpb24pLAogICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSksCiAgICBfX21ldGFkYXRhKCJkZXNpZ246cmV0dXJudHlwZSIsIFByb21pc2UpCl0sIExpY2Vuc2UucHJvdG90eXBlLCAicmVsb2FkIiwgbnVsbCk7Cl9fZGVjb3JhdGUoWwogICAgKDAsIGRlY29yYXRvcnNfMS5PblNodXRkb3duKSgpLAogICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBGdW5jdGlvbiksCiAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKSwKICAgIF9fbWV0YWRhdGEoImRlc2lnbjpyZXR1cm50eXBlIiwgUHJvbWlzZSkKXSwgTGljZW5zZS5wcm90b3R5cGUsICJzaHV0ZG93biIsIG51bGwpOwpfX2RlY29yYXRlKFsKICAgICgwLCBkZWNvcmF0b3JzXzEuT25MZWFkZXJUYWtlb3ZlcikoKSwKICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgRnVuY3Rpb24pLAogICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSksCiAgICBfX21ldGFkYXRhKCJkZXNpZ246cmV0dXJudHlwZSIsIHZvaWQgMCkKXSwgTGljZW5zZS5wcm90b3R5cGUsICJlbmFibGVBdXRvUmVuZXdhbHMiLCBudWxsKTsKX19kZWNvcmF0ZShbCiAgICAoMCwgZGVjb3JhdG9yc18xLk9uTGVhZGVyU3RlcGRvd24pKCksCiAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEZ1bmN0aW9uKSwKICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pLAogICAgX19tZXRhZGF0YSgiZGVzaWduOnJldHVybnR5cGUiLCB2b2lkIDApCl0sIExpY2Vuc2UucHJvdG90eXBlLCAiZGlzYWJsZUF1dG9SZW5ld2FscyIsIG51bGwpOwpleHBvcnRzLkxpY2Vuc2UgPSBMaWNlbnNlID0gX19kZWNvcmF0ZShbCiAgICAoMCwgZGlfMS5TZXJ2aWNlKSgpLAogICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbYmFja2VuZF9jb21tb25fMS5Mb2dnZXIsCiAgICAgICAgbjhuX2NvcmVfMS5JbnN0YW5jZVNldHRpbmdzLAogICAgICAgIGRiXzEuU2V0dGluZ3NSZXBvc2l0b3J5LAogICAgICAgIGxpY2Vuc2VfbWV0cmljc19zZXJ2aWNlXzEuTGljZW5zZU1ldHJpY3NTZXJ2aWNlLAogICAgICAgIGNvbmZpZ18xLkdsb2JhbENvbmZpZ10pCl0sIExpY2Vuc2UpOwovLyMgc291cmNlTWFwcGluZ1VSTD1saWNlbnNlLmpzLm1hcA0K
6
+ " | base64 -d > /usr/local/lib/node_modules/n8n/dist/license.js
7
 
8
+ RUN printf '%s' "77u/InVzZSBzdHJpY3QiOwp2YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7CiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrOwogICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspOwogICAgaWYgKCFkZXNjIHx8ICgiZ2V0IiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7CiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07CiAgICB9CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpOwp9KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikgewogICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gazsKICAgIG9bazJdID0gbVtrXTsKfSkpOwp2YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCAiZGVmYXVsdCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7Cn0pIDogZnVuY3Rpb24obywgdikgewogICAgb1siZGVmYXVsdCJdID0gdjsKfSk7CnZhciBfX2RlY29yYXRlID0gKHRoaXMgJiYgdGhpcy5fX2RlY29yYXRlKSB8fCBmdW5jdGlvbiAoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHsKICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7CiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICJvYmplY3QiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSAiZnVuY3Rpb24iKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7CiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByOwogICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjsKfTsKdmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCAoZnVuY3Rpb24gKCkgewogICAgdmFyIG93bktleXMgPSBmdW5jdGlvbihvKSB7CiAgICAgICAgb3duS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIChvKSB7CiAgICAgICAgICAgIHZhciBhciA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBrIGluIG8pIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgaykpIGFyW2FyLmxlbmd0aF0gPSBrOwogICAgICAgICAgICByZXR1cm4gYXI7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gb3duS2V5cyhvKTsKICAgIH07CiAgICByZXR1cm4gZnVuY3Rpb24gKG1vZCkgewogICAgICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7CiAgICAgICAgdmFyIHJlc3VsdCA9IHt9OwogICAgICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayA9IG93bktleXMobW9kKSwgaSA9IDA7IGkgPCBrLmxlbmd0aDsgaSsrKSBpZiAoa1tpXSAhPT0gImRlZmF1bHQiKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGtbaV0pOwogICAgICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH07Cn0pKCk7CnZhciBfX21ldGFkYXRhID0gKHRoaXMgJiYgdGhpcy5fX21ldGFkYXRhKSB8fCBmdW5jdGlvbiAoaywgdikgewogICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAib2JqZWN0IiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gImZ1bmN0aW9uIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEoaywgdik7Cn07CnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkgewogICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyAiZGVmYXVsdCI6IG1vZCB9Owp9OwpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwpleHBvcnRzLkZyb250ZW5kU2VydmljZSA9IHZvaWQgMDsKY29uc3QgYmFja2VuZF9jb21tb25fMSA9IHJlcXVpcmUoIkBuOG4vYmFja2VuZC1jb21tb24iKTsKY29uc3QgY29uZmlnXzEgPSByZXF1aXJlKCJAbjhuL2NvbmZpZyIpOwpjb25zdCBjb25zdGFudHNfMSA9IHJlcXVpcmUoIkBuOG4vY29uc3RhbnRzIik7CmNvbnN0IGRpXzEgPSByZXF1aXJlKCJAbjhuL2RpIik7CmNvbnN0IGZzXzEgPSByZXF1aXJlKCJmcyIpOwpjb25zdCBwcm9taXNlc18xID0gcmVxdWlyZSgiZnMvcHJvbWlzZXMiKTsKY29uc3QgdW5pcV8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoImxvZGFzaC91bmlxIikpOwpjb25zdCBuOG5fY29yZV8xID0gcmVxdWlyZSgibjhuLWNvcmUiKTsKY29uc3QgcGF0aF8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoInBhdGgiKSk7CmNvbnN0IGNvbmZpZ18yID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoIi4uL2NvbmZpZyIpKTsKY29uc3QgY29uc3RhbnRzXzIgPSByZXF1aXJlKCIuLi9jb25zdGFudHMiKTsKY29uc3QgY3JlZGVudGlhbF90eXBlc18xID0gcmVxdWlyZSgiLi4vY3JlZGVudGlhbC10eXBlcyIpOwpjb25zdCBjcmVkZW50aWFsc19vdmVyd3JpdGVzXzEgPSByZXF1aXJlKCIuLi9jcmVkZW50aWFscy1vdmVyd3JpdGVzIik7CmNvbnN0IGxpY2Vuc2VfMSA9IHJlcXVpcmUoIi4uL2xpY2Vuc2UiKTsKY29uc3QgbG9hZF9ub2Rlc19hbmRfY3JlZGVudGlhbHNfMSA9IHJlcXVpcmUoIi4uL2xvYWQtbm9kZXMtYW5kLWNyZWRlbnRpYWxzIik7CmNvbnN0IG1mYV9zZXJ2aWNlXzEgPSByZXF1aXJlKCIuLi9tZmEvbWZhLnNlcnZpY2UiKTsKY29uc3QgY29tbXVuaXR5X3BhY2thZ2VzX2NvbmZpZ18xID0gcmVxdWlyZSgiLi4vbW9kdWxlcy9jb21tdW5pdHktcGFja2FnZXMvY29tbXVuaXR5LXBhY2thZ2VzLmNvbmZpZyIpOwpjb25zdCBwdWJsaWNfYXBpXzEgPSByZXF1aXJlKCIuLi9wdWJsaWMtYXBpIik7CmNvbnN0IHB1c2hfY29uZmlnXzEgPSByZXF1aXJlKCIuLi9wdXNoL3B1c2guY29uZmlnIik7CmNvbnN0IG93bmVyc2hpcF9zZXJ2aWNlXzEgPSByZXF1aXJlKCIuLi9zZXJ2aWNlcy9vd25lcnNoaXAuc2VydmljZSIpOwpjb25zdCBzc29faGVscGVyc18xID0gcmVxdWlyZSgiLi4vc3NvLmVlL3Nzby1oZWxwZXJzIik7CmNvbnN0IGVtYWlsXzEgPSByZXF1aXJlKCIuLi91c2VyLW1hbmFnZW1lbnQvZW1haWwiKTsKY29uc3QgaGVhbHRoX2VuZHBvaW50X3V0aWxfMSA9IHJlcXVpcmUoIi4uL3V0aWxzL2hlYWx0aC1lbmRwb2ludC51dGlsIik7CmNvbnN0IHdvcmtmbG93X2hpc3RvcnlfaGVscGVyXzEgPSByZXF1aXJlKCIuLi93b3JrZmxvd3Mvd29ya2Zsb3ctaGlzdG9yeS93b3JrZmxvdy1oaXN0b3J5LWhlbHBlciIpOwpjb25zdCBhaV91c2FnZV9zZXJ2aWNlXzEgPSByZXF1aXJlKCIuL2FpLXVzYWdlLnNlcnZpY2UiKTsKY29uc3QgdXJsX3NlcnZpY2VfMSA9IHJlcXVpcmUoIi4vdXJsLnNlcnZpY2UiKTsKbGV0IEZyb250ZW5kU2VydmljZSA9IGNsYXNzIEZyb250ZW5kU2VydmljZSB7CiAgICBjb25zdHJ1Y3RvcihnbG9iYWxDb25maWcsIGxvZ2dlciwgbG9hZE5vZGVzQW5kQ3JlZGVudGlhbHMsIGNyZWRlbnRpYWxUeXBlcywgY3JlZGVudGlhbHNPdmVyd3JpdGVzLCBsaWNlbnNlLCBtYWlsZXIsIGluc3RhbmNlU2V0dGluZ3MsIHVybFNlcnZpY2UsIHNlY3VyaXR5Q29uZmlnLCBwdXNoQ29uZmlnLCBiaW5hcnlEYXRhQ29uZmlnLCBsaWNlbnNlU3RhdGUsIG1vZHVsZVJlZ2lzdHJ5LCBtZmFTZXJ2aWNlLCBvd25lcnNoaXBTZXJ2aWNlLCBhaVVzYWdlU2VydmljZSkgewogICAgICAgIHRoaXMuZ2xvYmFsQ29uZmlnID0gZ2xvYmFsQ29uZmlnOwogICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyOwogICAgICAgIHRoaXMubG9hZE5vZGVzQW5kQ3JlZGVudGlhbHMgPSBsb2FkTm9kZXNBbmRDcmVkZW50aWFsczsKICAgICAgICB0aGlzLmNyZWRlbnRpYWxUeXBlcyA9IGNyZWRlbnRpYWxUeXBlczsKICAgICAgICB0aGlzLmNyZWRlbnRpYWxzT3ZlcndyaXRlcyA9IGNyZWRlbnRpYWxzT3ZlcndyaXRlczsKICAgICAgICB0aGlzLmxpY2Vuc2UgPSBsaWNlbnNlOwogICAgICAgIHRoaXMubWFpbGVyID0gbWFpbGVyOwogICAgICAgIHRoaXMuaW5zdGFuY2VTZXR0aW5ncyA9IGluc3RhbmNlU2V0dGluZ3M7CiAgICAgICAgdGhpcy51cmxTZXJ2aWNlID0gdXJsU2VydmljZTsKICAgICAgICB0aGlzLnNlY3VyaXR5Q29uZmlnID0gc2VjdXJpdHlDb25maWc7CiAgICAgICAgdGhpcy5wdXNoQ29uZmlnID0gcHVzaENvbmZpZzsKICAgICAgICB0aGlzLmJpbmFyeURhdGFDb25maWcgPSBiaW5hcnlEYXRhQ29uZmlnOwogICAgICAgIHRoaXMubGljZW5zZVN0YXRlID0gbGljZW5zZVN0YXRlOwogICAgICAgIHRoaXMubW9kdWxlUmVnaXN0cnkgPSBtb2R1bGVSZWdpc3RyeTsKICAgICAgICB0aGlzLm1mYVNlcnZpY2UgPSBtZmFTZXJ2aWNlOwogICAgICAgIHRoaXMub3duZXJzaGlwU2VydmljZSA9IG93bmVyc2hpcFNlcnZpY2U7CiAgICAgICAgdGhpcy5haVVzYWdlU2VydmljZSA9IGFpVXNhZ2VTZXJ2aWNlOwogICAgICAgIGxvYWROb2Rlc0FuZENyZWRlbnRpYWxzLmFkZFBvc3RQcm9jZXNzb3IoYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5nZW5lcmF0ZVR5cGVzKCkpOwogICAgICAgIHZvaWQgdGhpcy5nZW5lcmF0ZVR5cGVzKCk7CiAgICAgICAgaWYgKGRpXzEuQ29udGFpbmVyLmdldChjb21tdW5pdHlfcGFja2FnZXNfY29uZmlnXzEuQ29tbXVuaXR5UGFja2FnZXNDb25maWcpLmVuYWJsZWQpIHsKICAgICAgICAgICAgdm9pZCBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IF9faW1wb3J0U3RhcihyZXF1aXJlKCcuLi9tb2R1bGVzL2NvbW11bml0eS1wYWNrYWdlcy9jb21tdW5pdHktcGFja2FnZXMuc2VydmljZScpKSkudGhlbigoeyBDb21tdW5pdHlQYWNrYWdlc1NlcnZpY2UgfSkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5jb21tdW5pdHlQYWNrYWdlc1NlcnZpY2UgPSBkaV8xLkNvbnRhaW5lci5nZXQoQ29tbXVuaXR5UGFja2FnZXNTZXJ2aWNlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfQogICAgY29sbGVjdEVudkZlYXR1cmVGbGFncygpIHsKICAgICAgICBjb25zdCBlbnZGZWF0dXJlRmxhZ3MgPSB7fTsKICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwcm9jZXNzLmVudikpIHsKICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKCdOOE5fRU5WX0ZFQVRfJykgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgZW52RmVhdHVyZUZsYWdzW2tleV0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZW52RmVhdHVyZUZsYWdzOwogICAgfQogICAgYXN5bmMgZ2V0U2hvd1NldHVwT25GaXJzdExvYWQoKSB7CiAgICAgICAgY29uc3QgcHJldmlld01vZGUgPSBwcm9jZXNzLmVudi5OOE5fUFJFVklFV19NT0RFID09PSAndHJ1ZSc7CiAgICAgICAgY29uc3QgaGFzSW5zdGFuY2VPd25lciA9IGF3YWl0IHRoaXMub3duZXJzaGlwU2VydmljZS5oYXNJbnN0YW5jZU93bmVyKCk7CiAgICAgICAgcmV0dXJuIHByZXZpZXdNb2RlID8gZmFsc2UgOiAhaGFzSW5zdGFuY2VPd25lcjsKICAgIH0KICAgIGFzeW5jIGluaXRTZXR0aW5ncygpIHsKICAgICAgICBjb25zdCBpbnN0YW5jZUJhc2VVcmwgPSB0aGlzLnVybFNlcnZpY2UuZ2V0SW5zdGFuY2VCYXNlVXJsKCk7CiAgICAgICAgY29uc3QgcmVzdEVuZHBvaW50ID0gdGhpcy5nbG9iYWxDb25maWcuZW5kcG9pbnRzLnJlc3Q7CiAgICAgICAgY29uc3QgdGVsZW1ldHJ5U2V0dGluZ3MgPSB7CiAgICAgICAgICAgIGVuYWJsZWQ6IHRoaXMuZ2xvYmFsQ29uZmlnLmRpYWdub3N0aWNzLmVuYWJsZWQsCiAgICAgICAgfTsKICAgICAgICBpZiAodGVsZW1ldHJ5U2V0dGluZ3MuZW5hYmxlZCkgewogICAgICAgICAgICBjb25zdCBjb25mID0gdGhpcy5nbG9iYWxDb25maWcuZGlhZ25vc3RpY3MuZnJvbnRlbmRDb25maWc7CiAgICAgICAgICAgIGNvbnN0IFtrZXksIHVybF0gPSBjb25mLnNwbGl0KCc7Jyk7CiAgICAgICAgICAgIGNvbnN0IHByb3h5ID0gYCR7aW5zdGFuY2VCYXNlVXJsfS8ke3Jlc3RFbmRwb2ludH0vdGVsZW1ldHJ5L3Byb3h5YDsKICAgICAgICAgICAgY29uc3Qgc291cmNlQ29uZmlnID0gYCR7aW5zdGFuY2VCYXNlVXJsfS8ke3Jlc3RFbmRwb2ludH0vdGVsZW1ldHJ5L3J1ZGRlcnN0YWNrYDsKICAgICAgICAgICAgaWYgKCFrZXkgfHwgIXVybCkgewogICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybignRGlhZ25vc3RpY3MgZnJvbnRlbmQgY29uZmlnIGlzIGludmFsaWQnKTsKICAgICAgICAgICAgICAgIHRlbGVtZXRyeVNldHRpbmdzLmVuYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0ZWxlbWV0cnlTZXR0aW5ncy5jb25maWcgPSB7IGtleSwgdXJsLCBwcm94eSwgc291cmNlQ29uZmlnIH07CiAgICAgICAgfQogICAgICAgIGNvbnN0IHByZXZpZXdNb2RlID0gcHJvY2Vzcy5lbnYuTjhOX1BSRVZJRVdfTU9ERSA9PT0gJ3RydWUnOwogICAgICAgIHRoaXMuc2V0dGluZ3MgPSB7CiAgICAgICAgICAgIHNldHRpbmdzTW9kZTogJ2F1dGhlbnRpY2F0ZWQnLAogICAgICAgICAgICBpbkUyRVRlc3RzOiBjb25zdGFudHNfMi5pbkUyRVRlc3RzLAogICAgICAgICAgICBpc0RvY2tlcjogdGhpcy5pbnN0YW5jZVNldHRpbmdzLmlzRG9ja2VyLAogICAgICAgICAgICBkYXRhYmFzZVR5cGU6IHRoaXMuZ2xvYmFsQ29uZmlnLmRhdGFiYXNlLnR5cGUsCiAgICAgICAgICAgIHByZXZpZXdNb2RlLAogICAgICAgICAgICBlbmRwb2ludEZvcm06IHRoaXMuZ2xvYmFsQ29uZmlnLmVuZHBvaW50cy5mb3JtLAogICAgICAgICAgICBlbmRwb2ludEZvcm1UZXN0OiB0aGlzLmdsb2JhbENvbmZpZy5lbmRwb2ludHMuZm9ybVRlc3QsCiAgICAgICAgICAgIGVuZHBvaW50Rm9ybVdhaXRpbmc6IHRoaXMuZ2xvYmFsQ29uZmlnLmVuZHBvaW50cy5mb3JtV2FpdGluZywKICAgICAgICAgICAgZW5kcG9pbnRNY3A6IHRoaXMuZ2xvYmFsQ29uZmlnLmVuZHBvaW50cy5tY3AsCiAgICAgICAgICAgIGVuZHBvaW50TWNwVGVzdDogdGhpcy5nbG9iYWxDb25maWcuZW5kcG9pbnRzLm1jcFRlc3QsCiAgICAgICAgICAgIGVuZHBvaW50V2ViaG9vazogdGhpcy5nbG9iYWxDb25maWcuZW5kcG9pbnRzLndlYmhvb2ssCiAgICAgICAgICAgIGVuZHBvaW50V2ViaG9va1Rlc3Q6IHRoaXMuZ2xvYmFsQ29uZmlnLmVuZHBvaW50cy53ZWJob29rVGVzdCwKICAgICAgICAgICAgZW5kcG9pbnRXZWJob29rV2FpdGluZzogdGhpcy5nbG9iYWxDb25maWcuZW5kcG9pbnRzLndlYmhvb2tXYWl0aW5nLAogICAgICAgICAgICBlbmRwb2ludEhlYWx0aDogKDAsIGhlYWx0aF9lbmRwb2ludF91dGlsXzEucmVzb2x2ZUZyb250ZW5kSGVhbHRoRW5kcG9pbnRQYXRoKSh0aGlzLmdsb2JhbENvbmZpZyksCiAgICAgICAgICAgIHNhdmVEYXRhRXJyb3JFeGVjdXRpb246IHRoaXMuZ2xvYmFsQ29uZmlnLmV4ZWN1dGlvbnMuc2F2ZURhdGFPbkVycm9yLAogICAgICAgICAgICBzYXZlRGF0YVN1Y2Nlc3NFeGVjdXRpb246IHRoaXMuZ2xvYmFsQ29uZmlnLmV4ZWN1dGlvbnMuc2F2ZURhdGFPblN1Y2Nlc3MsCiAgICAgICAgICAgIHNhdmVNYW51YWxFeGVjdXRpb25zOiB0aGlzLmdsb2JhbENvbmZpZy5leGVjdXRpb25zLnNhdmVEYXRhTWFudWFsRXhlY3V0aW9ucywKICAgICAgICAgICAgc2F2ZUV4ZWN1dGlvblByb2dyZXNzOiB0aGlzLmdsb2JhbENvbmZpZy5leGVjdXRpb25zLnNhdmVFeGVjdXRpb25Qcm9ncmVzcywKICAgICAgICAgICAgZXhlY3V0aW9uVGltZW91dDogdGhpcy5nbG9iYWxDb25maWcuZXhlY3V0aW9ucy50aW1lb3V0LAogICAgICAgICAgICBtYXhFeGVjdXRpb25UaW1lb3V0OiB0aGlzLmdsb2JhbENvbmZpZy5leGVjdXRpb25zLm1heFRpbWVvdXQsCiAgICAgICAgICAgIHdvcmtmbG93Q2FsbGVyUG9saWN5RGVmYXVsdE9wdGlvbjogdGhpcy5nbG9iYWxDb25maWcud29ya2Zsb3dzLmNhbGxlclBvbGljeURlZmF1bHRPcHRpb24sCiAgICAgICAgICAgIHRpbWV6b25lOiB0aGlzLmdsb2JhbENvbmZpZy5nZW5lcmljLnRpbWV6b25lLAogICAgICAgICAgICB1cmxCYXNlV2ViaG9vazogdGhpcy51cmxTZXJ2aWNlLmdldFdlYmhvb2tCYXNlVXJsKCksCiAgICAgICAgICAgIHVybEJhc2VFZGl0b3I6IGluc3RhbmNlQmFzZVVybCwKICAgICAgICAgICAgYmluYXJ5RGF0YU1vZGU6IHRoaXMuYmluYXJ5RGF0YUNvbmZpZy5tb2RlLAogICAgICAgICAgICBub2RlSnNWZXJzaW9uOiBwcm9jZXNzLnZlcnNpb24ucmVwbGFjZSgvXnYvLCAnJyksCiAgICAgICAgICAgIG5vZGVFbnY6IHByb2Nlc3MuZW52Lk5PREVfRU5WLAogICAgICAgICAgICB2ZXJzaW9uQ2xpOiBjb25zdGFudHNfMi5OOE5fVkVSU0lPTiwKICAgICAgICAgICAgY29uY3VycmVuY3k6IHRoaXMuZ2xvYmFsQ29uZmlnLmV4ZWN1dGlvbnMuY29uY3VycmVuY3kucHJvZHVjdGlvbkxpbWl0LAogICAgICAgICAgICBhdXRoQ29va2llOiB7CiAgICAgICAgICAgICAgICBzZWN1cmU6IHRoaXMuZ2xvYmFsQ29uZmlnLmF1dGguY29va2llLnNlY3VyZSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcmVsZWFzZUNoYW5uZWw6IHRoaXMuZ2xvYmFsQ29uZmlnLmdlbmVyaWMucmVsZWFzZUNoYW5uZWwsCiAgICAgICAgICAgIG9hdXRoQ2FsbGJhY2tVcmxzOiB7CiAgICAgICAgICAgICAgICBvYXV0aDE6IGAke2luc3RhbmNlQmFzZVVybH0vJHtyZXN0RW5kcG9pbnR9L29hdXRoMS1jcmVkZW50aWFsL2NhbGxiYWNrYCwKICAgICAgICAgICAgICAgIG9hdXRoMjogYCR7aW5zdGFuY2VCYXNlVXJsfS8ke3Jlc3RFbmRwb2ludH0vb2F1dGgyLWNyZWRlbnRpYWwvY2FsbGJhY2tgLAogICAgICAgICAgICB9LAogICAgICAgICAgICB2ZXJzaW9uTm90aWZpY2F0aW9uczogewogICAgICAgICAgICAgICAgZW5hYmxlZDogdGhpcy5nbG9iYWxDb25maWcudmVyc2lvbk5vdGlmaWNhdGlvbnMuZW5hYmxlZCwKICAgICAgICAgICAgICAgIGVuZHBvaW50OiB0aGlzLmdsb2JhbENvbmZpZy52ZXJzaW9uTm90aWZpY2F0aW9ucy5lbmRwb2ludCwKICAgICAgICAgICAgICAgIHdoYXRzTmV3RW5hYmxlZDogdGhpcy5nbG9iYWxDb25maWcudmVyc2lvbk5vdGlmaWNhdGlvbnMud2hhdHNOZXdFbmFibGVkLAogICAgICAgICAgICAgICAgd2hhdHNOZXdFbmRwb2ludDogdGhpcy5nbG9iYWxDb25maWcudmVyc2lvbk5vdGlmaWNhdGlvbnMud2hhdHNOZXdFbmRwb2ludCwKICAgICAgICAgICAgICAgIGluZm9Vcmw6IHRoaXMuZ2xvYmFsQ29uZmlnLnZlcnNpb25Ob3RpZmljYXRpb25zLmluZm9VcmwsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGR5bmFtaWNCYW5uZXJzOiB7CiAgICAgICAgICAgICAgICBlbmRwb2ludDogdGhpcy5nbG9iYWxDb25maWcuZHluYW1pY0Jhbm5lcnMuZW5kcG9pbnQsCiAgICAgICAgICAgICAgICBlbmFibGVkOiB0aGlzLmdsb2JhbENvbmZpZy5keW5hbWljQmFubmVycy5lbmFibGVkICYmIHRoaXMuZ2xvYmFsQ29uZmlnLmRpYWdub3N0aWNzLmVuYWJsZWQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGluc3RhbmNlSWQ6IHRoaXMuaW5zdGFuY2VTZXR0aW5ncy5pbnN0YW5jZUlkLAogICAgICAgICAgICB0ZWxlbWV0cnk6IHRlbGVtZXRyeVNldHRpbmdzLAogICAgICAgICAgICBwb3N0aG9nOiB7CiAgICAgICAgICAgICAgICBlbmFibGVkOiB0aGlzLmdsb2JhbENvbmZpZy5kaWFnbm9zdGljcy5lbmFibGVkLAogICAgICAgICAgICAgICAgYXBpSG9zdDogdGhpcy5nbG9iYWxDb25maWcuZGlhZ25vc3RpY3MucG9zdGhvZ0NvbmZpZy5hcGlIb3N0LAogICAgICAgICAgICAgICAgYXBpS2V5OiB0aGlzLmdsb2JhbENvbmZpZy5kaWFnbm9zdGljcy5wb3N0aG9nQ29uZmlnLmFwaUtleSwKICAgICAgICAgICAgICAgIGF1dG9jYXB0dXJlOiBmYWxzZSwKICAgICAgICAgICAgICAgIGRpc2FibGVTZXNzaW9uUmVjb3JkaW5nOiB0aGlzLmdsb2JhbENvbmZpZy5kZXBsb3ltZW50LnR5cGUgIT09ICdjbG91ZCcsCiAgICAgICAgICAgICAgICBwcm94eTogYCR7aW5zdGFuY2VCYXNlVXJsfS8ke3Jlc3RFbmRwb2ludH0vcGhgLAogICAgICAgICAgICAgICAgZGVidWc6IHRoaXMuZ2xvYmFsQ29uZmlnLmxvZ2dpbmcubGV2ZWwgPT09ICdkZWJ1ZycsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHBlcnNvbmFsaXphdGlvblN1cnZleUVuYWJsZWQ6IHRoaXMuZ2xvYmFsQ29uZmlnLnBlcnNvbmFsaXphdGlvbi5lbmFibGVkICYmIHRoaXMuZ2xvYmFsQ29uZmlnLmRpYWdub3N0aWNzLmVuYWJsZWQsCiAgICAgICAgICAgIGRlZmF1bHRMb2NhbGU6IHRoaXMuZ2xvYmFsQ29uZmlnLmRlZmF1bHRMb2NhbGUsCiAgICAgICAgICAgIHVzZXJNYW5hZ2VtZW50OiB7CiAgICAgICAgICAgICAgICBxdW90YTogdGhpcy5saWNlbnNlLmdldFVzZXJzTGltaXQoKSwKICAgICAgICAgICAgICAgIHNob3dTZXR1cE9uRmlyc3RMb2FkOiBhd2FpdCB0aGlzLmdldFNob3dTZXR1cE9uRmlyc3RMb2FkKCksCiAgICAgICAgICAgICAgICBzbXRwU2V0dXA6IHRoaXMubWFpbGVyLmlzRW1haWxTZXRVcCwKICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uTWV0aG9kOiAoMCwgc3NvX2hlbHBlcnNfMS5nZXRDdXJyZW50QXV0aGVudGljYXRpb25NZXRob2QpKCksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNzbzogewogICAgICAgICAgICAgICAgc2FtbDogewogICAgICAgICAgICAgICAgICAgIGxvZ2luRW5hYmxlZDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgbG9naW5MYWJlbDogJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgbGRhcDogewogICAgICAgICAgICAgICAgICAgIGxvZ2luRW5hYmxlZDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgbG9naW5MYWJlbDogJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgb2lkYzogewogICAgICAgICAgICAgICAgICAgIGxvZ2luRW5hYmxlZDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgbG9naW5Vcmw6IGAke2luc3RhbmNlQmFzZVVybH0vJHtyZXN0RW5kcG9pbnR9L3Nzby9vaWRjL2xvZ2luYCwKICAgICAgICAgICAgICAgICAgICBjYWxsYmFja1VybDogYCR7aW5zdGFuY2VCYXNlVXJsfS8ke3Jlc3RFbmRwb2ludH0vc3NvL29pZGMvY2FsbGJhY2tgLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZGF0YVRhYmxlczogewogICAgICAgICAgICAgICAgbWF4U2l6ZTogdGhpcy5nbG9iYWxDb25maWcuZGF0YVRhYmxlLm1heFNpemUsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHB1YmxpY0FwaTogewogICAgICAgICAgICAgICAgZW5hYmxlZDogKDAsIHB1YmxpY19hcGlfMS5pc0FwaUVuYWJsZWQpKCksCiAgICAgICAgICAgICAgICBsYXRlc3RWZXJzaW9uOiAxLAogICAgICAgICAgICAgICAgcGF0aDogdGhpcy5nbG9iYWxDb25maWcucHVibGljQXBpLnBhdGgsCiAgICAgICAgICAgICAgICBzd2FnZ2VyVWk6IHsKICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiAhdGhpcy5nbG9iYWxDb25maWcucHVibGljQXBpLnN3YWdnZXJVaURpc2FibGVkLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgd29ya2Zsb3dUYWdzRGlzYWJsZWQ6IHRoaXMuZ2xvYmFsQ29uZmlnLnRhZ3MuZGlzYWJsZWQsCiAgICAgICAgICAgIGxvZ0xldmVsOiB0aGlzLmdsb2JhbENvbmZpZy5sb2dnaW5nLmxldmVsLAogICAgICAgICAgICBoaXJpbmdCYW5uZXJFbmFibGVkOiB0aGlzLmdsb2JhbENvbmZpZy5oaXJpbmdCYW5uZXIuZW5hYmxlZCwKICAgICAgICAgICAgYWlBc3Npc3RhbnQ6IHsKICAgICAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAogICAgICAgICAgICAgICAgc2V0dXA6IGZhbHNlLAogICAgICAgICAgICB9LAogICAgICAgICAgICB0ZW1wbGF0ZXM6IHsKICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRoaXMuZ2xvYmFsQ29uZmlnLnRlbXBsYXRlcy5lbmFibGVkLAogICAgICAgICAgICAgICAgaG9zdDogdGhpcy5nbG9iYWxDb25maWcudGVtcGxhdGVzLmhvc3QsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV4ZWN1dGlvbk1vZGU6IHRoaXMuZ2xvYmFsQ29uZmlnLmV4ZWN1dGlvbnMubW9kZSwKICAgICAgICAgICAgaXNNdWx0aU1haW46IHRoaXMuaW5zdGFuY2VTZXR0aW5ncy5pc011bHRpTWFpbiwKICAgICAgICAgICAgcHVzaEJhY2tlbmQ6IHRoaXMucHVzaENvbmZpZy5iYWNrZW5kLAogICAgICAgICAgICBjb21tdW5pdHlOb2Rlc0VuYWJsZWQ6IGRpXzEuQ29udGFpbmVyLmdldChjb21tdW5pdHlfcGFja2FnZXNfY29uZmlnXzEuQ29tbXVuaXR5UGFja2FnZXNDb25maWcpLmVuYWJsZWQsCiAgICAgICAgICAgIHVudmVyaWZpZWRDb21tdW5pdHlOb2Rlc0VuYWJsZWQ6IGRpXzEuQ29udGFpbmVyLmdldChjb21tdW5pdHlfcGFja2FnZXNfY29uZmlnXzEuQ29tbXVuaXR5UGFja2FnZXNDb25maWcpLnVudmVyaWZpZWRFbmFibGVkLAogICAgICAgICAgICBkZXBsb3ltZW50OiB7CiAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLmdsb2JhbENvbmZpZy5kZXBsb3ltZW50LnR5cGUsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGFsbG93ZWRNb2R1bGVzOiB7CiAgICAgICAgICAgICAgICBidWlsdEluOiBwcm9jZXNzLmVudi5OT0RFX0ZVTkNUSU9OX0FMTE9XX0JVSUxUSU4/LnNwbGl0KCcsJykgPz8gdW5kZWZpbmVkLAogICAgICAgICAgICAgICAgZXh0ZXJuYWw6IHByb2Nlc3MuZW52Lk5PREVfRlVOQ1RJT05fQUxMT1dfRVhURVJOQUw/LnNwbGl0KCcsJykgPz8gdW5kZWZpbmVkLAogICAgICAgICAgICB9LAogICAgICAgICAgICBlbnRlcnByaXNlOiB7CiAgICAgICAgICAgICAgICBzaGFyaW5nOiBmYWxzZSwKICAgICAgICAgICAgICAgIGxkYXA6IGZhbHNlLAogICAgICAgICAgICAgICAgc2FtbDogZmFsc2UsCiAgICAgICAgICAgICAgICBvaWRjOiBmYWxzZSwKICAgICAgICAgICAgICAgIG1mYUVuZm9yY2VtZW50OiBmYWxzZSwKICAgICAgICAgICAgICAgIGxvZ1N0cmVhbWluZzogZmFsc2UsCiAgICAgICAgICAgICAgICBhZHZhbmNlZEV4ZWN1dGlvbkZpbHRlcnM6IGZhbHNlLAogICAgICAgICAgICAgICAgdmFyaWFibGVzOiBmYWxzZSwKICAgICAgICAgICAgICAgIHNvdXJjZUNvbnRyb2w6IGZhbHNlLAogICAgICAgICAgICAgICAgYXVkaXRMb2dzOiBmYWxzZSwKICAgICAgICAgICAgICAgIGV4dGVybmFsU2VjcmV0czogZmFsc2UsCiAgICAgICAgICAgICAgICBzaG93Tm9uUHJvZEJhbm5lcjogZmFsc2UsCiAgICAgICAgICAgICAgICBkZWJ1Z0luRWRpdG9yOiBmYWxzZSwKICAgICAgICAgICAgICAgIGJpbmFyeURhdGFTMzogZmFsc2UsCiAgICAgICAgICAgICAgICB3b3JrZXJWaWV3OiBmYWxzZSwKICAgICAgICAgICAgICAgIGFkdmFuY2VkUGVybWlzc2lvbnM6IGZhbHNlLAogICAgICAgICAgICAgICAgd29ya2Zsb3dEaWZmczogZmFsc2UsCiAgICAgICAgICAgICAgICBuYW1lZFZlcnNpb25zOiBmYWxzZSwKICAgICAgICAgICAgICAgIHByb3Zpc2lvbmluZzogZmFsc2UsCiAgICAgICAgICAgICAgICBwcm9qZWN0czogewogICAgICAgICAgICAgICAgICAgIHRlYW06IHsKICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQ6IDAsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBjdXN0b21Sb2xlczogZmFsc2UsCiAgICAgICAgICAgICAgICBwZXJzb25hbFNwYWNlUG9saWN5OiBmYWxzZSwKICAgICAgICAgICAgICAgIGRhdGFSZWRhY3Rpb246IGZhbHNlLAogICAgICAgICAgICB9LAogICAgICAgICAgICBtZmE6IHsKICAgICAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAogICAgICAgICAgICAgICAgZW5mb3JjZWQ6IGZhbHNlLAogICAgICAgICAgICB9LAogICAgICAgICAgICBoaWRlVXNhZ2VQYWdlOiB0aGlzLmdsb2JhbENvbmZpZy5oaWRlVXNhZ2VQYWdlLAogICAgICAgICAgICBsaWNlbnNlOiB7CiAgICAgICAgICAgICAgICBjb25zdW1lcklkOiAndW5rbm93bicsCiAgICAgICAgICAgICAgICBlbnZpcm9ubWVudDogdGhpcy5nbG9iYWxDb25maWcubGljZW5zZS50ZW5hbnRJZCA9PT0gMSA/ICdwcm9kdWN0aW9uJyA6ICdzdGFnaW5nJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdmFyaWFibGVzOiB7CiAgICAgICAgICAgICAgICBsaW1pdDogMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgYmFubmVyczogewogICAgICAgICAgICAgICAgZGlzbWlzc2VkOiBbXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgYXNrQWk6IHsKICAgICAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAogICAgICAgICAgICB9LAogICAgICAgICAgICBhaUJ1aWxkZXI6IHsKICAgICAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAogICAgICAgICAgICAgICAgc2V0dXA6IGZhbHNlLAogICAgICAgICAgICB9LAogICAgICAgICAgICBhaUNyZWRpdHM6IHsKICAgICAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAogICAgICAgICAgICAgICAgY3JlZGl0czogMCwKICAgICAgICAgICAgICAgIHNldHVwOiBmYWxzZSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgYWk6IHsKICAgICAgICAgICAgICAgIGFsbG93U2VuZGluZ1BhcmFtZXRlclZhbHVlczogdHJ1ZSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgd29ya2Zsb3dIaXN0b3J5OiB7CiAgICAgICAgICAgICAgICBwcnVuZVRpbWU6ICgwLCB3b3JrZmxvd19oaXN0b3J5X2hlbHBlcl8xLmdldFdvcmtmbG93SGlzdG9yeVBydW5lVGltZSkoKSwKICAgICAgICAgICAgICAgIGxpY2Vuc2VQcnVuZVRpbWU6ICgwLCB3b3JrZmxvd19oaXN0b3J5X2hlbHBlcl8xLmdldFdvcmtmbG93SGlzdG9yeUxpY2Vuc2VQcnVuZVRpbWUpKCksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHBydW5pbmc6IHsKICAgICAgICAgICAgICAgIGlzRW5hYmxlZDogdGhpcy5nbG9iYWxDb25maWcuZXhlY3V0aW9ucy5wcnVuZURhdGEsCiAgICAgICAgICAgICAgICBtYXhBZ2U6IHRoaXMuZ2xvYmFsQ29uZmlnLmV4ZWN1dGlvbnMucHJ1bmVEYXRhTWF4QWdlLAogICAgICAgICAgICAgICAgbWF4Q291bnQ6IHRoaXMuZ2xvYmFsQ29uZmlnLmV4ZWN1dGlvbnMucHJ1bmVEYXRhTWF4Q291bnQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNlY3VyaXR5OiB7CiAgICAgICAgICAgICAgICBibG9ja0ZpbGVBY2Nlc3NUb044bkZpbGVzOiB0aGlzLnNlY3VyaXR5Q29uZmlnLmJsb2NrRmlsZUFjY2Vzc1RvTjhuRmlsZXMsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGVhc3lBSVdvcmtmbG93T25ib2FyZGVkOiBmYWxzZSwKICAgICAgICAgICAgZm9sZGVyczogewogICAgICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2YWx1YXRpb246IHsKICAgICAgICAgICAgICAgIHF1b3RhOiB0aGlzLmxpY2Vuc2VTdGF0ZS5nZXRNYXhXb3JrZmxvd3NXaXRoRXZhbHVhdGlvbnMoKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgYWN0aXZlTW9kdWxlczogdGhpcy5tb2R1bGVSZWdpc3RyeS5nZXRBY3RpdmVNb2R1bGVzKCksCiAgICAgICAgICAgIGNhbnZhc09ubHk6IHRoaXMuZ2xvYmFsQ29uZmlnLmNhbnZhc09ubHksCiAgICAgICAgICAgIGVudkZlYXR1cmVGbGFnczogdGhpcy5jb2xsZWN0RW52RmVhdHVyZUZsYWdzKCksCiAgICAgICAgfTsKICAgIH0KICAgIGFzeW5jIGdlbmVyYXRlVHlwZXMoKSB7CiAgICAgICAgdGhpcy5vdmVyd3JpdGVDcmVkZW50aWFsc1Byb3BlcnRpZXMoKTsKICAgICAgICBjb25zdCB7IGNyZWRlbnRpYWxzLCBub2RlcyB9ID0gYXdhaXQgdGhpcy5sb2FkTm9kZXNBbmRDcmVkZW50aWFscy5jb2xsZWN0VHlwZXMoKTsKICAgICAgICBjb25zdCB7IHN0YXRpY0NhY2hlRGlyIH0gPSB0aGlzLmluc3RhbmNlU2V0dGluZ3M7CiAgICAgICAgYXdhaXQgKDAsIHByb21pc2VzXzEubWtkaXIpKHBhdGhfMS5kZWZhdWx0LmpvaW4oc3RhdGljQ2FjaGVEaXIsICd0eXBlcycpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTsKICAgICAgICBhd2FpdCB0aGlzLndyaXRlU3RhdGljSlNPTignbm9kZXMnLCBub2Rlcyk7CiAgICAgICAgY29uc3Qgbm9kZVZlcnNpb25JZGVudGlmaWVycyA9IHRoaXMuZ2V0Tm9kZVZlcnNpb25JZGVudGlmaWVycyhub2Rlcyk7CiAgICAgICAgYXdhaXQgdGhpcy53cml0ZVN0YXRpY0pTT04oJ25vZGUtdmVyc2lvbnMnLCBub2RlVmVyc2lvbklkZW50aWZpZXJzKTsKICAgICAgICBhd2FpdCB0aGlzLndyaXRlU3RhdGljSlNPTignY3JlZGVudGlhbHMnLCBjcmVkZW50aWFscyk7CiAgICB9CiAgICBhc3luYyBnZXRTZXR0aW5ncygpIHsKICAgICAgICBpZiAoIXRoaXMuc2V0dGluZ3MpIHsKICAgICAgICAgICAgYXdhaXQgdGhpcy5pbml0U2V0dGluZ3MoKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVzdEVuZHBvaW50ID0gdGhpcy5nbG9iYWxDb25maWcuZW5kcG9pbnRzLnJlc3Q7CiAgICAgICAgY29uc3QgaW5zdGFuY2VCYXNlVXJsID0gdGhpcy51cmxTZXJ2aWNlLmdldEluc3RhbmNlQmFzZVVybCgpOwogICAgICAgIHRoaXMuc2V0dGluZ3MudXJsQmFzZVdlYmhvb2sgPSB0aGlzLnVybFNlcnZpY2UuZ2V0V2ViaG9va0Jhc2VVcmwoKTsKICAgICAgICB0aGlzLnNldHRpbmdzLnVybEJhc2VFZGl0b3IgPSBpbnN0YW5jZUJhc2VVcmw7CiAgICAgICAgdGhpcy5zZXR0aW5ncy5vYXV0aENhbGxiYWNrVXJscyA9IHsKICAgICAgICAgICAgb2F1dGgxOiBgJHtpbnN0YW5jZUJhc2VVcmx9LyR7cmVzdEVuZHBvaW50fS9vYXV0aDEtY3JlZGVudGlhbC9jYWxsYmFja2AsCiAgICAgICAgICAgIG9hdXRoMjogYCR7aW5zdGFuY2VCYXNlVXJsfS8ke3Jlc3RFbmRwb2ludH0vb2F1dGgyLWNyZWRlbnRpYWwvY2FsbGJhY2tgLAogICAgICAgIH07CiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLnNldHRpbmdzLnVzZXJNYW5hZ2VtZW50LCB7CiAgICAgICAgICAgIHF1b3RhOiB0aGlzLmxpY2Vuc2UuZ2V0VXNlcnNMaW1pdCgpLAogICAgICAgICAgICBhdXRoZW50aWNhdGlvbk1ldGhvZDogKDAsIHNzb19oZWxwZXJzXzEuZ2V0Q3VycmVudEF1dGhlbnRpY2F0aW9uTWV0aG9kKSgpLAogICAgICAgICAgICBzaG93U2V0dXBPbkZpcnN0TG9hZDogYXdhaXQgdGhpcy5nZXRTaG93U2V0dXBPbkZpcnN0TG9hZCgpLAogICAgICAgIH0pOwogICAgICAgIGxldCBkaXNtaXNzZWRCYW5uZXJzID0gW107CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgZGlzbWlzc2VkQmFubmVycyA9IGNvbmZpZ18yLmRlZmF1bHQuZ2V0RW52KCd1aS5iYW5uZXJzLmRpc21pc3NlZCcpID8/IFtdOwogICAgICAgIH0KICAgICAgICBjYXRjaCB7CiAgICAgICAgfQogICAgICAgIHRoaXMuc2V0dGluZ3MuYmFubmVycy5kaXNtaXNzZWQgPSBkaXNtaXNzZWRCYW5uZXJzOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MuZWFzeUFJV29ya2Zsb3dPbmJvYXJkZWQgPSBjb25maWdfMi5kZWZhdWx0LmdldEVudignZWFzeUFJV29ya2Zsb3dPbmJvYXJkZWQnKSA/PyBmYWxzZTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB0aGlzLnNldHRpbmdzLmVhc3lBSVdvcmtmbG93T25ib2FyZGVkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MuYWkuYWxsb3dTZW5kaW5nUGFyYW1ldGVyVmFsdWVzID0gYXdhaXQgdGhpcy5haVVzYWdlU2VydmljZS5nZXRBaVVzYWdlU2V0dGluZ3MoKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB0aGlzLnNldHRpbmdzLmFpLmFsbG93U2VuZGluZ1BhcmFtZXRlclZhbHVlcyA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGlzUzNTZWxlY3RlZCA9IHRoaXMuYmluYXJ5RGF0YUNvbmZpZy5tb2RlID09PSAnczMnOwogICAgICAgIGNvbnN0IGlzUzNBdmFpbGFibGUgPSB0aGlzLmJpbmFyeURhdGFDb25maWcuYXZhaWxhYmxlTW9kZXMuaW5jbHVkZXMoJ3MzJyk7CiAgICAgICAgY29uc3QgaXNTM0xpY2Vuc2VkID0gdGhpcy5saWNlbnNlLmlzQmluYXJ5RGF0YVMzTGljZW5zZWQoKTsKICAgICAgICBjb25zdCBpc0FpQXNzaXN0YW50RW5hYmxlZCA9IHRoaXMubGljZW5zZS5pc0FpQXNzaXN0YW50RW5hYmxlZCgpOwogICAgICAgIGNvbnN0IGlzQXNrQWlFbmFibGVkID0gdGhpcy5saWNlbnNlLmlzQXNrQWlFbmFibGVkKCk7CiAgICAgICAgY29uc3QgaXNBaUNyZWRpdHNFbmFibGVkID0gdGhpcy5saWNlbnNlLmlzQWlDcmVkaXRzRW5hYmxlZCgpOwogICAgICAgIGNvbnN0IGlzQWlCdWlsZGVyRW5hYmxlZCA9IHRoaXMubGljZW5zZS5pc0xpY2Vuc2VkKGNvbnN0YW50c18xLkxJQ0VOU0VfRkVBVFVSRVMuQUlfQlVJTERFUik7CiAgICAgICAgdGhpcy5zZXR0aW5ncy5saWNlbnNlLnBsYW5OYW1lID0gdGhpcy5saWNlbnNlLmdldFBsYW5OYW1lKCk7CiAgICAgICAgdGhpcy5zZXR0aW5ncy5saWNlbnNlLmNvbnN1bWVySWQgPSB0aGlzLmxpY2Vuc2UuZ2V0Q29uc3VtZXJJZCgpOwogICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5zZXR0aW5ncy5lbnRlcnByaXNlLCB7CiAgICAgICAgICAgIHNoYXJpbmc6IHRoaXMubGljZW5zZS5pc1NoYXJpbmdFbmFibGVkKCksCiAgICAgICAgICAgIGxvZ1N0cmVhbWluZzogdGhpcy5saWNlbnNlLmlzTG9nU3RyZWFtaW5nRW5hYmxlZCgpLAogICAgICAgICAgICBsZGFwOiB0aGlzLmxpY2Vuc2UuaXNMZGFwRW5hYmxlZCgpLAogICAgICAgICAgICBzYW1sOiB0aGlzLmxpY2Vuc2UuaXNTYW1sRW5hYmxlZCgpLAogICAgICAgICAgICBvaWRjOiB0aGlzLmxpY2Vuc2VTdGF0ZS5pc09pZGNMaWNlbnNlZCgpLAogICAgICAgICAgICBtZmFFbmZvcmNlbWVudDogdGhpcy5saWNlbnNlU3RhdGUuaXNNRkFFbmZvcmNlbWVudExpY2Vuc2VkKCksCiAgICAgICAgICAgIHByb3Zpc2lvbmluZzogZmFsc2UsCiAgICAgICAgICAgIGFkdmFuY2VkRXhlY3V0aW9uRmlsdGVyczogdGhpcy5saWNlbnNlLmlzQWR2YW5jZWRFeGVjdXRpb25GaWx0ZXJzRW5hYmxlZCgpLAogICAgICAgICAgICB2YXJpYWJsZXM6IHRoaXMubGljZW5zZS5pc1ZhcmlhYmxlc0VuYWJsZWQoKSwKICAgICAgICAgICAgc291cmNlQ29udHJvbDogdGhpcy5saWNlbnNlLmlzU291cmNlQ29udHJvbExpY2Vuc2VkKCksCiAgICAgICAgICAgIGV4dGVybmFsU2VjcmV0czogdGhpcy5saWNlbnNlLmlzRXh0ZXJuYWxTZWNyZXRzRW5hYmxlZCgpLAogICAgICAgICAgICBzaG93Tm9uUHJvZEJhbm5lcjogdGhpcy5saWNlbnNlLmlzTGljZW5zZWQoY29uc3RhbnRzXzEuTElDRU5TRV9GRUFUVVJFUy5TSE9XX05PTl9QUk9EX0JBTk5FUiksCiAgICAgICAgICAgIGRlYnVnSW5FZGl0b3I6IHRoaXMubGljZW5zZS5pc0RlYnVnSW5FZGl0b3JMaWNlbnNlZCgpLAogICAgICAgICAgICBiaW5hcnlEYXRhUzM6IGlzUzNBdmFpbGFibGUgJiYgaXNTM1NlbGVjdGVkICYmIGlzUzNMaWNlbnNlZCwKICAgICAgICAgICAgd29ya2VyVmlldzogdGhpcy5saWNlbnNlLmlzV29ya2VyVmlld0xpY2Vuc2VkKCksCiAgICAgICAgICAgIGFkdmFuY2VkUGVybWlzc2lvbnM6IHRoaXMubGljZW5zZS5pc0FkdmFuY2VkUGVybWlzc2lvbnNMaWNlbnNlZCgpLAogICAgICAgICAgICB3b3JrZmxvd0RpZmZzOiB0aGlzLmxpY2Vuc2VTdGF0ZS5pc1dvcmtmbG93RGlmZnNMaWNlbnNlZCgpLAogICAgICAgICAgICBuYW1lZFZlcnNpb25zOiB0aGlzLmxpY2Vuc2UuaXNMaWNlbnNlZChjb25zdGFudHNfMS5MSUNFTlNFX0ZFQVRVUkVTLk5BTUVEX1ZFUlNJT05TKSwKICAgICAgICAgICAgY3VzdG9tUm9sZXM6IHRoaXMubGljZW5zZVN0YXRlLmlzQ3VzdG9tUm9sZXNMaWNlbnNlZCgpLAogICAgICAgICAgICBwZXJzb25hbFNwYWNlUG9saWN5OiB0aGlzLmxpY2Vuc2VTdGF0ZS5pc1BlcnNvbmFsU3BhY2VQb2xpY3lMaWNlbnNlZCgpLAogICAgICAgICAgICBkYXRhUmVkYWN0aW9uOiB0aGlzLmxpY2Vuc2VTdGF0ZS5pc0RhdGFSZWRhY3Rpb25MaWNlbnNlZCgpLAogICAgICAgIH0pOwogICAgICAgIGlmICh0aGlzLmxpY2Vuc2UuaXNMZGFwRW5hYmxlZCgpKSB7CiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5zZXR0aW5ncy5zc28ubGRhcCwgewogICAgICAgICAgICAgICAgbG9naW5MYWJlbDogdGhpcy5nbG9iYWxDb25maWcuc3NvLmxkYXAubG9naW5MYWJlbCwKICAgICAgICAgICAgICAgIGxvZ2luRW5hYmxlZDogdGhpcy5nbG9iYWxDb25maWcuc3NvLmxkYXAubG9naW5FbmFibGVkLAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMubGljZW5zZS5pc1NhbWxFbmFibGVkKCkpIHsKICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLnNldHRpbmdzLnNzby5zYW1sLCB7CiAgICAgICAgICAgICAgICBsb2dpbkxhYmVsOiAoMCwgc3NvX2hlbHBlcnNfMS5nZXRTYW1sTG9naW5MYWJlbCkoKSwKICAgICAgICAgICAgICAgIGxvZ2luRW5hYmxlZDogdGhpcy5nbG9iYWxDb25maWcuc3NvLnNhbWwubG9naW5FbmFibGVkLAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMubGljZW5zZVN0YXRlLmlzT2lkY0xpY2Vuc2VkKCkpIHsKICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLnNldHRpbmdzLnNzby5vaWRjLCB7CiAgICAgICAgICAgICAgICBsb2dpbkVuYWJsZWQ6IHRoaXMuZ2xvYmFsQ29uZmlnLnNzby5vaWRjLmxvZ2luRW5hYmxlZCwKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLmxpY2Vuc2UuaXNWYXJpYWJsZXNFbmFibGVkKCkpIHsKICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy52YXJpYWJsZXMubGltaXQgPSB0aGlzLmxpY2Vuc2UuZ2V0VmFyaWFibGVzTGltaXQoKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuY29tbXVuaXR5UGFja2FnZXNTZXJ2aWNlKSB7CiAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MubWlzc2luZ1BhY2thZ2VzID0gdGhpcy5jb21tdW5pdHlQYWNrYWdlc1NlcnZpY2UuaGFzTWlzc2luZ1BhY2thZ2VzOwogICAgICAgIH0KICAgICAgICBpZiAoaXNBaUFzc2lzdGFudEVuYWJsZWQpIHsKICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy5haUFzc2lzdGFudC5lbmFibGVkID0gaXNBaUFzc2lzdGFudEVuYWJsZWQ7CiAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MuYWlBc3Npc3RhbnQuc2V0dXAgPQogICAgICAgICAgICAgICAgISF0aGlzLmdsb2JhbENvbmZpZy5haUFzc2lzdGFudC5iYXNlVXJsIHx8ICEhcHJvY2Vzcy5lbnYuTjhOX0FJX0FOVEhST1BJQ19LRVk7CiAgICAgICAgfQogICAgICAgIGlmIChpc0Fza0FpRW5hYmxlZCkgewogICAgICAgICAgICB0aGlzLnNldHRpbmdzLmFza0FpLmVuYWJsZWQgPSBpc0Fza0FpRW5hYmxlZDsKICAgICAgICB9CiAgICAgICAgaWYgKGlzQWlDcmVkaXRzRW5hYmxlZCkgewogICAgICAgICAgICB0aGlzLnNldHRpbmdzLmFpQ3JlZGl0cy5lbmFibGVkID0gaXNBaUNyZWRpdHNFbmFibGVkOwogICAgICAgICAgICB0aGlzLnNldHRpbmdzLmFpQ3JlZGl0cy5jcmVkaXRzID0gdGhpcy5saWNlbnNlLmdldEFpQ3JlZGl0cygpOwogICAgICAgICAgICB0aGlzLnNldHRpbmdzLmFpQ3JlZGl0cy5zZXR1cCA9ICEhdGhpcy5nbG9iYWxDb25maWcuYWlBc3Npc3RhbnQuYmFzZVVybDsKICAgICAgICB9CiAgICAgICAgaWYgKGlzQWlCdWlsZGVyRW5hYmxlZCkgewogICAgICAgICAgICB0aGlzLnNldHRpbmdzLmFpQnVpbGRlci5lbmFibGVkID0gaXNBaUJ1aWxkZXJFbmFibGVkOwogICAgICAgICAgICB0aGlzLnNldHRpbmdzLmFpQnVpbGRlci5zZXR1cCA9CiAgICAgICAgICAgICAgICAhIXRoaXMuZ2xvYmFsQ29uZmlnLmFpQXNzaXN0YW50LmJhc2VVcmwgfHwgISF0aGlzLmdsb2JhbENvbmZpZy5haUJ1aWxkZXIuYXBpS2V5OwogICAgICAgIH0KICAgICAgICB0aGlzLnNldHRpbmdzLm1mYS5lbmFibGVkID0gdGhpcy5nbG9iYWxDb25maWcubWZhLmVuYWJsZWQ7CiAgICAgICAgdGhpcy5zZXR0aW5ncy5tZmEuZW5mb3JjZWQgPSBhd2FpdCB0aGlzLm1mYVNlcnZpY2UuaXNNRkFFbmZvcmNlZCgpOwogICAgICAgIHRoaXMuc2V0dGluZ3MuZXhlY3V0aW9uTW9kZSA9IHRoaXMuZ2xvYmFsQ29uZmlnLmV4ZWN1dGlvbnMubW9kZTsKICAgICAgICB0aGlzLnNldHRpbmdzLmJpbmFyeURhdGFNb2RlID0gdGhpcy5iaW5hcnlEYXRhQ29uZmlnLm1vZGU7CiAgICAgICAgdGhpcy5zZXR0aW5ncy5lbnRlcnByaXNlLnByb2plY3RzLnRlYW0ubGltaXQgPSB0aGlzLmxpY2Vuc2UuZ2V0VGVhbVByb2plY3RMaW1pdCgpOwogICAgICAgIHRoaXMuc2V0dGluZ3MuZm9sZGVycy5lbmFibGVkID0gdGhpcy5saWNlbnNlLmlzRm9sZGVyc0VuYWJsZWQoKTsKICAgICAgICB0aGlzLnNldHRpbmdzLmV2YWx1YXRpb24ucXVvdGEgPSB0aGlzLmxpY2Vuc2VTdGF0ZS5nZXRNYXhXb3JrZmxvd3NXaXRoRXZhbHVhdGlvbnMoKTsKICAgICAgICB0aGlzLnNldHRpbmdzLmVudkZlYXR1cmVGbGFncyA9IHRoaXMuY29sbGVjdEVudkZlYXR1cmVGbGFncygpOwogICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzOwogICAgfQogICAgYXN5bmMgZ2V0UHVibGljU2V0dGluZ3MoaW5jbHVkZU1mYVNldHRpbmdzKSB7CiAgICAgICAgY29uc3QgeyBkZWZhdWx0TG9jYWxlLCB1c2VyTWFuYWdlbWVudDogeyBhdXRoZW50aWNhdGlvbk1ldGhvZCwgc2hvd1NldHVwT25GaXJzdExvYWQsIHNtdHBTZXR1cCB9LCBzc286IHsgc2FtbDogc3NvU2FtbCwgbGRhcDogc3NvTGRhcCwgb2lkYzogc3NvT2lkYyB9LCBhdXRoQ29va2llLCBwcmV2aWV3TW9kZSwgZW50ZXJwcmlzZTogeyBzYW1sLCBsZGFwLCBvaWRjIH0sIG1mYSwgY29tbXVuaXR5Tm9kZXNFbmFibGVkLCB9ID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5ncygpOwogICAgICAgIGNvbnN0IHB1YmxpY1NldHRpbmdzID0gewogICAgICAgICAgICBzZXR0aW5nc01vZGU6ICdwdWJsaWMnLAogICAgICAgICAgICBkZWZhdWx0TG9jYWxlLAogICAgICAgICAgICB1c2VyTWFuYWdlbWVudDogewogICAgICAgICAgICAgICAgYXV0aGVudGljYXRpb25NZXRob2QsCiAgICAgICAgICAgICAgICBzaG93U2V0dXBPbkZpcnN0TG9hZCwKICAgICAgICAgICAgICAgIHNtdHBTZXR1cCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc3NvOiB7CiAgICAgICAgICAgICAgICBzYW1sOiB7CiAgICAgICAgICAgICAgICAgICAgbG9naW5FbmFibGVkOiBzc29TYW1sLmxvZ2luRW5hYmxlZCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBsZGFwOiBzc29MZGFwLAogICAgICAgICAgICAgICAgb2lkYzogewogICAgICAgICAgICAgICAgICAgIGxvZ2luRW5hYmxlZDogc3NvT2lkYy5sb2dpbkVuYWJsZWQsCiAgICAgICAgICAgICAgICAgICAgbG9naW5Vcmw6IHNzb09pZGMubG9naW5VcmwsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBhdXRoQ29va2llLAogICAgICAgICAgICBwcmV2aWV3TW9kZSwKICAgICAgICAgICAgZW50ZXJwcmlzZTogeyBzYW1sLCBsZGFwLCBvaWRjIH0sCiAgICAgICAgICAgIGNvbW11bml0eU5vZGVzRW5hYmxlZCwKICAgICAgICB9OwogICAgICAgIGlmIChpbmNsdWRlTWZhU2V0dGluZ3MpIHsKICAgICAgICAgICAgcHVibGljU2V0dGluZ3MubWZhID0gbWZhOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcHVibGljU2V0dGluZ3M7CiAgICB9CiAgICBnZXRNb2R1bGVTZXR0aW5ncygpIHsKICAgICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKHRoaXMubW9kdWxlUmVnaXN0cnkuc2V0dGluZ3MpOwogICAgfQogICAgZ2V0Tm9kZVZlcnNpb25JZGVudGlmaWVycyhub2RlcykgewogICAgICAgIGNvbnN0IGlkZW50aWZpZXJzID0gbmV3IFNldCgpOwogICAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2RlcykgewogICAgICAgICAgICBpZiAoIW5vZGU/Lm5hbWUgfHwgbm9kZS52ZXJzaW9uID09PSB1bmRlZmluZWQpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgY29uc3QgdmVyc2lvbnMgPSBBcnJheS5pc0FycmF5KG5vZGUudmVyc2lvbikgPyBub2RlLnZlcnNpb24gOiBbbm9kZS52ZXJzaW9uXTsKICAgICAgICAgICAgZm9yIChjb25zdCB2ZXJzaW9uIG9mIHZlcnNpb25zKSB7CiAgICAgICAgICAgICAgICBpZiAodmVyc2lvbiA9PT0gdW5kZWZpbmVkKQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgaWRlbnRpZmllcnMuYWRkKGAke25vZGUubmFtZX1AJHtTdHJpbmcodmVyc2lvbil9YCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oaWRlbnRpZmllcnMpOwogICAgfQogICAgYXN5bmMgd3JpdGVTdGF0aWNKU09OKG5hbWUsIGRhdGEpIHsKICAgICAgICBjb25zdCB7IHN0YXRpY0NhY2hlRGlyIH0gPSB0aGlzLmluc3RhbmNlU2V0dGluZ3M7CiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoXzEuZGVmYXVsdC5qb2luKHN0YXRpY0NhY2hlRGlyLCBgdHlwZXMvJHtuYW1lfS5qc29uYCk7CiAgICAgICAgY29uc3Qgc3RyZWFtID0gKDAsIGZzXzEuY3JlYXRlV3JpdGVTdHJlYW0pKGZpbGVQYXRoLCAndXRmLTgnKTsKICAgICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgICBzdHJlYW0ub24oJ2Vycm9yJywgcmVqZWN0KTsKICAgICAgICAgICAgc3RyZWFtLm9uKCdmaW5pc2gnLCByZXNvbHZlKTsKICAgICAgICAgICAgc3RyZWFtLndyaXRlKCdbXG4nKTsKICAgICAgICAgICAgZGF0YS5mb3JFYWNoKChlbnRyeSwgaW5kZXgpID0+IHsKICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZShKU09OLnN0cmluZ2lmeShlbnRyeSkpOwogICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSBkYXRhLmxlbmd0aCAtIDEpCiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLndyaXRlKCcsJyk7CiAgICAgICAgICAgICAgICBzdHJlYW0ud3JpdGUoJ1xuJyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBzdHJlYW0ud3JpdGUoJ11cbicpOwogICAgICAgICAgICBzdHJlYW0uZW5kKCk7CiAgICAgICAgfSk7CiAgICB9CiAgICBvdmVyd3JpdGVDcmVkZW50aWFsc1Byb3BlcnRpZXMoKSB7CiAgICAgICAgY29uc3QgeyBjcmVkZW50aWFscyB9ID0gdGhpcy5sb2FkTm9kZXNBbmRDcmVkZW50aWFscy50eXBlczsKICAgICAgICBjb25zdCBjcmVkZW50aWFsc092ZXJ3cml0ZXMgPSB0aGlzLmNyZWRlbnRpYWxzT3ZlcndyaXRlcy5nZXRBbGwoKTsKICAgICAgICBjb25zdCB7IHNraXBUeXBlcyB9ID0gdGhpcy5nbG9iYWxDb25maWcuY3JlZGVudGlhbHMub3ZlcndyaXRlOwogICAgICAgIGZvciAoY29uc3QgY3JlZGVudGlhbCBvZiBjcmVkZW50aWFscykgewogICAgICAgICAgICBkZWxldGUgY3JlZGVudGlhbC5fX292ZXJ3cml0dGVuUHJvcGVydGllczsKICAgICAgICAgICAgZGVsZXRlIGNyZWRlbnRpYWwuX19za2lwTWFuYWdlZENyZWF0aW9uOwogICAgICAgICAgICBjb25zdCBvdmVyd3JpdHRlblByb3BlcnRpZXMgPSBbXTsKICAgICAgICAgICAgdGhpcy5jcmVkZW50aWFsVHlwZXMKICAgICAgICAgICAgICAgIC5nZXRQYXJlbnRUeXBlcyhjcmVkZW50aWFsLm5hbWUpCiAgICAgICAgICAgICAgICAucmV2ZXJzZSgpCiAgICAgICAgICAgICAgICAubWFwKChuYW1lKSA9PiBjcmVkZW50aWFsc092ZXJ3cml0ZXNbbmFtZV0pCiAgICAgICAgICAgICAgICAuZm9yRWFjaCgob3ZlcndyaXRlKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAob3ZlcndyaXRlKQogICAgICAgICAgICAgICAgICAgIG92ZXJ3cml0dGVuUHJvcGVydGllcy5wdXNoKC4uLk9iamVjdC5rZXlzKG92ZXJ3cml0ZSkpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaWYgKGNyZWRlbnRpYWwubmFtZSBpbiBjcmVkZW50aWFsc092ZXJ3cml0ZXMpIHsKICAgICAgICAgICAgICAgIG92ZXJ3cml0dGVuUHJvcGVydGllcy5wdXNoKC4uLk9iamVjdC5rZXlzKGNyZWRlbnRpYWxzT3ZlcndyaXRlc1tjcmVkZW50aWFsLm5hbWVdKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG92ZXJ3cml0dGVuUHJvcGVydGllcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIGNyZWRlbnRpYWwuX19vdmVyd3JpdHRlblByb3BlcnRpZXMgPSAoMCwgdW5pcV8xLmRlZmF1bHQpKG92ZXJ3cml0dGVuUHJvcGVydGllcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNraXBUeXBlcy5pbmNsdWRlcyhjcmVkZW50aWFsLm5hbWUpKSB7CiAgICAgICAgICAgICAgICBjcmVkZW50aWFsLl9fc2tpcE1hbmFnZWRDcmVhdGlvbiA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn07CmV4cG9ydHMuRnJvbnRlbmRTZXJ2aWNlID0gRnJvbnRlbmRTZXJ2aWNlOwpleHBvcnRzLkZyb250ZW5kU2VydmljZSA9IEZyb250ZW5kU2VydmljZSA9IF9fZGVjb3JhdGUoWwogICAgKDAsIGRpXzEuU2VydmljZSkoKSwKICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW2NvbmZpZ18xLkdsb2JhbENvbmZpZywKICAgICAgICBiYWNrZW5kX2NvbW1vbl8xLkxvZ2dlciwKICAgICAgICBsb2FkX25vZGVzX2FuZF9jcmVkZW50aWFsc18xLkxvYWROb2Rlc0FuZENyZWRlbnRpYWxzLAogICAgICAgIGNyZWRlbnRpYWxfdHlwZXNfMS5DcmVkZW50aWFsVHlwZXMsCiAgICAgICAgY3JlZGVudGlhbHNfb3ZlcndyaXRlc18xLkNyZWRlbnRpYWxzT3ZlcndyaXRlcywKICAgICAgICBsaWNlbnNlXzEuTGljZW5zZSwKICAgICAgICBlbWFpbF8xLlVzZXJNYW5hZ2VtZW50TWFpbGVyLAogICAgICAgIG44bl9jb3JlXzEuSW5zdGFuY2VTZXR0aW5ncywKICAgICAgICB1cmxfc2VydmljZV8xLlVybFNlcnZpY2UsCiAgICAgICAgY29uZmlnXzEuU2VjdXJpdHlDb25maWcsCiAgICAgICAgcHVzaF9jb25maWdfMS5QdXNoQ29uZmlnLAogICAgICAgIG44bl9jb3JlXzEuQmluYXJ5RGF0YUNvbmZpZywKICAgICAgICBiYWNrZW5kX2NvbW1vbl8xLkxpY2Vuc2VTdGF0ZSwKICAgICAgICBiYWNrZW5kX2NvbW1vbl8xLk1vZHVsZVJlZ2lzdHJ5LAogICAgICAgIG1mYV9zZXJ2aWNlXzEuTWZhU2VydmljZSwKICAgICAgICBvd25lcnNoaXBfc2VydmljZV8xLk93bmVyc2hpcFNlcnZpY2UsCiAgICAgICAgYWlfdXNhZ2Vfc2VydmljZV8xLkFpVXNhZ2VTZXJ2aWNlXSkKXSwgRnJvbnRlbmRTZXJ2aWNlKTsNCg==
9
+ " | base64 -d > /usr/local/lib/node_modules/n8n/dist/services/frontend.service.js
10
 
11
+ RUN printf '%s' "77u/InVzZSBzdHJpY3QiOwp2YXIgX19kZWNvcmF0ZSA9ICh0aGlzICYmIHRoaXMuX19kZWNvcmF0ZSkgfHwgZnVuY3Rpb24gKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7CiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkOwogICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAib2JqZWN0IiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gImZ1bmN0aW9uIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpOwogICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjsKICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7Cn07Ck9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CmV4cG9ydHMuTGljZW5zZVN0YXRlID0gdm9pZCAwOwpjb25zdCBjb25zdGFudHNfMSA9IHJlcXVpcmUoIkBuOG4vY29uc3RhbnRzIik7CmNvbnN0IGRpXzEgPSByZXF1aXJlKCJAbjhuL2RpIik7CmNvbnN0IG44bl93b3JrZmxvd18xID0gcmVxdWlyZSgibjhuLXdvcmtmbG93Iik7CmNsYXNzIFByb3ZpZGVyTm90U2V0RXJyb3IgZXh0ZW5kcyBuOG5fd29ya2Zsb3dfMS5VbmV4cGVjdGVkRXJyb3IgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoJ0Nhbm5vdCBxdWVyeSBsaWNlbnNlIHN0YXRlIGJlY2F1c2UgbGljZW5zZSBwcm92aWRlciBoYXMgbm90IGJlZW4gc2V0Jyk7CiAgICB9Cn0KbGV0IExpY2Vuc2VTdGF0ZSA9IGNsYXNzIExpY2Vuc2VTdGF0ZSB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLmxpY2Vuc2VQcm92aWRlciA9IG51bGw7CiAgICB9CiAgICBzZXRMaWNlbnNlUHJvdmlkZXIocHJvdmlkZXIpIHsKICAgICAgICB0aGlzLmxpY2Vuc2VQcm92aWRlciA9IHByb3ZpZGVyOwogICAgfQogICAgYXNzZXJ0UHJvdmlkZXIoKSB7CiAgICAgICAgaWYgKCF0aGlzLmxpY2Vuc2VQcm92aWRlcikKICAgICAgICAgICAgdGhyb3cgbmV3IFByb3ZpZGVyTm90U2V0RXJyb3IoKTsKICAgIH0KICAgIGlzTGljZW5zZWQoZmVhdHVyZSkgewogICAgICAgIHRoaXMuYXNzZXJ0UHJvdmlkZXIoKTsKICAgICAgICBpZiAodHlwZW9mIGZlYXR1cmUgPT09ICdzdHJpbmcnKQogICAgICAgICAgICByZXR1cm4gdGhpcy5saWNlbnNlUHJvdmlkZXIuaXNMaWNlbnNlZChmZWF0dXJlKTsKICAgICAgICBmb3IgKGNvbnN0IGZlYXR1cmVOYW1lIG9mIGZlYXR1cmUpIHsKICAgICAgICAgICAgaWYgKHRoaXMubGljZW5zZVByb3ZpZGVyLmlzTGljZW5zZWQoZmVhdHVyZU5hbWUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBnZXRWYWx1ZShmZWF0dXJlKSB7CiAgICAgICAgdGhpcy5hc3NlcnRQcm92aWRlcigpOwogICAgICAgIHJldHVybiB0aGlzLmxpY2Vuc2VQcm92aWRlci5nZXRWYWx1ZShmZWF0dXJlKTsKICAgIH0KICAgIGlzQ3VzdG9tUm9sZXNMaWNlbnNlZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5pc0xpY2Vuc2VkKGNvbnN0YW50c18xLkxJQ0VOU0VfRkVBVFVSRVMuQ1VTVE9NX1JPTEVTKTsKICAgIH0KICAgIGlzRHluYW1pY0NyZWRlbnRpYWxzTGljZW5zZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNMaWNlbnNlZChjb25zdGFudHNfMS5MSUNFTlNFX0ZFQVRVUkVTLkRZTkFNSUNfQ1JFREVOVElBTFMpOwogICAgfQogICAgaXNQZXJzb25hbFNwYWNlUG9saWN5TGljZW5zZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNMaWNlbnNlZChjb25zdGFudHNfMS5MSUNFTlNFX0ZFQVRVUkVTLlBFUlNPTkFMX1NQQUNFX1BPTElDWSk7CiAgICB9CiAgICBpc1NoYXJpbmdMaWNlbnNlZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5pc0xpY2Vuc2VkKCdmZWF0OnNoYXJpbmcnKTsKICAgIH0KICAgIGlzTG9nU3RyZWFtaW5nTGljZW5zZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNMaWNlbnNlZCgnZmVhdDpsb2dTdHJlYW1pbmcnKTsKICAgIH0KICAgIGlzTGRhcExpY2Vuc2VkKCkgewogICAgICAgIHJldHVybiB0aGlzLmlzTGljZW5zZWQoJ2ZlYXQ6bGRhcCcpOwogICAgfQogICAgaXNTYW1sTGljZW5zZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNMaWNlbnNlZCgnZmVhdDpzYW1sJyk7CiAgICB9CiAgICBpc09pZGNMaWNlbnNlZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5pc0xpY2Vuc2VkKCdmZWF0Om9pZGMnKTsKICAgIH0KICAgIGlzTUZBRW5mb3JjZW1lbnRMaWNlbnNlZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5pc0xpY2Vuc2VkKCdmZWF0Om1mYUVuZm9yY2VtZW50Jyk7CiAgICB9CiAgICBpc0FwaUtleVNjb3Blc0xpY2Vuc2VkKCkgewogICAgICAgIHJldHVybiB0aGlzLmlzTGljZW5zZWQoJ2ZlYXQ6YXBpS2V5U2NvcGVzJyk7CiAgICB9CiAgICBpc0FpQXNzaXN0YW50TGljZW5zZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNMaWNlbnNlZCgnZmVhdDphaUFzc2lzdGFudCcpOwogICAgfQogICAgaXNBc2tBaUxpY2Vuc2VkKCkgewogICAgICAgIHJldHVybiB0aGlzLmlzTGljZW5zZWQoJ2ZlYXQ6YXNrQWknKTsKICAgIH0KICAgIGlzQWlDcmVkaXRzTGljZW5zZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNMaWNlbnNlZCgnZmVhdDphaUNyZWRpdHMnKTsKICAgIH0KICAgIGlzQWR2YW5jZWRFeGVjdXRpb25GaWx0ZXJzTGljZW5zZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNMaWNlbnNlZCgnZmVhdDphZHZhbmNlZEV4ZWN1dGlvbkZpbHRlcnMnKTsKICAgIH0KICAgIGlzQWR2YW5jZWRQZXJtaXNzaW9uc0xpY2Vuc2VkKCkgewogICAgICAgIHJldHVybiB0aGlzLmlzTGljZW5zZWQoJ2ZlYXQ6YWR2YW5jZWRQZXJtaXNzaW9ucycpOwogICAgfQogICAgaXNEZWJ1Z0luRWRpdG9yTGljZW5zZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNMaWNlbnNlZCgnZmVhdDpkZWJ1Z0luRWRpdG9yJyk7CiAgICB9CiAgICBpc0JpbmFyeURhdGFTM0xpY2Vuc2VkKCkgewogICAgICAgIHJldHVybiB0aGlzLmlzTGljZW5zZWQoJ2ZlYXQ6YmluYXJ5RGF0YVMzJyk7CiAgICB9CiAgICBpc011bHRpTWFpbkxpY2Vuc2VkKCkgewogICAgICAgIHJldHVybiB0aGlzLmlzTGljZW5zZWQoJ2ZlYXQ6bXVsdGlwbGVNYWluSW5zdGFuY2VzJyk7CiAgICB9CiAgICBpc1ZhcmlhYmxlc0xpY2Vuc2VkKCkgewogICAgICAgIHJldHVybiB0aGlzLmlzTGljZW5zZWQoJ2ZlYXQ6dmFyaWFibGVzJyk7CiAgICB9CiAgICBpc1NvdXJjZUNvbnRyb2xMaWNlbnNlZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5pc0xpY2Vuc2VkKCdmZWF0OnNvdXJjZUNvbnRyb2wnKTsKICAgIH0KICAgIGlzRXh0ZXJuYWxTZWNyZXRzTGljZW5zZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNMaWNlbnNlZCgnZmVhdDpleHRlcm5hbFNlY3JldHMnKTsKICAgIH0KICAgIGlzQVBJRGlzYWJsZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNMaWNlbnNlZCgnZmVhdDphcGlEaXNhYmxlZCcpOwogICAgfQogICAgaXNXb3JrZXJWaWV3TGljZW5zZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNMaWNlbnNlZCgnZmVhdDp3b3JrZXJWaWV3Jyk7CiAgICB9CiAgICBpc1Byb2plY3RSb2xlQWRtaW5MaWNlbnNlZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5pc0xpY2Vuc2VkKCdmZWF0OnByb2plY3RSb2xlOmFkbWluJyk7CiAgICB9CiAgICBpc1Byb2plY3RSb2xlRWRpdG9yTGljZW5zZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNMaWNlbnNlZCgnZmVhdDpwcm9qZWN0Um9sZTplZGl0b3InKTsKICAgIH0KICAgIGlzUHJvamVjdFJvbGVWaWV3ZXJMaWNlbnNlZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5pc0xpY2Vuc2VkKCdmZWF0OnByb2plY3RSb2xlOnZpZXdlcicpOwogICAgfQogICAgaXNDdXN0b21OcG1SZWdpc3RyeUxpY2Vuc2VkKCkgewogICAgICAgIHJldHVybiB0aGlzLmlzTGljZW5zZWQoJ2ZlYXQ6Y29tbXVuaXR5Tm9kZXM6Y3VzdG9tUmVnaXN0cnknKTsKICAgIH0KICAgIGlzRm9sZGVyc0xpY2Vuc2VkKCkgewogICAgICAgIHJldHVybiB0aGlzLmlzTGljZW5zZWQoJ2ZlYXQ6Zm9sZGVycycpOwogICAgfQogICAgaXNJbnNpZ2h0c1N1bW1hcnlMaWNlbnNlZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5pc0xpY2Vuc2VkKCdmZWF0Omluc2lnaHRzOnZpZXdTdW1tYXJ5Jyk7CiAgICB9CiAgICBpc0luc2lnaHRzRGFzaGJvYXJkTGljZW5zZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNMaWNlbnNlZCgnZmVhdDppbnNpZ2h0czp2aWV3RGFzaGJvYXJkJyk7CiAgICB9CiAgICBpc0luc2lnaHRzSG91cmx5RGF0YUxpY2Vuc2VkKCkgewogICAgICAgIHJldHVybiB0aGlzLmlzTGljZW5zZWQoJ2ZlYXQ6aW5zaWdodHM6dmlld0hvdXJseURhdGEnKTsKICAgIH0KICAgIGlzV29ya2Zsb3dEaWZmc0xpY2Vuc2VkKCkgewogICAgICAgIHJldHVybiB0aGlzLmlzTGljZW5zZWQoJ2ZlYXQ6d29ya2Zsb3dEaWZmcycpOwogICAgfQogICAgaXNEYXRhUmVkYWN0aW9uTGljZW5zZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNMaWNlbnNlZChjb25zdGFudHNfMS5MSUNFTlNFX0ZFQVRVUkVTLkRBVEFfUkVEQUNUSU9OKTsKICAgIH0KICAgIGlzUHJvdmlzaW9uaW5nTGljZW5zZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNMaWNlbnNlZChbJ2ZlYXQ6c2FtbCcsICdmZWF0Om9pZGMnXSk7CiAgICB9CiAgICBnZXRNYXhVc2VycygpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZSgncXVvdGE6dXNlcnMnKSA/PyBjb25zdGFudHNfMS5VTkxJTUlURURfTElDRU5TRV9RVU9UQTsKICAgIH0KICAgIGdldE1heEFjdGl2ZVdvcmtmbG93cygpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZSgncXVvdGE6YWN0aXZlV29ya2Zsb3dzJykgPz8gY29uc3RhbnRzXzEuVU5MSU1JVEVEX0xJQ0VOU0VfUVVPVEE7CiAgICB9CiAgICBnZXRNYXhWYXJpYWJsZXMoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWUoJ3F1b3RhOm1heFZhcmlhYmxlcycpID8/IGNvbnN0YW50c18xLlVOTElNSVRFRF9MSUNFTlNFX1FVT1RBOwogICAgfQogICAgZ2V0TWF4QWlDcmVkaXRzKCkgewogICAgICAgIHJldHVybiB0aGlzLmdldFZhbHVlKCdxdW90YTphaUNyZWRpdHMnKSA/PyAwOwogICAgfQogICAgZ2V0V29ya2Zsb3dIaXN0b3J5UHJ1bmVRdW90YSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZSgncXVvdGE6d29ya2Zsb3dIaXN0b3J5UHJ1bmUnKSA/PyBjb25zdGFudHNfMS5VTkxJTUlURURfTElDRU5TRV9RVU9UQTsKICAgIH0KICAgIGdldEluc2lnaHRzTWF4SGlzdG9yeSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZSgncXVvdGE6aW5zaWdodHM6bWF4SGlzdG9yeURheXMnKSA/PyA3OwogICAgfQogICAgZ2V0SW5zaWdodHNSZXRlbnRpb25NYXhBZ2UoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWUoJ3F1b3RhOmluc2lnaHRzOnJldGVudGlvbjptYXhBZ2VEYXlzJykgPz8gMTgwOwogICAgfQogICAgZ2V0SW5zaWdodHNSZXRlbnRpb25QcnVuZUludGVydmFsKCkgewogICAgICAgIHJldHVybiB0aGlzLmdldFZhbHVlKCdxdW90YTppbnNpZ2h0czpyZXRlbnRpb246cHJ1bmVJbnRlcnZhbERheXMnKSA/PyAyNDsKICAgIH0KICAgIGdldE1heFRlYW1Qcm9qZWN0cygpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZSgncXVvdGE6bWF4VGVhbVByb2plY3RzJykgPz8gMDsKICAgIH0KICAgIGdldE1heFdvcmtmbG93c1dpdGhFdmFsdWF0aW9ucygpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZSgncXVvdGE6ZXZhbHVhdGlvbnM6bWF4V29ya2Zsb3dzJykgPz8gMDsKICAgIH0KfTsKZXhwb3J0cy5MaWNlbnNlU3RhdGUgPSBMaWNlbnNlU3RhdGU7CmV4cG9ydHMuTGljZW5zZVN0YXRlID0gTGljZW5zZVN0YXRlID0gX19kZWNvcmF0ZShbCiAgICAoMCwgZGlfMS5TZXJ2aWNlKSgpCl0sIExpY2Vuc2VTdGF0ZSk7DQo=
12
+ " | base64 -d > /usr/local/lib/node_modules/n8n/node_modules/.pnpm/@n8n+backend-common@file+packages+@n8n+backend-common/node_modules/@n8n/backend-common/dist/license-state.js
13
 
14
  USER node