diff --git a/bower.json b/bower.json index fdb95f7bc..e7f2b2bc1 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "suneditor", - "version": "2.12.2", + "version": "2.12.3", "description": "Pure JavaScript based WYSIWYG web editor", "main": "src/suneditor.js", "keywords": [ diff --git a/dist/css/suneditor.min.css b/dist/css/suneditor.min.css index 31f18c390..daa547eff 100644 --- a/dist/css/suneditor.min.css +++ b/dist/css/suneditor.min.css @@ -1 +1 @@ -.sun-editor{-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;-webkit-user-select:none;background-color:#fff;border:1px solid #dadada;box-sizing:border-box;font-family:Helvetica Neue,sans-serif;height:auto;text-align:left;user-select:none;width:auto;z-index:2147483647}.sun-editor *{-webkit-user-drag:none;box-sizing:border-box}.sun-editor-common button,.sun-editor-common input,.sun-editor-common select,.sun-editor-common textarea{font-size:14px;line-height:1.5}.sun-editor-common blockquote,.sun-editor-common body,.sun-editor-common button,.sun-editor-common code,.sun-editor-common dd,.sun-editor-common div,.sun-editor-common dl,.sun-editor-common dt,.sun-editor-common fieldset,.sun-editor-common form,.sun-editor-common h1,.sun-editor-common h2,.sun-editor-common h3,.sun-editor-common h4,.sun-editor-common h5,.sun-editor-common h6,.sun-editor-common input,.sun-editor-common legend,.sun-editor-common li,.sun-editor-common ol,.sun-editor-common p,.sun-editor-common pre,.sun-editor-common select,.sun-editor-common td,.sun-editor-common textarea,.sun-editor-common th,.sun-editor-common ul{border:0;color:#000!important;margin:0;padding:0}.sun-editor-common dl,.sun-editor-common li,.sun-editor-common menu,.sun-editor-common ol,.sun-editor-common ul{list-style:none!important}.sun-editor-common hr{margin:6px 0!important}.sun-editor textarea{border:0!important;resize:none!important}.sun-editor button{background-color:transparent;border:0;cursor:pointer;outline:none;touch-action:manipulation}.sun-editor button,.sun-editor input,.sun-editor select,.sun-editor textarea{vertical-align:middle}.sun-editor button .txt{display:block;margin-top:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@font-face{font-family:Suneditor-icon;font-style:normal;font-weight:400;src:url(../fonts/28398a14fb94a1bd4bd01ffef18797f0.eot);src:url(../fonts/28398a14fb94a1bd4bd01ffef18797f0.eot?#iefix) format("embedded-opentype"),url(../fonts/e1628e0f13d16c7ae7ca4e67f51e7210.woff2) format("woff2"),url(../fonts/d117b428c34821bfee476a051633432a.woff) format("woff"),url(../fonts/795eb60c8740a93cf721c36003276e44.ttf) format("truetype"),url(../fonts/1e07d211f35e8389a91c0306fba57df6.svg#Glyphter) format("svg")}.sun-editor [class*=icon-]:before{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:#000;display:inline-block;font-family:Suneditor-icon;font-size:15px;font-style:normal;font-variant:normal;font-weight:400;text-rendering:auto}.sun-editor .sun-editor-id-toolbar [class*=icon-]:before{line-height:2.1}.sun-editor .icon-align-just:before{content:"A"}.sun-editor .icon-align-left:before{content:"B"}.sun-editor .icon-align-right:before{content:"C"}.sun-editor .icon-align-center:before{content:"D"}.sun-editor .icon-underline:before{content:"E"}.sun-editor .icon-bold:before{content:"F"}.sun-editor .icon-italic:before{content:"G"}.sun-editor .icon-strokethrough:before{content:"H"}.sun-editor .icon-subscript:before{content:"I"}.sun-editor .icon-superscript:before{content:"J"}.sun-editor .icon-redo:before{content:"K"}.sun-editor .icon-undo:before{content:"L"}.sun-editor .icon-erase:before{content:"M"}.sun-editor .icon-fontColor:before{content:"N"}.sun-editor .icon-hiliteColor:before{content:"O"}.sun-editor .icon-indent-left:before{content:"P"}.sun-editor .icon-indent-right:before{content:"Q"}.sun-editor .icon-list-bullets:before{content:"R"}.sun-editor .icon-list-number:before{content:"S"}.sun-editor .icon-grid:before{content:"T"}.sun-editor .icon-code-view:before{content:"U"}.sun-editor .icon-preview:before{content:"V"}.sun-editor .icon-showBlocks:before{content:"W"}.sun-editor .icon-expansion:before{content:"X"}.sun-editor .icon-reduction:before{content:"Y"}.sun-editor .icon-image:before{content:"Z"}.sun-editor .icon-link:before{content:"a"}.sun-editor .icon-video:before{content:"b"}.sun-editor .icon-print:before{content:"c"}.sun-editor .icon-modify:before{content:"d"}.sun-editor .icon-revert:before{content:"e"}.sun-editor .icon-arrow-down:before{content:"f";font-size:10px}.sun-editor .icon-map-pin:before{content:"g"}.sun-editor .icon-cancel:before{content:"h";font-size:10px}.sun-editor .icon-hr:before{content:"i"}.sun-editor .icon-insert-column-right:before{content:"j"}.sun-editor .icon-insert-row-below:before{content:"k"}.sun-editor .icon-insert-row-above:before{content:"l"}.sun-editor .icon-insert-column-left:before{content:"m"}.sun-editor .icon-delete-row:before{content:"n"}.sun-editor .icon-delete-column:before{content:"o"}.sun-editor .icon-quote:before{content:"p"}.sun-editor .icon-empty-file:before{content:"q"}.sun-editor .icon-paragraph:before{content:"r"}.sun-editor .icon-delete:before{content:"s"}.sun-editor .icon-rotate-left:before{content:"t"}.sun-editor .icon-rotate-right:before{content:"u"}.sun-editor .icon-mirror-horizontal:before{content:"v"}.sun-editor .icon-mirror-vertical:before{content:"w"}.sun-editor .icon-save:before{content:"x"}.sun-editor .sun-editor-container{height:100%;position:relative;width:100%}.sun-editor .arrow,.sun-editor .arrow:after{border:11px solid transparent;display:block;height:0;position:absolute;width:0}.sun-editor .arrow.arrow-up{border-bottom-color:rgba(0,0,0,.25);border-top-width:0;left:20px;margin-left:-11px;top:-11px}.sun-editor .arrow.arrow-up:after{border-bottom-color:#fff;border-top-width:0;content:" ";margin-left:-11px;top:1px}.sun-editor .sun-editor-id-toolbar .arrow.arrow-up:after{border-bottom-color:#fafafa}.sun-editor .arrow.arrow-down{border-bottom-width:0;border-top-color:rgba(0,0,0,.25);left:0;margin-left:-11px;top:0}.sun-editor .arrow.arrow-down:after{border-bottom-width:0;border-top-color:#fff;content:" ";margin-left:-11px;top:-12px}.sun-editor .sun-editor-id-toolbar .arrow.arrow-down:after{border-top-color:#fafafa}.sun-editor .sun-editor-id-toolbar{background-color:#fafafa;display:block;height:auto;margin:0;outline:1px solid #dadada;overflow:visible;padding:4px 3px 0;position:relative;z-index:2}.sun-editor .sun-editor-id-toolbar-cover{background-color:#fefefe;cursor:not-allowed;display:none;filter:alpha(opacity=50);font-size:36px;height:100%;left:0;opacity:.5;position:absolute;top:0;width:100%;z-index:4}.sun-editor .sun-editor-toolbar-separator-vertical{display:inline-block;height:31px;margin:2px;vertical-align:top;width:1px}.sun-editor .sun-editor-id-toolbar.sun-inline-toolbar{-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);display:none;position:absolute}.sun-editor .sun-editor-id-toolbar.sun-editor-sticky{position:fixed;top:0}.sun-editor .sun-editor-sticky-dummy{display:none;position:static;z-index:-1}.sun-editor .tool_module{display:inline-block}.sun-editor .sun-editor-module-border{border:1px solid #dadada;border-radius:5px}.sun-editor .tool_module_enter{background-color:transparent;display:block;height:1px;margin-bottom:5px;width:100%}.sun-editor .editor_tool,.sun-editor .editor_tool li{float:left;margin:0;padding:0}.sun-editor .editor_tool li{position:relative}.sun-editor .btn_editor{border:0;border-radius:4px;float:left;font-size:12px;height:35px;line-height:27px;margin:1px!important;overflow:hidden;width:35px}.sun-editor .btn_editor:enabled:focus,.sun-editor .btn_editor:enabled:hover{background-color:#d4e3ea;border-color:#bbd5e0;outline:0 none}.sun-editor .btn_editor:enabled:active{-webkit-box-shadow:inset 0 3px 5px #bbd5e0;background-color:#d4e3ea;border-color:#bbd5e0;box-shadow:inset 0 3px 5px #bbd5e0}.sun-editor .btn_editor:enabled.on{background-color:#d4e3ea;border-color:#bbd5e0;outline:0 none}.sun-editor .btn_editor:enabled.on:focus,.sun-editor .btn_editor:enabled.on:hover{background-color:#bbd5e0;border-color:#8baab7;outline:0 none}.sun-editor .btn_editor:enabled.on:active{-webkit-box-shadow:inset 0 3px 5px #8baab7;background-color:#bbd5e0;border-color:#8baab7;box-shadow:inset 0 3px 5px #8baab7}.sun-editor .btn_edit:enabled:focus,.sun-editor .btn_edit:enabled:hover{background-color:#d4e3ea;border-color:#bbd5e0;outline:0 none}.sun-editor .btn_edit:enabled:active{-webkit-box-shadow:inset 0 3px 5px #bbd5e0;background-color:#d4e3ea;border-color:#bbd5e0;box-shadow:inset 0 3px 5px #bbd5e0}.sun-editor .btn_edit:disabled,.sun-editor .btn_editor:disabled,.sun-editor .btn_editor:disabled *,.sun-editor :disabled [class*=icon-]:before{background:#fafafa;color:transparent;cursor:default;text-shadow:0 0 3px #ccc}.sun-editor .layer_editor{-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);background-color:#fff;border:1px solid #bababa;border-radius:2px;box-shadow:0 3px 9px rgba(0,0,0,.5);display:none;left:1px;outline:0 none;overflow-x:hidden;overflow-y:auto;position:absolute;top:37px;z-index:3}.sun-editor .layer_editor.layer_size{max-height:300px}.sun-editor .layer_editor .write_place .inp_txt{border:0;float:left;font-size:12px;height:23px;margin-top:0;outline:0 none;text-indent:6px;width:100%}.sun-editor .layer_editor button{margin:0!important;overflow:hidden;width:100%}.sun-editor .editor_tool .layer_editor button:focus,.sun-editor .layer_editor button:hover{background-color:#d4e3ea;border-color:#bbd5e0;outline:0 none}.sun-editor .layer_editor .list_family{left:0;width:156px}.sun-editor .layer_editor .list_family .default{border-bottom:1px solid #ccc}.sun-editor .layer_editor .format_list{left:0;width:175px}.sun-editor .layer_editor .format_list li{padding:0;width:100%}.sun-editor .layer_editor .format_list .btn_edit{height:auto;line-height:100%;margin:0 0 4px!important;padding:2px 10px 5px}.sun-editor .layer_editor .format_list .txt_size18{padding:1px 10px 6px}.sun-editor .layer_editor .format_list .txt_size24{line-height:24px;padding:3px 10px 11px}.sun-editor .layer_editor .format_list .txt_size36{line-height:36px;padding:4px 10px 15px}.sun-editor .layer_editor .font_size_list{left:0;width:140px}.sun-editor .layer_editor .font_size_list .btn_edit{height:auto;line-height:normal!important;margin:0 0 7px!important;padding:2px 10px 5px}.sun-editor .layer_editor .layer_list{left:0;width:42px}.sun-editor .layer_editor .layer_line{left:0;width:158px}.sun-editor .layer_editor .write_place{border:1px solid #dadada;float:left;height:25px;overflow:hidden;position:relative}.sun-editor .layer_align{left:9px;width:125px}.sun-editor .btn_align .img_editor{display:inline-block;height:32px;margin:-1px 10px 0 0;vertical-align:middle;width:14px}.sun-editor .list_editor{overflow:hidden;padding:6px 0;width:100%}.sun-editor .list_editor li:first-child{padding-top:0}.sun-editor .list_editor li{padding-top:5px;width:100%}.sun-editor .font_size_list li{padding:0;width:100%}.sun-editor .layer_editor.layer_line{left:0;width:158px}.sun-editor .btn_edit{font-size:12px;height:28px;line-height:22px;margin-left:0;padding:0 14px;text-align:left;text-decoration:none;text-indent:0;width:100%}.sun-editor .btn_font{padding:0;text-align:left;text-indent:7px;width:100px}.sun-editor .btn_format{padding:0;text-align:left;text-indent:7px;width:90px}.sun-editor .btn_size{padding:0;text-align:left;text-indent:7px;width:70px}.sun-editor .btn_font .txt{float:left;width:65px}.sun-editor .btn_format .txt{float:left;width:55px}.sun-editor .btn_size .txt{float:left;width:35px}.sun-editor .table-content{-webkit-background-clip:padding-box;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box;background-color:#fff;border:1px solid #ccc;border-radius:4px;box-shadow:0 6px 12px rgba(0,0,0,.175);float:left;font-size:14px;left:1px;list-style:none;margin:2px 0 0;padding:5px 0;position:absolute;text-align:left;top:34px;z-index:3}.sun-editor .table-data-form{font-size:18px;padding:0 5px}.sun-editor .table-picker{cursor:pointer;font-size:18px;height:10em;position:absolute!important;width:10em;z-index:3}.sun-editor .table-highlighted{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQyIDc5LjE2MDkyNCwgMjAxNy8wNy8xMy0wMTowNjozOSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OEE2QjczMzdCN0VGMTFFODg3MENEMDIzNTU4M0UyQzciIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OEE2QjczMzZCN0VGMTFFODg3MENEMDIzNTU4M0UyQzciIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NDM2MjRFMUVCN0VFMTFFODg2RkM4MEYzQTg4MjU3RTkiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NDM2MjRFMUZCN0VFMTFFODg2RkM4MEYzQTg4MjU3RTkiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5dMgLsAAAARUlEQVR42mL8//8/AzUAC4joWb2DbNNKQj0Y4QaBgIaKMsmG3LhzF85mYqASGDVo1KBRgwjnfvQMSA5gpFZ5RDWvAQQYAKYZD7SDi983AAAAAElFTkSuQmCC") repeat;font-size:18px;height:1em;position:absolute!important;width:1em;z-index:2}.sun-editor .table-unhighlighted{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIj4+Pjp6ekKlAqjAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKhmnaJzPAAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC") repeat;font-size:18px;height:5em;position:relative!important;width:5em;z-index:1}.sun-editor .table-display{padding-left:5px}.sun-editor .sun-editor-id-table-edit{-webkit-background-clip:padding-box;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:6px;box-shadow:0 5px 10px rgba(0,0,0,.2);display:none;font-size:14px;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.42857143;padding:1px;position:absolute;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;width:165px;word-break:normal;word-spacing:normal;word-wrap:normal}.sun-editor .layer_editor .pallet_color_selector{display:flex;height:auto;width:285px}.sun-editor .layer_editor .list_color{height:100%;padding:7px;width:100%}.sun-editor .layer_editor .list_color li{display:flex;float:left;margin:0;position:relative}.sun-editor .layer_editor .list_color button{display:block;height:30px;overflow:hidden;text-indent:-9999px;width:30px}.sun-editor .layer_editor .list_color button:focus,.sun-editor .layer_editor .list_color button:hover{border:1px solid #000}.sun-editor .sub-form-group{height:34px;padding:0 7px 7px}.sun-editor .sub-form-group label{display:inline-block;font-size:14px;font-weight:700;letter-spacing:1px}.sun-editor .sub-form-group input{border-bottom:5px solid #8baab7;display:inline-block;font-size:14px;text-transform:uppercase;width:130px}.sun-editor .sub-form-group input:focus{outline:none}.sun-editor .sub-form-group button{background-color:#bbd5e0;border-color:#a2bfcc;float:right;height:100%;outline:0 none;padding:0 15px;width:auto}.sun-editor .sun-editor-id-editorArea{height:auto;overflow:hidden;position:static;width:100%;z-index:1}.sun-editor .sun-editor-id-editorArea .input_editor{-khtml-user-select:text;-moz-user-select:text;-ms-user-select:text;-o-user-select:text;-webkit-overflow-scrolling:touch;-webkit-user-select:text;height:100%;overflow-x:hidden;overflow-y:auto;user-select:text;width:100%}.sun-editor .sun-editor-id-editorArea .input_editor:focus{outline:none}.sun-editor .sun-editor-id-editorArea .sun-editor-id-code{background-color:#191919;color:#fff;font-family:Helvetica Neue,sans-serif;font-size:13px;margin:0;padding:0;word-break:break-all}.sun-editor .sun-editor-id-resizingBar{background-color:#fafafa;border-top:1px solid #dadada;cursor:ns-resize;height:16px;padding:2px 8px;width:auto}.sun-editor .sun-editor-id-resizingBar.none-resize{cursor:default}.sun-editor .sun-editor-id-navigation{font-size:11px;font-weight:700;height:auto;line-height:1;margin:0;padding:0;position:absolute;width:auto}.sun-editor .sun-editor-id-dialogBox,.sun-editor .sun-editor-id-resize-background{display:none;height:100%;left:0;position:absolute;top:0;width:100%;z-index:2147483647}.sun-editor .sun-editor-id-dialogBox button,.sun-editor .sun-editor-id-dialogBox input,.sun-editor .sun-editor-id-dialogBox label{color:#111;font-size:14px;line-height:1.5;margin:0}.sun-editor .sun-editor-id-dialogBox .modal-dialog-background{background-color:#222;height:100%;left:0;opacity:.5;position:absolute;top:0;width:100%}.sun-editor .modal-dialog{height:100%;left:0;position:absolute;top:0;width:100%}.sun-editor .modal-dialog .modal-content{-webkit-background-clip:padding-box;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:6px;box-shadow:0 3px 9px rgba(0,0,0,.5);margin:8px auto;outline:0;position:relative;width:500px}@media screen and (max-width:509px){.sun-editor .modal-dialog .modal-content{width:100%}}.sun-editor .modal-dialog .modal-header{border-bottom:1px solid #e5e5e5;height:50px;padding:15px 15px 5px}.sun-editor .modal-dialog button.close{-webkit-appearance:none;background:transparent;border:0;color:#000;filter:alpha(opacity=100);float:right;font-size:21px;font-weight:700;line-height:1;margin:0!important;opacity:1;padding:0!important;text-shadow:0 1px 0 #fff}.sun-editor .modal-dialog button.close:focus,.sun-editor .modal-dialog button.close:hover{color:#a2bfcc!important}.sun-editor .modal-dialog .modal-body{padding:15px;position:relative}.sun-editor .modal-dialog .form-group{margin-bottom:15px}.sun-editor .modal-dialog .form-group-footer{margin-top:15px}.sun-editor .modal-dialog input:disabled{background-color:#f3f3f3}.sun-editor .modal-dialog .size-text{width:100%}.sun-editor .modal-dialog .size-text .size-h,.sun-editor .modal-dialog .size-text .size-w{text-align:center;width:72px}.sun-editor .modal-dialog .size-x{margin:0 8px;text-align:center;width:25px}.sun-editor .modal-dialog .form-size-control{-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);color:#555;display:inline-block;font-size:14px;height:34px;line-height:1.42857143;text-align:center;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:70px}.sun-editor .modal-dialog .modal-content label{display:inline-block;font-weight:700;margin-bottom:5px;max-width:100%}.sun-editor .modal-dialog .form-control{-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);color:#555;display:block;font-size:14px;height:34px;line-height:1.42857143;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:100%}.sun-editor .modal-dialog .modal-footer{border-top:1px solid #e5e5e5;padding:10px 15px 0;text-align:right}.sun-editor .modal-dialog .modal-content .btn{-ms-touch-action:manipulation;background-image:none;border:1px solid transparent;border-radius:4px;display:inline-block;font-size:14px;font-weight:400;line-height:1.42857143;margin:0 0 10px!important;padding:6px 12px;text-align:center;touch-action:manipulation;vertical-align:middle;white-space:nowrap}.sun-editor .modal-dialog .modal-content input:focus{-webkit-box-shadow:inset 0 1px 1px #a2bfcc,0 0 8px #d4e3ea;border-color:#a2bfcc;box-shadow:inset 0 1px 1px #a2bfcc,0 0 8px #d4e3ea;outline:0}.sun-editor .modal-dialog .modal-radio{margin-left:12px;margin-right:5px}.sun-editor .modal-dialog .btn-primary{background-color:#d4e3ea;border-color:#a2bfcc;color:#fff}.sun-editor .modal-dialog .btn-primary:focus,.sun-editor .modal-dialog .btn-primary:hover{background-color:#bbd5e0!important;border-color:#a2bfcc!important;outline:0 none!important}.sun-editor .modal-dialog .btn-primary:active{-webkit-box-shadow:inset 0 3px 5px #a2bfcc;background-color:#bbd5e0;border-color:#a2bfcc;box-shadow:inset 0 3px 5px #a2bfcc}.sun-editor .sun-editor-id-loading{background-color:#fff;display:none;filter:alpha(opacity=70);height:100%;left:0;opacity:.7;position:absolute;top:0;width:100%;z-index:2147483647}.sun-editor .sun-editor-id-loading .loading-effect{animation:spinner .8s linear infinite;border-radius:50%;border-right:2px solid transparent;border-top:2px solid #07d;display:block;height:25px;left:50%;margin:-25px 0 0 -25px;position:absolute;top:50%;width:25px}@keyframes spinner{to{transform:rotate(1turn)}}.sun-editor .resize-btn{-webkit-background-clip:padding-box;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);background-clip:padding-box;background-color:#fff;border:1px solid #ccc;border-radius:6px;box-shadow:0 5px 10px rgba(0,0,0,.2);display:none;font-size:14px;font-style:normal;font-weight:400;left:0;letter-spacing:normal;line-break:auto;line-height:1.42857143;margin-top:-50px!important;padding:0 0 2px;position:absolute;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;top:0;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal}.sun-editor .btn-group{display:flex;padding:2px 2px 2px 0;position:relative;vertical-align:middle}.sun-editor .btn-group button{-ms-touch-action:manipulation;background-color:#fff!important;border:1px solid rgba(0,0,0,.2)!important;border-bottom-right-radius:0;border-radius:4px!important;border-top-right-radius:0;display:inline-block;font-size:12px!important;font-weight:400;height:32px;line-height:1.5!important;margin:0 0 0 2px!important;padding:5px 10px!important;position:relative;text-align:center;touch-action:manipulation;vertical-align:middle;white-space:nowrap}.sun-editor .btn-group.remove button{height:100%;height:32px;width:100%}.sun-editor .btn-group button:active{-webkit-box-shadow:inset 0 3px 5px #bbd5e0;background-color:#d4e3ea;border-color:#a2bfcc;box-shadow:inset 0 3px 5px #bbd5e0}.sun-editor .btn-group button:hover,.sun-editor .resize-btn button:focus{background-color:#d4e3ea!important;border-color:#bbd5e0!important;outline:0 none!important}.sun-editor .modal-resize-container{border:1px solid #a2bfcc;display:none;position:absolute}.sun-editor .modal-resize-container .modal-resize{background-color:#a2bfcc;display:inline-block;opacity:.3;position:absolute}.sun-editor .modal-resize-container .resize-dot{height:100%;left:0;position:absolute;top:0;width:100%}.sun-editor .modal-resize-container .resize-dot>div{background-color:#a2bfcc;border:1px solid #000;height:7px;position:absolute;width:7px}.sun-editor .modal-resize-container .resize-dot>.tl{cursor:nw-resize;left:-5px;top:-5px}.sun-editor .modal-resize-container .resize-dot>.tr{cursor:ne-resize;right:-5px;top:-5px}.sun-editor .modal-resize-container .resize-dot>.bl{bottom:-5px;cursor:sw-resize;left:-5px}.sun-editor .modal-resize-container .resize-dot>.br{bottom:-5px;cursor:se-resize;right:-5px}.sun-editor .modal-resize-container .resize-dot>.lw{bottom:50%;cursor:w-resize;left:-7px}.sun-editor .modal-resize-container .resize-dot>.th{cursor:n-resize;left:50%;top:-7px}.sun-editor .modal-resize-container .resize-dot>.rw{bottom:50%;cursor:e-resize;right:-7px}.sun-editor .modal-resize-container .resize-dot>.bh{bottom:-7px;cursor:s-resize;right:50%}.sun-editor .modal-resize-container .resize-display{-moz-border-radius:5px;-webkit-border-radius:5px;background-color:red;border-radius:5px;bottom:0;color:#fff;font-size:12px;margin:5px;padding:5px;position:absolute;right:0}.sun-editor .sun-editor-id-link-btn{-webkit-background-clip:padding-box;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:6px;box-shadow:0 5px 10px rgba(0,0,0,.2);display:none;font-size:14px;font-style:normal;font-weight:400;left:0;letter-spacing:normal;line-break:auto;line-height:1.42857143;padding:1px;position:absolute;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;top:0;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal}.sun-editor .sun-editor-id-link-btn:after,.sun-editor .sun-editor-id-link-btn:before{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sun-editor .sun-editor-id-link-btn .link-content{margin:0;padding:0}.sun-editor .sun-editor-id-link-btn .link-content a{display:inline-block;margin-left:5px;max-width:200px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.sun-editor .sun-editor-tab-button{border-bottom:1px solid #e5e5e5;height:25px;width:100%}.sun-editor .sun-editor-tab-button button{background-color:#e5e5e5;border-right:1px solid #e5e5e5;float:left;outline:none;padding:2px 13px;transition:.3s}.sun-editor .sun-editor-tab-button button:hover{background-color:#fff}.sun-editor .sun-editor-tab-button button.active{background-color:#fff;border-bottom:0}.sun-editor .sun-editor-id-notice{background-color:#f2dede;border:1px solid #eed3d7;color:#b94a48;display:none;font-size:13px;height:auto;margin:0;padding:15px;position:relative;width:100%;word-break:break-all}.sun-editor .sun-editor-id-notice button{float:right}.sun-editor-editable{background-color:#fff;color:#000;font-family:Helvetica Neue,sans-serif;font-size:13px;margin:0;padding:10px 20px;text-align:left;word-break:break-all}.sun-editor-editable *{background-color:inherit;box-sizing:border-box;color:inherit;font-family:inherit;font-size:inherit}.sun-editor-editable figcaption,.sun-editor-editable figure,.sun-editor-editable iframe,.sun-editor-editable img,.sun-editor-editable td,.sun-editor-editable th{position:relative}.sun-editor-editable .float-left{float:left}.sun-editor-editable .float-right{float:right}.sun-editor-editable .float-center{float:center}.sun-editor-editable .float-none{float:none}.sun-editor-editable a{color:#004cff;text-decoration:none}.sun-editor-editable a:focus,.sun-editor-editable a:hover{color:#0093ff;cursor:pointer;text-decoration:underline}.sun-editor-editable pre{background-color:#f6f8fa;border:1px solid #dce5e5;border-radius:3px;color:#333;display:block;font-size:13px;line-height:1.45;margin:0;overflow:auto;padding:8px;word-break:break-all;word-wrap:break-word}.sun-editor-editable ol{list-style-type:decimal}.sun-editor-editable ol,.sun-editor-editable ul{display:block;margin-block-end:1em;margin-block-start:1em;margin-inline-end:0;margin-inline-start:0;padding-inline-start:40px}.sun-editor-editable ul{list-style-type:disc}.sun-editor-editable li{display:list-item;margin-bottom:5px;text-align:-webkit-match-parent}.sun-editor-editable sub,.sun-editor-editable sup{font-size:75%;line-height:0}.sun-editor-editable sub{vertical-align:sub}.sun-editor-editable sup{vertical-align:super}.sun-editor-editable p{display:block;margin-block-end:1em;margin-block-start:1em;margin-inline-end:0;margin-inline-start:0}.sun-editor-editable div{display:block;margin:0;padding:0}.sun-editor-editable blockquote{border-color:#8baab7;border-style:solid;border-width:0 0 0 5px;display:block;margin-block-end:1em;margin-block-start:1em;margin-inline-end:40px;margin-inline-start:40px;padding:0 5px 0 20px}.sun-editor-editable blockquote blockquote{border-color:#a2bfcc}.sun-editor-editable blockquote blockquote blockquote{border-color:#bbd5e0}.sun-editor-editable blockquote blockquote blockquote blockquote{border-color:#d4e3ea}.sun-editor-editable h1{font-size:2em;margin-block-end:.67em;margin-block-start:.67em}.sun-editor-editable h1,.sun-editor-editable h2{display:block;font-weight:700;margin-inline-end:0;margin-inline-start:0}.sun-editor-editable h2{font-size:1.5em;margin-block-end:.83em;margin-block-start:.83em}.sun-editor-editable h3{font-size:1.17em;margin-block-end:1em;margin-block-start:1em}.sun-editor-editable h3,.sun-editor-editable h4{display:block;font-weight:700;margin-inline-end:0;margin-inline-start:0}.sun-editor-editable h4{margin-block-end:1.33em;margin-block-start:1.33em}.sun-editor-editable h5{font-size:.83em;margin-block-end:1.67em;margin-block-start:1.67em}.sun-editor-editable h5,.sun-editor-editable h6{display:block;font-weight:700;margin-inline-end:0;margin-inline-start:0}.sun-editor-editable h6{font-size:.67em;margin-block-end:2.33em;margin-block-start:2.33em}.sun-editor-editable hr{border-color:#000;border-image:initial;border-width:1px 0 0;display:block;height:1px}.sun-editor-editable hr.solid{border-style:solid none none}.sun-editor-editable hr.dotted{border-style:dotted none none}.sun-editor-editable hr.dashed{border-style:dashed none none}.sun-editor-editable img.inner-link{margin:1px;outline:1px solid #a2bfcc;padding:1px}.sun-editor-editable table{background-color:transparent;border:1px solid #ccc;border-collapse:collapse;border-spacing:0;display:table;margin-bottom:20px;max-width:100%;table-layout:auto;width:100%}.sun-editor-editable table tr{border:1px solid #ccc}.sun-editor-editable table td{border:1px solid #ccc;padding:8px}.sun-editor-editable table td.sun-editor-selected-cell{outline:2px solid #8baab7}.sun-editor-editable .sun-editor-id-comp{display:flex;padding:1px}.sun-editor-editable[contenteditable=true] .sun-editor-id-comp{outline:1px dashed #ccc}.sun-editor-editable figure.sun-editor-figure-cover{display:block;margin:0;outline:none;padding:0}.sun-editor-editable figure.sun-editor-figure-cover figcaption{background-color:#f3f3f3;font-size:13px;margin:0;outline:none;padding:1em .5em}.sun-editor-editable figure.sun-editor-figure-cover figcaption p{line-height:2;margin:0}.sun-editor-editable .sun-editor-id-image-container a img{margin:1px;outline:1px solid #8baab7;padding:1px}.sun-editor-editable .sun-editor-id-iframe-container iframe{outline:1px solid #9e9e9e}.sun-editor-editable .sun-editor-id-iframe-inner-resizing-cover{display:none}.sun-editor-editable[contenteditable=true] .sun-editor-id-iframe-inner-resizing-cover{background-color:transparent;display:block;height:100%;left:0;position:absolute;top:0;width:100%}.sun-editor-show-block div,.sun-editor-show-block h1,.sun-editor-show-block h2,.sun-editor-show-block h3,.sun-editor-show-block h4,.sun-editor-show-block h5,.sun-editor-show-block h6,.sun-editor-show-block p{border:1px dashed #a2bfcc;padding:10px 8px 8px}.sun-editor-show-block p{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAAPAQMAAAAF7dc0AAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAaSURBVAjXY/j/gwGCPvxg+F4BQiAGDP1HQQByxxw0gqOzIwAAAABJRU5ErkJggg==") no-repeat}.sun-editor-show-block div{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAPAQMAAAAxlBYoAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAmSURBVAjXY/j//wcDDH+8XsHwDYi/hwNx1A8w/nYLKH4XoQYJAwCXnSgcl2MOPgAAAABJRU5ErkJggg==") no-repeat}.sun-editor-show-block h1{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPAQMAAAA4f7ZSAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAfSURBVAjXY/j/v4EBhr+9B+LzEPrDeygfhI8j1CBhAEhmJGY4Rf6uAAAAAElFTkSuQmCC") no-repeat}.sun-editor-show-block h2{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPAQMAAAA4f7ZSAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAmSURBVAjXY/j/v4EBhr+dB+LtQPy9geEDEH97D8T3gbgdoQYJAwA51iPuD2haEAAAAABJRU5ErkJggg==") no-repeat}.sun-editor-show-block h3{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPAQMAAAA4f7ZSAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAiSURBVAjXY/j/v4EBhr+dB+LtQPy9geHDeQgN5p9HqEHCADeWI+69VG2MAAAAAElFTkSuQmCC") no-repeat}.sun-editor-show-block h4{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAPAQMAAADTSA1RAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAiSURBVAjXY/j//wADDH97DsTXIfjDdiDdDMTfIRhZHRQDAKJOJ6L+K3y7AAAAAElFTkSuQmCC") no-repeat}.sun-editor-show-block h5{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPAQMAAAA4f7ZSAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAlSURBVAjXY/j/v4EBhr+1A/F+IO5vYPiwHUh/B2IQfR6hBgkDABlWIy5uM+9GAAAAAElFTkSuQmCC") no-repeat}.sun-editor-show-block h6{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPAQMAAAA4f7ZSAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAiSURBVAjXY/j/v4EBhr+dB+LtQLy/geFDP5S9HSKOrA6KAR9GIza1ptJnAAAAAElFTkSuQmCC") no-repeat} \ No newline at end of file +.sun-editor{width:auto;height:auto;z-index:2147483647;box-sizing:border-box;font-family:Helvetica Neue,sans-serif;border:1px solid #dadada;text-align:left;background-color:#fff;user-select:none;-o-user-select:none;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-ms-user-select:none}.sun-editor *{box-sizing:border-box;-webkit-user-drag:none}.sun-editor-common button,.sun-editor-common input,.sun-editor-common select,.sun-editor-common textarea{font-size:14px;line-height:1.5}.sun-editor-common blockquote,.sun-editor-common body,.sun-editor-common button,.sun-editor-common code,.sun-editor-common dd,.sun-editor-common div,.sun-editor-common dl,.sun-editor-common dt,.sun-editor-common fieldset,.sun-editor-common form,.sun-editor-common h1,.sun-editor-common h2,.sun-editor-common h3,.sun-editor-common h4,.sun-editor-common h5,.sun-editor-common h6,.sun-editor-common input,.sun-editor-common legend,.sun-editor-common li,.sun-editor-common ol,.sun-editor-common p,.sun-editor-common pre,.sun-editor-common select,.sun-editor-common td,.sun-editor-common textarea,.sun-editor-common th,.sun-editor-common ul{margin:0;padding:0;border:0;color:#000!important}.sun-editor-common dl,.sun-editor-common li,.sun-editor-common menu,.sun-editor-common ol,.sun-editor-common ul{list-style:none!important}.sun-editor-common hr{margin:6px 0!important}.sun-editor textarea{resize:none!important;border:0!important}.sun-editor button{border:0;background-color:transparent;touch-action:manipulation;cursor:pointer;outline:none}.sun-editor button,.sun-editor input,.sun-editor select,.sun-editor textarea{vertical-align:middle}.sun-editor button .txt{display:block;margin-top:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@font-face{font-family:Suneditor-icon;src:url(../fonts/28398a14fb94a1bd4bd01ffef18797f0.eot);src:url(../fonts/28398a14fb94a1bd4bd01ffef18797f0.eot?#iefix) format("embedded-opentype"),url(../fonts/e1628e0f13d16c7ae7ca4e67f51e7210.woff2) format("woff2"),url(../fonts/d117b428c34821bfee476a051633432a.woff) format("woff"),url(../fonts/795eb60c8740a93cf721c36003276e44.ttf) format("truetype"),url(../fonts/1e07d211f35e8389a91c0306fba57df6.svg#Glyphter) format("svg");font-weight:400;font-style:normal}.sun-editor [class*=icon-]:before{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Suneditor-icon;display:inline-block;font-style:normal;font-variant:normal;font-weight:400;text-rendering:auto;font-size:15px;color:#000}.sun-editor .sun-editor-id-toolbar [class*=icon-]:before{line-height:2.1}.sun-editor .icon-align-just:before{content:"A"}.sun-editor .icon-align-left:before{content:"B"}.sun-editor .icon-align-right:before{content:"C"}.sun-editor .icon-align-center:before{content:"D"}.sun-editor .icon-underline:before{content:"E"}.sun-editor .icon-bold:before{content:"F"}.sun-editor .icon-italic:before{content:"G"}.sun-editor .icon-strokethrough:before{content:"H"}.sun-editor .icon-subscript:before{content:"I"}.sun-editor .icon-superscript:before{content:"J"}.sun-editor .icon-redo:before{content:"K"}.sun-editor .icon-undo:before{content:"L"}.sun-editor .icon-erase:before{content:"M"}.sun-editor .icon-fontColor:before{content:"N"}.sun-editor .icon-hiliteColor:before{content:"O"}.sun-editor .icon-indent-left:before{content:"P"}.sun-editor .icon-indent-right:before{content:"Q"}.sun-editor .icon-list-bullets:before{content:"R"}.sun-editor .icon-list-number:before{content:"S"}.sun-editor .icon-grid:before{content:"T"}.sun-editor .icon-code-view:before{content:"U"}.sun-editor .icon-preview:before{content:"V"}.sun-editor .icon-showBlocks:before{content:"W"}.sun-editor .icon-expansion:before{content:"X"}.sun-editor .icon-reduction:before{content:"Y"}.sun-editor .icon-image:before{content:"Z"}.sun-editor .icon-link:before{content:"a"}.sun-editor .icon-video:before{content:"b"}.sun-editor .icon-print:before{content:"c"}.sun-editor .icon-modify:before{content:"d"}.sun-editor .icon-revert:before{content:"e"}.sun-editor .icon-arrow-down:before{content:"f";font-size:10px}.sun-editor .icon-map-pin:before{content:"g"}.sun-editor .icon-cancel:before{content:"h";font-size:10px}.sun-editor .icon-hr:before{content:"i"}.sun-editor .icon-insert-column-right:before{content:"j"}.sun-editor .icon-insert-row-below:before{content:"k"}.sun-editor .icon-insert-row-above:before{content:"l"}.sun-editor .icon-insert-column-left:before{content:"m"}.sun-editor .icon-delete-row:before{content:"n"}.sun-editor .icon-delete-column:before{content:"o"}.sun-editor .icon-quote:before{content:"p"}.sun-editor .icon-empty-file:before{content:"q"}.sun-editor .icon-paragraph:before{content:"r"}.sun-editor .icon-delete:before{content:"s"}.sun-editor .icon-rotate-left:before{content:"t"}.sun-editor .icon-rotate-right:before{content:"u"}.sun-editor .icon-mirror-horizontal:before{content:"v"}.sun-editor .icon-mirror-vertical:before{content:"w"}.sun-editor .icon-save:before{content:"x"}.sun-editor .sun-editor-container{position:relative;width:100%;height:100%}.sun-editor .arrow,.sun-editor .arrow:after{position:absolute;display:block;width:0;height:0;border:11px solid transparent}.sun-editor .arrow.arrow-up{top:-11px;left:20px;margin-left:-11px;border-top-width:0;border-bottom-color:rgba(0,0,0,.25)}.sun-editor .arrow.arrow-up:after{top:1px;margin-left:-11px;content:" ";border-top-width:0;border-bottom-color:#fff}.sun-editor .sun-editor-id-toolbar .arrow.arrow-up:after{border-bottom-color:#fafafa}.sun-editor .arrow.arrow-down{top:0;left:0;margin-left:-11px;border-bottom-width:0;border-top-color:rgba(0,0,0,.25)}.sun-editor .arrow.arrow-down:after{top:-12px;margin-left:-11px;content:" ";border-bottom-width:0;border-top-color:#fff}.sun-editor .sun-editor-id-toolbar .arrow.arrow-down:after{border-top-color:#fafafa}.sun-editor .sun-editor-id-toolbar{display:block;overflow:visible;position:relative;height:auto;padding:4px 3px 0;margin:0;background-color:#fafafa;outline:1px solid #dadada;z-index:2}.sun-editor .sun-editor-id-toolbar-cover{position:absolute;display:none;font-size:36px;width:100%;height:100%;top:0;left:0;background-color:#fefefe;opacity:.5;filter:alpha(opacity=50);cursor:not-allowed;z-index:4}.sun-editor .sun-editor-toolbar-separator-vertical{display:inline-block;height:31px;width:1px;margin:2px;vertical-align:top}.sun-editor .sun-editor-id-toolbar.sun-inline-toolbar{display:none;position:absolute;box-shadow:0 3px 9px rgba(0,0,0,.5);-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5)}.sun-editor .sun-editor-id-toolbar.sun-editor-sticky{position:fixed;top:0}.sun-editor .sun-editor-sticky-dummy{display:none;position:static;z-index:-1}.sun-editor .tool_module{display:inline-block}.sun-editor .sun-editor-module-border{border:1px solid #dadada;border-radius:5px}.sun-editor .tool_module_enter{display:block;width:100%;height:1px;margin-bottom:5px;background-color:transparent}.sun-editor .editor_tool,.sun-editor .editor_tool li{float:left;padding:0;margin:0}.sun-editor .editor_tool li{position:relative}.sun-editor .btn_editor{overflow:hidden;float:left;width:35px;height:35px;border:0;border-radius:4px;margin:1px!important;font-size:12px;line-height:27px}.sun-editor .btn_editor:enabled:focus,.sun-editor .btn_editor:enabled:hover{background-color:#d4e3ea;border-color:#bbd5e0;outline:0 none}.sun-editor .btn_editor:enabled:active{border-color:#bbd5e0;background-color:#d4e3ea;-webkit-box-shadow:inset 0 3px 5px #bbd5e0;box-shadow:inset 0 3px 5px #bbd5e0}.sun-editor .btn_editor:enabled.on{background-color:#d4e3ea;border-color:#bbd5e0;outline:0 none}.sun-editor .btn_editor:enabled.on:focus,.sun-editor .btn_editor:enabled.on:hover{background-color:#bbd5e0;border-color:#8baab7;outline:0 none}.sun-editor .btn_editor:enabled.on:active{border-color:#8baab7;background-color:#bbd5e0;-webkit-box-shadow:inset 0 3px 5px #8baab7;box-shadow:inset 0 3px 5px #8baab7}.sun-editor .btn_edit:enabled:focus,.sun-editor .btn_edit:enabled:hover{background-color:#d4e3ea;border-color:#bbd5e0;outline:0 none}.sun-editor .btn_edit:enabled:active{border-color:#bbd5e0;background-color:#d4e3ea;-webkit-box-shadow:inset 0 3px 5px #bbd5e0;box-shadow:inset 0 3px 5px #bbd5e0}.sun-editor .btn_edit:disabled,.sun-editor .btn_editor:disabled,.sun-editor .btn_editor:disabled *,.sun-editor :disabled [class*=icon-]:before{cursor:default;background:#fafafa;color:transparent;text-shadow:0 0 3px #ccc}.sun-editor .layer_editor{display:none;position:absolute;top:37px;z-index:3;left:1px;overflow-y:auto;overflow-x:hidden;border:1px solid #bababa;border-radius:2px;background-color:#fff;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0 none}.sun-editor .layer_editor.layer_size{max-height:300px}.sun-editor .layer_editor .write_place .inp_txt{float:left;width:100%;height:23px;margin-top:0;font-size:12px;text-indent:6px;border:0;outline:0 none}.sun-editor .layer_editor button{margin:0!important;overflow:hidden;width:100%}.sun-editor .editor_tool .layer_editor button:focus,.sun-editor .layer_editor button:hover{background-color:#d4e3ea;border-color:#bbd5e0;outline:0 none}.sun-editor .layer_editor .list_family{left:0;width:156px}.sun-editor .layer_editor .list_family .default{border-bottom:1px solid #ccc}.sun-editor .layer_editor .format_list{left:0;width:175px}.sun-editor .layer_editor .format_list li{padding:0;width:100%}.sun-editor .layer_editor .format_list .btn_edit{height:auto;margin:0 0 4px!important;padding:2px 10px 5px;line-height:100%}.sun-editor .layer_editor .format_list .txt_size18{padding:1px 10px 6px}.sun-editor .layer_editor .format_list .txt_size24{padding:3px 10px 11px;line-height:24px}.sun-editor .layer_editor .format_list .txt_size36{padding:4px 10px 15px;line-height:36px}.sun-editor .layer_editor .font_size_list{left:0;width:140px}.sun-editor .layer_editor .font_size_list .btn_edit{height:auto;margin:0 0 7px!important;padding:2px 10px 5px;line-height:normal!important}.sun-editor .layer_editor .layer_list{left:0;width:42px}.sun-editor .layer_editor .layer_line{left:0;width:158px}.sun-editor .layer_editor .write_place{overflow:hidden;float:left;position:relative;height:25px;border:1px solid #dadada}.sun-editor .layer_align{left:9px;width:125px}.sun-editor .btn_align .img_editor{display:inline-block;width:14px;height:32px;margin:-1px 10px 0 0;vertical-align:middle}.sun-editor .list_editor{overflow:hidden;width:100%;padding:6px 0}.sun-editor .list_editor li:first-child{padding-top:0}.sun-editor .list_editor li{padding-top:5px;width:100%}.sun-editor .font_size_list li{padding:0;width:100%}.sun-editor .layer_editor.layer_line{left:0;width:158px}.sun-editor .btn_edit{width:100%;height:28px;padding:0 14px;margin-left:0;font-size:12px;line-height:22px;text-indent:0;text-decoration:none;text-align:left}.sun-editor .btn_font{width:100px;text-align:left;text-indent:7px;padding:0}.sun-editor .btn_format{width:90px;text-align:left;text-indent:7px;padding:0}.sun-editor .btn_size{width:70px;text-align:left;text-indent:7px;padding:0}.sun-editor .btn_font .txt{width:65px;float:left}.sun-editor .btn_format .txt{width:55px;float:left}.sun-editor .btn_size .txt{width:35px;float:left}.sun-editor .table-content{position:absolute;top:34px;left:1px;z-index:3;padding:5px 0;float:left;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.sun-editor .table-data-form{font-size:18px;padding:0 5px}.sun-editor .table-picker{position:absolute!important;z-index:3;font-size:18px;width:10em;height:10em;cursor:pointer}.sun-editor .table-highlighted{position:absolute!important;z-index:2;font-size:18px;width:1em;height:1em;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQyIDc5LjE2MDkyNCwgMjAxNy8wNy8xMy0wMTowNjozOSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OEE2QjczMzdCN0VGMTFFODg3MENEMDIzNTU4M0UyQzciIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OEE2QjczMzZCN0VGMTFFODg3MENEMDIzNTU4M0UyQzciIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NDM2MjRFMUVCN0VFMTFFODg2RkM4MEYzQTg4MjU3RTkiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NDM2MjRFMUZCN0VFMTFFODg2RkM4MEYzQTg4MjU3RTkiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5dMgLsAAAARUlEQVR42mL8//8/AzUAC4joWb2DbNNKQj0Y4QaBgIaKMsmG3LhzF85mYqASGDVo1KBRgwjnfvQMSA5gpFZ5RDWvAQQYAKYZD7SDi983AAAAAElFTkSuQmCC") repeat}.sun-editor .table-unhighlighted{position:relative!important;z-index:1;font-size:18px;width:5em;height:5em;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIj4+Pjp6ekKlAqjAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKhmnaJzPAAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC") repeat}.sun-editor .table-display{padding-left:5px}.sun-editor .sun-editor-id-table-edit{position:absolute;z-index:1;width:165px;display:none;padding:1px;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.sun-editor .layer_editor .pallet_color_selector{display:flex;width:285px;height:auto}.sun-editor .layer_editor .list_color{width:100%;height:100%;padding:7px}.sun-editor .layer_editor .list_color li{display:flex;float:left;position:relative;margin:0}.sun-editor .layer_editor .list_color button{display:block;overflow:hidden;width:30px;height:30px;text-indent:-9999px}.sun-editor .layer_editor .list_color button:focus,.sun-editor .layer_editor .list_color button:hover{border:1px solid #000}.sun-editor .sub-form-group{height:34px;padding:0 7px 7px}.sun-editor .sub-form-group label{display:inline-block;font-weight:700;font-size:14px;letter-spacing:1px}.sun-editor .sub-form-group input{display:inline-block;width:130px;font-size:14px;border-bottom:5px solid #8baab7;text-transform:uppercase}.sun-editor .sub-form-group input:focus{outline:none}.sun-editor .sub-form-group button{float:right;width:auto;height:100%;background-color:#bbd5e0;border-color:#a2bfcc;outline:0 none;padding:0 15px}.sun-editor .sun-editor-id-editorArea{position:static;width:100%;height:auto;overflow:hidden;z-index:1}.sun-editor .sun-editor-id-editorArea .input_editor{width:100%;height:100%;overflow-y:auto;overflow-x:hidden;-webkit-overflow-scrolling:touch;user-select:text;-o-user-select:text;-moz-user-select:text;-khtml-user-select:text;-webkit-user-select:text;-ms-user-select:text}.sun-editor .sun-editor-id-editorArea .input_editor:focus{outline:none}.sun-editor .sun-editor-id-editorArea .sun-editor-id-code{background-color:#191919;color:#fff;font-family:Helvetica Neue,sans-serif;font-size:13px;word-break:break-all;padding:0;margin:0}.sun-editor .sun-editor-id-resizingBar{width:auto;height:16px;border-top:1px solid #dadada;padding:2px 8px;background-color:#fafafa;cursor:ns-resize}.sun-editor .sun-editor-id-resizingBar.none-resize{cursor:default}.sun-editor .sun-editor-id-navigation{position:absolute;width:auto;height:auto;margin:0;padding:0;font-size:11px;font-weight:700;line-height:1}.sun-editor .sun-editor-id-dialogBox,.sun-editor .sun-editor-id-resize-background{position:absolute;display:none;top:0;left:0;width:100%;height:100%;z-index:2147483647}.sun-editor .sun-editor-id-dialogBox button,.sun-editor .sun-editor-id-dialogBox input,.sun-editor .sun-editor-id-dialogBox label{font-size:14px;line-height:1.5;color:#111;margin:0}.sun-editor .sun-editor-id-dialogBox .modal-dialog-background{position:absolute;width:100%;height:100%;top:0;left:0;background-color:#222;opacity:.5}.sun-editor .modal-dialog{position:absolute;width:100%;height:100%;top:0;left:0}.sun-editor .modal-dialog .modal-content{position:relative;width:500px;margin:8px auto;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}@media screen and (max-width:509px){.sun-editor .modal-dialog .modal-content{width:100%}}.sun-editor .modal-dialog .modal-header{height:50px;padding:15px 15px 5px;border-bottom:1px solid #e5e5e5}.sun-editor .modal-dialog button.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;padding:0!important;margin:0!important;background:transparent;border:0;text-shadow:0 1px 0 #fff;-webkit-appearance:none;filter:alpha(opacity=100);opacity:1}.sun-editor .modal-dialog button.close:focus,.sun-editor .modal-dialog button.close:hover{color:#a2bfcc!important}.sun-editor .modal-dialog .modal-body{position:relative;padding:15px}.sun-editor .modal-dialog .form-group{margin-bottom:15px}.sun-editor .modal-dialog .form-group-footer{margin-top:15px}.sun-editor .modal-dialog input:disabled{background-color:#f3f3f3}.sun-editor .modal-dialog .size-text{width:100%}.sun-editor .modal-dialog .size-text .size-h,.sun-editor .modal-dialog .size-text .size-w{width:72px;text-align:center}.sun-editor .modal-dialog .size-x{margin:0 8px;width:25px;text-align:center}.sun-editor .modal-dialog .form-size-control{display:inline-block;width:70px;height:34px;font-size:14px;text-align:center;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.sun-editor .modal-dialog .modal-content label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}.sun-editor .modal-dialog .form-control{display:block;width:100%;height:34px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.sun-editor .modal-dialog .modal-footer{padding:10px 15px 0;text-align:right;border-top:1px solid #e5e5e5}.sun-editor .modal-dialog .modal-content .btn{display:inline-block;padding:6px 12px;margin:0 0 10px!important;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;background-image:none;border:1px solid transparent;border-radius:4px}.sun-editor .modal-dialog .modal-content input:focus{border-color:#a2bfcc;outline:0;-webkit-box-shadow:inset 0 1px 1px #a2bfcc,0 0 8px #d4e3ea;box-shadow:inset 0 1px 1px #a2bfcc,0 0 8px #d4e3ea}.sun-editor .modal-dialog .modal-radio{margin-left:12px;margin-right:5px}.sun-editor .modal-dialog .btn-primary{color:#fff;background-color:#d4e3ea;border-color:#a2bfcc}.sun-editor .modal-dialog .btn-primary:focus,.sun-editor .modal-dialog .btn-primary:hover{background-color:#bbd5e0!important;border-color:#a2bfcc!important;outline:0 none!important}.sun-editor .modal-dialog .btn-primary:active{border-color:#a2bfcc;background-color:#bbd5e0;-webkit-box-shadow:inset 0 3px 5px #a2bfcc;box-shadow:inset 0 3px 5px #a2bfcc}.sun-editor .sun-editor-id-loading{position:absolute;display:none;width:100%;height:100%;top:0;left:0;background-color:#fff;opacity:.7;filter:alpha(opacity=70);z-index:2147483647}.sun-editor .sun-editor-id-loading .loading-effect{position:absolute;display:block;top:50%;left:50%;height:25px;width:25px;border-top:2px solid #07d;border-right:2px solid transparent;border-radius:50%;animation:spinner .8s linear infinite;margin:-25px 0 0 -25px}@keyframes spinner{to{transform:rotate(1turn)}}.sun-editor .resize-btn{position:absolute;display:none;z-index:1;top:0;left:0;margin-top:-50px!important;padding:0 0 2px;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.sun-editor .btn-group{position:relative;display:flex;vertical-align:middle;padding:2px 2px 2px 0}.sun-editor .btn-group button{position:relative;height:32px;border-top-right-radius:0;border-bottom-right-radius:0;margin:0 0 0 2px!important;padding:5px 10px!important;font-size:12px!important;line-height:1.5!important;border:1px solid rgba(0,0,0,.2)!important;border-radius:4px!important;background-color:#fff!important;display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation}.sun-editor .btn-group.remove button{width:100%;height:100%;height:32px}.sun-editor .btn-group button:active{border-color:#a2bfcc;background-color:#d4e3ea;-webkit-box-shadow:inset 0 3px 5px #bbd5e0;box-shadow:inset 0 3px 5px #bbd5e0}.sun-editor .btn-group button:hover,.sun-editor .resize-btn button:focus{background-color:#d4e3ea!important;border-color:#bbd5e0!important;outline:0 none!important}.sun-editor .modal-resize-container{position:absolute;display:none;z-index:1;border:1px solid #a2bfcc}.sun-editor .modal-resize-container .modal-resize{position:absolute;display:inline-block;background-color:#a2bfcc;opacity:.3}.sun-editor .modal-resize-container .resize-dot{position:absolute;top:0;left:0;width:100%;height:100%}.sun-editor .modal-resize-container .resize-dot>div{position:absolute;width:7px;height:7px;background-color:#a2bfcc;border:1px solid #000}.sun-editor .modal-resize-container .resize-dot>.tl{top:-5px;left:-5px;cursor:nw-resize}.sun-editor .modal-resize-container .resize-dot>.tr{top:-5px;right:-5px;cursor:ne-resize}.sun-editor .modal-resize-container .resize-dot>.bl{bottom:-5px;left:-5px;cursor:sw-resize}.sun-editor .modal-resize-container .resize-dot>.br{right:-5px;bottom:-5px;cursor:se-resize}.sun-editor .modal-resize-container .resize-dot>.lw{left:-7px;bottom:50%;cursor:w-resize}.sun-editor .modal-resize-container .resize-dot>.th{left:50%;top:-7px;cursor:n-resize}.sun-editor .modal-resize-container .resize-dot>.rw{right:-7px;bottom:50%;cursor:e-resize}.sun-editor .modal-resize-container .resize-dot>.bh{right:50%;bottom:-7px;cursor:s-resize}.sun-editor .modal-resize-container .resize-display{position:absolute;right:0;bottom:0;padding:5px;margin:5px;font-size:12px;color:#fff;background-color:red;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.sun-editor .sun-editor-id-link-btn{position:absolute;z-index:1;top:0;left:0;display:none;padding:1px;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.sun-editor .sun-editor-id-link-btn:after,.sun-editor .sun-editor-id-link-btn:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.sun-editor .sun-editor-id-link-btn .link-content{padding:0;margin:0}.sun-editor .sun-editor-id-link-btn .link-content a{display:inline-block;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle;margin-left:5px}.sun-editor .sun-editor-tab-button{width:100%;height:25px;border-bottom:1px solid #e5e5e5}.sun-editor .sun-editor-tab-button button{background-color:#e5e5e5;border-right:1px solid #e5e5e5;float:left;outline:none;padding:2px 13px;transition:.3s}.sun-editor .sun-editor-tab-button button:hover{background-color:#fff}.sun-editor .sun-editor-tab-button button.active{background-color:#fff;border-bottom:0}.sun-editor .sun-editor-id-notice{position:relative;display:none;width:100%;height:auto;word-break:break-all;font-size:13px;color:#b94a48;background-color:#f2dede;padding:15px;margin:0;border:1px solid #eed3d7}.sun-editor .sun-editor-id-notice button{float:right}.sun-editor-editable{font-family:Helvetica Neue,sans-serif;font-size:13px;color:#000;text-align:left;background-color:#fff;word-break:break-all;padding:10px 20px;margin:0}.sun-editor-editable *{font-family:inherit;font-size:inherit;color:inherit;background-color:inherit;box-sizing:border-box}.sun-editor-editable figcaption,.sun-editor-editable figure,.sun-editor-editable iframe,.sun-editor-editable img,.sun-editor-editable td,.sun-editor-editable th{position:relative}.sun-editor-editable .float-left{float:left}.sun-editor-editable .float-right{float:right}.sun-editor-editable .float-center{float:center}.sun-editor-editable .float-none{float:none}.sun-editor-editable a{color:#004cff;text-decoration:none}.sun-editor-editable a:focus,.sun-editor-editable a:hover{cursor:pointer;color:#0093ff;text-decoration:underline}.sun-editor-editable pre{display:block;padding:8px;margin:0;font-size:13px;line-height:1.45;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f6f8fa;border:1px solid #dce5e5;border-radius:3px;overflow:auto}.sun-editor-editable ol{list-style-type:decimal}.sun-editor-editable ol,.sun-editor-editable ul{display:block;margin-block-start:1em;margin-block-end:1em;margin-inline-start:0;margin-inline-end:0;padding-inline-start:40px}.sun-editor-editable ul{list-style-type:disc}.sun-editor-editable li{display:list-item;text-align:-webkit-match-parent;margin-bottom:5px}.sun-editor-editable sub,.sun-editor-editable sup{font-size:75%;line-height:0}.sun-editor-editable sub{vertical-align:sub}.sun-editor-editable sup{vertical-align:super}.sun-editor-editable p{display:block;margin-block-start:1em;margin-block-end:1em;margin-inline-start:0;margin-inline-end:0}.sun-editor-editable div{display:block;margin:0;padding:0}.sun-editor-editable blockquote{display:block;margin-block-start:1em;margin-block-end:1em;margin-inline-start:40px;margin-inline-end:40px;border-style:solid;padding:0 5px 0 20px;border-width:0 0 0 5px;border-color:#8baab7}.sun-editor-editable blockquote blockquote{border-color:#a2bfcc}.sun-editor-editable blockquote blockquote blockquote{border-color:#bbd5e0}.sun-editor-editable blockquote blockquote blockquote blockquote{border-color:#d4e3ea}.sun-editor-editable h1{font-size:2em;margin-block-start:.67em;margin-block-end:.67em}.sun-editor-editable h1,.sun-editor-editable h2{display:block;margin-inline-start:0;margin-inline-end:0;font-weight:700}.sun-editor-editable h2{font-size:1.5em;margin-block-start:.83em;margin-block-end:.83em}.sun-editor-editable h3{font-size:1.17em;margin-block-start:1em;margin-block-end:1em}.sun-editor-editable h3,.sun-editor-editable h4{display:block;margin-inline-start:0;margin-inline-end:0;font-weight:700}.sun-editor-editable h4{margin-block-start:1.33em;margin-block-end:1.33em}.sun-editor-editable h5{font-size:.83em;margin-block-start:1.67em;margin-block-end:1.67em}.sun-editor-editable h5,.sun-editor-editable h6{display:block;margin-inline-start:0;margin-inline-end:0;font-weight:700}.sun-editor-editable h6{font-size:.67em;margin-block-start:2.33em;margin-block-end:2.33em}.sun-editor-editable hr{display:block;border-width:1px 0 0;border-color:#000;border-image:initial;height:1px}.sun-editor-editable hr.solid{border-style:solid none none}.sun-editor-editable hr.dotted{border-style:dotted none none}.sun-editor-editable hr.dashed{border-style:dashed none none}.sun-editor-editable img.inner-link{padding:1px;margin:1px;outline:1px solid #a2bfcc}.sun-editor-editable table{display:table;table-layout:auto;border:1px solid #ccc;width:100%;max-width:100%;margin-bottom:20px;background-color:transparent;border-spacing:0;border-collapse:collapse}.sun-editor-editable table tr{border:1px solid #ccc}.sun-editor-editable table td{border:1px solid #ccc;padding:8px}.sun-editor-editable .sun-editor-id-comp{display:flex;padding:1px}.sun-editor-editable[contenteditable=true] .sun-editor-id-comp{outline:1px dashed #ccc}.sun-editor-editable figure.sun-editor-figure-cover{display:block;outline:none;margin:0;padding:0}.sun-editor-editable figure.sun-editor-figure-cover figcaption{padding:1em .5em;margin:0;font-size:13px;background-color:#f3f3f3;outline:none}.sun-editor-editable figure.sun-editor-figure-cover figcaption p{line-height:2;margin:0}.sun-editor-editable .sun-editor-id-image-container a img{padding:1px;margin:1px;outline:1px solid #8baab7}.sun-editor-editable .sun-editor-id-iframe-container iframe{outline:1px solid #9e9e9e}.sun-editor-editable .sun-editor-id-iframe-inner-resizing-cover{display:none}.sun-editor-editable[contenteditable=true] .sun-editor-id-iframe-inner-resizing-cover{display:block;position:absolute;width:100%;height:100%;left:0;top:0;background-color:transparent}.sun-editor-show-block div,.sun-editor-show-block h1,.sun-editor-show-block h2,.sun-editor-show-block h3,.sun-editor-show-block h4,.sun-editor-show-block h5,.sun-editor-show-block h6,.sun-editor-show-block p{border:1px dashed #a2bfcc;padding:10px 8px 8px}.sun-editor-show-block p{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAAPAQMAAAAF7dc0AAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAaSURBVAjXY/j/gwGCPvxg+F4BQiAGDP1HQQByxxw0gqOzIwAAAABJRU5ErkJggg==") no-repeat}.sun-editor-show-block div{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAPAQMAAAAxlBYoAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAmSURBVAjXY/j//wcDDH+8XsHwDYi/hwNx1A8w/nYLKH4XoQYJAwCXnSgcl2MOPgAAAABJRU5ErkJggg==") no-repeat}.sun-editor-show-block h1{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPAQMAAAA4f7ZSAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAfSURBVAjXY/j/v4EBhr+9B+LzEPrDeygfhI8j1CBhAEhmJGY4Rf6uAAAAAElFTkSuQmCC") no-repeat}.sun-editor-show-block h2{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPAQMAAAA4f7ZSAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAmSURBVAjXY/j/v4EBhr+dB+LtQPy9geEDEH97D8T3gbgdoQYJAwA51iPuD2haEAAAAABJRU5ErkJggg==") no-repeat}.sun-editor-show-block h3{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPAQMAAAA4f7ZSAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAiSURBVAjXY/j/v4EBhr+dB+LtQPy9geHDeQgN5p9HqEHCADeWI+69VG2MAAAAAElFTkSuQmCC") no-repeat}.sun-editor-show-block h4{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAPAQMAAADTSA1RAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAiSURBVAjXY/j//wADDH97DsTXIfjDdiDdDMTfIRhZHRQDAKJOJ6L+K3y7AAAAAElFTkSuQmCC") no-repeat}.sun-editor-show-block h5{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPAQMAAAA4f7ZSAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAlSURBVAjXY/j/v4EBhr+1A/F+IO5vYPiwHUh/B2IQfR6hBgkDABlWIy5uM+9GAAAAAElFTkSuQmCC") no-repeat}.sun-editor-show-block h6{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPAQMAAAA4f7ZSAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAiSURBVAjXY/j/v4EBhr+dB+LtQLy/geFDP5S9HSKOrA6KAR9GIza1ptJnAAAAAElFTkSuQmCC") no-repeat} \ No newline at end of file diff --git a/dist/suneditor.min.js b/dist/suneditor.min.js index 05f6fde9e..5540e266f 100644 --- a/dist/suneditor.min.js +++ b/dist/suneditor.min.js @@ -1 +1 @@ -!function(e){var t={};function i(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,i),o.l=!0,o.exports}i.m=e,i.c=t,i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)i.d(n,o,function(t){return e[t]}.bind(null,o));return n},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s="XJR1")}({"0A7J":function(module,__webpack_exports__,__webpack_require__){"use strict";var _lib_util__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("8e1d"),_modules_colorPicker__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("EjF6");__webpack_exports__.a={name:"fontColor",add:function(core,targetElement){core.addModule([_modules_colorPicker__WEBPACK_IMPORTED_MODULE_1__.a]);const context=core.context;context.fontColor={previewEl:null,colorInput:null};let listDiv=eval(this.setSubmenu(context.colorPicker.colorListHTML));context.fontColor.colorInput=listDiv.getElementsByClassName("sun-editor-id-submenu-color-input")[0],context.fontColor.colorInput.addEventListener("keyup",this.onChangeInput.bind(core)),listDiv.getElementsByClassName("sun-editor-id-submenu-color-submit")[0].addEventListener("click",this.submit.bind(core)),listDiv.getElementsByTagName("UL")[0].addEventListener("click",this.pickup.bind(core)),targetElement.parentNode.appendChild(listDiv),listDiv=null},setSubmenu:function(e){const t=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.createElement("DIV");return t.className="sun-editor-submenu layer_editor",t.style.display="none",t.innerHTML=e,t},on:function(){const e=this.context.colorPicker;e._colorInput=this.context.fontColor.colorInput,e._defaultColor="#000000",e._styleProperty="color",this.plugins.colorPicker.init.call(this,this.getSelectionNode(),null)},onChangeInput:function(e){this.plugins.colorPicker.setCurrentColor.call(this,"#"+e.target.value)},submit:function(){this.plugins.fontColor.applyColor.call(this,this.context.colorPicker._currentColor)},pickup:function(e){if(e.preventDefault(),e.stopPropagation(),!/^BUTTON$/i.test(e.target.tagName))return!1;this.plugins.fontColor.applyColor.call(this,e.target.getAttribute("data-value"))},applyColor:function(e){const t=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.createElement("SPAN");t.style.color=e,this.nodeChange(t,["color"]),this.submenuOff(),this.focus()}}},"1kvd":function(e,t,i){"use strict";var n=i("8e1d");t.a={name:"dialog",add:function(e){const t=e.context;t.dialog={};let i=n.a.createElement("DIV");i.className="sun-editor-id-dialogBox sun-editor-common";let o=n.a.createElement("DIV");o.className="modal-dialog-background sun-editor-id-dialog-back",o.style.display="none";let l=n.a.createElement("DIV");l.className="modal-dialog sun-editor-id-dialog-modal",l.style.display="none",i.appendChild(o),i.appendChild(l),t.dialog.modalArea=i,t.dialog.back=o,t.dialog.modal=l,t.dialog.modal.addEventListener("click",this.onClick_dialog.bind(e)),t.element.relative.appendChild(i),i=null,o=null,l=null},onClick_dialog:function(e){e.stopPropagation(),(/modal-dialog/.test(e.target.className)||/close/.test(e.target.getAttribute("data-command")))&&this.plugins.dialog.close.call(this)},open:function(e,t){if(this.modalForm)return!1;this.context.dialog.updateModal=t,"full"===this.context.option.popupDisplay?this.context.dialog.modalArea.style.position="fixed":this.context.dialog.modalArea.style.position="absolute",this.context.dialog.kind=e,this.modalForm=this.context[e].modal;const i=this.context[e].focusElement;this.context.dialog.modalArea.style.display="block",this.context.dialog.back.style.display="block",this.context.dialog.modal.style.display="block",this.modalForm.style.display="block",i&&i.focus()},close:function(){this.modalForm.style.display="none",this.context.dialog.back.style.display="none",this.context.dialog.modalArea.style.display="none",this.modalForm=null,this.context.dialog.updateModal=!1,this.plugins[this.context.dialog.kind].init.call(this)}}},"3FqI":function(e,t,i){},"50IV":function(module,__webpack_exports__,__webpack_require__){"use strict";var _lib_util__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("8e1d");__webpack_exports__.a={name:"font",add:function(core,targetElement){let listDiv=eval(this.setSubmenu(core.context.option));listDiv.getElementsByClassName("list_family")[0].addEventListener("click",this.pickup.bind(core)),targetElement.parentNode.appendChild(listDiv),listDiv=null},setSubmenu:function(e){const t=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.createElement("DIV");let i,n,o,l;t.className="layer_editor",t.style.display="none";let a=e.font?e.font:["Arial","Comic Sans MS","Courier New,Courier","Impact,Charcoal,sans-serif","Georgia","tahoma","Trebuchet MS,Helvetica","Verdana"],s='
",s+="
",t.innerHTML=s,t},pickup:function(e){if(!/^BUTTON$/i.test(e.target.tagName))return!1;e.preventDefault(),e.stopPropagation();const t=e.target;_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.changeTxt(this.context.tool.font,t.getAttribute("data-txt"));const i=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.createElement("SPAN");i.style.fontFamily=t.getAttribute("data-value"),this.nodeChange(i,["font-family"]),this.submenuOff(),this.focus()}}},"8e1d":function(e,t,i){"use strict";const n={_d:document,_w:window,zeroWidthSpace:"​",getXMLHttpRequest:function(){if(!this._w.ActiveXObject)return this._w.XMLHttpRequest?new XMLHttpRequest:null;try{return new ActiveXObject("Msxml2.XMLHTTP")}catch(e){try{return new ActiveXObject("Microsoft.XMLHTTP")}catch(e){return null}}},copyObj:function(e){const t={};for(let i in e)t[i]=e[i];return t},createElement:function(e){return this._d.createElement(e)},createTextNode:function(e){return this._d.createTextNode(e||"")},getIncludePath:function(e,t){let i="";const n=[],o="js"===t?"script":"link",l="js"===t?"src":"href";let a="(?:";for(let t=0,i=e.length;t0?n[0][l]:""),-1===i.indexOf(":/")&&"//"!==i.slice(0,2)&&(i=0===i.indexOf("/")?location.href.match(/^.*?:\/\/[^\/]*/)[0]+i:location.href.match(/^[^\?]*\/(?:)/)[0]+i),!i)throw"[SUNEDITOR.util.getIncludePath.fail] The SUNEDITOR installation path could not be automatically detected. (name: +"+name+", extension: "+t+")";return i},convertContentsForEditor:function(e){let t,i,n="";e=e.trim();for(let o=0,l=(t=this._d.createRange().createContextualFragment(e).childNodes).length;o0&&(n+="

"+t+"

")}else n+=i;const o={"&":"&"," ":" ","'":""","<":"<",">":">"};return e=e.replace(/&|\u00A0|'|<|>/g,function(e){return"string"==typeof o[e]?o[e]:e}),0===n.length&&(n="

"+(e.length>0?e:this.zeroWidthSpace)+"

"),n},convertHTMLForCodeView:function(e){return e.replace(/\s*<(?:li|td)\s*(?:[a-z\-]+)?\s*(?:="?[^>]*"?)?\s*>/gi,this._insertIndent).replace(/<\/?(?:blockquote|hr|ol|ul|table|tbody|thead|th|tr)\s*(?:[a-z\-]+)?\s*(?:="?[^>]*"?)?\s*>(?=[^\n])/gi,this._insertLineBreak).replace(/<\/(?:p|div|h[1-6]|li|td|pre)>(?=[^\n])/gi,this._insertLineBreak)},_insertIndent:function(e){return" "+e.trim()},_insertLineBreak:function(e){return e+"\n"},isWysiwygDiv:function(e){return!(!e||1!==e.nodeType||!this.hasClass(e,"sun-editor-id-wysiwyg"))},isFormatElement:function(e){return!(!e||1!==e.nodeType||!/^(?:P|DIV|H[1-6]|LI|CODE)$/i.test(e.nodeName)||/sun-editor-id-comp/.test(e.className))},isRangeFormatElement:function(e){return!(!e||1!==e.nodeType||!/^(?:BLOCKQUOTE|TABLE|THEAD|TBODY|TH|TR|TD|OL|UL|PRE|FIGCAPTION)$/i.test(e.nodeName))},getFormatElement:function(e){if(!e)return null;for(;!this.isFormatElement(e)&&!this.isWysiwygDiv(e.parentNode);)e=e.parentNode;if(this.isWysiwygDiv(e)||this.isRangeFormatElement(e)){return this.getListChildren(e,function(e){return this.isFormatElement(e)}.bind(this))[0]}return e},getRangeFormatElement:function(e){if(!e)return null;for(;!this.isRangeFormatElement(e)&&!this.isWysiwygDiv(e);)e=e.parentNode;return this.isWysiwygDiv(e)?null:e},getArrayIndex:function(e,t){let i=-1;for(let n=0,o=e.length;n/g,"").replace(/<[a-zA-Z]+\:[a-zA-Z]+.*>(\n|.)*<\/[a-zA-Z]+\:[a-zA-Z]+>/g,"").replace(/\s(?:style|class|dir|xmlns|data-[a-z\-]+)\s*(?:[a-z\-]+)?\s*(?:="?[^>]*"?)?\s*/gi,"").replace(/<\/?(?:span|font)\s*(?:[a-z\-]+)?\s*(?:="?[^>]*"?)?\s*>/gi,"").replace(/<\/?[a-z]+:[a-z]+\s*(?:[a-z\-]+)?\s*(?:="?[^>]*"?)?\s*>/gi,""));return n||e}};t.a=n},EjF6:function(e,t,i){"use strict";var n=i("8e1d");t.a={name:"colorPicker",add:function(e){const t=e.context;t.colorPicker={colorListHTML:"",_colorInput:"",_defaultColor:"#000",_styleProperty:"color",_currentColor:""};let i=this.createColorList(e.context.option,e.lang);t.colorPicker.colorListHTML=i,i=null},createColorList:function(e,t){const i=e.colorList?e.colorList:["#ff0000","#ff5e00","#ffe400","#abf200","#00d8ff","#0055ff","#6600ff","#ff00dd","#000000","#ffd8d8","#fae0d4","#faf4c0","#e4f7ba","#d4f4fa","#d9e5ff","#e8d9ff","#ffd9fa","#ffffff","#ffa7a7","#ffc19e","#faed7d","#cef279","#b2ebf4","#b2ccff","#d1b2ff","#ffb2f5","#bdbdbd","#f15f5f","#f29661","#e5d85c","#bce55c","#5cd1e5","#6699ff","#a366ff","#f261df","#8c8c8c","#980000","#993800","#998a00","#6b9900","#008299","#003399","#3d0099","#990085","#353535","#670000","#662500","#665c00","#476600","#005766","#002266","#290066","#660058","#222222"];let n='
    ';for(let e=0,t=i.length;e '}return n+='
"},init:function(e,t){const i=this.plugins.colorPicker;let n=t||(i.getColorInNode.call(this,e)||this.context.colorPicker._defaultColor);n=i.isHexColor(n)?n:i.rgb2hex(n),i.setInputText.call(this,n)},setCurrentColor:function(e){this.context.colorPicker._currentColor=e,this.context.colorPicker._colorInput.style.borderColor=e},setInputText:function(e){this.context.colorPicker._colorInput.value=e.replace("#",""),this.plugins.colorPicker.setCurrentColor.call(this,e)},getColorInNode:function(e){let t="";const i=this.context.colorPicker._styleProperty;for(;!n.a.isWysiwygDiv(e)&&0===t.length;)1===e.nodeType&&e.style[i]&&(t=e.style[i]),e=e.parentNode;return t},isHexColor:function(e){return/^#[0-9a-f]{3}(?:[0-9a-f]{3})?$/i.test(e)},rgb2hex:function(e){return(e=e.match(/^rgba?[\s+]?\([\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?/i))&&4===e.length?"#"+("0"+parseInt(e[1],10).toString(16)).slice(-2)+("0"+parseInt(e[2],10).toString(16)).slice(-2)+("0"+parseInt(e[3],10).toString(16)).slice(-2):""}}},KKur:function(module,__webpack_exports__,__webpack_require__){"use strict";var _lib_util__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("8e1d"),_modules_dialog__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("1kvd"),_modules_resizing__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__("ee5k"),_modules_notice__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__("PAX9");__webpack_exports__.a={name:"image",add:function(core){core.addModule([_modules_dialog__WEBPACK_IMPORTED_MODULE_1__.a,_modules_resizing__WEBPACK_IMPORTED_MODULE_2__.a,_modules_notice__WEBPACK_IMPORTED_MODULE_3__.a]);const context=core.context;context.image={_linkElement:null,_container:null,_cover:null,_element:null,_element_w:1,_element_h:1,_element_l:0,_element_t:0,_origin_w:"auto"===context.option.imageWidth?"":context.option.imageWidth,_origin_h:"",_altText:"",_caption:null,captionCheckEl:null,_linkValue:"",_align:"none",_captionChecked:!1,_proportionChecked:!0,_floatClassRegExp:"float\\-[a-z]+",_xmlHttp:null,_resizing:context.option.imageResizing,_defaultAuto:"auto"===context.option.imageWidth};let image_dialog=eval(this.setDialog(core.context.option,core.lang));context.image.modal=image_dialog,context.image.imgUrlFile=image_dialog.getElementsByClassName("sun-editor-id-image-url")[0],context.image.imgInputFile=context.image.focusElement=image_dialog.getElementsByClassName("sun-editor-id-image-file")[0],context.image.altText=image_dialog.getElementsByClassName("sun-editor-id-image-alt")[0],context.image.imgLink=image_dialog.getElementsByClassName("sun-editor-id-image-link")[0],context.image.imgLinkNewWindowCheck=image_dialog.getElementsByClassName("sun-editor-id-linkCheck")[0],context.image.captionCheckEl=image_dialog.getElementsByClassName("suneditor-id-image-check-caption")[0],context.image.modal.getElementsByClassName("sun-editor-tab-button")[0].addEventListener("click",this.openTab.bind(core)),context.image.modal.getElementsByClassName("btn-primary")[0].addEventListener("click",this.submit.bind(core)),context.image.imageX={},context.image.imageY={},context.option.imageResizing&&(context.image.proportion=image_dialog.getElementsByClassName("suneditor-id-image-check-proportion")[0],context.image.imageX=image_dialog.getElementsByClassName("sun-editor-id-image-x")[0],context.image.imageY=image_dialog.getElementsByClassName("sun-editor-id-image-y")[0],context.image.imageX.value=context.option.imageWidth,context.image.imageX.addEventListener("change",this.setInputSize.bind(core,"x")),context.image.imageY.addEventListener("change",this.setInputSize.bind(core,"y")),image_dialog.getElementsByClassName("sun-editor-id-image-revert-button")[0].addEventListener("click",this.sizeRevert.bind(core))),context.dialog.modal.appendChild(image_dialog),image_dialog=null},setDialog:function(e,t){const i=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.createElement("DIV");i.className="modal-content sun-editor-id-dialog-image",i.style.display="none";let n='
",i.innerHTML=n,i},openTab:function(e){const t=this.context.image.modal,i="init"===e?t.getElementsByClassName("sun-editor-id-tab-link")[0]:e.target;if(!/^BUTTON$/i.test(i.tagName))return!1;const n=i.getAttribute("data-tab-link");let o,l,a;for(l=t.getElementsByClassName("sun-editor-id-tab-content"),o=0;o0){const t=this.context.option.imageUploadUrl,i=this.context.dialog.updateModal?1:e.length;if("string"==typeof t&&t.length>0){const n=new FormData;for(let t=0;t0?1:s.length;a0){const n=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.createElement("A");return n.href=/^https?:\/\//.test(t)?t:"http://"+t,n.target=i?"_blank":"",n.setAttribute("data-image-link","image"),e.setAttribute("data-image-link",t),n.appendChild(e),n}return e},setInputSize:function(e){this.context.dialog.updateModal&&this.context.image.proportion.checked&&("x"===e?this.context.image.imageY.value=Math.round(this.context.image._element_h/this.context.image._element_w*this.context.image.imageX.value):this.context.image.imageX.value=Math.round(this.context.image._element_w/this.context.image._element_h*this.context.image.imageY.value))},submit:function(e){this.showLoading(),e.preventDefault(),e.stopPropagation(),this.context.image._linkValue=this.context.image.imgLink.value,this.context.image._altText=this.context.image.altText.value,this.context.image._align=this.context.image.modal.querySelector('input[name="suneditor_image_radio"]:checked').value,this.context.image._captionChecked=this.context.image.captionCheckEl.checked,this.context.image._resizing&&(this.context.image._proportionChecked=this.context.image.proportion.checked);try{this.context.dialog.updateModal&&this.plugins.image.update_image.call(this),this.context.image.imgInputFile&&this.context.image.imgInputFile.files.length>0?this.plugins.image.onRender_imgInput.call(this):this.context.image.imgUrlFile&&this.context.image.imgUrlFile.value.trim().length>0?this.plugins.image.onRender_imgUrl.call(this):this.closeLoading()}catch(e){throw this.closeLoading(),_modules_notice__WEBPACK_IMPORTED_MODULE_3__.a.open.call(this,'[SUNEDITOR.image.submit.fail] cause : "'+e.message+'"'),Error('[SUNEDITOR.image.submit.fail] cause : "'+e.message+'"')}finally{this.plugins.dialog.close.call(this)}return!1},_onload_image:function(e,t){if(e.setAttribute("origin-size",e.naturalWidth+","+e.naturalHeight),e.setAttribute("data-origin",e.offsetWidth+","+e.offsetHeight),!t)return;let i=e.getAttribute("data-index");i?(this._variable._imagesInfo[i].oImg.getAttribute("data-file-name"),this._variable._imagesInfo[i].oImg.getAttribute("data-file-size")):(i=this._variable._imageIndex,e.setAttribute("data-index",i),this._variable._imagesInfo[i]={src:e.src,index:i,name:t.name,size:t.size,select:function(){const t=this.plugins.resizing.call_controller_resize.call(this,e,"image");this.plugins.image.onModifyMode.call(this,e,t),e.scrollIntoView()}.bind(this),delete:this.plugins.image.destroy.bind(this,e)},this._variable._imageIndex++,e.setAttribute("data-file-name",t.name),e.setAttribute("data-file-size",t.size)),this._imageUpload(e,i,!1,this._variable._imagesInfo[i])},create_image:function(e,t,i,n,o,l,a,s){if(l)return void(a.src=e);const r=this.context.image;let d=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.createElement("IMG");d.addEventListener("load",this.plugins.image._onload_image.bind(this,d,s)),d.src=e,d.setAttribute("data-align",o),d.alt=r._altText,(d=this.plugins.image.onRender_link(d,t,i)).setAttribute("data-rotate","0"),r._resizing&&(/\d+/.test(n)&&(d.style.width=n),d.setAttribute("data-proportion",r._proportionChecked));const c=this.plugins.resizing.set_cover.call(this,d),_=this.plugins.resizing.set_container.call(this,c,"sun-editor-id-image-container");r._captionChecked&&(r._caption=this.plugins.resizing.create_caption.call(this),r._caption.setAttribute("contenteditable",!1),c.appendChild(r._caption)),c.style.margin="none"!==o?"auto":"0",_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.removeClass(_,r._floatClassRegExp),_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.addClass(_,"float-"+o),r._resizing&&/\d+/.test(n)||(this.context.resizing._resize_plugin="image",r._element=d,r._cover=c,r._container=_,this.plugins.image.setAutoSize.call(this)),this.insertNode(_,_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.getFormatElement(this.getSelectionNode())),this.appendFormatTag(_)},update_image:function(){const e=this.context.image,t=e._linkValue;let i=e._element,n=e._cover,o=e._container,l=!1;const a=1*e.imageX.value!==i.offsetWidth||1*e.imageY.value!==i.offsetHeight;if(null===n&&(l=!0,i=e._element.cloneNode(!0),n=this.plugins.resizing.set_cover.call(this,i)),null===o&&(n=n.cloneNode(!0),l=!0,o=this.plugins.resizing.set_container.call(this,n,"sun-editor-id-image-container")),l&&(o.innerHTML="",o.appendChild(n)),i.alt=e._altText,e._resizing&&(i.setAttribute("data-proportion",e._proportionChecked),a&&this.plugins.image.setSize.call(this,e.imageX.value,e.imageY.value)),e._captionChecked?e._caption||(e._caption=this.plugins.resizing.create_caption.call(this),n.appendChild(e._caption)):e._caption&&(_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.removeItem(e._caption),e._caption=null),e._align&&"none"!==e._align?n.style.margin="auto":n.style.margin="0",_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.removeClass(o,this.context.image._floatClassRegExp),_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.addClass(o,"float-"+e._align),i.setAttribute("data-align",e._align),t.trim().length>0)if(null!==e._linkElement)e._linkElement.href=t,e._linkElement.target=e.imgLinkNewWindowCheck.checked?"_blank":"",i.setAttribute("data-image-link",t);else{let o=this.plugins.image.onRender_link(i,t,this.context.image.imgLinkNewWindowCheck.checked);n.insertBefore(o,e._caption)}else if(null!==e._linkElement){const t=i;t.setAttribute("data-image-link","");let o=t.cloneNode(!0);n.removeChild(e._linkElement),n.insertBefore(o,e._caption),i=o}if(l){const t=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.getFormatElement(e._element);t.parentNode.insertBefore(o,t),_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.removeItem(t)}(e._resizing&&a||this.context.resizing._rotateVertical&&e._captionChecked)&&this.plugins.resizing.setTransformSize.call(this,i)},sizeRevert:function(){const e=this.context.image;e._origin_w&&(e.imageX.value=e._element_w=e._origin_w,e.imageY.value=e._element_h=e._origin_h)},onModifyMode:function(e,t){const i=this.context.image;i._linkElement=/^A$/i.test(e.parentNode.nodeName)?e.parentNode:null,i._element=e,i._cover=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.getParentElement(e,".sun-editor-figure-cover"),i._container=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.getParentElement(e,".sun-editor-id-image-container"),i._caption=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.getChildElement(i._cover,"FIGCAPTION"),i._align=e.getAttribute("data-align")||"none",i._element_w=t.w,i._element_h=t.h,i._element_t=t.t,i._element_l=t.l;let n=i._element.getAttribute("data-origin");n?(n=n.split(","),i._origin_w=1*n[0],i._origin_h=1*n[1]):(i._origin_w=t.w,i._origin_h=t.h,i._element.setAttribute("data-origin",t.w+","+t.h))},openModify:function(e){const t=this.context.image;t.imgUrlFile.value=t._element.src,t.altText.value=t._element.alt,t.imgLink.value=null===t._linkElement?"":t._linkElement.href,t.imgLinkNewWindowCheck.checked=t._linkElement&&"_blank"===t._linkElement.target,t.modal.querySelector('input[name="suneditor_image_radio"][value="'+t._align+'"]').checked=!0,t._captionChecked=t.captionCheckEl.checked=!!t._caption,t._resizing&&(t.proportion.checked=t._proportionChecked="true"===t._element.getAttribute("data-proportion"),t.imageX.value=t._element.offsetWidth,t.imageY.value=t._element.offsetHeight,t.imageX.disabled=!1,t.imageY.disabled=!1,t.proportion.disabled=!1),e||this.plugins.dialog.open.call(this,"image",!0)},setSize:function(e,t){const i=this.context.image;i._element.style.width=e+"px",i._element.style.height=t+"px"},setAutoSize:function(){const e=this.context.image;this.plugins.resizing.resetTransform.call(this,e._element),this.plugins.image.cancelPercentAttr.call(this),e._element.style.maxWidth="100%",e._element.style.width="100%",e._element.style.height="",e._cover.style.width="",e._cover.style.height=""},setPercentSize:function(e){const t=this.context.image;t._container.style.width=e,t._container.style.height="",t._cover.style.width="100%",t._cover.style.height="",t._element.style.width="100%",t._element.style.height="",/100/.test(e)&&(_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.removeClass(t._container,this.context.image._floatClassRegExp),_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.addClass(t._container,"float-center"))},cancelPercentAttr:function(){const e=this.context.image;e._element.style.maxWidth="none",e._cover.style.width="",e._cover.style.height="",e._container.style.width="",e._container.style.height="",_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.removeClass(e._container,this.context.image._floatClassRegExp),_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.addClass(e._container,"float-"+e._align)},resetAlign:function(){const e=this.context.image;e._element.setAttribute("data-align",""),e._align="none",e._cover.style.margin="0",_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.removeClass(e._container,e._floatClassRegExp)},destroy:function(e){const t=e||this.context.image._element,i=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.getParentElement(t,".sun-editor-id-image-container")||t,n=t.getAttribute("data-index");_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.removeItem(i),this.plugins.image.init.call(this),this.controllersOff(),n&&(delete this._variable._imagesInfo[n],this._imageUpload(t,n,!0))},init:function(){const e=this.context.image;if(e.imgInputFile&&(e.imgInputFile.value=""),e.imgUrlFile&&(e.imgUrlFile.value=""),e.altText.value="",e.imgLink.value="",e.imgLinkNewWindowCheck.checked=!1,e.modal.querySelector('input[name="suneditor_image_radio"][value="none"]').checked=!0,e.captionCheckEl.checked=!1,e._element=null,this.plugins.image.openTab.call(this,"init"),e._resizing){const t="auto"===this.context.option.imageWidth;e.proportion.checked=!1,e.imageX.value=t?"":this.context.option.imageWidth,e.imageY.value="",e.imageX.disabled=t,e.imageY.disabled=!0,e.proportion.disabled=!0}}}},MIhV:function(module,__webpack_exports__,__webpack_require__){"use strict";var _lib_util__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("8e1d");__webpack_exports__.a={name:"fontSize",add:function(core,targetElement){let listDiv=eval(this.setSubmenu(core.context.option));listDiv.getElementsByTagName("UL")[0].addEventListener("click",this.pickup.bind(core)),targetElement.parentNode.appendChild(listDiv),listDiv=null},setSubmenu:function(e){const t=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.createElement("DIV");t.className="sun-editor-submenu layer_editor layer_size",t.style.display="none";const i=e.fontSize?e.fontSize:[8,9,10,11,12,14,16,18,20,22,24,26,28,36,48,72];let n='
    ';for(let e=0,t=i.length;e"}return n+="
",t.innerHTML=n,t},pickup:function(e){if(e.preventDefault(),e.stopPropagation(),!/^BUTTON$/i.test(e.target.tagName))return!1;_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.changeTxt(this.context.tool.fontSize,e.target.getAttribute("data-value"));const t=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.createElement("SPAN");t.style.fontSize=e.target.getAttribute("data-value")+"px",this.nodeChange(t,["font-size"]),this.submenuOff(),this.focus()}}},P6u4:function(e,t,i){"use strict";var n,o;n="undefined"!=typeof window?window:this,o=function(e,t){const i={toolbar:{save:"Save",font:"Font",formats:"Formats",fontSize:"Size",bold:"Bold",underline:"Underline",italic:"Italic",strike:"Strike",subscript:"Subscript",superscript:"Superscript",removeFormat:"Remove Format",fontColor:"Font Color",hiliteColor:"Hilite Color",indent:"Indent",outdent:"Outdent",align:"Align",alignLeft:"Align left",alignRight:"Align right",alignCenter:"Align center",justifyFull:"Justify full",list:"list",orderList:"Ordered list",unorderList:"Unordered list",horizontalRule:"horizontal line",hr_solid:"solid",hr_dotted:"dotted",hr_dashed:"dashed",table:"Table",link:"Link",image:"Image",video:"Video",fullScreen:"Full screen",showBlocks:"Show blocks",codeView:"Code view",undo:"Undo",redo:"Redo",preview:"Preview",print:"print",tag_p:"Paragraph",tag_div:"Normal (DIV)",tag_h:"Header",tag_quote:"Quote",pre:"Code"},dialogBox:{linkBox:{title:"Insert Link",url:"URL to link",text:"Text to display",newWindowCheck:"Open in new window"},imageBox:{title:"Insert image",file:"Select from files",url:"Image URL",altText:"Alternative text"},videoBox:{title:"Insert Video",url:"Media embed URL, YouTube"},caption:"Insert description",close:"Close",submitButton:"Submit",revertButton:"Revert",proportion:"constrain proportions",width:"Width",height:"Height",basic:"Basic",left:"Left",right:"Right",center:"Center"},controller:{edit:"Edit",remove:"Remove",insertRowAbove:"Insert row above",insertRowBelow:"Insert row below",deleteRow:"Delete row",insertColumnBefore:"Insert column before",insertColumnAfter:"Insert column after",deleteColumn:"Delete column",resize100:"Resize 100%",resize75:"Resize 75%",resize50:"Resize 50%",resize25:"Resize 25%",mirrorHorizontal:"Mirror, Horizontal",mirrorVertical:"Mirror, Vertical",rotateLeft:"Rotate left",rotateRight:"Rotate right"}};return void 0===t&&(e.SUNEDITOR_LANG||(e.SUNEDITOR_LANG={}),e.SUNEDITOR_LANG.en=i),i},"object"==typeof e.exports?e.exports=n.document?o(n,!0):function(e){if(!e.document)throw new Error("SUNEDITOR_LANG a window with a document");return o(e)}:o(n)},PAX9:function(e,t,i){"use strict";var n=i("8e1d");t.a={name:"notice",add:function(e){const t=e.context;t.notice={};let i=n.a.createElement("DIV"),o=n.a.createElement("SPAN"),l=n.a.createElement("BUTTON");i.className="sun-editor-id-notice",l.className="close",l.setAttribute("aria-label","Close"),l.setAttribute("title",e.lang.dialogBox.close),l.innerHTML='',i.appendChild(o),i.appendChild(l),t.notice.modal=i,t.notice.message=o,l.addEventListener("click",this.onClick_cancel.bind(e)),t.element.editorArea.insertBefore(i,t.element.wysiwyg),i=null},onClick_cancel:function(e){e.preventDefault(),e.stopPropagation(),this.plugins.notice.close.call(this)},open:function(e){this.context.notice.message.textContent=e,this.context.notice.modal.style.display="block"},close:function(){this.context.notice.modal.style.display="none"}}},Rp48:function(module,__webpack_exports__,__webpack_require__){"use strict";var _lib_util__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("8e1d"),_modules_dialog__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("1kvd");__webpack_exports__.a={name:"link",add:function(core){core.addModule([_modules_dialog__WEBPACK_IMPORTED_MODULE_1__.a]);const context=core.context;context.link={};let link_dialog=eval(this.setDialog(core.lang));context.link.modal=link_dialog,context.link.focusElement=link_dialog.getElementsByClassName("sun-editor-id-link-url")[0],context.link.linkAnchorText=link_dialog.getElementsByClassName("sun-editor-id-link-text")[0],context.link.linkNewWindowCheck=link_dialog.getElementsByClassName("sun-editor-id-link-check")[0];let link_button=eval(this.setController_LinkButton(core.lang));context.link.linkBtn=link_button,context.link._linkAnchor=null,link_button.addEventListener("mousedown",function(e){e.stopPropagation()},!1),link_dialog.getElementsByClassName("btn-primary")[0].addEventListener("click",this.submit.bind(core)),link_button.addEventListener("click",this.onClick_linkBtn.bind(core)),context.dialog.modal.appendChild(link_dialog),context.element.relative.appendChild(link_button),link_dialog=null,link_button=null},setDialog:function(e){const t=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.createElement("DIV");return t.className="modal-content sun-editor-id-dialog-link",t.style.display="none",t.innerHTML='",t},setController_LinkButton:function(e){const t=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.createElement("DIV");return t.className="sun-editor-id-link-btn",t.style.display="none",t.innerHTML='
',t},submit:function(e){this.showLoading(),e.preventDefault(),e.stopPropagation();const t=function(){if(0===this.context.link.focusElement.value.trim().length)return!1;const e=this.context.link.focusElement.value,t=this.context.link.linkAnchorText,i=0===t.value.length?e:t.value;if(this.context.dialog.updateModal)this.context.link._linkAnchor.href=e,this.context.link._linkAnchor.textContent=i,this.context.link._linkAnchor.target=this.context.link.linkNewWindowCheck.checked?"_blank":"",this.setRange(this.context.link._linkAnchor.childNodes[0],0,this.context.link._linkAnchor.childNodes[0],this.context.link._linkAnchor.textContent.length);else{const t=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.createElement("A");t.href=e,t.textContent=i,t.target=this.context.link.linkNewWindowCheck.checked?"_blank":"",this.insertNode(t),this.setRange(t.childNodes[0],0,t.childNodes[0],t.textContent.length)}this.context.link.focusElement.value="",this.context.link.linkAnchorText.value=""}.bind(this);try{t()}finally{this.plugins.dialog.close.call(this),this.closeLoading(),this.focus()}return!1},call_controller_linkButton:function(e){this.editLink=this.context.link._linkAnchor=e;const t=this.context.link.linkBtn;t.getElementsByTagName("A")[0].href=e.href,t.getElementsByTagName("A")[0].textContent=e.textContent;const i=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.getOffset(e);t.style.left=i.left-this.context.element.wysiwyg.scrollLeft+"px",t.style.top=i.top+e.offsetHeight+10+"px",t.style.display="block",this.controllersOn(t)},onClick_linkBtn:function(e){e.stopPropagation();const t=e.target.getAttribute("data-command")||e.target.parentNode.getAttribute("data-command");t&&(e.preventDefault(),/update/.test(t)?(this.context.link.focusElement.value=this.context.link._linkAnchor.href,this.context.link.linkAnchorText.value=this.context.link._linkAnchor.textContent,this.context.link.linkNewWindowCheck.checked=!!/_blank/i.test(this.context.link._linkAnchor.target),this.plugins.dialog.open.call(this,"link",!0)):(_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.removeItem(this.context.link._linkAnchor),this.context.link._linkAnchor=null,this.focus()),this.controllersOff())},init:function(){const e=this.context.link;e.linkBtn.style.display="none",e._linkAnchor=null,e.focusElement.value="",e.linkAnchorText.value="",e.linkNewWindowCheck.checked=!1}}},VquE:function(module,__webpack_exports__,__webpack_require__){"use strict";var _lib_util__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("8e1d");__webpack_exports__.a={name:"table",add:function(core,targetElement){const context=core.context;context.table={_element:null,_tdElement:null,_trElement:null,_trElements:null,_tdIndex:0,_trIndex:0,_tdCnt:0,_trCnt:0,_tableXY:[]};let listDiv=eval(this.setSubmenu()),tablePicker=listDiv.getElementsByClassName("sun-editor-id-table-picker")[0];context.table.tableHighlight=listDiv.getElementsByClassName("sun-editor-id-table-highlighted")[0],context.table.tableUnHighlight=listDiv.getElementsByClassName("sun-editor-id-table-unhighlighted")[0],context.table.tableDisplay=listDiv.getElementsByClassName("sun-editor-table-display")[0];let resizeDiv=eval(this.setController_tableEditor(core.lang));context.table.resizeDiv=resizeDiv,resizeDiv.addEventListener("mousedown",function(e){e.stopPropagation()},!1),tablePicker.addEventListener("mousemove",this.onMouseMove_tablePicker.bind(core)),tablePicker.addEventListener("click",this.appendTable.bind(core)),resizeDiv.addEventListener("click",this.onClick_resizeDiv.bind(core)),targetElement.parentNode.appendChild(listDiv),context.element.relative.appendChild(resizeDiv),listDiv=null,tablePicker=null,resizeDiv=null},setSubmenu:function(){const e=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.createElement("DIV");return e.className="sun-editor-submenu table-content",e.style.display="none",e.innerHTML='
1 x 1
',e},setController_tableEditor:function(e){const t=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.createElement("DIV");return t.className="sun-editor-id-table-edit",t.style.display="none",t.innerHTML='
',t},appendTable:function(){const e=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.createElement("TABLE");let t=this.context.table._tableXY[0],i=this.context.table._tableXY[1],n="";for(;i>0;){n+="";let e=t;for(;e>0;)n+="
"+_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.zeroWidthSpace+"
",--e;n+="",--i}n+="",e.innerHTML=n;const o=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.getFormatElement(this.getSelectionNode());this.insertNode(e,/^LI$/i.test(o.nodeName)?_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.getRangeFormatElement(o):o),this.appendFormatTag(e),this.focus(),this.plugins.table.reset_table_picker.call(this)},onMouseMove_tablePicker:function(e){e.stopPropagation();let t=Math.ceil(e.offsetX/18),i=Math.ceil(e.offsetY/18);t=t<1?1:t,i=i<1?1:i,this.context.table.tableHighlight.style.width=t+"em",this.context.table.tableHighlight.style.height=i+"em";let n=t<5?5:t>9?10:t+1,o=i<5?5:i>9?10:i+1;this.context.table.tableUnHighlight.style.width=n+"em",this.context.table.tableUnHighlight.style.height=o+"em",_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.changeTxt(this.context.table.tableDisplay,t+" x "+i),this.context.table._tableXY=[t,i]},reset_table_picker:function(){if(!this.context.table.tableHighlight)return;const e=this.context.table.tableHighlight.style,t=this.context.table.tableUnHighlight.style;e.width="1em",e.height="1em",t.width="5em",t.height="5em",_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.changeTxt(this.context.table.tableDisplay,"1 x 1"),this.submenuOff()},init:function(){const e=this.context.table;e._tdElement&&_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.removeClass(e._tdElement,"sun-editor-selected-cell"),e._element=null,e._tdElement=null,e._trElement=null,e._trElements=0,e._tdIndex=0,e._trIndex=0,e._trCnt=0,e._tdCnt=0,e._tableXY=[]},call_controller_tableEdit:function(e){this.plugins.table.init.call(this);const t=this.context.table.resizeDiv;this.plugins.table.setPositionControllerDiv.call(this,e,!1),t.style.display="block",this.controllersOn(t)},setPositionControllerDiv:function(e,t){const i=this.context.table,n=i.resizeDiv;let o=i._element;if(!o){for(o=e;!/^TABLE$/i.test(o.nodeName);)o=o.parentNode;i._element=o}i._tdElement!==e&&(i._tdElement&&_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.removeClass(i._tdElement,"sun-editor-selected-cell"),_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.addClass(e,"sun-editor-selected-cell"),i._tdElement=e,i._trElement=e.parentNode),(t||0===i._trCnt)&&(i._trElements=o.rows,i._tdIndex=e.cellIndex,i._trIndex=i._trElement.rowIndex,i._trCnt=o.rows.length,i._tdCnt=i._trElement.cells.length);const l=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.getOffset(e);n.style.left=l.left-this.context.element.wysiwyg.scrollLeft+"px",n.style.top=l.top+e.offsetHeight+12+"px"},insertRowCell:function(e,t){const i=this.context.table;if("row"===e){const e="up"===t?i._trIndex:i._trIndex+1;let n="";for(let e=0,t=i._tdCnt;e
"+_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.zeroWidthSpace+"
";i._element.insertRow(e).innerHTML=n}else{const e=i._trElements,n="left"===t?i._tdIndex:i._tdIndex+1;let o=null;for(let t=0,l=i._trCnt;t"+_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.zeroWidthSpace+""}this.plugins.table.setPositionControllerDiv.call(this,i._tdElement,!0)},deleteRowCell:function(e){const t=this.context.table;if("row"===e)t._element.deleteRow(t._trIndex);else{const e=t._trElements,i=t._tdIndex;for(let n=0,o=t._trCnt;n'+e.toolbar.alignLeft+'
  • ",t},pickup:function(e){e.preventDefault(),e.stopPropagation();let t=e.target,i=null;for(;!i&&!/UL/i.test(t.tagName);)i=t.getAttribute("data-command"),t=t.parentNode;this.focus(),this.execCommand(i,!1,null),this.submenuOff()}}},WUQj:function(e,t,i){},WzUB:function(module,__webpack_exports__,__webpack_require__){"use strict";var _lib_util__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("8e1d");__webpack_exports__.a={name:"formatBlock",add:function(core,targetElement){let listDiv=eval(this.setSubmenu(core.lang));listDiv.getElementsByTagName("UL")[0].addEventListener("click",this.pickUp.bind(core)),targetElement.parentNode.appendChild(listDiv),listDiv=null},setSubmenu:function(e){const t=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.createElement("DIV");return t.className="sun-editor-submenu layer_editor layer_block",t.style.display="none",t.innerHTML='
    ",t},pickUp:function(e){e.preventDefault(),e.stopPropagation();let t=e.target,i=null,n=null;for(;!i&&!/UL/i.test(t.tagName);)i=t.getAttribute("data-command"),n=t.getAttribute("data-value"),t=t.parentNode;if("range"===i){const e=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.createElement(n);this.wrapToTags(e),this.setRange(e.firstChild,0,e.firstChild,0),this.appendFormatTag(e,_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.isCell(this.getSelectionNode())?"DIV":"")}else this.execCommand("formatBlock",!1,n),_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.changeTxt(this.commandMap.FORMAT,n);this.submenuOff(),this.focus()}}},XJR1:function(e,t,i){"use strict";i.r(t);i("3FqI"),i("WUQj");var n=i("WRt5"),o=i("50IV"),l=i("MIhV"),a=i("0A7J"),s=i("s0fJ"),r=i("g4XY"),d=i("gMuy"),c=i("VquE"),_=i("WzUB"),u=i("Rp48"),g=i("KKur"),m=i("hlhS"),h={align:n.a,font:o.a,fontSize:l.a,fontColor:a.a,hiliteColor:s.a,horizontalRule:r.a,list:d.a,table:c.a,formatBlock:_.a,link:u.a,image:g.a,video:m.a},p=i("8e1d"),f=i("PAX9");var b=function(e,t,i){const n=document,o=window,l={context:e,plugins:{},initPlugins:{},lang:i,dialogForm:null,_submenuName:"",submenu:null,_bindedSubmenuOff:null,submenuActiveButton:null,controllerArray:[],_bindControllersOff:null,codeViewDisabledButtons:e.element.toolbar.querySelectorAll('.sun-editor-id-toolbar button:not([class~="code-view-enabled"])'),_isInline:/inline/i.test(e.option.mode),_isBalloon:/balloon/i.test(e.option.mode),_inlineToolbarAttr:{width:0,height:0,isShow:!1},_imageUpload:function(e,t,i,n){"function"==typeof s.onImageUpload&&s.onImageUpload(e,1*t,i,n)},_imageUploadError:function(e,t){return"function"!=typeof s.onImageUploadError||s.onImageUploadError(e,t)},commandMap:{FORMAT:e.tool.format,FONT:e.tool.font,SIZE:e.tool.fontSize,B:e.tool.bold,U:e.tool.underline,I:e.tool.italic,STRIKE:e.tool.strike,SUB:e.tool.subscript,SUP:e.tool.superscript},_variable:{wysiwygActive:!0,isFullScreen:!1,innerHeight_fullScreen:0,resizeClientY:0,tabSize:4,minResizingSize:65,currentNodes:[],_range:null,_selectionNode:null,_originCssText:e.element.topArea.style.cssText,_bodyOverflow:"",_editorAreaOriginCssText:"",_wysiwygOriginCssText:"",_codeOriginCssText:"",_sticky:!1,_imagesInfo:[],_imageIndex:0},callPlugin:function(e,t){if(!this.plugins[e])throw Error('[SUNEDITOR.core.callPlugin.fail] The called plugin does not exist or is in an invalid format. (pluginName:"'+e+'")');this.initPlugins[e]||(this.plugins[e].add(this,this.plugins[e].buttonElement),this.initPlugins[e]=!0),t()},addModule:function(e){let t="";for(let i=0,n=e.length;i0){for(let t=0;t":i)},focus:function(){if("none"===e.element.wysiwyg.style.display)return;const t=p.a.getParentElement(this.getSelectionNode(),"figcaption");t?t.focus():e.element.wysiwyg.focus(),a._findButtonEffectTag()},setRange:function(e,t,i,l){const a=n.createRange();a.setStart(e,t),a.setEnd(i,l);const s=o.getSelection();s.removeAllRanges&&s.removeAllRanges(),s.addRange(a),this._editorRange()},getRange:function(){return this._variable._range||this._createDefaultRange()},getSelectionNode:function(){return this._variable._selectionNode||e.element.wysiwyg.firstChild},_editorRange:function(){const e=o.getSelection();if(!p.a.getParentElement(e.focusNode,".sun-editor-id-wysiwyg"))return;let t=null,i=null;t=e.rangeCount>0?e.getRangeAt(0):this._createDefaultRange(),this._variable._range=t,i=t.collapsed?t.commonAncestorContainer:e.extentNode||e.anchorNode,this._variable._selectionNode=i},_createDefaultRange:function(){const t=n.createRange();return t.setStart(e.element.wysiwyg.firstChild,0),t.setEnd(e.element.wysiwyg.firstChild,0),t},getSelectedFormatElements:function(){let t=this.getRange();if(p.a.isWysiwygDiv(t.startContainer)){const i=e.element.wysiwyg.children;this.setRange(i[0],0,i[i.length-1],i[i.length-1].textContent.length),t=this.getRange()}const i=t.startContainer,n=t.endContainer,o=t.commonAncestorContainer,l=[];if(!p.a.isWysiwygDiv(o)&&!p.a.isRangeFormatElement(o))return[p.a.getFormatElement(o)];const a=p.a.getListChildren(o,function(e){return p.a.isFormatElement(e)});if(i===n)return a[0];let s=p.a.getFormatElement(i),r=p.a.getFormatElement(n),d=0,c=0;for(let e=0,t=a.length;e=0;e--)r[e]===n.parentNode&&r[e].firstChild===n&&0===i&&(d=e,n=n.parentNode);for(let e=c-1,t=n;e>d;e--)r[e]===t.parentNode&&1===r[e].nodeType&&(r.splice(e,1),t=t.parentNode,--c);for(let e=d;e<=c;e++){const l=r[e];0===l.length||3===l.nodeType&&void 0===l.data?p.a.removeItem(l):l!==t?l!==n?p.a.removeItem(l):(s=1===n.nodeType?p.a.createTextNode(n.textContent):p.a.createTextNode(n.substringData(o,n.length-o))).length>0?n.data=s.data:p.a.removeItem(n):(a=1===t.nodeType?p.a.createTextNode(t.textContent):p.a.createTextNode(t.substringData(0,i))).length>0?t.data=a.data:p.a.removeItem(t)}},wrapToTags:function(e){const t=this.getRange(),i=this.getSelectedFormatElements();if(!i){const t=p.a.createElement(p.a.isCell(this.getSelectionNode())?"DIV":"P");return t.innerHTML=p.a.zeroWidthSpace,e.appendChild(t),void this.getSelectionNode().appendChild(e)}let n,o,l,a=i[i.length-1];n=p.a.isRangeFormatElement(a)||p.a.isFormatElement(a)?a:p.a.getRangeFormatElement(a)||p.a.getFormatElement(a),p.a.isCell(n)?(o=null,l=n):(o=n.nextSibling,l=n.parentNode);let s=null,r=null,d="";for(let t=0,n=i.length;t=i.length)return}}if(l=p.a.isWysiwygDiv(n.startContainer)?e.element.wysiwyg.firstChild:n.startContainer,a=n.startOffset,1===l.nodeType&&l.childNodes.length>0){for(;l&&!p.a.isBreak(l)&&1===l.nodeType;){r=[];for(let e=0,t=(s=l.childNodes).length;e0){for(;l&&!p.a.isBreak(l)&&1===l.nodeType;){r=[];for(let e=0,t=(s=l.childNodes).length;e0&&(t=e.style.cssText.replace(f,"").trim()),(t.length>0||e.nodeName!==m)&&(e.style.cssText.length>0&&(e.style.cssText=t),!0)};if(p.a.isWysiwygDiv(g)||p.a.isRangeFormatElement(g)){const e=this.getSelectedFormatElements(),i=e.length-1;h=t.cloneNode(!1),b=this._nodeChange_startLine(e[0],h,y,d,c,o);for(let n=1;n0?(h=t.cloneNode(!1),v=this._nodeChange_endLine(e[i],h,y,_,u,o)):v=b}else{h=t.cloneNode(!1);const e=this._nodeChange_oneLine(p.a.getFormatElement(g),h,y,d,c,_,u,o,n.collapsed);b.container=e.startContainer,b.offset=e.startOffset,v.container=e.endContainer,v.offset=e.endOffset}this.setRange(b.container,b.offset,v.container,v.offset)},_nodeChange_oneLine:function(e,t,i,n,o,l,a,s,r){const d=e,c=e.cloneNode(!1),_=n===l;let u,g,m,h,f=n,b=o,v=l,y=a,E=!1,x=!1;function C(e){const t=new RegExp("(?:;|^|\\s)(?:"+h+"null)\\s*:[^;]*\\s*(?:;|$)","ig");let i="";return t&&e.style.cssText.length>0&&(i=t.test(e.style.cssText)),!i}return function e(n,o){const l=n.childNodes;for(let n=0,a=l.length;nb?y-b:y===b?0:f.data.length-b));for(e.data.length>0&&o.appendChild(e),g=k,u=[],h="";g!==c&&g!==d&&null!==g;)i(g)&&1===g.nodeType&&C(g)&&(u.push(g.cloneNode(!1)),h+=g.style.cssText.substr(0,g.style.cssText.indexOf(":"))+"|"),g=g.parentNode;const l=u.pop()||n;for(m=g=l;u.length>0;)g=u.pop(),m.appendChild(g),m=g;if(t.appendChild(l),c.appendChild(t),f=n,b=0,E=!0,g!==n&&g.appendChild(f),!_)continue}if(x||k!==v){if(E){if(1===k.nodeType&&!p.a.isBreak(k)){e(k,k);continue}for(g=k,u=[],h="";null!==g.parentNode&&g!==d&&g!==t;)1===g.nodeType&&!p.a.isBreak(k)&&(x||i(g))&&C(g)&&(u.push(g.cloneNode(!1)),h+=g.style.cssText.substr(0,g.style.cssText.indexOf(":"))+"|"),g=g.parentNode;const n=u.pop()||k;for(m=g=n;u.length>0;)g=u.pop(),m.appendChild(g),m=g;n===k?o=x?c:t:x?(c.appendChild(n),o=g):(t.appendChild(n),o=g)}a=k.cloneNode(!1),o.appendChild(a),1!==k.nodeType||p.a.isBreak(k)||(w=a),e(k,w)}else{const e=p.a.createTextNode(1===v.nodeType?"":v.substringData(y,v.length-y)),n=p.a.createTextNode(_||1===v.nodeType?"":v.substringData(0,y));if(e.data.length>0){for(g=k,h="",u=[];g!==c&&g!==d&&null!==g;)1===g.nodeType&&C(g)&&(u.push(g.cloneNode(!1)),h+=g.style.cssText.substr(0,g.style.cssText.indexOf(":"))+"|"),g=g.parentNode;for(a=m=g=u.pop()||e;u.length>0;)g=u.pop(),m.appendChild(g),m=g;c.appendChild(a),g.textContent=e.data}for(g=k,u=[],h="";g!==c&&g!==d&&null!==g;)i(g)&&1===g.nodeType&&C(g)&&(u.push(g.cloneNode(!1)),h+=g.style.cssText.substr(0,g.style.cssText.indexOf(":"))+"|"),g=g.parentNode;const o=u.pop()||n;for(m=g=o;u.length>0;)g=u.pop(),m.appendChild(g),m=g;t.appendChild(o),v=n,y=n.data.length,x=!0,!s&&r&&(t=n,n.textContent=p.a.zeroWidthSpace),g!==n&&g.appendChild(v)}}}(e,c),s?(f=p.a.createTextNode(r?p.a.zeroWidthSpace:t.textContent),c.insertBefore(f,t),c.removeChild(t),r&&(b=1)):r&&(f=v=t,b=1,y=1),p.a.removeEmptyNode(c),e.parentNode.insertBefore(c,e),p.a.removeItem(e),{startContainer:f,startOffset:b,endContainer:s||!v.textContent?f:v,endOffset:s||!v.textContent?f.textContent.length:y}},_nodeChange_middleLine:function(e,t,i,n){n?t=p.a.createTextNode(e.textContent?e.textContent:p.a.zeroWidthSpace):function e(t,n){const o=t.childNodes;for(let t=0,l=o.length;t0){const e=r.pop();for(c=d=e;r.length>0;)d=r.pop(),c.appendChild(d),c=d;t.appendChild(e),o=d}else o=t}if(g||m!==_){if(!g||i(m)){const e=m.cloneNode(!1);o.appendChild(e),1!==m.nodeType||p.a.isBreak(m)||(h=e)}e(m,h)}else{const e=p.a.createTextNode(1===_.nodeType?"":_.substringData(0,u)),n=p.a.createTextNode(1===_.nodeType?"":_.substringData(u,_.length-u));for(e.data.length>0&&o.appendChild(e),d=o,r=[];d!==s&&null!==d;)1===d.nodeType&&i(d)&&r.push(d.cloneNode(!1)),d=d.parentNode;const l=r.pop()||o;for(c=d=l;r.length>0;)d=r.pop(),c.appendChild(d),c=d;l!==o?(t.appendChild(l),o=d):o=t,p.a.isBreak(m)&&t.appendChild(m.cloneNode(!1)),s.appendChild(t),_=n,u=0,g=!0,o.appendChild(_)}}}(e,s),l&&(_=p.a.createTextNode(t.textContent),s.insertBefore(_,t),s.removeChild(t)),l||0!==s.children.length?(p.a.removeEmptyNode(s),e.parentNode.insertBefore(s,e),p.a.removeItem(e)):e.childNodes?_=e.childNodes[0]:(_=p.a.createTextNode(p.a.zeroWidthSpace),e.appendChild(_)),{container:_,offset:u}},_nodeChange_endLine:function(e,t,i,n,o,l){const a=e,s=e.cloneNode(!1);let r,d,c,_=n,u=o,g=!1;return function e(n,o){const l=n.childNodes;for(let n=l.length-1;0<=n;n--){const m=l[n];let h=o;if(g&&!p.a.isBreak(m)){if(1===m.nodeType){e(m,m);continue}for(d=m,r=[];null!==d.parentNode&&d!==a&&d!==t;)i(d)&&1===d.nodeType&&r.push(d.cloneNode(!1)),d=d.parentNode;if(r.length>0){const e=r.pop();for(c=d=e;r.length>0;)d=r.pop(),c.appendChild(d),c=d;t.insertBefore(e,t.firstChild),o=d}else o=t}if(g||m!==_){if(!g||i(m)){const e=m.cloneNode(!1);o.insertBefore(e,o.firstChild),1!==m.nodeType||p.a.isBreak(m)||(h=e)}e(m,h)}else{const e=p.a.createTextNode(1===_.nodeType?"":_.substringData(u,_.length-u)),n=p.a.createTextNode(1===_.nodeType?"":_.substringData(0,u));for(e.data.length>0&&o.insertBefore(e,o.firstChild),d=o,r=[];d!==s&&null!==d;)i(d)&&1===d.nodeType&&r.push(d.cloneNode(!1)),d=d.parentNode;const l=r.pop()||o;for(c=d=l;r.length>0;)d=r.pop(),c.appendChild(d),c=d;l!==o?(t.insertBefore(l,t.firstChild),o=d):o=t,p.a.isBreak(m)&&t.appendChild(m.cloneNode(!1)),s.insertBefore(t,s.firstChild),_=n,u=n.data.length,g=!0,o.insertBefore(_,o.firstChild)}}}(e,s),l&&(_=p.a.createTextNode(t.textContent),u=_.textContent.length,s.insertBefore(_,t),s.removeChild(t)),l||0!==s.childNodes.length?(p.a.removeEmptyNode(s),e.parentNode.insertBefore(s,e),p.a.removeItem(e)):e.childNodes?_=e.childNodes[0]:(_=p.a.createTextNode(p.a.zeroWidthSpace),e.appendChild(_)),{container:_,offset:u}},commandHandler:function(t,i){switch(i){case"codeView":this.controllersOff(),this.toggleCodeView(),p.a.toggleClass(t,"on");break;case"fullScreen":this.controllersOff(),this.toggleFullScreen(t),p.a.toggleClass(t,"on");break;case"indent":case"outdent":this.indent(i);break;case"redo":case"undo":this.execCommand(i,!1,null);break;case"removeFormat":this.removeFormat();break;case"preview":case"print":this.openWindowContents(i);break;case"showBlocks":this.toggleDisplayBlocks(),p.a.toggleClass(t,"on");break;case"subscript":p.a.hasClass(e.tool.superscript,"on")&&(this.execCommand("superscript",!1,null),p.a.removeClass(e.tool.superscript,"on")),this.execCommand(i,!1,null),p.a.toggleClass(t,"on");break;case"superscript":p.a.hasClass(e.tool.subscript,"on")&&(this.execCommand("subscript",!1,null),p.a.removeClass(e.tool.subscript,"on")),this.execCommand(i,!1,null),p.a.toggleClass(t,"on");break;case"save":if("function"!=typeof e.option.callBackSave)throw Error("[SUNEDITOR.core.commandHandler.fail] Please register call back function in creation option. (callBackSave : Function)");e.option.callBackSave(this.getContents());break;default:this.execCommand(i,!1,t.getAttribute("data-value")),p.a.toggleClass(t,"on")}this.focus()},removeFormat:function(){this.nodeChange(p.a.createElement("REMOVENODE"))},indent:function(e){const t=this.getSelectedFormatElements();let i,n;for(let o=0,l=t.length;o0?e.element.code.scrollHeight+"px":"auto"),this._variable.wysiwygActive=!1,e.element.code.focus();else{const t=e.element.code.value.trim();e.element.wysiwyg.innerHTML=t.length>0?p.a.convertContentsForEditor(t):"

    "+p.a.zeroWidthSpace+"

    ",e.element.wysiwyg.scrollTop=0,e.element.code.style.display="none",e.element.wysiwyg.style.display="block","auto"===e.option.height&&(e.element.code.style.height="0px"),this._variable.wysiwygActive=!0,this.focus()}},toggleFullScreen:function(t){this._variable.isFullScreen?(this._variable.isFullScreen=!1,e.element.code.style.cssText=this._variable._codeOriginCssText,e.element.wysiwyg.style.cssText=this._variable._wysiwygOriginCssText,e.element.toolbar.style.cssText="",e.element.editorArea.style.cssText=this._variable._editorAreaOriginCssText,e.element.topArea.style.cssText=this._variable._originCssText,n.body.style.overflow=this._variable._bodyOverflow,e.option.stickyToolbar>-1&&(p.a.removeClass(e.element.toolbar,"sun-editor-sticky"),a.onScroll_window()),p.a.removeClass(t.firstElementChild,"icon-reduction"),p.a.addClass(t.firstElementChild,"icon-expansion")):(this._variable.isFullScreen=!0,e.element.topArea.style.position="fixed",e.element.topArea.style.top="0",e.element.topArea.style.left="0",e.element.topArea.style.width="100%",e.element.topArea.style.height="100%",e.element.topArea.style.zIndex="2147483647",this._variable._bodyOverflow=n.body.style.overflow,n.body.style.overflow="hidden",this._variable._editorAreaOriginCssText=e.element.editorArea.style.cssText,this._variable._wysiwygOriginCssText=e.element.wysiwyg.style.cssText,this._variable._codeOriginCssText=e.element.code.style.cssText,e.element.editorArea.style.cssText=e.element.toolbar.style.cssText=e.element.wysiwyg.style.cssText=e.element.code.style.cssText="",e.element.toolbar.style.width=e.element.wysiwyg.style.height=e.element.code.style.height="100%",e.element.toolbar.style.position="relative",this._variable.innerHeight_fullScreen=o.innerHeight-e.element.toolbar.offsetHeight,e.element.editorArea.style.height=this._variable.innerHeight_fullScreen+"px",p.a.removeClass(t.firstElementChild,"icon-expansion"),p.a.addClass(t.firstElementChild,"icon-reduction"))},openWindowContents:function(t){const n="print"===t,l=o.open("","_blank");l.mimeType="text/html",l.document.write(''+(n?i.toolbar.print:i.toolbar.preview)+'
    '+this.getContents()+"
    "+(n?"' : '') + '' + '');\n },\n\n /**\r\n * @description Gets the current contents\r\n * @returns {Object}\r\n */\n getContents: function () {\n let contents = '';\n if (context.element.wysiwyg.innerText.trim().length === 0) return contents;\n\n if (editor._variable.wysiwygActive) {\n contents = context.element.wysiwyg.innerHTML;\n } else {\n contents = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].convertContentsForEditor(context.element.code.value);\n }\n\n const renderHTML = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createElement('DIV');\n renderHTML.innerHTML = contents;\n const figcaptions = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getListChildren(renderHTML, function (current) {\n return /FIGCAPTION/i.test(current.nodeName);\n });\n\n for (let i = 0, len = figcaptions.length; i < len; i++) {\n figcaptions[i].outerHTML = figcaptions[i].outerHTML.replace(/(?!^]*>)/i, '');\n }\n\n return renderHTML.innerHTML;\n }\n };\n /**\r\n * @description event function\r\n */\n\n const event = {\n _shortcutKeyCode: {\n 66: ['bold', 'B'],\n 83: ['strikethrough', 'STRIKE'],\n 85: ['underline', 'U'],\n 73: ['italic', 'I'],\n 89: ['redo'],\n 90: ['undo'],\n 219: ['outdent'],\n 221: ['indent']\n },\n _directionKeyKeyCode: new RegExp('^(?:8|13|32|46|33|34|35|36|37|38|39|40|98|100|102|104)$'),\n _changeButtonClassTagCheck: new RegExp('^(?:B|U|I|STRIKE|SUB|SUP)$'),\n _findButtonEffectTag: function () {\n const commandMap = editor.commandMap;\n const classOnCheck = this._changeButtonClassTagCheck;\n const commandMapNodes = [];\n const currentNodes = [];\n let findFormat = true,\n findFont = true,\n findSize = true,\n findA = true;\n let findB = true,\n findI = true,\n findU = true,\n findS = true;\n let cssText = '',\n nodeName = '';\n\n for (let selectionParent = editor.getSelectionNode(); !_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(selectionParent); selectionParent = selectionParent.parentNode) {\n if (!selectionParent) break;\n if (selectionParent.nodeType !== 1) continue;\n nodeName = selectionParent.nodeName.toUpperCase();\n currentNodes.push(nodeName);\n /** Format */\n\n if (findFormat && _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isFormatElement(selectionParent)) {\n commandMapNodes.push('FORMAT');\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].changeTxt(commandMap.FORMAT, nodeName);\n findFormat = false;\n continue;\n }\n /** Font */\n\n\n if (findFont && (selectionParent.style.fontFamily.length > 0 || selectionParent.face && selectionParent.face.length > 0)) {\n commandMapNodes.push('FONT');\n const selectFont = (selectionParent.style.fontFamily || selectionParent.face || lang.toolbar.font).replace(/[\"']/g, '');\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].changeTxt(commandMap.FONT, selectFont);\n findFont = false;\n }\n /** A */\n\n\n if (findA && /^A$/.test(nodeName) && selectionParent.getAttribute('data-image-link') === null) {\n if (!context.link || editor.controllerArray[0] !== context.link.linkBtn) {\n editor.callPlugin('link', function () {\n editor.plugins.link.call_controller_linkButton.call(editor, selectionParent);\n });\n }\n\n findA = false;\n } else if (findA && context.link && editor.controllerArray[0] === context.link.linkBtn) {\n editor.controllersOff();\n }\n /** SPAN */\n\n\n if (findSize && /^SPAN$/.test(nodeName)) {\n /** font size */\n if (selectionParent.style.fontSize.length > 0) {\n commandMapNodes.push('SIZE');\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].changeTxt(commandMap.SIZE, selectionParent.style.fontSize);\n findSize = false;\n }\n }\n /** command map */\n\n\n cssText = selectionParent.style.cssText;\n\n if (findB && /font\\-weight\\s*:\\s*(?:\\d+|bold|bolder)(?:;|\\s|)/.test(cssText)) {\n commandMapNodes.push('B');\n findB = false;\n }\n\n if (findI && /font\\-style\\s*:\\s*(?:italic|oblique)(?:;|\\s)/.test(cssText)) {\n commandMapNodes.push('I');\n findI = false;\n }\n\n if (findU && /text\\-decoration(?:\\-line)?\\s*:\\s*underline(?:;|\\s|)/.test(cssText)) {\n commandMapNodes.push('U');\n findU = false;\n }\n\n if (findS && /text\\-decoration(?:\\-line)?\\s*:\\s*line-through(?:;|\\s|)/.test(cssText)) {\n commandMapNodes.push('STRIKE');\n findS = false;\n }\n\n commandMapNodes.push(/^STRONG$/.test(nodeName) ? 'B' : /^EM$/.test(nodeName) ? 'I' : nodeName);\n }\n /** A Tag edit controller off */\n\n\n if (findA) editor.controllersOff();\n /** toggle class on */\n\n for (let i = 0; i < commandMapNodes.length; i++) {\n nodeName = commandMapNodes[i];\n\n if (classOnCheck.test(nodeName)) {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].addClass(commandMap[nodeName], 'on');\n }\n }\n /** remove class, display text */\n\n\n for (let key in commandMap) {\n if (commandMapNodes.indexOf(key) > -1) continue;\n\n if (/^FONT/i.test(key)) {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].changeTxt(commandMap[key], lang.toolbar.font);\n } else if (/^SIZE$/i.test(key)) {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].changeTxt(commandMap[key], lang.toolbar.fontSize);\n } else {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeClass(commandMap[key], 'on');\n }\n }\n /** save current nodes */\n\n\n editor._variable.currentNodes = currentNodes.reverse();\n /** Displays the current node structure to resizingBar */\n\n if (context.option.showPathLabel) context.element.navigation.textContent = editor._variable.currentNodes.join(' > ');\n },\n _cancelCaptionEdit: function () {\n this.setAttribute('contenteditable', false);\n this.removeEventListener('blur', event._cancelCaptionEdit);\n },\n onMouseDown_toolbar: function (e) {\n let target = e.target;\n\n if (_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getParentElement(target, '.sun-editor-submenu')) {\n e.stopPropagation();\n } else {\n e.preventDefault();\n let command = target.getAttribute('data-command');\n let className = target.className;\n\n while (!command && !/editor_tool/.test(className) && !/sun-editor-id-toolbar/.test(className)) {\n target = target.parentNode;\n command = target.getAttribute('data-command');\n className = target.className;\n }\n\n if (command === editor._submenuName) {\n e.stopPropagation();\n }\n }\n },\n onClick_toolbar: function (e) {\n e.preventDefault();\n e.stopPropagation();\n let target = e.target;\n let display = target.getAttribute('data-display');\n let command = target.getAttribute('data-command');\n let className = target.className;\n\n while (!command && !/editor_tool/.test(className) && !/sun-editor-id-toolbar/.test(className)) {\n target = target.parentNode;\n command = target.getAttribute('data-command');\n display = target.getAttribute('data-display');\n className = target.className;\n }\n\n if (!command && !display) return;\n if (target.disabled) return;\n editor.focus();\n /** Dialog, Submenu */\n\n if (display) {\n if (/submenu/.test(display) && (target.nextElementSibling === null || target !== editor.submenuActiveButton)) {\n editor.callPlugin(command, function () {\n editor.submenuOn(target);\n });\n return;\n } else if (/dialog/.test(display)) {\n editor.callPlugin(command, function () {\n editor.plugins.dialog.open.call(editor, command, false);\n });\n return;\n }\n\n editor.submenuOff();\n return;\n }\n /** default command */\n\n\n if (command) {\n editor.commandHandler(target, command);\n }\n },\n onMouseUp_wysiwyg: function () {\n editor._editorRange();\n\n if (editor._isBalloon) {\n const range = editor.getRange();\n if (range.collapsed) event._hideToolbar();else event._showToolbarBalloon(range);\n }\n },\n onClick_wysiwyg: function (e) {\n e.stopPropagation();\n const targetElement = e.target;\n\n if (/^IMG$/i.test(targetElement.nodeName)) {\n e.preventDefault();\n editor.callPlugin('image', function () {\n const size = editor.plugins.resizing.call_controller_resize.call(editor, targetElement, 'image');\n editor.plugins.image.onModifyMode.call(editor, targetElement, size);\n\n if (!_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getParentElement(targetElement, '.sun-editor-id-image-container')) {\n editor.plugins.image.openModify.call(editor, true);\n editor.plugins.image.update_image.call(editor);\n editor.controllersOff();\n }\n });\n return;\n }\n\n if (/sun-editor-id-iframe-inner-resizing-cover/i.test(targetElement.className)) {\n e.preventDefault();\n editor.callPlugin('video', function () {\n const iframe = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getChildElement(targetElement.parentNode, 'iframe');\n const size = editor.plugins.resizing.call_controller_resize.call(editor, iframe, 'video');\n editor.plugins.video.onModifyMode.call(editor, iframe, size);\n });\n return;\n }\n\n event._findButtonEffectTag();\n\n const figcaption = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getParentElement(targetElement, 'FIGCAPTION');\n\n if (figcaption && figcaption.getAttribute('contenteditable') !== 'ture') {\n e.preventDefault();\n figcaption.setAttribute('contenteditable', true);\n figcaption.focus();\n\n if (editor._isInline && !editor._inlineToolbarAttr.isShow) {\n event._showToolbarInline();\n\n const hideToolbar = function () {\n event._hideToolbar();\n\n _d.removeEventListener('click', hideToolbar);\n };\n\n _d.addEventListener('click', hideToolbar);\n }\n } else {\n const td = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getParentElement(targetElement, _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isCell);\n\n if (td) {\n if (editor.controllerArray.length === 0) {\n editor.callPlugin('table', editor.plugins.table.call_controller_tableEdit.bind(editor, td));\n }\n }\n }\n\n if (userFunction.onClick) userFunction.onClick(e);\n },\n _showToolbarBalloon: function (rangeObj) {\n const range = rangeObj || editor.getRange();\n const padding = 20;\n const toolbar = context.element.toolbar;\n\n const selection = _w.getSelection();\n\n let isDirTop;\n\n if (selection.focusNode === selection.anchorNode) {\n isDirTop = selection.focusOffset < selection.anchorOffset;\n } else {\n const childNodes = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getListChildNodes(range.commonAncestorContainer);\n isDirTop = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getArrayIndex(childNodes, selection.focusNode) < _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getArrayIndex(childNodes, selection.anchorNode);\n }\n\n let rects = range.getClientRects();\n rects = rects[isDirTop ? 0 : rects.length - 1];\n toolbar.style.display = 'block';\n const toolbarWidth = toolbar.offsetWidth;\n const toolbarHeight = toolbar.offsetHeight;\n let l = (isDirTop ? rects.left : rects.right) - context.element.topArea.offsetLeft + (_w.scrollX || _d.documentElement.scrollLeft) - toolbarWidth / 2;\n let t = (isDirTop ? rects.top - toolbarHeight - 11 : rects.bottom + 11) - context.element.topArea.offsetTop + (_w.scrollY || _d.documentElement.scrollTop);\n const overRight = l + toolbarWidth - context.element.topArea.offsetWidth;\n toolbar.style.left = (l < 0 ? padding : overRight < 0 ? l : l - overRight - padding) + 'px';\n toolbar.style.top = t + 'px';\n\n if (isDirTop) {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeClass(context.element._arrow, 'arrow-up');\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].addClass(context.element._arrow, 'arrow-down');\n context.element._arrow.style.top = toolbarHeight + 'px';\n } else {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeClass(context.element._arrow, 'arrow-down');\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].addClass(context.element._arrow, 'arrow-up');\n context.element._arrow.style.top = '-11px';\n }\n\n const arrow_width = context.element._arrow.offsetWidth;\n const arrow_left = toolbarWidth / 2 + (l < 0 ? l - arrow_width : overRight < 0 ? 0 : overRight + arrow_width);\n const arrow_point_width = arrow_width / 2;\n context.element._arrow.style.left = (arrow_left < arrow_point_width ? arrow_point_width : arrow_left + arrow_point_width >= toolbarWidth ? arrow_left - arrow_point_width : arrow_left) + 'px';\n },\n _showToolbarInline: function () {\n const toolbar = context.element.toolbar;\n toolbar.style.display = 'block';\n editor._inlineToolbarAttr.width = toolbar.style.width = context.option.toolbarWidth;\n editor._inlineToolbarAttr.top = toolbar.style.top = -1 - toolbar.offsetHeight + 'px';\n event.onScroll_window();\n editor._inlineToolbarAttr.isShow = true;\n },\n _hideToolbar: function () {\n context.element.toolbar.style.display = 'none';\n editor._inlineToolbarAttr.isShow = false;\n },\n onKeyDown_wysiwyg: function (e) {\n const keyCode = e.keyCode;\n const shift = e.shiftKey;\n const ctrl = e.ctrlKey || e.metaKey;\n const alt = e.altKey;\n\n if (editor._isBalloon) {\n event._hideToolbar();\n }\n\n function shortcutCommand(keyCode) {\n const key = event._shortcutKeyCode[keyCode];\n if (!key) return false;\n editor.commandHandler(_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getFormatElement(editor.getSelectionNode()), key[0]);\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].toggleClass(editor.commandMap[key[1]], 'on');\n return true;\n }\n /** Shortcuts */\n\n\n if (ctrl && !/^(?:16|17|18)$/.test(keyCode)) {\n if (!(!shift && keyCode === 83) && shortcutCommand(keyCode)) {\n e.preventDefault();\n return;\n }\n }\n /** default key action */\n\n\n const selectionNode = editor.getSelectionNode();\n\n switch (keyCode) {\n case 8:\n /**backspace key*/\n if (_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isFormatElement(selectionNode) && _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(selectionNode.parentNode) && selectionNode.previousSibling === null) {\n e.preventDefault();\n e.stopPropagation();\n selectionNode.innerHTML = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].zeroWidthSpace;\n return false;\n }\n\n break;\n\n case 9:\n /**tab key*/\n e.preventDefault();\n if (ctrl || alt) break;\n editor.controllersOff();\n let currentNode = selectionNode || editor.getSelectionNode();\n\n while (!_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isCell(currentNode) && !_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(currentNode)) {\n currentNode = currentNode.parentNode;\n }\n\n if (currentNode && _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isCell(currentNode)) {\n const table = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getParentElement(currentNode, 'table');\n const cells = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getListChildren(table, _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isCell);\n let idx = shift ? _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].prevIdx(cells, currentNode) : _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].nextIdx(cells, currentNode);\n if (idx === cells.length && !shift) idx = 0;\n if (idx === -1 && shift) idx = cells.length - 1;\n const moveCell = cells[idx];\n if (!moveCell) return false;\n editor.setRange(moveCell, 0, moveCell, 0);\n break;\n }\n /** format Tag */\n\n\n const lines = editor.getSelectedFormatElements();\n\n if (!shift) {\n const tabText = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(new Array(editor._variable.tabSize + 1).join('\\u00A0'));\n\n if (lines.length === 1) {\n editor.insertNode(tabText);\n editor.setRange(tabText, editor._variable.tabSize, tabText, editor._variable.tabSize);\n } else {\n for (let i = 0, len = lines.length; i < len; i++) {\n lines[i].insertBefore(tabText.cloneNode(false), lines[i].firstChild);\n }\n }\n } else {\n for (let i = 0, len = lines.length, child; i < len; i++) {\n child = lines[i].firstChild;\n\n if (/^\\s{1,4}$/.test(child.textContent)) {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeItem(child);\n } else if (/^\\s{1,4}/.test(child.textContent)) {\n child.textContent = child.textContent.replace(/^\\s{1,4}/, '');\n }\n }\n }\n\n break;\n }\n\n if (userFunction.onKeyDown) userFunction.onKeyDown(e);\n },\n onKeyUp_wysiwyg: function (e) {\n editor._editorRange();\n\n editor.controllersOff();\n const selectionNode = editor.getSelectionNode();\n\n if (editor._isBalloon && !editor.getRange().collapsed) {\n event._showToolbarBalloon();\n\n return;\n }\n /** when format tag deleted */\n\n\n if (e.keyCode === 8 && _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(selectionNode) && context.element.wysiwyg.textContent.length === 0) {\n e.preventDefault();\n e.stopPropagation();\n const oFormatTag = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createElement(_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isFormatElement(editor._variable.currentNodes[0]) ? editor._variable.currentNodes[0] : 'P');\n oFormatTag.innerHTML = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].zeroWidthSpace;\n selectionNode.appendChild(oFormatTag);\n editor.setRange(oFormatTag, 0, oFormatTag, 0);\n return;\n }\n\n if ((_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(selectionNode.parentElement) || _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isRangeFormatElement(selectionNode.parentElement)) && selectionNode.nodeType === 3) {\n editor.execCommand('formatBlock', false, _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(selectionNode.parentElement) ? 'P' : 'DIV');\n\n event._findButtonEffectTag();\n\n return;\n }\n\n if (event._directionKeyKeyCode.test(e.keyCode)) {\n event._findButtonEffectTag();\n }\n\n if (userFunction.onKeyUp) userFunction.onKeyUp(e);\n },\n onScroll_wysiwyg: function (e) {\n editor.controllersOff();\n if (userFunction.onScroll) userFunction.onScroll(e);\n },\n onDrop_wysiwyg: function (e) {\n const files = e.dataTransfer.files;\n\n if (files.length > 0) {\n e.stopPropagation();\n e.preventDefault();\n editor.focus();\n editor.callPlugin('image', function () {\n context.image.imgInputFile.files = files;\n editor.plugins.image.onRender_imgInput.call(editor);\n context.image.imgInputFile.files = null;\n });\n }\n\n if (userFunction.onDrop) userFunction.onDrop(e);\n },\n onMouseDown_resizingBar: function (e) {\n e.stopPropagation();\n editor._variable.resizeClientY = e.clientY;\n context.element.resizeBackground.style.display = 'block';\n\n function closureFunc() {\n context.element.resizeBackground.style.display = 'none';\n\n _d.removeEventListener('mousemove', event._resize_editor);\n\n _d.removeEventListener('mouseup', closureFunc);\n }\n\n _d.addEventListener('mousemove', event._resize_editor);\n\n _d.addEventListener('mouseup', closureFunc);\n },\n _resize_editor: function (e) {\n const resizeInterval = context.element.editorArea.offsetHeight + (e.clientY - editor._variable.resizeClientY);\n context.element.wysiwyg.style.height = context.element.code.style.height = (resizeInterval < editor._variable.minResizingSize ? editor._variable.minResizingSize : resizeInterval) + 'px';\n editor._variable.resizeClientY = e.clientY;\n },\n onResize_window: function () {\n if (context.element.toolbar.offsetWidth === 0) return;\n\n if (editor._variable.isFullScreen) {\n editor._variable.innerHeight_fullScreen += _w.innerHeight - context.element.toolbar.offsetHeight - editor._variable.innerHeight_fullScreen;\n context.element.editorArea.style.height = editor._variable.innerHeight_fullScreen + 'px';\n } else if (editor._variable._sticky) {\n context.element.toolbar.style.width = context.element.topArea.offsetWidth - 2 + 'px';\n event.onScroll_window();\n }\n\n editor.controllersOff();\n },\n onScroll_window: function () {\n if (editor._variable.isFullScreen || context.element.toolbar.offsetWidth === 0) return;\n const element = context.element;\n const editorHeight = element.editorArea.offsetHeight;\n const editorTop = element.topArea.offsetTop - (editor._isInline ? element.toolbar.offsetHeight : 0);\n const y = (this.scrollY || _d.documentElement.scrollTop) + context.option.stickyToolbar;\n\n if (y < editorTop) {\n event._offStickyToolbar(element);\n } else if (y + editor._variable.minResizingSize >= editorHeight + editorTop) {\n if (!editor._variable._sticky) event._onStickyToolbar(element);\n element.toolbar.style.top = editorHeight + editorTop + context.option.stickyToolbar - y - editor._variable.minResizingSize + 'px';\n } else if (y >= editorTop) {\n event._onStickyToolbar(element);\n }\n },\n _onStickyToolbar: function (element) {\n if (!editor._isInline) {\n element._stickyDummy.style.height = element.toolbar.offsetHeight + 'px';\n element._stickyDummy.style.display = 'block';\n }\n\n element.toolbar.style.top = context.option.stickyToolbar + 'px';\n element.toolbar.style.width = editor._isInline ? editor._inlineToolbarAttr.width : element.toolbar.offsetWidth + 'px';\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].addClass(element.toolbar, 'sun-editor-sticky');\n editor._variable._sticky = true;\n },\n _offStickyToolbar: function (element) {\n element._stickyDummy.style.display = 'none';\n element.toolbar.style.top = editor._isInline ? editor._inlineToolbarAttr.top : '';\n element.toolbar.style.width = editor._isInline ? editor._inlineToolbarAttr.width : '';\n element.editorArea.style.marginTop = '';\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeClass(element.toolbar, 'sun-editor-sticky');\n editor._variable._sticky = false;\n },\n _codeViewAutoScroll: function () {\n context.element.code.style.height = context.element.code.scrollHeight + 'px';\n },\n onPaste_wysiwyg: function (e) {\n if (!e.clipboardData.getData) return true;\n const cleanData = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].cleanHTML(e.clipboardData.getData('text/html'));\n\n if (cleanData) {\n editor.execCommand('insertHTML', false, cleanData);\n e.stopPropagation();\n e.preventDefault();\n }\n }\n };\n /** add event listeners */\n\n /** toolbar event */\n\n context.element.toolbar.addEventListener('mousedown', event.onMouseDown_toolbar, false);\n context.element.toolbar.addEventListener('click', event.onClick_toolbar, false);\n /** editor area */\n\n context.element.relative.addEventListener('click', editor.focus.bind(editor), false);\n context.element.wysiwyg.addEventListener('mouseup', event.onMouseUp_wysiwyg, false);\n context.element.wysiwyg.addEventListener('click', event.onClick_wysiwyg, false);\n context.element.wysiwyg.addEventListener('scroll', event.onScroll_wysiwyg, false);\n context.element.wysiwyg.addEventListener('keydown', event.onKeyDown_wysiwyg, false);\n context.element.wysiwyg.addEventListener('keyup', event.onKeyUp_wysiwyg, false);\n context.element.wysiwyg.addEventListener('drop', event.onDrop_wysiwyg, false);\n context.element.wysiwyg.addEventListener('paste', event.onPaste_wysiwyg, false);\n /** code view area auto line */\n\n if (context.option.height === 'auto') context.element.code.addEventListener('keyup', event._codeViewAutoScroll, false);\n /** resizingBar */\n\n if (context.element.resizingBar) {\n if (/\\d+/.test(context.option.height)) {\n context.element.resizingBar.addEventListener('mousedown', event.onMouseDown_resizingBar, false);\n } else {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].addClass(context.element.resizingBar, 'none-resize');\n }\n }\n /** inline editor */\n\n\n if (editor._isInline) {\n context.element.wysiwyg.addEventListener('focus', event._showToolbarInline, false);\n }\n\n if (editor._isInline || editor._isBalloon) {\n context.element.wysiwyg.addEventListener('blur', event._hideToolbar, false);\n }\n /** window event */\n\n\n _w.addEventListener('resize', event.onResize_window, false);\n\n if (context.option.stickyToolbar > -1) _w.addEventListener('scroll', event.onScroll_window, false);\n /** add plugin to plugins object */\n\n if (plugins) {\n Object.keys(plugins).map(function (key) {\n let plugin = plugins[key];\n editor.plugins[plugin.name] = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].copyObj(plugin);\n });\n }\n /** User function */\n\n\n const userFunction = {\n /**\r\n * @description Event functions\r\n * @param {Object} event - Event Object\r\n */\n onScroll: null,\n onClick: null,\n onKeyDown: null,\n onKeyUp: null,\n onDrop: null,\n\n /**\r\n * @description Called when the image is uploaded or the uploaded image is deleted\r\n * @param {Element} targetImgElement - Current img element\r\n * @param {Number} index - Uploaded index\r\n * @param {Boolean} isDelete - Whether or not it was called after the delete operation\r\n * @param {Object} imageInfo - Image info object\r\n */\n onImageUpload: null,\n\n /**\r\n * @description Called when the image is upload failed\r\n * @param {String} errorMessage - Error message\r\n * @param {Object} result - Result info Object\r\n */\n onImageUploadError: null,\n\n /**\r\n * @description Open a notice area\r\n * @param {String} message - Notice message\r\n */\n noticeOpen: function (message) {\n editor.addModule([_plugins_modules_notice__WEBPACK_IMPORTED_MODULE_1__[\"default\"]]);\n _plugins_modules_notice__WEBPACK_IMPORTED_MODULE_1__[\"default\"].open.call(editor, message);\n },\n\n /**\r\n * @description Close a notice area\r\n */\n noticeClose: function () {\n editor.addModule([_plugins_modules_notice__WEBPACK_IMPORTED_MODULE_1__[\"default\"]]);\n _plugins_modules_notice__WEBPACK_IMPORTED_MODULE_1__[\"default\"].close.call(editor);\n },\n\n /**\r\n * @description Copying the contents of the editor to the original textarea\r\n */\n save: function () {\n context.element.originElement.value = editor.getContents();\n },\n\n /**\r\n * @description Gets the suneditor's context object. Contains settings, plugins, and cached element objects\r\n * @returns {Object}\r\n */\n getContext: function () {\n return context;\n },\n\n /**\r\n * @description Gets the contents of the suneditor\r\n * @returns {String}\r\n */\n getContents: function () {\n return editor.getContents();\n },\n\n /**\r\n * @description Gets uploaded images informations\r\n * @returns {Array}\r\n */\n getImagesInfo: function () {\n return editor._variable._imagesInfo;\n },\n\n /**\r\n * @description Inserts an HTML element or HTML string or plain string at the current cursor position\r\n * @param {Element|String} html - HTML Element or HTML string or plain string\r\n */\n insertHTML: function (html) {\n if (!html.nodeType || html.nodeType !== 1) {\n const template = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createElement('template');\n template.innerHTML = html;\n html = template.firstChild || template.content.firstChild;\n }\n\n editor.insertNode(html);\n editor.focus();\n },\n\n /**\r\n * @description Change the contents of the suneditor\r\n * @param {String} contents - Contents to Input\r\n */\n setContents: function (contents) {\n if (editor._variable.wysiwygActive) {\n context.element.wysiwyg.innerHTML = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].convertContentsForEditor(contents);\n } else {\n context.element.code.value = contents;\n }\n },\n\n /**\r\n * @description Add contents to the suneditor\r\n * @param {String} contents - Contents to Input\r\n */\n appendContents: function (contents) {\n if (editor._variable.wysiwygActive) {\n context.element.wysiwyg.innerHTML += _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].convertContentsForEditor(contents);\n } else {\n context.element.code.value += contents;\n }\n },\n\n /**\r\n * @description Disable the suneditor\r\n */\n disabled: function () {\n context.tool.cover.style.display = 'block';\n context.element.wysiwyg.setAttribute('contenteditable', false);\n context.element.code.setAttribute('disabled', 'disabled');\n },\n\n /**\r\n * @description Enabled the suneditor\r\n */\n enabled: function () {\n context.tool.cover.style.display = 'none';\n context.element.wysiwyg.setAttribute('contenteditable', true);\n context.element.code.removeAttribute('disabled');\n },\n\n /**\r\n * @description Show the suneditor\r\n */\n show: function () {\n const topAreaStyle = context.element.topArea.style;\n if (topAreaStyle.display === 'none') topAreaStyle.display = context.option.display;\n },\n\n /**\r\n * @description Hide the suneditor\r\n */\n hide: function () {\n context.element.topArea.style.display = 'none';\n },\n\n /**\r\n * @description Destroy the suneditor\r\n */\n destroy: function () {\n /** remove window event listeners */\n _w.removeEventListener('resize', event.onResize_window);\n\n _w.removeEventListener('scroll', event.onScroll_window);\n /** remove element */\n\n\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeItem(context.element.topArea);\n this.onScroll = null;\n this.onClick = null;\n this.onKeyDown = null;\n this.onKeyUp = null;\n this.onDrop = null;\n this.save = null;\n this.onImageUpload = null;\n this.onImageUploadError = null;\n this.noticeOpen = null;\n this.noticeClose = null;\n this.getContext = null;\n this.getContents = null;\n this.getImagesInfo = null;\n this.insertHTML = null;\n this.setContents = null;\n this.appendContents = null;\n this.disabled = null;\n this.enabled = null;\n this.show = null;\n this.hide = null;\n this.destroy = null;\n context = null;\n plugins = null;\n lang = null;\n }\n };\n return userFunction;\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (core);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvbGliL2NvcmUuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbGliL2NvcmUuanM/OGE4ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiB3eXNpd3lnIHdlYiBlZGl0b3JcclxuICpcclxuICogc3VuZWRpdG9yLmpzXHJcbiAqIENvcHlyaWdodCAyMDE3IEppSG9uZyBMZWUuXHJcbiAqIE1JVCBsaWNlbnNlLlxyXG4gKi9cclxuJ3VzZSBzdHJpY3QnO1xyXG5cclxuaW1wb3J0IHV0aWwgZnJvbSAnLi91dGlsJztcclxuaW1wb3J0IG5vdGljZSBmcm9tICcuLi9wbHVnaW5zL21vZHVsZXMvbm90aWNlJztcclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gU3VuRWRpdG9yIGNvcmUgZnVuY3Rpb25cclxuICogQHBhcmFtIGNvbnRleHRcclxuICogQHBhcmFtIHBsdWdpbnNcclxuICogQHBhcmFtIGxhbmdcclxuICogQHJldHVybnMge09iamVjdH0gVXNlckZ1bmN0aW9uIE9iamVjdFxyXG4gKi9cclxuY29uc3QgY29yZSA9IGZ1bmN0aW9uIChjb250ZXh0LCBwbHVnaW5zLCBsYW5nKSB7XHJcbiAgICBjb25zdCBfZCA9IGRvY3VtZW50O1xyXG4gICAgY29uc3QgX3cgPSB3aW5kb3c7XHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBlZGl0b3IgY29yZSBvYmplY3RcclxuICAgICAqIHNob3VsZCBhbHdheXMgYmluZCB0aGlzIG9iamVjdCB3aGVuIHJlZ2lzdGVyaW5nIGFuIGV2ZW50IGluIHRoZSBwbHVnLWluLlxyXG4gICAgICovXHJcbiAgICBjb25zdCBlZGl0b3IgPSB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEVsZW1lbnRzIGFuZCB1c2VyIG9wdGlvbnMgcGFyYW1ldGVycyBvZiB0aGUgc3VuZWRpdG9yXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29udGV4dDogY29udGV4dCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIGxvYWRlZCBwbHVnaW5zXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcGx1Z2luczoge30sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBXaGV0aGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWRcclxuICAgICAgICAgKi9cclxuICAgICAgICBpbml0UGx1Z2luczoge30sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBsb2FkZWQgbGFuZ3VhZ2VcclxuICAgICAgICAgKi9cclxuICAgICAgICBsYW5nOiBsYW5nLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gZGlhbG9nIGVsZW1lbnRcclxuICAgICAgICAgKi9cclxuICAgICAgICBkaWFsb2dGb3JtOiBudWxsLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gY3VycmVudCBzdWJtZW50IG5hbWVcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF9zdWJtZW51TmFtZTogJycsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBzdWJtZW51IGVsZW1lbnRcclxuICAgICAgICAgKi9cclxuICAgICAgICBzdWJtZW51OiBudWxsLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gYmluZGVkIHN1Ym1lbnVPZmYgbWV0aG9kXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfYmluZGVkU3VibWVudU9mZjogbnVsbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIGFjdGl2ZSBidXR0b24gZWxlbWVudCBpbiBzdWJtZW51XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc3VibWVudUFjdGl2ZUJ1dHRvbjogbnVsbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFRoZSBlbGVtZW50cyBhcnJheSB0byBiZSBwcm9jZXNzZWQgdW52aXNpYmxlIHdoZW4gdGhlIGNvbnRyb2xsZXJzT2ZmIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIChyZXNpemluZywgbGluayBtb2RpZmllZCBidXR0b24sIHRhYmxlIGNvbnRyb2xsZXIpXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29udHJvbGxlckFycmF5OiBbXSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIGJpbmRlZCBjb250cm9sbGVyc09mZiBtZXRob2RcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF9iaW5kQ29udHJvbGxlcnNPZmY6IG51bGwsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBBbiBhcnJheSBvZiBidXR0b25zIHdob3NlIGNsYXNzIG5hbWUgaXMgbm90IFwiY29kZS12aWV3LWVuYWJsZWRcIlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvZGVWaWV3RGlzYWJsZWRCdXR0b25zOiBjb250ZXh0LmVsZW1lbnQudG9vbGJhci5xdWVyeVNlbGVjdG9yQWxsKCcuc3VuLWVkaXRvci1pZC10b29sYmFyIGJ1dHRvbjpub3QoW2NsYXNzfj1cImNvZGUtdmlldy1lbmFibGVkXCJdKScpLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gSXMgaW5saW5lIG1vZGU/XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfaXNJbmxpbmU6IC9pbmxpbmUvaS50ZXN0KGNvbnRleHQub3B0aW9uLm1vZGUpLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gSXMgYmFsbG9vbiBtb2RlP1xyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX2lzQmFsbG9vbjogL2JhbGxvb24vaS50ZXN0KGNvbnRleHQub3B0aW9uLm1vZGUpLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gUmVxdWlyZWQgdmFsdWUgd2hlbiB1c2luZyBpbmxpbmUgbW9kZSB0byBzdGlja3kgdG9vbGJhclxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX2lubGluZVRvb2xiYXJBdHRyOiB7d2lkdGg6IDAsIGhlaWdodDogMCwgaXNTaG93OiBmYWxzZX0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBBbiB1c2VyIGV2ZW50IGZ1bmN0aW9uIHdoZW4gaW1hZ2UgdXBsb2FkZWQgc3VjY2VzcyBvciByZW1vdmUgaW1hZ2VcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF9pbWFnZVVwbG9hZDogZnVuY3Rpb24gKHRhcmdldEltZ0VsZW1lbnQsIGluZGV4LCBpc0RlbGV0ZSwgaW1hZ2VJbmZvKSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdXNlckZ1bmN0aW9uLm9uSW1hZ2VVcGxvYWQgPT09ICdmdW5jdGlvbicpIHVzZXJGdW5jdGlvbi5vbkltYWdlVXBsb2FkKHRhcmdldEltZ0VsZW1lbnQsIGluZGV4ICogMSwgaXNEZWxldGUsIGltYWdlSW5mbyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEFuIHVzZXIgZXZlbnQgZnVuY3Rpb24gd2hlbiBpbWFnZSB1cGxvYWQgZmFpbGVkXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfaW1hZ2VVcGxvYWRFcnJvcjogZnVuY3Rpb24gKGVycm9yTWVzc2FnZSwgcmVzdWx0KSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdXNlckZ1bmN0aW9uLm9uSW1hZ2VVcGxvYWRFcnJvciA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHVzZXJGdW5jdGlvbi5vbkltYWdlVXBsb2FkRXJyb3IoZXJyb3JNZXNzYWdlLCByZXN1bHQpO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gRWxlbWVudHMgdGhhdCBuZWVkIHRvIGNoYW5nZSB0ZXh0IG9yIGNsYXNzTmFtZSBmb3IgZWFjaCBzZWxlY3Rpb24gY2hhbmdlXHJcbiAgICAgICAgICogQHByb3BlcnR5IHtFbGVtZW50fSBGT1JNQVQgLSBmb3JtYXQgYnV0dG9uXHJcbiAgICAgICAgICogQHByb3BlcnR5IHtFbGVtZW50fSBGT05UIC0gZm9udCBmYW1pbHkgYnV0dG9uXHJcbiAgICAgICAgICogQHByb3BlcnR5IHtFbGVtZW50fSBTSVpFIC0gZm9udCBzaXplIGJ1dHRvblxyXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gQiAtIGJvbGQgYnV0dG9uXHJcbiAgICAgICAgICogQHByb3BlcnR5IHtFbGVtZW50fSBVIC0gdW5kZXJsaW5lIGJ1dHRvblxyXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gSSAtIGl0YWxpYyBidXR0b25cclxuICAgICAgICAgKiBAcHJvcGVydHkge0VsZW1lbnR9IFNUUklLRSAtIHN0cmlrZSBidXR0b25cclxuICAgICAgICAgKiBAcHJvcGVydHkge0VsZW1lbnR9IFNVQiAtIHN1YnNjcmlwdCBidXR0b25cclxuICAgICAgICAgKiBAcHJvcGVydHkge0VsZW1lbnR9IFNVUCAtIHN1cGVyc2NyaXB0IGJ1dHRvblxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbW1hbmRNYXA6IHtcclxuICAgICAgICAgICAgRk9STUFUOiBjb250ZXh0LnRvb2wuZm9ybWF0LFxyXG4gICAgICAgICAgICBGT05UOiBjb250ZXh0LnRvb2wuZm9udCxcclxuICAgICAgICAgICAgU0laRTogY29udGV4dC50b29sLmZvbnRTaXplLFxyXG4gICAgICAgICAgICBCOiBjb250ZXh0LnRvb2wuYm9sZCxcclxuICAgICAgICAgICAgVTogY29udGV4dC50b29sLnVuZGVybGluZSxcclxuICAgICAgICAgICAgSTogY29udGV4dC50b29sLml0YWxpYyxcclxuICAgICAgICAgICAgU1RSSUtFOiBjb250ZXh0LnRvb2wuc3RyaWtlLFxyXG4gICAgICAgICAgICBTVUI6IGNvbnRleHQudG9vbC5zdWJzY3JpcHQsXHJcbiAgICAgICAgICAgIFNVUDogY29udGV4dC50b29sLnN1cGVyc2NyaXB0XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFZhcmlhYmxlcyB1c2VkIGludGVybmFsbHkgaW4gZWRpdG9yIG9wZXJhdGlvblxyXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gd3lzaXd5Z0FjdGl2ZSAtIFRoZSB3eXNpd3lnIGZyYW1lIG9yIGNvZGUgdmlldyBzdGF0ZVxyXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gaXNGdWxsU2NyZWVuIC0gU3RhdGUgb2YgZnVsbCBzY3JlZW5cclxuICAgICAgICAgKiBAcHJvcGVydHkge051bWJlcn0gaW5uZXJIZWlnaHRfZnVsbFNjcmVlbiAtIElubmVySGVpZ2h0IGluIGVkaXRvciB3aGVuIGluIGZ1bGwgc2NyZWVuXHJcbiAgICAgICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IHJlc2l6ZUNsaWVudFkgLSBSZW1lbWJlciB0aGUgdmVydGljYWwgc2l6ZSBvZiB0aGUgZWRpdG9yIGJlZm9yZSByZXNpemluZyB0aGUgZWRpdG9yIChVc2VkIHdoZW4gY2FsY3VsYXRpbmcgZHVyaW5nIHJlc2l6ZSBvcGVyYXRpb24pXHJcbiAgICAgICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IHRhYlNpemUgLSBJbmRlbnRlZCBzaXplIHdoZW4gdGFiIGJ1dHRvbiBjbGlja2VkICg0KVxyXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBtaW5SZXNpemluZ1NpemUgLSBNaW5pbXVtIHNpemUgb2YgZWRpdGluZyBhcmVhIHdoZW4gcmVzaXplZCAoNjUpXHJcbiAgICAgICAgICogQHByb3BlcnR5IHtBcnJheX0gY3VycmVudE5vZGVzIC0gIEFuIGFycmF5IG9mIHRoZSBjdXJyZW50IGN1cnNvcidzIG5vZGUgc3RydWN0dXJlXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfdmFyaWFibGU6IHtcclxuICAgICAgICAgICAgd3lzaXd5Z0FjdGl2ZTogdHJ1ZSxcclxuICAgICAgICAgICAgaXNGdWxsU2NyZWVuOiBmYWxzZSxcclxuICAgICAgICAgICAgaW5uZXJIZWlnaHRfZnVsbFNjcmVlbjogMCxcclxuICAgICAgICAgICAgcmVzaXplQ2xpZW50WTogMCxcclxuICAgICAgICAgICAgdGFiU2l6ZTogNCxcclxuICAgICAgICAgICAgbWluUmVzaXppbmdTaXplOiA2NSxcclxuICAgICAgICAgICAgY3VycmVudE5vZGVzOiBbXSxcclxuICAgICAgICAgICAgX3JhbmdlOiBudWxsLFxyXG4gICAgICAgICAgICBfc2VsZWN0aW9uTm9kZTogbnVsbCxcclxuICAgICAgICAgICAgX29yaWdpbkNzc1RleHQ6IGNvbnRleHQuZWxlbWVudC50b3BBcmVhLnN0eWxlLmNzc1RleHQsXHJcbiAgICAgICAgICAgIF9ib2R5T3ZlcmZsb3c6ICcnLFxyXG4gICAgICAgICAgICBfZWRpdG9yQXJlYU9yaWdpbkNzc1RleHQ6ICcnLFxyXG4gICAgICAgICAgICBfd3lzaXd5Z09yaWdpbkNzc1RleHQ6ICcnLFxyXG4gICAgICAgICAgICBfY29kZU9yaWdpbkNzc1RleHQ6ICcnLFxyXG4gICAgICAgICAgICBfc3RpY2t5OiBmYWxzZSxcclxuICAgICAgICAgICAgX2ltYWdlc0luZm86IFtdLFxyXG4gICAgICAgICAgICBfaW1hZ2VJbmRleDogMFxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBJZiB0aGUgcGx1Z2luIGlzIG5vdCBhZGRlZCwgYWRkIHRoZSBwbHVnaW4gYW5kIGNhbGwgdGhlICdhZGQnIGZ1bmN0aW9uLlxyXG4gICAgICAgICAqIElmIHRoZSBwbHVnaW4gaXMgYWRkZWQgY2FsbCBjYWxsQmFjayBmdW5jdGlvbi5cclxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcGx1Z2luTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwbHVnaW4gdG8gY2FsbFxyXG4gICAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxCYWNrRnVuY3Rpb24gLSBGdW5jdGlvbiB0byBiZSBleGVjdXRlZCBpbW1lZGlhdGVseSBhZnRlciBtb2R1bGUgY2FsbFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNhbGxQbHVnaW46IGZ1bmN0aW9uIChwbHVnaW5OYW1lLCBjYWxsQmFja0Z1bmN0aW9uKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5wbHVnaW5zW3BsdWdpbk5hbWVdKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignW1NVTkVESVRPUi5jb3JlLmNhbGxQbHVnaW4uZmFpbF0gVGhlIGNhbGxlZCBwbHVnaW4gZG9lcyBub3QgZXhpc3Qgb3IgaXMgaW4gYW4gaW52YWxpZCBmb3JtYXQuIChwbHVnaW5OYW1lOlwiJyArIHBsdWdpbk5hbWUgKyAnXCIpJyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaW5pdFBsdWdpbnNbcGx1Z2luTmFtZV0pe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zW3BsdWdpbk5hbWVdLmFkZCh0aGlzLCB0aGlzLnBsdWdpbnNbcGx1Z2luTmFtZV0uYnV0dG9uRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRQbHVnaW5zW3BsdWdpbk5hbWVdID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNhbGxCYWNrRnVuY3Rpb24oKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gSWYgdGhlIG1vZHVsZSBpcyBub3QgYWRkZWQsIGFkZCB0aGUgbW9kdWxlIGFuZCBjYWxsIHRoZSAnYWRkJyBmdW5jdGlvblxyXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IG1vZHVsZUFycmF5IC0gbW9kdWxlIG9iamVjdCdzIEFycmF5IFtkaWFsb2csIHJlc2l6aW5nXVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGFkZE1vZHVsZTogZnVuY3Rpb24gKG1vZHVsZUFycmF5KSB7XHJcbiAgICAgICAgICAgIGxldCBtb2R1bGVOYW1lID0gJyc7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBtb2R1bGVBcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbW9kdWxlTmFtZSA9IG1vZHVsZUFycmF5W2ldLm5hbWU7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMucGx1Z2luc1ttb2R1bGVOYW1lXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luc1ttb2R1bGVOYW1lXSA9IHV0aWwuY29weU9iaihtb2R1bGVBcnJheVtpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zW21vZHVsZU5hbWVdLmFkZCh0aGlzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBFbmFibGVkIHN1Ym1lbnVcclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBTdWJtZW51IGVsZW1lbnQgdG8gY2FsbFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHN1Ym1lbnVPbjogZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3VibWVudU5hbWUgPSB0aGlzLl9zdWJtZW51TmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWNvbW1hbmQnKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMucGx1Z2luc1tzdWJtZW51TmFtZV0ub24pIHRoaXMucGx1Z2luc1tzdWJtZW51TmFtZV0ub24uY2FsbCh0aGlzKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc3VibWVudSA9IGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nO1xyXG4gICAgICAgICAgICB0aGlzLnN1Ym1lbnUuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgICAgIHV0aWwuYWRkQ2xhc3MoZWxlbWVudCwgJ29uJyk7XHJcbiAgICAgICAgICAgIHRoaXMuc3VibWVudUFjdGl2ZUJ1dHRvbiA9IGVsZW1lbnQ7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBvdmVyTGVmdCA9IHRoaXMuY29udGV4dC5lbGVtZW50LnRvb2xiYXIub2Zmc2V0V2lkdGggLSAoZWxlbWVudC5wYXJlbnRFbGVtZW50Lm9mZnNldExlZnQgKyB0aGlzLnN1Ym1lbnUub2Zmc2V0V2lkdGgpO1xyXG4gICAgICAgICAgICBpZiAob3ZlckxlZnQgPCAwKSB0aGlzLnN1Ym1lbnUuc3R5bGUubGVmdCA9IG92ZXJMZWZ0ICsgJ3B4JztcclxuICAgICAgICAgICAgZWxzZSB0aGlzLnN1Ym1lbnUuc3R5bGUubGVmdCA9ICcxcHgnO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fYmluZGVkU3VibWVudU9mZiA9IHRoaXMuc3VibWVudU9mZi5iaW5kKHRoaXMpO1xyXG4gICAgICAgICAgICBfZC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9iaW5kZWRTdWJtZW51T2ZmLCBmYWxzZSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIERpc2FibGUgc3VibWVudVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHN1Ym1lbnVPZmY6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc3VibWVudSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc3VibWVudU5hbWUgPSAnJztcclxuICAgICAgICAgICAgICAgIHRoaXMuc3VibWVudS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdWJtZW51ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlQ2xhc3ModGhpcy5zdWJtZW51QWN0aXZlQnV0dG9uLCAnb24nKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3VibWVudUFjdGl2ZUJ1dHRvbiA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBfZC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9iaW5kZWRTdWJtZW51T2ZmKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyc09mZigpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBEaXNhYmxlIGNvbnRyb2xsZXIgaW4gZWRpdG9yIGFyZWEgKGxpbmsgYnV0dG9uLCBpbWFnZSByZXNpemUgYnV0dG9uKVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnRyb2xsZXJzT246IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGFyZ3VtZW50c1tpXS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlckFycmF5W2ldID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9iaW5kQ29udHJvbGxlcnNPZmYgPSB0aGlzLmNvbnRyb2xsZXJzT2ZmLmJpbmQodGhpcyk7XHJcbiAgICAgICAgICAgIF9kLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuX2JpbmRDb250cm9sbGVyc09mZiwgZmFsc2UpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBEaXNhYmxlIGNvbnRyb2xsZXIgaW4gZWRpdG9yIGFyZWEgKGxpbmsgYnV0dG9uLCBpbWFnZSByZXNpemUgYnV0dG9uKVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnRyb2xsZXJzT2ZmOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxlbiA9IHRoaXMuY29udHJvbGxlckFycmF5Lmxlbmd0aDtcclxuXHJcbiAgICAgICAgICAgIGlmIChsZW4gPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyQXJyYXlbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJBcnJheSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgX2QucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fYmluZENvbnRyb2xsZXJzT2ZmKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBqYXZhc2NyaXB0IGV4ZWNDb21tYW5kXHJcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGNvbW1hbmQgLSBqYXZhc2NyaXB0IGV4ZWNDb21tYW5kIGZ1bmN0aW9uIHByb3BlcnR5XHJcbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBzaG93RGVmYXVsdFVJIC0gamF2YXNjcmlwdCBleGVjQ29tbWFuZCBmdW5jdGlvbiBwcm9wZXJ0eVxyXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZSAtIGphdmFzY3JpcHQgZXhlY0NvbW1hbmQgZnVuY3Rpb24gcHJvcGVydHlcclxuICAgICAgICAgKi9cclxuICAgICAgICBleGVjQ29tbWFuZDogZnVuY3Rpb24gKGNvbW1hbmQsIHNob3dEZWZhdWx0VUksIHZhbHVlKSB7XHJcbiAgICAgICAgICAgIF9kLmV4ZWNDb21tYW5kKGNvbW1hbmQsIHNob3dEZWZhdWx0VUksIChjb21tYW5kID09PSAnZm9ybWF0QmxvY2snID8gJzwnICsgdmFsdWUgKyAnPicgOiB2YWx1ZSkpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBGb2N1cyB0byB3eXNpd3lnIGFyZWFcclxuICAgICAgICAgKi9cclxuICAgICAgICBmb2N1czogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAoY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICBjb25zdCBjYXB0aW9uID0gdXRpbC5nZXRQYXJlbnRFbGVtZW50KHRoaXMuZ2V0U2VsZWN0aW9uTm9kZSgpLCAnZmlnY2FwdGlvbicpO1xyXG4gICAgICAgICAgICBpZiAoY2FwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgY2FwdGlvbi5mb2N1cygpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuZm9jdXMoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZXZlbnQuX2ZpbmRCdXR0b25FZmZlY3RUYWcoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gU2V0IGN1cnJlbnQgZWRpdG9yJ3MgcmFuZ2Ugb2JqZWN0XHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBzdGFydENvbiAtIFRoZSBzdGFydENvbnRhaW5lciBwcm9wZXJ0eSBvZiB0aGUgc2VsZWN0aW9uIG9iamVjdC5cclxuICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gc3RhcnRPZmYgLSBUaGUgc3RhcnRPZmZzZXQgcHJvcGVydHkgb2YgdGhlIHNlbGVjdGlvbiBvYmplY3QuXHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBlbmRDb24gLSBUaGUgZW5kQ29udGFpbmVyIHByb3BlcnR5IG9mIHRoZSBzZWxlY3Rpb24gb2JqZWN0LlxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZW5kT2ZmIC0gVGhlIGVuZE9mZnNldCBwcm9wZXJ0eSBvZiB0aGUgc2VsZWN0aW9uIG9iamVjdC5cclxuICAgICAgICAgKi9cclxuICAgICAgICBzZXRSYW5nZTogZnVuY3Rpb24gKHN0YXJ0Q29uLCBzdGFydE9mZiwgZW5kQ29uLCBlbmRPZmYpIHtcclxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBfZC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgICAgICAgICByYW5nZS5zZXRTdGFydChzdGFydENvbiwgc3RhcnRPZmYpO1xyXG4gICAgICAgICAgICByYW5nZS5zZXRFbmQoZW5kQ29uLCBlbmRPZmYpO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gX3cuZ2V0U2VsZWN0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcykge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xyXG4gICAgICAgICAgICB0aGlzLl9lZGl0b3JSYW5nZSgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgY3VycmVudCBlZGl0b3IncyByYW5nZSBvYmplY3RcclxuICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGdldFJhbmdlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl92YXJpYWJsZS5fcmFuZ2UgfHwgdGhpcy5fY3JlYXRlRGVmYXVsdFJhbmdlKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEdldCBjdXJyZW50IHNlbGVjdCBub2RlXHJcbiAgICAgICAgICogQHJldHVybnMge05vZGV9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZ2V0U2VsZWN0aW9uTm9kZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFyaWFibGUuX3NlbGVjdGlvbk5vZGUgfHwgY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuZmlyc3RDaGlsZDtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gU2F2aW5nIHRoZSByYW5nZSBvYmplY3QgYW5kIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbm9kZSBvZiBlZGl0b3JcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF9lZGl0b3JSYW5nZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBfdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICAgICAgaWYgKCF1dGlsLmdldFBhcmVudEVsZW1lbnQoc2VsZWN0aW9uLmZvY3VzTm9kZSwgJy5zdW4tZWRpdG9yLWlkLXd5c2l3eWcnKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgbGV0IHJhbmdlID0gbnVsbDtcclxuICAgICAgICAgICAgbGV0IHNlbGVjdGlvbk5vZGUgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJhbmdlID0gdGhpcy5fY3JlYXRlRGVmYXVsdFJhbmdlKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3ZhcmlhYmxlLl9yYW5nZSA9IHJhbmdlO1xyXG5cclxuICAgICAgICAgICAgaWYgKHJhbmdlLmNvbGxhcHNlZCkge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uTm9kZSA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uTm9kZSA9IHNlbGVjdGlvbi5leHRlbnROb2RlIHx8IHNlbGVjdGlvbi5hbmNob3JOb2RlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl92YXJpYWJsZS5fc2VsZWN0aW9uTm9kZSA9IHNlbGVjdGlvbk5vZGU7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFJldHVybiB0aGUgcmFuZ2Ugb2JqZWN0IG9mIGVkaXRvcidzIGZpcnN0IGNoaWxkIG5vZGVcclxuICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX2NyZWF0ZURlZmF1bHRSYW5nZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IF9kLmNyZWF0ZVJhbmdlKCk7XHJcbiAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KGNvbnRleHQuZWxlbWVudC53eXNpd3lnLmZpcnN0Q2hpbGQsIDApO1xyXG4gICAgICAgICAgICByYW5nZS5zZXRFbmQoY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuZmlyc3RDaGlsZCwgMCk7XHJcbiAgICAgICAgICAgIHJldHVybiByYW5nZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyBhIFwiZm9ybWF0RWxlbWVudFwiKFAsIERJViwgSFsxLTZdLCBMSSkgYXJyYXkgZnJvbSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJhbmdlLlxyXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX1cclxuICAgICAgICAgKi9cclxuICAgICAgICBnZXRTZWxlY3RlZEZvcm1hdEVsZW1lbnRzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGxldCByYW5nZSA9IHRoaXMuZ2V0UmFuZ2UoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh1dGlsLmlzV3lzaXd5Z0RpdihyYW5nZS5zdGFydENvbnRhaW5lcikpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuY2hpbGRyZW47XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFJhbmdlKGNoaWxkcmVuWzBdLCAwLCBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXSwgY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0udGV4dENvbnRlbnQubGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgIHJhbmdlID0gdGhpcy5nZXRSYW5nZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzdGFydENvbiA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyO1xyXG4gICAgICAgICAgICBjb25zdCBlbmRDb24gPSByYW5nZS5lbmRDb250YWluZXI7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbW1vbkNvbiA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xyXG4gICAgICAgICAgICBjb25zdCByYW5nZUZvcm1hdEVsZW1lbnRzID0gW107XHJcblxyXG4gICAgICAgICAgICBpZiAoIXV0aWwuaXNXeXNpd3lnRGl2KGNvbW1vbkNvbikgJiYgIXV0aWwuaXNSYW5nZUZvcm1hdEVsZW1lbnQoY29tbW9uQ29uKSkgcmV0dXJuIFt1dGlsLmdldEZvcm1hdEVsZW1lbnQoY29tbW9uQ29uKV07XHJcblxyXG4gICAgICAgICAgICAvLyBnZXQgbGluZSBub2Rlc1xyXG4gICAgICAgICAgICBjb25zdCBsaW5lTm9kZXMgPSB1dGlsLmdldExpc3RDaGlsZHJlbihjb21tb25Db24sIGZ1bmN0aW9uIChjdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdXRpbC5pc0Zvcm1hdEVsZW1lbnQoY3VycmVudCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKHN0YXJ0Q29uID09PSBlbmRDb24pIHJldHVybiBsaW5lTm9kZXNbMF07XHJcblxyXG4gICAgICAgICAgICBsZXQgc3RhcnRMaW5lID0gdXRpbC5nZXRGb3JtYXRFbGVtZW50KHN0YXJ0Q29uKTtcclxuICAgICAgICAgICAgbGV0IGVuZExpbmUgPSB1dGlsLmdldEZvcm1hdEVsZW1lbnQoZW5kQ29uKTtcclxuICAgICAgICAgICAgbGV0IHN0YXJ0SWR4ID0gMDtcclxuICAgICAgICAgICAgbGV0IGVuZElkeCA9IDA7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gbGluZU5vZGVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnRMaW5lID09PSBsaW5lTm9kZXNbaV0pIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGFydElkeCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZW5kTGluZSA9PT0gbGluZU5vZGVzW2ldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5kSWR4ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SWR4OyBpIDw9IGVuZElkeDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICByYW5nZUZvcm1hdEVsZW1lbnRzLnB1c2gobGluZU5vZGVzW2ldKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHJhbmdlRm9ybWF0RWxlbWVudHM7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFJldHVybnMgYSBcInJhbmdlRm9ybWF0RWxlbWVudFwiKGJsb2NrcXVvdGUsIFRBQkxFLCBUUiwgVEQsIE9MLCBVTCwgUFJFKSBhcnJheSBmcm9tIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcmFuZ2UuXHJcbiAgICAgICAgICogQHJldHVybnMge0FycmF5fVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGdldFNlbGVjdGVkUmFuZ2VGb3JtYXRFbGVtZW50czogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBsZXQgcmFuZ2UgPSB0aGlzLmdldFJhbmdlKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodXRpbC5pc1d5c2l3eWdEaXYocmFuZ2Uuc3RhcnRDb250YWluZXIpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGNvbnRleHQuZWxlbWVudC53eXNpd3lnLmNoaWxkcmVuO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRSYW5nZShjaGlsZHJlblswXSwgMCwgY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0sIGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdLnRleHRDb250ZW50Lmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICByYW5nZSA9IHRoaXMuZ2V0UmFuZ2UoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3Qgc3RhcnRDb24gPSByYW5nZS5zdGFydENvbnRhaW5lcjtcclxuICAgICAgICAgICAgY29uc3QgZW5kQ29uID0gcmFuZ2UuZW5kQ29udGFpbmVyO1xyXG4gICAgICAgICAgICBjb25zdCBjb21tb25Db24gPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcclxuICAgICAgICAgICAgY29uc3QgcmFuZ2VGb3JtYXRFbGVtZW50cyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgaWYgKHV0aWwuaXNSYW5nZUZvcm1hdEVsZW1lbnQoY29tbW9uQ29uKSkgcmV0dXJuIFtjb21tb25Db25dO1xyXG4gICAgICAgICAgICBpZiAoIXV0aWwuaXNXeXNpd3lnRGl2KGNvbW1vbkNvbikpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gdXRpbC5nZXRSYW5nZUZvcm1hdEVsZW1lbnQoY29tbW9uQ29uKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbCA/IFtlbF0gOiBbXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gZ2V0IHJhbmdlIEVsZW1lbnRzXHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlRWxlbWVudHMgPSB1dGlsLmdldExpc3RDaGlsZHJlbihjb21tb25Db24sIGZ1bmN0aW9uIChjdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdXRpbC5pc1JhbmdlRm9ybWF0RWxlbWVudChjdXJyZW50KTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc3RhcnRDb24gPT09IGVuZENvbikgcmV0dXJuIHJhbmdlRWxlbWVudHNbMF07XHJcblxyXG4gICAgICAgICAgICBsZXQgc3RhcnRMaW5lID0gdXRpbC5nZXRSYW5nZUZvcm1hdEVsZW1lbnQoc3RhcnRDb24pO1xyXG4gICAgICAgICAgICBsZXQgZW5kTGluZSA9IHV0aWwuZ2V0UmFuZ2VGb3JtYXRFbGVtZW50KGVuZENvbik7XHJcbiAgICAgICAgICAgIGxldCBzdGFydElkeCA9IDA7XHJcbiAgICAgICAgICAgIGxldCBlbmRJZHggPSAwO1xyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHJhbmdlRWxlbWVudHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChzdGFydExpbmUgPT09IHJhbmdlRWxlbWVudHNbaV0pIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGFydElkeCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZW5kTGluZSA9PT0gcmFuZ2VFbGVtZW50c1tpXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuZElkeCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBzdGFydElkeDsgaSA8PSBlbmRJZHg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJhbmdlRWxlbWVudHNbaV0pIHJhbmdlRm9ybWF0RWxlbWVudHMucHVzaChyYW5nZUVsZW1lbnRzW2ldKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHJhbmdlRm9ybWF0RWxlbWVudHM7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIERldGVybWluZSBpZiB0aGlzIG9mZnNldCBpcyB0aGUgZWRnZSBvZmZzZXQgb2YgY29udGFpbmVyXHJcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbnRhaW5lciAtIFRoZSBjb250YWluZXIgcHJvcGVydHkgb2YgdGhlIHNlbGVjdGlvbiBvYmplY3QuXHJcbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCAtIFRoZSBvZmZzZXQgcHJvcGVydHkgb2YgdGhlIHNlbGVjdGlvbiBvYmplY3QuXHJcbiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaXNFZGdlUG9pbnQ6IGZ1bmN0aW9uIChjb250YWluZXIsIG9mZnNldCkge1xyXG4gICAgICAgICAgICByZXR1cm4gKG9mZnNldCA9PT0gMCkgfHwgKG9mZnNldCA9PT0gY29udGFpbmVyLm5vZGVWYWx1ZS5sZW5ndGgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBTaG93IGxvYWRpbmcgYm94XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc2hvd0xvYWRpbmc6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LmxvYWRpbmcuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIENsb3NlIGxvYWRpbmcgYm94XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY2xvc2VMb2FkaW5nOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5sb2FkaW5nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEFwcGVuZCBmb3JtYXQgZWxlbWVudCB0byBzaWJsaW5nIG5vZGUgb2YgYXJndW1lbnQgZWxlbWVudC5cclxuICAgICAgICAgKiBJZiB0aGUgXCJmb3JtYXROb2RlTmFtZVwiIGFyZ3VtZW50IHZhbHVlIGlzIHByZXNlbnQsIHRoZSB0YWcgb2YgdGhhdCBhcmd1bWVudCB2YWx1ZSBpcyBpbnNlcnRlZCxcclxuICAgICAgICAgKiBJZiBub3QsIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZm9ybWF0IHRhZyBpcyBpbnNlcnRlZC5cclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBJbnNlcnQgYXMgc2libGluZ3Mgb2YgdGhhdCBlbGVtZW50XHJcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd8bnVsbH0gZm9ybWF0Tm9kZU5hbWUgLSBOb2RlIG5hbWUgdG8gYmUgaW5zZXJ0ZWRcclxuICAgICAgICAgKiBAcmV0dXJucyB7RWxlbWVudH1cclxuICAgICAgICAgKi9cclxuICAgICAgICBhcHBlbmRGb3JtYXRUYWc6IGZ1bmN0aW9uIChlbGVtZW50LCBmb3JtYXROb2RlTmFtZSkge1xyXG4gICAgICAgICAgICBjb25zdCBmb3JtYXRFbCA9IHV0aWwuZ2V0UmFuZ2VGb3JtYXRFbGVtZW50KGVsZW1lbnQpIHx8IHV0aWwuZ2V0Rm9ybWF0RWxlbWVudChlbGVtZW50KTtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudEZvcm1hdEVsID0gdXRpbC5nZXRGb3JtYXRFbGVtZW50KHRoaXMuZ2V0U2VsZWN0aW9uTm9kZSgpKTtcclxuICAgICAgICAgICAgY29uc3Qgb0Zvcm1hdE5hbWUgPSBmb3JtYXROb2RlTmFtZSA/IGZvcm1hdE5vZGVOYW1lIDogdXRpbC5pc0Zvcm1hdEVsZW1lbnQoY3VycmVudEZvcm1hdEVsKSA/IGN1cnJlbnRGb3JtYXRFbC5ub2RlTmFtZSA6ICdQJztcclxuICAgICAgICAgICAgY29uc3Qgb0Zvcm1hdCA9IHV0aWwuY3JlYXRlRWxlbWVudChvRm9ybWF0TmFtZSk7XHJcbiAgICAgICAgICAgIG9Gb3JtYXQuaW5uZXJIVE1MID0gdXRpbC56ZXJvV2lkdGhTcGFjZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh1dGlsLmlzQ2VsbChmb3JtYXRFbCkpIGZvcm1hdEVsLmluc2VydEJlZm9yZShvRm9ybWF0LCBlbGVtZW50Lm5leHRFbGVtZW50U2libGluZyk7XHJcbiAgICAgICAgICAgIGVsc2UgZm9ybWF0RWwucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUob0Zvcm1hdCwgZm9ybWF0RWwubmV4dEVsZW1lbnRTaWJsaW5nKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBvRm9ybWF0O1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBEZWxldGUgc2VsZWN0ZWQgbm9kZSBhbmQgaW5zZXJ0IGFyZ3VtZW50IHZhbHVlIG5vZGVcclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG9Ob2RlIC0gTm9kZSB0byBiZSBpbnNlcnRlZFxyXG4gICAgICAgICAqIEBwYXJhbSB7KEVsZW1lbnR8bnVsbCl9IHJpZ2h0Tm9kZSAtIElmIHRoZSBub2RlIGV4aXN0cywgaXQgaXMgaW5zZXJ0ZWQgYWZ0ZXIgdGhlIG5vZGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBpbnNlcnROb2RlOiBmdW5jdGlvbiAob05vZGUsIHJpZ2h0Tm9kZSkge1xyXG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IHRoaXMuZ2V0UmFuZ2UoKTtcclxuICAgICAgICAgICAgbGV0IHBhcmVudE5vZGUgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFyaWdodE5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0Q29uID0gcmFuZ2Uuc3RhcnRDb250YWluZXI7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydE9mZiA9IHJhbmdlLnN0YXJ0T2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZW5kQ29uID0gcmFuZ2UuZW5kQ29udGFpbmVyO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZW5kT2ZmID0gcmFuZ2UuZW5kT2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29tbW9uQ29uID0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XHJcblxyXG4gICAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9IHN0YXJ0Q29uO1xyXG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0Q29uLm5vZGVUeXBlID09PSAzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9IHN0YXJ0Q29uLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLyoqIE5vIFNlbGVjdCByYW5nZSBub2RlICovXHJcbiAgICAgICAgICAgICAgICBpZiAocmFuZ2UuY29sbGFwc2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1vbkNvbi5ub2RlVHlwZSA9PT0gMykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByaWdodE5vZGUgPSBjb21tb25Db24uc3BsaXRUZXh0KGVuZE9mZik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50Tm9kZS5sYXN0Q2hpbGQgIT09IG51bGwgJiYgdXRpbC5pc0JyZWFrKHBhcmVudE5vZGUubGFzdENoaWxkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5yZW1vdmVDaGlsZChwYXJlbnROb2RlLmxhc3RDaGlsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHROb2RlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvKiogU2VsZWN0IHJhbmdlIG5vZGVzICovXHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1NhbWVDb250YWluZXIgPSBzdGFydENvbiA9PT0gZW5kQ29uO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNTYW1lQ29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzRWRnZVBvaW50KGVuZENvbiwgZW5kT2ZmKSkgcmlnaHROb2RlID0gZW5kQ29uLm5leHRTaWJsaW5nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHJpZ2h0Tm9kZSA9IGVuZENvbi5zcGxpdFRleHQoZW5kT2ZmKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZW1vdmVOb2RlID0gc3RhcnRDb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0VkZ2VQb2ludChzdGFydENvbiwgc3RhcnRPZmYpKSByZW1vdmVOb2RlID0gc3RhcnRDb24uc3BsaXRUZXh0KHN0YXJ0T2ZmKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocmVtb3ZlTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZU5vZGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9IGNvbW1vbkNvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHROb2RlID0gZW5kQ29uO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJpZ2h0Tm9kZS5wYXJlbnROb2RlICE9PSBjb21tb25Db24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0Tm9kZSA9IHJpZ2h0Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9IHJpZ2h0Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgcmlnaHROb2RlID0gcmlnaHROb2RlLm5leHRTaWJsaW5nO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUob05vZGUsIHJpZ2h0Tm9kZSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQob05vZGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIERlbGV0ZSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG5vZGVcclxuICAgICAgICAgKi9cclxuICAgICAgICByZW1vdmVOb2RlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5nZXRSYW5nZSgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHJhbmdlLmRlbGV0ZUNvbnRlbnRzKSB7XHJcbiAgICAgICAgICAgICAgICByYW5nZS5kZWxldGVDb250ZW50cygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzdGFydENvbiA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyO1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydE9mZiA9IHJhbmdlLnN0YXJ0T2Zmc2V0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmRDb24gPSByYW5nZS5lbmRDb250YWluZXI7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZE9mZiA9IHJhbmdlLmVuZE9mZnNldDtcclxuICAgICAgICAgICAgY29uc3QgY29tbW9uQ29uID0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XHJcblxyXG4gICAgICAgICAgICBsZXQgYmVmb3JlTm9kZSA9IG51bGw7XHJcbiAgICAgICAgICAgIGxldCBhZnRlck5vZGUgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlcyA9IHV0aWwuZ2V0TGlzdENoaWxkTm9kZXMoY29tbW9uQ29uKTtcclxuICAgICAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSB1dGlsLmdldEFycmF5SW5kZXgoY2hpbGROb2Rlcywgc3RhcnRDb24pO1xyXG4gICAgICAgICAgICBsZXQgZW5kSW5kZXggPSB1dGlsLmdldEFycmF5SW5kZXgoY2hpbGROb2RlcywgZW5kQ29uKTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4ICsgMSwgc3RhcnROb2RlID0gc3RhcnRDb247IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGROb2Rlc1tpXSA9PT0gc3RhcnROb2RlLnBhcmVudE5vZGUgJiYgY2hpbGROb2Rlc1tpXS5maXJzdENoaWxkID09PSBzdGFydE5vZGUgJiYgc3RhcnRPZmYgPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICBzdGFydE5vZGUgPSBzdGFydE5vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGVuZEluZGV4IC0gMSwgZW5kTm9kZSA9IGVuZENvbjsgaSA+IHN0YXJ0SW5kZXg7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkTm9kZXNbaV0gPT09IGVuZE5vZGUucGFyZW50Tm9kZSAmJiBjaGlsZE5vZGVzW2ldLm5vZGVUeXBlID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hpbGROb2Rlcy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5kTm9kZSA9IGVuZE5vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAtLWVuZEluZGV4O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleDsgaSA8PSBlbmRJbmRleDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gY2hpbGROb2Rlc1tpXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5sZW5ndGggPT09IDAgfHwgKGl0ZW0ubm9kZVR5cGUgPT09IDMgJiYgaXRlbS5kYXRhID09PSB1bmRlZmluZWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVJdGVtKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpdGVtID09PSBzdGFydENvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFydENvbi5ub2RlVHlwZSA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmVOb2RlID0gdXRpbC5jcmVhdGVUZXh0Tm9kZShzdGFydENvbi50ZXh0Q29udGVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlTm9kZSA9IHV0aWwuY3JlYXRlVGV4dE5vZGUoc3RhcnRDb24uc3Vic3RyaW5nRGF0YSgwLCBzdGFydE9mZikpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJlZm9yZU5vZGUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydENvbi5kYXRhID0gYmVmb3JlTm9kZS5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlSXRlbShzdGFydENvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PT0gZW5kQ29uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVuZENvbi5ub2RlVHlwZSA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhZnRlck5vZGUgPSB1dGlsLmNyZWF0ZVRleHROb2RlKGVuZENvbi50ZXh0Q29udGVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJOb2RlID0gdXRpbC5jcmVhdGVUZXh0Tm9kZShlbmRDb24uc3Vic3RyaW5nRGF0YShlbmRPZmYsIChlbmRDb24ubGVuZ3RoIC0gZW5kT2ZmKSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFmdGVyTm9kZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZENvbi5kYXRhID0gYWZ0ZXJOb2RlLmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVJdGVtKGVuZENvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUl0ZW0oaXRlbSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gYXBwZW5kZWQgYWxsIHNlbGVjdGVkIGZvcm1hdCBFbGVtZW50IHRvIHRoZSBhcmd1bWVudCBlbGVtZW50IGFuZCBpbnNlcnRcclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHdyYXBUYWcgLSBFbGVtZW50IG9mIHdyYXAgdGhlIGFyZ3VtZW50c1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHdyYXBUb1RhZ3M6IGZ1bmN0aW9uICh3cmFwVGFnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5nZXRSYW5nZSgpO1xyXG4gICAgICAgICAgICBjb25zdCByYW5nZUxpbmVzID0gdGhpcy5nZXRTZWxlY3RlZEZvcm1hdEVsZW1lbnRzKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXJhbmdlTGluZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlubmVyID0gdXRpbC5jcmVhdGVFbGVtZW50KHV0aWwuaXNDZWxsKHRoaXMuZ2V0U2VsZWN0aW9uTm9kZSgpKSA/ICdESVYnIDogJ1AnKTtcclxuICAgICAgICAgICAgICAgIGlubmVyLmlubmVySFRNTCA9IHV0aWwuemVyb1dpZHRoU3BhY2U7XHJcbiAgICAgICAgICAgICAgICB3cmFwVGFnLmFwcGVuZENoaWxkKGlubmVyKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0U2VsZWN0aW9uTm9kZSgpLmFwcGVuZENoaWxkKHdyYXBUYWcpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgbGFzdCAgPSByYW5nZUxpbmVzW3JhbmdlTGluZXMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgIGxldCBzdGFuZFRhZywgYmVmb3JlVGFnLCBwRWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgIGlmICh1dGlsLmlzUmFuZ2VGb3JtYXRFbGVtZW50KGxhc3QpIHx8IHV0aWwuaXNGb3JtYXRFbGVtZW50KGxhc3QpKSB7XHJcbiAgICAgICAgICAgICAgICBzdGFuZFRhZyA9IGxhc3Q7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzdGFuZFRhZyA9IHV0aWwuZ2V0UmFuZ2VGb3JtYXRFbGVtZW50KGxhc3QpIHx8IHV0aWwuZ2V0Rm9ybWF0RWxlbWVudChsYXN0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHV0aWwuaXNDZWxsKHN0YW5kVGFnKSkge1xyXG4gICAgICAgICAgICAgICAgYmVmb3JlVGFnID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIHBFbGVtZW50ID0gc3RhbmRUYWc7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBiZWZvcmVUYWcgPSBzdGFuZFRhZy5uZXh0U2libGluZztcclxuICAgICAgICAgICAgICAgIHBFbGVtZW50ID0gc3RhbmRUYWcucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGxpc3RQYXJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICBsZXQgbGluZSA9IG51bGw7XHJcbiAgICAgICAgICAgIGxldCBwcmV2Tm9kZU5hbWUgPSAnJztcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSByYW5nZUxpbmVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsaW5lID0gcmFuZ2VMaW5lc1tpXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoL15MSSQvaS50ZXN0KGxpbmUubm9kZU5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RQYXJlbnQgPT09IG51bGwgfHwgIS9eTEkkL2kudGVzdChwcmV2Tm9kZU5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RQYXJlbnQgPSB1dGlsLmNyZWF0ZUVsZW1lbnQobGluZS5wYXJlbnROb2RlLm5vZGVOYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxpc3RQYXJlbnQuYXBwZW5kQ2hpbGQobGluZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IGxlbiAtIDEgfHwgIS9eTEkkL2kudGVzdChyYW5nZUxpbmVzW2kgKyAxXS5ub2RlTmFtZSkpIHdyYXBUYWcuYXBwZW5kQ2hpbGQobGlzdFBhcmVudCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB3cmFwVGFnLmFwcGVuZENoaWxkKGxpbmUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHByZXZOb2RlTmFtZSA9IGxpbmUubm9kZU5hbWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHBFbGVtZW50Lmluc2VydEJlZm9yZSh3cmFwVGFnLCBiZWZvcmVUYWcpO1xyXG4gICAgICAgICAgICBpZiAoIXJhbmdlLmNvbGxhcHNlZCAmJiAodXRpbC5pc1JhbmdlRm9ybWF0RWxlbWVudChyYW5nZS5zdGFydENvbnRhaW5lcikgfHwgdXRpbC5pc1JhbmdlRm9ybWF0RWxlbWVudChyYW5nZS5lbmRDb250YWluZXIpKSkgdXRpbC5yZW1vdmVFbXB0eU5vZGUocEVsZW1lbnQpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBBZGQgdGhlIG5vZGUgcmVjZWl2ZWQgYXMgYW4gYXJndW1lbnQgdmFsdWUgdG8gdGhlIHNlbGVjdGVkIGFyZWEuXHJcbiAgICAgICAgICogMS4gV2hlbiB0aGVyZSBpcyB0aGUgc2FtZSBjc3MgdmFsdWUgbm9kZSBpbiB0aGUgc2VsZWN0aW9uIGFyZWEsIHRoZSB0YWcgaXMgc3RyaXBwZWQuXHJcbiAgICAgICAgICogMi4gSWYgdGhlcmUgaXMgYW5vdGhlciBjc3MgdmFsdWUgb3RoZXIgdGhhbkNzcyBhdHRyaWJ1dGUgdmFsdWVzIHJlY2VpdmVkIGFzIGFyZ3VtZW50cyBvbiB0aGUgbm9kZSwgcmVtb3ZlZCBvbmx5IENzcyBhdHRyaWJ1dGUgdmFsdWVzIHJlY2VpdmVkIGFzIGFyZ3VtZW50c1xyXG4gICAgICAgICAqIDMuIElmIHlvdSBwYXNzIGFuIGVsZW1lbnQgd2hvc2Ugbm9kZSBuYW1lIGlzIFwicmVtb3Zlbm9kZVwiIGFzIGFuIGFyZ3VtZW50IHZhbHVlLCBpdCBwZXJmb3JtcyBhIHR5cGUgcmVtb3ZhbCBvcGVyYXRpb24uIGV4KSBub2RlQ2hhbmdlKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3JlbW92ZW5vZGUnKSlcclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGFwcGVuZE5vZGUgLSBUaGUgZG9tIHRoYXQgd2lsbCB3cmFwIHRoZSBzZWxlY3RlZCB0ZXh0IGFyZWFcclxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBjaGVja0NTU1Byb3BlcnR5QXJyYXkgLSBUaGUgY3NzIGF0dHJpYnV0ZSBuYW1lIEFycmF5IHRvIGNoZWNrIChbJ2ZvbnQtc2l6ZSddLCBbJ2ZvbnQtZmFtaWx5JywgJ2JhY2tncm91bmQtY29sb3InLCAnYm9yZGVyJ10uLi5dKVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIG5vZGVDaGFuZ2U6IGZ1bmN0aW9uIChhcHBlbmROb2RlLCBjaGVja0NTU1Byb3BlcnR5QXJyYXkpIHtcclxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLmdldFJhbmdlKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzUmVtb3ZlRm9ybWF0ID0gL3JlbW92ZW5vZGUvaS50ZXN0KGFwcGVuZE5vZGUubm9kZU5hbWUpO1xyXG4gICAgICAgICAgICBsZXQgdGVtcENvbiwgdGVtcE9mZnNldCwgdGVtcENoaWxkLCB0ZW1wQXJyYXk7XHJcblxyXG4gICAgICAgICAgICAvKiBjaGVja2VkIHNhbWUgc3R5bGUgcHJvcGVydHkgKi9cclxuICAgICAgICAgICAgaWYgKHJhbmdlLnN0YXJ0Q29udGFpbmVyID09PSByYW5nZS5lbmRDb250YWluZXIpIHtcclxuICAgICAgICAgICAgICAgIGxldCBzTm9kZSA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzUmVtb3ZlRm9ybWF0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHV0aWwuZ2V0Rm9ybWF0RWxlbWVudChzTm9kZSkgPT09IHNOb2RlLnBhcmVudE5vZGUpIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNoZWNrQ250ID0gMDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGVja0NTU1Byb3BlcnR5QXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoIXV0aWwuaXNGb3JtYXRFbGVtZW50KHNOb2RlKSAmJiAhdXRpbC5pc1d5c2l3eWdEaXYoc05vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc05vZGUubm9kZVR5cGUgPT09IDEgJiYgc05vZGUuc3R5bGVbY2hlY2tDU1NQcm9wZXJ0eUFycmF5W2ldXSA9PT0gYXBwZW5kTm9kZS5zdHlsZVtjaGVja0NTU1Byb3BlcnR5QXJyYXlbaV1dKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tDbnQrKztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNOb2RlID0gc05vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0NudCA+PSBjaGVja0NTU1Byb3BlcnR5QXJyYXkubGVuZ3RoKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8qIGZpbmQgdGV4dCBub2RlICovXHJcbiAgICAgICAgICAgIC8vIHN0YXJ0Q29udGFpbmVyXHJcbiAgICAgICAgICAgIHRlbXBDb24gPSB1dGlsLmlzV3lzaXd5Z0RpdihyYW5nZS5zdGFydENvbnRhaW5lcikgPyBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5maXJzdENoaWxkIDogcmFuZ2Uuc3RhcnRDb250YWluZXI7XHJcbiAgICAgICAgICAgIHRlbXBPZmZzZXQgPSByYW5nZS5zdGFydE9mZnNldDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0ZW1wQ29uLm5vZGVUeXBlID09PSAxICYmIHRlbXBDb24uY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAodGVtcENvbiAmJiAhdXRpbC5pc0JyZWFrKHRlbXBDb24pICYmIHRlbXBDb24ubm9kZVR5cGUgPT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0ZW1wQXJyYXkgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICB0ZW1wQ2hpbGQgPSB0ZW1wQ29uLmNoaWxkTm9kZXM7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRlbXBDaGlsZC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wQXJyYXkucHVzaCh0ZW1wQ2hpbGRbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0ZW1wQ29uID0gdGVtcEFycmF5W3RlbXBPZmZzZXRdIHx8IHRlbXBDb24ubmV4dEVsZW1lbnRTaWJsaW5nIHx8IHRlbXBDb24ubmV4dFNpYmxpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcE9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHV0aWwuaXNCcmVhayh0ZW1wQ29uKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVtcHR5VGV4dCA9IHV0aWwuY3JlYXRlVGV4dE5vZGUodXRpbC56ZXJvV2lkdGhTcGFjZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcENvbi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlbXB0eVRleHQsIHRlbXBDb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBDb24gPSBlbXB0eVRleHQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0Q29uID0gdGVtcENvbjtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnRPZmYgPSB0ZW1wT2Zmc2V0O1xyXG5cclxuICAgICAgICAgICAgLy8gZW5kQ29udGFpbmVyXHJcbiAgICAgICAgICAgIHRlbXBDb24gPSB1dGlsLmlzV3lzaXd5Z0RpdihyYW5nZS5lbmRDb250YWluZXIpID8gY29udGV4dC5lbGVtZW50Lnd5c2l3eWcubGFzdENoaWxkIDogcmFuZ2UuZW5kQ29udGFpbmVyO1xyXG4gICAgICAgICAgICB0ZW1wT2Zmc2V0ID0gcmFuZ2UuZW5kT2Zmc2V0O1xyXG5cclxuICAgICAgICAgICAgaWYgKHRlbXBDb24ubm9kZVR5cGUgPT09IDEgJiYgdGVtcENvbi5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHdoaWxlICh0ZW1wQ29uICYmICF1dGlsLmlzQnJlYWsodGVtcENvbikgJiYgdGVtcENvbi5ub2RlVHlwZSA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBBcnJheSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBDaGlsZCA9IHRlbXBDb24uY2hpbGROb2RlcztcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdGVtcENoaWxkLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBBcnJheS5wdXNoKHRlbXBDaGlsZFtpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBDb24gPSB0ZW1wQXJyYXlbdGVtcE9mZnNldCAtIDFdIHx8ICEvRklHVVJFL2kudGVzdCh0ZW1wQXJyYXlbMF0ubm9kZU5hbWUpID8gdGVtcEFycmF5WzBdIDogKHRlbXBDb24ucHJldmlvdXNFbGVtZW50U2libGluZyB8fCB0ZW1wQ29uLnByZXZpb3VzU2libGluZyB8fCBzdGFydENvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0ZW1wT2Zmc2V0ID0gdGVtcENvbi50ZXh0Q29udGVudC5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHV0aWwuaXNCcmVhayh0ZW1wQ29uKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVtcHR5VGV4dCA9IHV0aWwuY3JlYXRlVGV4dE5vZGUodXRpbC56ZXJvV2lkdGhTcGFjZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcENvbi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlbXB0eVRleHQsIHRlbXBDb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBDb24gPSBlbXB0eVRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcE9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGVuZENvbiA9IHRlbXBDb247XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZE9mZiA9IHRlbXBPZmZzZXQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbW1vbkNvbiA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xyXG4gICAgICAgICAgICBjb25zdCBuZXdOb2RlTmFtZSA9IGFwcGVuZE5vZGUubm9kZU5hbWU7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0UmFuZ2Uoc3RhcnRDb24sIHN0YXJ0T2ZmLCBlbmRDb24sIGVuZE9mZik7XHJcblxyXG4gICAgICAgICAgICBsZXQgc3RhcnQgPSB7fSwgZW5kID0ge307XHJcbiAgICAgICAgICAgIGxldCBuZXdOb2RlLCByZWdFeHA7XHJcblxyXG4gICAgICAgICAgICBpZiAoY2hlY2tDU1NQcm9wZXJ0eUFycmF5KSB7XHJcbiAgICAgICAgICAgICAgICByZWdFeHAgPSAnKD86O3xefFxcXFxzKSg/OicgKyBjaGVja0NTU1Byb3BlcnR5QXJyYXlbMF07XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGNoZWNrQ1NTUHJvcGVydHlBcnJheS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlZ0V4cCArPSAnfCcgKyBjaGVja0NTU1Byb3BlcnR5QXJyYXlbaV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZWdFeHAgKz0gJylcXFxccyo6W147XSpcXFxccyooPzo7fCQpJztcclxuICAgICAgICAgICAgICAgIHJlZ0V4cCA9IG5ldyBSZWdFeHAocmVnRXhwLCAnaWcnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyoqIHRhZyBjaGVjayBmdW5jdGlvbiovXHJcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrQ3NzID0gZnVuY3Rpb24gKHZOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNSZW1vdmVGb3JtYXQgfHwgdk5vZGUubm9kZVR5cGUgPT09IDMgfHwgdXRpbC5pc0JyZWFrKHZOb2RlKSkgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHN0eWxlID0gJyc7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVnRXhwICYmIHZOb2RlLnN0eWxlLmNzc1RleHQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlID0gdk5vZGUuc3R5bGUuY3NzVGV4dC5yZXBsYWNlKHJlZ0V4cCwgJycpLnRyaW0oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc3R5bGUubGVuZ3RoID4gMCB8fCB2Tm9kZS5ub2RlTmFtZSAhPT0gbmV3Tm9kZU5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodk5vZGUuc3R5bGUuY3NzVGV4dC5sZW5ndGggPiAwKSB2Tm9kZS5zdHlsZS5jc3NUZXh0ID0gc3R5bGU7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgLyoqIG9uZSBsaW5lICovXHJcbiAgICAgICAgICAgIGlmICghdXRpbC5pc1d5c2l3eWdEaXYoY29tbW9uQ29uKSAmJiAhdXRpbC5pc1JhbmdlRm9ybWF0RWxlbWVudChjb21tb25Db24pKSB7XHJcbiAgICAgICAgICAgICAgICBuZXdOb2RlID0gYXBwZW5kTm9kZS5jbG9uZU5vZGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3UmFuZ2UgPSB0aGlzLl9ub2RlQ2hhbmdlX29uZUxpbmUodXRpbC5nZXRGb3JtYXRFbGVtZW50KGNvbW1vbkNvbiksIG5ld05vZGUsIGNoZWNrQ3NzLCBzdGFydENvbiwgc3RhcnRPZmYsIGVuZENvbiwgZW5kT2ZmLCBpc1JlbW92ZUZvcm1hdCwgcmFuZ2UuY29sbGFwc2VkKTtcclxuXHJcbiAgICAgICAgICAgICAgICBzdGFydC5jb250YWluZXIgPSBuZXdSYW5nZS5zdGFydENvbnRhaW5lcjtcclxuICAgICAgICAgICAgICAgIHN0YXJ0Lm9mZnNldCA9IG5ld1JhbmdlLnN0YXJ0T2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgZW5kLmNvbnRhaW5lciA9IG5ld1JhbmdlLmVuZENvbnRhaW5lcjtcclxuICAgICAgICAgICAgICAgIGVuZC5vZmZzZXQgPSBuZXdSYW5nZS5lbmRPZmZzZXQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLyoqIG11bHRpIGxpbmUgKi9cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBnZXQgbGluZSBub2Rlc1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGluZU5vZGVzID0gdGhpcy5nZXRTZWxlY3RlZEZvcm1hdEVsZW1lbnRzKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbmRMZW5ndGggPSBsaW5lTm9kZXMubGVuZ3RoIC0gMTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBzdGFydENvblxyXG4gICAgICAgICAgICAgICAgbmV3Tm9kZSA9IGFwcGVuZE5vZGUuY2xvbmVOb2RlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHN0YXJ0ID0gdGhpcy5fbm9kZUNoYW5nZV9zdGFydExpbmUobGluZU5vZGVzWzBdLCBuZXdOb2RlLCBjaGVja0Nzcywgc3RhcnRDb24sIHN0YXJ0T2ZmLCBpc1JlbW92ZUZvcm1hdCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gbWlkXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGVuZExlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IGFwcGVuZE5vZGUuY2xvbmVOb2RlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub2RlQ2hhbmdlX21pZGRsZUxpbmUobGluZU5vZGVzW2ldLCBuZXdOb2RlLCBjaGVja0NzcywgaXNSZW1vdmVGb3JtYXQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIGVuZENvblxyXG4gICAgICAgICAgICAgICAgaWYgKGVuZExlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gYXBwZW5kTm9kZS5jbG9uZU5vZGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGVuZCA9IHRoaXMuX25vZGVDaGFuZ2VfZW5kTGluZShsaW5lTm9kZXNbZW5kTGVuZ3RoXSwgbmV3Tm9kZSwgY2hlY2tDc3MsIGVuZENvbiwgZW5kT2ZmLCBpc1JlbW92ZUZvcm1hdCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuZCA9IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBzZXQgcmFuZ2VcclxuICAgICAgICAgICAgdGhpcy5zZXRSYW5nZShzdGFydC5jb250YWluZXIsIHN0YXJ0Lm9mZnNldCwgZW5kLmNvbnRhaW5lciwgZW5kLm9mZnNldCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIHdyYXBzIHRleHQgbm9kZXMgb2YgbGluZSBzZWxlY3RlZCB0ZXh0LlxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIFRoZSBub2RlIG9mIHRoZSBsaW5lIHRoYXQgY29udGFpbnMgdGhlIHNlbGVjdGVkIHRleHQgbm9kZS5cclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5ld0lubmVyTm9kZSAtIFRoZSBkb20gdGhhdCB3aWxsIHdyYXAgdGhlIHNlbGVjdGVkIHRleHQgYXJlYVxyXG4gICAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IHZhbGlkYXRpb24gLSBDaGVjayBpZiB0aGUgbm9kZSBzaG91bGQgYmUgc3RyaXBwZWQuXHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBzdGFydENvbiAtIFRoZSBzdGFydENvbnRhaW5lciBwcm9wZXJ0eSBvZiB0aGUgc2VsZWN0aW9uIG9iamVjdC5cclxuICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gc3RhcnRPZmYgLSBUaGUgc3RhcnRPZmZzZXQgcHJvcGVydHkgb2YgdGhlIHNlbGVjdGlvbiBvYmplY3QuXHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBlbmRDb24gLSBUaGUgZW5kQ29udGFpbmVyIHByb3BlcnR5IG9mIHRoZSBzZWxlY3Rpb24gb2JqZWN0LlxyXG4gICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBlbmRPZmYgLSBUaGUgZW5kT2Zmc2V0IHByb3BlcnR5IG9mIHRoZSBzZWxlY3Rpb24gb2JqZWN0LlxyXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNSZW1vdmVGb3JtYXQgLSBJcyB0aGUgcmVtb3ZlIGZvcm1hdCBjb21tYW5kID9cclxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGNvbGxhcHNlZCAtIHJhbmdlLmNvbGxhcHNlZFxyXG4gICAgICAgICAqIEByZXR1cm5zIHt7c3RhcnRDb250YWluZXI6ICosIHN0YXJ0T2Zmc2V0OiAqLCBlbmRDb250YWluZXI6ICosIGVuZE9mZnNldDogKn19XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfbm9kZUNoYW5nZV9vbmVMaW5lOiBmdW5jdGlvbiAoZWxlbWVudCwgbmV3SW5uZXJOb2RlLCB2YWxpZGF0aW9uLCBzdGFydENvbiwgc3RhcnRPZmYsIGVuZENvbiwgZW5kT2ZmLCBpc1JlbW92ZUZvcm1hdCwgY29sbGFwc2VkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsID0gZWxlbWVudDtcclxuICAgICAgICAgICAgY29uc3QgcE5vZGUgPSBlbGVtZW50LmNsb25lTm9kZShmYWxzZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzU2FtZU5vZGUgPSBzdGFydENvbiA9PT0gZW5kQ29uO1xyXG4gICAgICAgICAgICBsZXQgc3RhcnRDb250YWluZXIgPSBzdGFydENvbjtcclxuICAgICAgICAgICAgbGV0IHN0YXJ0T2Zmc2V0ID0gc3RhcnRPZmY7XHJcbiAgICAgICAgICAgIGxldCBlbmRDb250YWluZXIgPSBlbmRDb247XHJcbiAgICAgICAgICAgIGxldCBlbmRPZmZzZXQgPSBlbmRPZmY7XHJcbiAgICAgICAgICAgIGxldCBzdGFydFBhc3MgPSBmYWxzZTtcclxuICAgICAgICAgICAgbGV0IGVuZFBhc3MgPSBmYWxzZTtcclxuICAgICAgICAgICAgbGV0IHBDdXJyZW50LCBuZXdOb2RlLCBhcHBlbmROb2RlLCBjc3NUZXh0O1xyXG5cclxuICAgICAgICAgICAgZnVuY3Rpb24gY2hlY2tDc3MgKHZOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZWdFeHAgPSBuZXcgUmVnRXhwKCcoPzo7fF58XFxcXHMpKD86JyArIGNzc1RleHQgKyAnbnVsbClcXFxccyo6W147XSpcXFxccyooPzo7fCQpJywgJ2lnJyk7XHJcbiAgICAgICAgICAgICAgICBsZXQgc3R5bGUgPSAnJztcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocmVnRXhwICYmIHZOb2RlLnN0eWxlLmNzc1RleHQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlID0gcmVnRXhwLnRlc3Qodk5vZGUuc3R5bGUuY3NzVGV4dCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICFzdHlsZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgKGZ1bmN0aW9uIHJlY3Vyc2lvbkZ1bmMoY3VycmVudCwgbm9kZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlcyA9IGN1cnJlbnQuY2hpbGROb2RlcztcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gY2hpbGROb2Rlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjaGlsZCA9IGNoaWxkTm9kZXNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvdmVyTm9kZSA9IG5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNsb25lTm9kZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnRDb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YXJ0UGFzcyAmJiBjaGlsZCA9PT0gc3RhcnRDb250YWluZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldk5vZGUgPSB1dGlsLmNyZWF0ZVRleHROb2RlKHN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlID09PSAxID8gJycgOiBzdGFydENvbnRhaW5lci5zdWJzdHJpbmdEYXRhKDAsIHN0YXJ0T2Zmc2V0KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHROb2RlID0gdXRpbC5jcmVhdGVUZXh0Tm9kZShzdGFydENvbnRhaW5lci5ub2RlVHlwZSA9PT0gMSA/ICcnIDogc3RhcnRDb250YWluZXIuc3Vic3RyaW5nRGF0YShzdGFydE9mZnNldCwgKGVuZE9mZnNldCA+IHN0YXJ0T2Zmc2V0ID8gZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQgOiBlbmRPZmZzZXQgPT09IHN0YXJ0T2Zmc2V0ID8gMCA6IHN0YXJ0Q29udGFpbmVyLmRhdGEubGVuZ3RoIC0gc3RhcnRPZmZzZXQpKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldk5vZGUuZGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKHByZXZOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IGNoaWxkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjc3NUZXh0ID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChuZXdOb2RlICE9PSBwTm9kZSAmJiBuZXdOb2RlICE9PSBlbCAmJiBuZXdOb2RlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGlvbihuZXdOb2RlKSAmJiBuZXdOb2RlLm5vZGVUeXBlID09PSAxICYmIGNoZWNrQ3NzKG5ld05vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnQucHVzaChuZXdOb2RlLmNsb25lTm9kZShmYWxzZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzc1RleHQgKz0gbmV3Tm9kZS5zdHlsZS5jc3NUZXh0LnN1YnN0cigwLCBuZXdOb2RlLnN0eWxlLmNzc1RleHQuaW5kZXhPZignOicpKSArICd8JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBuZXdOb2RlLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkTm9kZSA9IHBDdXJyZW50LnBvcCgpIHx8IHRleHROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlID0gbmV3Tm9kZSA9IGNoaWxkTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBDdXJyZW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBwQ3VycmVudC5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUuYXBwZW5kQ2hpbGQobmV3Tm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlID0gbmV3Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3SW5uZXJOb2RlLmFwcGVuZENoaWxkKGNoaWxkTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBOb2RlLmFwcGVuZENoaWxkKG5ld0lubmVyTm9kZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydENvbnRhaW5lciA9IHRleHROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydE9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UGFzcyA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Tm9kZSAhPT0gdGV4dE5vZGUpIG5ld05vZGUuYXBwZW5kQ2hpbGQoc3RhcnRDb250YWluZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzU2FtZU5vZGUpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gZW5kQ29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbmRQYXNzICYmIGNoaWxkID09PSBlbmRDb250YWluZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWZ0ZXJOb2RlID0gdXRpbC5jcmVhdGVUZXh0Tm9kZShlbmRDb250YWluZXIubm9kZVR5cGUgPT09IDEgPyAnJyA6IGVuZENvbnRhaW5lci5zdWJzdHJpbmdEYXRhKGVuZE9mZnNldCwgKGVuZENvbnRhaW5lci5sZW5ndGggLSBlbmRPZmZzZXQpKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHROb2RlID0gdXRpbC5jcmVhdGVUZXh0Tm9kZShpc1NhbWVOb2RlIHx8IGVuZENvbnRhaW5lci5ub2RlVHlwZSA9PT0gMSA/ICcnIDogZW5kQ29udGFpbmVyLnN1YnN0cmluZ0RhdGEoMCwgZW5kT2Zmc2V0KSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWZ0ZXJOb2RlLmRhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IGNoaWxkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NzVGV4dCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnQgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChuZXdOb2RlICE9PSBwTm9kZSAmJiBuZXdOb2RlICE9PSBlbCAmJiBuZXdOb2RlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld05vZGUubm9kZVR5cGUgPT09IDEgJiYgY2hlY2tDc3MobmV3Tm9kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnQucHVzaChuZXdOb2RlLmNsb25lTm9kZShmYWxzZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3NUZXh0ICs9IG5ld05vZGUuc3R5bGUuY3NzVGV4dC5zdWJzdHIoMCwgbmV3Tm9kZS5zdHlsZS5jc3NUZXh0LmluZGV4T2YoJzonKSkgKyAnfCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBuZXdOb2RlLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmVOb2RlID0gYXBwZW5kTm9kZSA9IG5ld05vZGUgPSBwQ3VycmVudC5wb3AoKSB8fCBhZnRlck5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocEN1cnJlbnQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBwQ3VycmVudC5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlLmFwcGVuZENoaWxkKG5ld05vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUgPSBuZXdOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOb2RlLmFwcGVuZENoaWxkKGNsb25lTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlLnRleHRDb250ZW50ID0gYWZ0ZXJOb2RlLmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBjaGlsZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnQgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3NzVGV4dCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmV3Tm9kZSAhPT0gcE5vZGUgJiYgbmV3Tm9kZSAhPT0gZWwgJiYgbmV3Tm9kZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRpb24obmV3Tm9kZSkgJiYgbmV3Tm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBjaGVja0NzcyhuZXdOb2RlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyZW50LnB1c2gobmV3Tm9kZS5jbG9uZU5vZGUoZmFsc2UpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3NUZXh0ICs9IG5ld05vZGUuc3R5bGUuY3NzVGV4dC5zdWJzdHIoMCwgbmV3Tm9kZS5zdHlsZS5jc3NUZXh0LmluZGV4T2YoJzonKSkgKyAnfCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gbmV3Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZE5vZGUgPSBwQ3VycmVudC5wb3AoKSB8fCB0ZXh0Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSA9IG5ld05vZGUgPSBjaGlsZE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwQ3VycmVudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gcEN1cnJlbnQucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlLmFwcGVuZENoaWxkKG5ld05vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSA9IG5ld05vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0lubmVyTm9kZS5hcHBlbmRDaGlsZChjaGlsZE5vZGUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kQ29udGFpbmVyID0gdGV4dE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZE9mZnNldCA9IHRleHROb2RlLmRhdGEubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmRQYXNzID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNSZW1vdmVGb3JtYXQgJiYgY29sbGFwc2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJbm5lck5vZGUgPSB0ZXh0Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHROb2RlLnRleHRDb250ZW50ID0gdXRpbC56ZXJvV2lkdGhTcGFjZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld05vZGUgIT09IHRleHROb2RlKSBuZXdOb2RlLmFwcGVuZENoaWxkKGVuZENvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRQYXNzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gMSAmJiAhdXRpbC5pc0JyZWFrKGNoaWxkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzaW9uRnVuYyhjaGlsZCwgY2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBjaGlsZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnQgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3NzVGV4dCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmV3Tm9kZS5wYXJlbnROb2RlICE9PSBudWxsICYmIG5ld05vZGUgIT09IGVsICYmIG5ld05vZGUgIT09IG5ld0lubmVyTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld05vZGUubm9kZVR5cGUgPT09IDEgJiYgIXV0aWwuaXNCcmVhayhjaGlsZCkgJiYgKGVuZFBhc3MgfHwgdmFsaWRhdGlvbihuZXdOb2RlKSkgJiYgY2hlY2tDc3MobmV3Tm9kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudC5wdXNoKG5ld05vZGUuY2xvbmVOb2RlKGZhbHNlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NzVGV4dCArPSBuZXdOb2RlLnN0eWxlLmNzc1RleHQuc3Vic3RyKDAsIG5ld05vZGUuc3R5bGUuY3NzVGV4dC5pbmRleE9mKCc6JykpICsgJ3wnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IG5ld05vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlID0gcEN1cnJlbnQucG9wKCkgfHwgY2hpbGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUgPSBuZXdOb2RlID0gY2hpbGROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocEN1cnJlbnQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IHBDdXJyZW50LnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZS5hcHBlbmRDaGlsZChuZXdOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUgPSBuZXdOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGROb2RlID09PSBjaGlsZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbmRQYXNzKSBub2RlID0gbmV3SW5uZXJOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBub2RlID0gcE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZW5kUGFzcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUuYXBwZW5kQ2hpbGQoY2hpbGROb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBuZXdOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SW5uZXJOb2RlLmFwcGVuZENoaWxkKGNoaWxkTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gbmV3Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY2xvbmVOb2RlID0gY2hpbGQuY2xvbmVOb2RlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKGNsb25lTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSAxICYmICF1dGlsLmlzQnJlYWsoY2hpbGQpKSBjb3Zlck5vZGUgPSBjbG9uZU5vZGU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkZ1bmMoY2hpbGQsIGNvdmVyTm9kZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pKGVsZW1lbnQsIHBOb2RlKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChpc1JlbW92ZUZvcm1hdCkge1xyXG4gICAgICAgICAgICAgICAgc3RhcnRDb250YWluZXIgPSB1dGlsLmNyZWF0ZVRleHROb2RlKGNvbGxhcHNlZCA/IHV0aWwuemVyb1dpZHRoU3BhY2UgOiBuZXdJbm5lck5vZGUudGV4dENvbnRlbnQpO1xyXG4gICAgICAgICAgICAgICAgcE5vZGUuaW5zZXJ0QmVmb3JlKHN0YXJ0Q29udGFpbmVyLCBuZXdJbm5lck5vZGUpO1xyXG4gICAgICAgICAgICAgICAgcE5vZGUucmVtb3ZlQ2hpbGQobmV3SW5uZXJOb2RlKTtcclxuICAgICAgICAgICAgICAgIGlmIChjb2xsYXBzZWQpIHN0YXJ0T2Zmc2V0ID0gMTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2xsYXBzZWQpIHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0Q29udGFpbmVyID0gZW5kQ29udGFpbmVyID0gbmV3SW5uZXJOb2RlO1xyXG4gICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQgPSAxO1xyXG4gICAgICAgICAgICAgICAgZW5kT2Zmc2V0ID0gMTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdXRpbC5yZW1vdmVFbXB0eU5vZGUocE5vZGUpO1xyXG4gICAgICAgICAgICBlbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHBOb2RlLCBlbGVtZW50KTtcclxuICAgICAgICAgICAgdXRpbC5yZW1vdmVJdGVtKGVsZW1lbnQpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0Q29udGFpbmVyOiBzdGFydENvbnRhaW5lcixcclxuICAgICAgICAgICAgICAgIHN0YXJ0T2Zmc2V0OiBzdGFydE9mZnNldCxcclxuICAgICAgICAgICAgICAgIGVuZENvbnRhaW5lcjogaXNSZW1vdmVGb3JtYXQgfHwgIWVuZENvbnRhaW5lci50ZXh0Q29udGVudCA/IHN0YXJ0Q29udGFpbmVyIDogZW5kQ29udGFpbmVyLFxyXG4gICAgICAgICAgICAgICAgZW5kT2Zmc2V0OiBpc1JlbW92ZUZvcm1hdCB8fCAhZW5kQ29udGFpbmVyLnRleHRDb250ZW50ID8gc3RhcnRDb250YWluZXIudGV4dENvbnRlbnQubGVuZ3RoIDogZW5kT2Zmc2V0XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIHdyYXBzIG1pZCBsaW5lcyBzZWxlY3RlZCB0ZXh0LlxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIFRoZSBub2RlIG9mIHRoZSBsaW5lIHRoYXQgY29udGFpbnMgdGhlIHNlbGVjdGVkIHRleHQgbm9kZS5cclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5ld0lubmVyTm9kZSAtIFRoZSBkb20gdGhhdCB3aWxsIHdyYXAgdGhlIHNlbGVjdGVkIHRleHQgYXJlYVxyXG4gICAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IHZhbGlkYXRpb24gLSBDaGVjayBpZiB0aGUgbm9kZSBzaG91bGQgYmUgc3RyaXBwZWQuXHJcbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBpc1JlbW92ZUZvcm1hdCAtIElzIHRoZSByZW1vdmUgZm9ybWF0IGNvbW1hbmQgP1xyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX25vZGVDaGFuZ2VfbWlkZGxlTGluZTogZnVuY3Rpb24gKGVsZW1lbnQsIG5ld0lubmVyTm9kZSwgdmFsaWRhdGlvbiwgaXNSZW1vdmVGb3JtYXQpIHtcclxuICAgICAgICAgICAgaWYgKGlzUmVtb3ZlRm9ybWF0KSB7XHJcbiAgICAgICAgICAgICAgICBuZXdJbm5lck5vZGUgPSB1dGlsLmNyZWF0ZVRleHROb2RlKGVsZW1lbnQudGV4dENvbnRlbnQgPyBlbGVtZW50LnRleHRDb250ZW50IDogdXRpbC56ZXJvV2lkdGhTcGFjZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gcmVjdXJzaW9uRnVuYyhjdXJyZW50LCBub2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlcyA9IGN1cnJlbnQuY2hpbGROb2RlcztcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBjaGlsZE5vZGVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGlsZCA9IGNoaWxkTm9kZXNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb3Zlck5vZGUgPSBub2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGlvbihjaGlsZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjbG9uZU5vZGUgPSBjaGlsZC5jbG9uZU5vZGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChjbG9uZU5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSAxICYmICF1dGlsLmlzQnJlYWsoY2hpbGQpKSBjb3Zlck5vZGUgPSBjbG9uZU5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzaW9uRnVuYyhjaGlsZCwgY292ZXJOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KShlbGVtZW50LCBuZXdJbm5lck5vZGUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9ICcnO1xyXG4gICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKG5ld0lubmVyTm9kZSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIHdyYXBzIGZpcnN0IGxpbmUgc2VsZWN0ZWQgdGV4dC5cclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBUaGUgbm9kZSBvZiB0aGUgbGluZSB0aGF0IGNvbnRhaW5zIHRoZSBzZWxlY3RlZCB0ZXh0IG5vZGUuXHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBuZXdJbm5lck5vZGUgLSBUaGUgZG9tIHRoYXQgd2lsbCB3cmFwIHRoZSBzZWxlY3RlZCB0ZXh0IGFyZWFcclxuICAgICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSB2YWxpZGF0aW9uIC0gQ2hlY2sgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIHN0cmlwcGVkLlxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gc3RhcnRDb24gLSBUaGUgc3RhcnRDb250YWluZXIgcHJvcGVydHkgb2YgdGhlIHNlbGVjdGlvbiBvYmplY3QuXHJcbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHN0YXJ0T2ZmIC0gVGhlIHN0YXJ0T2Zmc2V0IHByb3BlcnR5IG9mIHRoZSBzZWxlY3Rpb24gb2JqZWN0LlxyXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNSZW1vdmVGb3JtYXQgLSBJcyB0aGUgcmVtb3ZlIGZvcm1hdCBjb21tYW5kID9cclxuICAgICAgICAgKiBAcmV0dXJucyB7e2NvbnRhaW5lcjogKiwgb2Zmc2V0OiAqfX1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF9ub2RlQ2hhbmdlX3N0YXJ0TGluZTogZnVuY3Rpb24gKGVsZW1lbnQsIG5ld0lubmVyTm9kZSwgdmFsaWRhdGlvbiwgc3RhcnRDb24sIHN0YXJ0T2ZmLCBpc1JlbW92ZUZvcm1hdCkge1xyXG4gICAgICAgICAgICBjb25zdCBlbCA9IGVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHBOb2RlID0gZWxlbWVudC5jbG9uZU5vZGUoZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGNvbnRhaW5lciA9IHN0YXJ0Q29uO1xyXG4gICAgICAgICAgICBsZXQgb2Zmc2V0ID0gc3RhcnRPZmY7XHJcbiAgICAgICAgICAgIGxldCBwYXNzTm9kZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBsZXQgcEN1cnJlbnQsIG5ld05vZGUsIGFwcGVuZE5vZGU7XHJcblxyXG4gICAgICAgICAgICAoZnVuY3Rpb24gcmVjdXJzaW9uRnVuYyhjdXJyZW50LCBub2RlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZE5vZGVzID0gY3VycmVudC5jaGlsZE5vZGVzO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNoaWxkTm9kZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkTm9kZXNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvdmVyTm9kZSA9IG5vZGU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXNzTm9kZSAmJiAhdXRpbC5pc0JyZWFrKGNoaWxkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkZ1bmMoY2hpbGQsIGNoaWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gY2hpbGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyZW50ID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChuZXdOb2RlLnBhcmVudE5vZGUgIT09IG51bGwgJiYgbmV3Tm9kZSAhPT0gZWwgJiYgbmV3Tm9kZSAhPT0gbmV3SW5uZXJOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Tm9kZS5ub2RlVHlwZSA9PT0gMSAmJiB2YWxpZGF0aW9uKG5ld05vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnQucHVzaChuZXdOb2RlLmNsb25lTm9kZShmYWxzZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IG5ld05vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBDdXJyZW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkTm9kZSA9IHBDdXJyZW50LnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSA9IG5ld05vZGUgPSBjaGlsZE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocEN1cnJlbnQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBwQ3VycmVudC5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlLmFwcGVuZENoaWxkKG5ld05vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUgPSBuZXdOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SW5uZXJOb2RlLmFwcGVuZENoaWxkKGNoaWxkTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gbmV3Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBuZXdJbm5lck5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0Q29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzTm9kZSAmJiBjaGlsZCA9PT0gY29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZOb2RlID0gdXRpbC5jcmVhdGVUZXh0Tm9kZShjb250YWluZXIubm9kZVR5cGUgPT09IDEgPyAnJyA6IGNvbnRhaW5lci5zdWJzdHJpbmdEYXRhKDAsIG9mZnNldCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IHV0aWwuY3JlYXRlVGV4dE5vZGUoY29udGFpbmVyLm5vZGVUeXBlID09PSAxID8gJycgOiBjb250YWluZXIuc3Vic3RyaW5nRGF0YShvZmZzZXQsIChjb250YWluZXIubGVuZ3RoIC0gb2Zmc2V0KSkpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZOb2RlLmRhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChwcmV2Tm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBub2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmV3Tm9kZSAhPT0gcE5vZGUgJiYgbmV3Tm9kZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld05vZGUubm9kZVR5cGUgPT09IDEgJiYgdmFsaWRhdGlvbihuZXdOb2RlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyZW50LnB1c2gobmV3Tm9kZS5jbG9uZU5vZGUoZmFsc2UpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBuZXdOb2RlLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkTm9kZSA9IHBDdXJyZW50LnBvcCgpIHx8IG5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUgPSBuZXdOb2RlID0gY2hpbGROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocEN1cnJlbnQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IHBDdXJyZW50LnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZS5hcHBlbmRDaGlsZChuZXdOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUgPSBuZXdOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGROb2RlICE9PSBub2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJbm5lck5vZGUuYXBwZW5kQ2hpbGQoY2hpbGROb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBuZXdOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5ld0lubmVyTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHV0aWwuaXNCcmVhayhjaGlsZCkpIG5ld0lubmVyTm9kZS5hcHBlbmRDaGlsZChjaGlsZC5jbG9uZU5vZGUoZmFsc2UpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBOb2RlLmFwcGVuZENoaWxkKG5ld0lubmVyTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IHRleHROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzTm9kZSA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzTm9kZSB8fCB2YWxpZGF0aW9uKGNoaWxkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbG9uZU5vZGUgPSBjaGlsZC5jbG9uZU5vZGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKGNsb25lTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gMSAmJiAhdXRpbC5pc0JyZWFrKGNoaWxkKSkgY292ZXJOb2RlID0gY2xvbmVOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmVjdXJzaW9uRnVuYyhjaGlsZCwgY292ZXJOb2RlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkoZWxlbWVudCwgcE5vZGUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGlzUmVtb3ZlRm9ybWF0KSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIgPSB1dGlsLmNyZWF0ZVRleHROb2RlKG5ld0lubmVyTm9kZS50ZXh0Q29udGVudCk7XHJcbiAgICAgICAgICAgICAgICBwTm9kZS5pbnNlcnRCZWZvcmUoY29udGFpbmVyLCBuZXdJbm5lck5vZGUpO1xyXG4gICAgICAgICAgICAgICAgcE5vZGUucmVtb3ZlQ2hpbGQobmV3SW5uZXJOb2RlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFpc1JlbW92ZUZvcm1hdCAmJiBwTm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmNoaWxkTm9kZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXIgPSBlbGVtZW50LmNoaWxkTm9kZXNbMF07XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IHV0aWwuY3JlYXRlVGV4dE5vZGUodXRpbC56ZXJvV2lkdGhTcGFjZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChjb250YWluZXIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVFbXB0eU5vZGUocE5vZGUpO1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShwTm9kZSwgZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUl0ZW0oZWxlbWVudCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXI6IGNvbnRhaW5lcixcclxuICAgICAgICAgICAgICAgIG9mZnNldDogb2Zmc2V0XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIHdyYXBzIGxhc3QgbGluZSBzZWxlY3RlZCB0ZXh0LlxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIFRoZSBub2RlIG9mIHRoZSBsaW5lIHRoYXQgY29udGFpbnMgdGhlIHNlbGVjdGVkIHRleHQgbm9kZS5cclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5ld0lubmVyTm9kZSAtIFRoZSBkb20gdGhhdCB3aWxsIHdyYXAgdGhlIHNlbGVjdGVkIHRleHQgYXJlYVxyXG4gICAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IHZhbGlkYXRpb24gLSBDaGVjayBpZiB0aGUgbm9kZSBzaG91bGQgYmUgc3RyaXBwZWQuXHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBlbmRDb24gLSBUaGUgZW5kQ29udGFpbmVyIHByb3BlcnR5IG9mIHRoZSBzZWxlY3Rpb24gb2JqZWN0LlxyXG4gICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBlbmRPZmYgLSBUaGUgZW5kT2Zmc2V0IHByb3BlcnR5IG9mIHRoZSBzZWxlY3Rpb24gb2JqZWN0LlxyXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNSZW1vdmVGb3JtYXQgLSBJcyB0aGUgcmVtb3ZlIGZvcm1hdCBjb21tYW5kID9cclxuICAgICAgICAgKiBAcmV0dXJucyB7e2NvbnRhaW5lcjogKiwgb2Zmc2V0OiAqfX1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF9ub2RlQ2hhbmdlX2VuZExpbmU6IGZ1bmN0aW9uIChlbGVtZW50LCBuZXdJbm5lck5vZGUsIHZhbGlkYXRpb24sIGVuZENvbiwgZW5kT2ZmLCBpc1JlbW92ZUZvcm1hdCkge1xyXG4gICAgICAgICAgICBjb25zdCBlbCA9IGVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHBOb2RlID0gZWxlbWVudC5jbG9uZU5vZGUoZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGNvbnRhaW5lciA9IGVuZENvbjtcclxuICAgICAgICAgICAgbGV0IG9mZnNldCA9IGVuZE9mZjtcclxuICAgICAgICAgICAgbGV0IHBhc3NOb2RlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGxldCBwQ3VycmVudCwgbmV3Tm9kZSwgYXBwZW5kTm9kZTtcclxuXHJcbiAgICAgICAgICAgIChmdW5jdGlvbiByZWN1cnNpb25GdW5jKGN1cnJlbnQsIG5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkTm9kZXMgPSBjdXJyZW50LmNoaWxkTm9kZXM7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gY2hpbGROb2Rlcy5sZW5ndGggLTE7IDAgPD0gaTsgaS0tKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZE5vZGVzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjb3Zlck5vZGUgPSBub2RlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc05vZGUgJiYgIXV0aWwuaXNCcmVhayhjaGlsZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNpb25GdW5jKGNoaWxkLCBjaGlsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IGNoaWxkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmV3Tm9kZS5wYXJlbnROb2RlICE9PSBudWxsICYmIG5ld05vZGUgIT09IGVsICYmIG5ld05vZGUgIT09IG5ld0lubmVyTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRpb24obmV3Tm9kZSkgJiYgbmV3Tm9kZS5ub2RlVHlwZSA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyZW50LnB1c2gobmV3Tm9kZS5jbG9uZU5vZGUoZmFsc2UpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBuZXdOb2RlLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQ3VycmVudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZE5vZGUgPSBwQ3VycmVudC5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUgPSBuZXdOb2RlID0gY2hpbGROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBDdXJyZW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gcEN1cnJlbnQucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZS5hcHBlbmRDaGlsZChuZXdOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlID0gbmV3Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0lubmVyTm9kZS5pbnNlcnRCZWZvcmUoY2hpbGROb2RlLCBuZXdJbm5lck5vZGUuZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gbmV3Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBuZXdJbm5lck5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGVuZENvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFzc05vZGUgJiYgY2hpbGQgPT09IGNvbnRhaW5lcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhZnRlck5vZGUgPSB1dGlsLmNyZWF0ZVRleHROb2RlKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gMSA/ICcnIDogY29udGFpbmVyLnN1YnN0cmluZ0RhdGEob2Zmc2V0LCAoY29udGFpbmVyLmxlbmd0aCAtIG9mZnNldCkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dE5vZGUgPSB1dGlsLmNyZWF0ZVRleHROb2RlKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gMSA/ICcnIDogY29udGFpbmVyLnN1YnN0cmluZ0RhdGEoMCwgb2Zmc2V0KSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWZ0ZXJOb2RlLmRhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5pbnNlcnRCZWZvcmUoYWZ0ZXJOb2RlLCBub2RlLmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gbm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnQgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5ld05vZGUgIT09IHBOb2RlICYmIG5ld05vZGUgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uKG5ld05vZGUpICYmIG5ld05vZGUubm9kZVR5cGUgPT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudC5wdXNoKG5ld05vZGUuY2xvbmVOb2RlKGZhbHNlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gbmV3Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZE5vZGUgPSBwQ3VycmVudC5wb3AoKSB8fCBub2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlID0gbmV3Tm9kZSA9IGNoaWxkTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBDdXJyZW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBwQ3VycmVudC5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUuYXBwZW5kQ2hpbGQobmV3Tm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlID0gbmV3Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkTm9kZSAhPT0gbm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SW5uZXJOb2RlLmluc2VydEJlZm9yZShjaGlsZE5vZGUsIG5ld0lubmVyTm9kZS5maXJzdENoaWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBuZXdOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5ld0lubmVyTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHV0aWwuaXNCcmVhayhjaGlsZCkpIG5ld0lubmVyTm9kZS5hcHBlbmRDaGlsZChjaGlsZC5jbG9uZU5vZGUoZmFsc2UpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBOb2RlLmluc2VydEJlZm9yZShuZXdJbm5lck5vZGUsIHBOb2RlLmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIgPSB0ZXh0Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gdGV4dE5vZGUuZGF0YS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NOb2RlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuaW5zZXJ0QmVmb3JlKGNvbnRhaW5lciwgbm9kZS5maXJzdENoaWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NOb2RlIHx8IHZhbGlkYXRpb24oY2hpbGQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsb25lTm9kZSA9IGNoaWxkLmNsb25lTm9kZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuaW5zZXJ0QmVmb3JlKGNsb25lTm9kZSwgbm9kZS5maXJzdENoaWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSAxICYmICF1dGlsLmlzQnJlYWsoY2hpbGQpKSBjb3Zlck5vZGUgPSBjbG9uZU5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZWN1cnNpb25GdW5jKGNoaWxkLCBjb3Zlck5vZGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KShlbGVtZW50LCBwTm9kZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNSZW1vdmVGb3JtYXQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IHV0aWwuY3JlYXRlVGV4dE5vZGUobmV3SW5uZXJOb2RlLnRleHRDb250ZW50KTtcclxuICAgICAgICAgICAgICAgIG9mZnNldCA9IGNvbnRhaW5lci50ZXh0Q29udGVudC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICBwTm9kZS5pbnNlcnRCZWZvcmUoY29udGFpbmVyLCBuZXdJbm5lck5vZGUpO1xyXG4gICAgICAgICAgICAgICAgcE5vZGUucmVtb3ZlQ2hpbGQobmV3SW5uZXJOb2RlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFpc1JlbW92ZUZvcm1hdCAmJiBwTm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuY2hpbGROb2Rlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IGVsZW1lbnQuY2hpbGROb2Rlc1swXTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyID0gdXRpbC5jcmVhdGVUZXh0Tm9kZSh1dGlsLnplcm9XaWR0aFNwYWNlKTtcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUVtcHR5Tm9kZShwTm9kZSk7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHBOb2RlLCBlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlSXRlbShlbGVtZW50KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogY29udGFpbmVyLFxyXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiBvZmZzZXRcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZSBjb21tYW5kIG9mIGNvbW1hbmQgYnV0dG9uKEFsbCBCdXR0b25zIGV4Y2VwdCBzdWJtZW51IGFuZCBkaWFsb2cpXHJcbiAgICAgICAgICogKHJlZG8sIHVuZG8sIGJvbGQsIHVuZGVybGluZSwgaXRhbGljLCBzdHJpa2V0aHJvdWdoLCBzdWJzY3JpcHQsIHN1cGVyc2NyaXB0LCByZW1vdmVGb3JtYXQsIGluZGVudCwgb3V0ZGVudCwgZnVsbHNjcmVlbiwgc2hvd0Jsb2NrcywgY29kZXZpZXcsIHByZXZpZXcsIHByaW50KVxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0IC0gVGhlIGVsZW1lbnQgb2YgY29tbWFuZCBidXR0b25cclxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29tbWFuZCAtIFByb3BlcnR5IG9mIGNvbW1hbmQgYnV0dG9uIChkYXRhLXZhbHVlKVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbW1hbmRIYW5kbGVyOiBmdW5jdGlvbiAodGFyZ2V0LCBjb21tYW5kKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoY29tbWFuZCkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnY29kZVZpZXcnOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlcnNPZmYoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUNvZGVWaWV3KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC50b2dnbGVDbGFzcyh0YXJnZXQsICdvbicpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnZnVsbFNjcmVlbic6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyc09mZigpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlRnVsbFNjcmVlbih0YXJnZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHV0aWwudG9nZ2xlQ2xhc3ModGFyZ2V0LCAnb24nKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2luZGVudCc6XHJcbiAgICAgICAgICAgICAgICBjYXNlICdvdXRkZW50JzpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGVudChjb21tYW5kKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ3JlZG8nOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAndW5kbyc6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leGVjQ29tbWFuZChjb21tYW5kLCBmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdyZW1vdmVGb3JtYXQnOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlRm9ybWF0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdwcmV2aWV3JzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJ3ByaW50JzpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW5XaW5kb3dDb250ZW50cyhjb21tYW5kKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ3Nob3dCbG9ja3MnOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlRGlzcGxheUJsb2NrcygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHV0aWwudG9nZ2xlQ2xhc3ModGFyZ2V0LCAnb24nKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ3N1YnNjcmlwdCc6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHV0aWwuaGFzQ2xhc3MoY29udGV4dC50b29sLnN1cGVyc2NyaXB0LCAnb24nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4ZWNDb21tYW5kKCdzdXBlcnNjcmlwdCcsIGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVDbGFzcyhjb250ZXh0LnRvb2wuc3VwZXJzY3JpcHQsICdvbicpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4ZWNDb21tYW5kKGNvbW1hbmQsIGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICB1dGlsLnRvZ2dsZUNsYXNzKHRhcmdldCwgJ29uJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdzdXBlcnNjcmlwdCc6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHV0aWwuaGFzQ2xhc3MoY29udGV4dC50b29sLnN1YnNjcmlwdCwgJ29uJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leGVjQ29tbWFuZCgnc3Vic2NyaXB0JywgZmFsc2UsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUNsYXNzKGNvbnRleHQudG9vbC5zdWJzY3JpcHQsICdvbicpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4ZWNDb21tYW5kKGNvbW1hbmQsIGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICB1dGlsLnRvZ2dsZUNsYXNzKHRhcmdldCwgJ29uJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdzYXZlJzpcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnRleHQub3B0aW9uLmNhbGxCYWNrU2F2ZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0Lm9wdGlvbi5jYWxsQmFja1NhdmUodGhpcy5nZXRDb250ZW50cygpKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignW1NVTkVESVRPUi5jb3JlLmNvbW1hbmRIYW5kbGVyLmZhaWxdIFBsZWFzZSByZWdpc3RlciBjYWxsIGJhY2sgZnVuY3Rpb24gaW4gY3JlYXRpb24gb3B0aW9uLiAoY2FsbEJhY2tTYXZlIDogRnVuY3Rpb24pJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdCA6IC8vICdib2xkJywgJ3VuZGVybGluZScsICdpdGFsaWMnLCAnc3RyaWtlJ1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY0NvbW1hbmQoY29tbWFuZCwgZmFsc2UsIHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmFsdWUnKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC50b2dnbGVDbGFzcyh0YXJnZXQsICdvbicpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZvY3VzKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFJlbW92ZSBmb3JtYXQgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByYW5nZSAoSUUsIEVkZ2Ugbm90IHdvcmtpbmcpXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcmVtb3ZlRm9ybWF0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMubm9kZUNoYW5nZSh1dGlsLmNyZWF0ZUVsZW1lbnQoJ1JFTU9WRU5PREUnKSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFRoaXMgbWV0aG9kIGltcGxlbWVudHMgaW5kZW50YXRpb24gdG8gc2VsZWN0ZWQgcmFuZ2UuXHJcbiAgICAgICAgICogU2V0dGVkIFwibWFyZ2luLWxlZnRcIiB0byBcIjI1cHhcIiBpbiB0aGUgdG9wIFwiUFwiIHRhZyBvZiB0aGUgcGFyYW1ldGVyIG5vZGUuXHJcbiAgICAgICAgICogQHBhcmFtIGNvbW1hbmQge1N0cmluZ30gLSBTZXBhcmF0b3IgKFwiaW5kZW50XCIgb3IgXCJvdXRkZW50XCIpXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaW5kZW50OiBmdW5jdGlvbiAoY29tbWFuZCkge1xyXG4gICAgICAgICAgICBjb25zdCByYW5nZUxpbmVzID0gdGhpcy5nZXRTZWxlY3RlZEZvcm1hdEVsZW1lbnRzKCk7XHJcbiAgICAgICAgICAgIGxldCBwLCBtYXJnaW47XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gcmFuZ2VMaW5lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgcCA9IHJhbmdlTGluZXNbaV07XHJcbiAgICAgICAgICAgICAgICBtYXJnaW4gPSAvXFxkKy8udGVzdChwLnN0eWxlLm1hcmdpbkxlZnQpID8gcC5zdHlsZS5tYXJnaW5MZWZ0Lm1hdGNoKC9cXGQrLylbMF0gKiAxIDogMDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoJ2luZGVudCcgPT09IGNvbW1hbmQpIHtcclxuICAgICAgICAgICAgICAgICAgICBtYXJnaW4gKz0gMjU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG1hcmdpbiAtPSAyNTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgICAgICAgICAgcC5zdHlsZS5tYXJnaW5MZWZ0ID0gKG1hcmdpbiA8IDAgPyAwIDogbWFyZ2luKSArICdweCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gQWRkIG9yIHJlbW92ZSB0aGUgY2xhc3MgbmFtZSBvZiBcImJvZHlcIiBzbyB0aGF0IHRoZSBjb2RlIGJsb2NrIGlzIHZpc2libGVcclxuICAgICAgICAgKi9cclxuICAgICAgICB0b2dnbGVEaXNwbGF5QmxvY2tzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHV0aWwudG9nZ2xlQ2xhc3MoY29udGV4dC5lbGVtZW50Lnd5c2l3eWcsICdzdW4tZWRpdG9yLXNob3ctYmxvY2snKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gQ2hhbmdlcyB0byBjb2RlIHZpZXcgb3Igd3lzaXd5ZyB2aWV3XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdG9nZ2xlQ29kZVZpZXc6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY29uc3Qgd3lzaXd5Z0FjdGl2ZSA9IHRoaXMuX3ZhcmlhYmxlLnd5c2l3eWdBY3RpdmU7XHJcbiAgICAgICAgICAgIGNvbnN0IGRpc0J1dHRvbnMgPSB0aGlzLmNvZGVWaWV3RGlzYWJsZWRCdXR0b25zO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gZGlzQnV0dG9ucy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgZGlzQnV0dG9uc1tpXS5kaXNhYmxlZCA9IHd5c2l3eWdBY3RpdmU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghd3lzaXd5Z0FjdGl2ZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29kZV9odG1sID0gY29udGV4dC5lbGVtZW50LmNvZGUudmFsdWUudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuaW5uZXJIVE1MID0gY29kZV9odG1sLmxlbmd0aCA+IDAgPyB1dGlsLmNvbnZlcnRDb250ZW50c0ZvckVkaXRvcihjb2RlX2h0bWwpIDogJzxwPicgKyB1dGlsLnplcm9XaWR0aFNwYWNlICsgJzwvcD4nO1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuc2Nyb2xsVG9wID0gMDtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5jb2RlLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgICAgICAgIGlmIChjb250ZXh0Lm9wdGlvbi5oZWlnaHQgPT09ICdhdXRvJykgY29udGV4dC5lbGVtZW50LmNvZGUuc3R5bGUuaGVpZ2h0ID0gJzBweCc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92YXJpYWJsZS53eXNpd3lnQWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5jb2RlLnZhbHVlID0gdXRpbC5jb252ZXJ0SFRNTEZvckNvZGVWaWV3KGNvbnRleHQuZWxlbWVudC53eXNpd3lnLmlubmVySFRNTC50cmltKCkpO1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5jb2RlLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQub3B0aW9uLmhlaWdodCA9PT0gJ2F1dG8nKSBjb250ZXh0LmVsZW1lbnQuY29kZS5zdHlsZS5oZWlnaHQgPSBjb250ZXh0LmVsZW1lbnQuY29kZS5zY3JvbGxIZWlnaHQgPiAwID8gKGNvbnRleHQuZWxlbWVudC5jb2RlLnNjcm9sbEhlaWdodCArICdweCcpIDogJ2F1dG8nO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmFyaWFibGUud3lzaXd5Z0FjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LmNvZGUuZm9jdXMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBDaGFuZ2VzIHRvIGZ1bGwgc2NyZWVuIG9yIGRlZmF1bHQgc2NyZWVuXHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gZnVsbCBzY3JlZW4gYnV0dG9uXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdG9nZ2xlRnVsbFNjcmVlbjogZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl92YXJpYWJsZS5pc0Z1bGxTY3JlZW4pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhcmlhYmxlLmlzRnVsbFNjcmVlbiA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LnRvcEFyZWEuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LnRvcEFyZWEuc3R5bGUudG9wID0gJzAnO1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LnRvcEFyZWEuc3R5bGUubGVmdCA9ICcwJztcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC50b3BBcmVhLnN0eWxlLndpZHRoID0gJzEwMCUnO1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LnRvcEFyZWEuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnO1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LnRvcEFyZWEuc3R5bGUuekluZGV4ID0gJzIxNDc0ODM2NDcnO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhcmlhYmxlLl9ib2R5T3ZlcmZsb3cgPSBfZC5ib2R5LnN0eWxlLm92ZXJmbG93O1xyXG4gICAgICAgICAgICAgICAgX2QuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhcmlhYmxlLl9lZGl0b3JBcmVhT3JpZ2luQ3NzVGV4dCA9IGNvbnRleHQuZWxlbWVudC5lZGl0b3JBcmVhLnN0eWxlLmNzc1RleHQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92YXJpYWJsZS5fd3lzaXd5Z09yaWdpbkNzc1RleHQgPSBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5zdHlsZS5jc3NUZXh0O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmFyaWFibGUuX2NvZGVPcmlnaW5Dc3NUZXh0ID0gY29udGV4dC5lbGVtZW50LmNvZGUuc3R5bGUuY3NzVGV4dDtcclxuXHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQuZWRpdG9yQXJlYS5zdHlsZS5jc3NUZXh0ID0gY29udGV4dC5lbGVtZW50LnRvb2xiYXIuc3R5bGUuY3NzVGV4dCA9IGNvbnRleHQuZWxlbWVudC53eXNpd3lnLnN0eWxlLmNzc1RleHQgPSBjb250ZXh0LmVsZW1lbnQuY29kZS5zdHlsZS5jc3NUZXh0ID0gJyc7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQudG9vbGJhci5zdHlsZS53aWR0aCA9IGNvbnRleHQuZWxlbWVudC53eXNpd3lnLnN0eWxlLmhlaWdodCA9IGNvbnRleHQuZWxlbWVudC5jb2RlLnN0eWxlLmhlaWdodCA9ICcxMDAlJztcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC50b29sYmFyLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl92YXJpYWJsZS5pbm5lckhlaWdodF9mdWxsU2NyZWVuID0gKF93LmlubmVySGVpZ2h0IC0gY29udGV4dC5lbGVtZW50LnRvb2xiYXIub2Zmc2V0SGVpZ2h0KTtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5lZGl0b3JBcmVhLnN0eWxlLmhlaWdodCA9IHRoaXMuX3ZhcmlhYmxlLmlubmVySGVpZ2h0X2Z1bGxTY3JlZW4gKyAncHgnO1xyXG5cclxuICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlQ2xhc3MoZWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCwgJ2ljb24tZXhwYW5zaW9uJyk7XHJcbiAgICAgICAgICAgICAgICB1dGlsLmFkZENsYXNzKGVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQsICdpY29uLXJlZHVjdGlvbicpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmFyaWFibGUuaXNGdWxsU2NyZWVuID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LmNvZGUuc3R5bGUuY3NzVGV4dCA9IHRoaXMuX3ZhcmlhYmxlLl9jb2RlT3JpZ2luQ3NzVGV4dDtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC53eXNpd3lnLnN0eWxlLmNzc1RleHQgPSB0aGlzLl92YXJpYWJsZS5fd3lzaXd5Z09yaWdpbkNzc1RleHQ7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQudG9vbGJhci5zdHlsZS5jc3NUZXh0ID0gJyc7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQuZWRpdG9yQXJlYS5zdHlsZS5jc3NUZXh0ID0gdGhpcy5fdmFyaWFibGUuX2VkaXRvckFyZWFPcmlnaW5Dc3NUZXh0O1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LnRvcEFyZWEuc3R5bGUuY3NzVGV4dCA9IHRoaXMuX3ZhcmlhYmxlLl9vcmlnaW5Dc3NUZXh0O1xyXG4gICAgICAgICAgICAgICAgX2QuYm9keS5zdHlsZS5vdmVyZmxvdyA9IHRoaXMuX3ZhcmlhYmxlLl9ib2R5T3ZlcmZsb3c7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQub3B0aW9uLnN0aWNreVRvb2xiYXIgPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlQ2xhc3MoY29udGV4dC5lbGVtZW50LnRvb2xiYXIsICdzdW4tZWRpdG9yLXN0aWNreScpO1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50Lm9uU2Nyb2xsX3dpbmRvdygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlQ2xhc3MoZWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCwgJ2ljb24tcmVkdWN0aW9uJyk7XHJcbiAgICAgICAgICAgICAgICB1dGlsLmFkZENsYXNzKGVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQsICdpY29uLWV4cGFuc2lvbicpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIE9wZW4gdGhlIHByZXZpZXcgd2luZG93IG9yIG9wZW4gdGhlIHByaW50IHdpbmRvd1xyXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtb2RlIC0gJ3ByZXZpZXcnIG9yICdwcmludCdcclxuICAgICAgICAgKi9cclxuICAgICAgICBvcGVuV2luZG93Q29udGVudHM6IGZ1bmN0aW9uIChtb2RlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzUHJpbnQgPSBtb2RlID09PSAncHJpbnQnO1xyXG4gICAgICAgICAgICBjb25zdCB3aW5kb3dPYmplY3QgPSBfdy5vcGVuKCcnLCAnX2JsYW5rJyk7XHJcbiAgICAgICAgICAgIHdpbmRvd09iamVjdC5taW1lVHlwZSA9ICd0ZXh0L2h0bWwnO1xyXG4gICAgICAgICAgICB3aW5kb3dPYmplY3QuZG9jdW1lbnQud3JpdGUoJycgK1xyXG4gICAgICAgICAgICAgICAgJzwhZG9jdHlwZSBodG1sPjxodG1sPicgK1xyXG4gICAgICAgICAgICAgICAgJzxoZWFkPicgK1xyXG4gICAgICAgICAgICAgICAgJzxtZXRhIGNoYXJzZXQ9XCJ1dGYtOFwiIC8+JyArXHJcbiAgICAgICAgICAgICAgICAnPG1ldGEgbmFtZT1cInZpZXdwb3J0XCIgY29udGVudD1cIndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xXCI+JyArXHJcbiAgICAgICAgICAgICAgICAnPHRpdGxlPicgKyAoaXNQcmludCA/IGxhbmcudG9vbGJhci5wcmludCA6IGxhbmcudG9vbGJhci5wcmV2aWV3KSArICc8L3RpdGxlPicgK1xyXG4gICAgICAgICAgICAgICAgJzxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiB0eXBlPVwidGV4dC9jc3NcIiBocmVmPVwiJyArIHV0aWwuZ2V0SW5jbHVkZVBhdGgoWydzdW5lZGl0b3ItY29udGVudHMnLCAnc3VuZWRpdG9yJ10sICdjc3MnKSArICdcIj4nICtcclxuICAgICAgICAgICAgICAgICc8L2hlYWQ+JyArXHJcbiAgICAgICAgICAgICAgICAnPGJvZHk+JyArXHJcbiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInN1bi1lZGl0b3ItZWRpdGFibGVcIiBzdHlsZT1cIndpZHRoOicgKyBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5vZmZzZXRXaWR0aCArICdweDsgbWFyZ2luOmF1dG87XCI+JyArXHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldENvbnRlbnRzKCkgKyAnPC9kaXY+JyArXHJcbiAgICAgICAgICAgICAgICAoaXNQcmludCA/ICc8c2NyaXB0Pl93LnByaW50KCk7PC9zY3JpcHQ+JyA6ICcnKSArICc8L2JvZHk+JyArXHJcbiAgICAgICAgICAgICAgICAnPC9odG1sPicpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBjdXJyZW50IGNvbnRlbnRzXHJcbiAgICAgICAgICogQHJldHVybnMge09iamVjdH1cclxuICAgICAgICAgKi9cclxuICAgICAgICBnZXRDb250ZW50czogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBsZXQgY29udGVudHMgPSAnJztcclxuXHJcbiAgICAgICAgICAgIGlmIChjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5pbm5lclRleHQudHJpbSgpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGNvbnRlbnRzO1xyXG5cclxuICAgICAgICAgICAgaWYgKGVkaXRvci5fdmFyaWFibGUud3lzaXd5Z0FjdGl2ZSkge1xyXG4gICAgICAgICAgICAgICAgY29udGVudHMgPSBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5pbm5lckhUTUw7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb250ZW50cyA9IHV0aWwuY29udmVydENvbnRlbnRzRm9yRWRpdG9yKGNvbnRleHQuZWxlbWVudC5jb2RlLnZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgcmVuZGVySFRNTCA9IHV0aWwuY3JlYXRlRWxlbWVudCgnRElWJyk7XHJcbiAgICAgICAgICAgIHJlbmRlckhUTUwuaW5uZXJIVE1MID0gY29udGVudHM7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBmaWdjYXB0aW9ucyA9IHV0aWwuZ2V0TGlzdENoaWxkcmVuKHJlbmRlckhUTUwsIGZ1bmN0aW9uIChjdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gL0ZJR0NBUFRJT04vaS50ZXN0KGN1cnJlbnQubm9kZU5hbWUpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBmaWdjYXB0aW9ucy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgZmlnY2FwdGlvbnNbaV0ub3V0ZXJIVE1MID0gZmlnY2FwdGlvbnNbaV0ub3V0ZXJIVE1MLnJlcGxhY2UoLyg/IV48ZmlnY2FwdGlvblxccyspKGNvbnRlbnRlZGl0YWJsZT1cIihbYS16XSt8XFxzKilcIilcXHMqKD89W14+XSo+KS9pLCAnJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiByZW5kZXJIVE1MLmlubmVySFRNTDtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIGV2ZW50IGZ1bmN0aW9uXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IGV2ZW50ID0ge1xyXG4gICAgICAgIF9zaG9ydGN1dEtleUNvZGU6IHtcclxuICAgICAgICAgICAgNjY6IFsnYm9sZCcsICdCJ10sXHJcbiAgICAgICAgICAgIDgzOiBbJ3N0cmlrZXRocm91Z2gnLCAnU1RSSUtFJ10sXHJcbiAgICAgICAgICAgIDg1OiBbJ3VuZGVybGluZScsICdVJ10sXHJcbiAgICAgICAgICAgIDczOiBbJ2l0YWxpYycsICdJJ10sXHJcbiAgICAgICAgICAgIDg5OiBbJ3JlZG8nXSxcclxuICAgICAgICAgICAgOTA6IFsndW5kbyddLFxyXG4gICAgICAgICAgICAyMTk6IFsnb3V0ZGVudCddLFxyXG4gICAgICAgICAgICAyMjE6IFsnaW5kZW50J11cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfZGlyZWN0aW9uS2V5S2V5Q29kZTogbmV3IFJlZ0V4cCgnXig/Ojh8MTN8MzJ8NDZ8MzN8MzR8MzV8MzZ8Mzd8Mzh8Mzl8NDB8OTh8MTAwfDEwMnwxMDQpJCcpLFxyXG5cclxuICAgICAgICBfY2hhbmdlQnV0dG9uQ2xhc3NUYWdDaGVjazogbmV3IFJlZ0V4cCgnXig/OkJ8VXxJfFNUUklLRXxTVUJ8U1VQKSQnKSxcclxuXHJcbiAgICAgICAgX2ZpbmRCdXR0b25FZmZlY3RUYWc6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY29uc3QgY29tbWFuZE1hcCA9IGVkaXRvci5jb21tYW5kTWFwO1xyXG4gICAgICAgICAgICBjb25zdCBjbGFzc09uQ2hlY2sgPSB0aGlzLl9jaGFuZ2VCdXR0b25DbGFzc1RhZ0NoZWNrO1xyXG4gICAgICAgICAgICBjb25zdCBjb21tYW5kTWFwTm9kZXMgPSBbXTtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudE5vZGVzID0gW107XHJcblxyXG4gICAgICAgICAgICBsZXQgZmluZEZvcm1hdCA9IHRydWUsIGZpbmRGb250ID0gdHJ1ZSwgZmluZFNpemUgPSB0cnVlLCBmaW5kQSA9IHRydWU7XHJcbiAgICAgICAgICAgIGxldCBmaW5kQiA9IHRydWUsIGZpbmRJID0gdHJ1ZSwgZmluZFUgPSB0cnVlLCBmaW5kUyA9IHRydWU7XHJcbiAgICAgICAgICAgIGxldCBjc3NUZXh0ID0gJycsIG5vZGVOYW1lID0gJyc7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBzZWxlY3Rpb25QYXJlbnQgPSBlZGl0b3IuZ2V0U2VsZWN0aW9uTm9kZSgpOyAhdXRpbC5pc1d5c2l3eWdEaXYoc2VsZWN0aW9uUGFyZW50KTsgc2VsZWN0aW9uUGFyZW50ID0gc2VsZWN0aW9uUGFyZW50LnBhcmVudE5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGlmICghc2VsZWN0aW9uUGFyZW50KSBicmVhaztcclxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25QYXJlbnQubm9kZVR5cGUgIT09IDEpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgbm9kZU5hbWUgPSBzZWxlY3Rpb25QYXJlbnQubm9kZU5hbWUudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnROb2Rlcy5wdXNoKG5vZGVOYW1lKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvKiogRm9ybWF0ICovXHJcbiAgICAgICAgICAgICAgICBpZiAoZmluZEZvcm1hdCAmJiB1dGlsLmlzRm9ybWF0RWxlbWVudChzZWxlY3Rpb25QYXJlbnQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZE1hcE5vZGVzLnB1c2goJ0ZPUk1BVCcpO1xyXG4gICAgICAgICAgICAgICAgICAgIHV0aWwuY2hhbmdlVHh0KGNvbW1hbmRNYXAuRk9STUFULCBub2RlTmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZmluZEZvcm1hdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8qKiBGb250ICovXHJcbiAgICAgICAgICAgICAgICBpZiAoZmluZEZvbnQgJiYgKHNlbGVjdGlvblBhcmVudC5zdHlsZS5mb250RmFtaWx5Lmxlbmd0aCA+IDAgfHwgKHNlbGVjdGlvblBhcmVudC5mYWNlICYmIHNlbGVjdGlvblBhcmVudC5mYWNlLmxlbmd0aCA+IDApKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmRNYXBOb2Rlcy5wdXNoKCdGT05UJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0Rm9udCA9IChzZWxlY3Rpb25QYXJlbnQuc3R5bGUuZm9udEZhbWlseSB8fCBzZWxlY3Rpb25QYXJlbnQuZmFjZSB8fCBsYW5nLnRvb2xiYXIuZm9udCkucmVwbGFjZSgvW1wiJ10vZywnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5jaGFuZ2VUeHQoY29tbWFuZE1hcC5GT05ULCBzZWxlY3RGb250KTtcclxuICAgICAgICAgICAgICAgICAgICBmaW5kRm9udCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8qKiBBICovXHJcbiAgICAgICAgICAgICAgICBpZiAoZmluZEEgJiYgL15BJC8udGVzdChub2RlTmFtZSkgJiYgc2VsZWN0aW9uUGFyZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1pbWFnZS1saW5rJykgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRleHQubGluayB8fCBlZGl0b3IuY29udHJvbGxlckFycmF5WzBdICE9PSBjb250ZXh0LmxpbmsubGlua0J0bikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3IuY2FsbFBsdWdpbignbGluaycsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvci5wbHVnaW5zLmxpbmsuY2FsbF9jb250cm9sbGVyX2xpbmtCdXR0b24uY2FsbChlZGl0b3IsIHNlbGVjdGlvblBhcmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBmaW5kQSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaW5kQSAmJiBjb250ZXh0LmxpbmsgJiYgZWRpdG9yLmNvbnRyb2xsZXJBcnJheVswXSA9PT0gY29udGV4dC5saW5rLmxpbmtCdG4pIHtcclxuICAgICAgICAgICAgICAgICAgICBlZGl0b3IuY29udHJvbGxlcnNPZmYoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvKiogU1BBTiAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKGZpbmRTaXplICYmIC9eU1BBTiQvLnRlc3Qobm9kZU5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLyoqIGZvbnQgc2l6ZSAqL1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25QYXJlbnQuc3R5bGUuZm9udFNpemUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kTWFwTm9kZXMucHVzaCgnU0laRScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1dGlsLmNoYW5nZVR4dChjb21tYW5kTWFwLlNJWkUsIHNlbGVjdGlvblBhcmVudC5zdHlsZS5mb250U2l6ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRTaXplID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8qKiBjb21tYW5kIG1hcCAqL1xyXG4gICAgICAgICAgICAgICAgY3NzVGV4dCA9IHNlbGVjdGlvblBhcmVudC5zdHlsZS5jc3NUZXh0O1xyXG4gICAgICAgICAgICAgICAgaWYgKGZpbmRCICYmIC9mb250XFwtd2VpZ2h0XFxzKjpcXHMqKD86XFxkK3xib2xkfGJvbGRlcikoPzo7fFxcc3wpLy50ZXN0KGNzc1RleHQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZE1hcE5vZGVzLnB1c2goJ0InKTtcclxuICAgICAgICAgICAgICAgICAgICBmaW5kQiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGZpbmRJICYmIC9mb250XFwtc3R5bGVcXHMqOlxccyooPzppdGFsaWN8b2JsaXF1ZSkoPzo7fFxccykvLnRlc3QoY3NzVGV4dCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kTWFwTm9kZXMucHVzaCgnSScpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbmRJID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZmluZFUgJiYgL3RleHRcXC1kZWNvcmF0aW9uKD86XFwtbGluZSk/XFxzKjpcXHMqdW5kZXJsaW5lKD86O3xcXHN8KS8udGVzdChjc3NUZXh0KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmRNYXBOb2Rlcy5wdXNoKCdVJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgZmluZFUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChmaW5kUyAmJiAvdGV4dFxcLWRlY29yYXRpb24oPzpcXC1saW5lKT9cXHMqOlxccypsaW5lLXRocm91Z2goPzo7fFxcc3wpLy50ZXN0KGNzc1RleHQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZE1hcE5vZGVzLnB1c2goJ1NUUklLRScpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbmRTID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY29tbWFuZE1hcE5vZGVzLnB1c2goKC9eU1RST05HJC8udGVzdChub2RlTmFtZSkgPyAnQicgOiAvXkVNJC8udGVzdChub2RlTmFtZSkgPyAnSScgOiBub2RlTmFtZSkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiogQSBUYWcgZWRpdCBjb250cm9sbGVyIG9mZiAqL1xyXG4gICAgICAgICAgICBpZiAoZmluZEEpIGVkaXRvci5jb250cm9sbGVyc09mZigpO1xyXG5cclxuICAgICAgICAgICAgLyoqIHRvZ2dsZSBjbGFzcyBvbiAqL1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbW1hbmRNYXBOb2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbm9kZU5hbWUgPSBjb21tYW5kTWFwTm9kZXNbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoY2xhc3NPbkNoZWNrLnRlc3Qobm9kZU5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5hZGRDbGFzcyhjb21tYW5kTWFwW25vZGVOYW1lXSwgJ29uJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8qKiByZW1vdmUgY2xhc3MsIGRpc3BsYXkgdGV4dCAqL1xyXG4gICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gY29tbWFuZE1hcCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbW1hbmRNYXBOb2Rlcy5pbmRleE9mKGtleSkgPiAtMSkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBpZiAoL15GT05UL2kudGVzdChrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5jaGFuZ2VUeHQoY29tbWFuZE1hcFtrZXldLCBsYW5nLnRvb2xiYXIuZm9udCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICgvXlNJWkUkL2kudGVzdChrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5jaGFuZ2VUeHQoY29tbWFuZE1hcFtrZXldLCBsYW5nLnRvb2xiYXIuZm9udFNpemUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVDbGFzcyhjb21tYW5kTWFwW2tleV0sICdvbicpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiogc2F2ZSBjdXJyZW50IG5vZGVzICovXHJcbiAgICAgICAgICAgIGVkaXRvci5fdmFyaWFibGUuY3VycmVudE5vZGVzID0gY3VycmVudE5vZGVzLnJldmVyc2UoKTtcclxuXHJcbiAgICAgICAgICAgIC8qKiAgRGlzcGxheXMgdGhlIGN1cnJlbnQgbm9kZSBzdHJ1Y3R1cmUgdG8gcmVzaXppbmdCYXIgKi9cclxuICAgICAgICAgICAgaWYgKGNvbnRleHQub3B0aW9uLnNob3dQYXRoTGFiZWwpIGNvbnRleHQuZWxlbWVudC5uYXZpZ2F0aW9uLnRleHRDb250ZW50ID0gZWRpdG9yLl92YXJpYWJsZS5jdXJyZW50Tm9kZXMuam9pbignID4gJyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2NhbmNlbENhcHRpb25FZGl0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmx1cicsIGV2ZW50Ll9jYW5jZWxDYXB0aW9uRWRpdCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgb25Nb3VzZURvd25fdG9vbGJhcjogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgbGV0IHRhcmdldCA9IGUudGFyZ2V0O1xyXG5cclxuICAgICAgICAgICAgaWYgKHV0aWwuZ2V0UGFyZW50RWxlbWVudCh0YXJnZXQsICcuc3VuLWVkaXRvci1zdWJtZW51JykpIHtcclxuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBsZXQgY29tbWFuZCA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY29tbWFuZCcpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGNsYXNzTmFtZSA9IHRhcmdldC5jbGFzc05hbWU7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgIHdoaWxlICghY29tbWFuZCAmJiAhL2VkaXRvcl90b29sLy50ZXN0KGNsYXNzTmFtZSkgJiYgIS9zdW4tZWRpdG9yLWlkLXRvb2xiYXIvLnRlc3QoY2xhc3NOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWNvbW1hbmQnKTtcclxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSB0YXJnZXQuY2xhc3NOYW1lO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICBpZiAoY29tbWFuZCA9PT0gZWRpdG9yLl9zdWJtZW51TmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBvbkNsaWNrX3Rvb2xiYXI6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSBlLnRhcmdldDtcclxuICAgICAgICAgICAgbGV0IGRpc3BsYXkgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWRpc3BsYXknKTtcclxuICAgICAgICAgICAgbGV0IGNvbW1hbmQgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWNvbW1hbmQnKTtcclxuICAgICAgICAgICAgbGV0IGNsYXNzTmFtZSA9IHRhcmdldC5jbGFzc05hbWU7XHJcblxyXG4gICAgICAgICAgICB3aGlsZSAoIWNvbW1hbmQgJiYgIS9lZGl0b3JfdG9vbC8udGVzdChjbGFzc05hbWUpICYmICEvc3VuLWVkaXRvci1pZC10b29sYmFyLy50ZXN0KGNsYXNzTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgY29tbWFuZCA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY29tbWFuZCcpO1xyXG4gICAgICAgICAgICAgICAgZGlzcGxheSA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtZGlzcGxheScpO1xyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gdGFyZ2V0LmNsYXNzTmFtZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFjb21tYW5kICYmICFkaXNwbGF5KSByZXR1cm47XHJcbiAgICAgICAgICAgIGlmICh0YXJnZXQuZGlzYWJsZWQpIHJldHVybjtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGVkaXRvci5mb2N1cygpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLyoqIERpYWxvZywgU3VibWVudSAqL1xyXG4gICAgICAgICAgICBpZiAoZGlzcGxheSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKC9zdWJtZW51Ly50ZXN0KGRpc3BsYXkpICYmICh0YXJnZXQubmV4dEVsZW1lbnRTaWJsaW5nID09PSBudWxsIHx8IHRhcmdldCAhPT0gZWRpdG9yLnN1Ym1lbnVBY3RpdmVCdXR0b24pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLmNhbGxQbHVnaW4oY29tbWFuZCwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3Iuc3VibWVudU9uKHRhcmdldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoL2RpYWxvZy8udGVzdChkaXNwbGF5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVkaXRvci5jYWxsUGx1Z2luKGNvbW1hbmQsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yLnBsdWdpbnMuZGlhbG9nLm9wZW4uY2FsbChlZGl0b3IsIGNvbW1hbmQsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgZWRpdG9yLnN1Ym1lbnVPZmYoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyoqIGRlZmF1bHQgY29tbWFuZCAqL1xyXG4gICAgICAgICAgICBpZiAoY29tbWFuZCkge1xyXG4gICAgICAgICAgICAgICAgZWRpdG9yLmNvbW1hbmRIYW5kbGVyKHRhcmdldCwgY29tbWFuZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBvbk1vdXNlVXBfd3lzaXd5ZzogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBlZGl0b3IuX2VkaXRvclJhbmdlKCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAoZWRpdG9yLl9pc0JhbGxvb24pIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gZWRpdG9yLmdldFJhbmdlKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocmFuZ2UuY29sbGFwc2VkKSBldmVudC5faGlkZVRvb2xiYXIoKTtcclxuICAgICAgICAgICAgICAgIGVsc2UgZXZlbnQuX3Nob3dUb29sYmFyQmFsbG9vbihyYW5nZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBvbkNsaWNrX3d5c2l3eWc6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSBlLnRhcmdldDtcclxuXHJcbiAgICAgICAgICAgIGlmICgvXklNRyQvaS50ZXN0KHRhcmdldEVsZW1lbnQubm9kZU5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBlZGl0b3IuY2FsbFBsdWdpbignaW1hZ2UnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IGVkaXRvci5wbHVnaW5zLnJlc2l6aW5nLmNhbGxfY29udHJvbGxlcl9yZXNpemUuY2FsbChlZGl0b3IsIHRhcmdldEVsZW1lbnQsICdpbWFnZScpO1xyXG4gICAgICAgICAgICAgICAgICAgIGVkaXRvci5wbHVnaW5zLmltYWdlLm9uTW9kaWZ5TW9kZS5jYWxsKGVkaXRvciwgdGFyZ2V0RWxlbWVudCwgc2l6ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF1dGlsLmdldFBhcmVudEVsZW1lbnQodGFyZ2V0RWxlbWVudCwgJy5zdW4tZWRpdG9yLWlkLWltYWdlLWNvbnRhaW5lcicpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvci5wbHVnaW5zLmltYWdlLm9wZW5Nb2RpZnkuY2FsbChlZGl0b3IsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3IucGx1Z2lucy5pbWFnZS51cGRhdGVfaW1hZ2UuY2FsbChlZGl0b3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3IuY29udHJvbGxlcnNPZmYoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICgvc3VuLWVkaXRvci1pZC1pZnJhbWUtaW5uZXItcmVzaXppbmctY292ZXIvaS50ZXN0KHRhcmdldEVsZW1lbnQuY2xhc3NOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZWRpdG9yLmNhbGxQbHVnaW4oJ3ZpZGVvJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlmcmFtZSA9IHV0aWwuZ2V0Q2hpbGRFbGVtZW50KHRhcmdldEVsZW1lbnQucGFyZW50Tm9kZSwgJ2lmcmFtZScpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemUgPSBlZGl0b3IucGx1Z2lucy5yZXNpemluZy5jYWxsX2NvbnRyb2xsZXJfcmVzaXplLmNhbGwoZWRpdG9yLCBpZnJhbWUsICd2aWRlbycpO1xyXG4gICAgICAgICAgICAgICAgICAgIGVkaXRvci5wbHVnaW5zLnZpZGVvLm9uTW9kaWZ5TW9kZS5jYWxsKGVkaXRvciwgaWZyYW1lLCBzaXplKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZXZlbnQuX2ZpbmRCdXR0b25FZmZlY3RUYWcoKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZpZ2NhcHRpb24gPSB1dGlsLmdldFBhcmVudEVsZW1lbnQodGFyZ2V0RWxlbWVudCwgJ0ZJR0NBUFRJT04nKTtcclxuICAgICAgICAgICAgaWYgKGZpZ2NhcHRpb24gJiYgZmlnY2FwdGlvbi5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScpICE9PSAndHVyZScpIHtcclxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGZpZ2NhcHRpb24uc2V0QXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIGZpZ2NhcHRpb24uZm9jdXMoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZWRpdG9yLl9pc0lubGluZSAmJiAhZWRpdG9yLl9pbmxpbmVUb29sYmFyQXR0ci5pc1Nob3cpIHtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5fc2hvd1Rvb2xiYXJJbmxpbmUoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkZVRvb2xiYXIgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50Ll9oaWRlVG9vbGJhcigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhpZGVUb29sYmFyKTtcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBfZC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhpZGVUb29sYmFyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRkID0gdXRpbC5nZXRQYXJlbnRFbGVtZW50KHRhcmdldEVsZW1lbnQsIHV0aWwuaXNDZWxsKTtcclxuICAgICAgICAgICAgICAgIGlmICh0ZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlZGl0b3IuY29udHJvbGxlckFycmF5Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3IuY2FsbFBsdWdpbigndGFibGUnLCBlZGl0b3IucGx1Z2lucy50YWJsZS5jYWxsX2NvbnRyb2xsZXJfdGFibGVFZGl0LmJpbmQoZWRpdG9yLCB0ZCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHVzZXJGdW5jdGlvbi5vbkNsaWNrKSB1c2VyRnVuY3Rpb24ub25DbGljayhlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfc2hvd1Rvb2xiYXJCYWxsb29uOiBmdW5jdGlvbiAocmFuZ2VPYmopIHtcclxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSByYW5nZU9iaiB8fCBlZGl0b3IuZ2V0UmFuZ2UoKTtcclxuICAgICAgICAgICAgY29uc3QgcGFkZGluZyA9IDIwO1xyXG4gICAgICAgICAgICBjb25zdCB0b29sYmFyID0gY29udGV4dC5lbGVtZW50LnRvb2xiYXI7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IF93LmdldFNlbGVjdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGlzRGlyVG9wO1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0aW9uLmZvY3VzTm9kZSA9PT0gc2VsZWN0aW9uLmFuY2hvck5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGlzRGlyVG9wID0gc2VsZWN0aW9uLmZvY3VzT2Zmc2V0IDwgc2VsZWN0aW9uLmFuY2hvck9mZnNldDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkTm9kZXMgPSB1dGlsLmdldExpc3RDaGlsZE5vZGVzKHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgIGlzRGlyVG9wID0gdXRpbC5nZXRBcnJheUluZGV4KGNoaWxkTm9kZXMsIHNlbGVjdGlvbi5mb2N1c05vZGUpIDwgdXRpbC5nZXRBcnJheUluZGV4KGNoaWxkTm9kZXMsIHNlbGVjdGlvbi5hbmNob3JOb2RlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHJlY3RzID0gcmFuZ2UuZ2V0Q2xpZW50UmVjdHMoKTtcclxuICAgICAgICAgICAgcmVjdHMgPSByZWN0c1tpc0RpclRvcCA/IDAgOiByZWN0cy5sZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHRvb2xiYXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcblxyXG4gICAgICAgICAgICBjb25zdCB0b29sYmFyV2lkdGggPSB0b29sYmFyLm9mZnNldFdpZHRoO1xyXG4gICAgICAgICAgICBjb25zdCB0b29sYmFySGVpZ2h0ID0gdG9vbGJhci5vZmZzZXRIZWlnaHQ7XHJcblxyXG4gICAgICAgICAgICBsZXQgbCA9IChpc0RpclRvcCA/IHJlY3RzLmxlZnQgOiByZWN0cy5yaWdodCkgLSBjb250ZXh0LmVsZW1lbnQudG9wQXJlYS5vZmZzZXRMZWZ0ICsgKF93LnNjcm9sbFggfHwgX2QuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQpIC0gdG9vbGJhcldpZHRoIC8gMjtcclxuICAgICAgICAgICAgbGV0IHQgPSAoaXNEaXJUb3AgPyByZWN0cy50b3AgLSB0b29sYmFySGVpZ2h0IC0gMTEgOiByZWN0cy5ib3R0b20gKyAxMSkgLSBjb250ZXh0LmVsZW1lbnQudG9wQXJlYS5vZmZzZXRUb3AgKyAoX3cuc2Nyb2xsWSB8fCBfZC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG92ZXJSaWdodCA9IGwgKyB0b29sYmFyV2lkdGggLSBjb250ZXh0LmVsZW1lbnQudG9wQXJlYS5vZmZzZXRXaWR0aDtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHRvb2xiYXIuc3R5bGUubGVmdCA9IChsIDwgMCA/IHBhZGRpbmcgOiBvdmVyUmlnaHQgPCAwID8gbCA6IGwgLSBvdmVyUmlnaHQgLSBwYWRkaW5nKSArICdweCc7XHJcbiAgICAgICAgICAgIHRvb2xiYXIuc3R5bGUudG9wID0gKHQpICsgJ3B4JztcclxuXHJcbiAgICAgICAgICAgIGlmIChpc0RpclRvcCkge1xyXG4gICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVDbGFzcyhjb250ZXh0LmVsZW1lbnQuX2Fycm93LCAnYXJyb3ctdXAnKTtcclxuICAgICAgICAgICAgICAgIHV0aWwuYWRkQ2xhc3MoY29udGV4dC5lbGVtZW50Ll9hcnJvdywgJ2Fycm93LWRvd24nKTtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5fYXJyb3cuc3R5bGUudG9wID0gKHRvb2xiYXJIZWlnaHQpICsgJ3B4JztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlQ2xhc3MoY29udGV4dC5lbGVtZW50Ll9hcnJvdywgJ2Fycm93LWRvd24nKTtcclxuICAgICAgICAgICAgICAgIHV0aWwuYWRkQ2xhc3MoY29udGV4dC5lbGVtZW50Ll9hcnJvdywgJ2Fycm93LXVwJyk7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQuX2Fycm93LnN0eWxlLnRvcCA9ICctMTFweCc7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGFycm93X3dpZHRoID0gY29udGV4dC5lbGVtZW50Ll9hcnJvdy5vZmZzZXRXaWR0aDtcclxuICAgICAgICAgICAgY29uc3QgYXJyb3dfbGVmdCA9ICh0b29sYmFyV2lkdGggLyAyICsgKGwgPCAwID8gbCAtIGFycm93X3dpZHRoIDogb3ZlclJpZ2h0IDwgMCA/IDAgOiBvdmVyUmlnaHQgKyBhcnJvd193aWR0aCkpO1xyXG4gICAgICAgICAgICBjb25zdCBhcnJvd19wb2ludF93aWR0aCA9IGFycm93X3dpZHRoIC8gMjtcclxuICAgICAgICAgICAgY29udGV4dC5lbGVtZW50Ll9hcnJvdy5zdHlsZS5sZWZ0ID0gKGFycm93X2xlZnQgPCBhcnJvd19wb2ludF93aWR0aCA/IGFycm93X3BvaW50X3dpZHRoIDogYXJyb3dfbGVmdCArIGFycm93X3BvaW50X3dpZHRoID49IHRvb2xiYXJXaWR0aCA/IGFycm93X2xlZnQgLSBhcnJvd19wb2ludF93aWR0aCA6IGFycm93X2xlZnQpICsgJ3B4JztcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfc2hvd1Rvb2xiYXJJbmxpbmU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY29uc3QgdG9vbGJhciA9IGNvbnRleHQuZWxlbWVudC50b29sYmFyO1xyXG4gICAgICAgICAgICB0b29sYmFyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgICAgICBlZGl0b3IuX2lubGluZVRvb2xiYXJBdHRyLndpZHRoID0gdG9vbGJhci5zdHlsZS53aWR0aCA9IGNvbnRleHQub3B0aW9uLnRvb2xiYXJXaWR0aDtcclxuICAgICAgICAgICAgZWRpdG9yLl9pbmxpbmVUb29sYmFyQXR0ci50b3AgPSB0b29sYmFyLnN0eWxlLnRvcCA9ICgtMSAtIHRvb2xiYXIub2Zmc2V0SGVpZ2h0KSArICdweCc7XHJcbiAgICAgICAgICAgIGV2ZW50Lm9uU2Nyb2xsX3dpbmRvdygpO1xyXG4gICAgICAgICAgICBlZGl0b3IuX2lubGluZVRvb2xiYXJBdHRyLmlzU2hvdyA9IHRydWU7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2hpZGVUb29sYmFyOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC50b29sYmFyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgIGVkaXRvci5faW5saW5lVG9vbGJhckF0dHIuaXNTaG93ID0gZmFsc2U7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgb25LZXlEb3duX3d5c2l3eWc6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGtleUNvZGUgPSBlLmtleUNvZGU7XHJcbiAgICAgICAgICAgIGNvbnN0IHNoaWZ0ID0gZS5zaGlmdEtleTtcclxuICAgICAgICAgICAgY29uc3QgY3RybCA9IGUuY3RybEtleSB8fCBlLm1ldGFLZXk7XHJcbiAgICAgICAgICAgIGNvbnN0IGFsdCA9IGUuYWx0S2V5O1xyXG5cclxuICAgICAgICAgICAgaWYgKGVkaXRvci5faXNCYWxsb29uKSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5faGlkZVRvb2xiYXIoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZnVuY3Rpb24gc2hvcnRjdXRDb21tYW5kKGtleUNvZGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGV2ZW50Ll9zaG9ydGN1dEtleUNvZGVba2V5Q29kZV07XHJcbiAgICAgICAgICAgICAgICBpZiAoIWtleSkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgIGVkaXRvci5jb21tYW5kSGFuZGxlcih1dGlsLmdldEZvcm1hdEVsZW1lbnQoZWRpdG9yLmdldFNlbGVjdGlvbk5vZGUoKSksIGtleVswXSk7XHJcbiAgICAgICAgICAgICAgICB1dGlsLnRvZ2dsZUNsYXNzKGVkaXRvci5jb21tYW5kTWFwW2tleVsxXV0sICdvbicpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiogU2hvcnRjdXRzICovXHJcbiAgICAgICAgICAgIGlmIChjdHJsICYmICEvXig/OjE2fDE3fDE4KSQvLnRlc3Qoa2V5Q29kZSkpIHtcclxuICAgICAgICAgICAgICAgIGlmICghKCFzaGlmdCAmJiBrZXlDb2RlID09PSA4MykgJiYgc2hvcnRjdXRDb21tYW5kKGtleUNvZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyoqIGRlZmF1bHQga2V5IGFjdGlvbiAqL1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb25Ob2RlID0gZWRpdG9yLmdldFNlbGVjdGlvbk5vZGUoKTtcclxuICAgICAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDg6IC8qKmJhY2tzcGFjZSBrZXkqL1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh1dGlsLmlzRm9ybWF0RWxlbWVudChzZWxlY3Rpb25Ob2RlKSAmJiB1dGlsLmlzV3lzaXd5Z0RpdihzZWxlY3Rpb25Ob2RlLnBhcmVudE5vZGUpICYmIHNlbGVjdGlvbk5vZGUucHJldmlvdXNTaWJsaW5nID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uTm9kZS5pbm5lckhUTUwgPSB1dGlsLnplcm9XaWR0aFNwYWNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA5OlxyXG4gICAgICAgICAgICAgICAgICAgIC8qKnRhYiBrZXkqL1xyXG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY3RybCB8fCBhbHQpIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBlZGl0b3IuY29udHJvbGxlcnNPZmYoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gc2VsZWN0aW9uTm9kZSB8fCBlZGl0b3IuZ2V0U2VsZWN0aW9uTm9kZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICghdXRpbC5pc0NlbGwoY3VycmVudE5vZGUpICYmICF1dGlsLmlzV3lzaXd5Z0RpdihjdXJyZW50Tm9kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlICYmIHV0aWwuaXNDZWxsKGN1cnJlbnROb2RlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWJsZSA9IHV0aWwuZ2V0UGFyZW50RWxlbWVudChjdXJyZW50Tm9kZSwgJ3RhYmxlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxzID0gdXRpbC5nZXRMaXN0Q2hpbGRyZW4odGFibGUsIHV0aWwuaXNDZWxsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlkeCA9IHNoaWZ0ID8gdXRpbC5wcmV2SWR4KGNlbGxzLCBjdXJyZW50Tm9kZSkgOiB1dGlsLm5leHRJZHgoY2VsbHMsIGN1cnJlbnROb2RlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZHggPT09IGNlbGxzLmxlbmd0aCAmJiAhc2hpZnQpIGlkeCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZHggPT09IC0xICYmIHNoaWZ0KSBpZHggPSBjZWxscy5sZW5ndGggLSAxO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbW92ZUNlbGwgPSBjZWxsc1tpZHhdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1vdmVDZWxsKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3Iuc2V0UmFuZ2UobW92ZUNlbGwsIDAsIG1vdmVDZWxsLCAwKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLyoqIGZvcm1hdCBUYWcgKi9cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW5lcyA9IGVkaXRvci5nZXRTZWxlY3RlZEZvcm1hdEVsZW1lbnRzKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghc2hpZnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFiVGV4dCA9IHV0aWwuY3JlYXRlVGV4dE5vZGUobmV3IEFycmF5KGVkaXRvci5fdmFyaWFibGUudGFiU2l6ZSArIDEpLmpvaW4oJ1xcdTAwQTAnKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lcy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvci5pbnNlcnROb2RlKHRhYlRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yLnNldFJhbmdlKHRhYlRleHQsIGVkaXRvci5fdmFyaWFibGUudGFiU2l6ZSwgdGFiVGV4dCwgZWRpdG9yLl92YXJpYWJsZS50YWJTaXplKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBsaW5lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzW2ldLmluc2VydEJlZm9yZSh0YWJUZXh0LmNsb25lTm9kZShmYWxzZSksIGxpbmVzW2ldLmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGxpbmVzLmxlbmd0aCwgY2hpbGQ7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSBsaW5lc1tpXS5maXJzdENoaWxkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC9eXFxzezEsNH0kLy50ZXN0KGNoaWxkLnRleHRDb250ZW50KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlSXRlbShjaGlsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKC9eXFxzezEsNH0vLnRlc3QoY2hpbGQudGV4dENvbnRlbnQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQudGV4dENvbnRlbnQgPSBjaGlsZC50ZXh0Q29udGVudC5yZXBsYWNlKC9eXFxzezEsNH0vLCAnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodXNlckZ1bmN0aW9uLm9uS2V5RG93bikgdXNlckZ1bmN0aW9uLm9uS2V5RG93bihlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBvbktleVVwX3d5c2l3eWc6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGVkaXRvci5fZWRpdG9yUmFuZ2UoKTtcclxuICAgICAgICAgICAgZWRpdG9yLmNvbnRyb2xsZXJzT2ZmKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbk5vZGUgPSBlZGl0b3IuZ2V0U2VsZWN0aW9uTm9kZSgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGVkaXRvci5faXNCYWxsb29uICYmICFlZGl0b3IuZ2V0UmFuZ2UoKS5jb2xsYXBzZWQpIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50Ll9zaG93VG9vbGJhckJhbGxvb24oKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyoqIHdoZW4gZm9ybWF0IHRhZyBkZWxldGVkICovXHJcbiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDggJiYgdXRpbC5pc1d5c2l3eWdEaXYoc2VsZWN0aW9uTm9kZSkgJiYgY29udGV4dC5lbGVtZW50Lnd5c2l3eWcudGV4dENvbnRlbnQubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IG9Gb3JtYXRUYWcgPSB1dGlsLmNyZWF0ZUVsZW1lbnQodXRpbC5pc0Zvcm1hdEVsZW1lbnQoZWRpdG9yLl92YXJpYWJsZS5jdXJyZW50Tm9kZXNbMF0pID8gZWRpdG9yLl92YXJpYWJsZS5jdXJyZW50Tm9kZXNbMF0gOiAnUCcpO1xyXG4gICAgICAgICAgICAgICAgb0Zvcm1hdFRhZy5pbm5lckhUTUwgPSB1dGlsLnplcm9XaWR0aFNwYWNlO1xyXG5cclxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbk5vZGUuYXBwZW5kQ2hpbGQob0Zvcm1hdFRhZyk7XHJcbiAgICAgICAgICAgICAgICBlZGl0b3Iuc2V0UmFuZ2Uob0Zvcm1hdFRhZywgMCwgb0Zvcm1hdFRhZywgMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICgodXRpbC5pc1d5c2l3eWdEaXYoc2VsZWN0aW9uTm9kZS5wYXJlbnRFbGVtZW50KSB8fCB1dGlsLmlzUmFuZ2VGb3JtYXRFbGVtZW50KHNlbGVjdGlvbk5vZGUucGFyZW50RWxlbWVudCkpICYmIHNlbGVjdGlvbk5vZGUubm9kZVR5cGUgPT09IDMpIHtcclxuICAgICAgICAgICAgICAgIGVkaXRvci5leGVjQ29tbWFuZCgnZm9ybWF0QmxvY2snLCBmYWxzZSwgdXRpbC5pc1d5c2l3eWdEaXYoc2VsZWN0aW9uTm9kZS5wYXJlbnRFbGVtZW50KSA/ICdQJyA6ICdESVYnKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50Ll9maW5kQnV0dG9uRWZmZWN0VGFnKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChldmVudC5fZGlyZWN0aW9uS2V5S2V5Q29kZS50ZXN0KGUua2V5Q29kZSkpIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50Ll9maW5kQnV0dG9uRWZmZWN0VGFnKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh1c2VyRnVuY3Rpb24ub25LZXlVcCkgdXNlckZ1bmN0aW9uLm9uS2V5VXAoZSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgb25TY3JvbGxfd3lzaXd5ZzogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgZWRpdG9yLmNvbnRyb2xsZXJzT2ZmKCk7XHJcbiAgICAgICAgICAgIGlmICh1c2VyRnVuY3Rpb24ub25TY3JvbGwpIHVzZXJGdW5jdGlvbi5vblNjcm9sbChlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBvbkRyb3Bfd3lzaXd5ZzogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgY29uc3QgZmlsZXMgPSBlLmRhdGFUcmFuc2Zlci5maWxlcztcclxuXHJcbiAgICAgICAgICAgIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBlZGl0b3IuZm9jdXMoKTtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgZWRpdG9yLmNhbGxQbHVnaW4oJ2ltYWdlJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuaW1hZ2UuaW1nSW5wdXRGaWxlLmZpbGVzID0gZmlsZXM7XHJcbiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLnBsdWdpbnMuaW1hZ2Uub25SZW5kZXJfaW1nSW5wdXQuY2FsbChlZGl0b3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuaW1hZ2UuaW1nSW5wdXRGaWxlLmZpbGVzID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodXNlckZ1bmN0aW9uLm9uRHJvcCkgdXNlckZ1bmN0aW9uLm9uRHJvcChlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBvbk1vdXNlRG93bl9yZXNpemluZ0JhcjogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgIGVkaXRvci5fdmFyaWFibGUucmVzaXplQ2xpZW50WSA9IGUuY2xpZW50WTtcclxuICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LnJlc2l6ZUJhY2tncm91bmQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcblxyXG4gICAgICAgICAgICBmdW5jdGlvbiBjbG9zdXJlRnVuYygpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5yZXNpemVCYWNrZ3JvdW5kLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgICAgICBfZC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBldmVudC5fcmVzaXplX2VkaXRvcik7XHJcbiAgICAgICAgICAgICAgICBfZC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgY2xvc3VyZUZ1bmMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBfZC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBldmVudC5fcmVzaXplX2VkaXRvcik7XHJcbiAgICAgICAgICAgIF9kLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBjbG9zdXJlRnVuYyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3Jlc2l6ZV9lZGl0b3I6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc2l6ZUludGVydmFsID0gY29udGV4dC5lbGVtZW50LmVkaXRvckFyZWEub2Zmc2V0SGVpZ2h0ICsgKGUuY2xpZW50WSAtIGVkaXRvci5fdmFyaWFibGUucmVzaXplQ2xpZW50WSk7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC53eXNpd3lnLnN0eWxlLmhlaWdodCA9IGNvbnRleHQuZWxlbWVudC5jb2RlLnN0eWxlLmhlaWdodCA9IChyZXNpemVJbnRlcnZhbCA8IGVkaXRvci5fdmFyaWFibGUubWluUmVzaXppbmdTaXplID8gZWRpdG9yLl92YXJpYWJsZS5taW5SZXNpemluZ1NpemUgOiByZXNpemVJbnRlcnZhbCkgKyAncHgnO1xyXG4gICAgICAgICAgICBlZGl0b3IuX3ZhcmlhYmxlLnJlc2l6ZUNsaWVudFkgPSBlLmNsaWVudFk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgb25SZXNpemVfd2luZG93OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChjb250ZXh0LmVsZW1lbnQudG9vbGJhci5vZmZzZXRXaWR0aCA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgaWYgKGVkaXRvci5fdmFyaWFibGUuaXNGdWxsU2NyZWVuKSB7XHJcbiAgICAgICAgICAgICAgICBlZGl0b3IuX3ZhcmlhYmxlLmlubmVySGVpZ2h0X2Z1bGxTY3JlZW4gKz0gKF93LmlubmVySGVpZ2h0IC0gY29udGV4dC5lbGVtZW50LnRvb2xiYXIub2Zmc2V0SGVpZ2h0KSAtIGVkaXRvci5fdmFyaWFibGUuaW5uZXJIZWlnaHRfZnVsbFNjcmVlbjtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5lZGl0b3JBcmVhLnN0eWxlLmhlaWdodCA9IGVkaXRvci5fdmFyaWFibGUuaW5uZXJIZWlnaHRfZnVsbFNjcmVlbiArICdweCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZWRpdG9yLl92YXJpYWJsZS5fc3RpY2t5KSB7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQudG9vbGJhci5zdHlsZS53aWR0aCA9IChjb250ZXh0LmVsZW1lbnQudG9wQXJlYS5vZmZzZXRXaWR0aCAtIDIpICsgJ3B4JztcclxuICAgICAgICAgICAgICAgIGV2ZW50Lm9uU2Nyb2xsX3dpbmRvdygpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBlZGl0b3IuY29udHJvbGxlcnNPZmYoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBvblNjcm9sbF93aW5kb3c6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKGVkaXRvci5fdmFyaWFibGUuaXNGdWxsU2NyZWVuIHx8IGNvbnRleHQuZWxlbWVudC50b29sYmFyLm9mZnNldFdpZHRoID09PSAwKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gY29udGV4dC5lbGVtZW50O1xyXG4gICAgICAgICAgICBjb25zdCBlZGl0b3JIZWlnaHQgPSBlbGVtZW50LmVkaXRvckFyZWEub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICAgICAgICBjb25zdCBlZGl0b3JUb3AgPSBlbGVtZW50LnRvcEFyZWEub2Zmc2V0VG9wIC0gKGVkaXRvci5faXNJbmxpbmUgPyBlbGVtZW50LnRvb2xiYXIub2Zmc2V0SGVpZ2h0IDogMCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHkgPSAodGhpcy5zY3JvbGxZIHx8IF9kLmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3ApICsgY29udGV4dC5vcHRpb24uc3RpY2t5VG9vbGJhcjtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICh5IDwgZWRpdG9yVG9wKSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5fb2ZmU3RpY2t5VG9vbGJhcihlbGVtZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh5ICsgZWRpdG9yLl92YXJpYWJsZS5taW5SZXNpemluZ1NpemUgPj0gZWRpdG9ySGVpZ2h0ICsgZWRpdG9yVG9wKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWVkaXRvci5fdmFyaWFibGUuX3N0aWNreSkgZXZlbnQuX29uU3RpY2t5VG9vbGJhcihlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQudG9vbGJhci5zdHlsZS50b3AgPSAoZWRpdG9ySGVpZ2h0ICsgZWRpdG9yVG9wICsgY29udGV4dC5vcHRpb24uc3RpY2t5VG9vbGJhciAteSAtIGVkaXRvci5fdmFyaWFibGUubWluUmVzaXppbmdTaXplKSArICdweCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoeSA+PSBlZGl0b3JUb3ApIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50Ll9vblN0aWNreVRvb2xiYXIoZWxlbWVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25TdGlja3lUb29sYmFyOiBmdW5jdGlvbiAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICBpZiAoIWVkaXRvci5faXNJbmxpbmUpIHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuX3N0aWNreUR1bW15LnN0eWxlLmhlaWdodCA9IGVsZW1lbnQudG9vbGJhci5vZmZzZXRIZWlnaHQgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5fc3RpY2t5RHVtbXkuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGVsZW1lbnQudG9vbGJhci5zdHlsZS50b3AgPSBjb250ZXh0Lm9wdGlvbi5zdGlja3lUb29sYmFyICsgJ3B4JztcclxuICAgICAgICAgICAgZWxlbWVudC50b29sYmFyLnN0eWxlLndpZHRoID0gZWRpdG9yLl9pc0lubGluZSA/IGVkaXRvci5faW5saW5lVG9vbGJhckF0dHIud2lkdGggOiBlbGVtZW50LnRvb2xiYXIub2Zmc2V0V2lkdGggKyAncHgnO1xyXG4gICAgICAgICAgICB1dGlsLmFkZENsYXNzKGVsZW1lbnQudG9vbGJhciwgJ3N1bi1lZGl0b3Itc3RpY2t5Jyk7XHJcbiAgICAgICAgICAgIGVkaXRvci5fdmFyaWFibGUuX3N0aWNreSA9IHRydWU7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX29mZlN0aWNreVRvb2xiYXI6IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQuX3N0aWNreUR1bW15LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgIGVsZW1lbnQudG9vbGJhci5zdHlsZS50b3AgPSBlZGl0b3IuX2lzSW5saW5lID8gZWRpdG9yLl9pbmxpbmVUb29sYmFyQXR0ci50b3AgOiAnJztcclxuICAgICAgICAgICAgZWxlbWVudC50b29sYmFyLnN0eWxlLndpZHRoID0gZWRpdG9yLl9pc0lubGluZSA/IGVkaXRvci5faW5saW5lVG9vbGJhckF0dHIud2lkdGggOiAnJztcclxuICAgICAgICAgICAgZWxlbWVudC5lZGl0b3JBcmVhLnN0eWxlLm1hcmdpblRvcCA9ICcnO1xyXG4gICAgICAgICAgICB1dGlsLnJlbW92ZUNsYXNzKGVsZW1lbnQudG9vbGJhciwgJ3N1bi1lZGl0b3Itc3RpY2t5Jyk7XHJcbiAgICAgICAgICAgIGVkaXRvci5fdmFyaWFibGUuX3N0aWNreSA9IGZhbHNlO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9jb2RlVmlld0F1dG9TY3JvbGw6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LmNvZGUuc3R5bGUuaGVpZ2h0ID0gY29udGV4dC5lbGVtZW50LmNvZGUuc2Nyb2xsSGVpZ2h0ICsgJ3B4JztcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBvblBhc3RlX3d5c2l3eWc6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGlmICghZS5jbGlwYm9hcmREYXRhLmdldERhdGEpIHJldHVybiB0cnVlO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgY2xlYW5EYXRhID0gdXRpbC5jbGVhbkhUTUwoZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQvaHRtbCcpKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChjbGVhbkRhdGEpIHtcclxuICAgICAgICAgICAgICAgIGVkaXRvci5leGVjQ29tbWFuZCgnaW5zZXJ0SFRNTCcsIGZhbHNlLCBjbGVhbkRhdGEpO1xyXG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLyoqIGFkZCBldmVudCBsaXN0ZW5lcnMgKi9cclxuICAgIC8qKiB0b29sYmFyIGV2ZW50ICovXHJcbiAgICBjb250ZXh0LmVsZW1lbnQudG9vbGJhci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBldmVudC5vbk1vdXNlRG93bl90b29sYmFyLCBmYWxzZSk7XHJcbiAgICBjb250ZXh0LmVsZW1lbnQudG9vbGJhci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50Lm9uQ2xpY2tfdG9vbGJhciwgZmFsc2UpO1xyXG4gICAgLyoqIGVkaXRvciBhcmVhICovXHJcbiAgICBjb250ZXh0LmVsZW1lbnQucmVsYXRpdmUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlZGl0b3IuZm9jdXMuYmluZChlZGl0b3IpLCBmYWxzZSk7XHJcbiAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgZXZlbnQub25Nb3VzZVVwX3d5c2l3eWcsIGZhbHNlKTtcclxuICAgIGNvbnRleHQuZWxlbWVudC53eXNpd3lnLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnQub25DbGlja193eXNpd3lnLCBmYWxzZSk7XHJcbiAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBldmVudC5vblNjcm9sbF93eXNpd3lnLCBmYWxzZSk7XHJcbiAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZXZlbnQub25LZXlEb3duX3d5c2l3eWcsIGZhbHNlKTtcclxuICAgIGNvbnRleHQuZWxlbWVudC53eXNpd3lnLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgZXZlbnQub25LZXlVcF93eXNpd3lnLCBmYWxzZSk7XHJcbiAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywgZXZlbnQub25Ecm9wX3d5c2l3eWcsIGZhbHNlKTtcclxuICAgIGNvbnRleHQuZWxlbWVudC53eXNpd3lnLmFkZEV2ZW50TGlzdGVuZXIoJ3Bhc3RlJywgZXZlbnQub25QYXN0ZV93eXNpd3lnLCBmYWxzZSk7XHJcbiAgICBcclxuICAgIC8qKiBjb2RlIHZpZXcgYXJlYSBhdXRvIGxpbmUgKi9cclxuICAgIGlmIChjb250ZXh0Lm9wdGlvbi5oZWlnaHQgPT09ICdhdXRvJykgY29udGV4dC5lbGVtZW50LmNvZGUuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBldmVudC5fY29kZVZpZXdBdXRvU2Nyb2xsLCBmYWxzZSk7XHJcblxyXG4gICAgLyoqIHJlc2l6aW5nQmFyICovXHJcbiAgICBpZiAoY29udGV4dC5lbGVtZW50LnJlc2l6aW5nQmFyKSB7XHJcbiAgICAgICAgaWYgKC9cXGQrLy50ZXN0KGNvbnRleHQub3B0aW9uLmhlaWdodCkpIHtcclxuICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LnJlc2l6aW5nQmFyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGV2ZW50Lm9uTW91c2VEb3duX3Jlc2l6aW5nQmFyLCBmYWxzZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdXRpbC5hZGRDbGFzcyhjb250ZXh0LmVsZW1lbnQucmVzaXppbmdCYXIsICdub25lLXJlc2l6ZScpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogaW5saW5lIGVkaXRvciAqL1xyXG4gICAgaWYgKGVkaXRvci5faXNJbmxpbmUpIHtcclxuICAgICAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIGV2ZW50Ll9zaG93VG9vbGJhcklubGluZSwgZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChlZGl0b3IuX2lzSW5saW5lIHx8IGVkaXRvci5faXNCYWxsb29uKSB7XHJcbiAgICAgICAgY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIGV2ZW50Ll9oaWRlVG9vbGJhciwgZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvKiogd2luZG93IGV2ZW50ICovXHJcbiAgICBfdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBldmVudC5vblJlc2l6ZV93aW5kb3csIGZhbHNlKTtcclxuICAgIGlmIChjb250ZXh0Lm9wdGlvbi5zdGlja3lUb29sYmFyID4gLTEpIF93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGV2ZW50Lm9uU2Nyb2xsX3dpbmRvdywgZmFsc2UpO1xyXG5cclxuICAgIC8qKiBhZGQgcGx1Z2luIHRvIHBsdWdpbnMgb2JqZWN0ICovXHJcbiAgICBpZiAocGx1Z2lucykge1xyXG4gICAgICAgIE9iamVjdC5rZXlzKHBsdWdpbnMpLm1hcChmdW5jdGlvbihrZXkpIHtcclxuICAgICAgICAgICAgbGV0IHBsdWdpbiA9IHBsdWdpbnNba2V5XTtcclxuICAgICAgICAgICAgZWRpdG9yLnBsdWdpbnNbcGx1Z2luLm5hbWVdID0gdXRpbC5jb3B5T2JqKHBsdWdpbik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFVzZXIgZnVuY3Rpb24gKi9cclxuICAgIGNvbnN0IHVzZXJGdW5jdGlvbiA9IHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gRXZlbnQgZnVuY3Rpb25zXHJcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IC0gRXZlbnQgT2JqZWN0XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgb25TY3JvbGw6IG51bGwsXHJcbiAgICAgICAgb25DbGljazogbnVsbCxcclxuICAgICAgICBvbktleURvd246IG51bGwsXHJcbiAgICAgICAgb25LZXlVcDogbnVsbCxcclxuICAgICAgICBvbkRyb3A6IG51bGwsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBDYWxsZWQgd2hlbiB0aGUgaW1hZ2UgaXMgdXBsb2FkZWQgb3IgdGhlIHVwbG9hZGVkIGltYWdlIGlzIGRlbGV0ZWRcclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldEltZ0VsZW1lbnQgLSBDdXJyZW50IGltZyBlbGVtZW50XHJcbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4IC0gVXBsb2FkZWQgaW5kZXhcclxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzRGVsZXRlIC0gV2hldGhlciBvciBub3QgaXQgd2FzIGNhbGxlZCBhZnRlciB0aGUgZGVsZXRlIG9wZXJhdGlvblxyXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbWFnZUluZm8gLSBJbWFnZSBpbmZvIG9iamVjdFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIG9uSW1hZ2VVcGxvYWQ6IG51bGwsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBDYWxsZWQgd2hlbiB0aGUgaW1hZ2UgaXMgdXBsb2FkIGZhaWxlZFxyXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBlcnJvck1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlXHJcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlc3VsdCAtIFJlc3VsdCBpbmZvIE9iamVjdFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIG9uSW1hZ2VVcGxvYWRFcnJvcjogbnVsbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIE9wZW4gYSBub3RpY2UgYXJlYVxyXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIC0gTm90aWNlIG1lc3NhZ2VcclxuICAgICAgICAgKi9cclxuICAgICAgICBub3RpY2VPcGVuOiBmdW5jdGlvbiAobWVzc2FnZSkge1xyXG4gICAgICAgICAgICBlZGl0b3IuYWRkTW9kdWxlKFtub3RpY2VdKTtcclxuICAgICAgICAgICAgbm90aWNlLm9wZW4uY2FsbChlZGl0b3IsIG1lc3NhZ2UpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBDbG9zZSBhIG5vdGljZSBhcmVhXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgbm90aWNlQ2xvc2U6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgZWRpdG9yLmFkZE1vZHVsZShbbm90aWNlXSk7XHJcbiAgICAgICAgICAgIG5vdGljZS5jbG9zZS5jYWxsKGVkaXRvcik7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIENvcHlpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBlZGl0b3IgdG8gdGhlIG9yaWdpbmFsIHRleHRhcmVhXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc2F2ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQub3JpZ2luRWxlbWVudC52YWx1ZSA9IGVkaXRvci5nZXRDb250ZW50cygpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBzdW5lZGl0b3IncyBjb250ZXh0IG9iamVjdC4gQ29udGFpbnMgc2V0dGluZ3MsIHBsdWdpbnMsIGFuZCBjYWNoZWQgZWxlbWVudCBvYmplY3RzXHJcbiAgICAgICAgICogQHJldHVybnMge09iamVjdH1cclxuICAgICAgICAgKi9cclxuICAgICAgICBnZXRDb250ZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBjb250ZW50cyBvZiB0aGUgc3VuZWRpdG9yXHJcbiAgICAgICAgICogQHJldHVybnMge1N0cmluZ31cclxuICAgICAgICAgKi9cclxuICAgICAgICBnZXRDb250ZW50czogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZWRpdG9yLmdldENvbnRlbnRzKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEdldHMgdXBsb2FkZWQgaW1hZ2VzIGluZm9ybWF0aW9uc1xyXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX1cclxuICAgICAgICAgKi9cclxuICAgICAgICBnZXRJbWFnZXNJbmZvOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlZGl0b3IuX3ZhcmlhYmxlLl9pbWFnZXNJbmZvO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBJbnNlcnRzIGFuIEhUTUwgZWxlbWVudCBvciBIVE1MIHN0cmluZyBvciBwbGFpbiBzdHJpbmcgYXQgdGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uXHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fFN0cmluZ30gaHRtbCAtIEhUTUwgRWxlbWVudCBvciBIVE1MIHN0cmluZyBvciBwbGFpbiBzdHJpbmdcclxuICAgICAgICAgKi9cclxuICAgICAgICBpbnNlcnRIVE1MOiBmdW5jdGlvbiAoaHRtbCkge1xyXG4gICAgICAgICAgICBpZiAoIWh0bWwubm9kZVR5cGUgfHwgaHRtbC5ub2RlVHlwZSAhPT0gMSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcGxhdGUgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBodG1sO1xyXG4gICAgICAgICAgICAgICAgaHRtbCA9IHRlbXBsYXRlLmZpcnN0Q2hpbGQgfHwgdGVtcGxhdGUuY29udGVudC5maXJzdENoaWxkO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBlZGl0b3IuaW5zZXJ0Tm9kZShodG1sKTtcclxuICAgICAgICAgICAgZWRpdG9yLmZvY3VzKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIENoYW5nZSB0aGUgY29udGVudHMgb2YgdGhlIHN1bmVkaXRvclxyXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb250ZW50cyAtIENvbnRlbnRzIHRvIElucHV0XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc2V0Q29udGVudHM6IGZ1bmN0aW9uIChjb250ZW50cykge1xyXG4gICAgICAgICAgICBpZiAoZWRpdG9yLl92YXJpYWJsZS53eXNpd3lnQWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5pbm5lckhUTUwgPSB1dGlsLmNvbnZlcnRDb250ZW50c0ZvckVkaXRvcihjb250ZW50cyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQuY29kZS52YWx1ZSA9IGNvbnRlbnRzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEFkZCBjb250ZW50cyB0byB0aGUgc3VuZWRpdG9yXHJcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGNvbnRlbnRzIC0gQ29udGVudHMgdG8gSW5wdXRcclxuICAgICAgICAgKi9cclxuICAgICAgICBhcHBlbmRDb250ZW50czogZnVuY3Rpb24gKGNvbnRlbnRzKSB7XHJcbiAgICAgICAgICAgIGlmIChlZGl0b3IuX3ZhcmlhYmxlLnd5c2l3eWdBY3RpdmUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC53eXNpd3lnLmlubmVySFRNTCArPSB1dGlsLmNvbnZlcnRDb250ZW50c0ZvckVkaXRvcihjb250ZW50cyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQuY29kZS52YWx1ZSArPSBjb250ZW50cztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBEaXNhYmxlIHRoZSBzdW5lZGl0b3JcclxuICAgICAgICAgKi9cclxuICAgICAgICBkaXNhYmxlZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb250ZXh0LnRvb2wuY292ZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC53eXNpd3lnLnNldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJywgZmFsc2UpO1xyXG4gICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQuY29kZS5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEVuYWJsZWQgdGhlIHN1bmVkaXRvclxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGVuYWJsZWQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY29udGV4dC50b29sLmNvdmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC53eXNpd3lnLnNldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJywgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5jb2RlLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gU2hvdyB0aGUgc3VuZWRpdG9yXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc2hvdzogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb25zdCB0b3BBcmVhU3R5bGUgPSBjb250ZXh0LmVsZW1lbnQudG9wQXJlYS5zdHlsZTtcclxuICAgICAgICAgICAgaWYgKHRvcEFyZWFTdHlsZS5kaXNwbGF5ID09PSAnbm9uZScpIHRvcEFyZWFTdHlsZS5kaXNwbGF5ID0gY29udGV4dC5vcHRpb24uZGlzcGxheTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gSGlkZSB0aGUgc3VuZWRpdG9yXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaGlkZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQudG9wQXJlYS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBEZXN0cm95IHRoZSBzdW5lZGl0b3JcclxuICAgICAgICAgKi9cclxuICAgICAgICBkZXN0cm95OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIC8qKiByZW1vdmUgd2luZG93IGV2ZW50IGxpc3RlbmVycyAqL1xyXG4gICAgICAgICAgICBfdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBldmVudC5vblJlc2l6ZV93aW5kb3cpO1xyXG4gICAgICAgICAgICBfdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBldmVudC5vblNjcm9sbF93aW5kb3cpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLyoqIHJlbW92ZSBlbGVtZW50ICovXHJcbiAgICAgICAgICAgIHV0aWwucmVtb3ZlSXRlbShjb250ZXh0LmVsZW1lbnQudG9wQXJlYSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm9uU2Nyb2xsID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5vbkNsaWNrID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5vbktleURvd24gPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLm9uS2V5VXAgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLm9uRHJvcCA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuc2F2ZSA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMub25JbWFnZVVwbG9hZCA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMub25JbWFnZVVwbG9hZEVycm9yID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5ub3RpY2VPcGVuID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5ub3RpY2VDbG9zZSA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udGV4dCA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udGVudHMgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmdldEltYWdlc0luZm8gPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmluc2VydEhUTUwgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLnNldENvbnRlbnRzID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5hcHBlbmRDb250ZW50cyA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZWQgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmVuYWJsZWQgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLnNob3cgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmhpZGUgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3kgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgY29udGV4dCA9IG51bGw7XHJcbiAgICAgICAgICAgIHBsdWdpbnMgPSBudWxsO1xyXG4gICAgICAgICAgICBsYW5nID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB1c2VyRnVuY3Rpb247XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjb3JlOyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUlBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQVlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVEE7QUFDQTtBQVdBOzs7Ozs7Ozs7OztBQVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWpCQTtBQUNBO0FBbUJBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQVhBO0FBYUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVEE7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FBY0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFDQTtBQUNBOzs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUFXQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUFXQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBdkRBO0FBQ0E7QUF5REE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBYUE7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUE3bERBO0FBZ21EQTs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUkE7QUFXQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTlEQTtBQUNBO0FBZ0VBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFsa0JBO0FBcWtCQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztBQU9BO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBdkxBO0FBMExBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/lib/core.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./util */ \"./src/lib/util.js\");\n/* harmony import */ var _plugins_modules_notice__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../plugins/modules/notice */ \"./src/plugins/modules/notice.js\");\n/*\r\n * wysiwyg web editor\r\n *\r\n * suneditor.js\r\n * Copyright 2017 JiHong Lee.\r\n * MIT license.\r\n */\n\n\n\n\n/**\r\n * @description SunEditor core function\r\n * @param context\r\n * @param plugins\r\n * @param lang\r\n * @returns {Object} UserFunction Object\r\n */\n\nconst core = function (context, plugins, lang) {\n const _d = document;\n const _w = window;\n /**\r\n * @description editor core object\r\n * should always bind this object when registering an event in the plug-in.\r\n */\n\n const editor = {\n /**\r\n * @description Elements and user options parameters of the suneditor\r\n */\n context: context,\n\n /**\r\n * @description loaded plugins\r\n */\n plugins: {},\n\n /**\r\n * @description Whether the plugin is initialized\r\n */\n initPlugins: {},\n\n /**\r\n * @description loaded language\r\n */\n lang: lang,\n\n /**\r\n * @description dialog element\r\n */\n dialogForm: null,\n\n /**\r\n * @description current subment name\r\n * @private\r\n */\n _submenuName: '',\n\n /**\r\n * @description submenu element\r\n */\n submenu: null,\n\n /**\r\n * @description binded submenuOff method\r\n * @private\r\n */\n _bindedSubmenuOff: null,\n\n /**\r\n * @description active button element in submenu\r\n */\n submenuActiveButton: null,\n\n /**\r\n * @description The elements array to be processed unvisible when the controllersOff function is executed (resizing, link modified button, table controller)\r\n */\n controllerArray: [],\n\n /**\r\n * @description binded controllersOff method\r\n * @private\r\n */\n _bindControllersOff: null,\n\n /**\r\n * @description An array of buttons whose class name is not \"code-view-enabled\"\r\n */\n codeViewDisabledButtons: context.element.toolbar.querySelectorAll('.sun-editor-id-toolbar button:not([class~=\"code-view-enabled\"])'),\n\n /**\r\n * @description Is inline mode?\r\n * @private\r\n */\n _isInline: /inline/i.test(context.option.mode),\n\n /**\r\n * @description Is balloon mode?\r\n * @private\r\n */\n _isBalloon: /balloon/i.test(context.option.mode),\n\n /**\r\n * @description Required value when using inline mode to sticky toolbar\r\n * @private\r\n */\n _inlineToolbarAttr: {\n width: 0,\n height: 0,\n isShow: false\n },\n\n /**\r\n * @description Variable that controls the \"blur\" event in the editor of inline or balloon mode when the focus is moved to submenu\r\n * @private\r\n */\n _notHideToolbar: false,\n\n /**\r\n * @description An user event function when image uploaded success or remove image\r\n * @private\r\n */\n _imageUpload: function (targetImgElement, index, isDelete, imageInfo) {\n if (typeof userFunction.onImageUpload === 'function') userFunction.onImageUpload(targetImgElement, index * 1, isDelete, imageInfo);\n },\n\n /**\r\n * @description An user event function when image upload failed\r\n * @private\r\n */\n _imageUploadError: function (errorMessage, result) {\n if (typeof userFunction.onImageUploadError === 'function') return userFunction.onImageUploadError(errorMessage, result);\n return true;\n },\n\n /**\r\n * @description Elements that need to change text or className for each selection change\r\n * @property {Element} FORMAT - format button\r\n * @property {Element} FONT - font family button\r\n * @property {Element} SIZE - font size button\r\n * @property {Element} B - bold button\r\n * @property {Element} U - underline button\r\n * @property {Element} I - italic button\r\n * @property {Element} STRIKE - strike button\r\n * @property {Element} SUB - subscript button\r\n * @property {Element} SUP - superscript button\r\n */\n commandMap: {\n FORMAT: context.tool.format,\n FONT: context.tool.font,\n SIZE: context.tool.fontSize,\n B: context.tool.bold,\n U: context.tool.underline,\n I: context.tool.italic,\n STRIKE: context.tool.strike,\n SUB: context.tool.subscript,\n SUP: context.tool.superscript\n },\n\n /**\r\n * @description Variables used internally in editor operation\r\n * @property {Boolean} wysiwygActive - The wysiwyg frame or code view state\r\n * @property {Boolean} isFullScreen - State of full screen\r\n * @property {Number} innerHeight_fullScreen - InnerHeight in editor when in full screen\r\n * @property {Number} resizeClientY - Remember the vertical size of the editor before resizing the editor (Used when calculating during resize operation)\r\n * @property {Number} tabSize - Indented size when tab button clicked (4)\r\n * @property {Number} minResizingSize - Minimum size of editing area when resized (65)\r\n * @property {Array} currentNodes - An array of the current cursor's node structure\r\n * @private\r\n */\n _variable: {\n wysiwygActive: true,\n isFullScreen: false,\n innerHeight_fullScreen: 0,\n resizeClientY: 0,\n tabSize: 4,\n minResizingSize: 65,\n currentNodes: [],\n _range: null,\n _selectionNode: null,\n _originCssText: context.element.topArea.style.cssText,\n _bodyOverflow: '',\n _editorAreaOriginCssText: '',\n _wysiwygOriginCssText: '',\n _codeOriginCssText: '',\n _sticky: false,\n _imagesInfo: [],\n _imageIndex: 0\n },\n\n /**\r\n * @description If the plugin is not added, add the plugin and call the 'add' function.\r\n * If the plugin is added call callBack function.\r\n * @param {String} pluginName - The name of the plugin to call\r\n * @param {function} callBackFunction - Function to be executed immediately after module call\r\n */\n callPlugin: function (pluginName, callBackFunction) {\n if (!this.plugins[pluginName]) {\n throw Error('[SUNEDITOR.core.callPlugin.fail] The called plugin does not exist or is in an invalid format. (pluginName:\"' + pluginName + '\")');\n } else if (!this.initPlugins[pluginName]) {\n this.plugins[pluginName].add(this, this.plugins[pluginName].buttonElement);\n this.initPlugins[pluginName] = true;\n }\n\n callBackFunction();\n },\n\n /**\r\n * @description If the module is not added, add the module and call the 'add' function\r\n * @param {Array} moduleArray - module object's Array [dialog, resizing]\r\n */\n addModule: function (moduleArray) {\n let moduleName = '';\n\n for (let i = 0, len = moduleArray.length; i < len; i++) {\n moduleName = moduleArray[i].name;\n\n if (!this.plugins[moduleName]) {\n this.plugins[moduleName] = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].copyObj(moduleArray[i]);\n this.plugins[moduleName].add(this);\n }\n }\n },\n\n /**\r\n * @description Enabled submenu\r\n * @param {Element} element - Submenu element to call\r\n */\n submenuOn: function (element) {\n const submenuName = this._submenuName = element.getAttribute('data-command');\n if (this.plugins[submenuName].on) this.plugins[submenuName].on.call(this);\n this.submenu = element.nextElementSibling;\n this.submenu.style.display = 'block';\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].addClass(element, 'on');\n this.submenuActiveButton = element;\n const overLeft = this.context.element.toolbar.offsetWidth - (element.parentElement.offsetLeft + this.submenu.offsetWidth);\n if (overLeft < 0) this.submenu.style.left = overLeft + 'px';else this.submenu.style.left = '1px';\n this._bindedSubmenuOff = this.submenuOff.bind(this);\n\n _d.addEventListener('mousedown', this._bindedSubmenuOff, false);\n },\n\n /**\r\n * @description Disable submenu\r\n */\n submenuOff: function () {\n if (this.submenu) {\n this._submenuName = '';\n this.submenu.style.display = 'none';\n this.submenu = null;\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeClass(this.submenuActiveButton, 'on');\n this.submenuActiveButton = null;\n\n _d.removeEventListener('mousedown', this._bindedSubmenuOff);\n\n this._notHideToolbar = false;\n }\n\n this.controllersOff();\n this.focus();\n },\n\n /**\r\n * @description Disable controller in editor area (link button, image resize button)\r\n */\n controllersOn: function () {\n for (let i = 0; i < arguments.length; i++) {\n arguments[i].style.display = 'block';\n this.controllerArray[i] = arguments[i];\n }\n\n this._bindControllersOff = this.controllersOff.bind(this);\n\n _d.addEventListener('mousedown', this._bindControllersOff, false);\n },\n\n /**\r\n * @description Disable controller in editor area (link button, image resize button)\r\n */\n controllersOff: function () {\n const len = this.controllerArray.length;\n\n if (len > 0) {\n for (let i = 0; i < len; i++) {\n this.controllerArray[i].style.display = 'none';\n }\n\n this.controllerArray = [];\n\n _d.removeEventListener('mousedown', this._bindControllersOff);\n }\n },\n\n /**\r\n * @description javascript execCommand\r\n * @param {String} command - javascript execCommand function property\r\n * @param {Boolean} showDefaultUI - javascript execCommand function property\r\n * @param {String} value - javascript execCommand function property\r\n */\n execCommand: function (command, showDefaultUI, value) {\n _d.execCommand(command, showDefaultUI, command === 'formatBlock' ? '<' + value + '>' : value);\n },\n\n /**\r\n * @description Focus to wysiwyg area\r\n */\n focus: function () {\n if (context.element.wysiwyg.style.display === 'none') return;\n const caption = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getParentElement(this.getSelectionNode(), 'figcaption');\n\n if (caption) {\n caption.focus();\n } else {\n context.element.wysiwyg.focus();\n }\n\n event._findButtonEffectTag();\n },\n\n /**\r\n * @description Set current editor's range object\r\n * @param {Element} startCon - The startContainer property of the selection object.\r\n * @param {Number} startOff - The startOffset property of the selection object.\r\n * @param {Element} endCon - The endContainer property of the selection object.\r\n * @param {Element} endOff - The endOffset property of the selection object.\r\n */\n setRange: function (startCon, startOff, endCon, endOff) {\n const range = _d.createRange();\n\n range.setStart(startCon, startOff);\n range.setEnd(endCon, endOff);\n\n const selection = _w.getSelection();\n\n if (selection.removeAllRanges) {\n selection.removeAllRanges();\n }\n\n selection.addRange(range);\n\n this._editorRange();\n },\n\n /**\r\n * @description Get current editor's range object\r\n * @returns {Object}\r\n */\n getRange: function () {\n return this._variable._range || this._createDefaultRange();\n },\n\n /**\r\n * @description Get current select node\r\n * @returns {Node}\r\n */\n getSelectionNode: function () {\n return this._variable._selectionNode || context.element.wysiwyg.firstChild;\n },\n\n /**\r\n * @description Saving the range object and the currently selected node of editor\r\n * @private\r\n */\n _editorRange: function () {\n const selection = _w.getSelection();\n\n if (!_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getParentElement(selection.focusNode, '.sun-editor-id-wysiwyg')) return;\n let range = null;\n let selectionNode = null;\n\n if (selection.rangeCount > 0) {\n range = selection.getRangeAt(0);\n } else {\n range = this._createDefaultRange();\n }\n\n this._variable._range = range;\n\n if (range.collapsed) {\n selectionNode = range.commonAncestorContainer;\n } else {\n selectionNode = selection.extentNode || selection.anchorNode;\n }\n\n this._variable._selectionNode = selectionNode;\n },\n\n /**\r\n * @description Return the range object of editor's first child node\r\n * @returns {Object}\r\n * @private\r\n */\n _createDefaultRange: function () {\n const range = _d.createRange();\n\n range.setStart(context.element.wysiwyg.firstChild, 0);\n range.setEnd(context.element.wysiwyg.firstChild, 0);\n return range;\n },\n\n /**\r\n * @description Returns a \"formatElement\"(P, DIV, H[1-6], LI) array from the currently selected range.\r\n * @returns {Array}\r\n */\n getSelectedFormatElements: function () {\n let range = this.getRange();\n\n if (_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(range.startContainer)) {\n const children = context.element.wysiwyg.children;\n this.setRange(children[0], 0, children[children.length - 1], children[children.length - 1].textContent.length);\n range = this.getRange();\n }\n\n const startCon = range.startContainer;\n const endCon = range.endContainer;\n const commonCon = range.commonAncestorContainer;\n const rangeFormatElements = [];\n if (!_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(commonCon) && !_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isRangeFormatElement(commonCon)) return [_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getFormatElement(commonCon)]; // get line nodes\n\n const lineNodes = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getListChildren(commonCon, function (current) {\n return _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isFormatElement(current);\n });\n if (startCon === endCon) return lineNodes[0];\n let startLine = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getFormatElement(startCon);\n let endLine = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getFormatElement(endCon);\n let startIdx = 0;\n let endIdx = 0;\n\n for (let i = 0, len = lineNodes.length; i < len; i++) {\n if (startLine === lineNodes[i]) {\n startIdx = i;\n continue;\n }\n\n if (endLine === lineNodes[i]) {\n endIdx = i;\n break;\n }\n }\n\n for (let i = startIdx; i <= endIdx; i++) {\n rangeFormatElements.push(lineNodes[i]);\n }\n\n return rangeFormatElements;\n },\n\n /**\r\n * @description Returns a \"rangeFormatElement\"(blockquote, TABLE, TR, TD, OL, UL, PRE) array from the currently selected range.\r\n * @returns {Array}\r\n */\n getSelectedRangeFormatElements: function () {\n let range = this.getRange();\n\n if (_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(range.startContainer)) {\n const children = context.element.wysiwyg.children;\n this.setRange(children[0], 0, children[children.length - 1], children[children.length - 1].textContent.length);\n range = this.getRange();\n }\n\n const startCon = range.startContainer;\n const endCon = range.endContainer;\n const commonCon = range.commonAncestorContainer;\n const rangeFormatElements = [];\n if (_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isRangeFormatElement(commonCon)) return [commonCon];\n\n if (!_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(commonCon)) {\n const el = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getRangeFormatElement(commonCon);\n return el ? [el] : [];\n } // get range Elements\n\n\n const rangeElements = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getListChildren(commonCon, function (current) {\n return _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isRangeFormatElement(current);\n });\n if (startCon === endCon) return rangeElements[0];\n let startLine = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getRangeFormatElement(startCon);\n let endLine = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getRangeFormatElement(endCon);\n let startIdx = 0;\n let endIdx = 0;\n\n for (let i = 0, len = rangeElements.length; i < len; i++) {\n if (startLine === rangeElements[i]) {\n startIdx = i;\n continue;\n }\n\n if (endLine === rangeElements[i]) {\n endIdx = i;\n break;\n }\n }\n\n for (let i = startIdx; i <= endIdx; i++) {\n if (rangeElements[i]) rangeFormatElements.push(rangeElements[i]);\n }\n\n return rangeFormatElements;\n },\n\n /**\r\n * @description Determine if this offset is the edge offset of container\r\n * @param {Object} container - The container property of the selection object.\r\n * @param {Number} offset - The offset property of the selection object.\r\n * @returns {Boolean}\r\n */\n isEdgePoint: function (container, offset) {\n return offset === 0 || offset === container.nodeValue.length;\n },\n\n /**\r\n * @description Show loading box\r\n */\n showLoading: function () {\n context.element.loading.style.display = 'block';\n },\n\n /**\r\n * @description Close loading box\r\n */\n closeLoading: function () {\n context.element.loading.style.display = 'none';\n },\n\n /**\r\n * @description Append format element to sibling node of argument element.\r\n * If the \"formatNodeName\" argument value is present, the tag of that argument value is inserted,\r\n * If not, the currently selected format tag is inserted.\r\n * @param {Element} element - Insert as siblings of that element\r\n * @param {String|null} formatNodeName - Node name to be inserted\r\n * @returns {Element}\r\n */\n appendFormatTag: function (element, formatNodeName) {\n const formatEl = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getRangeFormatElement(element) || _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getFormatElement(element);\n const currentFormatEl = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getFormatElement(this.getSelectionNode());\n const oFormatName = formatNodeName ? formatNodeName : _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isFormatElement(currentFormatEl) ? currentFormatEl.nodeName : 'P';\n const oFormat = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createElement(oFormatName);\n oFormat.innerHTML = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].zeroWidthSpace;\n if (_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isCell(formatEl)) formatEl.insertBefore(oFormat, element.nextElementSibling);else formatEl.parentNode.insertBefore(oFormat, formatEl.nextElementSibling);\n return oFormat;\n },\n\n /**\r\n * @description Delete selected node and insert argument value node\r\n * @param {Element} oNode - Node to be inserted\r\n * @param {(Element|null)} rightNode - If the node exists, it is inserted after the node\r\n */\n insertNode: function (oNode, rightNode) {\n const range = this.getRange();\n let parentNode = null;\n\n if (!rightNode) {\n const startCon = range.startContainer;\n const startOff = range.startOffset;\n const endCon = range.endContainer;\n const endOff = range.endOffset;\n const commonCon = range.commonAncestorContainer;\n parentNode = startCon;\n\n if (startCon.nodeType === 3) {\n parentNode = startCon.parentNode;\n }\n /** No Select range node */\n\n\n if (range.collapsed) {\n if (commonCon.nodeType === 3) {\n rightNode = commonCon.splitText(endOff);\n } else {\n if (parentNode.lastChild !== null && _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isBreak(parentNode.lastChild)) {\n parentNode.removeChild(parentNode.lastChild);\n }\n\n rightNode = null;\n }\n }\n /** Select range nodes */\n else {\n const isSameContainer = startCon === endCon;\n\n if (isSameContainer) {\n if (this.isEdgePoint(endCon, endOff)) rightNode = endCon.nextSibling;else rightNode = endCon.splitText(endOff);\n let removeNode = startCon;\n if (!this.isEdgePoint(startCon, startOff)) removeNode = startCon.splitText(startOff);\n parentNode.removeChild(removeNode);\n } else {\n this.removeNode();\n parentNode = commonCon;\n rightNode = endCon;\n\n while (rightNode.parentNode !== commonCon) {\n rightNode = rightNode.parentNode;\n }\n }\n }\n } else {\n parentNode = rightNode.parentNode;\n rightNode = rightNode.nextSibling;\n }\n\n try {\n parentNode.insertBefore(oNode, rightNode);\n } catch (e) {\n parentNode.appendChild(oNode);\n }\n },\n\n /**\r\n * @description Delete the currently selected node\r\n */\n removeNode: function () {\n const range = this.getRange();\n\n if (range.deleteContents) {\n range.deleteContents();\n return;\n }\n\n const startCon = range.startContainer;\n const startOff = range.startOffset;\n const endCon = range.endContainer;\n const endOff = range.endOffset;\n const commonCon = range.commonAncestorContainer;\n let beforeNode = null;\n let afterNode = null;\n const childNodes = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getListChildNodes(commonCon);\n let startIndex = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getArrayIndex(childNodes, startCon);\n let endIndex = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getArrayIndex(childNodes, endCon);\n\n for (let i = startIndex + 1, startNode = startCon; i >= 0; i--) {\n if (childNodes[i] === startNode.parentNode && childNodes[i].firstChild === startNode && startOff === 0) {\n startIndex = i;\n startNode = startNode.parentNode;\n }\n }\n\n for (let i = endIndex - 1, endNode = endCon; i > startIndex; i--) {\n if (childNodes[i] === endNode.parentNode && childNodes[i].nodeType === 1) {\n childNodes.splice(i, 1);\n endNode = endNode.parentNode;\n --endIndex;\n }\n }\n\n for (let i = startIndex; i <= endIndex; i++) {\n const item = childNodes[i];\n\n if (item.length === 0 || item.nodeType === 3 && item.data === undefined) {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeItem(item);\n continue;\n }\n\n if (item === startCon) {\n if (startCon.nodeType === 1) {\n beforeNode = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(startCon.textContent);\n } else {\n beforeNode = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(startCon.substringData(0, startOff));\n }\n\n if (beforeNode.length > 0) {\n startCon.data = beforeNode.data;\n } else {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeItem(startCon);\n }\n\n continue;\n }\n\n if (item === endCon) {\n if (endCon.nodeType === 1) {\n afterNode = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(endCon.textContent);\n } else {\n afterNode = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(endCon.substringData(endOff, endCon.length - endOff));\n }\n\n if (afterNode.length > 0) {\n endCon.data = afterNode.data;\n } else {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeItem(endCon);\n }\n\n continue;\n }\n\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeItem(item);\n }\n },\n\n /**\r\n * @description appended all selected format Element to the argument element and insert\r\n * @param {Element} wrapTag - Element of wrap the arguments\r\n */\n wrapToTags: function (wrapTag) {\n const range = this.getRange();\n const rangeLines = this.getSelectedFormatElements();\n\n if (!rangeLines) {\n const inner = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createElement(_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isCell(this.getSelectionNode()) ? 'DIV' : 'P');\n inner.innerHTML = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].zeroWidthSpace;\n wrapTag.appendChild(inner);\n this.getSelectionNode().appendChild(wrapTag);\n return;\n }\n\n let last = rangeLines[rangeLines.length - 1];\n let standTag, beforeTag, pElement;\n\n if (_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isRangeFormatElement(last) || _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isFormatElement(last)) {\n standTag = last;\n } else {\n standTag = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getRangeFormatElement(last) || _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getFormatElement(last);\n }\n\n if (_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isCell(standTag)) {\n beforeTag = null;\n pElement = standTag;\n } else {\n beforeTag = standTag.nextSibling;\n pElement = standTag.parentNode;\n }\n\n let listParent = null;\n let line = null;\n let prevNodeName = '';\n\n for (let i = 0, len = rangeLines.length; i < len; i++) {\n line = rangeLines[i];\n\n if (/^LI$/i.test(line.nodeName)) {\n if (listParent === null || !/^LI$/i.test(prevNodeName)) {\n listParent = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createElement(line.parentNode.nodeName);\n }\n\n listParent.appendChild(line);\n if (i === len - 1 || !/^LI$/i.test(rangeLines[i + 1].nodeName)) wrapTag.appendChild(listParent);\n } else {\n wrapTag.appendChild(line);\n }\n\n prevNodeName = line.nodeName;\n }\n\n pElement.insertBefore(wrapTag, beforeTag);\n if (!range.collapsed && (_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isRangeFormatElement(range.startContainer) || _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isRangeFormatElement(range.endContainer))) _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeEmptyNode(pElement);\n },\n\n /**\r\n * @description Add the node received as an argument value to the selected area.\r\n * 1. When there is the same css value node in the selection area, the tag is stripped.\r\n * 2. If there is another css value other thanCss attribute values received as arguments on the node, removed only Css attribute values received as arguments\r\n * 3. If you pass an element whose node name is \"removenode\" as an argument value, it performs a type removal operation. ex) nodeChange(document.createElement('removenode'))\r\n * @param {Element} appendNode - The dom that will wrap the selected text area\r\n * @param {Array} checkCSSPropertyArray - The css attribute name Array to check (['font-size'], ['font-family', 'background-color', 'border']...])\r\n */\n nodeChange: function (appendNode, checkCSSPropertyArray) {\n const range = this.getRange();\n const isRemoveFormat = /removenode/i.test(appendNode.nodeName);\n let tempCon, tempOffset, tempChild, tempArray;\n /* checked same style property */\n\n if (range.startContainer === range.endContainer) {\n let sNode = range.startContainer;\n\n if (isRemoveFormat) {\n if (_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getFormatElement(sNode) === sNode.parentNode) return;\n } else {\n let checkCnt = 0;\n\n for (let i = 0; i < checkCSSPropertyArray.length; i++) {\n while (!_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isFormatElement(sNode) && !_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(sNode)) {\n if (sNode.nodeType === 1 && sNode.style[checkCSSPropertyArray[i]] === appendNode.style[checkCSSPropertyArray[i]]) {\n checkCnt++;\n }\n\n sNode = sNode.parentNode;\n }\n }\n\n if (checkCnt >= checkCSSPropertyArray.length) return;\n }\n }\n /* find text node */\n // startContainer\n\n\n tempCon = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(range.startContainer) ? context.element.wysiwyg.firstChild : range.startContainer;\n tempOffset = range.startOffset;\n\n if (tempCon.nodeType === 1 && tempCon.childNodes.length > 0) {\n while (tempCon && !_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isBreak(tempCon) && tempCon.nodeType === 1) {\n tempArray = [];\n tempChild = tempCon.childNodes;\n\n for (let i = 0, len = tempChild.length; i < len; i++) {\n tempArray.push(tempChild[i]);\n }\n\n tempCon = tempArray[tempOffset] || tempCon.nextElementSibling || tempCon.nextSibling;\n tempOffset = 0;\n }\n\n if (_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isBreak(tempCon)) {\n const emptyText = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].zeroWidthSpace);\n tempCon.parentNode.insertBefore(emptyText, tempCon);\n tempCon = emptyText;\n }\n }\n\n const startCon = tempCon;\n const startOff = tempOffset; // endContainer\n\n tempCon = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(range.endContainer) ? context.element.wysiwyg.lastChild : range.endContainer;\n tempOffset = range.endOffset;\n\n if (tempCon.nodeType === 1 && tempCon.childNodes.length > 0) {\n while (tempCon && !_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isBreak(tempCon) && tempCon.nodeType === 1) {\n tempArray = [];\n tempChild = tempCon.childNodes;\n\n for (let i = 0, len = tempChild.length; i < len; i++) {\n tempArray.push(tempChild[i]);\n }\n\n tempCon = tempArray[tempOffset - 1] || !/FIGURE/i.test(tempArray[0].nodeName) ? tempArray[0] : tempCon.previousElementSibling || tempCon.previousSibling || startCon;\n }\n\n tempOffset = tempCon.textContent.length;\n\n if (_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isBreak(tempCon)) {\n const emptyText = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].zeroWidthSpace);\n tempCon.parentNode.insertBefore(emptyText, tempCon);\n tempCon = emptyText;\n tempOffset = 0;\n }\n }\n\n const endCon = tempCon;\n const endOff = tempOffset;\n const commonCon = range.commonAncestorContainer;\n const newNodeName = appendNode.nodeName;\n this.setRange(startCon, startOff, endCon, endOff);\n let start = {},\n end = {};\n let newNode, regExp;\n\n if (checkCSSPropertyArray) {\n regExp = '(?:;|^|\\\\s)(?:' + checkCSSPropertyArray[0];\n\n for (let i = 1; i < checkCSSPropertyArray.length; i++) {\n regExp += '|' + checkCSSPropertyArray[i];\n }\n\n regExp += ')\\\\s*:[^;]*\\\\s*(?:;|$)';\n regExp = new RegExp(regExp, 'ig');\n }\n /** tag check function*/\n\n\n const checkCss = function (vNode) {\n if (isRemoveFormat || vNode.nodeType === 3 || _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isBreak(vNode)) return true;\n let style = '';\n\n if (regExp && vNode.style.cssText.length > 0) {\n style = vNode.style.cssText.replace(regExp, '').trim();\n }\n\n if (style.length > 0 || vNode.nodeName !== newNodeName) {\n if (vNode.style.cssText.length > 0) vNode.style.cssText = style;\n return true;\n }\n\n return false;\n };\n /** one line */\n\n\n if (!_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(commonCon) && !_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isRangeFormatElement(commonCon)) {\n newNode = appendNode.cloneNode(false);\n\n const newRange = this._nodeChange_oneLine(_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getFormatElement(commonCon), newNode, checkCss, startCon, startOff, endCon, endOff, isRemoveFormat, range.collapsed);\n\n start.container = newRange.startContainer;\n start.offset = newRange.startOffset;\n end.container = newRange.endContainer;\n end.offset = newRange.endOffset;\n }\n /** multi line */\n else {\n // get line nodes\n const lineNodes = this.getSelectedFormatElements();\n const endLength = lineNodes.length - 1; // startCon\n\n newNode = appendNode.cloneNode(false);\n start = this._nodeChange_startLine(lineNodes[0], newNode, checkCss, startCon, startOff, isRemoveFormat); // mid\n\n for (let i = 1; i < endLength; i++) {\n newNode = appendNode.cloneNode(false);\n\n this._nodeChange_middleLine(lineNodes[i], newNode, checkCss, isRemoveFormat);\n } // endCon\n\n\n if (endLength > 0) {\n newNode = appendNode.cloneNode(false);\n end = this._nodeChange_endLine(lineNodes[endLength], newNode, checkCss, endCon, endOff, isRemoveFormat);\n } else {\n end = start;\n }\n } // set range\n\n\n this.setRange(start.container, start.offset, end.container, end.offset);\n },\n\n /**\r\n * @description wraps text nodes of line selected text.\r\n * @param {Element} element - The node of the line that contains the selected text node.\r\n * @param {Element} newInnerNode - The dom that will wrap the selected text area\r\n * @param {function} validation - Check if the node should be stripped.\r\n * @param {Element} startCon - The startContainer property of the selection object.\r\n * @param {Number} startOff - The startOffset property of the selection object.\r\n * @param {Element} endCon - The endContainer property of the selection object.\r\n * @param {Number} endOff - The endOffset property of the selection object.\r\n * @param {Boolean} isRemoveFormat - Is the remove format command ?\r\n * @param {Boolean} collapsed - range.collapsed\r\n * @returns {{startContainer: *, startOffset: *, endContainer: *, endOffset: *}}\r\n * @private\r\n */\n _nodeChange_oneLine: function (element, newInnerNode, validation, startCon, startOff, endCon, endOff, isRemoveFormat, collapsed) {\n const el = element;\n const pNode = element.cloneNode(false);\n const isSameNode = startCon === endCon;\n let startContainer = startCon;\n let startOffset = startOff;\n let endContainer = endCon;\n let endOffset = endOff;\n let startPass = false;\n let endPass = false;\n let pCurrent, newNode, appendNode, cssText;\n\n function checkCss(vNode) {\n const regExp = new RegExp('(?:;|^|\\\\s)(?:' + cssText + 'null)\\\\s*:[^;]*\\\\s*(?:;|$)', 'ig');\n let style = '';\n\n if (regExp && vNode.style.cssText.length > 0) {\n style = regExp.test(vNode.style.cssText);\n }\n\n return !style;\n }\n\n (function recursionFunc(current, node) {\n const childNodes = current.childNodes;\n\n for (let i = 0, len = childNodes.length; i < len; i++) {\n let child = childNodes[i];\n let coverNode = node;\n let cloneNode; // startContainer\n\n if (!startPass && child === startContainer) {\n const prevNode = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(startContainer.nodeType === 1 ? '' : startContainer.substringData(0, startOffset));\n const textNode = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(startContainer.nodeType === 1 ? '' : startContainer.substringData(startOffset, endOffset > startOffset ? endOffset - startOffset : endOffset === startOffset ? 0 : startContainer.data.length - startOffset));\n\n if (prevNode.data.length > 0) {\n node.appendChild(prevNode);\n }\n\n newNode = child;\n pCurrent = [];\n cssText = '';\n\n while (newNode !== pNode && newNode !== el && newNode !== null) {\n if (validation(newNode) && newNode.nodeType === 1 && checkCss(newNode)) {\n pCurrent.push(newNode.cloneNode(false));\n cssText += newNode.style.cssText.substr(0, newNode.style.cssText.indexOf(':')) + '|';\n }\n\n newNode = newNode.parentNode;\n }\n\n const childNode = pCurrent.pop() || textNode;\n appendNode = newNode = childNode;\n\n while (pCurrent.length > 0) {\n newNode = pCurrent.pop();\n appendNode.appendChild(newNode);\n appendNode = newNode;\n }\n\n newInnerNode.appendChild(childNode);\n pNode.appendChild(newInnerNode);\n startContainer = textNode;\n startOffset = 0;\n startPass = true;\n if (newNode !== textNode) newNode.appendChild(startContainer);\n if (!isSameNode) continue;\n } // endContainer\n\n\n if (!endPass && child === endContainer) {\n const afterNode = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(endContainer.nodeType === 1 ? '' : endContainer.substringData(endOffset, endContainer.length - endOffset));\n const textNode = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(isSameNode || endContainer.nodeType === 1 ? '' : endContainer.substringData(0, endOffset));\n\n if (afterNode.data.length > 0) {\n newNode = child;\n cssText = '';\n pCurrent = [];\n\n while (newNode !== pNode && newNode !== el && newNode !== null) {\n if (newNode.nodeType === 1 && checkCss(newNode)) {\n pCurrent.push(newNode.cloneNode(false));\n cssText += newNode.style.cssText.substr(0, newNode.style.cssText.indexOf(':')) + '|';\n }\n\n newNode = newNode.parentNode;\n }\n\n cloneNode = appendNode = newNode = pCurrent.pop() || afterNode;\n\n while (pCurrent.length > 0) {\n newNode = pCurrent.pop();\n appendNode.appendChild(newNode);\n appendNode = newNode;\n }\n\n pNode.appendChild(cloneNode);\n newNode.textContent = afterNode.data;\n }\n\n newNode = child;\n pCurrent = [];\n cssText = '';\n\n while (newNode !== pNode && newNode !== el && newNode !== null) {\n if (validation(newNode) && newNode.nodeType === 1 && checkCss(newNode)) {\n pCurrent.push(newNode.cloneNode(false));\n cssText += newNode.style.cssText.substr(0, newNode.style.cssText.indexOf(':')) + '|';\n }\n\n newNode = newNode.parentNode;\n }\n\n const childNode = pCurrent.pop() || textNode;\n appendNode = newNode = childNode;\n\n while (pCurrent.length > 0) {\n newNode = pCurrent.pop();\n appendNode.appendChild(newNode);\n appendNode = newNode;\n }\n\n newInnerNode.appendChild(childNode);\n endContainer = textNode;\n endOffset = textNode.data.length;\n endPass = true;\n\n if (!isRemoveFormat && collapsed) {\n newInnerNode = textNode;\n textNode.textContent = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].zeroWidthSpace;\n }\n\n if (newNode !== textNode) newNode.appendChild(endContainer);\n continue;\n } // other\n\n\n if (startPass) {\n if (child.nodeType === 1 && !_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isBreak(child)) {\n recursionFunc(child, child);\n continue;\n }\n\n newNode = child;\n pCurrent = [];\n cssText = '';\n\n while (newNode.parentNode !== null && newNode !== el && newNode !== newInnerNode) {\n if (newNode.nodeType === 1 && !_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isBreak(child) && (endPass || validation(newNode)) && checkCss(newNode)) {\n pCurrent.push(newNode.cloneNode(false));\n cssText += newNode.style.cssText.substr(0, newNode.style.cssText.indexOf(':')) + '|';\n }\n\n newNode = newNode.parentNode;\n }\n\n const childNode = pCurrent.pop() || child;\n appendNode = newNode = childNode;\n\n while (pCurrent.length > 0) {\n newNode = pCurrent.pop();\n appendNode.appendChild(newNode);\n appendNode = newNode;\n }\n\n if (childNode === child) {\n if (!endPass) node = newInnerNode;else node = pNode;\n } else if (endPass) {\n pNode.appendChild(childNode);\n node = newNode;\n } else {\n newInnerNode.appendChild(childNode);\n node = newNode;\n }\n }\n\n cloneNode = child.cloneNode(false);\n node.appendChild(cloneNode);\n if (child.nodeType === 1 && !_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isBreak(child)) coverNode = cloneNode;\n recursionFunc(child, coverNode);\n }\n })(element, pNode);\n\n if (isRemoveFormat) {\n startContainer = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(collapsed ? _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].zeroWidthSpace : newInnerNode.textContent);\n pNode.insertBefore(startContainer, newInnerNode);\n pNode.removeChild(newInnerNode);\n if (collapsed) startOffset = 1;\n } else if (collapsed) {\n startContainer = endContainer = newInnerNode;\n startOffset = 1;\n endOffset = 1;\n }\n\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeEmptyNode(pNode);\n element.parentNode.insertBefore(pNode, element);\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeItem(element);\n return {\n startContainer: startContainer,\n startOffset: startOffset,\n endContainer: isRemoveFormat || !endContainer.textContent ? startContainer : endContainer,\n endOffset: isRemoveFormat || !endContainer.textContent ? startContainer.textContent.length : endOffset\n };\n },\n\n /**\r\n * @description wraps mid lines selected text.\r\n * @param {Element} element - The node of the line that contains the selected text node.\r\n * @param {Element} newInnerNode - The dom that will wrap the selected text area\r\n * @param {function} validation - Check if the node should be stripped.\r\n * @param {Boolean} isRemoveFormat - Is the remove format command ?\r\n * @private\r\n */\n _nodeChange_middleLine: function (element, newInnerNode, validation, isRemoveFormat) {\n if (isRemoveFormat) {\n newInnerNode = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(element.textContent ? element.textContent : _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].zeroWidthSpace);\n } else {\n (function recursionFunc(current, node) {\n const childNodes = current.childNodes;\n\n for (let i = 0, len = childNodes.length; i < len; i++) {\n let child = childNodes[i];\n let coverNode = node;\n\n if (validation(child)) {\n let cloneNode = child.cloneNode(false);\n node.appendChild(cloneNode);\n if (child.nodeType === 1 && !_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isBreak(child)) coverNode = cloneNode;\n }\n\n recursionFunc(child, coverNode);\n }\n })(element, newInnerNode);\n }\n\n element.innerHTML = '';\n element.appendChild(newInnerNode);\n },\n\n /**\r\n * @description wraps first line selected text.\r\n * @param {Element} element - The node of the line that contains the selected text node.\r\n * @param {Element} newInnerNode - The dom that will wrap the selected text area\r\n * @param {function} validation - Check if the node should be stripped.\r\n * @param {Element} startCon - The startContainer property of the selection object.\r\n * @param {Number} startOff - The startOffset property of the selection object.\r\n * @param {Boolean} isRemoveFormat - Is the remove format command ?\r\n * @returns {{container: *, offset: *}}\r\n * @private\r\n */\n _nodeChange_startLine: function (element, newInnerNode, validation, startCon, startOff, isRemoveFormat) {\n const el = element;\n const pNode = element.cloneNode(false);\n let container = startCon;\n let offset = startOff;\n let passNode = false;\n let pCurrent, newNode, appendNode;\n\n (function recursionFunc(current, node) {\n const childNodes = current.childNodes;\n\n for (let i = 0, len = childNodes.length; i < len; i++) {\n const child = childNodes[i];\n let coverNode = node;\n\n if (passNode && !_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isBreak(child)) {\n if (child.nodeType === 1) {\n recursionFunc(child, child);\n continue;\n }\n\n newNode = child;\n pCurrent = [];\n\n while (newNode.parentNode !== null && newNode !== el && newNode !== newInnerNode) {\n if (newNode.nodeType === 1 && validation(newNode)) {\n pCurrent.push(newNode.cloneNode(false));\n }\n\n newNode = newNode.parentNode;\n }\n\n if (pCurrent.length > 0) {\n const childNode = pCurrent.pop();\n appendNode = newNode = childNode;\n\n while (pCurrent.length > 0) {\n newNode = pCurrent.pop();\n appendNode.appendChild(newNode);\n appendNode = newNode;\n }\n\n newInnerNode.appendChild(childNode);\n node = newNode;\n } else {\n node = newInnerNode;\n }\n } // startContainer\n\n\n if (!passNode && child === container) {\n const prevNode = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(container.nodeType === 1 ? '' : container.substringData(0, offset));\n const textNode = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(container.nodeType === 1 ? '' : container.substringData(offset, container.length - offset));\n\n if (prevNode.data.length > 0) {\n node.appendChild(prevNode);\n }\n\n newNode = node;\n pCurrent = [];\n\n while (newNode !== pNode && newNode !== null) {\n if (newNode.nodeType === 1 && validation(newNode)) {\n pCurrent.push(newNode.cloneNode(false));\n }\n\n newNode = newNode.parentNode;\n }\n\n const childNode = pCurrent.pop() || node;\n appendNode = newNode = childNode;\n\n while (pCurrent.length > 0) {\n newNode = pCurrent.pop();\n appendNode.appendChild(newNode);\n appendNode = newNode;\n }\n\n if (childNode !== node) {\n newInnerNode.appendChild(childNode);\n node = newNode;\n } else {\n node = newInnerNode;\n }\n\n if (_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isBreak(child)) newInnerNode.appendChild(child.cloneNode(false));\n pNode.appendChild(newInnerNode);\n container = textNode;\n offset = 0;\n passNode = true;\n node.appendChild(container);\n continue;\n }\n\n if (!passNode || validation(child)) {\n const cloneNode = child.cloneNode(false);\n node.appendChild(cloneNode);\n if (child.nodeType === 1 && !_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isBreak(child)) coverNode = cloneNode;\n }\n\n recursionFunc(child, coverNode);\n }\n })(element, pNode);\n\n if (isRemoveFormat) {\n container = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(newInnerNode.textContent);\n pNode.insertBefore(container, newInnerNode);\n pNode.removeChild(newInnerNode);\n }\n\n if (!isRemoveFormat && pNode.children.length === 0) {\n if (element.childNodes) {\n container = element.childNodes[0];\n } else {\n container = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].zeroWidthSpace);\n element.appendChild(container);\n }\n } else {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeEmptyNode(pNode);\n element.parentNode.insertBefore(pNode, element);\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeItem(element);\n }\n\n return {\n container: container,\n offset: offset\n };\n },\n\n /**\r\n * @description wraps last line selected text.\r\n * @param {Element} element - The node of the line that contains the selected text node.\r\n * @param {Element} newInnerNode - The dom that will wrap the selected text area\r\n * @param {function} validation - Check if the node should be stripped.\r\n * @param {Element} endCon - The endContainer property of the selection object.\r\n * @param {Number} endOff - The endOffset property of the selection object.\r\n * @param {Boolean} isRemoveFormat - Is the remove format command ?\r\n * @returns {{container: *, offset: *}}\r\n * @private\r\n */\n _nodeChange_endLine: function (element, newInnerNode, validation, endCon, endOff, isRemoveFormat) {\n const el = element;\n const pNode = element.cloneNode(false);\n let container = endCon;\n let offset = endOff;\n let passNode = false;\n let pCurrent, newNode, appendNode;\n\n (function recursionFunc(current, node) {\n const childNodes = current.childNodes;\n\n for (let i = childNodes.length - 1; 0 <= i; i--) {\n const child = childNodes[i];\n let coverNode = node;\n\n if (passNode && !_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isBreak(child)) {\n if (child.nodeType === 1) {\n recursionFunc(child, child);\n continue;\n }\n\n newNode = child;\n pCurrent = [];\n\n while (newNode.parentNode !== null && newNode !== el && newNode !== newInnerNode) {\n if (validation(newNode) && newNode.nodeType === 1) {\n pCurrent.push(newNode.cloneNode(false));\n }\n\n newNode = newNode.parentNode;\n }\n\n if (pCurrent.length > 0) {\n const childNode = pCurrent.pop();\n appendNode = newNode = childNode;\n\n while (pCurrent.length > 0) {\n newNode = pCurrent.pop();\n appendNode.appendChild(newNode);\n appendNode = newNode;\n }\n\n newInnerNode.insertBefore(childNode, newInnerNode.firstChild);\n node = newNode;\n } else {\n node = newInnerNode;\n }\n } // endContainer\n\n\n if (!passNode && child === container) {\n const afterNode = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(container.nodeType === 1 ? '' : container.substringData(offset, container.length - offset));\n const textNode = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(container.nodeType === 1 ? '' : container.substringData(0, offset));\n\n if (afterNode.data.length > 0) {\n node.insertBefore(afterNode, node.firstChild);\n }\n\n newNode = node;\n pCurrent = [];\n\n while (newNode !== pNode && newNode !== null) {\n if (validation(newNode) && newNode.nodeType === 1) {\n pCurrent.push(newNode.cloneNode(false));\n }\n\n newNode = newNode.parentNode;\n }\n\n const childNode = pCurrent.pop() || node;\n appendNode = newNode = childNode;\n\n while (pCurrent.length > 0) {\n newNode = pCurrent.pop();\n appendNode.appendChild(newNode);\n appendNode = newNode;\n }\n\n if (childNode !== node) {\n newInnerNode.insertBefore(childNode, newInnerNode.firstChild);\n node = newNode;\n } else {\n node = newInnerNode;\n }\n\n if (_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isBreak(child)) newInnerNode.appendChild(child.cloneNode(false));\n pNode.insertBefore(newInnerNode, pNode.firstChild);\n container = textNode;\n offset = textNode.data.length;\n passNode = true;\n node.insertBefore(container, node.firstChild);\n continue;\n }\n\n if (!passNode || validation(child)) {\n const cloneNode = child.cloneNode(false);\n node.insertBefore(cloneNode, node.firstChild);\n if (child.nodeType === 1 && !_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isBreak(child)) coverNode = cloneNode;\n }\n\n recursionFunc(child, coverNode);\n }\n })(element, pNode);\n\n if (isRemoveFormat) {\n container = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(newInnerNode.textContent);\n offset = container.textContent.length;\n pNode.insertBefore(container, newInnerNode);\n pNode.removeChild(newInnerNode);\n }\n\n if (!isRemoveFormat && pNode.childNodes.length === 0) {\n if (element.childNodes) {\n container = element.childNodes[0];\n } else {\n container = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].zeroWidthSpace);\n element.appendChild(container);\n }\n } else {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeEmptyNode(pNode);\n element.parentNode.insertBefore(pNode, element);\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeItem(element);\n }\n\n return {\n container: container,\n offset: offset\n };\n },\n\n /**\r\n * @description Execute command of command button(All Buttons except submenu and dialog)\r\n * (redo, undo, bold, underline, italic, strikethrough, subscript, superscript, removeFormat, indent, outdent, fullscreen, showBlocks, codeview, preview, print)\r\n * @param {Element} target - The element of command button\r\n * @param {String} command - Property of command button (data-value)\r\n */\n commandHandler: function (target, command) {\n switch (command) {\n case 'codeView':\n this.controllersOff();\n this.toggleCodeView();\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].toggleClass(target, 'on');\n break;\n\n case 'fullScreen':\n this.controllersOff();\n this.toggleFullScreen(target);\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].toggleClass(target, 'on');\n break;\n\n case 'indent':\n case 'outdent':\n this.indent(command);\n break;\n\n case 'redo':\n case 'undo':\n this.execCommand(command, false, null);\n break;\n\n case 'removeFormat':\n this.removeFormat();\n break;\n\n case 'preview':\n case 'print':\n this.openWindowContents(command);\n break;\n\n case 'showBlocks':\n this.toggleDisplayBlocks();\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].toggleClass(target, 'on');\n break;\n\n case 'subscript':\n if (_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].hasClass(context.tool.superscript, 'on')) {\n this.execCommand('superscript', false, null);\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeClass(context.tool.superscript, 'on');\n }\n\n this.execCommand(command, false, null);\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].toggleClass(target, 'on');\n break;\n\n case 'superscript':\n if (_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].hasClass(context.tool.subscript, 'on')) {\n this.execCommand('subscript', false, null);\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeClass(context.tool.subscript, 'on');\n }\n\n this.execCommand(command, false, null);\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].toggleClass(target, 'on');\n break;\n\n case 'save':\n if (typeof context.option.callBackSave === 'function') {\n context.option.callBackSave(this.getContents());\n } else {\n throw Error('[SUNEDITOR.core.commandHandler.fail] Please register call back function in creation option. (callBackSave : Function)');\n }\n\n break;\n\n default:\n // 'bold', 'underline', 'italic', 'strike'\n this.execCommand(command, false, target.getAttribute('data-value'));\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].toggleClass(target, 'on');\n }\n\n this.focus();\n },\n\n /**\r\n * @description Remove format of the currently selected range (IE, Edge not working)\r\n */\n removeFormat: function () {\n this.nodeChange(_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createElement('REMOVENODE'));\n },\n\n /**\r\n * @description This method implements indentation to selected range.\r\n * Setted \"margin-left\" to \"25px\" in the top \"P\" tag of the parameter node.\r\n * @param command {String} - Separator (\"indent\" or \"outdent\")\r\n */\n indent: function (command) {\n const rangeLines = this.getSelectedFormatElements();\n let p, margin;\n\n for (let i = 0, len = rangeLines.length; i < len; i++) {\n p = rangeLines[i];\n margin = /\\d+/.test(p.style.marginLeft) ? p.style.marginLeft.match(/\\d+/)[0] * 1 : 0;\n\n if ('indent' === command) {\n margin += 25;\n } else {\n margin -= 25;\n }\n\n p.style.marginLeft = (margin < 0 ? 0 : margin) + 'px';\n }\n },\n\n /**\r\n * @description Add or remove the class name of \"body\" so that the code block is visible\r\n */\n toggleDisplayBlocks: function () {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].toggleClass(context.element.wysiwyg, 'sun-editor-show-block');\n },\n\n /**\r\n * @description Changes to code view or wysiwyg view\r\n */\n toggleCodeView: function () {\n const wysiwygActive = this._variable.wysiwygActive;\n const disButtons = this.codeViewDisabledButtons;\n\n for (let i = 0, len = disButtons.length; i < len; i++) {\n disButtons[i].disabled = wysiwygActive;\n }\n\n if (!wysiwygActive) {\n const code_html = context.element.code.value.trim();\n context.element.wysiwyg.innerHTML = code_html.length > 0 ? _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].convertContentsForEditor(code_html) : '

    ' + _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].zeroWidthSpace + '

    ';\n context.element.wysiwyg.scrollTop = 0;\n context.element.code.style.display = 'none';\n context.element.wysiwyg.style.display = 'block';\n if (context.option.height === 'auto') context.element.code.style.height = '0px';\n this._variable.wysiwygActive = true;\n this.focus();\n } else {\n context.element.code.value = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].convertHTMLForCodeView(context.element.wysiwyg.innerHTML.trim());\n context.element.wysiwyg.style.display = 'none';\n context.element.code.style.display = 'block';\n if (context.option.height === 'auto') context.element.code.style.height = context.element.code.scrollHeight > 0 ? context.element.code.scrollHeight + 'px' : 'auto';\n this._variable.wysiwygActive = false;\n context.element.code.focus();\n }\n },\n\n /**\r\n * @description Changes to full screen or default screen\r\n * @param {Element} element - full screen button\r\n */\n toggleFullScreen: function (element) {\n if (!this._variable.isFullScreen) {\n this._variable.isFullScreen = true;\n context.element.topArea.style.position = 'fixed';\n context.element.topArea.style.top = '0';\n context.element.topArea.style.left = '0';\n context.element.topArea.style.width = '100%';\n context.element.topArea.style.height = '100%';\n context.element.topArea.style.zIndex = '2147483647';\n this._variable._bodyOverflow = _d.body.style.overflow;\n _d.body.style.overflow = 'hidden';\n this._variable._editorAreaOriginCssText = context.element.editorArea.style.cssText;\n this._variable._wysiwygOriginCssText = context.element.wysiwyg.style.cssText;\n this._variable._codeOriginCssText = context.element.code.style.cssText;\n context.element.editorArea.style.cssText = context.element.toolbar.style.cssText = context.element.wysiwyg.style.cssText = context.element.code.style.cssText = '';\n context.element.toolbar.style.width = context.element.wysiwyg.style.height = context.element.code.style.height = '100%';\n context.element.toolbar.style.position = 'relative';\n this._variable.innerHeight_fullScreen = _w.innerHeight - context.element.toolbar.offsetHeight;\n context.element.editorArea.style.height = this._variable.innerHeight_fullScreen + 'px';\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeClass(element.firstElementChild, 'icon-expansion');\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].addClass(element.firstElementChild, 'icon-reduction');\n } else {\n this._variable.isFullScreen = false;\n context.element.code.style.cssText = this._variable._codeOriginCssText;\n context.element.wysiwyg.style.cssText = this._variable._wysiwygOriginCssText;\n context.element.toolbar.style.cssText = '';\n context.element.editorArea.style.cssText = this._variable._editorAreaOriginCssText;\n context.element.topArea.style.cssText = this._variable._originCssText;\n _d.body.style.overflow = this._variable._bodyOverflow;\n\n if (context.option.stickyToolbar > -1) {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeClass(context.element.toolbar, 'sun-editor-sticky');\n event.onScroll_window();\n }\n\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeClass(element.firstElementChild, 'icon-reduction');\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].addClass(element.firstElementChild, 'icon-expansion');\n }\n },\n\n /**\r\n * @description Open the preview window or open the print window\r\n * @param {String} mode - 'preview' or 'print'\r\n */\n openWindowContents: function (mode) {\n const isPrint = mode === 'print';\n\n const windowObject = _w.open('', '_blank');\n\n windowObject.mimeType = 'text/html';\n windowObject.document.write('' + '' + '' + '' + '' + '' + (isPrint ? lang.toolbar.print : lang.toolbar.preview) + '' + '' + '' + '' + '
    ' + this.getContents() + '
    ' + (isPrint ? '' : '') + '' + '');\n },\n\n /**\r\n * @description Gets the current contents\r\n * @returns {Object}\r\n */\n getContents: function () {\n let contents = '';\n if (context.element.wysiwyg.innerText.trim().length === 0) return contents;\n\n if (editor._variable.wysiwygActive) {\n contents = context.element.wysiwyg.innerHTML;\n } else {\n contents = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].convertContentsForEditor(context.element.code.value);\n }\n\n const renderHTML = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createElement('DIV');\n renderHTML.innerHTML = contents;\n const figcaptions = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getListChildren(renderHTML, function (current) {\n return /FIGCAPTION/i.test(current.nodeName);\n });\n\n for (let i = 0, len = figcaptions.length; i < len; i++) {\n figcaptions[i].outerHTML = figcaptions[i].outerHTML.replace(/(?!^]*>)/i, '');\n }\n\n return renderHTML.innerHTML;\n }\n };\n /**\r\n * @description event function\r\n */\n\n const event = {\n _shortcutKeyCode: {\n 66: ['bold', 'B'],\n 83: ['strikethrough', 'STRIKE'],\n 85: ['underline', 'U'],\n 73: ['italic', 'I'],\n 89: ['redo'],\n 90: ['undo'],\n 219: ['outdent'],\n 221: ['indent']\n },\n _directionKeyKeyCode: new RegExp('^(?:8|13|32|46|33|34|35|36|37|38|39|40|98|100|102|104)$'),\n _changeButtonClassTagCheck: new RegExp('^(?:B|U|I|STRIKE|SUB|SUP)$'),\n _findButtonEffectTag: function () {\n const commandMap = editor.commandMap;\n const classOnCheck = this._changeButtonClassTagCheck;\n const commandMapNodes = [];\n const currentNodes = [];\n let findFormat = true,\n findFont = true,\n findSize = true,\n findA = true;\n let findB = true,\n findI = true,\n findU = true,\n findS = true;\n let cssText = '',\n nodeName = '';\n\n for (let selectionParent = editor.getSelectionNode(); !_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(selectionParent); selectionParent = selectionParent.parentNode) {\n if (!selectionParent) break;\n if (selectionParent.nodeType !== 1) continue;\n nodeName = selectionParent.nodeName.toUpperCase();\n currentNodes.push(nodeName);\n /** Format */\n\n if (findFormat && _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isFormatElement(selectionParent)) {\n commandMapNodes.push('FORMAT');\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].changeTxt(commandMap.FORMAT, nodeName);\n findFormat = false;\n continue;\n }\n /** Font */\n\n\n if (findFont && (selectionParent.style.fontFamily.length > 0 || selectionParent.face && selectionParent.face.length > 0)) {\n commandMapNodes.push('FONT');\n const selectFont = (selectionParent.style.fontFamily || selectionParent.face || lang.toolbar.font).replace(/[\"']/g, '');\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].changeTxt(commandMap.FONT, selectFont);\n findFont = false;\n }\n /** A */\n\n\n if (findA && /^A$/.test(nodeName) && selectionParent.getAttribute('data-image-link') === null) {\n if (!context.link || editor.controllerArray[0] !== context.link.linkBtn) {\n editor.callPlugin('link', function () {\n editor.plugins.link.call_controller_linkButton.call(editor, selectionParent);\n });\n }\n\n findA = false;\n } else if (findA && context.link && editor.controllerArray[0] === context.link.linkBtn) {\n editor.controllersOff();\n }\n /** SPAN */\n\n\n if (findSize && /^SPAN$/.test(nodeName)) {\n /** font size */\n if (selectionParent.style.fontSize.length > 0) {\n commandMapNodes.push('SIZE');\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].changeTxt(commandMap.SIZE, selectionParent.style.fontSize);\n findSize = false;\n }\n }\n /** command map */\n\n\n cssText = selectionParent.style.cssText;\n\n if (findB && /font\\-weight\\s*:\\s*(?:\\d+|bold|bolder)(?:;|\\s|)/.test(cssText)) {\n commandMapNodes.push('B');\n findB = false;\n }\n\n if (findI && /font\\-style\\s*:\\s*(?:italic|oblique)(?:;|\\s)/.test(cssText)) {\n commandMapNodes.push('I');\n findI = false;\n }\n\n if (findU && /text\\-decoration(?:\\-line)?\\s*:\\s*underline(?:;|\\s|)/.test(cssText)) {\n commandMapNodes.push('U');\n findU = false;\n }\n\n if (findS && /text\\-decoration(?:\\-line)?\\s*:\\s*line-through(?:;|\\s|)/.test(cssText)) {\n commandMapNodes.push('STRIKE');\n findS = false;\n }\n\n commandMapNodes.push(/^STRONG$/.test(nodeName) ? 'B' : /^EM$/.test(nodeName) ? 'I' : nodeName);\n }\n /** A Tag edit controller off */\n\n\n if (findA) editor.controllersOff();\n /** toggle class on */\n\n for (let i = 0; i < commandMapNodes.length; i++) {\n nodeName = commandMapNodes[i];\n\n if (classOnCheck.test(nodeName)) {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].addClass(commandMap[nodeName], 'on');\n }\n }\n /** remove class, display text */\n\n\n for (let key in commandMap) {\n if (commandMapNodes.indexOf(key) > -1) continue;\n\n if (/^FONT/i.test(key)) {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].changeTxt(commandMap[key], lang.toolbar.font);\n } else if (/^SIZE$/i.test(key)) {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].changeTxt(commandMap[key], lang.toolbar.fontSize);\n } else {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeClass(commandMap[key], 'on');\n }\n }\n /** save current nodes */\n\n\n editor._variable.currentNodes = currentNodes.reverse();\n /** Displays the current node structure to resizingBar */\n\n if (context.option.showPathLabel) context.element.navigation.textContent = editor._variable.currentNodes.join(' > ');\n },\n _cancelCaptionEdit: function () {\n this.setAttribute('contenteditable', false);\n this.removeEventListener('blur', event._cancelCaptionEdit);\n },\n onMouseDown_toolbar: function (e) {\n let target = e.target;\n\n if (_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getParentElement(target, '.sun-editor-submenu')) {\n e.stopPropagation();\n editor._notHideToolbar = true;\n } else {\n e.preventDefault();\n let command = target.getAttribute('data-command');\n let className = target.className;\n\n while (!command && !/editor_tool/.test(className) && !/sun-editor-id-toolbar/.test(className)) {\n target = target.parentNode;\n command = target.getAttribute('data-command');\n className = target.className;\n }\n\n if (command === editor._submenuName) {\n e.stopPropagation();\n }\n }\n },\n onClick_toolbar: function (e) {\n e.preventDefault();\n e.stopPropagation();\n let target = e.target;\n let display = target.getAttribute('data-display');\n let command = target.getAttribute('data-command');\n let className = target.className;\n\n while (!command && !/editor_tool/.test(className) && !/sun-editor-id-toolbar/.test(className)) {\n target = target.parentNode;\n command = target.getAttribute('data-command');\n display = target.getAttribute('data-display');\n className = target.className;\n }\n\n if (!command && !display) return;\n if (target.disabled) return;\n editor.focus();\n /** Dialog, Submenu */\n\n if (display) {\n if (/submenu/.test(display) && (target.nextElementSibling === null || target !== editor.submenuActiveButton)) {\n editor.callPlugin(command, function () {\n editor.submenuOn(target);\n });\n return;\n } else if (/dialog/.test(display)) {\n editor.callPlugin(command, function () {\n editor.plugins.dialog.open.call(editor, command, false);\n });\n return;\n }\n\n editor.submenuOff();\n return;\n }\n /** default command */\n\n\n if (command) {\n editor.commandHandler(target, command);\n }\n },\n onMouseUp_wysiwyg: function () {\n editor._editorRange();\n\n if (editor._isBalloon) {\n const range = editor.getRange();\n if (range.collapsed) event._hideToolbar();else event._showToolbarBalloon(range);\n }\n },\n onClick_wysiwyg: function (e) {\n e.stopPropagation();\n const targetElement = e.target;\n\n if (/^IMG$/i.test(targetElement.nodeName)) {\n e.preventDefault();\n editor.callPlugin('image', function () {\n const size = editor.plugins.resizing.call_controller_resize.call(editor, targetElement, 'image');\n editor.plugins.image.onModifyMode.call(editor, targetElement, size);\n\n if (!_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getParentElement(targetElement, '.sun-editor-id-image-container')) {\n editor.plugins.image.openModify.call(editor, true);\n editor.plugins.image.update_image.call(editor);\n editor.controllersOff();\n }\n });\n return;\n }\n\n if (/sun-editor-id-iframe-inner-resizing-cover/i.test(targetElement.className)) {\n e.preventDefault();\n editor.callPlugin('video', function () {\n const iframe = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getChildElement(targetElement.parentNode, 'iframe');\n const size = editor.plugins.resizing.call_controller_resize.call(editor, iframe, 'video');\n editor.plugins.video.onModifyMode.call(editor, iframe, size);\n });\n return;\n }\n\n event._findButtonEffectTag();\n\n const figcaption = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getParentElement(targetElement, 'FIGCAPTION');\n\n if (figcaption && figcaption.getAttribute('contenteditable') !== 'ture') {\n e.preventDefault();\n figcaption.setAttribute('contenteditable', true);\n figcaption.focus();\n\n if (editor._isInline && !editor._inlineToolbarAttr.isShow) {\n event._showToolbarInline();\n\n const hideToolbar = function () {\n event._hideToolbar();\n\n figcaption.removeEventListener('blur', hideToolbar);\n };\n\n figcaption.addEventListener('blur', hideToolbar);\n }\n } else {\n const td = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getParentElement(targetElement, _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isCell);\n\n if (td) {\n if (editor.controllerArray.length === 0) {\n editor.callPlugin('table', editor.plugins.table.call_controller_tableEdit.bind(editor, td));\n }\n }\n }\n\n if (userFunction.onClick) userFunction.onClick(e);\n },\n _showToolbarBalloon: function (rangeObj) {\n const range = rangeObj || editor.getRange();\n const padding = 20;\n const toolbar = context.element.toolbar;\n\n const selection = _w.getSelection();\n\n let isDirTop;\n\n if (selection.focusNode === selection.anchorNode) {\n isDirTop = selection.focusOffset < selection.anchorOffset;\n } else {\n const childNodes = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getListChildNodes(range.commonAncestorContainer);\n isDirTop = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getArrayIndex(childNodes, selection.focusNode) < _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getArrayIndex(childNodes, selection.anchorNode);\n }\n\n let rects = range.getClientRects();\n rects = rects[isDirTop ? 0 : rects.length - 1];\n toolbar.style.display = 'block';\n const toolbarWidth = toolbar.offsetWidth;\n const toolbarHeight = toolbar.offsetHeight;\n let l = (isDirTop ? rects.left : rects.right) - context.element.topArea.offsetLeft + (_w.scrollX || _d.documentElement.scrollLeft) - toolbarWidth / 2;\n let t = (isDirTop ? rects.top - toolbarHeight - 11 : rects.bottom + 11) - context.element.topArea.offsetTop + (_w.scrollY || _d.documentElement.scrollTop);\n const overRight = l + toolbarWidth - context.element.topArea.offsetWidth;\n toolbar.style.left = (l < 0 ? padding : overRight < 0 ? l : l - overRight - padding) + 'px';\n toolbar.style.top = t + 'px';\n\n if (isDirTop) {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeClass(context.element._arrow, 'arrow-up');\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].addClass(context.element._arrow, 'arrow-down');\n context.element._arrow.style.top = toolbarHeight + 'px';\n } else {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeClass(context.element._arrow, 'arrow-down');\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].addClass(context.element._arrow, 'arrow-up');\n context.element._arrow.style.top = '-11px';\n }\n\n const arrow_width = context.element._arrow.offsetWidth;\n const arrow_left = toolbarWidth / 2 + (l < 0 ? l - arrow_width : overRight < 0 ? 0 : overRight + arrow_width);\n const arrow_point_width = arrow_width / 2;\n context.element._arrow.style.left = (arrow_left < arrow_point_width ? arrow_point_width : arrow_left + arrow_point_width >= toolbarWidth ? arrow_left - arrow_point_width : arrow_left) + 'px';\n },\n _showToolbarInline: function () {\n const toolbar = context.element.toolbar;\n toolbar.style.display = 'block';\n editor._inlineToolbarAttr.width = toolbar.style.width = context.option.toolbarWidth;\n editor._inlineToolbarAttr.top = toolbar.style.top = -1 - toolbar.offsetHeight + 'px';\n event.onScroll_window();\n editor._inlineToolbarAttr.isShow = true;\n },\n _hideToolbar: function () {\n if (!editor._notHideToolbar) {\n context.element.toolbar.style.display = 'none';\n editor._inlineToolbarAttr.isShow = false;\n }\n\n editor._notHideToolbar = false;\n },\n onKeyDown_wysiwyg: function (e) {\n const keyCode = e.keyCode;\n const shift = e.shiftKey;\n const ctrl = e.ctrlKey || e.metaKey;\n const alt = e.altKey;\n\n if (editor._isBalloon) {\n event._hideToolbar();\n }\n\n function shortcutCommand(keyCode) {\n const key = event._shortcutKeyCode[keyCode];\n if (!key) return false;\n editor.commandHandler(_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getFormatElement(editor.getSelectionNode()), key[0]);\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].toggleClass(editor.commandMap[key[1]], 'on');\n return true;\n }\n /** Shortcuts */\n\n\n if (ctrl && !/^(?:16|17|18)$/.test(keyCode)) {\n if (!(!shift && keyCode === 83) && shortcutCommand(keyCode)) {\n e.preventDefault();\n return;\n }\n }\n /** default key action */\n\n\n const selectionNode = editor.getSelectionNode();\n\n switch (keyCode) {\n case 8:\n /**backspace key*/\n if (_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isFormatElement(selectionNode) && _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(selectionNode.parentNode) && selectionNode.previousSibling === null) {\n e.preventDefault();\n e.stopPropagation();\n selectionNode.innerHTML = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].zeroWidthSpace;\n return false;\n }\n\n break;\n\n case 9:\n /**tab key*/\n e.preventDefault();\n if (ctrl || alt) break;\n editor.controllersOff();\n let currentNode = selectionNode || editor.getSelectionNode();\n\n while (!_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isCell(currentNode) && !_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(currentNode)) {\n currentNode = currentNode.parentNode;\n }\n\n if (currentNode && _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isCell(currentNode)) {\n const table = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getParentElement(currentNode, 'table');\n const cells = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getListChildren(table, _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isCell);\n let idx = shift ? _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].prevIdx(cells, currentNode) : _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].nextIdx(cells, currentNode);\n if (idx === cells.length && !shift) idx = 0;\n if (idx === -1 && shift) idx = cells.length - 1;\n const moveCell = cells[idx];\n if (!moveCell) return false;\n editor.setRange(moveCell, 0, moveCell, 0);\n break;\n }\n /** format Tag */\n\n\n const lines = editor.getSelectedFormatElements();\n\n if (!shift) {\n const tabText = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(new Array(editor._variable.tabSize + 1).join('\\u00A0'));\n\n if (lines.length === 1) {\n editor.insertNode(tabText);\n editor.setRange(tabText, editor._variable.tabSize, tabText, editor._variable.tabSize);\n } else {\n for (let i = 0, len = lines.length; i < len; i++) {\n lines[i].insertBefore(tabText.cloneNode(false), lines[i].firstChild);\n }\n }\n } else {\n for (let i = 0, len = lines.length, child; i < len; i++) {\n child = lines[i].firstChild;\n\n if (/^\\s{1,4}$/.test(child.textContent)) {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeItem(child);\n } else if (/^\\s{1,4}/.test(child.textContent)) {\n child.textContent = child.textContent.replace(/^\\s{1,4}/, '');\n }\n }\n }\n\n break;\n }\n\n if (userFunction.onKeyDown) userFunction.onKeyDown(e);\n },\n onKeyUp_wysiwyg: function (e) {\n editor._editorRange();\n\n editor.controllersOff();\n const selectionNode = editor.getSelectionNode();\n\n if (editor._isBalloon && !editor.getRange().collapsed) {\n event._showToolbarBalloon();\n\n return;\n }\n /** when format tag deleted */\n\n\n if (e.keyCode === 8 && _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(selectionNode) && context.element.wysiwyg.textContent.length === 0) {\n e.preventDefault();\n e.stopPropagation();\n const oFormatTag = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createElement(_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isFormatElement(editor._variable.currentNodes[0]) ? editor._variable.currentNodes[0] : 'P');\n oFormatTag.innerHTML = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].zeroWidthSpace;\n selectionNode.appendChild(oFormatTag);\n editor.setRange(oFormatTag, 0, oFormatTag, 0);\n return;\n }\n\n if ((_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(selectionNode.parentElement) || _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isRangeFormatElement(selectionNode.parentElement)) && selectionNode.nodeType === 3) {\n editor.execCommand('formatBlock', false, _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(selectionNode.parentElement) ? 'P' : 'DIV');\n\n event._findButtonEffectTag();\n\n return;\n }\n\n if (event._directionKeyKeyCode.test(e.keyCode)) {\n event._findButtonEffectTag();\n }\n\n if (userFunction.onKeyUp) userFunction.onKeyUp(e);\n },\n onScroll_wysiwyg: function (e) {\n editor.controllersOff();\n if (userFunction.onScroll) userFunction.onScroll(e);\n },\n onDrop_wysiwyg: function (e) {\n const files = e.dataTransfer.files;\n\n if (files.length > 0) {\n e.stopPropagation();\n e.preventDefault();\n editor.focus();\n editor.callPlugin('image', function () {\n context.image.imgInputFile.files = files;\n editor.plugins.image.onRender_imgInput.call(editor);\n context.image.imgInputFile.files = null;\n });\n }\n\n if (userFunction.onDrop) userFunction.onDrop(e);\n },\n onMouseDown_resizingBar: function (e) {\n e.stopPropagation();\n editor._variable.resizeClientY = e.clientY;\n context.element.resizeBackground.style.display = 'block';\n\n function closureFunc() {\n context.element.resizeBackground.style.display = 'none';\n\n _d.removeEventListener('mousemove', event._resize_editor);\n\n _d.removeEventListener('mouseup', closureFunc);\n }\n\n _d.addEventListener('mousemove', event._resize_editor);\n\n _d.addEventListener('mouseup', closureFunc);\n },\n _resize_editor: function (e) {\n const resizeInterval = context.element.editorArea.offsetHeight + (e.clientY - editor._variable.resizeClientY);\n context.element.wysiwyg.style.height = context.element.code.style.height = (resizeInterval < editor._variable.minResizingSize ? editor._variable.minResizingSize : resizeInterval) + 'px';\n editor._variable.resizeClientY = e.clientY;\n },\n onResize_window: function () {\n if (context.element.toolbar.offsetWidth === 0) return;\n\n if (editor._variable.isFullScreen) {\n editor._variable.innerHeight_fullScreen += _w.innerHeight - context.element.toolbar.offsetHeight - editor._variable.innerHeight_fullScreen;\n context.element.editorArea.style.height = editor._variable.innerHeight_fullScreen + 'px';\n } else if (editor._variable._sticky) {\n context.element.toolbar.style.width = context.element.topArea.offsetWidth - 2 + 'px';\n event.onScroll_window();\n }\n\n editor.controllersOff();\n },\n onScroll_window: function () {\n if (editor._variable.isFullScreen || context.element.toolbar.offsetWidth === 0) return;\n const element = context.element;\n const editorHeight = element.editorArea.offsetHeight;\n const editorTop = element.topArea.offsetTop - (editor._isInline ? element.toolbar.offsetHeight : 0);\n const y = (this.scrollY || _d.documentElement.scrollTop) + context.option.stickyToolbar;\n\n if (y < editorTop) {\n event._offStickyToolbar(element);\n } else if (y + editor._variable.minResizingSize >= editorHeight + editorTop) {\n if (!editor._variable._sticky) event._onStickyToolbar(element);\n element.toolbar.style.top = editorHeight + editorTop + context.option.stickyToolbar - y - editor._variable.minResizingSize + 'px';\n } else if (y >= editorTop) {\n event._onStickyToolbar(element);\n }\n },\n _onStickyToolbar: function (element) {\n if (!editor._isInline) {\n element._stickyDummy.style.height = element.toolbar.offsetHeight + 'px';\n element._stickyDummy.style.display = 'block';\n }\n\n element.toolbar.style.top = context.option.stickyToolbar + 'px';\n element.toolbar.style.width = editor._isInline ? editor._inlineToolbarAttr.width : element.toolbar.offsetWidth + 'px';\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].addClass(element.toolbar, 'sun-editor-sticky');\n editor._variable._sticky = true;\n },\n _offStickyToolbar: function (element) {\n element._stickyDummy.style.display = 'none';\n element.toolbar.style.top = editor._isInline ? editor._inlineToolbarAttr.top : '';\n element.toolbar.style.width = editor._isInline ? editor._inlineToolbarAttr.width : '';\n element.editorArea.style.marginTop = '';\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeClass(element.toolbar, 'sun-editor-sticky');\n editor._variable._sticky = false;\n },\n _codeViewAutoScroll: function () {\n context.element.code.style.height = context.element.code.scrollHeight + 'px';\n },\n onPaste_wysiwyg: function (e) {\n if (!e.clipboardData.getData) return true;\n const cleanData = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].cleanHTML(e.clipboardData.getData('text/html'));\n\n if (cleanData) {\n editor.execCommand('insertHTML', false, cleanData);\n e.stopPropagation();\n e.preventDefault();\n }\n }\n };\n /** add event listeners */\n\n /** toolbar event */\n\n context.element.toolbar.addEventListener('mousedown', event.onMouseDown_toolbar, false);\n context.element.toolbar.addEventListener('click', event.onClick_toolbar, false);\n /** editor area */\n\n context.element.relative.addEventListener('click', editor.focus.bind(editor), false);\n context.element.wysiwyg.addEventListener('mouseup', event.onMouseUp_wysiwyg, false);\n context.element.wysiwyg.addEventListener('click', event.onClick_wysiwyg, false);\n context.element.wysiwyg.addEventListener('scroll', event.onScroll_wysiwyg, false);\n context.element.wysiwyg.addEventListener('keydown', event.onKeyDown_wysiwyg, false);\n context.element.wysiwyg.addEventListener('keyup', event.onKeyUp_wysiwyg, false);\n context.element.wysiwyg.addEventListener('drop', event.onDrop_wysiwyg, false);\n context.element.wysiwyg.addEventListener('paste', event.onPaste_wysiwyg, false);\n /** code view area auto line */\n\n if (context.option.height === 'auto') context.element.code.addEventListener('keyup', event._codeViewAutoScroll, false);\n /** resizingBar */\n\n if (context.element.resizingBar) {\n if (/\\d+/.test(context.option.height)) {\n context.element.resizingBar.addEventListener('mousedown', event.onMouseDown_resizingBar, false);\n } else {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].addClass(context.element.resizingBar, 'none-resize');\n }\n }\n /** inline editor */\n\n\n if (editor._isInline) {\n context.element.wysiwyg.addEventListener('focus', event._showToolbarInline, false);\n }\n\n if (editor._isInline || editor._isBalloon) {\n context.element.wysiwyg.addEventListener('blur', event._hideToolbar, false);\n }\n /** window event */\n\n\n _w.addEventListener('resize', event.onResize_window, false);\n\n if (context.option.stickyToolbar > -1) _w.addEventListener('scroll', event.onScroll_window, false);\n /** add plugin to plugins object */\n\n if (plugins) {\n Object.keys(plugins).map(function (key) {\n let plugin = plugins[key];\n editor.plugins[plugin.name] = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].copyObj(plugin);\n });\n }\n /** User function */\n\n\n const userFunction = {\n /**\r\n * @description Event functions\r\n * @param {Object} event - Event Object\r\n */\n onScroll: null,\n onClick: null,\n onKeyDown: null,\n onKeyUp: null,\n onDrop: null,\n\n /**\r\n * @description Called when the image is uploaded or the uploaded image is deleted\r\n * @param {Element} targetImgElement - Current img element\r\n * @param {Number} index - Uploaded index\r\n * @param {Boolean} isDelete - Whether or not it was called after the delete operation\r\n * @param {Object} imageInfo - Image info object\r\n */\n onImageUpload: null,\n\n /**\r\n * @description Called when the image is upload failed\r\n * @param {String} errorMessage - Error message\r\n * @param {Object} result - Result info Object\r\n */\n onImageUploadError: null,\n\n /**\r\n * @description Open a notice area\r\n * @param {String} message - Notice message\r\n */\n noticeOpen: function (message) {\n editor.addModule([_plugins_modules_notice__WEBPACK_IMPORTED_MODULE_1__[\"default\"]]);\n _plugins_modules_notice__WEBPACK_IMPORTED_MODULE_1__[\"default\"].open.call(editor, message);\n },\n\n /**\r\n * @description Close a notice area\r\n */\n noticeClose: function () {\n editor.addModule([_plugins_modules_notice__WEBPACK_IMPORTED_MODULE_1__[\"default\"]]);\n _plugins_modules_notice__WEBPACK_IMPORTED_MODULE_1__[\"default\"].close.call(editor);\n },\n\n /**\r\n * @description Copying the contents of the editor to the original textarea\r\n */\n save: function () {\n context.element.originElement.value = editor.getContents();\n },\n\n /**\r\n * @description Gets the suneditor's context object. Contains settings, plugins, and cached element objects\r\n * @returns {Object}\r\n */\n getContext: function () {\n return context;\n },\n\n /**\r\n * @description Gets the contents of the suneditor\r\n * @returns {String}\r\n */\n getContents: function () {\n return editor.getContents();\n },\n\n /**\r\n * @description Gets uploaded images informations\r\n * @returns {Array}\r\n */\n getImagesInfo: function () {\n return editor._variable._imagesInfo;\n },\n\n /**\r\n * @description Inserts an HTML element or HTML string or plain string at the current cursor position\r\n * @param {Element|String} html - HTML Element or HTML string or plain string\r\n */\n insertHTML: function (html) {\n if (!html.nodeType || html.nodeType !== 1) {\n const template = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createElement('template');\n template.innerHTML = html;\n html = template.firstChild || template.content.firstChild;\n }\n\n editor.insertNode(html);\n editor.focus();\n },\n\n /**\r\n * @description Change the contents of the suneditor\r\n * @param {String} contents - Contents to Input\r\n */\n setContents: function (contents) {\n if (editor._variable.wysiwygActive) {\n context.element.wysiwyg.innerHTML = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].convertContentsForEditor(contents);\n } else {\n context.element.code.value = contents;\n }\n },\n\n /**\r\n * @description Add contents to the suneditor\r\n * @param {String} contents - Contents to Input\r\n */\n appendContents: function (contents) {\n if (editor._variable.wysiwygActive) {\n context.element.wysiwyg.innerHTML += _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].convertContentsForEditor(contents);\n } else {\n context.element.code.value += contents;\n }\n },\n\n /**\r\n * @description Disable the suneditor\r\n */\n disabled: function () {\n context.tool.cover.style.display = 'block';\n context.element.wysiwyg.setAttribute('contenteditable', false);\n context.element.code.setAttribute('disabled', 'disabled');\n },\n\n /**\r\n * @description Enabled the suneditor\r\n */\n enabled: function () {\n context.tool.cover.style.display = 'none';\n context.element.wysiwyg.setAttribute('contenteditable', true);\n context.element.code.removeAttribute('disabled');\n },\n\n /**\r\n * @description Show the suneditor\r\n */\n show: function () {\n const topAreaStyle = context.element.topArea.style;\n if (topAreaStyle.display === 'none') topAreaStyle.display = context.option.display;\n },\n\n /**\r\n * @description Hide the suneditor\r\n */\n hide: function () {\n context.element.topArea.style.display = 'none';\n },\n\n /**\r\n * @description Destroy the suneditor\r\n */\n destroy: function () {\n /** remove window event listeners */\n _w.removeEventListener('resize', event.onResize_window);\n\n _w.removeEventListener('scroll', event.onScroll_window);\n /** remove element */\n\n\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeItem(context.element.topArea);\n this.onScroll = null;\n this.onClick = null;\n this.onKeyDown = null;\n this.onKeyUp = null;\n this.onDrop = null;\n this.save = null;\n this.onImageUpload = null;\n this.onImageUploadError = null;\n this.noticeOpen = null;\n this.noticeClose = null;\n this.getContext = null;\n this.getContents = null;\n this.getImagesInfo = null;\n this.insertHTML = null;\n this.setContents = null;\n this.appendContents = null;\n this.disabled = null;\n this.enabled = null;\n this.show = null;\n this.hide = null;\n this.destroy = null;\n context = null;\n plugins = null;\n lang = null;\n }\n };\n return userFunction;\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (core);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvbGliL2NvcmUuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbGliL2NvcmUuanM/OGE4ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiB3eXNpd3lnIHdlYiBlZGl0b3JcclxuICpcclxuICogc3VuZWRpdG9yLmpzXHJcbiAqIENvcHlyaWdodCAyMDE3IEppSG9uZyBMZWUuXHJcbiAqIE1JVCBsaWNlbnNlLlxyXG4gKi9cclxuJ3VzZSBzdHJpY3QnO1xyXG5cclxuaW1wb3J0IHV0aWwgZnJvbSAnLi91dGlsJztcclxuaW1wb3J0IG5vdGljZSBmcm9tICcuLi9wbHVnaW5zL21vZHVsZXMvbm90aWNlJztcclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gU3VuRWRpdG9yIGNvcmUgZnVuY3Rpb25cclxuICogQHBhcmFtIGNvbnRleHRcclxuICogQHBhcmFtIHBsdWdpbnNcclxuICogQHBhcmFtIGxhbmdcclxuICogQHJldHVybnMge09iamVjdH0gVXNlckZ1bmN0aW9uIE9iamVjdFxyXG4gKi9cclxuY29uc3QgY29yZSA9IGZ1bmN0aW9uIChjb250ZXh0LCBwbHVnaW5zLCBsYW5nKSB7XHJcbiAgICBjb25zdCBfZCA9IGRvY3VtZW50O1xyXG4gICAgY29uc3QgX3cgPSB3aW5kb3c7XHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBlZGl0b3IgY29yZSBvYmplY3RcclxuICAgICAqIHNob3VsZCBhbHdheXMgYmluZCB0aGlzIG9iamVjdCB3aGVuIHJlZ2lzdGVyaW5nIGFuIGV2ZW50IGluIHRoZSBwbHVnLWluLlxyXG4gICAgICovXHJcbiAgICBjb25zdCBlZGl0b3IgPSB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEVsZW1lbnRzIGFuZCB1c2VyIG9wdGlvbnMgcGFyYW1ldGVycyBvZiB0aGUgc3VuZWRpdG9yXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29udGV4dDogY29udGV4dCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIGxvYWRlZCBwbHVnaW5zXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcGx1Z2luczoge30sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBXaGV0aGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWRcclxuICAgICAgICAgKi9cclxuICAgICAgICBpbml0UGx1Z2luczoge30sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBsb2FkZWQgbGFuZ3VhZ2VcclxuICAgICAgICAgKi9cclxuICAgICAgICBsYW5nOiBsYW5nLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gZGlhbG9nIGVsZW1lbnRcclxuICAgICAgICAgKi9cclxuICAgICAgICBkaWFsb2dGb3JtOiBudWxsLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gY3VycmVudCBzdWJtZW50IG5hbWVcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF9zdWJtZW51TmFtZTogJycsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBzdWJtZW51IGVsZW1lbnRcclxuICAgICAgICAgKi9cclxuICAgICAgICBzdWJtZW51OiBudWxsLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gYmluZGVkIHN1Ym1lbnVPZmYgbWV0aG9kXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfYmluZGVkU3VibWVudU9mZjogbnVsbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIGFjdGl2ZSBidXR0b24gZWxlbWVudCBpbiBzdWJtZW51XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc3VibWVudUFjdGl2ZUJ1dHRvbjogbnVsbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFRoZSBlbGVtZW50cyBhcnJheSB0byBiZSBwcm9jZXNzZWQgdW52aXNpYmxlIHdoZW4gdGhlIGNvbnRyb2xsZXJzT2ZmIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIChyZXNpemluZywgbGluayBtb2RpZmllZCBidXR0b24sIHRhYmxlIGNvbnRyb2xsZXIpXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29udHJvbGxlckFycmF5OiBbXSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIGJpbmRlZCBjb250cm9sbGVyc09mZiBtZXRob2RcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF9iaW5kQ29udHJvbGxlcnNPZmY6IG51bGwsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBBbiBhcnJheSBvZiBidXR0b25zIHdob3NlIGNsYXNzIG5hbWUgaXMgbm90IFwiY29kZS12aWV3LWVuYWJsZWRcIlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvZGVWaWV3RGlzYWJsZWRCdXR0b25zOiBjb250ZXh0LmVsZW1lbnQudG9vbGJhci5xdWVyeVNlbGVjdG9yQWxsKCcuc3VuLWVkaXRvci1pZC10b29sYmFyIGJ1dHRvbjpub3QoW2NsYXNzfj1cImNvZGUtdmlldy1lbmFibGVkXCJdKScpLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gSXMgaW5saW5lIG1vZGU/XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfaXNJbmxpbmU6IC9pbmxpbmUvaS50ZXN0KGNvbnRleHQub3B0aW9uLm1vZGUpLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gSXMgYmFsbG9vbiBtb2RlP1xyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX2lzQmFsbG9vbjogL2JhbGxvb24vaS50ZXN0KGNvbnRleHQub3B0aW9uLm1vZGUpLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gUmVxdWlyZWQgdmFsdWUgd2hlbiB1c2luZyBpbmxpbmUgbW9kZSB0byBzdGlja3kgdG9vbGJhclxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX2lubGluZVRvb2xiYXJBdHRyOiB7d2lkdGg6IDAsIGhlaWdodDogMCwgaXNTaG93OiBmYWxzZX0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBWYXJpYWJsZSB0aGF0IGNvbnRyb2xzIHRoZSBcImJsdXJcIiBldmVudCBpbiB0aGUgZWRpdG9yIG9mIGlubGluZSBvciBiYWxsb29uIG1vZGUgd2hlbiB0aGUgZm9jdXMgaXMgbW92ZWQgdG8gc3VibWVudVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX25vdEhpZGVUb29sYmFyOiBmYWxzZSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEFuIHVzZXIgZXZlbnQgZnVuY3Rpb24gd2hlbiBpbWFnZSB1cGxvYWRlZCBzdWNjZXNzIG9yIHJlbW92ZSBpbWFnZVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX2ltYWdlVXBsb2FkOiBmdW5jdGlvbiAodGFyZ2V0SW1nRWxlbWVudCwgaW5kZXgsIGlzRGVsZXRlLCBpbWFnZUluZm8pIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB1c2VyRnVuY3Rpb24ub25JbWFnZVVwbG9hZCA9PT0gJ2Z1bmN0aW9uJykgdXNlckZ1bmN0aW9uLm9uSW1hZ2VVcGxvYWQodGFyZ2V0SW1nRWxlbWVudCwgaW5kZXggKiAxLCBpc0RlbGV0ZSwgaW1hZ2VJbmZvKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gQW4gdXNlciBldmVudCBmdW5jdGlvbiB3aGVuIGltYWdlIHVwbG9hZCBmYWlsZWRcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF9pbWFnZVVwbG9hZEVycm9yOiBmdW5jdGlvbiAoZXJyb3JNZXNzYWdlLCByZXN1bHQpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB1c2VyRnVuY3Rpb24ub25JbWFnZVVwbG9hZEVycm9yID09PSAnZnVuY3Rpb24nKSByZXR1cm4gdXNlckZ1bmN0aW9uLm9uSW1hZ2VVcGxvYWRFcnJvcihlcnJvck1lc3NhZ2UsIHJlc3VsdCk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBFbGVtZW50cyB0aGF0IG5lZWQgdG8gY2hhbmdlIHRleHQgb3IgY2xhc3NOYW1lIGZvciBlYWNoIHNlbGVjdGlvbiBjaGFuZ2VcclxuICAgICAgICAgKiBAcHJvcGVydHkge0VsZW1lbnR9IEZPUk1BVCAtIGZvcm1hdCBidXR0b25cclxuICAgICAgICAgKiBAcHJvcGVydHkge0VsZW1lbnR9IEZPTlQgLSBmb250IGZhbWlseSBidXR0b25cclxuICAgICAgICAgKiBAcHJvcGVydHkge0VsZW1lbnR9IFNJWkUgLSBmb250IHNpemUgYnV0dG9uXHJcbiAgICAgICAgICogQHByb3BlcnR5IHtFbGVtZW50fSBCIC0gYm9sZCBidXR0b25cclxuICAgICAgICAgKiBAcHJvcGVydHkge0VsZW1lbnR9IFUgLSB1bmRlcmxpbmUgYnV0dG9uXHJcbiAgICAgICAgICogQHByb3BlcnR5IHtFbGVtZW50fSBJIC0gaXRhbGljIGJ1dHRvblxyXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gU1RSSUtFIC0gc3RyaWtlIGJ1dHRvblxyXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gU1VCIC0gc3Vic2NyaXB0IGJ1dHRvblxyXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gU1VQIC0gc3VwZXJzY3JpcHQgYnV0dG9uXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29tbWFuZE1hcDoge1xyXG4gICAgICAgICAgICBGT1JNQVQ6IGNvbnRleHQudG9vbC5mb3JtYXQsXHJcbiAgICAgICAgICAgIEZPTlQ6IGNvbnRleHQudG9vbC5mb250LFxyXG4gICAgICAgICAgICBTSVpFOiBjb250ZXh0LnRvb2wuZm9udFNpemUsXHJcbiAgICAgICAgICAgIEI6IGNvbnRleHQudG9vbC5ib2xkLFxyXG4gICAgICAgICAgICBVOiBjb250ZXh0LnRvb2wudW5kZXJsaW5lLFxyXG4gICAgICAgICAgICBJOiBjb250ZXh0LnRvb2wuaXRhbGljLFxyXG4gICAgICAgICAgICBTVFJJS0U6IGNvbnRleHQudG9vbC5zdHJpa2UsXHJcbiAgICAgICAgICAgIFNVQjogY29udGV4dC50b29sLnN1YnNjcmlwdCxcclxuICAgICAgICAgICAgU1VQOiBjb250ZXh0LnRvb2wuc3VwZXJzY3JpcHRcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gVmFyaWFibGVzIHVzZWQgaW50ZXJuYWxseSBpbiBlZGl0b3Igb3BlcmF0aW9uXHJcbiAgICAgICAgICogQHByb3BlcnR5IHtCb29sZWFufSB3eXNpd3lnQWN0aXZlIC0gVGhlIHd5c2l3eWcgZnJhbWUgb3IgY29kZSB2aWV3IHN0YXRlXHJcbiAgICAgICAgICogQHByb3BlcnR5IHtCb29sZWFufSBpc0Z1bGxTY3JlZW4gLSBTdGF0ZSBvZiBmdWxsIHNjcmVlblxyXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBpbm5lckhlaWdodF9mdWxsU2NyZWVuIC0gSW5uZXJIZWlnaHQgaW4gZWRpdG9yIHdoZW4gaW4gZnVsbCBzY3JlZW5cclxuICAgICAgICAgKiBAcHJvcGVydHkge051bWJlcn0gcmVzaXplQ2xpZW50WSAtIFJlbWVtYmVyIHRoZSB2ZXJ0aWNhbCBzaXplIG9mIHRoZSBlZGl0b3IgYmVmb3JlIHJlc2l6aW5nIHRoZSBlZGl0b3IgKFVzZWQgd2hlbiBjYWxjdWxhdGluZyBkdXJpbmcgcmVzaXplIG9wZXJhdGlvbilcclxuICAgICAgICAgKiBAcHJvcGVydHkge051bWJlcn0gdGFiU2l6ZSAtIEluZGVudGVkIHNpemUgd2hlbiB0YWIgYnV0dG9uIGNsaWNrZWQgKDQpXHJcbiAgICAgICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IG1pblJlc2l6aW5nU2l6ZSAtIE1pbmltdW0gc2l6ZSBvZiBlZGl0aW5nIGFyZWEgd2hlbiByZXNpemVkICg2NSlcclxuICAgICAgICAgKiBAcHJvcGVydHkge0FycmF5fSBjdXJyZW50Tm9kZXMgLSAgQW4gYXJyYXkgb2YgdGhlIGN1cnJlbnQgY3Vyc29yJ3Mgbm9kZSBzdHJ1Y3R1cmVcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF92YXJpYWJsZToge1xyXG4gICAgICAgICAgICB3eXNpd3lnQWN0aXZlOiB0cnVlLFxyXG4gICAgICAgICAgICBpc0Z1bGxTY3JlZW46IGZhbHNlLFxyXG4gICAgICAgICAgICBpbm5lckhlaWdodF9mdWxsU2NyZWVuOiAwLFxyXG4gICAgICAgICAgICByZXNpemVDbGllbnRZOiAwLFxyXG4gICAgICAgICAgICB0YWJTaXplOiA0LFxyXG4gICAgICAgICAgICBtaW5SZXNpemluZ1NpemU6IDY1LFxyXG4gICAgICAgICAgICBjdXJyZW50Tm9kZXM6IFtdLFxyXG4gICAgICAgICAgICBfcmFuZ2U6IG51bGwsXHJcbiAgICAgICAgICAgIF9zZWxlY3Rpb25Ob2RlOiBudWxsLFxyXG4gICAgICAgICAgICBfb3JpZ2luQ3NzVGV4dDogY29udGV4dC5lbGVtZW50LnRvcEFyZWEuc3R5bGUuY3NzVGV4dCxcclxuICAgICAgICAgICAgX2JvZHlPdmVyZmxvdzogJycsXHJcbiAgICAgICAgICAgIF9lZGl0b3JBcmVhT3JpZ2luQ3NzVGV4dDogJycsXHJcbiAgICAgICAgICAgIF93eXNpd3lnT3JpZ2luQ3NzVGV4dDogJycsXHJcbiAgICAgICAgICAgIF9jb2RlT3JpZ2luQ3NzVGV4dDogJycsXHJcbiAgICAgICAgICAgIF9zdGlja3k6IGZhbHNlLFxyXG4gICAgICAgICAgICBfaW1hZ2VzSW5mbzogW10sXHJcbiAgICAgICAgICAgIF9pbWFnZUluZGV4OiAwXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIElmIHRoZSBwbHVnaW4gaXMgbm90IGFkZGVkLCBhZGQgdGhlIHBsdWdpbiBhbmQgY2FsbCB0aGUgJ2FkZCcgZnVuY3Rpb24uXHJcbiAgICAgICAgICogSWYgdGhlIHBsdWdpbiBpcyBhZGRlZCBjYWxsIGNhbGxCYWNrIGZ1bmN0aW9uLlxyXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwbHVnaW5OYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHBsdWdpbiB0byBjYWxsXHJcbiAgICAgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbEJhY2tGdW5jdGlvbiAtIEZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGltbWVkaWF0ZWx5IGFmdGVyIG1vZHVsZSBjYWxsXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY2FsbFBsdWdpbjogZnVuY3Rpb24gKHBsdWdpbk5hbWUsIGNhbGxCYWNrRnVuY3Rpb24pIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLnBsdWdpbnNbcGx1Z2luTmFtZV0pIHtcclxuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdbU1VORURJVE9SLmNvcmUuY2FsbFBsdWdpbi5mYWlsXSBUaGUgY2FsbGVkIHBsdWdpbiBkb2VzIG5vdCBleGlzdCBvciBpcyBpbiBhbiBpbnZhbGlkIGZvcm1hdC4gKHBsdWdpbk5hbWU6XCInICsgcGx1Z2luTmFtZSArICdcIiknKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5pbml0UGx1Z2luc1twbHVnaW5OYW1lXSl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnNbcGx1Z2luTmFtZV0uYWRkKHRoaXMsIHRoaXMucGx1Z2luc1twbHVnaW5OYW1lXS5idXR0b25FbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFBsdWdpbnNbcGx1Z2luTmFtZV0gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgY2FsbEJhY2tGdW5jdGlvbigpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBJZiB0aGUgbW9kdWxlIGlzIG5vdCBhZGRlZCwgYWRkIHRoZSBtb2R1bGUgYW5kIGNhbGwgdGhlICdhZGQnIGZ1bmN0aW9uXHJcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gbW9kdWxlQXJyYXkgLSBtb2R1bGUgb2JqZWN0J3MgQXJyYXkgW2RpYWxvZywgcmVzaXppbmddXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgYWRkTW9kdWxlOiBmdW5jdGlvbiAobW9kdWxlQXJyYXkpIHtcclxuICAgICAgICAgICAgbGV0IG1vZHVsZU5hbWUgPSAnJztcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IG1vZHVsZUFycmF5Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBtb2R1bGVOYW1lID0gbW9kdWxlQXJyYXlbaV0ubmFtZTtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5wbHVnaW5zW21vZHVsZU5hbWVdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zW21vZHVsZU5hbWVdID0gdXRpbC5jb3B5T2JqKG1vZHVsZUFycmF5W2ldKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnNbbW9kdWxlTmFtZV0uYWRkKHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEVuYWJsZWQgc3VibWVudVxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIFN1Ym1lbnUgZWxlbWVudCB0byBjYWxsXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc3VibWVudU9uOiBmdW5jdGlvbiAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdWJtZW51TmFtZSA9IHRoaXMuX3N1Ym1lbnVOYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY29tbWFuZCcpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5wbHVnaW5zW3N1Ym1lbnVOYW1lXS5vbikgdGhpcy5wbHVnaW5zW3N1Ym1lbnVOYW1lXS5vbi5jYWxsKHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zdWJtZW51ID0gZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmc7XHJcbiAgICAgICAgICAgIHRoaXMuc3VibWVudS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgICAgdXRpbC5hZGRDbGFzcyhlbGVtZW50LCAnb24nKTtcclxuICAgICAgICAgICAgdGhpcy5zdWJtZW51QWN0aXZlQnV0dG9uID0gZWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG92ZXJMZWZ0ID0gdGhpcy5jb250ZXh0LmVsZW1lbnQudG9vbGJhci5vZmZzZXRXaWR0aCAtIChlbGVtZW50LnBhcmVudEVsZW1lbnQub2Zmc2V0TGVmdCArIHRoaXMuc3VibWVudS5vZmZzZXRXaWR0aCk7XHJcbiAgICAgICAgICAgIGlmIChvdmVyTGVmdCA8IDApIHRoaXMuc3VibWVudS5zdHlsZS5sZWZ0ID0gb3ZlckxlZnQgKyAncHgnO1xyXG4gICAgICAgICAgICBlbHNlIHRoaXMuc3VibWVudS5zdHlsZS5sZWZ0ID0gJzFweCc7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9iaW5kZWRTdWJtZW51T2ZmID0gdGhpcy5zdWJtZW51T2ZmLmJpbmQodGhpcyk7XHJcbiAgICAgICAgICAgIF9kLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuX2JpbmRlZFN1Ym1lbnVPZmYsIGZhbHNlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gRGlzYWJsZSBzdWJtZW51XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc3VibWVudU9mZjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zdWJtZW51KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zdWJtZW51TmFtZSA9ICcnO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdWJtZW51LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN1Ym1lbnUgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVDbGFzcyh0aGlzLnN1Ym1lbnVBY3RpdmVCdXR0b24sICdvbicpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdWJtZW51QWN0aXZlQnV0dG9uID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIF9kLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuX2JpbmRlZFN1Ym1lbnVPZmYpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbm90SGlkZVRvb2xiYXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyc09mZigpO1xyXG4gICAgICAgICAgICB0aGlzLmZvY3VzKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIERpc2FibGUgY29udHJvbGxlciBpbiBlZGl0b3IgYXJlYSAobGluayBidXR0b24sIGltYWdlIHJlc2l6ZSBidXR0b24pXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29udHJvbGxlcnNPbjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgYXJndW1lbnRzW2ldLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyQXJyYXlbaV0gPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2JpbmRDb250cm9sbGVyc09mZiA9IHRoaXMuY29udHJvbGxlcnNPZmYuYmluZCh0aGlzKTtcclxuICAgICAgICAgICAgX2QuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fYmluZENvbnRyb2xsZXJzT2ZmLCBmYWxzZSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIERpc2FibGUgY29udHJvbGxlciBpbiBlZGl0b3IgYXJlYSAobGluayBidXR0b24sIGltYWdlIHJlc2l6ZSBidXR0b24pXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29udHJvbGxlcnNPZmY6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY29uc3QgbGVuID0gdGhpcy5jb250cm9sbGVyQXJyYXkubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgaWYgKGxlbiA+IDApIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJBcnJheVtpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlckFycmF5ID0gW107XHJcbiAgICAgICAgICAgICAgICBfZC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9iaW5kQ29udHJvbGxlcnNPZmYpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIGphdmFzY3JpcHQgZXhlY0NvbW1hbmRcclxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29tbWFuZCAtIGphdmFzY3JpcHQgZXhlY0NvbW1hbmQgZnVuY3Rpb24gcHJvcGVydHlcclxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHNob3dEZWZhdWx0VUkgLSBqYXZhc2NyaXB0IGV4ZWNDb21tYW5kIGZ1bmN0aW9uIHByb3BlcnR5XHJcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlIC0gamF2YXNjcmlwdCBleGVjQ29tbWFuZCBmdW5jdGlvbiBwcm9wZXJ0eVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGV4ZWNDb21tYW5kOiBmdW5jdGlvbiAoY29tbWFuZCwgc2hvd0RlZmF1bHRVSSwgdmFsdWUpIHtcclxuICAgICAgICAgICAgX2QuZXhlY0NvbW1hbmQoY29tbWFuZCwgc2hvd0RlZmF1bHRVSSwgKGNvbW1hbmQgPT09ICdmb3JtYXRCbG9jaycgPyAnPCcgKyB2YWx1ZSArICc+JyA6IHZhbHVlKSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEZvY3VzIHRvIHd5c2l3eWcgYXJlYVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGZvY3VzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGNhcHRpb24gPSB1dGlsLmdldFBhcmVudEVsZW1lbnQodGhpcy5nZXRTZWxlY3Rpb25Ob2RlKCksICdmaWdjYXB0aW9uJyk7XHJcbiAgICAgICAgICAgIGlmIChjYXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBjYXB0aW9uLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5mb2N1cygpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBldmVudC5fZmluZEJ1dHRvbkVmZmVjdFRhZygpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBTZXQgY3VycmVudCBlZGl0b3IncyByYW5nZSBvYmplY3RcclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHN0YXJ0Q29uIC0gVGhlIHN0YXJ0Q29udGFpbmVyIHByb3BlcnR5IG9mIHRoZSBzZWxlY3Rpb24gb2JqZWN0LlxyXG4gICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzdGFydE9mZiAtIFRoZSBzdGFydE9mZnNldCBwcm9wZXJ0eSBvZiB0aGUgc2VsZWN0aW9uIG9iamVjdC5cclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVuZENvbiAtIFRoZSBlbmRDb250YWluZXIgcHJvcGVydHkgb2YgdGhlIHNlbGVjdGlvbiBvYmplY3QuXHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBlbmRPZmYgLSBUaGUgZW5kT2Zmc2V0IHByb3BlcnR5IG9mIHRoZSBzZWxlY3Rpb24gb2JqZWN0LlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHNldFJhbmdlOiBmdW5jdGlvbiAoc3RhcnRDb24sIHN0YXJ0T2ZmLCBlbmRDb24sIGVuZE9mZikge1xyXG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IF9kLmNyZWF0ZVJhbmdlKCk7XHJcbiAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KHN0YXJ0Q29uLCBzdGFydE9mZik7XHJcbiAgICAgICAgICAgIHJhbmdlLnNldEVuZChlbmRDb24sIGVuZE9mZik7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBfdy5nZXRTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX2VkaXRvclJhbmdlKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEdldCBjdXJyZW50IGVkaXRvcidzIHJhbmdlIG9iamVjdFxyXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZ2V0UmFuZ2U6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhcmlhYmxlLl9yYW5nZSB8fCB0aGlzLl9jcmVhdGVEZWZhdWx0UmFuZ2UoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gR2V0IGN1cnJlbnQgc2VsZWN0IG5vZGVcclxuICAgICAgICAgKiBAcmV0dXJucyB7Tm9kZX1cclxuICAgICAgICAgKi9cclxuICAgICAgICBnZXRTZWxlY3Rpb25Ob2RlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl92YXJpYWJsZS5fc2VsZWN0aW9uTm9kZSB8fCBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5maXJzdENoaWxkO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBTYXZpbmcgdGhlIHJhbmdlIG9iamVjdCBhbmQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBub2RlIG9mIGVkaXRvclxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX2VkaXRvclJhbmdlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IF93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgICAgICBpZiAoIXV0aWwuZ2V0UGFyZW50RWxlbWVudChzZWxlY3Rpb24uZm9jdXNOb2RlLCAnLnN1bi1lZGl0b3ItaWQtd3lzaXd5ZycpKSByZXR1cm47XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBsZXQgcmFuZ2UgPSBudWxsO1xyXG4gICAgICAgICAgICBsZXQgc2VsZWN0aW9uTm9kZSA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmFuZ2UgPSB0aGlzLl9jcmVhdGVEZWZhdWx0UmFuZ2UoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fdmFyaWFibGUuX3JhbmdlID0gcmFuZ2U7XHJcblxyXG4gICAgICAgICAgICBpZiAocmFuZ2UuY29sbGFwc2VkKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25Ob2RlID0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25Ob2RlID0gc2VsZWN0aW9uLmV4dGVudE5vZGUgfHwgc2VsZWN0aW9uLmFuY2hvck5vZGU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3ZhcmlhYmxlLl9zZWxlY3Rpb25Ob2RlID0gc2VsZWN0aW9uTm9kZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gUmV0dXJuIHRoZSByYW5nZSBvYmplY3Qgb2YgZWRpdG9yJ3MgZmlyc3QgY2hpbGQgbm9kZVxyXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfY3JlYXRlRGVmYXVsdFJhbmdlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gX2QuY3JlYXRlUmFuZ2UoKTtcclxuICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQoY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuZmlyc3RDaGlsZCwgMCk7XHJcbiAgICAgICAgICAgIHJhbmdlLnNldEVuZChjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5maXJzdENoaWxkLCAwKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJhbmdlO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIGEgXCJmb3JtYXRFbGVtZW50XCIoUCwgRElWLCBIWzEtNl0sIExJKSBhcnJheSBmcm9tIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcmFuZ2UuXHJcbiAgICAgICAgICogQHJldHVybnMge0FycmF5fVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGdldFNlbGVjdGVkRm9ybWF0RWxlbWVudHM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgbGV0IHJhbmdlID0gdGhpcy5nZXRSYW5nZSgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHV0aWwuaXNXeXNpd3lnRGl2KHJhbmdlLnN0YXJ0Q29udGFpbmVyKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5jaGlsZHJlbjtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0UmFuZ2UoY2hpbGRyZW5bMF0sIDAsIGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdLCBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXS50ZXh0Q29udGVudC5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgcmFuZ2UgPSB0aGlzLmdldFJhbmdlKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0Q29uID0gcmFuZ2Uuc3RhcnRDb250YWluZXI7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZENvbiA9IHJhbmdlLmVuZENvbnRhaW5lcjtcclxuICAgICAgICAgICAgY29uc3QgY29tbW9uQ29uID0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlRm9ybWF0RWxlbWVudHMgPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdXRpbC5pc1d5c2l3eWdEaXYoY29tbW9uQ29uKSAmJiAhdXRpbC5pc1JhbmdlRm9ybWF0RWxlbWVudChjb21tb25Db24pKSByZXR1cm4gW3V0aWwuZ2V0Rm9ybWF0RWxlbWVudChjb21tb25Db24pXTtcclxuXHJcbiAgICAgICAgICAgIC8vIGdldCBsaW5lIG5vZGVzXHJcbiAgICAgICAgICAgIGNvbnN0IGxpbmVOb2RlcyA9IHV0aWwuZ2V0TGlzdENoaWxkcmVuKGNvbW1vbkNvbiwgZnVuY3Rpb24gKGN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1dGlsLmlzRm9ybWF0RWxlbWVudChjdXJyZW50KTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc3RhcnRDb24gPT09IGVuZENvbikgcmV0dXJuIGxpbmVOb2Rlc1swXTtcclxuXHJcbiAgICAgICAgICAgIGxldCBzdGFydExpbmUgPSB1dGlsLmdldEZvcm1hdEVsZW1lbnQoc3RhcnRDb24pO1xyXG4gICAgICAgICAgICBsZXQgZW5kTGluZSA9IHV0aWwuZ2V0Rm9ybWF0RWxlbWVudChlbmRDb24pO1xyXG4gICAgICAgICAgICBsZXQgc3RhcnRJZHggPSAwO1xyXG4gICAgICAgICAgICBsZXQgZW5kSWR4ID0gMDtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBsaW5lTm9kZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChzdGFydExpbmUgPT09IGxpbmVOb2Rlc1tpXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0SWR4ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChlbmRMaW5lID09PSBsaW5lTm9kZXNbaV0pIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmRJZHggPSBpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRJZHg7IGkgPD0gZW5kSWR4OyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHJhbmdlRm9ybWF0RWxlbWVudHMucHVzaChsaW5lTm9kZXNbaV0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcmFuZ2VGb3JtYXRFbGVtZW50cztcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyBhIFwicmFuZ2VGb3JtYXRFbGVtZW50XCIoYmxvY2txdW90ZSwgVEFCTEUsIFRSLCBURCwgT0wsIFVMLCBQUkUpIGFycmF5IGZyb20gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByYW5nZS5cclxuICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZ2V0U2VsZWN0ZWRSYW5nZUZvcm1hdEVsZW1lbnRzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGxldCByYW5nZSA9IHRoaXMuZ2V0UmFuZ2UoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh1dGlsLmlzV3lzaXd5Z0RpdihyYW5nZS5zdGFydENvbnRhaW5lcikpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuY2hpbGRyZW47XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFJhbmdlKGNoaWxkcmVuWzBdLCAwLCBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXSwgY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0udGV4dENvbnRlbnQubGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgIHJhbmdlID0gdGhpcy5nZXRSYW5nZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzdGFydENvbiA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyO1xyXG4gICAgICAgICAgICBjb25zdCBlbmRDb24gPSByYW5nZS5lbmRDb250YWluZXI7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbW1vbkNvbiA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xyXG4gICAgICAgICAgICBjb25zdCByYW5nZUZvcm1hdEVsZW1lbnRzID0gW107XHJcblxyXG4gICAgICAgICAgICBpZiAodXRpbC5pc1JhbmdlRm9ybWF0RWxlbWVudChjb21tb25Db24pKSByZXR1cm4gW2NvbW1vbkNvbl07XHJcbiAgICAgICAgICAgIGlmICghdXRpbC5pc1d5c2l3eWdEaXYoY29tbW9uQ29uKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZWwgPSB1dGlsLmdldFJhbmdlRm9ybWF0RWxlbWVudChjb21tb25Db24pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsID8gW2VsXSA6IFtdO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBnZXQgcmFuZ2UgRWxlbWVudHNcclxuICAgICAgICAgICAgY29uc3QgcmFuZ2VFbGVtZW50cyA9IHV0aWwuZ2V0TGlzdENoaWxkcmVuKGNvbW1vbkNvbiwgZnVuY3Rpb24gKGN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1dGlsLmlzUmFuZ2VGb3JtYXRFbGVtZW50KGN1cnJlbnQpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzdGFydENvbiA9PT0gZW5kQ29uKSByZXR1cm4gcmFuZ2VFbGVtZW50c1swXTtcclxuXHJcbiAgICAgICAgICAgIGxldCBzdGFydExpbmUgPSB1dGlsLmdldFJhbmdlRm9ybWF0RWxlbWVudChzdGFydENvbik7XHJcbiAgICAgICAgICAgIGxldCBlbmRMaW5lID0gdXRpbC5nZXRSYW5nZUZvcm1hdEVsZW1lbnQoZW5kQ29uKTtcclxuICAgICAgICAgICAgbGV0IHN0YXJ0SWR4ID0gMDtcclxuICAgICAgICAgICAgbGV0IGVuZElkeCA9IDA7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gcmFuZ2VFbGVtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0TGluZSA9PT0gcmFuZ2VFbGVtZW50c1tpXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0SWR4ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChlbmRMaW5lID09PSByYW5nZUVsZW1lbnRzW2ldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5kSWR4ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SWR4OyBpIDw9IGVuZElkeDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmFuZ2VFbGVtZW50c1tpXSkgcmFuZ2VGb3JtYXRFbGVtZW50cy5wdXNoKHJhbmdlRWxlbWVudHNbaV0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcmFuZ2VGb3JtYXRFbGVtZW50cztcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lIGlmIHRoaXMgb2Zmc2V0IGlzIHRoZSBlZGdlIG9mZnNldCBvZiBjb250YWluZXJcclxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGFpbmVyIC0gVGhlIGNvbnRhaW5lciBwcm9wZXJ0eSBvZiB0aGUgc2VsZWN0aW9uIG9iamVjdC5cclxuICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gb2Zmc2V0IC0gVGhlIG9mZnNldCBwcm9wZXJ0eSBvZiB0aGUgc2VsZWN0aW9uIG9iamVjdC5cclxuICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cclxuICAgICAgICAgKi9cclxuICAgICAgICBpc0VkZ2VQb2ludDogZnVuY3Rpb24gKGNvbnRhaW5lciwgb2Zmc2V0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiAob2Zmc2V0ID09PSAwKSB8fCAob2Zmc2V0ID09PSBjb250YWluZXIubm9kZVZhbHVlLmxlbmd0aCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFNob3cgbG9hZGluZyBib3hcclxuICAgICAgICAgKi9cclxuICAgICAgICBzaG93TG9hZGluZzogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQubG9hZGluZy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gQ2xvc2UgbG9hZGluZyBib3hcclxuICAgICAgICAgKi9cclxuICAgICAgICBjbG9zZUxvYWRpbmc6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LmxvYWRpbmcuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gQXBwZW5kIGZvcm1hdCBlbGVtZW50IHRvIHNpYmxpbmcgbm9kZSBvZiBhcmd1bWVudCBlbGVtZW50LlxyXG4gICAgICAgICAqIElmIHRoZSBcImZvcm1hdE5vZGVOYW1lXCIgYXJndW1lbnQgdmFsdWUgaXMgcHJlc2VudCwgdGhlIHRhZyBvZiB0aGF0IGFyZ3VtZW50IHZhbHVlIGlzIGluc2VydGVkLFxyXG4gICAgICAgICAqIElmIG5vdCwgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBmb3JtYXQgdGFnIGlzIGluc2VydGVkLlxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEluc2VydCBhcyBzaWJsaW5ncyBvZiB0aGF0IGVsZW1lbnRcclxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ3xudWxsfSBmb3JtYXROb2RlTmFtZSAtIE5vZGUgbmFtZSB0byBiZSBpbnNlcnRlZFxyXG4gICAgICAgICAqIEByZXR1cm5zIHtFbGVtZW50fVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGFwcGVuZEZvcm1hdFRhZzogZnVuY3Rpb24gKGVsZW1lbnQsIGZvcm1hdE5vZGVOYW1lKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdEVsID0gdXRpbC5nZXRSYW5nZUZvcm1hdEVsZW1lbnQoZWxlbWVudCkgfHwgdXRpbC5nZXRGb3JtYXRFbGVtZW50KGVsZW1lbnQpO1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50Rm9ybWF0RWwgPSB1dGlsLmdldEZvcm1hdEVsZW1lbnQodGhpcy5nZXRTZWxlY3Rpb25Ob2RlKCkpO1xyXG4gICAgICAgICAgICBjb25zdCBvRm9ybWF0TmFtZSA9IGZvcm1hdE5vZGVOYW1lID8gZm9ybWF0Tm9kZU5hbWUgOiB1dGlsLmlzRm9ybWF0RWxlbWVudChjdXJyZW50Rm9ybWF0RWwpID8gY3VycmVudEZvcm1hdEVsLm5vZGVOYW1lIDogJ1AnO1xyXG4gICAgICAgICAgICBjb25zdCBvRm9ybWF0ID0gdXRpbC5jcmVhdGVFbGVtZW50KG9Gb3JtYXROYW1lKTtcclxuICAgICAgICAgICAgb0Zvcm1hdC5pbm5lckhUTUwgPSB1dGlsLnplcm9XaWR0aFNwYWNlO1xyXG5cclxuICAgICAgICAgICAgaWYgKHV0aWwuaXNDZWxsKGZvcm1hdEVsKSkgZm9ybWF0RWwuaW5zZXJ0QmVmb3JlKG9Gb3JtYXQsIGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nKTtcclxuICAgICAgICAgICAgZWxzZSBmb3JtYXRFbC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShvRm9ybWF0LCBmb3JtYXRFbC5uZXh0RWxlbWVudFNpYmxpbmcpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG9Gb3JtYXQ7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIERlbGV0ZSBzZWxlY3RlZCBub2RlIGFuZCBpbnNlcnQgYXJndW1lbnQgdmFsdWUgbm9kZVxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gb05vZGUgLSBOb2RlIHRvIGJlIGluc2VydGVkXHJcbiAgICAgICAgICogQHBhcmFtIHsoRWxlbWVudHxudWxsKX0gcmlnaHROb2RlIC0gSWYgdGhlIG5vZGUgZXhpc3RzLCBpdCBpcyBpbnNlcnRlZCBhZnRlciB0aGUgbm9kZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGluc2VydE5vZGU6IGZ1bmN0aW9uIChvTm9kZSwgcmlnaHROb2RlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5nZXRSYW5nZSgpO1xyXG4gICAgICAgICAgICBsZXQgcGFyZW50Tm9kZSA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXJpZ2h0Tm9kZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRDb24gPSByYW5nZS5zdGFydENvbnRhaW5lcjtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0T2ZmID0gcmFuZ2Uuc3RhcnRPZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbmRDb24gPSByYW5nZS5lbmRDb250YWluZXI7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbmRPZmYgPSByYW5nZS5lbmRPZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb21tb25Db24gPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcclxuXHJcbiAgICAgICAgICAgICAgICBwYXJlbnROb2RlID0gc3RhcnRDb247XHJcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnRDb24ubm9kZVR5cGUgPT09IDMpIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnROb2RlID0gc3RhcnRDb24ucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvKiogTm8gU2VsZWN0IHJhbmdlIG5vZGUgKi9cclxuICAgICAgICAgICAgICAgIGlmIChyYW5nZS5jb2xsYXBzZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29tbW9uQ29uLm5vZGVUeXBlID09PSAzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0Tm9kZSA9IGNvbW1vbkNvbi5zcGxpdFRleHQoZW5kT2ZmKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnROb2RlLmxhc3RDaGlsZCAhPT0gbnVsbCAmJiB1dGlsLmlzQnJlYWsocGFyZW50Tm9kZS5sYXN0Q2hpbGQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnROb2RlLnJlbW92ZUNoaWxkKHBhcmVudE5vZGUubGFzdENoaWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByaWdodE5vZGUgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8qKiBTZWxlY3QgcmFuZ2Ugbm9kZXMgKi9cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzU2FtZUNvbnRhaW5lciA9IHN0YXJ0Q29uID09PSBlbmRDb247XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1NhbWVDb250YWluZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNFZGdlUG9pbnQoZW5kQ29uLCBlbmRPZmYpKSByaWdodE5vZGUgPSBlbmRDb24ubmV4dFNpYmxpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgcmlnaHROb2RlID0gZW5kQ29uLnNwbGl0VGV4dChlbmRPZmYpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlbW92ZU5vZGUgPSBzdGFydENvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzRWRnZVBvaW50KHN0YXJ0Q29uLCBzdGFydE9mZikpIHJlbW92ZU5vZGUgPSBzdGFydENvbi5zcGxpdFRleHQoc3RhcnRPZmYpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5yZW1vdmVDaGlsZChyZW1vdmVOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlTm9kZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnROb2RlID0gY29tbW9uQ29uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByaWdodE5vZGUgPSBlbmRDb247XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocmlnaHROb2RlLnBhcmVudE5vZGUgIT09IGNvbW1vbkNvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHROb2RlID0gcmlnaHROb2RlLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnROb2RlID0gcmlnaHROb2RlLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICByaWdodE5vZGUgPSByaWdodE5vZGUubmV4dFNpYmxpbmc7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShvTm9kZSwgcmlnaHROb2RlKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChvTm9kZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbm9kZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHJlbW92ZU5vZGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLmdldFJhbmdlKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAocmFuZ2UuZGVsZXRlQ29udGVudHMpIHtcclxuICAgICAgICAgICAgICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0Q29uID0gcmFuZ2Uuc3RhcnRDb250YWluZXI7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0T2ZmID0gcmFuZ2Uuc3RhcnRPZmZzZXQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZENvbiA9IHJhbmdlLmVuZENvbnRhaW5lcjtcclxuICAgICAgICAgICAgY29uc3QgZW5kT2ZmID0gcmFuZ2UuZW5kT2Zmc2V0O1xyXG4gICAgICAgICAgICBjb25zdCBjb21tb25Db24gPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcclxuXHJcbiAgICAgICAgICAgIGxldCBiZWZvcmVOb2RlID0gbnVsbDtcclxuICAgICAgICAgICAgbGV0IGFmdGVyTm9kZSA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBjaGlsZE5vZGVzID0gdXRpbC5nZXRMaXN0Q2hpbGROb2Rlcyhjb21tb25Db24pO1xyXG4gICAgICAgICAgICBsZXQgc3RhcnRJbmRleCA9IHV0aWwuZ2V0QXJyYXlJbmRleChjaGlsZE5vZGVzLCBzdGFydENvbik7XHJcbiAgICAgICAgICAgIGxldCBlbmRJbmRleCA9IHV0aWwuZ2V0QXJyYXlJbmRleChjaGlsZE5vZGVzLCBlbmRDb24pO1xyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXggKyAxLCBzdGFydE5vZGUgPSBzdGFydENvbjsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgIGlmIChjaGlsZE5vZGVzW2ldID09PSBzdGFydE5vZGUucGFyZW50Tm9kZSAmJiBjaGlsZE5vZGVzW2ldLmZpcnN0Q2hpbGQgPT09IHN0YXJ0Tm9kZSAmJiBzdGFydE9mZiA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBpO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0Tm9kZSA9IHN0YXJ0Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gZW5kSW5kZXggLSAxLCBlbmROb2RlID0gZW5kQ29uOyBpID4gc3RhcnRJbmRleDsgaS0tKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGROb2Rlc1tpXSA9PT0gZW5kTm9kZS5wYXJlbnROb2RlICYmIGNoaWxkTm9kZXNbaV0ubm9kZVR5cGUgPT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBjaGlsZE5vZGVzLnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICBlbmROb2RlID0gZW5kTm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgIC0tZW5kSW5kZXg7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpIDw9IGVuZEluZGV4OyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjaGlsZE5vZGVzW2ldO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpdGVtLmxlbmd0aCA9PT0gMCB8fCAoaXRlbS5ub2RlVHlwZSA9PT0gMyAmJiBpdGVtLmRhdGEgPT09IHVuZGVmaW5lZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUl0ZW0oaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0gPT09IHN0YXJ0Q29uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0Q29uLm5vZGVUeXBlID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZU5vZGUgPSB1dGlsLmNyZWF0ZVRleHROb2RlKHN0YXJ0Q29uLnRleHRDb250ZW50KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmVOb2RlID0gdXRpbC5jcmVhdGVUZXh0Tm9kZShzdGFydENvbi5zdWJzdHJpbmdEYXRhKDAsIHN0YXJ0T2ZmKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoYmVmb3JlTm9kZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0Q29uLmRhdGEgPSBiZWZvcmVOb2RlLmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVJdGVtKHN0YXJ0Q29uKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpdGVtID09PSBlbmRDb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZW5kQ29uLm5vZGVUeXBlID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyTm9kZSA9IHV0aWwuY3JlYXRlVGV4dE5vZGUoZW5kQ29uLnRleHRDb250ZW50KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhZnRlck5vZGUgPSB1dGlsLmNyZWF0ZVRleHROb2RlKGVuZENvbi5zdWJzdHJpbmdEYXRhKGVuZE9mZiwgKGVuZENvbi5sZW5ndGggLSBlbmRPZmYpKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoYWZ0ZXJOb2RlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kQ29uLmRhdGEgPSBhZnRlck5vZGUuZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUl0ZW0oZW5kQ29uKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlSXRlbShpdGVtKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBhcHBlbmRlZCBhbGwgc2VsZWN0ZWQgZm9ybWF0IEVsZW1lbnQgdG8gdGhlIGFyZ3VtZW50IGVsZW1lbnQgYW5kIGluc2VydFxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gd3JhcFRhZyAtIEVsZW1lbnQgb2Ygd3JhcCB0aGUgYXJndW1lbnRzXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgd3JhcFRvVGFnczogZnVuY3Rpb24gKHdyYXBUYWcpIHtcclxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLmdldFJhbmdlKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlTGluZXMgPSB0aGlzLmdldFNlbGVjdGVkRm9ybWF0RWxlbWVudHMoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghcmFuZ2VMaW5lcykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5uZXIgPSB1dGlsLmNyZWF0ZUVsZW1lbnQodXRpbC5pc0NlbGwodGhpcy5nZXRTZWxlY3Rpb25Ob2RlKCkpID8gJ0RJVicgOiAnUCcpO1xyXG4gICAgICAgICAgICAgICAgaW5uZXIuaW5uZXJIVE1MID0gdXRpbC56ZXJvV2lkdGhTcGFjZTtcclxuICAgICAgICAgICAgICAgIHdyYXBUYWcuYXBwZW5kQ2hpbGQoaW5uZXIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRTZWxlY3Rpb25Ob2RlKCkuYXBwZW5kQ2hpbGQod3JhcFRhZyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBsYXN0ICA9IHJhbmdlTGluZXNbcmFuZ2VMaW5lcy5sZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgbGV0IHN0YW5kVGFnLCBiZWZvcmVUYWcsIHBFbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgaWYgKHV0aWwuaXNSYW5nZUZvcm1hdEVsZW1lbnQobGFzdCkgfHwgdXRpbC5pc0Zvcm1hdEVsZW1lbnQobGFzdCkpIHtcclxuICAgICAgICAgICAgICAgIHN0YW5kVGFnID0gbGFzdDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHN0YW5kVGFnID0gdXRpbC5nZXRSYW5nZUZvcm1hdEVsZW1lbnQobGFzdCkgfHwgdXRpbC5nZXRGb3JtYXRFbGVtZW50KGxhc3QpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodXRpbC5pc0NlbGwoc3RhbmRUYWcpKSB7XHJcbiAgICAgICAgICAgICAgICBiZWZvcmVUYWcgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgcEVsZW1lbnQgPSBzdGFuZFRhZztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGJlZm9yZVRhZyA9IHN0YW5kVGFnLm5leHRTaWJsaW5nO1xyXG4gICAgICAgICAgICAgICAgcEVsZW1lbnQgPSBzdGFuZFRhZy5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgbGlzdFBhcmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgIGxldCBsaW5lID0gbnVsbDtcclxuICAgICAgICAgICAgbGV0IHByZXZOb2RlTmFtZSA9ICcnO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHJhbmdlTGluZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGxpbmUgPSByYW5nZUxpbmVzW2ldO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICgvXkxJJC9pLnRlc3QobGluZS5ub2RlTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobGlzdFBhcmVudCA9PT0gbnVsbCB8fCAhL15MSSQvaS50ZXN0KHByZXZOb2RlTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFBhcmVudCA9IHV0aWwuY3JlYXRlRWxlbWVudChsaW5lLnBhcmVudE5vZGUubm9kZU5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbGlzdFBhcmVudC5hcHBlbmRDaGlsZChsaW5lKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gbGVuIC0gMSB8fCAhL15MSSQvaS50ZXN0KHJhbmdlTGluZXNbaSArIDFdLm5vZGVOYW1lKSkgd3JhcFRhZy5hcHBlbmRDaGlsZChsaXN0UGFyZW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHdyYXBUYWcuYXBwZW5kQ2hpbGQobGluZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcHJldk5vZGVOYW1lID0gbGluZS5ub2RlTmFtZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcEVsZW1lbnQuaW5zZXJ0QmVmb3JlKHdyYXBUYWcsIGJlZm9yZVRhZyk7XHJcbiAgICAgICAgICAgIGlmICghcmFuZ2UuY29sbGFwc2VkICYmICh1dGlsLmlzUmFuZ2VGb3JtYXRFbGVtZW50KHJhbmdlLnN0YXJ0Q29udGFpbmVyKSB8fCB1dGlsLmlzUmFuZ2VGb3JtYXRFbGVtZW50KHJhbmdlLmVuZENvbnRhaW5lcikpKSB1dGlsLnJlbW92ZUVtcHR5Tm9kZShwRWxlbWVudCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEFkZCB0aGUgbm9kZSByZWNlaXZlZCBhcyBhbiBhcmd1bWVudCB2YWx1ZSB0byB0aGUgc2VsZWN0ZWQgYXJlYS5cclxuICAgICAgICAgKiAxLiBXaGVuIHRoZXJlIGlzIHRoZSBzYW1lIGNzcyB2YWx1ZSBub2RlIGluIHRoZSBzZWxlY3Rpb24gYXJlYSwgdGhlIHRhZyBpcyBzdHJpcHBlZC5cclxuICAgICAgICAgKiAyLiBJZiB0aGVyZSBpcyBhbm90aGVyIGNzcyB2YWx1ZSBvdGhlciB0aGFuQ3NzIGF0dHJpYnV0ZSB2YWx1ZXMgcmVjZWl2ZWQgYXMgYXJndW1lbnRzIG9uIHRoZSBub2RlLCByZW1vdmVkIG9ubHkgQ3NzIGF0dHJpYnV0ZSB2YWx1ZXMgcmVjZWl2ZWQgYXMgYXJndW1lbnRzXHJcbiAgICAgICAgICogMy4gSWYgeW91IHBhc3MgYW4gZWxlbWVudCB3aG9zZSBub2RlIG5hbWUgaXMgXCJyZW1vdmVub2RlXCIgYXMgYW4gYXJndW1lbnQgdmFsdWUsIGl0IHBlcmZvcm1zIGEgdHlwZSByZW1vdmFsIG9wZXJhdGlvbi4gZXgpIG5vZGVDaGFuZ2UoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncmVtb3Zlbm9kZScpKVxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gYXBwZW5kTm9kZSAtIFRoZSBkb20gdGhhdCB3aWxsIHdyYXAgdGhlIHNlbGVjdGVkIHRleHQgYXJlYVxyXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGNoZWNrQ1NTUHJvcGVydHlBcnJheSAtIFRoZSBjc3MgYXR0cmlidXRlIG5hbWUgQXJyYXkgdG8gY2hlY2sgKFsnZm9udC1zaXplJ10sIFsnZm9udC1mYW1pbHknLCAnYmFja2dyb3VuZC1jb2xvcicsICdib3JkZXInXS4uLl0pXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgbm9kZUNoYW5nZTogZnVuY3Rpb24gKGFwcGVuZE5vZGUsIGNoZWNrQ1NTUHJvcGVydHlBcnJheSkge1xyXG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IHRoaXMuZ2V0UmFuZ2UoKTtcclxuICAgICAgICAgICAgY29uc3QgaXNSZW1vdmVGb3JtYXQgPSAvcmVtb3Zlbm9kZS9pLnRlc3QoYXBwZW5kTm9kZS5ub2RlTmFtZSk7XHJcbiAgICAgICAgICAgIGxldCB0ZW1wQ29uLCB0ZW1wT2Zmc2V0LCB0ZW1wQ2hpbGQsIHRlbXBBcnJheTtcclxuXHJcbiAgICAgICAgICAgIC8qIGNoZWNrZWQgc2FtZSBzdHlsZSBwcm9wZXJ0eSAqL1xyXG4gICAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnRDb250YWluZXIgPT09IHJhbmdlLmVuZENvbnRhaW5lcikge1xyXG4gICAgICAgICAgICAgICAgbGV0IHNOb2RlID0gcmFuZ2Uuc3RhcnRDb250YWluZXI7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNSZW1vdmVGb3JtYXQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodXRpbC5nZXRGb3JtYXRFbGVtZW50KHNOb2RlKSA9PT0gc05vZGUucGFyZW50Tm9kZSkgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY2hlY2tDbnQgPSAwO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoZWNrQ1NTUHJvcGVydHlBcnJheS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSghdXRpbC5pc0Zvcm1hdEVsZW1lbnQoc05vZGUpICYmICF1dGlsLmlzV3lzaXd5Z0RpdihzTm9kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzTm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBzTm9kZS5zdHlsZVtjaGVja0NTU1Byb3BlcnR5QXJyYXlbaV1dID09PSBhcHBlbmROb2RlLnN0eWxlW2NoZWNrQ1NTUHJvcGVydHlBcnJheVtpXV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0NudCsrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc05vZGUgPSBzTm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrQ250ID49IGNoZWNrQ1NTUHJvcGVydHlBcnJheS5sZW5ndGgpIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyogZmluZCB0ZXh0IG5vZGUgKi9cclxuICAgICAgICAgICAgLy8gc3RhcnRDb250YWluZXJcclxuICAgICAgICAgICAgdGVtcENvbiA9IHV0aWwuaXNXeXNpd3lnRGl2KHJhbmdlLnN0YXJ0Q29udGFpbmVyKSA/IGNvbnRleHQuZWxlbWVudC53eXNpd3lnLmZpcnN0Q2hpbGQgOiByYW5nZS5zdGFydENvbnRhaW5lcjtcclxuICAgICAgICAgICAgdGVtcE9mZnNldCA9IHJhbmdlLnN0YXJ0T2Zmc2V0O1xyXG5cclxuICAgICAgICAgICAgaWYgKHRlbXBDb24ubm9kZVR5cGUgPT09IDEgJiYgdGVtcENvbi5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHdoaWxlICh0ZW1wQ29uICYmICF1dGlsLmlzQnJlYWsodGVtcENvbikgJiYgdGVtcENvbi5ub2RlVHlwZSA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBBcnJheSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBDaGlsZCA9IHRlbXBDb24uY2hpbGROb2RlcztcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdGVtcENoaWxkLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBBcnJheS5wdXNoKHRlbXBDaGlsZFtpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBDb24gPSB0ZW1wQXJyYXlbdGVtcE9mZnNldF0gfHwgdGVtcENvbi5uZXh0RWxlbWVudFNpYmxpbmcgfHwgdGVtcENvbi5uZXh0U2libGluZztcclxuICAgICAgICAgICAgICAgICAgICB0ZW1wT2Zmc2V0ID0gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodXRpbC5pc0JyZWFrKHRlbXBDb24pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW1wdHlUZXh0ID0gdXRpbC5jcmVhdGVUZXh0Tm9kZSh1dGlsLnplcm9XaWR0aFNwYWNlKTtcclxuICAgICAgICAgICAgICAgICAgICB0ZW1wQ29uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVtcHR5VGV4dCwgdGVtcENvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcENvbiA9IGVtcHR5VGV4dDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3Qgc3RhcnRDb24gPSB0ZW1wQ29uO1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydE9mZiA9IHRlbXBPZmZzZXQ7XHJcblxyXG4gICAgICAgICAgICAvLyBlbmRDb250YWluZXJcclxuICAgICAgICAgICAgdGVtcENvbiA9IHV0aWwuaXNXeXNpd3lnRGl2KHJhbmdlLmVuZENvbnRhaW5lcikgPyBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5sYXN0Q2hpbGQgOiByYW5nZS5lbmRDb250YWluZXI7XHJcbiAgICAgICAgICAgIHRlbXBPZmZzZXQgPSByYW5nZS5lbmRPZmZzZXQ7XHJcblxyXG4gICAgICAgICAgICBpZiAodGVtcENvbi5ub2RlVHlwZSA9PT0gMSAmJiB0ZW1wQ29uLmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKHRlbXBDb24gJiYgIXV0aWwuaXNCcmVhayh0ZW1wQ29uKSAmJiB0ZW1wQ29uLm5vZGVUeXBlID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcEFycmF5ID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcENoaWxkID0gdGVtcENvbi5jaGlsZE5vZGVzO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0ZW1wQ2hpbGQubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcEFycmF5LnB1c2godGVtcENoaWxkW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcENvbiA9IHRlbXBBcnJheVt0ZW1wT2Zmc2V0IC0gMV0gfHwgIS9GSUdVUkUvaS50ZXN0KHRlbXBBcnJheVswXS5ub2RlTmFtZSkgPyB0ZW1wQXJyYXlbMF0gOiAodGVtcENvbi5wcmV2aW91c0VsZW1lbnRTaWJsaW5nIHx8IHRlbXBDb24ucHJldmlvdXNTaWJsaW5nIHx8IHN0YXJ0Q29uKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRlbXBPZmZzZXQgPSB0ZW1wQ29uLnRleHRDb250ZW50Lmxlbmd0aDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodXRpbC5pc0JyZWFrKHRlbXBDb24pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW1wdHlUZXh0ID0gdXRpbC5jcmVhdGVUZXh0Tm9kZSh1dGlsLnplcm9XaWR0aFNwYWNlKTtcclxuICAgICAgICAgICAgICAgICAgICB0ZW1wQ29uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVtcHR5VGV4dCwgdGVtcENvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcENvbiA9IGVtcHR5VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICB0ZW1wT2Zmc2V0ID0gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgZW5kQ29uID0gdGVtcENvbjtcclxuICAgICAgICAgICAgY29uc3QgZW5kT2ZmID0gdGVtcE9mZnNldDtcclxuICAgICAgICAgICAgY29uc3QgY29tbW9uQ29uID0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld05vZGVOYW1lID0gYXBwZW5kTm9kZS5ub2RlTmFtZTtcclxuICAgICAgICAgICAgdGhpcy5zZXRSYW5nZShzdGFydENvbiwgc3RhcnRPZmYsIGVuZENvbiwgZW5kT2ZmKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHt9LCBlbmQgPSB7fTtcclxuICAgICAgICAgICAgbGV0IG5ld05vZGUsIHJlZ0V4cDtcclxuXHJcbiAgICAgICAgICAgIGlmIChjaGVja0NTU1Byb3BlcnR5QXJyYXkpIHtcclxuICAgICAgICAgICAgICAgIHJlZ0V4cCA9ICcoPzo7fF58XFxcXHMpKD86JyArIGNoZWNrQ1NTUHJvcGVydHlBcnJheVswXTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgY2hlY2tDU1NQcm9wZXJ0eUFycmF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVnRXhwICs9ICd8JyArIGNoZWNrQ1NTUHJvcGVydHlBcnJheVtpXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJlZ0V4cCArPSAnKVxcXFxzKjpbXjtdKlxcXFxzKig/Ojt8JCknO1xyXG4gICAgICAgICAgICAgICAgcmVnRXhwID0gbmV3IFJlZ0V4cChyZWdFeHAsICdpZycpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiogdGFnIGNoZWNrIGZ1bmN0aW9uKi9cclxuICAgICAgICAgICAgY29uc3QgY2hlY2tDc3MgPSBmdW5jdGlvbiAodk5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc1JlbW92ZUZvcm1hdCB8fCB2Tm9kZS5ub2RlVHlwZSA9PT0gMyB8fCB1dGlsLmlzQnJlYWsodk5vZGUpKSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgc3R5bGUgPSAnJztcclxuICAgICAgICAgICAgICAgIGlmIChyZWdFeHAgJiYgdk5vZGUuc3R5bGUuY3NzVGV4dC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUgPSB2Tm9kZS5zdHlsZS5jc3NUZXh0LnJlcGxhY2UocmVnRXhwLCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzdHlsZS5sZW5ndGggPiAwIHx8IHZOb2RlLm5vZGVOYW1lICE9PSBuZXdOb2RlTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2Tm9kZS5zdHlsZS5jc3NUZXh0Lmxlbmd0aCA+IDApIHZOb2RlLnN0eWxlLmNzc1RleHQgPSBzdHlsZTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAvKiogb25lIGxpbmUgKi9cclxuICAgICAgICAgICAgaWYgKCF1dGlsLmlzV3lzaXd5Z0Rpdihjb21tb25Db24pICYmICF1dGlsLmlzUmFuZ2VGb3JtYXRFbGVtZW50KGNvbW1vbkNvbikpIHtcclxuICAgICAgICAgICAgICAgIG5ld05vZGUgPSBhcHBlbmROb2RlLmNsb25lTm9kZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdSYW5nZSA9IHRoaXMuX25vZGVDaGFuZ2Vfb25lTGluZSh1dGlsLmdldEZvcm1hdEVsZW1lbnQoY29tbW9uQ29uKSwgbmV3Tm9kZSwgY2hlY2tDc3MsIHN0YXJ0Q29uLCBzdGFydE9mZiwgZW5kQ29uLCBlbmRPZmYsIGlzUmVtb3ZlRm9ybWF0LCByYW5nZS5jb2xsYXBzZWQpO1xyXG5cclxuICAgICAgICAgICAgICAgIHN0YXJ0LmNvbnRhaW5lciA9IG5ld1JhbmdlLnN0YXJ0Q29udGFpbmVyO1xyXG4gICAgICAgICAgICAgICAgc3RhcnQub2Zmc2V0ID0gbmV3UmFuZ2Uuc3RhcnRPZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICBlbmQuY29udGFpbmVyID0gbmV3UmFuZ2UuZW5kQ29udGFpbmVyO1xyXG4gICAgICAgICAgICAgICAgZW5kLm9mZnNldCA9IG5ld1JhbmdlLmVuZE9mZnNldDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvKiogbXVsdGkgbGluZSAqL1xyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIGdldCBsaW5lIG5vZGVzXHJcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5lTm9kZXMgPSB0aGlzLmdldFNlbGVjdGVkRm9ybWF0RWxlbWVudHMoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVuZExlbmd0aCA9IGxpbmVOb2Rlcy5sZW5ndGggLSAxO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIHN0YXJ0Q29uXHJcbiAgICAgICAgICAgICAgICBuZXdOb2RlID0gYXBwZW5kTm9kZS5jbG9uZU5vZGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgc3RhcnQgPSB0aGlzLl9ub2RlQ2hhbmdlX3N0YXJ0TGluZShsaW5lTm9kZXNbMF0sIG5ld05vZGUsIGNoZWNrQ3NzLCBzdGFydENvbiwgc3RhcnRPZmYsIGlzUmVtb3ZlRm9ybWF0KTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBtaWRcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgZW5kTGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gYXBwZW5kTm9kZS5jbG9uZU5vZGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vZGVDaGFuZ2VfbWlkZGxlTGluZShsaW5lTm9kZXNbaV0sIG5ld05vZGUsIGNoZWNrQ3NzLCBpc1JlbW92ZUZvcm1hdCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gZW5kQ29uXHJcbiAgICAgICAgICAgICAgICBpZiAoZW5kTGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBhcHBlbmROb2RlLmNsb25lTm9kZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gdGhpcy5fbm9kZUNoYW5nZV9lbmRMaW5lKGxpbmVOb2Rlc1tlbmRMZW5ndGhdLCBuZXdOb2RlLCBjaGVja0NzcywgZW5kQ29uLCBlbmRPZmYsIGlzUmVtb3ZlRm9ybWF0KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gc3RhcnQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIHNldCByYW5nZVxyXG4gICAgICAgICAgICB0aGlzLnNldFJhbmdlKHN0YXJ0LmNvbnRhaW5lciwgc3RhcnQub2Zmc2V0LCBlbmQuY29udGFpbmVyLCBlbmQub2Zmc2V0KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gd3JhcHMgdGV4dCBub2RlcyBvZiBsaW5lIHNlbGVjdGVkIHRleHQuXHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gVGhlIG5vZGUgb2YgdGhlIGxpbmUgdGhhdCBjb250YWlucyB0aGUgc2VsZWN0ZWQgdGV4dCBub2RlLlxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbmV3SW5uZXJOb2RlIC0gVGhlIGRvbSB0aGF0IHdpbGwgd3JhcCB0aGUgc2VsZWN0ZWQgdGV4dCBhcmVhXHJcbiAgICAgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gdmFsaWRhdGlvbiAtIENoZWNrIGlmIHRoZSBub2RlIHNob3VsZCBiZSBzdHJpcHBlZC5cclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHN0YXJ0Q29uIC0gVGhlIHN0YXJ0Q29udGFpbmVyIHByb3BlcnR5IG9mIHRoZSBzZWxlY3Rpb24gb2JqZWN0LlxyXG4gICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzdGFydE9mZiAtIFRoZSBzdGFydE9mZnNldCBwcm9wZXJ0eSBvZiB0aGUgc2VsZWN0aW9uIG9iamVjdC5cclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVuZENvbiAtIFRoZSBlbmRDb250YWluZXIgcHJvcGVydHkgb2YgdGhlIHNlbGVjdGlvbiBvYmplY3QuXHJcbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IGVuZE9mZiAtIFRoZSBlbmRPZmZzZXQgcHJvcGVydHkgb2YgdGhlIHNlbGVjdGlvbiBvYmplY3QuXHJcbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBpc1JlbW92ZUZvcm1hdCAtIElzIHRoZSByZW1vdmUgZm9ybWF0IGNvbW1hbmQgP1xyXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gY29sbGFwc2VkIC0gcmFuZ2UuY29sbGFwc2VkXHJcbiAgICAgICAgICogQHJldHVybnMge3tzdGFydENvbnRhaW5lcjogKiwgc3RhcnRPZmZzZXQ6ICosIGVuZENvbnRhaW5lcjogKiwgZW5kT2Zmc2V0OiAqfX1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF9ub2RlQ2hhbmdlX29uZUxpbmU6IGZ1bmN0aW9uIChlbGVtZW50LCBuZXdJbm5lck5vZGUsIHZhbGlkYXRpb24sIHN0YXJ0Q29uLCBzdGFydE9mZiwgZW5kQ29uLCBlbmRPZmYsIGlzUmVtb3ZlRm9ybWF0LCBjb2xsYXBzZWQpIHtcclxuICAgICAgICAgICAgY29uc3QgZWwgPSBlbGVtZW50O1xyXG4gICAgICAgICAgICBjb25zdCBwTm9kZSA9IGVsZW1lbnQuY2xvbmVOb2RlKGZhbHNlKTtcclxuICAgICAgICAgICAgY29uc3QgaXNTYW1lTm9kZSA9IHN0YXJ0Q29uID09PSBlbmRDb247XHJcbiAgICAgICAgICAgIGxldCBzdGFydENvbnRhaW5lciA9IHN0YXJ0Q29uO1xyXG4gICAgICAgICAgICBsZXQgc3RhcnRPZmZzZXQgPSBzdGFydE9mZjtcclxuICAgICAgICAgICAgbGV0IGVuZENvbnRhaW5lciA9IGVuZENvbjtcclxuICAgICAgICAgICAgbGV0IGVuZE9mZnNldCA9IGVuZE9mZjtcclxuICAgICAgICAgICAgbGV0IHN0YXJ0UGFzcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBsZXQgZW5kUGFzcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBsZXQgcEN1cnJlbnQsIG5ld05vZGUsIGFwcGVuZE5vZGUsIGNzc1RleHQ7XHJcblxyXG4gICAgICAgICAgICBmdW5jdGlvbiBjaGVja0NzcyAodk5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlZ0V4cCA9IG5ldyBSZWdFeHAoJyg/Ojt8XnxcXFxccykoPzonICsgY3NzVGV4dCArICdudWxsKVxcXFxzKjpbXjtdKlxcXFxzKig/Ojt8JCknLCAnaWcnKTtcclxuICAgICAgICAgICAgICAgIGxldCBzdHlsZSA9ICcnO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChyZWdFeHAgJiYgdk5vZGUuc3R5bGUuY3NzVGV4dC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUgPSByZWdFeHAudGVzdCh2Tm9kZS5zdHlsZS5jc3NUZXh0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gIXN0eWxlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAoZnVuY3Rpb24gcmVjdXJzaW9uRnVuYyhjdXJyZW50LCBub2RlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZE5vZGVzID0gY3VycmVudC5jaGlsZE5vZGVzO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBjaGlsZE5vZGVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkID0gY2hpbGROb2Rlc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY292ZXJOb2RlID0gbm9kZTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY2xvbmVOb2RlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBzdGFydENvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghc3RhcnRQYXNzICYmIGNoaWxkID09PSBzdGFydENvbnRhaW5lcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2Tm9kZSA9IHV0aWwuY3JlYXRlVGV4dE5vZGUoc3RhcnRDb250YWluZXIubm9kZVR5cGUgPT09IDEgPyAnJyA6IHN0YXJ0Q29udGFpbmVyLnN1YnN0cmluZ0RhdGEoMCwgc3RhcnRPZmZzZXQpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dE5vZGUgPSB1dGlsLmNyZWF0ZVRleHROb2RlKHN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlID09PSAxID8gJycgOiBzdGFydENvbnRhaW5lci5zdWJzdHJpbmdEYXRhKHN0YXJ0T2Zmc2V0LCAoZW5kT2Zmc2V0ID4gc3RhcnRPZmZzZXQgPyBlbmRPZmZzZXQgLSBzdGFydE9mZnNldCA6IGVuZE9mZnNldCA9PT0gc3RhcnRPZmZzZXQgPyAwIDogc3RhcnRDb250YWluZXIuZGF0YS5sZW5ndGggLSBzdGFydE9mZnNldCkpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2Tm9kZS5kYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQocHJldk5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gY2hpbGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyZW50ID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNzc1RleHQgPSAnJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5ld05vZGUgIT09IHBOb2RlICYmIG5ld05vZGUgIT09IGVsICYmIG5ld05vZGUgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uKG5ld05vZGUpICYmIG5ld05vZGUubm9kZVR5cGUgPT09IDEgJiYgY2hlY2tDc3MobmV3Tm9kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudC5wdXNoKG5ld05vZGUuY2xvbmVOb2RlKGZhbHNlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NzVGV4dCArPSBuZXdOb2RlLnN0eWxlLmNzc1RleHQuc3Vic3RyKDAsIG5ld05vZGUuc3R5bGUuY3NzVGV4dC5pbmRleE9mKCc6JykpICsgJ3wnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IG5ld05vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlID0gcEN1cnJlbnQucG9wKCkgfHwgdGV4dE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUgPSBuZXdOb2RlID0gY2hpbGROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocEN1cnJlbnQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IHBDdXJyZW50LnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZS5hcHBlbmRDaGlsZChuZXdOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUgPSBuZXdOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdJbm5lck5vZGUuYXBwZW5kQ2hpbGQoY2hpbGROb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUuYXBwZW5kQ2hpbGQobmV3SW5uZXJOb2RlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0Q29udGFpbmVyID0gdGV4dE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0T2Zmc2V0ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQYXNzID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdOb2RlICE9PSB0ZXh0Tm9kZSkgbmV3Tm9kZS5hcHBlbmRDaGlsZChzdGFydENvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNTYW1lTm9kZSkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBlbmRDb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWVuZFBhc3MgJiYgY2hpbGQgPT09IGVuZENvbnRhaW5lcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhZnRlck5vZGUgPSB1dGlsLmNyZWF0ZVRleHROb2RlKGVuZENvbnRhaW5lci5ub2RlVHlwZSA9PT0gMSA/ICcnIDogZW5kQ29udGFpbmVyLnN1YnN0cmluZ0RhdGEoZW5kT2Zmc2V0LCAoZW5kQ29udGFpbmVyLmxlbmd0aCAtIGVuZE9mZnNldCkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dE5vZGUgPSB1dGlsLmNyZWF0ZVRleHROb2RlKGlzU2FtZU5vZGUgfHwgZW5kQ29udGFpbmVyLm5vZGVUeXBlID09PSAxID8gJycgOiBlbmRDb250YWluZXIuc3Vic3RyaW5nRGF0YSgwLCBlbmRPZmZzZXQpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlck5vZGUuZGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gY2hpbGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3NUZXh0ID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5ld05vZGUgIT09IHBOb2RlICYmIG5ld05vZGUgIT09IGVsICYmIG5ld05vZGUgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Tm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBjaGVja0NzcyhuZXdOb2RlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudC5wdXNoKG5ld05vZGUuY2xvbmVOb2RlKGZhbHNlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzc1RleHQgKz0gbmV3Tm9kZS5zdHlsZS5jc3NUZXh0LnN1YnN0cigwLCBuZXdOb2RlLnN0eWxlLmNzc1RleHQuaW5kZXhPZignOicpKSArICd8JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IG5ld05vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9uZU5vZGUgPSBhcHBlbmROb2RlID0gbmV3Tm9kZSA9IHBDdXJyZW50LnBvcCgpIHx8IGFmdGVyTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwQ3VycmVudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IHBDdXJyZW50LnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUuYXBwZW5kQ2hpbGQobmV3Tm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSA9IG5ld05vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUuYXBwZW5kQ2hpbGQoY2xvbmVOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUudGV4dENvbnRlbnQgPSBhZnRlck5vZGUuZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IGNoaWxkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjc3NUZXh0ID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChuZXdOb2RlICE9PSBwTm9kZSAmJiBuZXdOb2RlICE9PSBlbCAmJiBuZXdOb2RlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGlvbihuZXdOb2RlKSAmJiBuZXdOb2RlLm5vZGVUeXBlID09PSAxICYmIGNoZWNrQ3NzKG5ld05vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnQucHVzaChuZXdOb2RlLmNsb25lTm9kZShmYWxzZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzc1RleHQgKz0gbmV3Tm9kZS5zdHlsZS5jc3NUZXh0LnN1YnN0cigwLCBuZXdOb2RlLnN0eWxlLmNzc1RleHQuaW5kZXhPZignOicpKSArICd8JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBuZXdOb2RlLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkTm9kZSA9IHBDdXJyZW50LnBvcCgpIHx8IHRleHROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlID0gbmV3Tm9kZSA9IGNoaWxkTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBDdXJyZW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBwQ3VycmVudC5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUuYXBwZW5kQ2hpbGQobmV3Tm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlID0gbmV3Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3SW5uZXJOb2RlLmFwcGVuZENoaWxkKGNoaWxkTm9kZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmRDb250YWluZXIgPSB0ZXh0Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kT2Zmc2V0ID0gdGV4dE5vZGUuZGF0YS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZFBhc3MgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1JlbW92ZUZvcm1hdCAmJiBjb2xsYXBzZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0lubmVyTm9kZSA9IHRleHROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dE5vZGUudGV4dENvbnRlbnQgPSB1dGlsLnplcm9XaWR0aFNwYWNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Tm9kZSAhPT0gdGV4dE5vZGUpIG5ld05vZGUuYXBwZW5kQ2hpbGQoZW5kQ29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBvdGhlclxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFydFBhc3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSAxICYmICF1dGlsLmlzQnJlYWsoY2hpbGQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNpb25GdW5jKGNoaWxkLCBjaGlsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IGNoaWxkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjc3NUZXh0ID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChuZXdOb2RlLnBhcmVudE5vZGUgIT09IG51bGwgJiYgbmV3Tm9kZSAhPT0gZWwgJiYgbmV3Tm9kZSAhPT0gbmV3SW5uZXJOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Tm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAhdXRpbC5pc0JyZWFrKGNoaWxkKSAmJiAoZW5kUGFzcyB8fCB2YWxpZGF0aW9uKG5ld05vZGUpKSAmJiBjaGVja0NzcyhuZXdOb2RlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyZW50LnB1c2gobmV3Tm9kZS5jbG9uZU5vZGUoZmFsc2UpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3NUZXh0ICs9IG5ld05vZGUuc3R5bGUuY3NzVGV4dC5zdWJzdHIoMCwgbmV3Tm9kZS5zdHlsZS5jc3NUZXh0LmluZGV4T2YoJzonKSkgKyAnfCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gbmV3Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZE5vZGUgPSBwQ3VycmVudC5wb3AoKSB8fCBjaGlsZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSA9IG5ld05vZGUgPSBjaGlsZE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwQ3VycmVudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gcEN1cnJlbnQucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlLmFwcGVuZENoaWxkKG5ld05vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSA9IG5ld05vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZE5vZGUgPT09IGNoaWxkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVuZFBhc3MpIG5vZGUgPSBuZXdJbm5lck5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIG5vZGUgPSBwTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbmRQYXNzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTm9kZS5hcHBlbmRDaGlsZChjaGlsZE5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5ld05vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJbm5lck5vZGUuYXBwZW5kQ2hpbGQoY2hpbGROb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBuZXdOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjbG9uZU5vZGUgPSBjaGlsZC5jbG9uZU5vZGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoY2xvbmVOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT09IDEgJiYgIXV0aWwuaXNCcmVhayhjaGlsZCkpIGNvdmVyTm9kZSA9IGNsb25lTm9kZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmVjdXJzaW9uRnVuYyhjaGlsZCwgY292ZXJOb2RlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkoZWxlbWVudCwgcE5vZGUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGlzUmVtb3ZlRm9ybWF0KSB7XHJcbiAgICAgICAgICAgICAgICBzdGFydENvbnRhaW5lciA9IHV0aWwuY3JlYXRlVGV4dE5vZGUoY29sbGFwc2VkID8gdXRpbC56ZXJvV2lkdGhTcGFjZSA6IG5ld0lubmVyTm9kZS50ZXh0Q29udGVudCk7XHJcbiAgICAgICAgICAgICAgICBwTm9kZS5pbnNlcnRCZWZvcmUoc3RhcnRDb250YWluZXIsIG5ld0lubmVyTm9kZSk7XHJcbiAgICAgICAgICAgICAgICBwTm9kZS5yZW1vdmVDaGlsZChuZXdJbm5lck5vZGUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbGxhcHNlZCkgc3RhcnRPZmZzZXQgPSAxO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbGxhcHNlZCkge1xyXG4gICAgICAgICAgICAgICAgc3RhcnRDb250YWluZXIgPSBlbmRDb250YWluZXIgPSBuZXdJbm5lck5vZGU7XHJcbiAgICAgICAgICAgICAgICBzdGFydE9mZnNldCA9IDE7XHJcbiAgICAgICAgICAgICAgICBlbmRPZmZzZXQgPSAxO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB1dGlsLnJlbW92ZUVtcHR5Tm9kZShwTm9kZSk7XHJcbiAgICAgICAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocE5vZGUsIGVsZW1lbnQpO1xyXG4gICAgICAgICAgICB1dGlsLnJlbW92ZUl0ZW0oZWxlbWVudCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgc3RhcnRDb250YWluZXI6IHN0YXJ0Q29udGFpbmVyLFxyXG4gICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQ6IHN0YXJ0T2Zmc2V0LFxyXG4gICAgICAgICAgICAgICAgZW5kQ29udGFpbmVyOiBpc1JlbW92ZUZvcm1hdCB8fCAhZW5kQ29udGFpbmVyLnRleHRDb250ZW50ID8gc3RhcnRDb250YWluZXIgOiBlbmRDb250YWluZXIsXHJcbiAgICAgICAgICAgICAgICBlbmRPZmZzZXQ6IGlzUmVtb3ZlRm9ybWF0IHx8ICFlbmRDb250YWluZXIudGV4dENvbnRlbnQgPyBzdGFydENvbnRhaW5lci50ZXh0Q29udGVudC5sZW5ndGggOiBlbmRPZmZzZXRcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gd3JhcHMgbWlkIGxpbmVzIHNlbGVjdGVkIHRleHQuXHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gVGhlIG5vZGUgb2YgdGhlIGxpbmUgdGhhdCBjb250YWlucyB0aGUgc2VsZWN0ZWQgdGV4dCBub2RlLlxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbmV3SW5uZXJOb2RlIC0gVGhlIGRvbSB0aGF0IHdpbGwgd3JhcCB0aGUgc2VsZWN0ZWQgdGV4dCBhcmVhXHJcbiAgICAgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gdmFsaWRhdGlvbiAtIENoZWNrIGlmIHRoZSBub2RlIHNob3VsZCBiZSBzdHJpcHBlZC5cclxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzUmVtb3ZlRm9ybWF0IC0gSXMgdGhlIHJlbW92ZSBmb3JtYXQgY29tbWFuZCA/XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfbm9kZUNoYW5nZV9taWRkbGVMaW5lOiBmdW5jdGlvbiAoZWxlbWVudCwgbmV3SW5uZXJOb2RlLCB2YWxpZGF0aW9uLCBpc1JlbW92ZUZvcm1hdCkge1xyXG4gICAgICAgICAgICBpZiAoaXNSZW1vdmVGb3JtYXQpIHtcclxuICAgICAgICAgICAgICAgIG5ld0lubmVyTm9kZSA9IHV0aWwuY3JlYXRlVGV4dE5vZGUoZWxlbWVudC50ZXh0Q29udGVudCA/IGVsZW1lbnQudGV4dENvbnRlbnQgOiB1dGlsLnplcm9XaWR0aFNwYWNlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIChmdW5jdGlvbiByZWN1cnNpb25GdW5jKGN1cnJlbnQsIG5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZE5vZGVzID0gY3VycmVudC5jaGlsZE5vZGVzO1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNoaWxkTm9kZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkID0gY2hpbGROb2Rlc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvdmVyTm9kZSA9IG5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uKGNoaWxkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNsb25lTm9kZSA9IGNoaWxkLmNsb25lTm9kZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKGNsb25lTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT09IDEgJiYgIXV0aWwuaXNCcmVhayhjaGlsZCkpIGNvdmVyTm9kZSA9IGNsb25lTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNpb25GdW5jKGNoaWxkLCBjb3Zlck5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pKGVsZW1lbnQsIG5ld0lubmVyTm9kZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gJyc7XHJcbiAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQobmV3SW5uZXJOb2RlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gd3JhcHMgZmlyc3QgbGluZSBzZWxlY3RlZCB0ZXh0LlxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIFRoZSBub2RlIG9mIHRoZSBsaW5lIHRoYXQgY29udGFpbnMgdGhlIHNlbGVjdGVkIHRleHQgbm9kZS5cclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5ld0lubmVyTm9kZSAtIFRoZSBkb20gdGhhdCB3aWxsIHdyYXAgdGhlIHNlbGVjdGVkIHRleHQgYXJlYVxyXG4gICAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IHZhbGlkYXRpb24gLSBDaGVjayBpZiB0aGUgbm9kZSBzaG91bGQgYmUgc3RyaXBwZWQuXHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBzdGFydENvbiAtIFRoZSBzdGFydENvbnRhaW5lciBwcm9wZXJ0eSBvZiB0aGUgc2VsZWN0aW9uIG9iamVjdC5cclxuICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gc3RhcnRPZmYgLSBUaGUgc3RhcnRPZmZzZXQgcHJvcGVydHkgb2YgdGhlIHNlbGVjdGlvbiBvYmplY3QuXHJcbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBpc1JlbW92ZUZvcm1hdCAtIElzIHRoZSByZW1vdmUgZm9ybWF0IGNvbW1hbmQgP1xyXG4gICAgICAgICAqIEByZXR1cm5zIHt7Y29udGFpbmVyOiAqLCBvZmZzZXQ6ICp9fVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX25vZGVDaGFuZ2Vfc3RhcnRMaW5lOiBmdW5jdGlvbiAoZWxlbWVudCwgbmV3SW5uZXJOb2RlLCB2YWxpZGF0aW9uLCBzdGFydENvbiwgc3RhcnRPZmYsIGlzUmVtb3ZlRm9ybWF0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsID0gZWxlbWVudDtcclxuICAgICAgICAgICAgY29uc3QgcE5vZGUgPSBlbGVtZW50LmNsb25lTm9kZShmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgY29udGFpbmVyID0gc3RhcnRDb247XHJcbiAgICAgICAgICAgIGxldCBvZmZzZXQgPSBzdGFydE9mZjtcclxuICAgICAgICAgICAgbGV0IHBhc3NOb2RlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGxldCBwQ3VycmVudCwgbmV3Tm9kZSwgYXBwZW5kTm9kZTtcclxuXHJcbiAgICAgICAgICAgIChmdW5jdGlvbiByZWN1cnNpb25GdW5jKGN1cnJlbnQsIG5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkTm9kZXMgPSBjdXJyZW50LmNoaWxkTm9kZXM7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gY2hpbGROb2Rlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGROb2Rlc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY292ZXJOb2RlID0gbm9kZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NOb2RlICYmICF1dGlsLmlzQnJlYWsoY2hpbGQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzaW9uRnVuYyhjaGlsZCwgY2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBjaGlsZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnQgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5ld05vZGUucGFyZW50Tm9kZSAhPT0gbnVsbCAmJiBuZXdOb2RlICE9PSBlbCAmJiBuZXdOb2RlICE9PSBuZXdJbm5lck5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdOb2RlLm5vZGVUeXBlID09PSAxICYmIHZhbGlkYXRpb24obmV3Tm9kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudC5wdXNoKG5ld05vZGUuY2xvbmVOb2RlKGZhbHNlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gbmV3Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocEN1cnJlbnQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlID0gcEN1cnJlbnQucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlID0gbmV3Tm9kZSA9IGNoaWxkTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwQ3VycmVudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IHBDdXJyZW50LnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUuYXBwZW5kQ2hpbGQobmV3Tm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSA9IG5ld05vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJbm5lck5vZGUuYXBwZW5kQ2hpbGQoY2hpbGROb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBuZXdOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5ld0lubmVyTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnRDb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NOb2RlICYmIGNoaWxkID09PSBjb250YWluZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldk5vZGUgPSB1dGlsLmNyZWF0ZVRleHROb2RlKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gMSA/ICcnIDogY29udGFpbmVyLnN1YnN0cmluZ0RhdGEoMCwgb2Zmc2V0KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHROb2RlID0gdXRpbC5jcmVhdGVUZXh0Tm9kZShjb250YWluZXIubm9kZVR5cGUgPT09IDEgPyAnJyA6IGNvbnRhaW5lci5zdWJzdHJpbmdEYXRhKG9mZnNldCwgKGNvbnRhaW5lci5sZW5ndGggLSBvZmZzZXQpKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldk5vZGUuZGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKHByZXZOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IG5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyZW50ID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChuZXdOb2RlICE9PSBwTm9kZSAmJiBuZXdOb2RlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Tm9kZS5ub2RlVHlwZSA9PT0gMSAmJiB2YWxpZGF0aW9uKG5ld05vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnQucHVzaChuZXdOb2RlLmNsb25lTm9kZShmYWxzZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IG5ld05vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlID0gcEN1cnJlbnQucG9wKCkgfHwgbm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSA9IG5ld05vZGUgPSBjaGlsZE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwQ3VycmVudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gcEN1cnJlbnQucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlLmFwcGVuZENoaWxkKG5ld05vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSA9IG5ld05vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZE5vZGUgIT09IG5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0lubmVyTm9kZS5hcHBlbmRDaGlsZChjaGlsZE5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5ld05vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gbmV3SW5uZXJOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXRpbC5pc0JyZWFrKGNoaWxkKSkgbmV3SW5uZXJOb2RlLmFwcGVuZENoaWxkKGNoaWxkLmNsb25lTm9kZShmYWxzZSkpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUuYXBwZW5kQ2hpbGQobmV3SW5uZXJOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyID0gdGV4dE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NOb2RlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NOb2RlIHx8IHZhbGlkYXRpb24oY2hpbGQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsb25lTm9kZSA9IGNoaWxkLmNsb25lTm9kZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoY2xvbmVOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSAxICYmICF1dGlsLmlzQnJlYWsoY2hpbGQpKSBjb3Zlck5vZGUgPSBjbG9uZU5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZWN1cnNpb25GdW5jKGNoaWxkLCBjb3Zlck5vZGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KShlbGVtZW50LCBwTm9kZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNSZW1vdmVGb3JtYXQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IHV0aWwuY3JlYXRlVGV4dE5vZGUobmV3SW5uZXJOb2RlLnRleHRDb250ZW50KTtcclxuICAgICAgICAgICAgICAgIHBOb2RlLmluc2VydEJlZm9yZShjb250YWluZXIsIG5ld0lubmVyTm9kZSk7XHJcbiAgICAgICAgICAgICAgICBwTm9kZS5yZW1vdmVDaGlsZChuZXdJbm5lck5vZGUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIWlzUmVtb3ZlRm9ybWF0ICYmIHBOb2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuY2hpbGROb2Rlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IGVsZW1lbnQuY2hpbGROb2Rlc1swXTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyID0gdXRpbC5jcmVhdGVUZXh0Tm9kZSh1dGlsLnplcm9XaWR0aFNwYWNlKTtcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUVtcHR5Tm9kZShwTm9kZSk7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHBOb2RlLCBlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlSXRlbShlbGVtZW50KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogY29udGFpbmVyLFxyXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiBvZmZzZXRcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gd3JhcHMgbGFzdCBsaW5lIHNlbGVjdGVkIHRleHQuXHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gVGhlIG5vZGUgb2YgdGhlIGxpbmUgdGhhdCBjb250YWlucyB0aGUgc2VsZWN0ZWQgdGV4dCBub2RlLlxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbmV3SW5uZXJOb2RlIC0gVGhlIGRvbSB0aGF0IHdpbGwgd3JhcCB0aGUgc2VsZWN0ZWQgdGV4dCBhcmVhXHJcbiAgICAgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gdmFsaWRhdGlvbiAtIENoZWNrIGlmIHRoZSBub2RlIHNob3VsZCBiZSBzdHJpcHBlZC5cclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVuZENvbiAtIFRoZSBlbmRDb250YWluZXIgcHJvcGVydHkgb2YgdGhlIHNlbGVjdGlvbiBvYmplY3QuXHJcbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IGVuZE9mZiAtIFRoZSBlbmRPZmZzZXQgcHJvcGVydHkgb2YgdGhlIHNlbGVjdGlvbiBvYmplY3QuXHJcbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBpc1JlbW92ZUZvcm1hdCAtIElzIHRoZSByZW1vdmUgZm9ybWF0IGNvbW1hbmQgP1xyXG4gICAgICAgICAqIEByZXR1cm5zIHt7Y29udGFpbmVyOiAqLCBvZmZzZXQ6ICp9fVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX25vZGVDaGFuZ2VfZW5kTGluZTogZnVuY3Rpb24gKGVsZW1lbnQsIG5ld0lubmVyTm9kZSwgdmFsaWRhdGlvbiwgZW5kQ29uLCBlbmRPZmYsIGlzUmVtb3ZlRm9ybWF0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsID0gZWxlbWVudDtcclxuICAgICAgICAgICAgY29uc3QgcE5vZGUgPSBlbGVtZW50LmNsb25lTm9kZShmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgY29udGFpbmVyID0gZW5kQ29uO1xyXG4gICAgICAgICAgICBsZXQgb2Zmc2V0ID0gZW5kT2ZmO1xyXG4gICAgICAgICAgICBsZXQgcGFzc05vZGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgbGV0IHBDdXJyZW50LCBuZXdOb2RlLCBhcHBlbmROb2RlO1xyXG5cclxuICAgICAgICAgICAgKGZ1bmN0aW9uIHJlY3Vyc2lvbkZ1bmMoY3VycmVudCwgbm9kZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlcyA9IGN1cnJlbnQuY2hpbGROb2RlcztcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBjaGlsZE5vZGVzLmxlbmd0aCAtMTsgMCA8PSBpOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkTm9kZXNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvdmVyTm9kZSA9IG5vZGU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXNzTm9kZSAmJiAhdXRpbC5pc0JyZWFrKGNoaWxkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkZ1bmMoY2hpbGQsIGNoaWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gY2hpbGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyZW50ID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChuZXdOb2RlLnBhcmVudE5vZGUgIT09IG51bGwgJiYgbmV3Tm9kZSAhPT0gZWwgJiYgbmV3Tm9kZSAhPT0gbmV3SW5uZXJOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGlvbihuZXdOb2RlKSAmJiBuZXdOb2RlLm5vZGVUeXBlID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnQucHVzaChuZXdOb2RlLmNsb25lTm9kZShmYWxzZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IG5ld05vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBDdXJyZW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkTm9kZSA9IHBDdXJyZW50LnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSA9IG5ld05vZGUgPSBjaGlsZE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocEN1cnJlbnQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBwQ3VycmVudC5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlLmFwcGVuZENoaWxkKG5ld05vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUgPSBuZXdOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SW5uZXJOb2RlLmluc2VydEJlZm9yZShjaGlsZE5vZGUsIG5ld0lubmVyTm9kZS5maXJzdENoaWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBuZXdOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5ld0lubmVyTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gZW5kQ29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzTm9kZSAmJiBjaGlsZCA9PT0gY29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFmdGVyTm9kZSA9IHV0aWwuY3JlYXRlVGV4dE5vZGUoY29udGFpbmVyLm5vZGVUeXBlID09PSAxID8gJycgOiBjb250YWluZXIuc3Vic3RyaW5nRGF0YShvZmZzZXQsIChjb250YWluZXIubGVuZ3RoIC0gb2Zmc2V0KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IHV0aWwuY3JlYXRlVGV4dE5vZGUoY29udGFpbmVyLm5vZGVUeXBlID09PSAxID8gJycgOiBjb250YWluZXIuc3Vic3RyaW5nRGF0YSgwLCBvZmZzZXQpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlck5vZGUuZGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmluc2VydEJlZm9yZShhZnRlck5vZGUsIG5vZGUuZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBub2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmV3Tm9kZSAhPT0gcE5vZGUgJiYgbmV3Tm9kZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRpb24obmV3Tm9kZSkgJiYgbmV3Tm9kZS5ub2RlVHlwZSA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyZW50LnB1c2gobmV3Tm9kZS5jbG9uZU5vZGUoZmFsc2UpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBuZXdOb2RlLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkTm9kZSA9IHBDdXJyZW50LnBvcCgpIHx8IG5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUgPSBuZXdOb2RlID0gY2hpbGROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocEN1cnJlbnQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IHBDdXJyZW50LnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZS5hcHBlbmRDaGlsZChuZXdOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUgPSBuZXdOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGROb2RlICE9PSBub2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJbm5lck5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkTm9kZSwgbmV3SW5uZXJOb2RlLmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5ld05vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gbmV3SW5uZXJOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXRpbC5pc0JyZWFrKGNoaWxkKSkgbmV3SW5uZXJOb2RlLmFwcGVuZENoaWxkKGNoaWxkLmNsb25lTm9kZShmYWxzZSkpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUuaW5zZXJ0QmVmb3JlKG5ld0lubmVyTm9kZSwgcE5vZGUuZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IHRleHROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSB0ZXh0Tm9kZS5kYXRhLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc05vZGUgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5pbnNlcnRCZWZvcmUoY29udGFpbmVyLCBub2RlLmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFzc05vZGUgfHwgdmFsaWRhdGlvbihjaGlsZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xvbmVOb2RlID0gY2hpbGQuY2xvbmVOb2RlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5pbnNlcnRCZWZvcmUoY2xvbmVOb2RlLCBub2RlLmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT09IDEgJiYgIXV0aWwuaXNCcmVhayhjaGlsZCkpIGNvdmVyTm9kZSA9IGNsb25lTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkZ1bmMoY2hpbGQsIGNvdmVyTm9kZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pKGVsZW1lbnQsIHBOb2RlKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChpc1JlbW92ZUZvcm1hdCkge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyID0gdXRpbC5jcmVhdGVUZXh0Tm9kZShuZXdJbm5lck5vZGUudGV4dENvbnRlbnQpO1xyXG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gY29udGFpbmVyLnRleHRDb250ZW50Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIHBOb2RlLmluc2VydEJlZm9yZShjb250YWluZXIsIG5ld0lubmVyTm9kZSk7XHJcbiAgICAgICAgICAgICAgICBwTm9kZS5yZW1vdmVDaGlsZChuZXdJbm5lck5vZGUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIWlzUmVtb3ZlRm9ybWF0ICYmIHBOb2RlLmNoaWxkTm9kZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5jaGlsZE5vZGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyID0gZWxlbWVudC5jaGlsZE5vZGVzWzBdO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXIgPSB1dGlsLmNyZWF0ZVRleHROb2RlKHV0aWwuemVyb1dpZHRoU3BhY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlRW1wdHlOb2RlKHBOb2RlKTtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocE5vZGUsIGVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVJdGVtKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyOiBjb250YWluZXIsXHJcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IG9mZnNldFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlIGNvbW1hbmQgb2YgY29tbWFuZCBidXR0b24oQWxsIEJ1dHRvbnMgZXhjZXB0IHN1Ym1lbnUgYW5kIGRpYWxvZylcclxuICAgICAgICAgKiAocmVkbywgdW5kbywgYm9sZCwgdW5kZXJsaW5lLCBpdGFsaWMsIHN0cmlrZXRocm91Z2gsIHN1YnNjcmlwdCwgc3VwZXJzY3JpcHQsIHJlbW92ZUZvcm1hdCwgaW5kZW50LCBvdXRkZW50LCBmdWxsc2NyZWVuLCBzaG93QmxvY2tzLCBjb2RldmlldywgcHJldmlldywgcHJpbnQpXHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXQgLSBUaGUgZWxlbWVudCBvZiBjb21tYW5kIGJ1dHRvblxyXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb21tYW5kIC0gUHJvcGVydHkgb2YgY29tbWFuZCBidXR0b24gKGRhdGEtdmFsdWUpXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29tbWFuZEhhbmRsZXI6IGZ1bmN0aW9uICh0YXJnZXQsIGNvbW1hbmQpIHtcclxuICAgICAgICAgICAgc3dpdGNoIChjb21tYW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdjb2RlVmlldyc6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyc09mZigpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlQ29kZVZpZXcoKTtcclxuICAgICAgICAgICAgICAgICAgICB1dGlsLnRvZ2dsZUNsYXNzKHRhcmdldCwgJ29uJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdmdWxsU2NyZWVuJzpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJzT2ZmKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGVGdWxsU2NyZWVuKHRhcmdldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC50b2dnbGVDbGFzcyh0YXJnZXQsICdvbicpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnaW5kZW50JzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJ291dGRlbnQnOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50KGNvbW1hbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAncmVkbyc6XHJcbiAgICAgICAgICAgICAgICBjYXNlICd1bmRvJzpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4ZWNDb21tYW5kKGNvbW1hbmQsIGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ3JlbW92ZUZvcm1hdCc6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVGb3JtYXQoKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ3ByZXZpZXcnOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAncHJpbnQnOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3BlbldpbmRvd0NvbnRlbnRzKGNvbW1hbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnc2hvd0Jsb2Nrcyc6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGVEaXNwbGF5QmxvY2tzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC50b2dnbGVDbGFzcyh0YXJnZXQsICdvbicpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnc3Vic2NyaXB0JzpcclxuICAgICAgICAgICAgICAgICAgICBpZiAodXRpbC5oYXNDbGFzcyhjb250ZXh0LnRvb2wuc3VwZXJzY3JpcHQsICdvbicpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY0NvbW1hbmQoJ3N1cGVyc2NyaXB0JywgZmFsc2UsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUNsYXNzKGNvbnRleHQudG9vbC5zdXBlcnNjcmlwdCwgJ29uJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY0NvbW1hbmQoY29tbWFuZCwgZmFsc2UsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIHV0aWwudG9nZ2xlQ2xhc3ModGFyZ2V0LCAnb24nKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ3N1cGVyc2NyaXB0JzpcclxuICAgICAgICAgICAgICAgICAgICBpZiAodXRpbC5oYXNDbGFzcyhjb250ZXh0LnRvb2wuc3Vic2NyaXB0LCAnb24nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4ZWNDb21tYW5kKCdzdWJzY3JpcHQnLCBmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlQ2xhc3MoY29udGV4dC50b29sLnN1YnNjcmlwdCwgJ29uJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY0NvbW1hbmQoY29tbWFuZCwgZmFsc2UsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIHV0aWwudG9nZ2xlQ2xhc3ModGFyZ2V0LCAnb24nKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ3NhdmUnOlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29udGV4dC5vcHRpb24uY2FsbEJhY2tTYXZlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQub3B0aW9uLmNhbGxCYWNrU2F2ZSh0aGlzLmdldENvbnRlbnRzKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdbU1VORURJVE9SLmNvcmUuY29tbWFuZEhhbmRsZXIuZmFpbF0gUGxlYXNlIHJlZ2lzdGVyIGNhbGwgYmFjayBmdW5jdGlvbiBpbiBjcmVhdGlvbiBvcHRpb24uIChjYWxsQmFja1NhdmUgOiBGdW5jdGlvbiknKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0IDogLy8gJ2JvbGQnLCAndW5kZXJsaW5lJywgJ2l0YWxpYycsICdzdHJpa2UnXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leGVjQ29tbWFuZChjb21tYW5kLCBmYWxzZSwgdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS12YWx1ZScpKTtcclxuICAgICAgICAgICAgICAgICAgICB1dGlsLnRvZ2dsZUNsYXNzKHRhcmdldCwgJ29uJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuZm9jdXMoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gUmVtb3ZlIGZvcm1hdCBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJhbmdlIChJRSwgRWRnZSBub3Qgd29ya2luZylcclxuICAgICAgICAgKi9cclxuICAgICAgICByZW1vdmVGb3JtYXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5ub2RlQ2hhbmdlKHV0aWwuY3JlYXRlRWxlbWVudCgnUkVNT1ZFTk9ERScpKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gVGhpcyBtZXRob2QgaW1wbGVtZW50cyBpbmRlbnRhdGlvbiB0byBzZWxlY3RlZCByYW5nZS5cclxuICAgICAgICAgKiBTZXR0ZWQgXCJtYXJnaW4tbGVmdFwiIHRvIFwiMjVweFwiIGluIHRoZSB0b3AgXCJQXCIgdGFnIG9mIHRoZSBwYXJhbWV0ZXIgbm9kZS5cclxuICAgICAgICAgKiBAcGFyYW0gY29tbWFuZCB7U3RyaW5nfSAtIFNlcGFyYXRvciAoXCJpbmRlbnRcIiBvciBcIm91dGRlbnRcIilcclxuICAgICAgICAgKi9cclxuICAgICAgICBpbmRlbnQ6IGZ1bmN0aW9uIChjb21tYW5kKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlTGluZXMgPSB0aGlzLmdldFNlbGVjdGVkRm9ybWF0RWxlbWVudHMoKTtcclxuICAgICAgICAgICAgbGV0IHAsIG1hcmdpbjtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSByYW5nZUxpbmVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBwID0gcmFuZ2VMaW5lc1tpXTtcclxuICAgICAgICAgICAgICAgIG1hcmdpbiA9IC9cXGQrLy50ZXN0KHAuc3R5bGUubWFyZ2luTGVmdCkgPyBwLnN0eWxlLm1hcmdpbkxlZnQubWF0Y2goL1xcZCsvKVswXSAqIDEgOiAwO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICgnaW5kZW50JyA9PT0gY29tbWFuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1hcmdpbiArPSAyNTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWFyZ2luIC09IDI1O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICBwLnN0eWxlLm1hcmdpbkxlZnQgPSAobWFyZ2luIDwgMCA/IDAgOiBtYXJnaW4pICsgJ3B4JztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBBZGQgb3IgcmVtb3ZlIHRoZSBjbGFzcyBuYW1lIG9mIFwiYm9keVwiIHNvIHRoYXQgdGhlIGNvZGUgYmxvY2sgaXMgdmlzaWJsZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRvZ2dsZURpc3BsYXlCbG9ja3M6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdXRpbC50b2dnbGVDbGFzcyhjb250ZXh0LmVsZW1lbnQud3lzaXd5ZywgJ3N1bi1lZGl0b3Itc2hvdy1ibG9jaycpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBDaGFuZ2VzIHRvIGNvZGUgdmlldyBvciB3eXNpd3lnIHZpZXdcclxuICAgICAgICAgKi9cclxuICAgICAgICB0b2dnbGVDb2RlVmlldzogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb25zdCB3eXNpd3lnQWN0aXZlID0gdGhpcy5fdmFyaWFibGUud3lzaXd5Z0FjdGl2ZTtcclxuICAgICAgICAgICAgY29uc3QgZGlzQnV0dG9ucyA9IHRoaXMuY29kZVZpZXdEaXNhYmxlZEJ1dHRvbnM7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBkaXNCdXR0b25zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBkaXNCdXR0b25zW2ldLmRpc2FibGVkID0gd3lzaXd5Z0FjdGl2ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCF3eXNpd3lnQWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb2RlX2h0bWwgPSBjb250ZXh0LmVsZW1lbnQuY29kZS52YWx1ZS50cmltKCk7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5pbm5lckhUTUwgPSBjb2RlX2h0bWwubGVuZ3RoID4gMCA/IHV0aWwuY29udmVydENvbnRlbnRzRm9yRWRpdG9yKGNvZGVfaHRtbCkgOiAnPHA+JyArIHV0aWwuemVyb1dpZHRoU3BhY2UgKyAnPC9wPic7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5zY3JvbGxUb3AgPSAwO1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LmNvZGUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC53eXNpd3lnLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQub3B0aW9uLmhlaWdodCA9PT0gJ2F1dG8nKSBjb250ZXh0LmVsZW1lbnQuY29kZS5zdHlsZS5oZWlnaHQgPSAnMHB4JztcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhcmlhYmxlLnd5c2l3eWdBY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LmNvZGUudmFsdWUgPSB1dGlsLmNvbnZlcnRIVE1MRm9yQ29kZVZpZXcoY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuaW5uZXJIVE1MLnRyaW0oKSk7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LmNvZGUuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5vcHRpb24uaGVpZ2h0ID09PSAnYXV0bycpIGNvbnRleHQuZWxlbWVudC5jb2RlLnN0eWxlLmhlaWdodCA9IGNvbnRleHQuZWxlbWVudC5jb2RlLnNjcm9sbEhlaWdodCA+IDAgPyAoY29udGV4dC5lbGVtZW50LmNvZGUuc2Nyb2xsSGVpZ2h0ICsgJ3B4JykgOiAnYXV0byc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92YXJpYWJsZS53eXNpd3lnQWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQuY29kZS5mb2N1cygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIENoYW5nZXMgdG8gZnVsbCBzY3JlZW4gb3IgZGVmYXVsdCBzY3JlZW5cclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBmdWxsIHNjcmVlbiBidXR0b25cclxuICAgICAgICAgKi9cclxuICAgICAgICB0b2dnbGVGdWxsU2NyZWVuOiBmdW5jdGlvbiAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX3ZhcmlhYmxlLmlzRnVsbFNjcmVlbikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmFyaWFibGUuaXNGdWxsU2NyZWVuID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQudG9wQXJlYS5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQudG9wQXJlYS5zdHlsZS50b3AgPSAnMCc7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQudG9wQXJlYS5zdHlsZS5sZWZ0ID0gJzAnO1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LnRvcEFyZWEuc3R5bGUud2lkdGggPSAnMTAwJSc7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQudG9wQXJlYS5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQudG9wQXJlYS5zdHlsZS56SW5kZXggPSAnMjE0NzQ4MzY0Nyc7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmFyaWFibGUuX2JvZHlPdmVyZmxvdyA9IF9kLmJvZHkuc3R5bGUub3ZlcmZsb3c7XHJcbiAgICAgICAgICAgICAgICBfZC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmFyaWFibGUuX2VkaXRvckFyZWFPcmlnaW5Dc3NUZXh0ID0gY29udGV4dC5lbGVtZW50LmVkaXRvckFyZWEuc3R5bGUuY3NzVGV4dDtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhcmlhYmxlLl93eXNpd3lnT3JpZ2luQ3NzVGV4dCA9IGNvbnRleHQuZWxlbWVudC53eXNpd3lnLnN0eWxlLmNzc1RleHQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92YXJpYWJsZS5fY29kZU9yaWdpbkNzc1RleHQgPSBjb250ZXh0LmVsZW1lbnQuY29kZS5zdHlsZS5jc3NUZXh0O1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5lZGl0b3JBcmVhLnN0eWxlLmNzc1RleHQgPSBjb250ZXh0LmVsZW1lbnQudG9vbGJhci5zdHlsZS5jc3NUZXh0ID0gY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuc3R5bGUuY3NzVGV4dCA9IGNvbnRleHQuZWxlbWVudC5jb2RlLnN0eWxlLmNzc1RleHQgPSAnJztcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC50b29sYmFyLnN0eWxlLndpZHRoID0gY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuc3R5bGUuaGVpZ2h0ID0gY29udGV4dC5lbGVtZW50LmNvZGUuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnO1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LnRvb2xiYXIuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhcmlhYmxlLmlubmVySGVpZ2h0X2Z1bGxTY3JlZW4gPSAoX3cuaW5uZXJIZWlnaHQgLSBjb250ZXh0LmVsZW1lbnQudG9vbGJhci5vZmZzZXRIZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LmVkaXRvckFyZWEuc3R5bGUuaGVpZ2h0ID0gdGhpcy5fdmFyaWFibGUuaW5uZXJIZWlnaHRfZnVsbFNjcmVlbiArICdweCc7XHJcblxyXG4gICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVDbGFzcyhlbGVtZW50LmZpcnN0RWxlbWVudENoaWxkLCAnaWNvbi1leHBhbnNpb24nKTtcclxuICAgICAgICAgICAgICAgIHV0aWwuYWRkQ2xhc3MoZWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCwgJ2ljb24tcmVkdWN0aW9uJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92YXJpYWJsZS5pc0Z1bGxTY3JlZW4gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQuY29kZS5zdHlsZS5jc3NUZXh0ID0gdGhpcy5fdmFyaWFibGUuX2NvZGVPcmlnaW5Dc3NUZXh0O1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuc3R5bGUuY3NzVGV4dCA9IHRoaXMuX3ZhcmlhYmxlLl93eXNpd3lnT3JpZ2luQ3NzVGV4dDtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC50b29sYmFyLnN0eWxlLmNzc1RleHQgPSAnJztcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5lZGl0b3JBcmVhLnN0eWxlLmNzc1RleHQgPSB0aGlzLl92YXJpYWJsZS5fZWRpdG9yQXJlYU9yaWdpbkNzc1RleHQ7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQudG9wQXJlYS5zdHlsZS5jc3NUZXh0ID0gdGhpcy5fdmFyaWFibGUuX29yaWdpbkNzc1RleHQ7XHJcbiAgICAgICAgICAgICAgICBfZC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gdGhpcy5fdmFyaWFibGUuX2JvZHlPdmVyZmxvdztcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5vcHRpb24uc3RpY2t5VG9vbGJhciA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVDbGFzcyhjb250ZXh0LmVsZW1lbnQudG9vbGJhciwgJ3N1bi1lZGl0b3Itc3RpY2t5Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQub25TY3JvbGxfd2luZG93KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVDbGFzcyhlbGVtZW50LmZpcnN0RWxlbWVudENoaWxkLCAnaWNvbi1yZWR1Y3Rpb24nKTtcclxuICAgICAgICAgICAgICAgIHV0aWwuYWRkQ2xhc3MoZWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCwgJ2ljb24tZXhwYW5zaW9uJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gT3BlbiB0aGUgcHJldmlldyB3aW5kb3cgb3Igb3BlbiB0aGUgcHJpbnQgd2luZG93XHJcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG1vZGUgLSAncHJldmlldycgb3IgJ3ByaW50J1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIG9wZW5XaW5kb3dDb250ZW50czogZnVuY3Rpb24gKG1vZGUpIHtcclxuICAgICAgICAgICAgY29uc3QgaXNQcmludCA9IG1vZGUgPT09ICdwcmludCc7XHJcbiAgICAgICAgICAgIGNvbnN0IHdpbmRvd09iamVjdCA9IF93Lm9wZW4oJycsICdfYmxhbmsnKTtcclxuICAgICAgICAgICAgd2luZG93T2JqZWN0Lm1pbWVUeXBlID0gJ3RleHQvaHRtbCc7XHJcbiAgICAgICAgICAgIHdpbmRvd09iamVjdC5kb2N1bWVudC53cml0ZSgnJyArXHJcbiAgICAgICAgICAgICAgICAnPCFkb2N0eXBlIGh0bWw+PGh0bWw+JyArXHJcbiAgICAgICAgICAgICAgICAnPGhlYWQ+JyArXHJcbiAgICAgICAgICAgICAgICAnPG1ldGEgY2hhcnNldD1cInV0Zi04XCIgLz4nICtcclxuICAgICAgICAgICAgICAgICc8bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50PVwid2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTFcIj4nICtcclxuICAgICAgICAgICAgICAgICc8dGl0bGU+JyArIChpc1ByaW50ID8gbGFuZy50b29sYmFyLnByaW50IDogbGFuZy50b29sYmFyLnByZXZpZXcpICsgJzwvdGl0bGU+JyArXHJcbiAgICAgICAgICAgICAgICAnPGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIHR5cGU9XCJ0ZXh0L2Nzc1wiIGhyZWY9XCInICsgdXRpbC5nZXRJbmNsdWRlUGF0aChbJ3N1bmVkaXRvci1jb250ZW50cycsICdzdW5lZGl0b3InXSwgJ2NzcycpICsgJ1wiPicgK1xyXG4gICAgICAgICAgICAgICAgJzwvaGVhZD4nICtcclxuICAgICAgICAgICAgICAgICc8Ym9keT4nICtcclxuICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic3VuLWVkaXRvci1lZGl0YWJsZVwiIHN0eWxlPVwid2lkdGg6JyArIGNvbnRleHQuZWxlbWVudC53eXNpd3lnLm9mZnNldFdpZHRoICsgJ3B4OyBtYXJnaW46YXV0bztcIj4nICtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q29udGVudHMoKSArICc8L2Rpdj4nICtcclxuICAgICAgICAgICAgICAgIChpc1ByaW50ID8gJzxzY3JpcHQ+d2luZG93LnByaW50KCk7PC9zY3JpcHQ+JyA6ICcnKSArICc8L2JvZHk+JyArXHJcbiAgICAgICAgICAgICAgICAnPC9odG1sPicpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBjdXJyZW50IGNvbnRlbnRzXHJcbiAgICAgICAgICogQHJldHVybnMge09iamVjdH1cclxuICAgICAgICAgKi9cclxuICAgICAgICBnZXRDb250ZW50czogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBsZXQgY29udGVudHMgPSAnJztcclxuXHJcbiAgICAgICAgICAgIGlmIChjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5pbm5lclRleHQudHJpbSgpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGNvbnRlbnRzO1xyXG5cclxuICAgICAgICAgICAgaWYgKGVkaXRvci5fdmFyaWFibGUud3lzaXd5Z0FjdGl2ZSkge1xyXG4gICAgICAgICAgICAgICAgY29udGVudHMgPSBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5pbm5lckhUTUw7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb250ZW50cyA9IHV0aWwuY29udmVydENvbnRlbnRzRm9yRWRpdG9yKGNvbnRleHQuZWxlbWVudC5jb2RlLnZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgcmVuZGVySFRNTCA9IHV0aWwuY3JlYXRlRWxlbWVudCgnRElWJyk7XHJcbiAgICAgICAgICAgIHJlbmRlckhUTUwuaW5uZXJIVE1MID0gY29udGVudHM7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBmaWdjYXB0aW9ucyA9IHV0aWwuZ2V0TGlzdENoaWxkcmVuKHJlbmRlckhUTUwsIGZ1bmN0aW9uIChjdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gL0ZJR0NBUFRJT04vaS50ZXN0KGN1cnJlbnQubm9kZU5hbWUpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBmaWdjYXB0aW9ucy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgZmlnY2FwdGlvbnNbaV0ub3V0ZXJIVE1MID0gZmlnY2FwdGlvbnNbaV0ub3V0ZXJIVE1MLnJlcGxhY2UoLyg/IV48ZmlnY2FwdGlvblxccyspKGNvbnRlbnRlZGl0YWJsZT1cIihbYS16XSt8XFxzKilcIilcXHMqKD89W14+XSo+KS9pLCAnJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiByZW5kZXJIVE1MLmlubmVySFRNTDtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIGV2ZW50IGZ1bmN0aW9uXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IGV2ZW50ID0ge1xyXG4gICAgICAgIF9zaG9ydGN1dEtleUNvZGU6IHtcclxuICAgICAgICAgICAgNjY6IFsnYm9sZCcsICdCJ10sXHJcbiAgICAgICAgICAgIDgzOiBbJ3N0cmlrZXRocm91Z2gnLCAnU1RSSUtFJ10sXHJcbiAgICAgICAgICAgIDg1OiBbJ3VuZGVybGluZScsICdVJ10sXHJcbiAgICAgICAgICAgIDczOiBbJ2l0YWxpYycsICdJJ10sXHJcbiAgICAgICAgICAgIDg5OiBbJ3JlZG8nXSxcclxuICAgICAgICAgICAgOTA6IFsndW5kbyddLFxyXG4gICAgICAgICAgICAyMTk6IFsnb3V0ZGVudCddLFxyXG4gICAgICAgICAgICAyMjE6IFsnaW5kZW50J11cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfZGlyZWN0aW9uS2V5S2V5Q29kZTogbmV3IFJlZ0V4cCgnXig/Ojh8MTN8MzJ8NDZ8MzN8MzR8MzV8MzZ8Mzd8Mzh8Mzl8NDB8OTh8MTAwfDEwMnwxMDQpJCcpLFxyXG5cclxuICAgICAgICBfY2hhbmdlQnV0dG9uQ2xhc3NUYWdDaGVjazogbmV3IFJlZ0V4cCgnXig/OkJ8VXxJfFNUUklLRXxTVUJ8U1VQKSQnKSxcclxuXHJcbiAgICAgICAgX2ZpbmRCdXR0b25FZmZlY3RUYWc6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY29uc3QgY29tbWFuZE1hcCA9IGVkaXRvci5jb21tYW5kTWFwO1xyXG4gICAgICAgICAgICBjb25zdCBjbGFzc09uQ2hlY2sgPSB0aGlzLl9jaGFuZ2VCdXR0b25DbGFzc1RhZ0NoZWNrO1xyXG4gICAgICAgICAgICBjb25zdCBjb21tYW5kTWFwTm9kZXMgPSBbXTtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudE5vZGVzID0gW107XHJcblxyXG4gICAgICAgICAgICBsZXQgZmluZEZvcm1hdCA9IHRydWUsIGZpbmRGb250ID0gdHJ1ZSwgZmluZFNpemUgPSB0cnVlLCBmaW5kQSA9IHRydWU7XHJcbiAgICAgICAgICAgIGxldCBmaW5kQiA9IHRydWUsIGZpbmRJID0gdHJ1ZSwgZmluZFUgPSB0cnVlLCBmaW5kUyA9IHRydWU7XHJcbiAgICAgICAgICAgIGxldCBjc3NUZXh0ID0gJycsIG5vZGVOYW1lID0gJyc7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBzZWxlY3Rpb25QYXJlbnQgPSBlZGl0b3IuZ2V0U2VsZWN0aW9uTm9kZSgpOyAhdXRpbC5pc1d5c2l3eWdEaXYoc2VsZWN0aW9uUGFyZW50KTsgc2VsZWN0aW9uUGFyZW50ID0gc2VsZWN0aW9uUGFyZW50LnBhcmVudE5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGlmICghc2VsZWN0aW9uUGFyZW50KSBicmVhaztcclxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25QYXJlbnQubm9kZVR5cGUgIT09IDEpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgbm9kZU5hbWUgPSBzZWxlY3Rpb25QYXJlbnQubm9kZU5hbWUudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnROb2Rlcy5wdXNoKG5vZGVOYW1lKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvKiogRm9ybWF0ICovXHJcbiAgICAgICAgICAgICAgICBpZiAoZmluZEZvcm1hdCAmJiB1dGlsLmlzRm9ybWF0RWxlbWVudChzZWxlY3Rpb25QYXJlbnQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZE1hcE5vZGVzLnB1c2goJ0ZPUk1BVCcpO1xyXG4gICAgICAgICAgICAgICAgICAgIHV0aWwuY2hhbmdlVHh0KGNvbW1hbmRNYXAuRk9STUFULCBub2RlTmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZmluZEZvcm1hdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8qKiBGb250ICovXHJcbiAgICAgICAgICAgICAgICBpZiAoZmluZEZvbnQgJiYgKHNlbGVjdGlvblBhcmVudC5zdHlsZS5mb250RmFtaWx5Lmxlbmd0aCA+IDAgfHwgKHNlbGVjdGlvblBhcmVudC5mYWNlICYmIHNlbGVjdGlvblBhcmVudC5mYWNlLmxlbmd0aCA+IDApKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmRNYXBOb2Rlcy5wdXNoKCdGT05UJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0Rm9udCA9IChzZWxlY3Rpb25QYXJlbnQuc3R5bGUuZm9udEZhbWlseSB8fCBzZWxlY3Rpb25QYXJlbnQuZmFjZSB8fCBsYW5nLnRvb2xiYXIuZm9udCkucmVwbGFjZSgvW1wiJ10vZywnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5jaGFuZ2VUeHQoY29tbWFuZE1hcC5GT05ULCBzZWxlY3RGb250KTtcclxuICAgICAgICAgICAgICAgICAgICBmaW5kRm9udCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8qKiBBICovXHJcbiAgICAgICAgICAgICAgICBpZiAoZmluZEEgJiYgL15BJC8udGVzdChub2RlTmFtZSkgJiYgc2VsZWN0aW9uUGFyZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1pbWFnZS1saW5rJykgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRleHQubGluayB8fCBlZGl0b3IuY29udHJvbGxlckFycmF5WzBdICE9PSBjb250ZXh0LmxpbmsubGlua0J0bikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3IuY2FsbFBsdWdpbignbGluaycsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvci5wbHVnaW5zLmxpbmsuY2FsbF9jb250cm9sbGVyX2xpbmtCdXR0b24uY2FsbChlZGl0b3IsIHNlbGVjdGlvblBhcmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBmaW5kQSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaW5kQSAmJiBjb250ZXh0LmxpbmsgJiYgZWRpdG9yLmNvbnRyb2xsZXJBcnJheVswXSA9PT0gY29udGV4dC5saW5rLmxpbmtCdG4pIHtcclxuICAgICAgICAgICAgICAgICAgICBlZGl0b3IuY29udHJvbGxlcnNPZmYoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvKiogU1BBTiAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKGZpbmRTaXplICYmIC9eU1BBTiQvLnRlc3Qobm9kZU5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLyoqIGZvbnQgc2l6ZSAqL1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25QYXJlbnQuc3R5bGUuZm9udFNpemUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kTWFwTm9kZXMucHVzaCgnU0laRScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1dGlsLmNoYW5nZVR4dChjb21tYW5kTWFwLlNJWkUsIHNlbGVjdGlvblBhcmVudC5zdHlsZS5mb250U2l6ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRTaXplID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8qKiBjb21tYW5kIG1hcCAqL1xyXG4gICAgICAgICAgICAgICAgY3NzVGV4dCA9IHNlbGVjdGlvblBhcmVudC5zdHlsZS5jc3NUZXh0O1xyXG4gICAgICAgICAgICAgICAgaWYgKGZpbmRCICYmIC9mb250XFwtd2VpZ2h0XFxzKjpcXHMqKD86XFxkK3xib2xkfGJvbGRlcikoPzo7fFxcc3wpLy50ZXN0KGNzc1RleHQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZE1hcE5vZGVzLnB1c2goJ0InKTtcclxuICAgICAgICAgICAgICAgICAgICBmaW5kQiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGZpbmRJICYmIC9mb250XFwtc3R5bGVcXHMqOlxccyooPzppdGFsaWN8b2JsaXF1ZSkoPzo7fFxccykvLnRlc3QoY3NzVGV4dCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kTWFwTm9kZXMucHVzaCgnSScpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbmRJID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZmluZFUgJiYgL3RleHRcXC1kZWNvcmF0aW9uKD86XFwtbGluZSk/XFxzKjpcXHMqdW5kZXJsaW5lKD86O3xcXHN8KS8udGVzdChjc3NUZXh0KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmRNYXBOb2Rlcy5wdXNoKCdVJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgZmluZFUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChmaW5kUyAmJiAvdGV4dFxcLWRlY29yYXRpb24oPzpcXC1saW5lKT9cXHMqOlxccypsaW5lLXRocm91Z2goPzo7fFxcc3wpLy50ZXN0KGNzc1RleHQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZE1hcE5vZGVzLnB1c2goJ1NUUklLRScpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbmRTID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY29tbWFuZE1hcE5vZGVzLnB1c2goKC9eU1RST05HJC8udGVzdChub2RlTmFtZSkgPyAnQicgOiAvXkVNJC8udGVzdChub2RlTmFtZSkgPyAnSScgOiBub2RlTmFtZSkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiogQSBUYWcgZWRpdCBjb250cm9sbGVyIG9mZiAqL1xyXG4gICAgICAgICAgICBpZiAoZmluZEEpIGVkaXRvci5jb250cm9sbGVyc09mZigpO1xyXG5cclxuICAgICAgICAgICAgLyoqIHRvZ2dsZSBjbGFzcyBvbiAqL1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbW1hbmRNYXBOb2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbm9kZU5hbWUgPSBjb21tYW5kTWFwTm9kZXNbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoY2xhc3NPbkNoZWNrLnRlc3Qobm9kZU5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5hZGRDbGFzcyhjb21tYW5kTWFwW25vZGVOYW1lXSwgJ29uJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8qKiByZW1vdmUgY2xhc3MsIGRpc3BsYXkgdGV4dCAqL1xyXG4gICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gY29tbWFuZE1hcCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbW1hbmRNYXBOb2Rlcy5pbmRleE9mKGtleSkgPiAtMSkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBpZiAoL15GT05UL2kudGVzdChrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5jaGFuZ2VUeHQoY29tbWFuZE1hcFtrZXldLCBsYW5nLnRvb2xiYXIuZm9udCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICgvXlNJWkUkL2kudGVzdChrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5jaGFuZ2VUeHQoY29tbWFuZE1hcFtrZXldLCBsYW5nLnRvb2xiYXIuZm9udFNpemUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVDbGFzcyhjb21tYW5kTWFwW2tleV0sICdvbicpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiogc2F2ZSBjdXJyZW50IG5vZGVzICovXHJcbiAgICAgICAgICAgIGVkaXRvci5fdmFyaWFibGUuY3VycmVudE5vZGVzID0gY3VycmVudE5vZGVzLnJldmVyc2UoKTtcclxuXHJcbiAgICAgICAgICAgIC8qKiAgRGlzcGxheXMgdGhlIGN1cnJlbnQgbm9kZSBzdHJ1Y3R1cmUgdG8gcmVzaXppbmdCYXIgKi9cclxuICAgICAgICAgICAgaWYgKGNvbnRleHQub3B0aW9uLnNob3dQYXRoTGFiZWwpIGNvbnRleHQuZWxlbWVudC5uYXZpZ2F0aW9uLnRleHRDb250ZW50ID0gZWRpdG9yLl92YXJpYWJsZS5jdXJyZW50Tm9kZXMuam9pbignID4gJyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2NhbmNlbENhcHRpb25FZGl0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmx1cicsIGV2ZW50Ll9jYW5jZWxDYXB0aW9uRWRpdCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgb25Nb3VzZURvd25fdG9vbGJhcjogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgbGV0IHRhcmdldCA9IGUudGFyZ2V0O1xyXG5cclxuICAgICAgICAgICAgaWYgKHV0aWwuZ2V0UGFyZW50RWxlbWVudCh0YXJnZXQsICcuc3VuLWVkaXRvci1zdWJtZW51JykpIHtcclxuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICBlZGl0b3IuX25vdEhpZGVUb29sYmFyID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGxldCBjb21tYW5kID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1jb21tYW5kJyk7XHJcbiAgICAgICAgICAgICAgICBsZXQgY2xhc3NOYW1lID0gdGFyZ2V0LmNsYXNzTmFtZTtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgd2hpbGUgKCFjb21tYW5kICYmICEvZWRpdG9yX3Rvb2wvLnRlc3QoY2xhc3NOYW1lKSAmJiAhL3N1bi1lZGl0b3ItaWQtdG9vbGJhci8udGVzdChjbGFzc05hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZCA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY29tbWFuZCcpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IHRhcmdldC5jbGFzc05hbWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAgICAgICAgIGlmIChjb21tYW5kID09PSBlZGl0b3IuX3N1Ym1lbnVOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIG9uQ2xpY2tfdG9vbGJhcjogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgbGV0IHRhcmdldCA9IGUudGFyZ2V0O1xyXG4gICAgICAgICAgICBsZXQgZGlzcGxheSA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtZGlzcGxheScpO1xyXG4gICAgICAgICAgICBsZXQgY29tbWFuZCA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY29tbWFuZCcpO1xyXG4gICAgICAgICAgICBsZXQgY2xhc3NOYW1lID0gdGFyZ2V0LmNsYXNzTmFtZTtcclxuXHJcbiAgICAgICAgICAgIHdoaWxlICghY29tbWFuZCAmJiAhL2VkaXRvcl90b29sLy50ZXN0KGNsYXNzTmFtZSkgJiYgIS9zdW4tZWRpdG9yLWlkLXRvb2xiYXIvLnRlc3QoY2xhc3NOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICBjb21tYW5kID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1jb21tYW5kJyk7XHJcbiAgICAgICAgICAgICAgICBkaXNwbGF5ID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1kaXNwbGF5Jyk7XHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSB0YXJnZXQuY2xhc3NOYW1lO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIWNvbW1hbmQgJiYgIWRpc3BsYXkpIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKHRhcmdldC5kaXNhYmxlZCkgcmV0dXJuO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgZWRpdG9yLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvKiogRGlhbG9nLCBTdWJtZW51ICovXHJcbiAgICAgICAgICAgIGlmIChkaXNwbGF5KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoL3N1Ym1lbnUvLnRlc3QoZGlzcGxheSkgJiYgKHRhcmdldC5uZXh0RWxlbWVudFNpYmxpbmcgPT09IG51bGwgfHwgdGFyZ2V0ICE9PSBlZGl0b3Iuc3VibWVudUFjdGl2ZUJ1dHRvbikpIHtcclxuICAgICAgICAgICAgICAgICAgICBlZGl0b3IuY2FsbFBsdWdpbihjb21tYW5kLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvci5zdWJtZW51T24odGFyZ2V0KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICgvZGlhbG9nLy50ZXN0KGRpc3BsYXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLmNhbGxQbHVnaW4oY29tbWFuZCwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3IucGx1Z2lucy5kaWFsb2cub3Blbi5jYWxsKGVkaXRvciwgY29tbWFuZCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBlZGl0b3Iuc3VibWVudU9mZigpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiogZGVmYXVsdCBjb21tYW5kICovXHJcbiAgICAgICAgICAgIGlmIChjb21tYW5kKSB7XHJcbiAgICAgICAgICAgICAgICBlZGl0b3IuY29tbWFuZEhhbmRsZXIodGFyZ2V0LCBjb21tYW5kKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIG9uTW91c2VVcF93eXNpd3lnOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGVkaXRvci5fZWRpdG9yUmFuZ2UoKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChlZGl0b3IuX2lzQmFsbG9vbikge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBlZGl0b3IuZ2V0UmFuZ2UoKTtcclxuICAgICAgICAgICAgICAgIGlmIChyYW5nZS5jb2xsYXBzZWQpIGV2ZW50Ll9oaWRlVG9vbGJhcigpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBldmVudC5fc2hvd1Rvb2xiYXJCYWxsb29uKHJhbmdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIG9uQ2xpY2tfd3lzaXd5ZzogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0RWxlbWVudCA9IGUudGFyZ2V0O1xyXG5cclxuICAgICAgICAgICAgaWYgKC9eSU1HJC9pLnRlc3QodGFyZ2V0RWxlbWVudC5ub2RlTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGVkaXRvci5jYWxsUGx1Z2luKCdpbWFnZScsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplID0gZWRpdG9yLnBsdWdpbnMucmVzaXppbmcuY2FsbF9jb250cm9sbGVyX3Jlc2l6ZS5jYWxsKGVkaXRvciwgdGFyZ2V0RWxlbWVudCwgJ2ltYWdlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLnBsdWdpbnMuaW1hZ2Uub25Nb2RpZnlNb2RlLmNhbGwoZWRpdG9yLCB0YXJnZXRFbGVtZW50LCBzaXplKTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXV0aWwuZ2V0UGFyZW50RWxlbWVudCh0YXJnZXRFbGVtZW50LCAnLnN1bi1lZGl0b3ItaWQtaW1hZ2UtY29udGFpbmVyJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yLnBsdWdpbnMuaW1hZ2Uub3Blbk1vZGlmeS5jYWxsKGVkaXRvciwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvci5wbHVnaW5zLmltYWdlLnVwZGF0ZV9pbWFnZS5jYWxsKGVkaXRvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvci5jb250cm9sbGVyc09mZigpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKC9zdW4tZWRpdG9yLWlkLWlmcmFtZS1pbm5lci1yZXNpemluZy1jb3Zlci9pLnRlc3QodGFyZ2V0RWxlbWVudC5jbGFzc05hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBlZGl0b3IuY2FsbFBsdWdpbigndmlkZW8nLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWZyYW1lID0gdXRpbC5nZXRDaGlsZEVsZW1lbnQodGFyZ2V0RWxlbWVudC5wYXJlbnROb2RlLCAnaWZyYW1lJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IGVkaXRvci5wbHVnaW5zLnJlc2l6aW5nLmNhbGxfY29udHJvbGxlcl9yZXNpemUuY2FsbChlZGl0b3IsIGlmcmFtZSwgJ3ZpZGVvJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLnBsdWdpbnMudmlkZW8ub25Nb2RpZnlNb2RlLmNhbGwoZWRpdG9yLCBpZnJhbWUsIHNpemUpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBldmVudC5fZmluZEJ1dHRvbkVmZmVjdFRhZygpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZmlnY2FwdGlvbiA9IHV0aWwuZ2V0UGFyZW50RWxlbWVudCh0YXJnZXRFbGVtZW50LCAnRklHQ0FQVElPTicpO1xyXG4gICAgICAgICAgICBpZiAoZmlnY2FwdGlvbiAmJiBmaWdjYXB0aW9uLmdldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJykgIT09ICd0dXJlJykge1xyXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZmlnY2FwdGlvbi5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgZmlnY2FwdGlvbi5mb2N1cygpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlZGl0b3IuX2lzSW5saW5lICYmICFlZGl0b3IuX2lubGluZVRvb2xiYXJBdHRyLmlzU2hvdykge1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50Ll9zaG93VG9vbGJhcklubGluZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRlVG9vbGJhciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuX2hpZGVUb29sYmFyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZ2NhcHRpb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmx1cicsIGhpZGVUb29sYmFyKTtcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBmaWdjYXB0aW9uLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBoaWRlVG9vbGJhcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0ZCA9IHV0aWwuZ2V0UGFyZW50RWxlbWVudCh0YXJnZXRFbGVtZW50LCB1dGlsLmlzQ2VsbCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZWRpdG9yLmNvbnRyb2xsZXJBcnJheS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yLmNhbGxQbHVnaW4oJ3RhYmxlJywgZWRpdG9yLnBsdWdpbnMudGFibGUuY2FsbF9jb250cm9sbGVyX3RhYmxlRWRpdC5iaW5kKGVkaXRvciwgdGQpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh1c2VyRnVuY3Rpb24ub25DbGljaykgdXNlckZ1bmN0aW9uLm9uQ2xpY2soZSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3Nob3dUb29sYmFyQmFsbG9vbjogZnVuY3Rpb24gKHJhbmdlT2JqKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gcmFuZ2VPYmogfHwgZWRpdG9yLmdldFJhbmdlKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhZGRpbmcgPSAyMDtcclxuICAgICAgICAgICAgY29uc3QgdG9vbGJhciA9IGNvbnRleHQuZWxlbWVudC50b29sYmFyO1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBfdy5nZXRTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBpc0RpclRvcDtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdGlvbi5mb2N1c05vZGUgPT09IHNlbGVjdGlvbi5hbmNob3JOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICBpc0RpclRvcCA9IHNlbGVjdGlvbi5mb2N1c09mZnNldCA8IHNlbGVjdGlvbi5hbmNob3JPZmZzZXQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZE5vZGVzID0gdXRpbC5nZXRMaXN0Q2hpbGROb2RlcyhyYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICBpc0RpclRvcCA9IHV0aWwuZ2V0QXJyYXlJbmRleChjaGlsZE5vZGVzLCBzZWxlY3Rpb24uZm9jdXNOb2RlKSA8IHV0aWwuZ2V0QXJyYXlJbmRleChjaGlsZE5vZGVzLCBzZWxlY3Rpb24uYW5jaG9yTm9kZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCByZWN0cyA9IHJhbmdlLmdldENsaWVudFJlY3RzKCk7XHJcbiAgICAgICAgICAgIHJlY3RzID0gcmVjdHNbaXNEaXJUb3AgPyAwIDogcmVjdHMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0b29sYmFyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgdG9vbGJhcldpZHRoID0gdG9vbGJhci5vZmZzZXRXaWR0aDtcclxuICAgICAgICAgICAgY29uc3QgdG9vbGJhckhlaWdodCA9IHRvb2xiYXIub2Zmc2V0SGVpZ2h0O1xyXG5cclxuICAgICAgICAgICAgbGV0IGwgPSAoaXNEaXJUb3AgPyByZWN0cy5sZWZ0IDogcmVjdHMucmlnaHQpIC0gY29udGV4dC5lbGVtZW50LnRvcEFyZWEub2Zmc2V0TGVmdCArIChfdy5zY3JvbGxYIHx8IF9kLmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0KSAtIHRvb2xiYXJXaWR0aCAvIDI7XHJcbiAgICAgICAgICAgIGxldCB0ID0gKGlzRGlyVG9wID8gcmVjdHMudG9wIC0gdG9vbGJhckhlaWdodCAtIDExIDogcmVjdHMuYm90dG9tICsgMTEpIC0gY29udGV4dC5lbGVtZW50LnRvcEFyZWEub2Zmc2V0VG9wICsgKF93LnNjcm9sbFkgfHwgX2QuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBvdmVyUmlnaHQgPSBsICsgdG9vbGJhcldpZHRoIC0gY29udGV4dC5lbGVtZW50LnRvcEFyZWEub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0b29sYmFyLnN0eWxlLmxlZnQgPSAobCA8IDAgPyBwYWRkaW5nIDogb3ZlclJpZ2h0IDwgMCA/IGwgOiBsIC0gb3ZlclJpZ2h0IC0gcGFkZGluZykgKyAncHgnO1xyXG4gICAgICAgICAgICB0b29sYmFyLnN0eWxlLnRvcCA9ICh0KSArICdweCc7XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNEaXJUb3ApIHtcclxuICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlQ2xhc3MoY29udGV4dC5lbGVtZW50Ll9hcnJvdywgJ2Fycm93LXVwJyk7XHJcbiAgICAgICAgICAgICAgICB1dGlsLmFkZENsYXNzKGNvbnRleHQuZWxlbWVudC5fYXJyb3csICdhcnJvdy1kb3duJyk7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQuX2Fycm93LnN0eWxlLnRvcCA9ICh0b29sYmFySGVpZ2h0KSArICdweCc7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUNsYXNzKGNvbnRleHQuZWxlbWVudC5fYXJyb3csICdhcnJvdy1kb3duJyk7XHJcbiAgICAgICAgICAgICAgICB1dGlsLmFkZENsYXNzKGNvbnRleHQuZWxlbWVudC5fYXJyb3csICdhcnJvdy11cCcpO1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50Ll9hcnJvdy5zdHlsZS50b3AgPSAnLTExcHgnO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBhcnJvd193aWR0aCA9IGNvbnRleHQuZWxlbWVudC5fYXJyb3cub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgIGNvbnN0IGFycm93X2xlZnQgPSAodG9vbGJhcldpZHRoIC8gMiArIChsIDwgMCA/IGwgLSBhcnJvd193aWR0aCA6IG92ZXJSaWdodCA8IDAgPyAwIDogb3ZlclJpZ2h0ICsgYXJyb3dfd2lkdGgpKTtcclxuICAgICAgICAgICAgY29uc3QgYXJyb3dfcG9pbnRfd2lkdGggPSBhcnJvd193aWR0aCAvIDI7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5fYXJyb3cuc3R5bGUubGVmdCA9IChhcnJvd19sZWZ0IDwgYXJyb3dfcG9pbnRfd2lkdGggPyBhcnJvd19wb2ludF93aWR0aCA6IGFycm93X2xlZnQgKyBhcnJvd19wb2ludF93aWR0aCA+PSB0b29sYmFyV2lkdGggPyBhcnJvd19sZWZ0IC0gYXJyb3dfcG9pbnRfd2lkdGggOiBhcnJvd19sZWZ0KSArICdweCc7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3Nob3dUb29sYmFySW5saW5lOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvb2xiYXIgPSBjb250ZXh0LmVsZW1lbnQudG9vbGJhcjtcclxuICAgICAgICAgICAgdG9vbGJhci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgICAgZWRpdG9yLl9pbmxpbmVUb29sYmFyQXR0ci53aWR0aCA9IHRvb2xiYXIuc3R5bGUud2lkdGggPSBjb250ZXh0Lm9wdGlvbi50b29sYmFyV2lkdGg7XHJcbiAgICAgICAgICAgIGVkaXRvci5faW5saW5lVG9vbGJhckF0dHIudG9wID0gdG9vbGJhci5zdHlsZS50b3AgPSAoLTEgLSB0b29sYmFyLm9mZnNldEhlaWdodCkgKyAncHgnO1xyXG4gICAgICAgICAgICBldmVudC5vblNjcm9sbF93aW5kb3coKTtcclxuICAgICAgICAgICAgZWRpdG9yLl9pbmxpbmVUb29sYmFyQXR0ci5pc1Nob3cgPSB0cnVlO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9oaWRlVG9vbGJhcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAoIWVkaXRvci5fbm90SGlkZVRvb2xiYXIpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC50b29sYmFyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgICAgICBlZGl0b3IuX2lubGluZVRvb2xiYXJBdHRyLmlzU2hvdyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBlZGl0b3IuX25vdEhpZGVUb29sYmFyID0gZmFsc2U7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgb25LZXlEb3duX3d5c2l3eWc6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGtleUNvZGUgPSBlLmtleUNvZGU7XHJcbiAgICAgICAgICAgIGNvbnN0IHNoaWZ0ID0gZS5zaGlmdEtleTtcclxuICAgICAgICAgICAgY29uc3QgY3RybCA9IGUuY3RybEtleSB8fCBlLm1ldGFLZXk7XHJcbiAgICAgICAgICAgIGNvbnN0IGFsdCA9IGUuYWx0S2V5O1xyXG5cclxuICAgICAgICAgICAgaWYgKGVkaXRvci5faXNCYWxsb29uKSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5faGlkZVRvb2xiYXIoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZnVuY3Rpb24gc2hvcnRjdXRDb21tYW5kKGtleUNvZGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGV2ZW50Ll9zaG9ydGN1dEtleUNvZGVba2V5Q29kZV07XHJcbiAgICAgICAgICAgICAgICBpZiAoIWtleSkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgIGVkaXRvci5jb21tYW5kSGFuZGxlcih1dGlsLmdldEZvcm1hdEVsZW1lbnQoZWRpdG9yLmdldFNlbGVjdGlvbk5vZGUoKSksIGtleVswXSk7XHJcbiAgICAgICAgICAgICAgICB1dGlsLnRvZ2dsZUNsYXNzKGVkaXRvci5jb21tYW5kTWFwW2tleVsxXV0sICdvbicpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiogU2hvcnRjdXRzICovXHJcbiAgICAgICAgICAgIGlmIChjdHJsICYmICEvXig/OjE2fDE3fDE4KSQvLnRlc3Qoa2V5Q29kZSkpIHtcclxuICAgICAgICAgICAgICAgIGlmICghKCFzaGlmdCAmJiBrZXlDb2RlID09PSA4MykgJiYgc2hvcnRjdXRDb21tYW5kKGtleUNvZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyoqIGRlZmF1bHQga2V5IGFjdGlvbiAqL1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb25Ob2RlID0gZWRpdG9yLmdldFNlbGVjdGlvbk5vZGUoKTtcclxuICAgICAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDg6IC8qKmJhY2tzcGFjZSBrZXkqL1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh1dGlsLmlzRm9ybWF0RWxlbWVudChzZWxlY3Rpb25Ob2RlKSAmJiB1dGlsLmlzV3lzaXd5Z0RpdihzZWxlY3Rpb25Ob2RlLnBhcmVudE5vZGUpICYmIHNlbGVjdGlvbk5vZGUucHJldmlvdXNTaWJsaW5nID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uTm9kZS5pbm5lckhUTUwgPSB1dGlsLnplcm9XaWR0aFNwYWNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA5OlxyXG4gICAgICAgICAgICAgICAgICAgIC8qKnRhYiBrZXkqL1xyXG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY3RybCB8fCBhbHQpIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBlZGl0b3IuY29udHJvbGxlcnNPZmYoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gc2VsZWN0aW9uTm9kZSB8fCBlZGl0b3IuZ2V0U2VsZWN0aW9uTm9kZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICghdXRpbC5pc0NlbGwoY3VycmVudE5vZGUpICYmICF1dGlsLmlzV3lzaXd5Z0RpdihjdXJyZW50Tm9kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlICYmIHV0aWwuaXNDZWxsKGN1cnJlbnROb2RlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWJsZSA9IHV0aWwuZ2V0UGFyZW50RWxlbWVudChjdXJyZW50Tm9kZSwgJ3RhYmxlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxzID0gdXRpbC5nZXRMaXN0Q2hpbGRyZW4odGFibGUsIHV0aWwuaXNDZWxsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlkeCA9IHNoaWZ0ID8gdXRpbC5wcmV2SWR4KGNlbGxzLCBjdXJyZW50Tm9kZSkgOiB1dGlsLm5leHRJZHgoY2VsbHMsIGN1cnJlbnROb2RlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZHggPT09IGNlbGxzLmxlbmd0aCAmJiAhc2hpZnQpIGlkeCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZHggPT09IC0xICYmIHNoaWZ0KSBpZHggPSBjZWxscy5sZW5ndGggLSAxO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbW92ZUNlbGwgPSBjZWxsc1tpZHhdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1vdmVDZWxsKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3Iuc2V0UmFuZ2UobW92ZUNlbGwsIDAsIG1vdmVDZWxsLCAwKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLyoqIGZvcm1hdCBUYWcgKi9cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW5lcyA9IGVkaXRvci5nZXRTZWxlY3RlZEZvcm1hdEVsZW1lbnRzKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghc2hpZnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFiVGV4dCA9IHV0aWwuY3JlYXRlVGV4dE5vZGUobmV3IEFycmF5KGVkaXRvci5fdmFyaWFibGUudGFiU2l6ZSArIDEpLmpvaW4oJ1xcdTAwQTAnKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lcy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvci5pbnNlcnROb2RlKHRhYlRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yLnNldFJhbmdlKHRhYlRleHQsIGVkaXRvci5fdmFyaWFibGUudGFiU2l6ZSwgdGFiVGV4dCwgZWRpdG9yLl92YXJpYWJsZS50YWJTaXplKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBsaW5lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzW2ldLmluc2VydEJlZm9yZSh0YWJUZXh0LmNsb25lTm9kZShmYWxzZSksIGxpbmVzW2ldLmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGxpbmVzLmxlbmd0aCwgY2hpbGQ7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSBsaW5lc1tpXS5maXJzdENoaWxkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC9eXFxzezEsNH0kLy50ZXN0KGNoaWxkLnRleHRDb250ZW50KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlSXRlbShjaGlsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKC9eXFxzezEsNH0vLnRlc3QoY2hpbGQudGV4dENvbnRlbnQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQudGV4dENvbnRlbnQgPSBjaGlsZC50ZXh0Q29udGVudC5yZXBsYWNlKC9eXFxzezEsNH0vLCAnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodXNlckZ1bmN0aW9uLm9uS2V5RG93bikgdXNlckZ1bmN0aW9uLm9uS2V5RG93bihlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBvbktleVVwX3d5c2l3eWc6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGVkaXRvci5fZWRpdG9yUmFuZ2UoKTtcclxuICAgICAgICAgICAgZWRpdG9yLmNvbnRyb2xsZXJzT2ZmKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbk5vZGUgPSBlZGl0b3IuZ2V0U2VsZWN0aW9uTm9kZSgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGVkaXRvci5faXNCYWxsb29uICYmICFlZGl0b3IuZ2V0UmFuZ2UoKS5jb2xsYXBzZWQpIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50Ll9zaG93VG9vbGJhckJhbGxvb24oKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyoqIHdoZW4gZm9ybWF0IHRhZyBkZWxldGVkICovXHJcbiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDggJiYgdXRpbC5pc1d5c2l3eWdEaXYoc2VsZWN0aW9uTm9kZSkgJiYgY29udGV4dC5lbGVtZW50Lnd5c2l3eWcudGV4dENvbnRlbnQubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IG9Gb3JtYXRUYWcgPSB1dGlsLmNyZWF0ZUVsZW1lbnQodXRpbC5pc0Zvcm1hdEVsZW1lbnQoZWRpdG9yLl92YXJpYWJsZS5jdXJyZW50Tm9kZXNbMF0pID8gZWRpdG9yLl92YXJpYWJsZS5jdXJyZW50Tm9kZXNbMF0gOiAnUCcpO1xyXG4gICAgICAgICAgICAgICAgb0Zvcm1hdFRhZy5pbm5lckhUTUwgPSB1dGlsLnplcm9XaWR0aFNwYWNlO1xyXG5cclxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbk5vZGUuYXBwZW5kQ2hpbGQob0Zvcm1hdFRhZyk7XHJcbiAgICAgICAgICAgICAgICBlZGl0b3Iuc2V0UmFuZ2Uob0Zvcm1hdFRhZywgMCwgb0Zvcm1hdFRhZywgMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICgodXRpbC5pc1d5c2l3eWdEaXYoc2VsZWN0aW9uTm9kZS5wYXJlbnRFbGVtZW50KSB8fCB1dGlsLmlzUmFuZ2VGb3JtYXRFbGVtZW50KHNlbGVjdGlvbk5vZGUucGFyZW50RWxlbWVudCkpICYmIHNlbGVjdGlvbk5vZGUubm9kZVR5cGUgPT09IDMpIHtcclxuICAgICAgICAgICAgICAgIGVkaXRvci5leGVjQ29tbWFuZCgnZm9ybWF0QmxvY2snLCBmYWxzZSwgdXRpbC5pc1d5c2l3eWdEaXYoc2VsZWN0aW9uTm9kZS5wYXJlbnRFbGVtZW50KSA/ICdQJyA6ICdESVYnKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50Ll9maW5kQnV0dG9uRWZmZWN0VGFnKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChldmVudC5fZGlyZWN0aW9uS2V5S2V5Q29kZS50ZXN0KGUua2V5Q29kZSkpIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50Ll9maW5kQnV0dG9uRWZmZWN0VGFnKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh1c2VyRnVuY3Rpb24ub25LZXlVcCkgdXNlckZ1bmN0aW9uLm9uS2V5VXAoZSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgb25TY3JvbGxfd3lzaXd5ZzogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgZWRpdG9yLmNvbnRyb2xsZXJzT2ZmKCk7XHJcbiAgICAgICAgICAgIGlmICh1c2VyRnVuY3Rpb24ub25TY3JvbGwpIHVzZXJGdW5jdGlvbi5vblNjcm9sbChlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBvbkRyb3Bfd3lzaXd5ZzogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgY29uc3QgZmlsZXMgPSBlLmRhdGFUcmFuc2Zlci5maWxlcztcclxuXHJcbiAgICAgICAgICAgIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBlZGl0b3IuZm9jdXMoKTtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgZWRpdG9yLmNhbGxQbHVnaW4oJ2ltYWdlJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuaW1hZ2UuaW1nSW5wdXRGaWxlLmZpbGVzID0gZmlsZXM7XHJcbiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLnBsdWdpbnMuaW1hZ2Uub25SZW5kZXJfaW1nSW5wdXQuY2FsbChlZGl0b3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuaW1hZ2UuaW1nSW5wdXRGaWxlLmZpbGVzID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodXNlckZ1bmN0aW9uLm9uRHJvcCkgdXNlckZ1bmN0aW9uLm9uRHJvcChlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBvbk1vdXNlRG93bl9yZXNpemluZ0JhcjogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgIGVkaXRvci5fdmFyaWFibGUucmVzaXplQ2xpZW50WSA9IGUuY2xpZW50WTtcclxuICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LnJlc2l6ZUJhY2tncm91bmQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcblxyXG4gICAgICAgICAgICBmdW5jdGlvbiBjbG9zdXJlRnVuYygpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5yZXNpemVCYWNrZ3JvdW5kLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgICAgICBfZC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBldmVudC5fcmVzaXplX2VkaXRvcik7XHJcbiAgICAgICAgICAgICAgICBfZC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgY2xvc3VyZUZ1bmMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBfZC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBldmVudC5fcmVzaXplX2VkaXRvcik7XHJcbiAgICAgICAgICAgIF9kLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBjbG9zdXJlRnVuYyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3Jlc2l6ZV9lZGl0b3I6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc2l6ZUludGVydmFsID0gY29udGV4dC5lbGVtZW50LmVkaXRvckFyZWEub2Zmc2V0SGVpZ2h0ICsgKGUuY2xpZW50WSAtIGVkaXRvci5fdmFyaWFibGUucmVzaXplQ2xpZW50WSk7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC53eXNpd3lnLnN0eWxlLmhlaWdodCA9IGNvbnRleHQuZWxlbWVudC5jb2RlLnN0eWxlLmhlaWdodCA9IChyZXNpemVJbnRlcnZhbCA8IGVkaXRvci5fdmFyaWFibGUubWluUmVzaXppbmdTaXplID8gZWRpdG9yLl92YXJpYWJsZS5taW5SZXNpemluZ1NpemUgOiByZXNpemVJbnRlcnZhbCkgKyAncHgnO1xyXG4gICAgICAgICAgICBlZGl0b3IuX3ZhcmlhYmxlLnJlc2l6ZUNsaWVudFkgPSBlLmNsaWVudFk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgb25SZXNpemVfd2luZG93OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChjb250ZXh0LmVsZW1lbnQudG9vbGJhci5vZmZzZXRXaWR0aCA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgaWYgKGVkaXRvci5fdmFyaWFibGUuaXNGdWxsU2NyZWVuKSB7XHJcbiAgICAgICAgICAgICAgICBlZGl0b3IuX3ZhcmlhYmxlLmlubmVySGVpZ2h0X2Z1bGxTY3JlZW4gKz0gKF93LmlubmVySGVpZ2h0IC0gY29udGV4dC5lbGVtZW50LnRvb2xiYXIub2Zmc2V0SGVpZ2h0KSAtIGVkaXRvci5fdmFyaWFibGUuaW5uZXJIZWlnaHRfZnVsbFNjcmVlbjtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5lZGl0b3JBcmVhLnN0eWxlLmhlaWdodCA9IGVkaXRvci5fdmFyaWFibGUuaW5uZXJIZWlnaHRfZnVsbFNjcmVlbiArICdweCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZWRpdG9yLl92YXJpYWJsZS5fc3RpY2t5KSB7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQudG9vbGJhci5zdHlsZS53aWR0aCA9IChjb250ZXh0LmVsZW1lbnQudG9wQXJlYS5vZmZzZXRXaWR0aCAtIDIpICsgJ3B4JztcclxuICAgICAgICAgICAgICAgIGV2ZW50Lm9uU2Nyb2xsX3dpbmRvdygpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBlZGl0b3IuY29udHJvbGxlcnNPZmYoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBvblNjcm9sbF93aW5kb3c6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKGVkaXRvci5fdmFyaWFibGUuaXNGdWxsU2NyZWVuIHx8IGNvbnRleHQuZWxlbWVudC50b29sYmFyLm9mZnNldFdpZHRoID09PSAwKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gY29udGV4dC5lbGVtZW50O1xyXG4gICAgICAgICAgICBjb25zdCBlZGl0b3JIZWlnaHQgPSBlbGVtZW50LmVkaXRvckFyZWEub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICAgICAgICBjb25zdCBlZGl0b3JUb3AgPSBlbGVtZW50LnRvcEFyZWEub2Zmc2V0VG9wIC0gKGVkaXRvci5faXNJbmxpbmUgPyBlbGVtZW50LnRvb2xiYXIub2Zmc2V0SGVpZ2h0IDogMCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHkgPSAodGhpcy5zY3JvbGxZIHx8IF9kLmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3ApICsgY29udGV4dC5vcHRpb24uc3RpY2t5VG9vbGJhcjtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICh5IDwgZWRpdG9yVG9wKSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5fb2ZmU3RpY2t5VG9vbGJhcihlbGVtZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh5ICsgZWRpdG9yLl92YXJpYWJsZS5taW5SZXNpemluZ1NpemUgPj0gZWRpdG9ySGVpZ2h0ICsgZWRpdG9yVG9wKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWVkaXRvci5fdmFyaWFibGUuX3N0aWNreSkgZXZlbnQuX29uU3RpY2t5VG9vbGJhcihlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQudG9vbGJhci5zdHlsZS50b3AgPSAoZWRpdG9ySGVpZ2h0ICsgZWRpdG9yVG9wICsgY29udGV4dC5vcHRpb24uc3RpY2t5VG9vbGJhciAteSAtIGVkaXRvci5fdmFyaWFibGUubWluUmVzaXppbmdTaXplKSArICdweCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoeSA+PSBlZGl0b3JUb3ApIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50Ll9vblN0aWNreVRvb2xiYXIoZWxlbWVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25TdGlja3lUb29sYmFyOiBmdW5jdGlvbiAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICBpZiAoIWVkaXRvci5faXNJbmxpbmUpIHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuX3N0aWNreUR1bW15LnN0eWxlLmhlaWdodCA9IGVsZW1lbnQudG9vbGJhci5vZmZzZXRIZWlnaHQgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5fc3RpY2t5RHVtbXkuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGVsZW1lbnQudG9vbGJhci5zdHlsZS50b3AgPSBjb250ZXh0Lm9wdGlvbi5zdGlja3lUb29sYmFyICsgJ3B4JztcclxuICAgICAgICAgICAgZWxlbWVudC50b29sYmFyLnN0eWxlLndpZHRoID0gZWRpdG9yLl9pc0lubGluZSA/IGVkaXRvci5faW5saW5lVG9vbGJhckF0dHIud2lkdGggOiBlbGVtZW50LnRvb2xiYXIub2Zmc2V0V2lkdGggKyAncHgnO1xyXG4gICAgICAgICAgICB1dGlsLmFkZENsYXNzKGVsZW1lbnQudG9vbGJhciwgJ3N1bi1lZGl0b3Itc3RpY2t5Jyk7XHJcbiAgICAgICAgICAgIGVkaXRvci5fdmFyaWFibGUuX3N0aWNreSA9IHRydWU7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX29mZlN0aWNreVRvb2xiYXI6IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQuX3N0aWNreUR1bW15LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgIGVsZW1lbnQudG9vbGJhci5zdHlsZS50b3AgPSBlZGl0b3IuX2lzSW5saW5lID8gZWRpdG9yLl9pbmxpbmVUb29sYmFyQXR0ci50b3AgOiAnJztcclxuICAgICAgICAgICAgZWxlbWVudC50b29sYmFyLnN0eWxlLndpZHRoID0gZWRpdG9yLl9pc0lubGluZSA/IGVkaXRvci5faW5saW5lVG9vbGJhckF0dHIud2lkdGggOiAnJztcclxuICAgICAgICAgICAgZWxlbWVudC5lZGl0b3JBcmVhLnN0eWxlLm1hcmdpblRvcCA9ICcnO1xyXG4gICAgICAgICAgICB1dGlsLnJlbW92ZUNsYXNzKGVsZW1lbnQudG9vbGJhciwgJ3N1bi1lZGl0b3Itc3RpY2t5Jyk7XHJcbiAgICAgICAgICAgIGVkaXRvci5fdmFyaWFibGUuX3N0aWNreSA9IGZhbHNlO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9jb2RlVmlld0F1dG9TY3JvbGw6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LmNvZGUuc3R5bGUuaGVpZ2h0ID0gY29udGV4dC5lbGVtZW50LmNvZGUuc2Nyb2xsSGVpZ2h0ICsgJ3B4JztcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBvblBhc3RlX3d5c2l3eWc6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGlmICghZS5jbGlwYm9hcmREYXRhLmdldERhdGEpIHJldHVybiB0cnVlO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgY2xlYW5EYXRhID0gdXRpbC5jbGVhbkhUTUwoZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQvaHRtbCcpKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChjbGVhbkRhdGEpIHtcclxuICAgICAgICAgICAgICAgIGVkaXRvci5leGVjQ29tbWFuZCgnaW5zZXJ0SFRNTCcsIGZhbHNlLCBjbGVhbkRhdGEpO1xyXG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLyoqIGFkZCBldmVudCBsaXN0ZW5lcnMgKi9cclxuICAgIC8qKiB0b29sYmFyIGV2ZW50ICovXHJcbiAgICBjb250ZXh0LmVsZW1lbnQudG9vbGJhci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBldmVudC5vbk1vdXNlRG93bl90b29sYmFyLCBmYWxzZSk7XHJcbiAgICBjb250ZXh0LmVsZW1lbnQudG9vbGJhci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50Lm9uQ2xpY2tfdG9vbGJhciwgZmFsc2UpO1xyXG4gICAgLyoqIGVkaXRvciBhcmVhICovXHJcbiAgICBjb250ZXh0LmVsZW1lbnQucmVsYXRpdmUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlZGl0b3IuZm9jdXMuYmluZChlZGl0b3IpLCBmYWxzZSk7XHJcbiAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgZXZlbnQub25Nb3VzZVVwX3d5c2l3eWcsIGZhbHNlKTtcclxuICAgIGNvbnRleHQuZWxlbWVudC53eXNpd3lnLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnQub25DbGlja193eXNpd3lnLCBmYWxzZSk7XHJcbiAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBldmVudC5vblNjcm9sbF93eXNpd3lnLCBmYWxzZSk7XHJcbiAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZXZlbnQub25LZXlEb3duX3d5c2l3eWcsIGZhbHNlKTtcclxuICAgIGNvbnRleHQuZWxlbWVudC53eXNpd3lnLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgZXZlbnQub25LZXlVcF93eXNpd3lnLCBmYWxzZSk7XHJcbiAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywgZXZlbnQub25Ecm9wX3d5c2l3eWcsIGZhbHNlKTtcclxuICAgIGNvbnRleHQuZWxlbWVudC53eXNpd3lnLmFkZEV2ZW50TGlzdGVuZXIoJ3Bhc3RlJywgZXZlbnQub25QYXN0ZV93eXNpd3lnLCBmYWxzZSk7XHJcbiAgICBcclxuICAgIC8qKiBjb2RlIHZpZXcgYXJlYSBhdXRvIGxpbmUgKi9cclxuICAgIGlmIChjb250ZXh0Lm9wdGlvbi5oZWlnaHQgPT09ICdhdXRvJykgY29udGV4dC5lbGVtZW50LmNvZGUuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBldmVudC5fY29kZVZpZXdBdXRvU2Nyb2xsLCBmYWxzZSk7XHJcblxyXG4gICAgLyoqIHJlc2l6aW5nQmFyICovXHJcbiAgICBpZiAoY29udGV4dC5lbGVtZW50LnJlc2l6aW5nQmFyKSB7XHJcbiAgICAgICAgaWYgKC9cXGQrLy50ZXN0KGNvbnRleHQub3B0aW9uLmhlaWdodCkpIHtcclxuICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LnJlc2l6aW5nQmFyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGV2ZW50Lm9uTW91c2VEb3duX3Jlc2l6aW5nQmFyLCBmYWxzZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdXRpbC5hZGRDbGFzcyhjb250ZXh0LmVsZW1lbnQucmVzaXppbmdCYXIsICdub25lLXJlc2l6ZScpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogaW5saW5lIGVkaXRvciAqL1xyXG4gICAgaWYgKGVkaXRvci5faXNJbmxpbmUpIHtcclxuICAgICAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIGV2ZW50Ll9zaG93VG9vbGJhcklubGluZSwgZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChlZGl0b3IuX2lzSW5saW5lIHx8IGVkaXRvci5faXNCYWxsb29uKSB7XHJcbiAgICAgICAgY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIGV2ZW50Ll9oaWRlVG9vbGJhciwgZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvKiogd2luZG93IGV2ZW50ICovXHJcbiAgICBfdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBldmVudC5vblJlc2l6ZV93aW5kb3csIGZhbHNlKTtcclxuICAgIGlmIChjb250ZXh0Lm9wdGlvbi5zdGlja3lUb29sYmFyID4gLTEpIF93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGV2ZW50Lm9uU2Nyb2xsX3dpbmRvdywgZmFsc2UpO1xyXG5cclxuICAgIC8qKiBhZGQgcGx1Z2luIHRvIHBsdWdpbnMgb2JqZWN0ICovXHJcbiAgICBpZiAocGx1Z2lucykge1xyXG4gICAgICAgIE9iamVjdC5rZXlzKHBsdWdpbnMpLm1hcChmdW5jdGlvbihrZXkpIHtcclxuICAgICAgICAgICAgbGV0IHBsdWdpbiA9IHBsdWdpbnNba2V5XTtcclxuICAgICAgICAgICAgZWRpdG9yLnBsdWdpbnNbcGx1Z2luLm5hbWVdID0gdXRpbC5jb3B5T2JqKHBsdWdpbik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFVzZXIgZnVuY3Rpb24gKi9cclxuICAgIGNvbnN0IHVzZXJGdW5jdGlvbiA9IHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gRXZlbnQgZnVuY3Rpb25zXHJcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IC0gRXZlbnQgT2JqZWN0XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgb25TY3JvbGw6IG51bGwsXHJcbiAgICAgICAgb25DbGljazogbnVsbCxcclxuICAgICAgICBvbktleURvd246IG51bGwsXHJcbiAgICAgICAgb25LZXlVcDogbnVsbCxcclxuICAgICAgICBvbkRyb3A6IG51bGwsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBDYWxsZWQgd2hlbiB0aGUgaW1hZ2UgaXMgdXBsb2FkZWQgb3IgdGhlIHVwbG9hZGVkIGltYWdlIGlzIGRlbGV0ZWRcclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldEltZ0VsZW1lbnQgLSBDdXJyZW50IGltZyBlbGVtZW50XHJcbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4IC0gVXBsb2FkZWQgaW5kZXhcclxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzRGVsZXRlIC0gV2hldGhlciBvciBub3QgaXQgd2FzIGNhbGxlZCBhZnRlciB0aGUgZGVsZXRlIG9wZXJhdGlvblxyXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbWFnZUluZm8gLSBJbWFnZSBpbmZvIG9iamVjdFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIG9uSW1hZ2VVcGxvYWQ6IG51bGwsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBDYWxsZWQgd2hlbiB0aGUgaW1hZ2UgaXMgdXBsb2FkIGZhaWxlZFxyXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBlcnJvck1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlXHJcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlc3VsdCAtIFJlc3VsdCBpbmZvIE9iamVjdFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIG9uSW1hZ2VVcGxvYWRFcnJvcjogbnVsbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIE9wZW4gYSBub3RpY2UgYXJlYVxyXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIC0gTm90aWNlIG1lc3NhZ2VcclxuICAgICAgICAgKi9cclxuICAgICAgICBub3RpY2VPcGVuOiBmdW5jdGlvbiAobWVzc2FnZSkge1xyXG4gICAgICAgICAgICBlZGl0b3IuYWRkTW9kdWxlKFtub3RpY2VdKTtcclxuICAgICAgICAgICAgbm90aWNlLm9wZW4uY2FsbChlZGl0b3IsIG1lc3NhZ2UpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBDbG9zZSBhIG5vdGljZSBhcmVhXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgbm90aWNlQ2xvc2U6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgZWRpdG9yLmFkZE1vZHVsZShbbm90aWNlXSk7XHJcbiAgICAgICAgICAgIG5vdGljZS5jbG9zZS5jYWxsKGVkaXRvcik7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIENvcHlpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBlZGl0b3IgdG8gdGhlIG9yaWdpbmFsIHRleHRhcmVhXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc2F2ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQub3JpZ2luRWxlbWVudC52YWx1ZSA9IGVkaXRvci5nZXRDb250ZW50cygpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBzdW5lZGl0b3IncyBjb250ZXh0IG9iamVjdC4gQ29udGFpbnMgc2V0dGluZ3MsIHBsdWdpbnMsIGFuZCBjYWNoZWQgZWxlbWVudCBvYmplY3RzXHJcbiAgICAgICAgICogQHJldHVybnMge09iamVjdH1cclxuICAgICAgICAgKi9cclxuICAgICAgICBnZXRDb250ZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBjb250ZW50cyBvZiB0aGUgc3VuZWRpdG9yXHJcbiAgICAgICAgICogQHJldHVybnMge1N0cmluZ31cclxuICAgICAgICAgKi9cclxuICAgICAgICBnZXRDb250ZW50czogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZWRpdG9yLmdldENvbnRlbnRzKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEdldHMgdXBsb2FkZWQgaW1hZ2VzIGluZm9ybWF0aW9uc1xyXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX1cclxuICAgICAgICAgKi9cclxuICAgICAgICBnZXRJbWFnZXNJbmZvOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlZGl0b3IuX3ZhcmlhYmxlLl9pbWFnZXNJbmZvO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBJbnNlcnRzIGFuIEhUTUwgZWxlbWVudCBvciBIVE1MIHN0cmluZyBvciBwbGFpbiBzdHJpbmcgYXQgdGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uXHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fFN0cmluZ30gaHRtbCAtIEhUTUwgRWxlbWVudCBvciBIVE1MIHN0cmluZyBvciBwbGFpbiBzdHJpbmdcclxuICAgICAgICAgKi9cclxuICAgICAgICBpbnNlcnRIVE1MOiBmdW5jdGlvbiAoaHRtbCkge1xyXG4gICAgICAgICAgICBpZiAoIWh0bWwubm9kZVR5cGUgfHwgaHRtbC5ub2RlVHlwZSAhPT0gMSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcGxhdGUgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBodG1sO1xyXG4gICAgICAgICAgICAgICAgaHRtbCA9IHRlbXBsYXRlLmZpcnN0Q2hpbGQgfHwgdGVtcGxhdGUuY29udGVudC5maXJzdENoaWxkO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBlZGl0b3IuaW5zZXJ0Tm9kZShodG1sKTtcclxuICAgICAgICAgICAgZWRpdG9yLmZvY3VzKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIENoYW5nZSB0aGUgY29udGVudHMgb2YgdGhlIHN1bmVkaXRvclxyXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb250ZW50cyAtIENvbnRlbnRzIHRvIElucHV0XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc2V0Q29udGVudHM6IGZ1bmN0aW9uIChjb250ZW50cykge1xyXG4gICAgICAgICAgICBpZiAoZWRpdG9yLl92YXJpYWJsZS53eXNpd3lnQWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5pbm5lckhUTUwgPSB1dGlsLmNvbnZlcnRDb250ZW50c0ZvckVkaXRvcihjb250ZW50cyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQuY29kZS52YWx1ZSA9IGNvbnRlbnRzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEFkZCBjb250ZW50cyB0byB0aGUgc3VuZWRpdG9yXHJcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGNvbnRlbnRzIC0gQ29udGVudHMgdG8gSW5wdXRcclxuICAgICAgICAgKi9cclxuICAgICAgICBhcHBlbmRDb250ZW50czogZnVuY3Rpb24gKGNvbnRlbnRzKSB7XHJcbiAgICAgICAgICAgIGlmIChlZGl0b3IuX3ZhcmlhYmxlLnd5c2l3eWdBY3RpdmUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC53eXNpd3lnLmlubmVySFRNTCArPSB1dGlsLmNvbnZlcnRDb250ZW50c0ZvckVkaXRvcihjb250ZW50cyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQuY29kZS52YWx1ZSArPSBjb250ZW50cztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBEaXNhYmxlIHRoZSBzdW5lZGl0b3JcclxuICAgICAgICAgKi9cclxuICAgICAgICBkaXNhYmxlZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb250ZXh0LnRvb2wuY292ZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC53eXNpd3lnLnNldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJywgZmFsc2UpO1xyXG4gICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQuY29kZS5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEVuYWJsZWQgdGhlIHN1bmVkaXRvclxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGVuYWJsZWQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY29udGV4dC50b29sLmNvdmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC53eXNpd3lnLnNldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJywgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5jb2RlLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gU2hvdyB0aGUgc3VuZWRpdG9yXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc2hvdzogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb25zdCB0b3BBcmVhU3R5bGUgPSBjb250ZXh0LmVsZW1lbnQudG9wQXJlYS5zdHlsZTtcclxuICAgICAgICAgICAgaWYgKHRvcEFyZWFTdHlsZS5kaXNwbGF5ID09PSAnbm9uZScpIHRvcEFyZWFTdHlsZS5kaXNwbGF5ID0gY29udGV4dC5vcHRpb24uZGlzcGxheTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gSGlkZSB0aGUgc3VuZWRpdG9yXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaGlkZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQudG9wQXJlYS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBEZXN0cm95IHRoZSBzdW5lZGl0b3JcclxuICAgICAgICAgKi9cclxuICAgICAgICBkZXN0cm95OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIC8qKiByZW1vdmUgd2luZG93IGV2ZW50IGxpc3RlbmVycyAqL1xyXG4gICAgICAgICAgICBfdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBldmVudC5vblJlc2l6ZV93aW5kb3cpO1xyXG4gICAgICAgICAgICBfdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBldmVudC5vblNjcm9sbF93aW5kb3cpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLyoqIHJlbW92ZSBlbGVtZW50ICovXHJcbiAgICAgICAgICAgIHV0aWwucmVtb3ZlSXRlbShjb250ZXh0LmVsZW1lbnQudG9wQXJlYSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm9uU2Nyb2xsID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5vbkNsaWNrID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5vbktleURvd24gPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLm9uS2V5VXAgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLm9uRHJvcCA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuc2F2ZSA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMub25JbWFnZVVwbG9hZCA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMub25JbWFnZVVwbG9hZEVycm9yID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5ub3RpY2VPcGVuID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5ub3RpY2VDbG9zZSA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udGV4dCA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udGVudHMgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmdldEltYWdlc0luZm8gPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmluc2VydEhUTUwgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLnNldENvbnRlbnRzID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5hcHBlbmRDb250ZW50cyA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZWQgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmVuYWJsZWQgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLnNob3cgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmhpZGUgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3kgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgY29udGV4dCA9IG51bGw7XHJcbiAgICAgICAgICAgIHBsdWdpbnMgPSBudWxsO1xyXG4gICAgICAgICAgICBsYW5nID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB1c2VyRnVuY3Rpb247XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjb3JlOyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUlBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQVlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVEE7QUFDQTtBQVdBOzs7Ozs7Ozs7OztBQVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWpCQTtBQUNBO0FBbUJBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQVhBO0FBYUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVEE7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FBY0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFDQTtBQUNBOzs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUFXQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUFXQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBdkRBO0FBQ0E7QUF5REE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBYUE7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFybURBO0FBd21EQTs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUkE7QUFXQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUE5REE7QUFDQTtBQWdFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdmtCQTtBQTBrQkE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQXZMQTtBQTBMQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/lib/core.js\n"); /***/ }),