{"remainingRequest":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!D:\\jenkins\\workspace\\dataShare-fvue\\src\\components\\mindMap\\index.vue?vue&type=script&lang=js","dependencies":[{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\src\\components\\mindMap\\index.vue","mtime":1739300167374},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\babel-loader\\lib\\index.js","mtime":456789000000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\vue-loader\\lib\\index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:Ly8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KDQppbXBvcnQgZG9tdG9pbWFnZSBmcm9tICdkb20tdG8taW1hZ2UnOw0KaW1wb3J0IHV0aWxzIGZyb20gJ0AvdXRpbHMuanMnOw0KaW1wb3J0ICdqc21pbmQvc3R5bGUvanNtaW5kLmNzcyc7DQppbXBvcnQgJ2pzbWluZC9lczYvanNtaW5kLmRyYWdnYWJsZS1ub2RlLmpzJzsNCmltcG9ydCAnanNtaW5kL2VzNi9qc21pbmQuc2NyZWVuc2hvdC5qcyc7DQppbXBvcnQganNNaW5kIGZyb20gJ2pzbWluZCc7DQppbXBvcnQgQVBJIGZyb20gJ0AvYXBpL2J1c2luZXNzL2FyaXRobWV0aWNUYXNrLmpzJzsNCmltcG9ydCB7IHZlcnNpb24gfSBmcm9tICdjb2RlbWlycm9yJzsNCmV4cG9ydCBkZWZhdWx0IHsNCiAgbmFtZTogJ21pbmRNYXAnLA0KICBkYXRhKCkgew0KICAgIHJldHVybiB7DQogICAgICAvLyDku7vliqHkv6Hmga8NCiAgICAgIHRhc2tEYXRhOiB7DQogICAgICAgIGlkOiAnJywNCiAgICAgICAgbmFtZTogJycsDQogICAgICAgIGNvZGU6ICcnLA0KICAgICAgfSwNCiAgICAgIG5ld1ZlcnNpb246ICcnLA0KICAgICAgLy8g6YWN572u5L+h5oGvDQogICAgICBzaG93U2lkZUVkaXRvcjogZmFsc2UsDQogICAgICBwYWdpbmF0aW9uOiB7DQogICAgICAgIC8vIOWIhumhteWIneWni+WMluaVsOaNrg0KICAgICAgICBwYWdlOiAxLA0KICAgICAgICB0b3RhbDogMCwNCiAgICAgICAgcGFnZVNpemU6IDIwLA0KICAgICAgfSwNCiAgICAgIHNlYXJjaFRhcmdldDogew0KICAgICAgICB0eXBlOiAxLA0KICAgICAgICBuYW1lOiAnJywNCiAgICAgIH0sDQogICAgICBhZGRUYXJnZXQ6IHsNCiAgICAgICAgdG9waWM6ICcnLA0KICAgICAgICBjb2RlOiAnJywNCiAgICAgICAgdHlwZTogMSwNCiAgICAgICAgZGVzYzogJycsDQogICAgICAgIHNvdXJjZTogMSwNCiAgICAgIH0sDQogICAgICBhY3RpdmVOYW1lOiAnZmlyc3QnLA0KICAgICAgdGFibGVMaXN0OiBbDQogICAgICAgIHsNCiAgICAgICAgICBpZDogJzEuMicsDQogICAgICAgICAgbmFtZTogJ3RhYmxlMDEnLA0KICAgICAgICAgIG5hbWVDbjogJ+ihqOS4reaWh+WQjTAxJywNCiAgICAgICAgfSwNCiAgICAgICAgew0KICAgICAgICAgIGlkOiAnMS4zJywNCiAgICAgICAgICBuYW1lOiAndGFibGUwMicsDQogICAgICAgICAgbmFtZUNuOiAn6KGo5Lit5paH5ZCNMDInLA0KICAgICAgICB9LA0KICAgICAgICB7DQogICAgICAgICAgaWQ6ICcxLjQnLA0KICAgICAgICAgIG5hbWU6ICd0YWJsZTAzJywNCiAgICAgICAgICBuYW1lQ246ICfooajkuK3mloflkI0wMycsDQogICAgICAgIH0sDQogICAgICBdLA0KICAgICAgZmllbGRMaXN0OiBbDQogICAgICAgIHsNCiAgICAgICAgICBpZDogJzEuMicsDQogICAgICAgICAgbmFtZTogJ25hbWUnLA0KICAgICAgICAgIG5hbWVDbjogJ+Wnk+WQjScsDQogICAgICAgICAgdHlwZTogJ+aZrumAmuWtl+autScsDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICBpZDogJzEuMycsDQogICAgICAgICAgbmFtZTogJ3NleCcsDQogICAgICAgICAgbmFtZUNuOiAn5oCn5YirJywNCiAgICAgICAgICB0eXBlOiAn5p6a5Li+5a2X5YW4JywNCiAgICAgICAgICBkaWN0TmFtZTogJ3NleERpY3QnLA0KICAgICAgICAgIGRpY3Q6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgbmFtZTogJ+eUtycsDQogICAgICAgICAgICAgIGlkOiAnMScsDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICBuYW1lOiAn5aWzJywNCiAgICAgICAgICAgICAgaWQ6ICcyJywNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgXSwNCiAgICAgICAgfSwNCiAgICAgICAgew0KICAgICAgICAgIGlkOiAnMS40JywNCiAgICAgICAgICBuYW1lOiAndHlwZScsDQogICAgICAgICAgbmFtZUNuOiAn57G75Z6LJywNCiAgICAgICAgICB0eXBlOiAn5aSa57u05a2X5YW4JywNCiAgICAgICAgICBkaWN0TmFtZTogJ3Nwb3J0c0RpY3QnLA0KICAgICAgICAgIGRpY3Q6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgbmFtZTogJ+i/kOWKqCcsDQogICAgICAgICAgICAgIGlkOiAnMScsDQogICAgICAgICAgICAgIGNoaWxkcmVuOiBbDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgbmFtZTogJ+awtOS4iui/kOWKqOawtOS4iui/kOWKqOawtOS4iui/kOWKqOawtOS4iui/kOWKqOawtOS4iui/kOWKqOawtOS4iui/kOWKqOawtOS4iui/kOWKqOawtOS4iui/kOWKqOawtOS4iui/kOWKqOawtOS4iui/kOWKqOawtOS4iui/kOWKqOawtOS4iui/kOWKqCcsDQogICAgICAgICAgICAgICAgICBpZDogJzExJywNCiAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAn6LWb6ImHJywNCiAgICAgICAgICAgICAgICAgICAgICBpZDogJzExMScsDQogICAgICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAn57+75p2/JywNCiAgICAgICAgICAgICAgICAgICAgICBpZDogJzExMicsDQogICAgICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAn55qu5YiS6ImHJywNCiAgICAgICAgICAgICAgICAgICAgICBpZDogJzExMycsDQogICAgICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgICBdLA0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgbmFtZTogJ+WGrOWto+i/kOWKqCcsDQogICAgICAgICAgICAgICAgICBpZDogJzEyJywNCiAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAn5Yaw5aO2JywNCiAgICAgICAgICAgICAgICAgICAgICBpZDogJzEyMScsDQogICAgICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAn6Iqx5qC35ruR5YawJywNCiAgICAgICAgICAgICAgICAgICAgICBpZDogJzEyMicsDQogICAgICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAn55+t6YGT6YCf5ruRJywNCiAgICAgICAgICAgICAgICAgICAgICBpZDogJzEyMycsDQogICAgICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgICBdLA0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgbmFtZTogJ+eQg+exu+i/kOWKqCcsDQogICAgICAgICAgICAgICAgICBpZDogJzEzJywNCiAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAn56+u55CDJywNCiAgICAgICAgICAgICAgICAgICAgICBpZDogJzEzMScsDQogICAgICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAn6Laz55CDJywNCiAgICAgICAgICAgICAgICAgICAgICBpZDogJzEzMicsDQogICAgICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAn5puy5qON55CDJywNCiAgICAgICAgICAgICAgICAgICAgICBpZDogJzEzMycsDQogICAgICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgICBdLA0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgIF0sDQogICAgICAgICAgICB9LA0KICAgICAgICAgIF0sDQogICAgICAgIH0sDQogICAgICBdLA0KICAgICAgZGVmYXVsdFByb3BzOiB7DQogICAgICAgIHZhbHVlOiAnaWQnLA0KICAgICAgICBsYWJlbDogJ25hbWUnLA0KICAgICAgfSwNCiAgICAgIHZlcnNpb25EYXRhOiBbXSwNCiAgICAgIG1hcFR5cGU6ICdtdWx0aVRvU2luZ2xlJywgLy9tdWx0aVRvU2luZ2xlIG9yIHNpbmdsZVRvTXVsdGkNCiAgICAgIHRhcmdldERhdGE6IFtdLA0KICAgICAgLy8g6ISR5Zu+5L+h5oGvDQogICAgICAvLyDohJHlm77mlbDmja4NCiAgICAgIGptOiBudWxsLA0KICAgICAgZWRpdG9yOiBudWxsLA0KICAgICAgbWluZERhdGE6IHsNCiAgICAgICAgbWV0YTogew0KICAgICAgICAgIG5hbWU6ICcnLA0KICAgICAgICAgIGF1dGhvcjogJ2FydGZlc3MnLA0KICAgICAgICAgIHZlcnNpb246ICcwLjAuMScsDQogICAgICAgIH0sDQogICAgICAgIGZvcm1hdDogJ25vZGVfYXJyYXknLA0KICAgICAgICBkYXRhOiBbDQogICAgICAgICAgew0KICAgICAgICAgICAgaXNyb290OiB0cnVlLA0KICAgICAgICAgICAgaWQ6IHV0aWxzLnV1aWQoKSwNCiAgICAgICAgICAgIHRvcGljOiAnJywNCiAgICAgICAgICAgIGxldmVsOiAwLA0KICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAnIzQwOWVmZicsDQogICAgICAgICAgICAnZm9udC1zaXplJzogMjQsIC8vIOWtl+S9k+Wkp+Wwjw0KICAgICAgICAgIH0sDQogICAgICAgIF0sDQogICAgICB9LA0KICAgICAgLy8g6ISR5Zu+6YWN572uDQogICAgICBvcHRpb25zOiB7DQogICAgICAgIGNvbnRhaW5lcjogJ2pzbWluZF9jb250YWluZXInLCAvLyBb5b+F6YCJXSDlrrnlmajnmoRJRA0KICAgICAgICBlZGl0YWJsZTogdHJ1ZSwgLy8gW+WPr+mAiV0g5piv5ZCm5ZCv55So57yW6L6RDQogICAgICAgIHRoZW1lOiAncHJpbWFyeScsIC8vIFvlj6/pgIldIOS4u+mimA0KICAgICAgICBzdXBwb3J0X2h0bWw6IHRydWUsDQogICAgICAgIGxvZ19sZXZlbDogJ2RlYnVnJywgLy8g6K6+572u5pel5b+X57qn5Yir5Li6IGRlYnVnDQogICAgICAgIHZpZXc6IHsNCiAgICAgICAgICBlbmdpbmU6ICdjYW52YXMnLCAvLyDmgJ3nu7Tlr7zlm77lkIToioLngrnkuYvpl7Tnur/mnaHnmoTnu5jliLblvJXmk44NCiAgICAgICAgICBlbmFibGVfZGV2aWNlX3BpeGVsX3JhdGlvOiB0cnVlLCAvLyDmjInorr7lpIflg4/ntKDmr5Tkvovnu5jliLbpq5jmuIXmgJ3nu7Tlr7zlm74NCiAgICAgICAgICBobWFyZ2luOiAxMDAsIC8vIOaAnee7tOWvvOWbvui3neWuueWZqOWkluahhueahOacgOWwj+awtOW5s+i3neemuw0KICAgICAgICAgIHZtYXJnaW46IDUwLCAvLyDmgJ3nu7Tlr7zlm77ot53lrrnlmajlpJbmoYbnmoTmnIDlsI/lnoLnm7Tot53nprsNCiAgICAgICAgICBsaW5lX3dpZHRoOiAyLCAvLyDmgJ3nu7Tlr7zlm77nur/mnaHnmoTnspfnu4YNCiAgICAgICAgICBsaW5lX2NvbG9yOiAnIzY2NicsIC8vIOaAnee7tOWvvOWbvue6v+adoeeahOminOiJsg0KICAgICAgICAgIGRyYWdnYWJsZTogdHJ1ZSwgLy8g5piv5ZCm5YWB6K645ouW5Yqo55S75biDDQogICAgICAgICAgaGlkZV9zY3JvbGxiYXJzX3doZW5fZHJhZ2dhYmxlOiB0cnVlLA0KICAgICAgICAgIG5vZGVfb3ZlcmZsb3c6ICdoaWRkZW4nLA0KICAgICAgICAgIHpvb206IHsNCiAgICAgICAgICAgIC8vIOe8qeaUvumFjee9rg0KICAgICAgICAgICAgbWluOiAwLjEsIC8vIOacgOWwj+e8qeaUvuavlOS+iw0KICAgICAgICAgICAgbWF4OiAyLjEsIC8vIOacgOWkp+e8qeaUvuavlOS+iw0KICAgICAgICAgICAgc3RlcDogMC4xLCAvLyDnvKnmlL7mr5TkvovmraXplb8NCiAgICAgICAgICB9LA0KICAgICAgICAgIGV4cGFuZGVyX3N0eWxlOiAnbnVtYmVyJywNCiAgICAgICAgICBsaW5lX3N0eWxlOiAnY3VydmVkJywNCiAgICAgICAgICBjdXN0b21fbGluZV9yZW5kZXI6IGZ1bmN0aW9uICh7IGN0eCwgc3RhcnRfcG9pbnQsIGVuZF9wb2ludCB9KSB7DQogICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7DQogICAgICAgICAgICBjdHgubW92ZVRvKHN0YXJ0X3BvaW50LngsIHN0YXJ0X3BvaW50LnkpOw0KICAgICAgICAgICAgLy8gY3R4LmxpbmVUbyh0b1gsIHRvWSk7DQogICAgICAgICAgICBjdHguYmV6aWVyQ3VydmVUbyhzdGFydF9wb2ludC54ICsgKChlbmRfcG9pbnQueCAtIHN0YXJ0X3BvaW50LngpICogMikgLyAzLCBzdGFydF9wb2ludC55LCBzdGFydF9wb2ludC54LCBlbmRfcG9pbnQueSwgZW5kX3BvaW50LngsIGVuZF9wb2ludC55KTsNCiAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9ICcjNjY2JzsNCiAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSAyOw0KICAgICAgICAgICAgY3R4LnN0cm9rZSgpOw0KICAgICAgICAgIH0sDQogICAgICAgICAgY3VzdG9tX25vZGVfcmVuZGVyOiBmdW5jdGlvbiAoam0sIGVsZW1lbnQsIG5vZGUpIHsNCiAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gYCR7bm9kZS50b3BpY308ZGl2IGNsYXNzPSd0aXAtaWNvbiR7bm9kZS5kYXRhLmNvbnRlbnQgPyAnIHNob3dUaXAnIDogJyd9JyBkYXRhLWNvbnRlbnQ9JyR7DQogICAgICAgICAgICAgIG5vZGUuZGF0YS5jb250ZW50IHx8ICcnDQogICAgICAgICAgICB9Jz48aSBjbGFzcz0iZWwtaWNvbi1zLWZsYWciPjwvaT48L2Rpdj5gOw0KICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIOihqOekuuW3sue7j+a4suafk+atpOiKgueCuQ0KICAgICAgICAgIH0sDQogICAgICAgIH0sDQogICAgICAgIGxheW91dDogew0KICAgICAgICAgIGhzcGFjZTogMTAwLCAvLyDoioLngrnkuYvpl7TnmoTmsLTlubPpl7Tot50NCiAgICAgICAgICB2c3BhY2U6IDIwLCAvLyDoioLngrnkuYvpl7TnmoTlnoLnm7Tpl7Tot50NCiAgICAgICAgfSwNCiAgICAgICAgc2hvcnRjdXQ6IHsNCiAgICAgICAgICAvLyDnpoHnlKjlv6vmjbfplK4NCiAgICAgICAgICBlbmFibGU6IGZhbHNlLA0KICAgICAgICB9LA0KICAgICAgfSwNCiAgICAgIHByZWRlZmluZUNvbG9yczogWycjMWU5MGZmJywgJyM2N2MyM2EnLCAnI2U2YTIzYycsICcjZjU2YzZjJywgJyNmZjQ1MDAnLCAnI2ZmOGMwMCcsICcjZmZkNzAwJywgJyM5MGVlOTAnLCAnIzAwY2VkMScsICcjNDA5ZWZmJywgJyNjNzE1ODUnXSwgLy8g6aKE5a6a5LmJ6aKc6ImyDQoNCiAgICAgIHN0cnVjdHVyZTogew0KICAgICAgICBhY3RpdmU6ICdyaWdodCcsDQogICAgICB9LA0KDQogICAgICBjcmVhdGVUeXBlOiAnJywgLy8g5re75Yqg5bmz57qnb3LlrZDnuqcNCiAgICAgIGN1cnJlbnROb2RlOiBudWxsLCAvLyDpgInkuK3oioLngrnkv6Hmga8NCiAgICAgIHNob3dNZW51OiBmYWxzZSwgLy8g5piv5ZCm5pi+56S65Y+z6ZSu6I+c5Y2V5qCPDQogICAgICBpc3Jvb3Q6IGZhbHNlLA0KICAgICAgbWVudVN0eWxlOiB7DQogICAgICAgIHRvcDogJycsDQogICAgICAgIGJvdHRvbTogJycsDQogICAgICAgIGxlZnQ6ICcnLA0KICAgICAgICByaWdodDogJycsDQogICAgICB9LA0KICAgICAgdGlwU3R5bGU6IHsgdG9wOiAnJywgYm90dG9tOiAnJywgbGVmdDogJycsIHJpZ2h0OiAnJyB9LA0KICAgICAgc2hvd1BvcG92ZXI6IGZhbHNlLA0KICAgICAgY3VycmVudE1lbW86ICcnLA0KICAgICAgc2hvd01hcDogdHJ1ZSwNCiAgICAgIGZpcnN0QWRkOiBmYWxzZSwNCiAgICAgIGN1clZlcnNpb246ICcnLA0KICAgIH07DQogIH0sDQogIG1vdW50ZWQoKSB7DQogICAgdGhpcy5nZXRUYXNrRGF0YSgpOw0KICAgIGNvbnN0IHRoYXQgPSB0aGlzOw0KICAgIHRoaXMubWFwVHlwZSA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ21hcFR5cGUnKSB8fCAnbXVsdGlUb1NpbmdsZSc7DQogICAgdGhpcy5vcHRpb25zLmNvbnRhaW5lciA9IGBqc21pbmRfY29udGFpbmVyXyR7dGhpcy5tYXBUeXBlfWA7DQogICAgLy8gaWYgKHRoaXMubWFwVHlwZSA9PT0gJ3NpbmdsZVRvTXVsdGknKSB7DQogICAgLy8gICBjb25zb2xlLmxvZygnc2luZ2xlVG9NdWx0aScpOw0KICAgIC8vICAgdGhpcy5vcHRpb25zLnZpZXcuY3VzdG9tX2xpbmVfcmVuZGVyID0gZnVuY3Rpb24gKHsgY3R4LCBzdGFydF9wb2ludCwgZW5kX3BvaW50IH0pIHsNCiAgICAvLyAgICAgdGhhdC5kcmF3Q3VydmVBcnJvdyhjdHgsIGVuZF9wb2ludCwgc3RhcnRfcG9pbnQsIDAuOSk7DQogICAgLy8gICAgIC8vIHRoYXQuZHJhd0Fycm93KGN0eCwgc3RhcnRfcG9pbnQsIGVuZF9wb2ludCk7DQogICAgLy8gICB9Ow0KICAgIC8vIH0gZWxzZSB7DQogICAgLy8gICBjb25zb2xlLmxvZygnbXVsdGlUb1NpbmdsZScpOw0KICAgIC8vICAgdGhpcy5vcHRpb25zLnZpZXcuY3VzdG9tX2xpbmVfcmVuZGVyID0gZnVuY3Rpb24gKHsgY3R4LCBzdGFydF9wb2ludCwgZW5kX3BvaW50IH0pIHsNCiAgICAvLyAgICAgdGhhdC5kcmF3Q3VydmVBcnJvdyhjdHgsIGVuZF9wb2ludCwgc3RhcnRfcG9pbnQsIDAuNSk7DQogICAgLy8gICAgIC8vIHRoYXQuZHJhd0Fycm93KGN0eCwgZW5kX3BvaW50LCBzdGFydF9wb2ludCk7DQogICAgLy8gICB9Ow0KICAgIC8vIH0NCiAgfSwNCiAgbWV0aG9kczogew0KICAgIGluaXRNYXAoKSB7DQogICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7DQogICAgICAgIGNvbnNvbGUubG9nKHRoaXMubWluZERhdGEsICdjb250YWluZXInKTsNCiAgICAgICAgdGhpcy5sb2FkTWluZCgpOw0KICAgICAgfSk7DQogICAgfSwNCiAgICAvLy0tLS0tLS0tLS0tLeaOpeWPoy0tLS0tLS0tLS0tLS0tDQogICAgLy8g6I635Y+W5Lu75Yqh5L+h5oGvDQogICAgYXN5bmMgZ2V0VGFza0RhdGEoKSB7DQogICAgICBjb25zdCB7IGlkLCBuYW1lLCBjb2RlLCB2ZXJzaW9uIH0gPSB0aGlzLiRyb3V0ZS5xdWVyeTsNCiAgICAgIHRoaXMudGFza0RhdGEgPSB7IGlkLCBuYW1lLCBjb2RlLCB2ZXJzaW9uIH07DQogICAgICBhd2FpdCB0aGlzLmdldE1hcERhdGEodmVyc2lvbik7DQogICAgICB0aGlzLmluaXRNYXAoKTsNCiAgICB9LA0KDQogICAgLy8g6I635Y+W6ISR5Zu+5pWw5o2uDQogICAgZ2V0TWFwRGF0YSh2ZXJzaW9uSWQgPSAnJykgew0KICAgICAgdGhpcy5pbml0TWluZERhdGEoKTsNCg0KICAgICAgbGV0IGRhdGEgPSBuZXcgRm9ybURhdGEoKTsNCiAgICAgIC8vIOacieeJiOacrOWPt+eahOaXtuWAmeS4jeS8oOS7u+WKoWlkDQogICAgICBkYXRhLmFwcGVuZCgndGFza0lkJywgdmVyc2lvbklkID8gJycgOiB0aGlzLnRhc2tEYXRhLmlkKTsNCiAgICAgIGRhdGEuYXBwZW5kKCd2ZXJzaW9uSWQnLCB2ZXJzaW9uSWQpOw0KDQogICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gew0KICAgICAgICBBUEkuZ2V0QnJhaW5NYXBJbmZvKGRhdGEpDQogICAgICAgICAgLnRoZW4oYXN5bmMgKHJlcykgPT4gew0KICAgICAgICAgICAgaWYgKHJlcykgew0KICAgICAgICAgICAgICBpZiAocmVzLmxlbmd0aCA9PT0gMCkgew0KICAgICAgICAgICAgICAgIHRoaXMuZmlyc3RBZGQgPSB0cnVlOw0KICAgICAgICAgICAgICAgIHRoaXMuY3VyVmVyc2lvbiA9IGF3YWl0IHRoaXMuZ2V0TmV3VmVyc2lvbigpOw0KICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHRoaXMubWluZERhdGEuZGF0YSA9IHRoaXMuZm9ybWF0RGF0YShyZXMpOw0KICAgICAgICAgICAgICAgIHRoaXMuY3VyVmVyc2lvbiA9IHRoaXMuZ2V0VmVyc2lvbkNvZGUodGhpcy5taW5kRGF0YS5kYXRhWzBdKTsNCiAgICAgICAgICAgICAgICB0aGlzLmZpcnN0QWRkID0gZmFsc2U7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgcmVzb2x2ZSgpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgcmVqZWN0KHJlcy5tZXNzYWdlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9KQ0KICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7DQogICAgICAgICAgICByZWplY3QoZXJyKTsNCiAgICAgICAgICB9KTsNCiAgICAgIH0pOw0KICAgIH0sDQogICAgZ2V0VmVyc2lvbkNvZGUoZGF0YSkgew0KICAgICAgaWYgKGRhdGEudGFza1ZlcnNpb25OYW1lKSB7DQogICAgICAgIHJldHVybiBkYXRhLnRhc2tWZXJzaW9uTmFtZS5zcGxpdCgnLScpWzFdOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgcmV0dXJuICcnOw0KICAgICAgfQ0KICAgIH0sDQogICAgaW5pdE1pbmREYXRhKCkgew0KICAgICAgdGhpcy5taW5kRGF0YS5tZXRhLm5hbWUgPSB0aGlzLnRhc2tEYXRhLm5hbWU7DQogICAgICB0aGlzLm1pbmREYXRhLmRhdGFbMF0udG9waWMgPSB0aGlzLnRhc2tEYXRhLm5hbWU7DQogICAgICB0aGlzLm1pbmREYXRhLmRhdGFbMF0uaWQgPSB1dGlscy51dWlkKCk7DQogICAgfSwNCg0KICAgIGZvcm1hdERhdGEoZGF0YSkgew0KICAgICAgY29uc3QgbmV3RGF0YSA9IFtdOw0KICAgICAgZGF0YS5mb3JFYWNoKChpdGVtKSA9PiB7DQogICAgICAgIGNvbnN0IHsgaWQsIG5hbWU6IHRvcGljLCBwYXJlbnRJZCwgbGV2ZWwsIHJlbGF0aW9uQ29udGVudCwgY29udGVudCwgYmFja2dyb3VuZCwgZm9udENvbG9yLCBmb250U2l6ZSwgZm9udFN0eWxlLCBmb250V2V0aWdodCwgLi4uZmllbGRzIH0gPSBpdGVtOw0KICAgICAgICBjb25zdCBuZXdJdGVtID0gew0KICAgICAgICAgIGlkLA0KICAgICAgICAgIHBhcmVudGlkOiBwYXJlbnRJZCwNCiAgICAgICAgICB0b3BpYywNCiAgICAgICAgICBsZXZlbCwNCiAgICAgICAgICByZWxhdGlvbkNvbnRlbnQsDQogICAgICAgICAgY29udGVudCwNCiAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6IGJhY2tncm91bmQsDQogICAgICAgICAgJ2ZvcmVncm91bmQtY29sb3InOiBmb250Q29sb3IsDQogICAgICAgICAgJ2ZvbnQtd2VpZ2h0JzogZm9udFdldGlnaHQsDQogICAgICAgICAgJ2ZvbnQtc3R5bGUnOiBmb250U3R5bGUsDQogICAgICAgICAgJ2ZvbnQtc2l6ZSc6IGZvbnRTaXplLA0KICAgICAgICAgIC4uLmZpZWxkcywNCiAgICAgICAgfTsNCiAgICAgICAgbGV2ZWwgPT09IDAgPyAobmV3SXRlbS5pc3Jvb3QgPSB0cnVlKSA6IG51bGw7DQogICAgICAgIG5ld0RhdGEucHVzaChuZXdJdGVtKTsNCiAgICAgIH0pOw0KICAgICAgcmV0dXJuIG5ld0RhdGE7DQogICAgfSwNCiAgICAvLyDkv53lrZgNCiAgICBhc3luYyBoYW5kbGVTYXZlKGNvbW1hbmQpIHsNCiAgICAgIHRoaXMubmV3VmVyc2lvbiA9IGF3YWl0IHRoaXMuZ2V0TmV3VmVyc2lvbigpOw0KICAgICAgdGhpcy5zYXZlTWFwRGF0YShjb21tYW5kKTsNCiAgICB9LA0KICAgIHNhdmVNYXBEYXRhKGNvbW1hbmQpIHsNCiAgICAgIGRlYnVnZ2VyOw0KICAgICAgdGhpcy5nZXRNaW5kRGF0YSgpOw0KICAgICAgY29uc3QgcmVhc29uTGlzdCA9IHRoaXMubWluZERhdGEuZGF0YS5tYXAoKGl0ZW0pID0+IHsNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICBpZDogaXRlbS5pZCwNCiAgICAgICAgICBuYW1lOiBpdGVtLnRvcGljLA0KICAgICAgICAgIGxldmVsOiBpdGVtLmxldmVsLA0KICAgICAgICAgIHJlbGF0aW9uQ29udGVudDogaXRlbS5yZWxhdGlvbkNvbnRlbnQsDQogICAgICAgICAgY29udGVudDogaXRlbS5jb250ZW50LA0KICAgICAgICAgIGJhY2tncm91bmQ6IGl0ZW1bJ2JhY2tncm91bmQtY29sb3InXSwNCiAgICAgICAgICBmb250Q29sb3I6IGl0ZW1bJ2ZvcmVncm91bmQtY29sb3InXSwNCiAgICAgICAgICBmb250U2l6ZTogaXRlbVsnZm9udC1zaXplJ10sDQogICAgICAgICAgZm9udFdldGlnaHQ6IGl0ZW1bJ2ZvbnQtd2VpZ2h0J10sDQogICAgICAgICAgZm9udFN0eWxlOiBpdGVtWydmb250LXN0eWxlJ10sDQogICAgICAgICAgdGFza0lkOiB0aGlzLnRhc2tEYXRhLmlkLA0KICAgICAgICAgIHBhcmVudElkOiBpdGVtLnBhcmVudGlkLA0KICAgICAgICAgIHNuOiBpdGVtLnNuLA0KICAgICAgICB9Ow0KICAgICAgfSk7DQogICAgICBjb25zdCBuZXdEYXRhID0gew0KICAgICAgICByZWFzb25MaXN0LA0KICAgICAgICBzYXZlQVM6IGNvbW1hbmQgPT09ICdzYXZlQXMnID8gMSA6IDAsDQogICAgICAgIHZlcnNpb246DQogICAgICAgICAgdGhpcy5maXJzdEFkZCB8fCBjb21tYW5kID09PSAnc2F2ZUFzJw0KICAgICAgICAgICAgPyB7DQogICAgICAgICAgICAgICAgdHlwZTogdGhpcy5tYXBUeXBlID09PSAnbXVsdGlUb1NpbmdsZScgPyAyIDogMSwNCiAgICAgICAgICAgICAgICB2ZXJzaW9uQ29kZTogdGhpcy5uZXdWZXJzaW9uLA0KICAgICAgICAgICAgICAgIHZlcnNpb25OYW1lOiB0aGlzLnRhc2tEYXRhLmNvZGUgKyAnLScgKyB0aGlzLm5ld1ZlcnNpb24sDQogICAgICAgICAgICAgICAgdGFza0lkOiB0aGlzLnRhc2tEYXRhLmlkLA0KICAgICAgICAgICAgICAgIHRhc2tOYW1lOiB0aGlzLnRhc2tEYXRhLm5hbWUsDQogICAgICAgICAgICAgICAgdGFza0NvZGU6IHRoaXMudGFza0RhdGEuY29kZSwNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgOiB1bmRlZmluZWQsDQogICAgICB9Ow0KDQogICAgICBBUEkuc2F2ZUJyYWluTWFwSW5mbyhuZXdEYXRhKQ0KICAgICAgICAudGhlbigocmVzKSA9PiB7DQogICAgICAgICAgaWYgKHJlcy5zdGF0ZSkgew0KICAgICAgICAgICAgdGhpcy4kbWVzc2FnZS5zdWNjZXNzKCfkv53lrZjmiJDlip8nKTsNCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgdGhpcy4kbWVzc2FnZS5lcnJvcign5L+d5a2Y5aSx6LSlJyk7DQogICAgICAgICAgfQ0KICAgICAgICB9KQ0KICAgICAgICAuY2F0Y2goKGVycikgPT4gew0KICAgICAgICAgIGNvbnNvbGUubG9nKGVyciB8fCAn5L+d5a2Y5aSx6LSlJyk7DQogICAgICAgIH0pOw0KICAgIH0sDQogICAgLy8g6I635Y+W5paw54mI5pys5Y+3DQogICAgZ2V0TmV3VmVyc2lvbigpIHsNCiAgICAgIGNvbnN0IHsgaWQgfSA9IHRoaXMudGFza0RhdGE7DQogICAgICBjb25zdCBkYXRhID0gbmV3IEZvcm1EYXRhKCk7DQogICAgICBkYXRhLmFwcGVuZCgndGFza0lkJywgaWQpOw0KICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsNCiAgICAgICAgQVBJLmdldE5ld1ZlcnNpb24oZGF0YSkNCiAgICAgICAgICAudGhlbigocmVzKSA9PiB7DQogICAgICAgICAgICBpZiAocmVzLnZhbHVlICYmIHJlcy5zdGF0ZSkgew0KICAgICAgICAgICAgICByZXNvbHZlKHJlcy52YWx1ZSk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICByZWplY3QocmVzLm1lc3NhZ2UpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0pDQogICAgICAgICAgLmNhdGNoKChlcnIpID0+IHsNCiAgICAgICAgICAgIHJlamVjdChlcnIpOw0KICAgICAgICAgIH0pOw0KICAgICAgfSk7DQogICAgfSwNCg0KICAgIC8vIOiOt+WPlueJiOacrOWIl+ihqA0KICAgIGdldFZlcnNpb25MaXN0KCkgew0KICAgICAgY29uc3QgeyBpZCB9ID0gdGhpcy50YXNrRGF0YTsNCiAgICAgIGNvbnN0IHF1ZXJ5ID0gew0KICAgICAgICBwYWdlQmVhbjogew0KICAgICAgICAgIHBhZ2VTaXplOiAtMSwNCiAgICAgICAgfSwNCiAgICAgICAgcXVlcnlzOiBbDQogICAgICAgICAgew0KICAgICAgICAgICAgZ3JvdXA6ICdtYWluJywNCiAgICAgICAgICAgIG9wZXJhdGlvbjogJ0VRVUFMJywNCiAgICAgICAgICAgIHByb3BlcnR5OiAndGFza0lkJywNCiAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJywNCiAgICAgICAgICAgIHZhbHVlOiBpZCwNCiAgICAgICAgICB9LA0KICAgICAgICBdLA0KICAgICAgfTsNCiAgICAgIEFQSS5nZXRJbmZlcmVuY2VWZXJzaW9uKHF1ZXJ5KQ0KICAgICAgICAudGhlbigocmVzKSA9PiB7DQogICAgICAgICAgdGhpcy52ZXJzaW9uRGF0YSA9IHJlcy5yb3dzIHx8IFtdOw0KICAgICAgICB9KQ0KICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7DQogICAgICAgICAgdGhpcy4kbWVzc2FnZS5lcnJvcihlcnJvciB8fCAn6I635Y+W54mI5pys5L+h5oGv5aSx6LSl77yBJyk7DQogICAgICAgIH0pOw0KICAgIH0sDQogICAgLy8g6I635Y+W5oyH5qCH5YiX6KGoDQogICAgZ2V0VGFyZ2V0TGlzdChwYWdlKSB7DQogICAgICBwYWdlID8gKHRoaXMucGFnaW5hdGlvbi5wYWdlID0gcGFnZSkgOiBudWxsOw0KICAgICAgY29uc3QgcXVlcnkgPSB7DQogICAgICAgIHBhZ2VCZWFuOiB0aGlzLnBhZ2luYXRpb24sDQogICAgICAgIHF1ZXJ5czogWw0KICAgICAgICAgIHsNCiAgICAgICAgICAgIGdyb3VwOiAnbWFpbicsDQogICAgICAgICAgICBvcGVyYXRpb246ICdFUVVBTCcsDQogICAgICAgICAgICBwYXJlbnRHcm91cDogJycsDQogICAgICAgICAgICBwcm9wZXJ0eTogJ2xldmVsJywNCiAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJywNCiAgICAgICAgICAgIHZhbHVlOiB0aGlzLnNlYXJjaFRhcmdldC50eXBlLA0KICAgICAgICAgIH0sDQogICAgICAgICAgew0KICAgICAgICAgICAgZ3JvdXA6ICdtYWluJywNCiAgICAgICAgICAgIG9wZXJhdGlvbjogJ0xJS0UnLA0KICAgICAgICAgICAgcGFyZW50R3JvdXA6ICcnLA0KICAgICAgICAgICAgcHJvcGVydHk6ICduYW1lJywNCiAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJywNCiAgICAgICAgICAgIHZhbHVlOiB0aGlzLnNlYXJjaFRhcmdldC5uYW1lLA0KICAgICAgICAgIH0sDQogICAgICAgIF0sDQogICAgICAgIHNvcnRlcjogWw0KICAgICAgICAgIHsNCiAgICAgICAgICAgIGRpcmVjdGlvbjogJ0FTQycsDQogICAgICAgICAgICBwcm9wZXJ0eTogJ2NvZGUnLA0KICAgICAgICAgIH0sDQogICAgICAgIF0sDQogICAgICB9Ow0KICAgICAgQVBJLmdldFRhcmdldExpc3QocXVlcnkpDQogICAgICAgIC50aGVuKChyZXMpID0+IHsNCiAgICAgICAgICB0aGlzLnRhcmdldERhdGEgPSByZXMucm93cyB8fCBbXTsNCiAgICAgICAgICB0aGlzLnBhZ2luYXRpb24udG90YWwgPSByZXMudG90YWwgfHwgMDsNCiAgICAgICAgfSkNCiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4gew0KICAgICAgICAgIHRoaXMuJG1lc3NhZ2UuZXJyb3IoZXJyb3IgfHwgJ+iOt+WPluaMh+agh+S/oeaBr+Wksei0pe+8gScpOw0KICAgICAgICB9KTsNCiAgICB9LA0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICBsb2FkTWluZCgpIHsNCiAgICAgIHRoaXMuZ2V0TWluZERhdGEoKTsNCiAgICAgIHRoaXMudG9nZ2xlU3R1Y3R1cmUodGhpcy5tYXBUeXBlKTsNCiAgICAgIHRoaXMuam0gPSBudWxsOw0KICAgICAgdGhpcy5qbSA9IG5ldyBqc01pbmQodGhpcy5vcHRpb25zKTsNCiAgICAgIGNvbnNvbGUubG9nKHRoaXMub3B0aW9ucy5jb250YWluZXIsIHRoaXMubWluZERhdGEsICdjb250YWluZXInKTsNCiAgICAgIHRoaXMuam0uc2hvdyh0aGlzLm1pbmREYXRhKTsNCiAgICAgIHRoaXMuZWRpdG9yID0gbnVsbDsNCiAgICAgIHRoaXMuZWRpdG9yID0gdGhpcy5qbS52aWV3LmVfZWRpdG9yOw0KICAgICAgdGhpcy5pbml0KCk7DQogICAgICB0aGlzLm1vdXNlV2hlZWwoKTsNCiAgICAgIHRoaXMubW91c2VEcmFnKCk7DQogICAgfSwNCg0KICAgIGhhbmRsZVRhYmxlQ2hhbmdlKHZhbCkgew0KICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy50YWJsZUxpc3QuZmlsdGVyKChpKSA9PiBpLmlkID09PSB2YWwpWzBdOw0KICAgICAgdGhpcy5hZGRUYXJnZXQudGFibGVOYW1lQ24gPSB0YXJnZXQ/Lm5hbWVDbiB8fCAnJzsNCiAgICB9LA0KICAgIGhhbmRsZUZpZWxkQ2hhbmdlKHZhbCkgew0KICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5maWVsZExpc3QuZmlsdGVyKChpKSA9PiBpLmlkID09PSB2YWwpWzBdOw0KICAgICAgdGhpcy5hZGRUYXJnZXQuZmllbGROYW1lQ24gPSB0YXJnZXQ/Lm5hbWVDbiB8fCAnJzsNCiAgICAgIHRoaXMuYWRkVGFyZ2V0LmZpZWxkVHlwZSA9IHRhcmdldD8udHlwZSB8fCAnJzsNCiAgICAgIHRoaXMuYWRkVGFyZ2V0LmZpZWxkRGljdCA9IHRhcmdldD8uZGljdCB8fCBbXTsNCiAgICAgIHRoaXMuYWRkVGFyZ2V0LmZpZWxkRGljdE5hbWUgPSB0YXJnZXQ/LmRpY3ROYW1lIHx8IFtdOw0KICAgIH0sDQogICAgaGFuZGxlQ3VycmVudENoYW5nZSh2YWwpIHsNCiAgICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlID0gdmFsOw0KICAgICAgdGhpcy5nZXRUYXJnZXRMaXN0KCk7DQogICAgfSwNCiAgICAvLyDnsbvlnovliIfmjaINCiAgICBjaGFuZ2VNYXBUeXBlKHR5cGUpIHsNCiAgICAgIHRoaXMubWFwVHlwZSA9IHR5cGU7DQogICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdtYXBUeXBlJywgdHlwZSk7DQogICAgICBsb2NhdGlvbi5yZWxvYWQoKTsNCiAgICB9LA0KICAgIGhhbmRsZUNoYW5nZU1hcFR5cGUodHlwZSkgew0KICAgICAgaWYgKHRoaXMubWFwVHlwZSAhPT0gdHlwZSkgew0KICAgICAgICB0aGlzLiRjb25maXJtKCfliIfmjaLmjqjnkIbnsbvlnovlkI7pnIDopoHliLfmlrDpobXpnaLvvIzor7flhYjkv53lrZjmlbDmja7vvIzmmK/lkKbnoa7orqTliIfmjaLmjqjnkIbnsbvlnovvvJ8nKQ0KICAgICAgICAgIC50aGVuKCgpID0+IHsNCiAgICAgICAgICAgIHRoaXMuY2hhbmdlTWFwVHlwZUZuKHR5cGUpOw0KICAgICAgICAgIH0pDQogICAgICAgICAgLmNhdGNoKCgpID0+IHt9KTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIGxldCB0eXBlTmFtZSA9IHRoaXMubWFwVHlwZSA9PT0gJ3NpbmdsZVRvTXVsdGknID8gJ+S4gOaOqOWkmicgOiAn5aSa5o6o5LiAJzsNCiAgICAgICAgdGhpcy4kbWVzc2FnZS53YXJuaW5nKCflvZPliY3mjqjnkIbnsbvlnovlt7LmmK8g44CQJyArIHR5cGVOYW1lICsgJ+OAke+8jOaXoOmcgOWIh+aNoicpOw0KICAgICAgfQ0KICAgIH0sDQogICAgY2hhbmdlTWFwVHlwZUZuKHR5cGUpIHsNCiAgICAgIHRoaXMubWFwVHlwZSA9IHR5cGU7DQogICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdtYXBUeXBlJywgdHlwZSk7DQogICAgICBsb2NhdGlvbi5yZWxvYWQoKTsNCiAgICB9LA0KDQogICAgZHJhd0Fycm93KGN0eCwgc3RhcnRfcG9pbnQsIGVuZF9wb2ludCkgew0KICAgICAgbGV0IGZyb21YLCBmcm9tWSwgdG9YLCB0b1k7DQogICAgICBmcm9tWCA9IGVuZF9wb2ludC54Ow0KICAgICAgZnJvbVkgPSBlbmRfcG9pbnQueTsNCiAgICAgIHRvWCA9IHN0YXJ0X3BvaW50Lng7DQogICAgICB0b1kgPSBzdGFydF9wb2ludC55Ow0KDQogICAgICB2YXIgdGhldGEgPSAzMCwNCiAgICAgICAgaGVhZGxlbiA9IDEyLA0KICAgICAgICB3aWR0aCA9IDIsDQogICAgICAgIGNvbG9yID0gJyM2NjYnOw0KICAgICAgLy8g6K6h566X55u057q/5Lit54K55Z2Q5qCHDQoNCiAgICAgIHZhciBtaWRYID0gKGZyb21YICsgdG9YKSAvIDI7DQogICAgICB2YXIgbWlkWSA9IChmcm9tWSArIHRvWSkgLyAyOw0KDQogICAgICAvLyDorqHnrpfnrq3lpLTotbfngrnlkoznu4jngrnnmoTlnZDmoIcNCiAgICAgIHZhciBhbmdsZSA9IChNYXRoLmF0YW4yKGZyb21ZIC0gdG9ZLCBmcm9tWCAtIHRvWCkgKiAxODApIC8gTWF0aC5QSTsNCiAgICAgIHZhciBhbmdsZTEgPSAoKGFuZ2xlICsgdGhldGEpICogTWF0aC5QSSkgLyAxODA7DQogICAgICB2YXIgYW5nbGUyID0gKChhbmdsZSAtIHRoZXRhKSAqIE1hdGguUEkpIC8gMTgwOw0KDQogICAgICB2YXIgdG9wWCA9IGhlYWRsZW4gKiBNYXRoLmNvcyhhbmdsZTEpOw0KICAgICAgdmFyIHRvcFkgPSBoZWFkbGVuICogTWF0aC5zaW4oYW5nbGUxKTsNCiAgICAgIHZhciBib3RYID0gaGVhZGxlbiAqIE1hdGguY29zKGFuZ2xlMik7DQogICAgICB2YXIgYm90WSA9IGhlYWRsZW4gKiBNYXRoLnNpbihhbmdsZTIpOw0KDQogICAgICB2YXIgYXJyb3dYLCBhcnJvd1k7DQoNCiAgICAgIGN0eC5iZWdpblBhdGgoKTsNCiAgICAgIGN0eC5tb3ZlVG8oZnJvbVgsIGZyb21ZKTsNCiAgICAgIGN0eC5saW5lVG8odG9YLCB0b1kpOw0KICAgICAgLy9jdHguYmV6aWVyQ3VydmVUbyhzdGFydF9wb2ludC54ICsgKChlbmRfcG9pbnQueCAtIHN0YXJ0X3BvaW50LngpICogMikgLyAzLCBzdGFydF9wb2ludC55LCBzdGFydF9wb2ludC54LCBlbmRfcG9pbnQueSwgZW5kX3BvaW50LngsIGVuZF9wb2ludC55KTsNCg0KICAgICAgYXJyb3dYID0gbWlkWCArIHRvcFg7DQogICAgICBhcnJvd1kgPSBtaWRZICsgdG9wWTsNCiAgICAgIGN0eC5tb3ZlVG8oYXJyb3dYLCBhcnJvd1kpOw0KICAgICAgY3R4LmxpbmVUbyhtaWRYLCBtaWRZKTsNCg0KICAgICAgYXJyb3dYID0gbWlkWCArIGJvdFg7DQogICAgICBhcnJvd1kgPSBtaWRZICsgYm90WTsNCiAgICAgIGN0eC5saW5lVG8oYXJyb3dYLCBhcnJvd1kpOw0KICAgICAgY3R4LnN0cm9rZVN0eWxlID0gY29sb3I7DQogICAgICBjdHgubGluZVdpZHRoID0gd2lkdGg7DQogICAgICBjdHguc3Ryb2tlKCk7DQogICAgfSwNCg0KICAgIGRyYXdDdXJ2ZUFycm93KGN0eCwgc3RhcnRQb2ludCwgZW5kUG9pbnQsIHQpIHsNCiAgICAgIGNvbnN0IGZyb21YID0gc3RhcnRQb2ludC54Ow0KICAgICAgY29uc3QgZnJvbVkgPSBzdGFydFBvaW50Lnk7DQogICAgICBjb25zdCB0b1ggPSBlbmRQb2ludC54Ow0KICAgICAgY29uc3QgdG9ZID0gZW5kUG9pbnQueTsNCg0KICAgICAgY29uc3QgY29udHJvbFBvaW50MVggPSBmcm9tWCArICgodG9YIC0gZnJvbVgpICogMikgLyAzOw0KICAgICAgY29uc3QgY29udHJvbFBvaW50MVkgPSBmcm9tWTsNCiAgICAgIGNvbnN0IGNvbnRyb2xQb2ludDJYID0gZnJvbVg7DQogICAgICBjb25zdCBjb250cm9sUG9pbnQyWSA9IHRvWTsNCg0KICAgICAgY29uc3QgYXJyb3dUaGV0YSA9IDQ1OyAvLyDnrq3lpLTop5LluqbvvIjluqbvvIkNCiAgICAgIGNvbnN0IGFycm93SGVhZExlbmd0aCA9IDEyOyAvLyDnrq3lpLTplb/luqYNCiAgICAgIGNvbnN0IGxpbmVXaWR0aCA9IDI7IC8vIOe6v+adoeWuveW6pg0KICAgICAgY29uc3Qgc3Ryb2tlQ29sb3IgPSAnIzY2Nic7IC8vIOe6v+adoeminOiJsg0KDQogICAgICAvLyDorqHnrpfotJ3loZ7lsJTmm7Lnur/nmoQ0LzHlpITnmoTngrnvvIh0ID0gMC43Ne+8iQ0KICAgICAgLy8gICBjb25zdCB0ID0gMC41Ow0KICAgICAgY29uc3QgY3VydmVQb2ludFggPQ0KICAgICAgICBNYXRoLnBvdygxIC0gdCwgMykgKiBmcm9tWCArIDMgKiBNYXRoLnBvdygxIC0gdCwgMikgKiB0ICogY29udHJvbFBvaW50MVggKyAzICogKDEgLSB0KSAqIE1hdGgucG93KHQsIDIpICogY29udHJvbFBvaW50MlggKyBNYXRoLnBvdyh0LCAzKSAqIHRvWDsNCiAgICAgIGNvbnN0IGN1cnZlUG9pbnRZID0NCiAgICAgICAgTWF0aC5wb3coMSAtIHQsIDMpICogZnJvbVkgKyAzICogTWF0aC5wb3coMSAtIHQsIDIpICogdCAqIGNvbnRyb2xQb2ludDFZICsgMyAqICgxIC0gdCkgKiBNYXRoLnBvdyh0LCAyKSAqIGNvbnRyb2xQb2ludDJZICsgTWF0aC5wb3codCwgMykgKiB0b1k7DQoNCiAgICAgIC8vIOiuoeeul+absue6v+WcqGN1cnZlUG9pbnTlpITnmoTmlrnlkJHvvIjlr7zmlbDvvIkNCiAgICAgIGNvbnN0IGRlcml2YXRpdmVYID0NCiAgICAgICAgLTMgKiBNYXRoLnBvdygxIC0gdCwgMikgKiBmcm9tWCArDQogICAgICAgIDMgKiAoMyAqIE1hdGgucG93KDEgLSB0LCAyKSAtIDYgKiAoMSAtIHQpICogdCkgKiBjb250cm9sUG9pbnQxWCArDQogICAgICAgIDMgKiAoLTMgKiAoMSAtIHQpICogdCArIDIgKiB0ICogdCkgKiBjb250cm9sUG9pbnQyWCArDQogICAgICAgIDMgKiBNYXRoLnBvdyh0LCAyKSAqIHRvWDsNCiAgICAgIGNvbnN0IGRlcml2YXRpdmVZID0NCiAgICAgICAgLTMgKiBNYXRoLnBvdygxIC0gdCwgMikgKiBmcm9tWSArDQogICAgICAgIDMgKiAoMyAqIE1hdGgucG93KDEgLSB0LCAyKSAtIDYgKiAoMSAtIHQpICogdCkgKiBjb250cm9sUG9pbnQxWSArDQogICAgICAgIDMgKiAoLTMgKiAoMSAtIHQpICogdCArIDIgKiB0ICogdCkgKiBjb250cm9sUG9pbnQyWSArDQogICAgICAgIDMgKiBNYXRoLnBvdyh0LCAyKSAqIHRvWTsNCg0KICAgICAgLy8g6K6h566X566t5aS055qE6KeS5bqmDQogICAgICBjb25zdCBhbmdsZSA9IE1hdGguYXRhbjIoZGVyaXZhdGl2ZVksIGRlcml2YXRpdmVYKTsNCiAgICAgIGNvbnN0IGFuZ2xlMSA9ICgoYW5nbGUgKyBhcnJvd1RoZXRhKSAqIE1hdGguUEkpIC8gMTgwOw0KICAgICAgY29uc3QgYW5nbGUyID0gKChhbmdsZSAtIGFycm93VGhldGEpICogTWF0aC5QSSkgLyAxODA7DQogICAgICAvLyAgIGNvbnN0IGFuZ2xlMSA9IGFuZ2xlICsgKGFycm93VGhldGEgKiBNYXRoLlBJKSAvIDE4MDsNCiAgICAgIC8vICAgY29uc3QgYW5nbGUyID0gYW5nbGUgLSAoYXJyb3dUaGV0YSAqIE1hdGguUEkpIC8gMTgwOw0KICAgICAgLy8gICBjb25zb2xlLmxvZyhhbmdsZSwgYW5nbGUxLCBhbmdsZTIsICdhbmdsZScpOw0KDQogICAgICAvLyDorqHnrpfnrq3lpLTkuKTkuKrliIbmlK/nmoTnu4jngrnlnZDmoIcNCiAgICAgIGNvbnN0IHRvcFggPSB0b1ggKyBhcnJvd0hlYWRMZW5ndGggKiBNYXRoLmNvcyhhbmdsZTEpOw0KICAgICAgY29uc3QgdG9wWSA9IHRvWSArIGFycm93SGVhZExlbmd0aCAqIE1hdGguc2luKGFuZ2xlMSk7DQogICAgICBjb25zdCBib3RYID0gdG9YICsgYXJyb3dIZWFkTGVuZ3RoICogTWF0aC5jb3MoYW5nbGUyKTsNCiAgICAgIGNvbnN0IGJvdFkgPSB0b1kgKyBhcnJvd0hlYWRMZW5ndGggKiBNYXRoLnNpbihhbmdsZTIpOw0KDQogICAgICBjdHguYmVnaW5QYXRoKCk7DQogICAgICBjdHgubW92ZVRvKGZyb21YLCBmcm9tWSk7DQogICAgICBjdHguYmV6aWVyQ3VydmVUbyhjb250cm9sUG9pbnQxWCwgY29udHJvbFBvaW50MVksIGNvbnRyb2xQb2ludDJYLCBjb250cm9sUG9pbnQyWSwgdG9YLCB0b1kpOw0KICAgICAgY3R4LmxpbmVUbyh0b3BYLCB0b3BZKTsNCiAgICAgIGN0eC5tb3ZlVG8odG9YLCB0b1kpOw0KICAgICAgY3R4LmxpbmVUbyhib3RYLCBib3RZKTsNCiAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHN0cm9rZUNvbG9yOw0KICAgICAgY3R4LmxpbmVXaWR0aCA9IGxpbmVXaWR0aDsNCiAgICAgIGN0eC5zdHJva2UoKTsNCiAgICB9LA0KICAgIGRyYXdDdXJ2ZUFycm93KGN0eCwgc3RhcnRQb2ludCwgZW5kUG9pbnQpIHsNCiAgICAgIGNvbnN0IGZyb21YID0gc3RhcnRQb2ludC54Ow0KICAgICAgY29uc3QgZnJvbVkgPSBzdGFydFBvaW50Lnk7DQogICAgICBjb25zdCB0b1ggPSBlbmRQb2ludC54Ow0KICAgICAgY29uc3QgdG9ZID0gZW5kUG9pbnQueTsNCg0KICAgICAgY29uc3QgY29udHJvbFBvaW50MVggPSBmcm9tWCArICgodG9YIC0gZnJvbVgpICogMikgLyAzOw0KICAgICAgY29uc3QgY29udHJvbFBvaW50MVkgPSBmcm9tWTsNCiAgICAgIGNvbnN0IGNvbnRyb2xQb2ludDJYID0gZnJvbVg7DQogICAgICBjb25zdCBjb250cm9sUG9pbnQyWSA9IHRvWTsNCg0KICAgICAgY29uc3QgYXJyb3dUaGV0YSA9IDMwOyAvLyDnrq3lpLTop5LluqbvvIjluqbvvIkNCiAgICAgIGNvbnN0IGFycm93SGVhZExlbmd0aCA9IDEyOyAvLyDnrq3lpLTplb/luqYNCiAgICAgIGNvbnN0IGxpbmVXaWR0aCA9IDI7IC8vIOe6v+adoeWuveW6pg0KICAgICAgY29uc3Qgc3Ryb2tlQ29sb3IgPSAnIzY2Nic7IC8vIOe6v+adoeminOiJsg0KDQogICAgICAvLyDorqHnrpfotJ3loZ7lsJTmm7Lnur/nmoTnu5PmnZ/ngrnvvIh0ID0gMe+8iQ0KICAgICAgY29uc3QgY3VydmVQb2ludFggPSB0b1g7DQogICAgICBjb25zdCBjdXJ2ZVBvaW50WSA9IHRvWTsNCg0KICAgICAgLy8g6K6h566X5puy57q/5Zyo57uT5p2f54K55aSE55qE5pa55ZCR77yI5a+85pWw77yMdCA9IDHvvIkNCiAgICAgIGNvbnN0IGRlcml2YXRpdmVYID0gMiAqICh0b1ggLSBjb250cm9sUG9pbnQyWCk7DQogICAgICBjb25zdCBkZXJpdmF0aXZlWSA9IDIgKiAodG9ZIC0gY29udHJvbFBvaW50MlkpOw0KDQogICAgICAvLyDorqHnrpfnrq3lpLTnmoTop5LluqYNCiAgICAgIGNvbnN0IGFuZ2xlID0gTWF0aC5hdGFuMihkZXJpdmF0aXZlWSwgZGVyaXZhdGl2ZVgpOw0KICAgICAgY29uc3QgYW5nbGUxID0gYW5nbGUgKyAoYXJyb3dUaGV0YSAqIE1hdGguUEkpIC8gMTgwOw0KICAgICAgY29uc3QgYW5nbGUyID0gYW5nbGUgLSAoYXJyb3dUaGV0YSAqIE1hdGguUEkpIC8gMTgwOw0KDQogICAgICAvLyDorqHnrpfnrq3lpLTkuKTkuKrliIbmlK/nmoTnu4jngrnlnZDmoIcNCiAgICAgIGNvbnN0IHRvcFggPSB0b1ggLSBhcnJvd0hlYWRMZW5ndGggKiBNYXRoLmNvcyhhbmdsZTEpOw0KICAgICAgY29uc3QgdG9wWSA9IHRvWSAtIGFycm93SGVhZExlbmd0aCAqIE1hdGguc2luKGFuZ2xlMSk7DQogICAgICBjb25zdCBib3RYID0gdG9YIC0gYXJyb3dIZWFkTGVuZ3RoICogTWF0aC5jb3MoYW5nbGUyKTsNCiAgICAgIGNvbnN0IGJvdFkgPSB0b1kgLSBhcnJvd0hlYWRMZW5ndGggKiBNYXRoLnNpbihhbmdsZTIpOw0KDQogICAgICBjdHguYmVnaW5QYXRoKCk7DQogICAgICBjdHgubW92ZVRvKGZyb21YLCBmcm9tWSk7DQogICAgICBjdHguYmV6aWVyQ3VydmVUbyhjb250cm9sUG9pbnQxWCwgY29udHJvbFBvaW50MVksIGNvbnRyb2xQb2ludDJYLCBjb250cm9sUG9pbnQyWSwgdG9YLCB0b1kpOw0KICAgICAgY3R4LmxpbmVUbyh0b3BYLCB0b3BZKTsNCiAgICAgIGN0eC5tb3ZlVG8odG9YLCB0b1kpOw0KICAgICAgY3R4LmxpbmVUbyhib3RYLCBib3RZKTsNCiAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHN0cm9rZUNvbG9yOw0KICAgICAgY3R4LmxpbmVXaWR0aCA9IGxpbmVXaWR0aDsNCiAgICAgIGN0eC5zdHJva2UoKTsNCiAgICB9LA0KICAgIC8vIHRhYuWIh+aNog0KICAgIGhhbmRsZUNsaWNrVGFiKHRhYikgew0KICAgICAgaWYgKHRhYi5uYW1lID09PSAnZmlmdGgnKSB7DQogICAgICAgIHRoaXMuZ2V0VmVyc2lvbkxpc3QoKTsNCiAgICAgIH0gZWxzZSBpZiAodGFiLm5hbWUgPT09ICdzZWNvbmQnKSB7DQogICAgICAgIHRoaXMuZ2V0VGFyZ2V0TGlzdCgxKTsNCiAgICAgIH0NCiAgICB9LA0KICAgIC8vIOmFjee9rue8lui+keaYvuekuumakOiXjw0KICAgIHRvZ2dsZVNpZGVFZGl0b3IodHlwZSkgew0KICAgICAgdGhpcy5zaG93U2lkZUVkaXRvciA9IHR5cGUgPT09IHVuZGVmaW5lZCA/ICF0aGlzLnNob3dTaWRlRWRpdG9yIDogdHlwZTsNCiAgICAgIHNldFRpbWVvdXQoKCkgPT4gew0KICAgICAgICB0aGlzLnJlc2V0KCk7DQogICAgICB9LCAyMDApOw0KICAgIH0sDQogICAgLy8g57yp5bCPDQogICAgem9vbU91dCgpIHsNCiAgICAgIHRoaXMuam0udmlldy56b29tX291dCgpOw0KICAgIH0sDQogICAgLy8g5pS+5aSnDQogICAgem9vbUluKCkgew0KICAgICAgdGhpcy5qbS52aWV3Lnpvb21faW4oKTsNCiAgICB9LA0KDQogICAgLy8g6YeN572u6KeG5Zu+DQogICAgcmVzZXQoKSB7DQogICAgICB0aGlzLmptLnJlc2l6ZSgpOw0KICAgIH0sDQoNCiAgICBleHBvcnRJbWFnZSgpIHsNCiAgICAgIGxldCBqbSA9IGpzTWluZC5jdXJyZW50Ow0KICAgICAgam0uc2hvb3QoKTsNCiAgICB9LA0KDQogICAgbG9vcEFycmF5RGF0YShsaXN0LCBjYWxsYmFjaykgew0KICAgICAgbGlzdC5mb3JFYWNoKChpdGVtLCBpKSA9PiB7DQogICAgICAgIGNhbGxiYWNrKGl0ZW0sIGkpOw0KICAgICAgfSk7DQogICAgfSwNCiAgICAvLyDlvqrnjq/moJHnu5PmnoQNCiAgICBsb29wVHJlZURhdGEobGlzdCwgY2FsbGJhY2spIHsNCiAgICAgIChmdW5jdGlvbiBkb09uZUZsb29yKGxpc3QpIHsNCiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGlzdCkpIHsNCiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBsaXN0W2ldOw0KICAgICAgICAgICAgY2FsbGJhY2soaXRlbSwgaSk7DQogICAgICAgICAgICBpZiAoaXRlbS5jaGlsZHJlbiAmJiBpdGVtLmNoaWxkcmVuLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgZG9PbmVGbG9vcihpdGVtLmNoaWxkcmVuKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0pKGxpc3QpOw0KICAgIH0sDQoNCiAgICAvLyDnvJbovpHoioLngrkNCg0KICAgIC8vIOemgeeUqOWPjOWHu+e8lui+kQ0KICAgIHN0b3BEQmNsaWNrKCkgew0KICAgICAgY29uc3Qgam1ub2RlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdqbW5vZGUnKTsNCiAgICAgIE9iamVjdC52YWx1ZXMoam1ub2RlcykuZm9yRWFjaCgoam1ub2RlKSA9PiB7DQogICAgICAgIGptbm9kZS5vbmRibGNsaWNrID0gZnVuY3Rpb24gKGUpIHsNCiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7DQogICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsNCiAgICAgICAgfTsNCiAgICAgIH0pOw0KICAgIH0sDQoNCiAgICBzaG93VGlwKGV2ZW50KSB7DQogICAgICBpZiAodGhpcy5zaG93UG9wb3Zlcikgew0KICAgICAgICByZXR1cm47DQogICAgICB9DQogICAgICB0aGlzLmN1cnJlbnRNZW1vID0gZXZlbnQ/LmZyb21FbGVtZW50Py5jaGlsZHJlblswXT8uZGF0YXNldD8uY29udGVudCB8fCAnJzsNCiAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNvbW1vbi10aXAnKTsNCiAgICAgIGNvbnN0IHdpZHRoID0gcGFyc2VGbG9hdCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCkud2lkdGgpOw0KICAgICAgY29uc3QgaGVpZ2h0ID0gcGFyc2VGbG9hdCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCkuaGVpZ2h0KSAqIDMgKyAxMjsNCiAgICAgIGNvbnN0IHdpbmRvd0hlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDsNCiAgICAgIGNvbnN0IHdpbmRvd1dpZHRoID0gd2luZG93LmlubmVyV2lkdGg7DQogICAgICAvLyDmnoHpmZDkvY3nva4g6YG/5YWN6LaK55WMDQogICAgICBpZiAoZXZlbnQuY2xpZW50WSArIGhlaWdodCA+IHdpbmRvd0hlaWdodCkgew0KICAgICAgICB0aGlzLnRpcFN0eWxlLmxlZnQgPSBldmVudC5jbGllbnRYICsgJ3B4JzsNCiAgICAgICAgdGhpcy50aXBTdHlsZS50b3AgPSAndW5zZXQnOw0KICAgICAgICB0aGlzLnRpcFN0eWxlLmJvdHRvbSA9IDA7DQogICAgICB9IGVsc2UgaWYgKGV2ZW50LmNsaWVudFggKyB3aWR0aCA+IHdpbmRvd1dpZHRoKSB7DQogICAgICAgIHRoaXMudGlwU3R5bGUudG9wID0gZXZlbnQuY2xpZW50WSArICdweCc7DQogICAgICAgIHRoaXMudGlwU3R5bGUubGVmdCA9ICd1bnNldCc7DQogICAgICAgIHRoaXMudGlwU3R5bGUucmlnaHQgPSAwOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgdGhpcy50aXBTdHlsZS5sZWZ0ID0gZXZlbnQuY2xpZW50WCArICdweCc7DQogICAgICAgIHRoaXMudGlwU3R5bGUudG9wID0gZXZlbnQuY2xpZW50WSArICdweCc7DQogICAgICAgIHRoaXMudGlwU3R5bGUuYm90dG9tID0gJ3Vuc2V0JzsNCiAgICAgIH0NCiAgICAgIGlmICh0aGlzLmN1cnJlbnRNZW1vKSB7DQogICAgICAgIHRoaXMuc2hvd1BvcG92ZXIgPSB0cnVlOw0KICAgICAgfQ0KICAgIH0sDQoNCiAgICBoaWRlVGlwKCkgew0KICAgICAgdGhpcy5jdXJyZW50TWVtbyA9ICcnOw0KICAgICAgdGhpcy5zaG93UG9wb3ZlciA9IGZhbHNlOw0KICAgIH0sDQoNCiAgICAvLyDlpIfms6jnu5Hlrprngrnlh7vkuovku7YNCiAgICB0aXBzQ2xpY2soKSB7DQogICAgICBjb25zdCB0aXBzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGlwLWljb24gc2hvd1RpcCcpOw0KICAgICAgT2JqZWN0LnZhbHVlcyh0aXBzKS5mb3JFYWNoKCh0aXApID0+IHsNCiAgICAgICAgdGlwLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIHRoaXMuc2hvd1RpcCk7DQogICAgICAgIHRpcC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCB0aGlzLnNob3dUaXApOw0KICAgICAgfSk7DQogICAgICBPYmplY3QudmFsdWVzKHRpcHMpLmZvckVhY2goKHRpcCkgPT4gew0KICAgICAgICB0aXAucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHRoaXMuaGlkZVRpcCk7DQogICAgICAgIHRpcC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgdGhpcy5oaWRlVGlwKTsNCiAgICAgIH0pOw0KICAgIH0sDQoNCiAgICAvLyDlj7PplK7ngrnlh7vmlrDlop4NCiAgICByaWdodENsaWNrTWVudSgpIHsNCiAgICAgIC8vIOWPs+mUruiPnOWNlQ0KICAgICAgdGhpcy5qbS52aWV3LmFkZF9ldmVudCh0aGlzLmVkaXRvciwgJ2NvbnRleHRtZW51JywgKGUpID0+IHsNCiAgICAgICAgY29uc3Qgc2VsZWN0ZWROb2RlID0gdGhpcy5qbS5nZXRfc2VsZWN0ZWRfbm9kZSgpOw0KDQogICAgICAgIGlmIChzZWxlY3RlZE5vZGUpIHsNCiAgICAgICAgICB0aGlzLmlzcm9vdCA9IHNlbGVjdGVkTm9kZS5pZCA9PT0gJ3Jvb3QnOw0KICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsNCiAgICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jb250ZXh0LW1lbnUgLmVsLW1lbnUtaXRlbScpOw0KICAgICAgICAgIGxldCBtZW51ID0gdGhpcy4kcmVmcy5jb250ZXh0LiRlbDsNCg0KICAgICAgICAgIC8vICAgY29uc3Qgd2lkdGggPSBwYXJzZUZsb2F0KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKS53aWR0aCk7DQogICAgICAgICAgLy8gICBjb25zdCBoZWlnaHQgPSBwYXJzZUZsb2F0KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKS5oZWlnaHQpICogMyArIDEyOw0KICAgICAgICAgIGNvbnN0IHdpZHRoID0gcGFyc2VGbG9hdChtZW51Lm9mZnNldFdpZHRoKTsNCiAgICAgICAgICBjb25zdCBoZWlnaHQgPSBwYXJzZUZsb2F0KG1lbnUub2Zmc2V0SGVpZ2h0KSAqIDIgKyAxMjsNCiAgICAgICAgICBjb25zdCB3aW5kb3dIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7DQogICAgICAgICAgY29uc3Qgd2luZG93V2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDsNCg0KICAgICAgICAgIC8vIOaegemZkOS9jee9riDpgb/lhY3otornlYwNCiAgICAgICAgICBpZiAoZS5jbGllbnRZICsgaGVpZ2h0ID4gd2luZG93SGVpZ2h0KSB7DQogICAgICAgICAgICB0aGlzLm1lbnVTdHlsZS5sZWZ0ID0gZS5jbGllbnRYICsgJ3B4JzsNCiAgICAgICAgICAgIHRoaXMubWVudVN0eWxlLnRvcCA9ICd1bnNldCc7DQogICAgICAgICAgICB0aGlzLm1lbnVTdHlsZS5ib3R0b20gPSAwOw0KICAgICAgICAgIH0gZWxzZSBpZiAoZS5jbGllbnRYICsgd2lkdGggPiB3aW5kb3dXaWR0aCkgew0KICAgICAgICAgICAgdGhpcy5tZW51U3R5bGUudG9wID0gZS5jbGllbnRZICsgJ3B4JzsNCiAgICAgICAgICAgIHRoaXMubWVudVN0eWxlLmxlZnQgPSAndW5zZXQnOw0KICAgICAgICAgICAgdGhpcy5tZW51U3R5bGUucmlnaHQgPSAwOw0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB0aGlzLm1lbnVTdHlsZS5sZWZ0ID0gZS5jbGllbnRYICsgMjAgKyAncHgnOw0KICAgICAgICAgICAgdGhpcy5tZW51U3R5bGUudG9wID0gZS5jbGllbnRZICsgMjAgKyAncHgnOw0KICAgICAgICAgICAgdGhpcy5tZW51U3R5bGUuYm90dG9tID0gJ3Vuc2V0JzsNCiAgICAgICAgICB9DQogICAgICAgICAgdGhpcy5zaG93TWVudSA9IHRydWU7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgdGhpcy5zaG93TWVudSA9IGZhbHNlOw0KICAgICAgICB9DQogICAgICB9KTsNCiAgICB9LA0KDQogICAgLy8g5Yid5aeL5YyW6YWN572uDQogICAgaW5pdCgpIHsNCiAgICAgIHRoaXMuam0uZXhwYW5kX2FsbCgpOw0KDQogICAgICB0aGlzLnN0b3BEQmNsaWNrKCk7DQoNCiAgICAgIHRoaXMudGlwc0NsaWNrKCk7DQoNCiAgICAgIHRoaXMucmlnaHRDbGlja01lbnUoKTsNCiAgICB9LA0KICAgIC8vIOiOt+WPlumAieS4reagh+etvueahCBJRA0KICAgIGdldF9zZWxlY3RlZF9ub2RlaWQoKSB7DQogICAgICBjb25zdCBzZWxlY3RlZE5vZGUgPSB0aGlzLmptLmdldF9zZWxlY3RlZF9ub2RlKCk7DQogICAgICBpZiAoc2VsZWN0ZWROb2RlKSB7DQogICAgICAgIHJldHVybiBzZWxlY3RlZE5vZGUuaWQ7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgIH0NCiAgICB9LA0KDQogICAgLy8g5YiH5o2i5oCd57u05a+85Zu+57uT5p6EDQogICAgdG9nZ2xlU3R1Y3R1cmUodHlwZSkgew0KICAgICAgaWYgKHRoaXMuc3RydWN0dXJlLmFjdGl2ZSA9PT0gdHlwZSkgcmV0dXJuOw0KICAgICAgdGhpcy5zdHJ1Y3R1cmUuYWN0aXZlID0gdHlwZTsNCiAgICAgIHN3aXRjaCAodHlwZSkgew0KICAgICAgICBjYXNlICdzaWRlJzoNCiAgICAgICAgICAvLyDkuKTovrnliIbluIMNCiAgICAgICAgICB0aGlzLmxvb3BBcnJheURhdGEodGhpcy5taW5kRGF0YS5kYXRhLCAoaXRlbSwgaSkgPT4gew0KICAgICAgICAgICAgaXRlbS5kaXJlY3Rpb24gPSBpICUgMiA/ICdsZWZ0JyA6ICdyaWdodCc7DQogICAgICAgICAgfSk7DQogICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgY2FzZSAnbXVsdGlUb1NpbmdsZSc6DQogICAgICAgICAgLy8g5ZCR5bem5YiG5biDDQogICAgICAgICAgdGhpcy5sb29wQXJyYXlEYXRhKHRoaXMubWluZERhdGEuZGF0YSwgKGl0ZW0pID0+IHsNCiAgICAgICAgICAgIGl0ZW0uZGlyZWN0aW9uID0gJ2xlZnQnOw0KICAgICAgICAgIH0pOw0KICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgIGNhc2UgJ3NpbmdsZVRvTXVsdGknOg0KICAgICAgICAgIC8vIOWQkeWPs+WIhuW4gw0KICAgICAgICAgIHRoaXMubG9vcEFycmF5RGF0YSh0aGlzLm1pbmREYXRhLmRhdGEsIChpdGVtKSA9PiB7DQogICAgICAgICAgICBpdGVtLmRpcmVjdGlvbiA9ICdyaWdodCc7DQogICAgICAgICAgfSk7DQogICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICBicmVhazsNCiAgICAgIH0NCiAgICB9LA0KDQogICAgLy8g5ouW5ou9DQogICAgaGFuZGxlRHJvcChkcmFnZ2luZ05vZGUsIGRyb3BOb2RlKSB7DQogICAgICAvLyDliY3kuIDkuKrlhYTlvJ/oioLngrkNCiAgICAgIGNvbnN0IHByZXZOb2RlID0gdGhpcy5qbS5maW5kX25vZGVfYmVmb3JlKGRyb3BOb2RlKTsNCiAgICAgIC8vIOiOt+WPluenu+WKqOWQjueahG5vZGUNCiAgICAgIGNvbnN0IGRyYWdGb3JtID0gew0KICAgICAgICBtb2RlbElkOiAnJywNCiAgICAgICAgdHJlZU51bTogIXByZXZOb2RlID8gZHJhZ2dpbmdOb2RlIDogcHJldk5vZGUuaWQsDQogICAgICAgIHRoaXNUcmVlTnVtOiBkcm9wTm9kZSwNCiAgICAgIH07DQogICAgICBjb25zb2xlLmxvZygnZHJhZ0Zvcm0nLCBkcmFnRm9ybSk7DQoNCiAgICAgIC8vIFRPRE8g6LCD5o6l5Y+jDQogICAgfSwNCiAgICAvLyDljZXlh7vph43nva7pgInkuK3og4zmma/popzoibINCiAgICBub2RlQ2xpY2soKSB7DQogICAgICB0aGlzLnNob3dNZW51ID0gZmFsc2U7DQogICAgICBjb25zdCBzZWxlY3RlZE5vZGUgPSB0aGlzLmptLmdldF9zZWxlY3RlZF9ub2RlKCk7DQogICAgICBpZiAoc2VsZWN0ZWROb2RlKSB7DQogICAgICAgIGNvbnNvbGUubG9nKCdzZWxlY3RlZE5vZGUnLCBzZWxlY3RlZE5vZGUpOw0KDQogICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSBzZWxlY3RlZE5vZGU7DQogICAgICAgIHRoaXMuYWRkVGFyZ2V0LnRvcGljID0gdGhpcy5jdXJyZW50Tm9kZS50b3BpYyB8fCAnJzsNCiAgICAgICAgdGhpcy50b2dnbGVTaWRlRWRpdG9yKHRydWUpOw0KICAgICAgfQ0KICAgIH0sDQogICAgLy8g6Zi75q2i5YaS5rOhDQogICAgbm9kZVByZXZlbnRDbGljaygpIHt9LA0KDQogICAgLy8g57yW6L6R6IqC54K5IC0tLS0tLS0tLS0tLS0tLQ0KDQogICAgLy8g5pS55Y+YdG9waWMNCiAgICBjaGFuZ2VOb2RlVG9waWModmFsKSB7DQogICAgICBpZiAodmFsKSB7DQogICAgICAgIHRoaXMuam0udXBkYXRlX25vZGUodGhpcy5jdXJyZW50Tm9kZS5pZCwgdmFsKTsNCiAgICAgICAgdGhpcy50aXBzQ2xpY2soKTsNCiAgICAgICAgdGhpcy5zdG9wREJjbGljaygpOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgdGhpcy4kbWVzc2FnZS5lcnJvcign6K+36L6T5YWl6IqC54K55qCH6aKYJyk7DQogICAgICB9DQogICAgfSwNCiAgICBjaGFuZ2VGb250V2VpZ2h0KCkgew0KICAgICAgY29uc3QgZm9udFdlaWdodCA9IHRoaXMuY3VycmVudE5vZGU/LmRhdGE/LlsnZm9udC13ZWlnaHQnXSA9PT0gJ2JvbGQnID8gJ25vcm1hbCcgOiAnYm9sZCc7DQogICAgICB0aGlzLmptLnNldF9ub2RlX2ZvbnRfc3R5bGUodGhpcy5jdXJyZW50Tm9kZS5pZCwgbnVsbCwgZm9udFdlaWdodCwgbnVsbCk7DQogICAgICBsZXQgZGF0YSA9IHRoaXMuY3VycmVudE5vZGUuZGF0YSB8fCB7fTsNCiAgICAgIGRhdGFbJ2ZvbnQtd2VpZ2h0J10gPSBmb250V2VpZ2h0Ow0KICAgICAgdGhpcy4kc2V0KHRoaXMuY3VycmVudE5vZGUsICdkYXRhJywgZGF0YSk7DQogICAgICBjb25zb2xlLmxvZyh0aGlzLmN1cnJlbnROb2RlKTsNCiAgICAgIHRoaXMuJGZvcmNlVXBkYXRlKCk7DQogICAgfSwNCiAgICBjaGFuZ2VGb250U3R5bGUoKSB7DQogICAgICBjb25zdCBmb250U3R5bGUgPSB0aGlzLmN1cnJlbnROb2RlPy5kYXRhPy5bJ2ZvbnQtc3R5bGUnXSA9PT0gJ2l0YWxpYycgPyAnbm9ybWFsJyA6ICdpdGFsaWMnOw0KICAgICAgdGhpcy5qbS5zZXRfbm9kZV9mb250X3N0eWxlKHRoaXMuY3VycmVudE5vZGUuaWQsIG51bGwsIG51bGwsIGZvbnRTdHlsZSk7DQogICAgICBsZXQgZGF0YSA9IHRoaXMuY3VycmVudE5vZGUuZGF0YSB8fCB7fTsNCiAgICAgIGRhdGFbJ2ZvbnQtc3R5bGUnXSA9IGZvbnRTdHlsZTsNCiAgICAgIHRoaXMuJHNldCh0aGlzLmN1cnJlbnROb2RlLCAnZGF0YScsIGRhdGEpOw0KICAgICAgdGhpcy4kZm9yY2VVcGRhdGUoKTsNCiAgICB9LA0KICAgIGNoYW5nZVRleHRTaXplKHZhbCkgew0KICAgICAgaWYgKHZhbCkgew0KICAgICAgICB0aGlzLmptLnNldF9ub2RlX2ZvbnRfc3R5bGUodGhpcy5jdXJyZW50Tm9kZS5pZCwgdmFsLCBudWxsLCBudWxsKTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHRoaXMuJG1lc3NhZ2UuZXJyb3IoJ+ivt+mAieaLqeWtl+S9k+Wkp+WwjycpOw0KICAgICAgfQ0KICAgIH0sDQogICAgLy8g5pS55Y+Y5paH5a2X6aKc6ImyDQogICAgY2hhbmdlVGV4dENvbG9yKHZhbCkgew0KICAgICAgaWYgKHZhbCkgew0KICAgICAgICB0aGlzLmptLnNldF9ub2RlX2NvbG9yKHRoaXMuY3VycmVudE5vZGUuaWQsIG51bGwsIHZhbCk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICB0aGlzLiRtZXNzYWdlLmVycm9yKCfor7fpgInmi6nmloflrZfpopzoibInKTsNCiAgICAgIH0NCiAgICB9LA0KICAgIC8vIOaUueWPmOiDjOaZr+minOiJsg0KICAgIGNoYW5nZU5vZGVDb2xvcih2YWwpIHsNCiAgICAgIGlmICh2YWwpIHsNCiAgICAgICAgdGhpcy5qbS5zZXRfbm9kZV9jb2xvcih0aGlzLmN1cnJlbnROb2RlLmlkLCB2YWwsIG51bGwpOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgdGhpcy4kbWVzc2FnZS5lcnJvcign6K+36YCJ5oup6IOM5pmv6aKc6ImyJyk7DQogICAgICB9DQogICAgfSwNCg0KICAgIC8vIOe8lui+keiKgueCueiuoeeul+WFrOW8jw0KICAgIGNoYW5nZU5vZGVNZW1vKHZhbCwgaWQpIHsNCiAgICAgIGlmICh2YWwpIHsNCiAgICAgICAgdGhpcy5sb29wQXJyYXlEYXRhKHRoaXMubWluZERhdGEuZGF0YSwgKGl0ZW0sIGkpID0+IHsNCiAgICAgICAgICBpZiAoaXRlbS5pZCA9PT0gaWQpIHsNCiAgICAgICAgICAgIGl0ZW0uY29udGVudCA9IHZhbDsNCiAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgICAgICB0aGlzLmptLnNob3codGhpcy5taW5kRGF0YSk7DQogICAgICAgIHRoaXMuc3RvcERCY2xpY2soKTsNCiAgICAgICAgdGhpcy50aXBzQ2xpY2soKTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHRoaXMuJG1lc3NhZ2UuZXJyb3IoJ+ivt+i+k+WFpeiKgueCueiuoeeul+WFrOW8jycpOw0KICAgICAgfQ0KICAgIH0sDQoNCiAgICBjaGFuZ2VOb2RlUmVsYXRpb24odmFsLCBpZCkgew0KICAgICAgaWYgKHZhbCkgew0KICAgICAgICB0aGlzLmxvb3BBcnJheURhdGEodGhpcy5taW5kRGF0YS5kYXRhLCAoaXRlbSwgaSkgPT4gew0KICAgICAgICAgIGlmIChpdGVtLmlkID09PSBpZCkgew0KICAgICAgICAgICAgaXRlbS5yZWxhdGlvbkNvbnRlbnQgPSB2YWw7DQogICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICAgICAgdGhpcy5qbS5zaG93KHRoaXMubWluZERhdGEpOw0KICAgICAgICB0aGlzLnN0b3BEQmNsaWNrKCk7DQogICAgICAgIHRoaXMudGlwc0NsaWNrKCk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICB0aGlzLiRtZXNzYWdlLmVycm9yKCfor7fovpPlhaXlhbPns7vmj4/ov7AnKTsNCiAgICAgIH0NCiAgICB9LA0KDQogICAgLy8g5a+85YWl5a2Q57qnDQogICAgaW1wb3J0Q2hpbGQoKSB7fSwNCg0KICAgIC8vIOaPkuWFpeWtkOe6pw0KICAgIGFkZENoaWxkKCkgew0KICAgICAgY29uc3Qgc2VsZWN0ZWROb2RlID0gdGhpcy5qbS5nZXRfc2VsZWN0ZWRfbm9kZSgpOw0KICAgICAgaWYgKHNlbGVjdGVkTm9kZSkgew0KICAgICAgICBsZXQgaWQgPSB1dGlscy51dWlkKCk7DQogICAgICAgIHRoaXMuam0uYWRkX25vZGUoc2VsZWN0ZWROb2RlLCBpZCwgJ+aWsOWinuiKgueCuScsIHsNCiAgICAgICAgICBsZXZlbDogc2VsZWN0ZWROb2RlLmRhdGEubGV2ZWwgKyAxLA0KICAgICAgICAgICdmb250LXNpemUnOiAxNiwNCiAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6DQogICAgICAgICAgICBzZWxlY3RlZE5vZGUuZGF0YS5sZXZlbCArIDEgPiB0aGlzLnByZWRlZmluZUNvbG9ycy5sZW5ndGggPyB0aGlzLnByZWRlZmluZUNvbG9yc1sxXSA6IHRoaXMucHJlZGVmaW5lQ29sb3JzW3NlbGVjdGVkTm9kZS5kYXRhLmxldmVsICsgMV0sDQogICAgICAgIH0pOw0KICAgICAgICB0aGlzLmdldE1pbmREYXRhKCk7DQogICAgICAgIHRoaXMuam0uc2VsZWN0X25vZGUoaWQpOw0KDQogICAgICAgIHRoaXMuc3RvcERCY2xpY2soKTsNCiAgICAgICAgdGhpcy5ub2RlQ2xpY2soKTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHRoaXMuJG1lc3NhZ2UuZXJyb3IoJ+ivt+mAieaLqeeItuiKgueCuScpOw0KICAgICAgfQ0KDQogICAgICB0aGlzLnNob3dNZW51ID0gZmFsc2U7DQogICAgfSwNCg0KICAgIGFkZENoaWxkQnlUYXJnZXQocm93KSB7DQogICAgICBjb25zdCBzZWxlY3RlZE5vZGUgPSB0aGlzLmptLmdldF9zZWxlY3RlZF9ub2RlKCk7DQogICAgICBpZiAoc2VsZWN0ZWROb2RlKSB7DQogICAgICAgIGxldCBpZCA9IHV0aWxzLnV1aWQoKTsNCiAgICAgICAgdGhpcy5qbS5hZGRfbm9kZShzZWxlY3RlZE5vZGUsIGlkLCByb3cubmFtZSwgew0KICAgICAgICAgIGxldmVsOiBzZWxlY3RlZE5vZGUuZGF0YS5sZXZlbCArIDEsDQogICAgICAgICAgY29kZTogcm93LmNvZGUsDQogICAgICAgICAgaW5kZXhUeXBlOiByb3cubGV2ZWwsDQogICAgICAgICAgJ2ZvbnQtc2l6ZSc6IDE2LA0KICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzoNCiAgICAgICAgICAgIHNlbGVjdGVkTm9kZS5kYXRhLmxldmVsICsgMSA+IHRoaXMucHJlZGVmaW5lQ29sb3JzLmxlbmd0aCA/IHRoaXMucHJlZGVmaW5lQ29sb3JzWzFdIDogdGhpcy5wcmVkZWZpbmVDb2xvcnNbc2VsZWN0ZWROb2RlLmRhdGEubGV2ZWwgKyAxXSwNCiAgICAgICAgfSk7DQogICAgICAgIHRoaXMuZ2V0TWluZERhdGEoKTsNCiAgICAgICAgdGhpcy5qbS5zZWxlY3Rfbm9kZShpZCk7DQogICAgICAgIHRoaXMuc3RvcERCY2xpY2soKTsNCiAgICAgICAgdGhpcy5ub2RlQ2xpY2soKTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHRoaXMuJG1lc3NhZ2UuZXJyb3IoJ+ivt+mAieaLqeeItuiKgueCuScpOw0KICAgICAgfQ0KICAgIH0sDQoNCiAgICAvLyDliKDpmaTljaHniYcNCiAgICBkZWxDYXJkKCkgew0KICAgICAgY29uc3Qgc2VsZWN0ZWROb2RlID0gdGhpcy5qbS5nZXRfc2VsZWN0ZWRfbm9kZSgpOw0KICAgICAgaWYgKHNlbGVjdGVkTm9kZS5kYXRhKSB7DQogICAgICAgIHRoaXMuam0ucmVtb3ZlX25vZGUoc2VsZWN0ZWROb2RlLmlkKTsNCiAgICAgICAgdGhpcy5nZXRNaW5kRGF0YSgpOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgdGhpcy4kbWVzc2FnZS5lcnJvcign6K+36YCJ5oup6IqC54K5Jyk7DQogICAgICB9DQogICAgICB0aGlzLnNob3dNZW51ID0gZmFsc2U7DQogICAgfSwNCg0KICAgIC8vIOiOt+WPluaVsOaNrg0KICAgIGdldE1pbmREYXRhKCkgew0KICAgICAgaWYgKHRoaXMuam0pIHsNCiAgICAgICAgdGhpcy5taW5kRGF0YSA9IHRoaXMuam0uZ2V0X2RhdGEoJ25vZGVfYXJyYXknKTsNCiAgICAgICAgY29uc29sZS5sb2codGhpcy5taW5kRGF0YSwgJ3RoaXMuZGF0YVVwZGF0YScpOw0KICAgICAgfQ0KICAgIH0sDQoNCiAgICAvLyDpvKDmoIfmu5rova7mlL7lpKfnvKnlsI8NCiAgICBtb3VzZVdoZWVsKCkgew0KICAgICAgaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpIHsNCiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZG9tTW91c2VTY3JvbGwnLCB0aGlzLnNjcm9sbEZ1bmMsIGZhbHNlKTsNCiAgICAgIH0NCiAgICAgIHRoaXMuJHJlZnMuY29udGFpbmVyLm9ubW91c2V3aGVlbCA9IHRoaXMuc2Nyb2xsRnVuYzsNCiAgICB9LA0KDQogICAgLy8g5rua6L2u57yp5pS+DQogICAgc2Nyb2xsRnVuYyhlKSB7DQogICAgICB0aGlzLnNob3dNZW51ID0gZmFsc2U7DQogICAgICBlID0gZSB8fCB3aW5kb3cuZXZlbnQ7DQogICAgICBpZiAoZS53aGVlbERlbHRhKSB7DQogICAgICAgIGlmIChlLndoZWVsRGVsdGEgPiAwKSB7DQogICAgICAgICAgdGhpcy56b29tSW4oKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICB0aGlzLnpvb21PdXQoKTsNCiAgICAgICAgfQ0KICAgICAgfSBlbHNlIGlmIChlLmRldGFpbCkgew0KICAgICAgICBpZiAoZS5kZXRhaWwgPiAwKSB7DQogICAgICAgICAgdGhpcy56b29tSW4oKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICB0aGlzLnpvb21PdXQoKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOw0KDQogICAgICB0aGlzLmptLnJlc2l6ZSgpOw0KICAgIH0sDQoNCiAgICAvLyDpvKDmoIfmi5bmi70NCiAgICBtb3VzZURyYWcoKSB7DQogICAgICAvLyDph4zlsYINCiAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmpzbWluZC1pbm5lcicpOw0KICAgICAgLy8g6YCJ5Lit6IqC54K5DQogICAgICBsZXQgc2VsZWN0ZWQ7DQoNCiAgICAgIGVsLm9ubW91c2Vkb3duID0gKGV2KSA9PiB7DQogICAgICAgIC8vIOmAieS4reiKgueCuQ0KICAgICAgICBzZWxlY3RlZCA9IHRoaXMuam0uZ2V0X3NlbGVjdGVkX25vZGUoKTsNCiAgICAgICAgLy8g5qCH6K+GIOaYr+WQpuaLluaLveiKgueCuSDpgb/lhY3lhrLnqoENCiAgICAgICAgdGhpcy5kcmFnTm9kZUZsYWcgPSAhIXNlbGVjdGVkOw0KDQogICAgICAgIGNvbnN0IGRpc1ggPSBldi5jbGllbnRYOw0KICAgICAgICBjb25zdCBkaXNZID0gZXYuY2xpZW50WTsNCiAgICAgICAgY29uc3Qgb3JpZ2luYWxTY3JvbGxMZWZ0ID0gZWwuc2Nyb2xsTGVmdDsNCiAgICAgICAgY29uc3Qgb3JpZ2luYWxTY3JvbGxUb3AgPSBlbC5zY3JvbGxUb3A7DQogICAgICAgIGNvbnN0IG9yaWdpbmFsU2Nyb2xsQmVoYXZpb3IgPSBlbC5zdHlsZVsnc2Nyb2xsLWJlaGF2aW9yJ107DQogICAgICAgIGNvbnN0IG9yaWdpbmFsUG9pbnRlckV2ZW50cyA9IGVsLnN0eWxlWydwb2ludGVyLWV2ZW50cyddOw0KICAgICAgICAvLyBhdXRvOiDpu5jorqTlgLzvvIzooajnpLrmu5rliqjmoYbnq4vljbPmu5rliqjliLDmjIflrprkvY3nva7jgIINCiAgICAgICAgZWwuc3R5bGVbJ3Njcm9sbC1iZWhhdmlvciddID0gJ2F1dG8nOw0KICAgICAgICAvLyDpvKDmoIfnp7vliqjkuovku7bmmK/nm5HlkKznmoTmlbTkuKpkb2N1bWVudO+8jOi/meagt+WPr+S7peS9v+m8oOagh+iDveWkn+WcqOWFg+e0oOWklumDqOenu+WKqOeahOaXtuWAmeS5n+iDveWunueOsOaLluWKqA0KICAgICAgICBkb2N1bWVudC5vbm1vdXNlbW92ZSA9IChldikgPT4gew0KICAgICAgICAgIGlmICh0aGlzLmRyYWdOb2RlRmxhZykgcmV0dXJuOw0KICAgICAgICAgIHRoaXMuZHJhZyA9IGZhbHNlOw0KICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7DQogICAgICAgICAgLy8g6K6h566X5ouW5ou955qE5YGP56e76Led56a7DQogICAgICAgICAgY29uc3QgZGlzdGFuY2VYID0gZXYuY2xpZW50WCAtIGRpc1g7DQogICAgICAgICAgY29uc3QgZGlzdGFuY2VZID0gZXYuY2xpZW50WSAtIGRpc1k7DQoNCiAgICAgICAgICBlbC5zY3JvbGxUbyhvcmlnaW5hbFNjcm9sbExlZnQgLSBkaXN0YW5jZVgsIG9yaWdpbmFsU2Nyb2xsVG9wIC0gZGlzdGFuY2VZKTsNCg0KICAgICAgICAgIC8vIOWcqOm8oOagh+aLluWKqOeahOaXtuWAmeWwhueCueWHu+S6i+S7tuWxj+iUveaOiQ0KICAgICAgICAgIGVsLnN0eWxlWydwb2ludGVyLWV2ZW50cyddID0gJ25vbmUnOw0KICAgICAgICAgIGVsLnN0eWxlLmN1cnNvciA9ICdncmFiYmluZyc7DQogICAgICAgIH07DQogICAgICAgIGRvY3VtZW50Lm9ubW91c2V1cCA9ICgpID0+IHsNCiAgICAgICAgICBpZiAoIXRoaXMuZHJhZ05vZGVGbGFnKSB7DQogICAgICAgICAgICBlbC5zdHlsZVsnc2Nyb2xsLWJlaGF2aW9yJ10gPSBvcmlnaW5hbFNjcm9sbEJlaGF2aW9yOw0KICAgICAgICAgICAgZWwuc3R5bGVbJ3BvaW50ZXItZXZlbnRzJ10gPSBvcmlnaW5hbFBvaW50ZXJFdmVudHM7DQogICAgICAgICAgICBlbC5zdHlsZS5jdXJzb3IgPSAnZ3JhYic7DQogICAgICAgICAgfQ0KICAgICAgICAgIGRvY3VtZW50Lm9ubW91c2Vtb3ZlID0gZG9jdW1lbnQub25tb3VzZXVwID0gbnVsbDsNCiAgICAgICAgfTsNCiAgICAgIH07DQogICAgfSwNCg0KICAgIHNhdmUoKSB7fSwNCiAgICBoYW5kbGVWZXJzaW9uQ2hhbmdlKHJvdykgew0KICAgICAgY29uc3QgeyBpZCwgbmFtZSwgY29kZSB9ID0gdGhpcy50YXNrRGF0YTsNCiAgICAgIC8vIOaJk+W8gOaWsOeahOmhtemdoiDliLAgaHJlZiDov5nkuKrpobXpnaINCiAgICAgIGNvbnN0IGhyZWYgPSB0aGlzLiRyb3V0ZXIucmVzb2x2ZSh7DQogICAgICAgIHBhdGg6ICcvYXJpdGhtZXRpY01hbmFnZS9hcml0aG1ldGljVGFzay9taW5kTWFwUGFnZScsDQogICAgICAgIHF1ZXJ5OiB7IGlkLCBuYW1lLCBjb2RlLCB2ZXJzaW9uOiByb3cuaWQgfSwNCiAgICAgIH0pLmhyZWY7DQogICAgICB3aW5kb3cub3BlbihocmVmLCAnX2JsYW5rJyk7DQogICAgfSwNCiAgICB0YWJsZVJvd0NsYXNzTmFtZSh7IHJvdywgcm93SW5kZXggfSkgew0KICAgICAgaWYgKHJvdy52ZXJzaW9uQ29kZSA9PT0gdGhpcy5jdXJWZXJzaW9uKSB7DQogICAgICAgIHJldHVybiAnY3VycmVudC1yb3cnOw0KICAgICAgfQ0KICAgICAgcmV0dXJuICcnOw0KICAgIH0sDQogICAgcmVsYXRpb25TZWFyY2goKSB7DQogICAgICAvLyDpgInkuK3oioLngrkNCiAgICAgIGxldCB7IGlkIH0gPSB0aGlzLmptLmdldF9zZWxlY3RlZF9ub2RlKCk7DQogICAgICAvLyDmiZPlvIDmlrDnmoTpobXpnaIg5YiwIGhyZWYg6L+Z5Liq6aG16Z2iDQogICAgICBjb25zdCBocmVmID0gdGhpcy4kcm91dGVyLnJlc29sdmUoew0KICAgICAgICBwYXRoOiAnL2FyaXRobWV0aWNNYW5hZ2UvYXJpdGhtZXRpY1Rhc2svdGFyZ2V0UmVsYXRpb24nLA0KICAgICAgICBxdWVyeTogeyBpZCB9LA0KICAgICAgfSkuaHJlZjsNCiAgICAgIHdpbmRvdy5vcGVuKGhyZWYsICdfYmxhbmsnKTsNCiAgICB9LA0KICB9LA0KDQogIGJlZm9yZURlc3Ryb3koKSB7DQogICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZG9tTW91c2VTY3JvbGwnLCB0aGlzLnNjcm9sbEZ1bmMsIGZhbHNlKTsNCiAgfSwNCn07DQo="},null]}