.\n\n.list-group {\n // No need to set list-style: none; since .list-group-item is block level\n margin-bottom: 20px;\n padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: @list-group-bg;\n border: 1px solid @list-group-border;\n\n // Round the first and last items\n &:first-child {\n .border-top-radius(@list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n .border-bottom-radius(@list-group-border-radius);\n }\n}\n\n\n// Linked list items\n//\n// Use anchor elements instead of `li`s or `div`s to create linked list items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item {\n color: @list-group-link-color;\n\n .list-group-item-heading {\n color: @list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n text-decoration: none;\n color: @list-group-link-hover-color;\n background-color: @list-group-hover-bg;\n }\n}\n\n.list-group-item {\n // Disabled state\n &.disabled,\n &.disabled:hover,\n &.disabled:focus {\n background-color: @list-group-disabled-bg;\n color: @list-group-disabled-color;\n cursor: @cursor-disabled;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-disabled-text-color;\n }\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: @list-group-active-color;\n background-color: @list-group-active-bg;\n border-color: @list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading,\n .list-group-item-heading > small,\n .list-group-item-heading > .small {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-active-text-color;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n","// List Groups\n\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;\n background-color: @background;\n\n a& {\n color: @color;\n\n .list-group-item-heading {\n color: inherit;\n }\n\n &:hover,\n &:focus {\n color: @color;\n background-color: darken(@background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: @color;\n border-color: @color;\n }\n }\n }\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: @line-height-computed;\n background-color: @panel-bg;\n border: 1px solid transparent;\n border-radius: @panel-border-radius;\n .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n padding: @panel-body-padding;\n &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n padding: @panel-heading-padding;\n border-bottom: 1px solid transparent;\n .border-top-radius((@panel-border-radius - 1));\n\n > .dropdown .dropdown-toggle {\n color: inherit;\n }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: ceil((@font-size-base * 1.125));\n color: inherit;\n\n > a {\n color: inherit;\n }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n padding: @panel-footer-padding;\n background-color: @panel-footer-bg;\n border-top: 1px solid @panel-inner-border;\n .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n > .list-group,\n > .panel-collapse > .list-group {\n margin-bottom: 0;\n\n .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n }\n\n // Add border top radius for first one\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n .border-top-radius((@panel-border-radius - 1));\n }\n }\n // Add border bottom radius for last one\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n .border-bottom-radius((@panel-border-radius - 1));\n }\n }\n }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n .list-group-item:first-child {\n border-top-width: 0;\n }\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n > .table,\n > .table-responsive > .table,\n > .panel-collapse > .table {\n margin-bottom: 0;\n\n caption {\n padding-left: @panel-body-padding;\n padding-right: @panel-body-padding;\n }\n }\n // Add border top radius for first one\n > .table:first-child,\n > .table-responsive:first-child > .table:first-child {\n .border-top-radius((@panel-border-radius - 1));\n\n > thead:first-child,\n > tbody:first-child {\n > tr:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n border-top-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-top-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n // Add border bottom radius for last one\n > .table:last-child,\n > .table-responsive:last-child > .table:last-child {\n .border-bottom-radius((@panel-border-radius - 1));\n\n > tbody:last-child,\n > tfoot:last-child {\n > tr:last-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n border-bottom-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-bottom-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n > .panel-body + .table,\n > .panel-body + .table-responsive,\n > .table + .panel-body,\n > .table-responsive + .panel-body {\n border-top: 1px solid @table-border-color;\n }\n > .table > tbody:first-child > tr:first-child th,\n > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n }\n > .table-bordered,\n > .table-responsive > .table-bordered {\n border: 0;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n > thead,\n > tbody {\n > tr:first-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n > tbody,\n > tfoot {\n > tr:last-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n }\n > .table-responsive {\n border: 0;\n margin-bottom: 0;\n }\n}\n\n\n// Collapsable panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n margin-bottom: @line-height-computed;\n\n // Tighten up margin so it's only between panels\n .panel {\n margin-bottom: 0;\n border-radius: @panel-border-radius;\n\n + .panel {\n margin-top: 5px;\n }\n }\n\n .panel-heading {\n border-bottom: 0;\n\n + .panel-collapse > .panel-body,\n + .panel-collapse > .list-group {\n border-top: 1px solid @panel-inner-border;\n }\n }\n\n .panel-footer {\n border-top: 0;\n + .panel-collapse .panel-body {\n border-bottom: 1px solid @panel-inner-border;\n }\n }\n}\n\n\n// Contextual variations\n.panel-default {\n .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n","// Panels\n\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n border-color: @border;\n\n & > .panel-heading {\n color: @heading-text-color;\n background-color: @heading-bg-color;\n border-color: @heading-border;\n\n + .panel-collapse > .panel-body {\n border-top-color: @border;\n }\n .badge {\n color: @heading-bg-color;\n background-color: @heading-text-color;\n }\n }\n & > .panel-footer {\n + .panel-collapse > .panel-body {\n border-bottom-color: @border;\n }\n }\n}\n","// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n\n .embed-responsive-item,\n iframe,\n embed,\n object,\n video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n }\n\n // Modifier class for 16:9 aspect ratio\n &.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n }\n\n // Modifier class for 4:3 aspect ratio\n &.embed-responsive-4by3 {\n padding-bottom: 75%;\n }\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: @well-bg;\n border: 1px solid @well-border;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0,0,0,.15);\n }\n}\n\n// Sizes\n.well-lg {\n padding: 24px;\n border-radius: @border-radius-large;\n}\n.well-sm {\n padding: 9px;\n border-radius: @border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: (@font-size-base * 1.5);\n font-weight: @close-font-weight;\n line-height: 1;\n color: @close-color;\n text-shadow: @close-text-shadow;\n .opacity(.2);\n\n &:hover,\n &:focus {\n color: @close-color;\n text-decoration: none;\n cursor: pointer;\n .opacity(.5);\n }\n\n // Additional properties for button version\n // iOS requires the button element instead of an anchor tag.\n // If you want the anchor version, it requires `href=\"#\"`.\n button& {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n }\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal;\n -webkit-overflow-scrolling: touch;\n\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n .translate(0, -25%);\n .transition-transform(~\"0.3s ease-out\");\n }\n &.in .modal-dialog { .translate(0, 0) }\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n background-color: @modal-content-bg;\n border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid @modal-content-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 3px 9px rgba(0,0,0,.5));\n background-clip: padding-box;\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n background-color: @modal-backdrop-bg;\n // Fade for backdrop\n &.fade { .opacity(0); }\n &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n padding: @modal-title-padding;\n border-bottom: 1px solid @modal-header-border-color;\n min-height: (@modal-title-padding + @modal-title-line-height);\n}\n// Close icon\n.modal-header .close {\n margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n margin: 0;\n line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n padding: @modal-inner-padding;\n text-align: right; // right align buttons\n border-top: 1px solid @modal-footer-border-color;\n &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n // Properly space out buttons\n .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n }\n // but override that for button groups\n .btn-group .btn + .btn {\n margin-left: -1px;\n }\n // and override it for block buttons as well\n .btn-block + .btn-block {\n margin-left: 0;\n }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n width: @modal-md;\n margin: 30px auto;\n }\n .modal-content {\n .box-shadow(0 5px 15px rgba(0,0,0,.5));\n }\n\n // Modal sizes\n .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n .modal-lg { width: @modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n z-index: @zindex-tooltip;\n display: block;\n visibility: visible;\n // Reset font and text propertes given new insertion method\n font-family: @font-family-base;\n font-size: @font-size-small;\n font-weight: normal;\n line-height: 1.4;\n .opacity(0);\n\n &.in { .opacity(@tooltip-opacity); }\n &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; }\n &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; }\n &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; }\n &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: @tooltip-max-width;\n padding: 3px 8px;\n color: @tooltip-color;\n text-align: center;\n text-decoration: none;\n background-color: @tooltip-bg;\n border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1\n.tooltip {\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n bottom: 0;\n right: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n left: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n border-right-color: @tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-left-color: @tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n right: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n left: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: @zindex-popover;\n display: none;\n max-width: @popover-max-width;\n padding: 1px;\n // Reset font and text propertes given new insertion method\n font-family: @font-family-base;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: @line-height-base;\n text-align: left;\n background-color: @popover-bg;\n background-clip: padding-box;\n border: 1px solid @popover-fallback-border-color;\n border: 1px solid @popover-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n // Overrides for proper insertion\n white-space: normal;\n\n // Offset the popover to account for the popover arrow\n &.top { margin-top: -@popover-arrow-width; }\n &.right { margin-left: @popover-arrow-width; }\n &.bottom { margin-top: @popover-arrow-width; }\n &.left { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n margin: 0; // reset heading margin\n padding: 8px 14px;\n font-size: @font-size-base;\n background-color: @popover-title-bg;\n border-bottom: 1px solid darken(@popover-title-bg, 5%);\n border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n &,\n &:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n }\n}\n.popover > .arrow {\n border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n border-width: @popover-arrow-width;\n content: \"\";\n}\n\n.popover {\n &.top > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-top-color: @popover-arrow-outer-color;\n bottom: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n bottom: 1px;\n margin-left: -@popover-arrow-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-color;\n }\n }\n &.right > .arrow {\n top: 50%;\n left: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-right-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n left: 1px;\n bottom: -@popover-arrow-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-color;\n }\n }\n &.bottom > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-bottom-color: @popover-arrow-outer-color;\n top: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n top: 1px;\n margin-left: -@popover-arrow-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-color;\n }\n }\n\n &.left > .arrow {\n top: 50%;\n right: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-right-width: 0;\n border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-left-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: @popover-arrow-color;\n bottom: -@popover-arrow-width;\n }\n }\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n\n > .item {\n display: none;\n position: relative;\n .transition(.6s ease-in-out left);\n\n // Account for jankitude on images\n > img,\n > a > img {\n &:extend(.img-responsive);\n line-height: 1;\n }\n\n // WebKit CSS3 transforms for supported devices\n @media all and (transform-3d), (-webkit-transform-3d) {\n transition: transform .6s ease-in-out;\n backface-visibility: hidden;\n perspective: 1000;\n\n &.next,\n &.active.right {\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n &.prev,\n &.active.left {\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n &.next.left,\n &.prev.right,\n &.active {\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n }\n }\n\n > .active,\n > .next,\n > .prev {\n display: block;\n }\n\n > .active {\n left: 0;\n }\n\n > .next,\n > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n }\n\n > .next {\n left: 100%;\n }\n > .prev {\n left: -100%;\n }\n > .next.left,\n > .prev.right {\n left: 0;\n }\n\n > .active.left {\n left: -100%;\n }\n > .active.right {\n left: 100%;\n }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: @carousel-control-width;\n .opacity(@carousel-control-opacity);\n font-size: @carousel-control-font-size;\n color: @carousel-control-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n // We can't have this transition here because WebKit cancels the carousel\n // animation if you trip this while in the middle of another animation.\n\n // Set gradients for backgrounds\n &.left {\n #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n }\n &.right {\n left: auto;\n right: 0;\n #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n }\n\n // Hover/focus state\n &:hover,\n &:focus {\n outline: 0;\n color: @carousel-control-color;\n text-decoration: none;\n .opacity(.9);\n }\n\n // Toggles\n .icon-prev,\n .icon-next,\n .glyphicon-chevron-left,\n .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n z-index: 5;\n display: inline-block;\n }\n .icon-prev,\n .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n }\n .icon-next,\n .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n }\n .icon-prev,\n .icon-next {\n width: 20px;\n height: 20px;\n margin-top: -10px;\n font-family: serif;\n }\n\n\n .icon-prev {\n &:before {\n content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n }\n }\n .icon-next {\n &:before {\n content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n }\n }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n\n li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid @carousel-indicator-border-color;\n border-radius: 10px;\n cursor: pointer;\n\n // IE8-9 hack for event handling\n //\n // Internet Explorer 8-9 does not support clicks on elements without a set\n // `background-color`. We cannot use `filter` since that's not viewed as a\n // background color by the browser. Thus, a hack is needed.\n //\n // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n // set alpha transparency for the best results possible.\n background-color: #000 \\9; // IE8\n background-color: rgba(0,0,0,0); // IE9\n }\n .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: @carousel-indicator-active-bg;\n }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: @carousel-caption-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n & .btn {\n text-shadow: none; // No shadow for button elements in carousel-caption\n }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n // Scale up the controls a smidge\n .carousel-control {\n .glyphicon-chevron-left,\n .glyphicon-chevron-right,\n .icon-prev,\n .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -15px;\n font-size: 30px;\n }\n .glyphicon-chevron-left,\n .icon-prev {\n margin-left: -15px;\n }\n .glyphicon-chevron-right,\n .icon-next {\n margin-right: -15px;\n }\n }\n\n // Show and left align the captions\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n\n // Move up the indicators\n .carousel-indicators {\n bottom: 20px;\n }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n","// Center-align a block level element\n\n.center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n","// CSS image replacement\n//\n// Heads up! v3 launched with with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (will be removed in v4)\n.hide-text() {\n font: ~\"0/0\" a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n// New mixin to use as of v3.0.1\n.text-hide() {\n .hide-text();\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n width: device-width;\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n .responsive-invisibility();\n}\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n\n.visible-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-visibility();\n }\n}\n.visible-xs-block {\n @media (max-width: @screen-xs-max) {\n display: block !important;\n }\n}\n.visible-xs-inline {\n @media (max-width: @screen-xs-max) {\n display: inline !important;\n }\n}\n.visible-xs-inline-block {\n @media (max-width: @screen-xs-max) {\n display: inline-block !important;\n }\n}\n\n.visible-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-visibility();\n }\n}\n.visible-sm-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: block !important;\n }\n}\n.visible-sm-inline {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline !important;\n }\n}\n.visible-sm-inline-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline-block !important;\n }\n}\n\n.visible-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-visibility();\n }\n}\n.visible-md-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: block !important;\n }\n}\n.visible-md-inline {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline !important;\n }\n}\n.visible-md-inline-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline-block !important;\n }\n}\n\n.visible-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-visibility();\n }\n}\n.visible-lg-block {\n @media (min-width: @screen-lg-min) {\n display: block !important;\n }\n}\n.visible-lg-inline {\n @media (min-width: @screen-lg-min) {\n display: inline !important;\n }\n}\n.visible-lg-inline-block {\n @media (min-width: @screen-lg-min) {\n display: inline-block !important;\n }\n}\n\n.hidden-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-invisibility();\n }\n}\n.hidden-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-invisibility();\n }\n}\n.hidden-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-invisibility();\n }\n}\n.hidden-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-invisibility();\n }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n.visible-print {\n .responsive-invisibility();\n\n @media print {\n .responsive-visibility();\n }\n}\n.visible-print-block {\n display: none !important;\n\n @media print {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n\n @media print {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n\n @media print {\n display: inline-block !important;\n }\n}\n\n.hidden-print {\n @media print {\n .responsive-invisibility();\n }\n}\n","// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n display: block !important;\n table& { display: table; }\n tr& { display: table-row !important; }\n th&,\n td& { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n display: none !important;\n}\n"]}
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/bootstrap-3.3.1/css/bootstrap.min.css b/examples/Sample App/DMS Sample App/bin/Web App/portal/bootstrap-3.3.1/css/bootstrap.min.css
new file mode 100755
index 0000000..b6fe4e0
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/bin/Web App/portal/bootstrap-3.3.1/css/bootstrap.min.css
@@ -0,0 +1,5 @@
+/*!
+ * Bootstrap v3.3.1 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ *//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:before,:after{color:#000!important;text-shadow:none!important;background:transparent!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:hover,a:focus{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=radio],input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;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 ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px}input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{position:absolute;margin-top:4px \9;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],input[type=radio].disabled,input[type=checkbox].disabled,fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm,.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm,select.form-group-sm .form-control{height:30px;line-height:30px}textarea.input-sm,textarea.form-group-sm .form-control,select[multiple].input-sm,select[multiple].form-group-sm .form-control{height:auto}.input-lg,.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg,select.form-group-lg .form-control{height:46px;line-height:46px}textarea.input-lg,textarea.form-group-lg .form-control,select[multiple].input-lg,select[multiple].form-group-lg .form-control{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;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;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default.focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary:hover,.btn-primary:focus,.btn-primary.focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success.focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info.focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning.focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger.focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none;visibility:hidden}.collapse.in{display:block;visibility:visible}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;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:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=radio],[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=radio],.input-group-addon input[type=checkbox]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none;visibility:hidden}.tab-content>.active{display:block;visibility:visible}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important;visibility:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px 15px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding:48px 0}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-right:auto;margin-left:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-right:15px;padding-left:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;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)}.modal-backdrop{position:absolute;top:0;right:0;left:0;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:1.4;visibility:visible;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:1.42857143;text-align:left;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;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)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;perspective:1000}.carousel-inner>.item.next,.carousel-inner>.item.active.right{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{display:table;content:" "}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/bootstrap-3.3.1/fonts/glyphicons-halflings-regular.eot b/examples/Sample App/DMS Sample App/bin/Web App/portal/bootstrap-3.3.1/fonts/glyphicons-halflings-regular.eot
new file mode 100755
index 0000000..4a4ca86
Binary files /dev/null and b/examples/Sample App/DMS Sample App/bin/Web App/portal/bootstrap-3.3.1/fonts/glyphicons-halflings-regular.eot differ
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/bootstrap-3.3.1/fonts/glyphicons-halflings-regular.svg b/examples/Sample App/DMS Sample App/bin/Web App/portal/bootstrap-3.3.1/fonts/glyphicons-halflings-regular.svg
new file mode 100755
index 0000000..25691af
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/bin/Web App/portal/bootstrap-3.3.1/fonts/glyphicons-halflings-regular.svg
@@ -0,0 +1,229 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/bootstrap-3.3.1/fonts/glyphicons-halflings-regular.ttf b/examples/Sample App/DMS Sample App/bin/Web App/portal/bootstrap-3.3.1/fonts/glyphicons-halflings-regular.ttf
new file mode 100755
index 0000000..67fa00b
Binary files /dev/null and b/examples/Sample App/DMS Sample App/bin/Web App/portal/bootstrap-3.3.1/fonts/glyphicons-halflings-regular.ttf differ
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/bootstrap-3.3.1/fonts/glyphicons-halflings-regular.woff b/examples/Sample App/DMS Sample App/bin/Web App/portal/bootstrap-3.3.1/fonts/glyphicons-halflings-regular.woff
new file mode 100755
index 0000000..8c54182
Binary files /dev/null and b/examples/Sample App/DMS Sample App/bin/Web App/portal/bootstrap-3.3.1/fonts/glyphicons-halflings-regular.woff differ
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/bootstrap-3.3.1/js/bootstrap.js b/examples/Sample App/DMS Sample App/bin/Web App/portal/bootstrap-3.3.1/js/bootstrap.js
new file mode 100755
index 0000000..b6ac8d9
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/bin/Web App/portal/bootstrap-3.3.1/js/bootstrap.js
@@ -0,0 +1,2320 @@
+/*!
+ * Bootstrap v3.3.1 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+if (typeof jQuery === 'undefined') {
+ throw new Error('Bootstrap\'s JavaScript requires jQuery')
+}
+
++function ($) {
+ var version = $.fn.jquery.split(' ')[0].split('.')
+ if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1)) {
+ throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher')
+ }
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: transition.js v3.3.1
+ * http://getbootstrap.com/javascript/#transitions
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
+ // ============================================================
+
+ function transitionEnd() {
+ var el = document.createElement('bootstrap')
+
+ var transEndEventNames = {
+ WebkitTransition : 'webkitTransitionEnd',
+ MozTransition : 'transitionend',
+ OTransition : 'oTransitionEnd otransitionend',
+ transition : 'transitionend'
+ }
+
+ for (var name in transEndEventNames) {
+ if (el.style[name] !== undefined) {
+ return { end: transEndEventNames[name] }
+ }
+ }
+
+ return false // explicit for ie8 ( ._.)
+ }
+
+ // http://blog.alexmaccaw.com/css-transitions
+ $.fn.emulateTransitionEnd = function (duration) {
+ var called = false
+ var $el = this
+ $(this).one('bsTransitionEnd', function () { called = true })
+ var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
+ setTimeout(callback, duration)
+ return this
+ }
+
+ $(function () {
+ $.support.transition = transitionEnd()
+
+ if (!$.support.transition) return
+
+ $.event.special.bsTransitionEnd = {
+ bindType: $.support.transition.end,
+ delegateType: $.support.transition.end,
+ handle: function (e) {
+ if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
+ }
+ }
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: alert.js v3.3.1
+ * http://getbootstrap.com/javascript/#alerts
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // ALERT CLASS DEFINITION
+ // ======================
+
+ var dismiss = '[data-dismiss="alert"]'
+ var Alert = function (el) {
+ $(el).on('click', dismiss, this.close)
+ }
+
+ Alert.VERSION = '3.3.1'
+
+ Alert.TRANSITION_DURATION = 150
+
+ Alert.prototype.close = function (e) {
+ var $this = $(this)
+ var selector = $this.attr('data-target')
+
+ if (!selector) {
+ selector = $this.attr('href')
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+ }
+
+ var $parent = $(selector)
+
+ if (e) e.preventDefault()
+
+ if (!$parent.length) {
+ $parent = $this.closest('.alert')
+ }
+
+ $parent.trigger(e = $.Event('close.bs.alert'))
+
+ if (e.isDefaultPrevented()) return
+
+ $parent.removeClass('in')
+
+ function removeElement() {
+ // detach from parent, fire event then clean up data
+ $parent.detach().trigger('closed.bs.alert').remove()
+ }
+
+ $.support.transition && $parent.hasClass('fade') ?
+ $parent
+ .one('bsTransitionEnd', removeElement)
+ .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
+ removeElement()
+ }
+
+
+ // ALERT PLUGIN DEFINITION
+ // =======================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.alert')
+
+ if (!data) $this.data('bs.alert', (data = new Alert(this)))
+ if (typeof option == 'string') data[option].call($this)
+ })
+ }
+
+ var old = $.fn.alert
+
+ $.fn.alert = Plugin
+ $.fn.alert.Constructor = Alert
+
+
+ // ALERT NO CONFLICT
+ // =================
+
+ $.fn.alert.noConflict = function () {
+ $.fn.alert = old
+ return this
+ }
+
+
+ // ALERT DATA-API
+ // ==============
+
+ $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: button.js v3.3.1
+ * http://getbootstrap.com/javascript/#buttons
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // BUTTON PUBLIC CLASS DEFINITION
+ // ==============================
+
+ var Button = function (element, options) {
+ this.$element = $(element)
+ this.options = $.extend({}, Button.DEFAULTS, options)
+ this.isLoading = false
+ }
+
+ Button.VERSION = '3.3.1'
+
+ Button.DEFAULTS = {
+ loadingText: 'loading...'
+ }
+
+ Button.prototype.setState = function (state) {
+ var d = 'disabled'
+ var $el = this.$element
+ var val = $el.is('input') ? 'val' : 'html'
+ var data = $el.data()
+
+ state = state + 'Text'
+
+ if (data.resetText == null) $el.data('resetText', $el[val]())
+
+ // push to event loop to allow forms to submit
+ setTimeout($.proxy(function () {
+ $el[val](data[state] == null ? this.options[state] : data[state])
+
+ if (state == 'loadingText') {
+ this.isLoading = true
+ $el.addClass(d).attr(d, d)
+ } else if (this.isLoading) {
+ this.isLoading = false
+ $el.removeClass(d).removeAttr(d)
+ }
+ }, this), 0)
+ }
+
+ Button.prototype.toggle = function () {
+ var changed = true
+ var $parent = this.$element.closest('[data-toggle="buttons"]')
+
+ if ($parent.length) {
+ var $input = this.$element.find('input')
+ if ($input.prop('type') == 'radio') {
+ if ($input.prop('checked') && this.$element.hasClass('active')) changed = false
+ else $parent.find('.active').removeClass('active')
+ }
+ if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')
+ } else {
+ this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
+ }
+
+ if (changed) this.$element.toggleClass('active')
+ }
+
+
+ // BUTTON PLUGIN DEFINITION
+ // ========================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.button')
+ var options = typeof option == 'object' && option
+
+ if (!data) $this.data('bs.button', (data = new Button(this, options)))
+
+ if (option == 'toggle') data.toggle()
+ else if (option) data.setState(option)
+ })
+ }
+
+ var old = $.fn.button
+
+ $.fn.button = Plugin
+ $.fn.button.Constructor = Button
+
+
+ // BUTTON NO CONFLICT
+ // ==================
+
+ $.fn.button.noConflict = function () {
+ $.fn.button = old
+ return this
+ }
+
+
+ // BUTTON DATA-API
+ // ===============
+
+ $(document)
+ .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
+ var $btn = $(e.target)
+ if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
+ Plugin.call($btn, 'toggle')
+ e.preventDefault()
+ })
+ .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
+ $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: carousel.js v3.3.1
+ * http://getbootstrap.com/javascript/#carousel
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // CAROUSEL CLASS DEFINITION
+ // =========================
+
+ var Carousel = function (element, options) {
+ this.$element = $(element)
+ this.$indicators = this.$element.find('.carousel-indicators')
+ this.options = options
+ this.paused =
+ this.sliding =
+ this.interval =
+ this.$active =
+ this.$items = null
+
+ this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))
+
+ this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
+ .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
+ .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
+ }
+
+ Carousel.VERSION = '3.3.1'
+
+ Carousel.TRANSITION_DURATION = 600
+
+ Carousel.DEFAULTS = {
+ interval: 5000,
+ pause: 'hover',
+ wrap: true,
+ keyboard: true
+ }
+
+ Carousel.prototype.keydown = function (e) {
+ if (/input|textarea/i.test(e.target.tagName)) return
+ switch (e.which) {
+ case 37: this.prev(); break
+ case 39: this.next(); break
+ default: return
+ }
+
+ e.preventDefault()
+ }
+
+ Carousel.prototype.cycle = function (e) {
+ e || (this.paused = false)
+
+ this.interval && clearInterval(this.interval)
+
+ this.options.interval
+ && !this.paused
+ && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
+
+ return this
+ }
+
+ Carousel.prototype.getItemIndex = function (item) {
+ this.$items = item.parent().children('.item')
+ return this.$items.index(item || this.$active)
+ }
+
+ Carousel.prototype.getItemForDirection = function (direction, active) {
+ var delta = direction == 'prev' ? -1 : 1
+ var activeIndex = this.getItemIndex(active)
+ var itemIndex = (activeIndex + delta) % this.$items.length
+ return this.$items.eq(itemIndex)
+ }
+
+ Carousel.prototype.to = function (pos) {
+ var that = this
+ var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
+
+ if (pos > (this.$items.length - 1) || pos < 0) return
+
+ if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
+ if (activeIndex == pos) return this.pause().cycle()
+
+ return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
+ }
+
+ Carousel.prototype.pause = function (e) {
+ e || (this.paused = true)
+
+ if (this.$element.find('.next, .prev').length && $.support.transition) {
+ this.$element.trigger($.support.transition.end)
+ this.cycle(true)
+ }
+
+ this.interval = clearInterval(this.interval)
+
+ return this
+ }
+
+ Carousel.prototype.next = function () {
+ if (this.sliding) return
+ return this.slide('next')
+ }
+
+ Carousel.prototype.prev = function () {
+ if (this.sliding) return
+ return this.slide('prev')
+ }
+
+ Carousel.prototype.slide = function (type, next) {
+ var $active = this.$element.find('.item.active')
+ var $next = next || this.getItemForDirection(type, $active)
+ var isCycling = this.interval
+ var direction = type == 'next' ? 'left' : 'right'
+ var fallback = type == 'next' ? 'first' : 'last'
+ var that = this
+
+ if (!$next.length) {
+ if (!this.options.wrap) return
+ $next = this.$element.find('.item')[fallback]()
+ }
+
+ if ($next.hasClass('active')) return (this.sliding = false)
+
+ var relatedTarget = $next[0]
+ var slideEvent = $.Event('slide.bs.carousel', {
+ relatedTarget: relatedTarget,
+ direction: direction
+ })
+ this.$element.trigger(slideEvent)
+ if (slideEvent.isDefaultPrevented()) return
+
+ this.sliding = true
+
+ isCycling && this.pause()
+
+ if (this.$indicators.length) {
+ this.$indicators.find('.active').removeClass('active')
+ var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
+ $nextIndicator && $nextIndicator.addClass('active')
+ }
+
+ var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
+ if ($.support.transition && this.$element.hasClass('slide')) {
+ $next.addClass(type)
+ $next[0].offsetWidth // force reflow
+ $active.addClass(direction)
+ $next.addClass(direction)
+ $active
+ .one('bsTransitionEnd', function () {
+ $next.removeClass([type, direction].join(' ')).addClass('active')
+ $active.removeClass(['active', direction].join(' '))
+ that.sliding = false
+ setTimeout(function () {
+ that.$element.trigger(slidEvent)
+ }, 0)
+ })
+ .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
+ } else {
+ $active.removeClass('active')
+ $next.addClass('active')
+ this.sliding = false
+ this.$element.trigger(slidEvent)
+ }
+
+ isCycling && this.cycle()
+
+ return this
+ }
+
+
+ // CAROUSEL PLUGIN DEFINITION
+ // ==========================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.carousel')
+ var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
+ var action = typeof option == 'string' ? option : options.slide
+
+ if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
+ if (typeof option == 'number') data.to(option)
+ else if (action) data[action]()
+ else if (options.interval) data.pause().cycle()
+ })
+ }
+
+ var old = $.fn.carousel
+
+ $.fn.carousel = Plugin
+ $.fn.carousel.Constructor = Carousel
+
+
+ // CAROUSEL NO CONFLICT
+ // ====================
+
+ $.fn.carousel.noConflict = function () {
+ $.fn.carousel = old
+ return this
+ }
+
+
+ // CAROUSEL DATA-API
+ // =================
+
+ var clickHandler = function (e) {
+ var href
+ var $this = $(this)
+ var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
+ if (!$target.hasClass('carousel')) return
+ var options = $.extend({}, $target.data(), $this.data())
+ var slideIndex = $this.attr('data-slide-to')
+ if (slideIndex) options.interval = false
+
+ Plugin.call($target, options)
+
+ if (slideIndex) {
+ $target.data('bs.carousel').to(slideIndex)
+ }
+
+ e.preventDefault()
+ }
+
+ $(document)
+ .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
+ .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)
+
+ $(window).on('load', function () {
+ $('[data-ride="carousel"]').each(function () {
+ var $carousel = $(this)
+ Plugin.call($carousel, $carousel.data())
+ })
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: collapse.js v3.3.1
+ * http://getbootstrap.com/javascript/#collapse
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // COLLAPSE PUBLIC CLASS DEFINITION
+ // ================================
+
+ var Collapse = function (element, options) {
+ this.$element = $(element)
+ this.options = $.extend({}, Collapse.DEFAULTS, options)
+ this.$trigger = $(this.options.trigger).filter('[href="#' + element.id + '"], [data-target="#' + element.id + '"]')
+ this.transitioning = null
+
+ if (this.options.parent) {
+ this.$parent = this.getParent()
+ } else {
+ this.addAriaAndCollapsedClass(this.$element, this.$trigger)
+ }
+
+ if (this.options.toggle) this.toggle()
+ }
+
+ Collapse.VERSION = '3.3.1'
+
+ Collapse.TRANSITION_DURATION = 350
+
+ Collapse.DEFAULTS = {
+ toggle: true,
+ trigger: '[data-toggle="collapse"]'
+ }
+
+ Collapse.prototype.dimension = function () {
+ var hasWidth = this.$element.hasClass('width')
+ return hasWidth ? 'width' : 'height'
+ }
+
+ Collapse.prototype.show = function () {
+ if (this.transitioning || this.$element.hasClass('in')) return
+
+ var activesData
+ var actives = this.$parent && this.$parent.find('> .panel').children('.in, .collapsing')
+
+ if (actives && actives.length) {
+ activesData = actives.data('bs.collapse')
+ if (activesData && activesData.transitioning) return
+ }
+
+ var startEvent = $.Event('show.bs.collapse')
+ this.$element.trigger(startEvent)
+ if (startEvent.isDefaultPrevented()) return
+
+ if (actives && actives.length) {
+ Plugin.call(actives, 'hide')
+ activesData || actives.data('bs.collapse', null)
+ }
+
+ var dimension = this.dimension()
+
+ this.$element
+ .removeClass('collapse')
+ .addClass('collapsing')[dimension](0)
+ .attr('aria-expanded', true)
+
+ this.$trigger
+ .removeClass('collapsed')
+ .attr('aria-expanded', true)
+
+ this.transitioning = 1
+
+ var complete = function () {
+ this.$element
+ .removeClass('collapsing')
+ .addClass('collapse in')[dimension]('')
+ this.transitioning = 0
+ this.$element
+ .trigger('shown.bs.collapse')
+ }
+
+ if (!$.support.transition) return complete.call(this)
+
+ var scrollSize = $.camelCase(['scroll', dimension].join('-'))
+
+ this.$element
+ .one('bsTransitionEnd', $.proxy(complete, this))
+ .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
+ }
+
+ Collapse.prototype.hide = function () {
+ if (this.transitioning || !this.$element.hasClass('in')) return
+
+ var startEvent = $.Event('hide.bs.collapse')
+ this.$element.trigger(startEvent)
+ if (startEvent.isDefaultPrevented()) return
+
+ var dimension = this.dimension()
+
+ this.$element[dimension](this.$element[dimension]())[0].offsetHeight
+
+ this.$element
+ .addClass('collapsing')
+ .removeClass('collapse in')
+ .attr('aria-expanded', false)
+
+ this.$trigger
+ .addClass('collapsed')
+ .attr('aria-expanded', false)
+
+ this.transitioning = 1
+
+ var complete = function () {
+ this.transitioning = 0
+ this.$element
+ .removeClass('collapsing')
+ .addClass('collapse')
+ .trigger('hidden.bs.collapse')
+ }
+
+ if (!$.support.transition) return complete.call(this)
+
+ this.$element
+ [dimension](0)
+ .one('bsTransitionEnd', $.proxy(complete, this))
+ .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
+ }
+
+ Collapse.prototype.toggle = function () {
+ this[this.$element.hasClass('in') ? 'hide' : 'show']()
+ }
+
+ Collapse.prototype.getParent = function () {
+ return $(this.options.parent)
+ .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
+ .each($.proxy(function (i, element) {
+ var $element = $(element)
+ this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
+ }, this))
+ .end()
+ }
+
+ Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
+ var isOpen = $element.hasClass('in')
+
+ $element.attr('aria-expanded', isOpen)
+ $trigger
+ .toggleClass('collapsed', !isOpen)
+ .attr('aria-expanded', isOpen)
+ }
+
+ function getTargetFromTrigger($trigger) {
+ var href
+ var target = $trigger.attr('data-target')
+ || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
+
+ return $(target)
+ }
+
+
+ // COLLAPSE PLUGIN DEFINITION
+ // ==========================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.collapse')
+ var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
+
+ if (!data && options.toggle && option == 'show') options.toggle = false
+ if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ var old = $.fn.collapse
+
+ $.fn.collapse = Plugin
+ $.fn.collapse.Constructor = Collapse
+
+
+ // COLLAPSE NO CONFLICT
+ // ====================
+
+ $.fn.collapse.noConflict = function () {
+ $.fn.collapse = old
+ return this
+ }
+
+
+ // COLLAPSE DATA-API
+ // =================
+
+ $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
+ var $this = $(this)
+
+ if (!$this.attr('data-target')) e.preventDefault()
+
+ var $target = getTargetFromTrigger($this)
+ var data = $target.data('bs.collapse')
+ var option = data ? 'toggle' : $.extend({}, $this.data(), { trigger: this })
+
+ Plugin.call($target, option)
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: dropdown.js v3.3.1
+ * http://getbootstrap.com/javascript/#dropdowns
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // DROPDOWN CLASS DEFINITION
+ // =========================
+
+ var backdrop = '.dropdown-backdrop'
+ var toggle = '[data-toggle="dropdown"]'
+ var Dropdown = function (element) {
+ $(element).on('click.bs.dropdown', this.toggle)
+ }
+
+ Dropdown.VERSION = '3.3.1'
+
+ Dropdown.prototype.toggle = function (e) {
+ var $this = $(this)
+
+ if ($this.is('.disabled, :disabled')) return
+
+ var $parent = getParent($this)
+ var isActive = $parent.hasClass('open')
+
+ clearMenus()
+
+ if (!isActive) {
+ if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
+ // if mobile we use a backdrop because click events don't delegate
+ $('
').insertAfter($(this)).on('click', clearMenus)
+ }
+
+ var relatedTarget = { relatedTarget: this }
+ $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
+
+ if (e.isDefaultPrevented()) return
+
+ $this
+ .trigger('focus')
+ .attr('aria-expanded', 'true')
+
+ $parent
+ .toggleClass('open')
+ .trigger('shown.bs.dropdown', relatedTarget)
+ }
+
+ return false
+ }
+
+ Dropdown.prototype.keydown = function (e) {
+ if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return
+
+ var $this = $(this)
+
+ e.preventDefault()
+ e.stopPropagation()
+
+ if ($this.is('.disabled, :disabled')) return
+
+ var $parent = getParent($this)
+ var isActive = $parent.hasClass('open')
+
+ if ((!isActive && e.which != 27) || (isActive && e.which == 27)) {
+ if (e.which == 27) $parent.find(toggle).trigger('focus')
+ return $this.trigger('click')
+ }
+
+ var desc = ' li:not(.divider):visible a'
+ var $items = $parent.find('[role="menu"]' + desc + ', [role="listbox"]' + desc)
+
+ if (!$items.length) return
+
+ var index = $items.index(e.target)
+
+ if (e.which == 38 && index > 0) index-- // up
+ if (e.which == 40 && index < $items.length - 1) index++ // down
+ if (!~index) index = 0
+
+ $items.eq(index).trigger('focus')
+ }
+
+ function clearMenus(e) {
+ if (e && e.which === 3) return
+ $(backdrop).remove()
+ $(toggle).each(function () {
+ var $this = $(this)
+ var $parent = getParent($this)
+ var relatedTarget = { relatedTarget: this }
+
+ if (!$parent.hasClass('open')) return
+
+ $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
+
+ if (e.isDefaultPrevented()) return
+
+ $this.attr('aria-expanded', 'false')
+ $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
+ })
+ }
+
+ function getParent($this) {
+ var selector = $this.attr('data-target')
+
+ if (!selector) {
+ selector = $this.attr('href')
+ selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+ }
+
+ var $parent = selector && $(selector)
+
+ return $parent && $parent.length ? $parent : $this.parent()
+ }
+
+
+ // DROPDOWN PLUGIN DEFINITION
+ // ==========================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.dropdown')
+
+ if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
+ if (typeof option == 'string') data[option].call($this)
+ })
+ }
+
+ var old = $.fn.dropdown
+
+ $.fn.dropdown = Plugin
+ $.fn.dropdown.Constructor = Dropdown
+
+
+ // DROPDOWN NO CONFLICT
+ // ====================
+
+ $.fn.dropdown.noConflict = function () {
+ $.fn.dropdown = old
+ return this
+ }
+
+
+ // APPLY TO STANDARD DROPDOWN ELEMENTS
+ // ===================================
+
+ $(document)
+ .on('click.bs.dropdown.data-api', clearMenus)
+ .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
+ .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
+ .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
+ .on('keydown.bs.dropdown.data-api', '[role="menu"]', Dropdown.prototype.keydown)
+ .on('keydown.bs.dropdown.data-api', '[role="listbox"]', Dropdown.prototype.keydown)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: modal.js v3.3.1
+ * http://getbootstrap.com/javascript/#modals
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // MODAL CLASS DEFINITION
+ // ======================
+
+ var Modal = function (element, options) {
+ this.options = options
+ this.$body = $(document.body)
+ this.$element = $(element)
+ this.$backdrop =
+ this.isShown = null
+ this.scrollbarWidth = 0
+
+ if (this.options.remote) {
+ this.$element
+ .find('.modal-content')
+ .load(this.options.remote, $.proxy(function () {
+ this.$element.trigger('loaded.bs.modal')
+ }, this))
+ }
+ }
+
+ Modal.VERSION = '3.3.1'
+
+ Modal.TRANSITION_DURATION = 300
+ Modal.BACKDROP_TRANSITION_DURATION = 150
+
+ Modal.DEFAULTS = {
+ backdrop: true,
+ keyboard: true,
+ show: true
+ }
+
+ Modal.prototype.toggle = function (_relatedTarget) {
+ return this.isShown ? this.hide() : this.show(_relatedTarget)
+ }
+
+ Modal.prototype.show = function (_relatedTarget) {
+ var that = this
+ var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
+
+ this.$element.trigger(e)
+
+ if (this.isShown || e.isDefaultPrevented()) return
+
+ this.isShown = true
+
+ this.checkScrollbar()
+ this.setScrollbar()
+ this.$body.addClass('modal-open')
+
+ this.escape()
+ this.resize()
+
+ this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
+
+ this.backdrop(function () {
+ var transition = $.support.transition && that.$element.hasClass('fade')
+
+ if (!that.$element.parent().length) {
+ that.$element.appendTo(that.$body) // don't move modals dom position
+ }
+
+ that.$element
+ .show()
+ .scrollTop(0)
+
+ if (that.options.backdrop) that.adjustBackdrop()
+ that.adjustDialog()
+
+ if (transition) {
+ that.$element[0].offsetWidth // force reflow
+ }
+
+ that.$element
+ .addClass('in')
+ .attr('aria-hidden', false)
+
+ that.enforceFocus()
+
+ var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
+
+ transition ?
+ that.$element.find('.modal-dialog') // wait for modal to slide in
+ .one('bsTransitionEnd', function () {
+ that.$element.trigger('focus').trigger(e)
+ })
+ .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
+ that.$element.trigger('focus').trigger(e)
+ })
+ }
+
+ Modal.prototype.hide = function (e) {
+ if (e) e.preventDefault()
+
+ e = $.Event('hide.bs.modal')
+
+ this.$element.trigger(e)
+
+ if (!this.isShown || e.isDefaultPrevented()) return
+
+ this.isShown = false
+
+ this.escape()
+ this.resize()
+
+ $(document).off('focusin.bs.modal')
+
+ this.$element
+ .removeClass('in')
+ .attr('aria-hidden', true)
+ .off('click.dismiss.bs.modal')
+
+ $.support.transition && this.$element.hasClass('fade') ?
+ this.$element
+ .one('bsTransitionEnd', $.proxy(this.hideModal, this))
+ .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
+ this.hideModal()
+ }
+
+ Modal.prototype.enforceFocus = function () {
+ $(document)
+ .off('focusin.bs.modal') // guard against infinite focus loop
+ .on('focusin.bs.modal', $.proxy(function (e) {
+ if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
+ this.$element.trigger('focus')
+ }
+ }, this))
+ }
+
+ Modal.prototype.escape = function () {
+ if (this.isShown && this.options.keyboard) {
+ this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
+ e.which == 27 && this.hide()
+ }, this))
+ } else if (!this.isShown) {
+ this.$element.off('keydown.dismiss.bs.modal')
+ }
+ }
+
+ Modal.prototype.resize = function () {
+ if (this.isShown) {
+ $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
+ } else {
+ $(window).off('resize.bs.modal')
+ }
+ }
+
+ Modal.prototype.hideModal = function () {
+ var that = this
+ this.$element.hide()
+ this.backdrop(function () {
+ that.$body.removeClass('modal-open')
+ that.resetAdjustments()
+ that.resetScrollbar()
+ that.$element.trigger('hidden.bs.modal')
+ })
+ }
+
+ Modal.prototype.removeBackdrop = function () {
+ this.$backdrop && this.$backdrop.remove()
+ this.$backdrop = null
+ }
+
+ Modal.prototype.backdrop = function (callback) {
+ var that = this
+ var animate = this.$element.hasClass('fade') ? 'fade' : ''
+
+ if (this.isShown && this.options.backdrop) {
+ var doAnimate = $.support.transition && animate
+
+ this.$backdrop = $('
')
+ .prependTo(this.$element)
+ .on('click.dismiss.bs.modal', $.proxy(function (e) {
+ if (e.target !== e.currentTarget) return
+ this.options.backdrop == 'static'
+ ? this.$element[0].focus.call(this.$element[0])
+ : this.hide.call(this)
+ }, this))
+
+ if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
+
+ this.$backdrop.addClass('in')
+
+ if (!callback) return
+
+ doAnimate ?
+ this.$backdrop
+ .one('bsTransitionEnd', callback)
+ .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
+ callback()
+
+ } else if (!this.isShown && this.$backdrop) {
+ this.$backdrop.removeClass('in')
+
+ var callbackRemove = function () {
+ that.removeBackdrop()
+ callback && callback()
+ }
+ $.support.transition && this.$element.hasClass('fade') ?
+ this.$backdrop
+ .one('bsTransitionEnd', callbackRemove)
+ .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
+ callbackRemove()
+
+ } else if (callback) {
+ callback()
+ }
+ }
+
+ // these following methods are used to handle overflowing modals
+
+ Modal.prototype.handleUpdate = function () {
+ if (this.options.backdrop) this.adjustBackdrop()
+ this.adjustDialog()
+ }
+
+ Modal.prototype.adjustBackdrop = function () {
+ this.$backdrop
+ .css('height', 0)
+ .css('height', this.$element[0].scrollHeight)
+ }
+
+ Modal.prototype.adjustDialog = function () {
+ var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
+
+ this.$element.css({
+ paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
+ paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
+ })
+ }
+
+ Modal.prototype.resetAdjustments = function () {
+ this.$element.css({
+ paddingLeft: '',
+ paddingRight: ''
+ })
+ }
+
+ Modal.prototype.checkScrollbar = function () {
+ this.bodyIsOverflowing = document.body.scrollHeight > document.documentElement.clientHeight
+ this.scrollbarWidth = this.measureScrollbar()
+ }
+
+ Modal.prototype.setScrollbar = function () {
+ var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
+ if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
+ }
+
+ Modal.prototype.resetScrollbar = function () {
+ this.$body.css('padding-right', '')
+ }
+
+ Modal.prototype.measureScrollbar = function () { // thx walsh
+ var scrollDiv = document.createElement('div')
+ scrollDiv.className = 'modal-scrollbar-measure'
+ this.$body.append(scrollDiv)
+ var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
+ this.$body[0].removeChild(scrollDiv)
+ return scrollbarWidth
+ }
+
+
+ // MODAL PLUGIN DEFINITION
+ // =======================
+
+ function Plugin(option, _relatedTarget) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.modal')
+ var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
+
+ if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
+ if (typeof option == 'string') data[option](_relatedTarget)
+ else if (options.show) data.show(_relatedTarget)
+ })
+ }
+
+ var old = $.fn.modal
+
+ $.fn.modal = Plugin
+ $.fn.modal.Constructor = Modal
+
+
+ // MODAL NO CONFLICT
+ // =================
+
+ $.fn.modal.noConflict = function () {
+ $.fn.modal = old
+ return this
+ }
+
+
+ // MODAL DATA-API
+ // ==============
+
+ $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
+ var $this = $(this)
+ var href = $this.attr('href')
+ var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
+ var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
+
+ if ($this.is('a')) e.preventDefault()
+
+ $target.one('show.bs.modal', function (showEvent) {
+ if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
+ $target.one('hidden.bs.modal', function () {
+ $this.is(':visible') && $this.trigger('focus')
+ })
+ })
+ Plugin.call($target, option, this)
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: tooltip.js v3.3.1
+ * http://getbootstrap.com/javascript/#tooltip
+ * Inspired by the original jQuery.tipsy by Jason Frame
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // TOOLTIP PUBLIC CLASS DEFINITION
+ // ===============================
+
+ var Tooltip = function (element, options) {
+ this.type =
+ this.options =
+ this.enabled =
+ this.timeout =
+ this.hoverState =
+ this.$element = null
+
+ this.init('tooltip', element, options)
+ }
+
+ Tooltip.VERSION = '3.3.1'
+
+ Tooltip.TRANSITION_DURATION = 150
+
+ Tooltip.DEFAULTS = {
+ animation: true,
+ placement: 'top',
+ selector: false,
+ template: '
',
+ trigger: 'hover focus',
+ title: '',
+ delay: 0,
+ html: false,
+ container: false,
+ viewport: {
+ selector: 'body',
+ padding: 0
+ }
+ }
+
+ Tooltip.prototype.init = function (type, element, options) {
+ this.enabled = true
+ this.type = type
+ this.$element = $(element)
+ this.options = this.getOptions(options)
+ this.$viewport = this.options.viewport && $(this.options.viewport.selector || this.options.viewport)
+
+ var triggers = this.options.trigger.split(' ')
+
+ for (var i = triggers.length; i--;) {
+ var trigger = triggers[i]
+
+ if (trigger == 'click') {
+ this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
+ } else if (trigger != 'manual') {
+ var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin'
+ var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
+
+ this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
+ this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
+ }
+ }
+
+ this.options.selector ?
+ (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
+ this.fixTitle()
+ }
+
+ Tooltip.prototype.getDefaults = function () {
+ return Tooltip.DEFAULTS
+ }
+
+ Tooltip.prototype.getOptions = function (options) {
+ options = $.extend({}, this.getDefaults(), this.$element.data(), options)
+
+ if (options.delay && typeof options.delay == 'number') {
+ options.delay = {
+ show: options.delay,
+ hide: options.delay
+ }
+ }
+
+ return options
+ }
+
+ Tooltip.prototype.getDelegateOptions = function () {
+ var options = {}
+ var defaults = this.getDefaults()
+
+ this._options && $.each(this._options, function (key, value) {
+ if (defaults[key] != value) options[key] = value
+ })
+
+ return options
+ }
+
+ Tooltip.prototype.enter = function (obj) {
+ var self = obj instanceof this.constructor ?
+ obj : $(obj.currentTarget).data('bs.' + this.type)
+
+ if (self && self.$tip && self.$tip.is(':visible')) {
+ self.hoverState = 'in'
+ return
+ }
+
+ if (!self) {
+ self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
+ $(obj.currentTarget).data('bs.' + this.type, self)
+ }
+
+ clearTimeout(self.timeout)
+
+ self.hoverState = 'in'
+
+ if (!self.options.delay || !self.options.delay.show) return self.show()
+
+ self.timeout = setTimeout(function () {
+ if (self.hoverState == 'in') self.show()
+ }, self.options.delay.show)
+ }
+
+ Tooltip.prototype.leave = function (obj) {
+ var self = obj instanceof this.constructor ?
+ obj : $(obj.currentTarget).data('bs.' + this.type)
+
+ if (!self) {
+ self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
+ $(obj.currentTarget).data('bs.' + this.type, self)
+ }
+
+ clearTimeout(self.timeout)
+
+ self.hoverState = 'out'
+
+ if (!self.options.delay || !self.options.delay.hide) return self.hide()
+
+ self.timeout = setTimeout(function () {
+ if (self.hoverState == 'out') self.hide()
+ }, self.options.delay.hide)
+ }
+
+ Tooltip.prototype.show = function () {
+ var e = $.Event('show.bs.' + this.type)
+
+ if (this.hasContent() && this.enabled) {
+ this.$element.trigger(e)
+
+ var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
+ if (e.isDefaultPrevented() || !inDom) return
+ var that = this
+
+ var $tip = this.tip()
+
+ var tipId = this.getUID(this.type)
+
+ this.setContent()
+ $tip.attr('id', tipId)
+ this.$element.attr('aria-describedby', tipId)
+
+ if (this.options.animation) $tip.addClass('fade')
+
+ var placement = typeof this.options.placement == 'function' ?
+ this.options.placement.call(this, $tip[0], this.$element[0]) :
+ this.options.placement
+
+ var autoToken = /\s?auto?\s?/i
+ var autoPlace = autoToken.test(placement)
+ if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
+
+ $tip
+ .detach()
+ .css({ top: 0, left: 0, display: 'block' })
+ .addClass(placement)
+ .data('bs.' + this.type, this)
+
+ this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
+
+ var pos = this.getPosition()
+ var actualWidth = $tip[0].offsetWidth
+ var actualHeight = $tip[0].offsetHeight
+
+ if (autoPlace) {
+ var orgPlacement = placement
+ var $container = this.options.container ? $(this.options.container) : this.$element.parent()
+ var containerDim = this.getPosition($container)
+
+ placement = placement == 'bottom' && pos.bottom + actualHeight > containerDim.bottom ? 'top' :
+ placement == 'top' && pos.top - actualHeight < containerDim.top ? 'bottom' :
+ placement == 'right' && pos.right + actualWidth > containerDim.width ? 'left' :
+ placement == 'left' && pos.left - actualWidth < containerDim.left ? 'right' :
+ placement
+
+ $tip
+ .removeClass(orgPlacement)
+ .addClass(placement)
+ }
+
+ var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
+
+ this.applyPlacement(calculatedOffset, placement)
+
+ var complete = function () {
+ var prevHoverState = that.hoverState
+ that.$element.trigger('shown.bs.' + that.type)
+ that.hoverState = null
+
+ if (prevHoverState == 'out') that.leave(that)
+ }
+
+ $.support.transition && this.$tip.hasClass('fade') ?
+ $tip
+ .one('bsTransitionEnd', complete)
+ .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
+ complete()
+ }
+ }
+
+ Tooltip.prototype.applyPlacement = function (offset, placement) {
+ var $tip = this.tip()
+ var width = $tip[0].offsetWidth
+ var height = $tip[0].offsetHeight
+
+ // manually read margins because getBoundingClientRect includes difference
+ var marginTop = parseInt($tip.css('margin-top'), 10)
+ var marginLeft = parseInt($tip.css('margin-left'), 10)
+
+ // we must check for NaN for ie 8/9
+ if (isNaN(marginTop)) marginTop = 0
+ if (isNaN(marginLeft)) marginLeft = 0
+
+ offset.top = offset.top + marginTop
+ offset.left = offset.left + marginLeft
+
+ // $.fn.offset doesn't round pixel values
+ // so we use setOffset directly with our own function B-0
+ $.offset.setOffset($tip[0], $.extend({
+ using: function (props) {
+ $tip.css({
+ top: Math.round(props.top),
+ left: Math.round(props.left)
+ })
+ }
+ }, offset), 0)
+
+ $tip.addClass('in')
+
+ // check to see if placing tip in new offset caused the tip to resize itself
+ var actualWidth = $tip[0].offsetWidth
+ var actualHeight = $tip[0].offsetHeight
+
+ if (placement == 'top' && actualHeight != height) {
+ offset.top = offset.top + height - actualHeight
+ }
+
+ var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
+
+ if (delta.left) offset.left += delta.left
+ else offset.top += delta.top
+
+ var isVertical = /top|bottom/.test(placement)
+ var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
+ var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'
+
+ $tip.offset(offset)
+ this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
+ }
+
+ Tooltip.prototype.replaceArrow = function (delta, dimension, isHorizontal) {
+ this.arrow()
+ .css(isHorizontal ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
+ .css(isHorizontal ? 'top' : 'left', '')
+ }
+
+ Tooltip.prototype.setContent = function () {
+ var $tip = this.tip()
+ var title = this.getTitle()
+
+ $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
+ $tip.removeClass('fade in top bottom left right')
+ }
+
+ Tooltip.prototype.hide = function (callback) {
+ var that = this
+ var $tip = this.tip()
+ var e = $.Event('hide.bs.' + this.type)
+
+ function complete() {
+ if (that.hoverState != 'in') $tip.detach()
+ that.$element
+ .removeAttr('aria-describedby')
+ .trigger('hidden.bs.' + that.type)
+ callback && callback()
+ }
+
+ this.$element.trigger(e)
+
+ if (e.isDefaultPrevented()) return
+
+ $tip.removeClass('in')
+
+ $.support.transition && this.$tip.hasClass('fade') ?
+ $tip
+ .one('bsTransitionEnd', complete)
+ .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
+ complete()
+
+ this.hoverState = null
+
+ return this
+ }
+
+ Tooltip.prototype.fixTitle = function () {
+ var $e = this.$element
+ if ($e.attr('title') || typeof ($e.attr('data-original-title')) != 'string') {
+ $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
+ }
+ }
+
+ Tooltip.prototype.hasContent = function () {
+ return this.getTitle()
+ }
+
+ Tooltip.prototype.getPosition = function ($element) {
+ $element = $element || this.$element
+
+ var el = $element[0]
+ var isBody = el.tagName == 'BODY'
+
+ var elRect = el.getBoundingClientRect()
+ if (elRect.width == null) {
+ // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
+ elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
+ }
+ var elOffset = isBody ? { top: 0, left: 0 } : $element.offset()
+ var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
+ var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
+
+ return $.extend({}, elRect, scroll, outerDims, elOffset)
+ }
+
+ Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
+ return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } :
+ placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
+ placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
+ /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
+
+ }
+
+ Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
+ var delta = { top: 0, left: 0 }
+ if (!this.$viewport) return delta
+
+ var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
+ var viewportDimensions = this.getPosition(this.$viewport)
+
+ if (/right|left/.test(placement)) {
+ var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll
+ var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
+ if (topEdgeOffset < viewportDimensions.top) { // top overflow
+ delta.top = viewportDimensions.top - topEdgeOffset
+ } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
+ delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
+ }
+ } else {
+ var leftEdgeOffset = pos.left - viewportPadding
+ var rightEdgeOffset = pos.left + viewportPadding + actualWidth
+ if (leftEdgeOffset < viewportDimensions.left) { // left overflow
+ delta.left = viewportDimensions.left - leftEdgeOffset
+ } else if (rightEdgeOffset > viewportDimensions.width) { // right overflow
+ delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
+ }
+ }
+
+ return delta
+ }
+
+ Tooltip.prototype.getTitle = function () {
+ var title
+ var $e = this.$element
+ var o = this.options
+
+ title = $e.attr('data-original-title')
+ || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
+
+ return title
+ }
+
+ Tooltip.prototype.getUID = function (prefix) {
+ do prefix += ~~(Math.random() * 1000000)
+ while (document.getElementById(prefix))
+ return prefix
+ }
+
+ Tooltip.prototype.tip = function () {
+ return (this.$tip = this.$tip || $(this.options.template))
+ }
+
+ Tooltip.prototype.arrow = function () {
+ return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
+ }
+
+ Tooltip.prototype.enable = function () {
+ this.enabled = true
+ }
+
+ Tooltip.prototype.disable = function () {
+ this.enabled = false
+ }
+
+ Tooltip.prototype.toggleEnabled = function () {
+ this.enabled = !this.enabled
+ }
+
+ Tooltip.prototype.toggle = function (e) {
+ var self = this
+ if (e) {
+ self = $(e.currentTarget).data('bs.' + this.type)
+ if (!self) {
+ self = new this.constructor(e.currentTarget, this.getDelegateOptions())
+ $(e.currentTarget).data('bs.' + this.type, self)
+ }
+ }
+
+ self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
+ }
+
+ Tooltip.prototype.destroy = function () {
+ var that = this
+ clearTimeout(this.timeout)
+ this.hide(function () {
+ that.$element.off('.' + that.type).removeData('bs.' + that.type)
+ })
+ }
+
+
+ // TOOLTIP PLUGIN DEFINITION
+ // =========================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.tooltip')
+ var options = typeof option == 'object' && option
+ var selector = options && options.selector
+
+ if (!data && option == 'destroy') return
+ if (selector) {
+ if (!data) $this.data('bs.tooltip', (data = {}))
+ if (!data[selector]) data[selector] = new Tooltip(this, options)
+ } else {
+ if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
+ }
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ var old = $.fn.tooltip
+
+ $.fn.tooltip = Plugin
+ $.fn.tooltip.Constructor = Tooltip
+
+
+ // TOOLTIP NO CONFLICT
+ // ===================
+
+ $.fn.tooltip.noConflict = function () {
+ $.fn.tooltip = old
+ return this
+ }
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: popover.js v3.3.1
+ * http://getbootstrap.com/javascript/#popovers
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // POPOVER PUBLIC CLASS DEFINITION
+ // ===============================
+
+ var Popover = function (element, options) {
+ this.init('popover', element, options)
+ }
+
+ if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
+
+ Popover.VERSION = '3.3.1'
+
+ Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
+ placement: 'right',
+ trigger: 'click',
+ content: '',
+ template: '
'
+ })
+
+
+ // NOTE: POPOVER EXTENDS tooltip.js
+ // ================================
+
+ Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
+
+ Popover.prototype.constructor = Popover
+
+ Popover.prototype.getDefaults = function () {
+ return Popover.DEFAULTS
+ }
+
+ Popover.prototype.setContent = function () {
+ var $tip = this.tip()
+ var title = this.getTitle()
+ var content = this.getContent()
+
+ $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
+ $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events
+ this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
+ ](content)
+
+ $tip.removeClass('fade top bottom left right in')
+
+ // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
+ // this manually by checking the contents.
+ if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
+ }
+
+ Popover.prototype.hasContent = function () {
+ return this.getTitle() || this.getContent()
+ }
+
+ Popover.prototype.getContent = function () {
+ var $e = this.$element
+ var o = this.options
+
+ return $e.attr('data-content')
+ || (typeof o.content == 'function' ?
+ o.content.call($e[0]) :
+ o.content)
+ }
+
+ Popover.prototype.arrow = function () {
+ return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
+ }
+
+ Popover.prototype.tip = function () {
+ if (!this.$tip) this.$tip = $(this.options.template)
+ return this.$tip
+ }
+
+
+ // POPOVER PLUGIN DEFINITION
+ // =========================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.popover')
+ var options = typeof option == 'object' && option
+ var selector = options && options.selector
+
+ if (!data && option == 'destroy') return
+ if (selector) {
+ if (!data) $this.data('bs.popover', (data = {}))
+ if (!data[selector]) data[selector] = new Popover(this, options)
+ } else {
+ if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
+ }
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ var old = $.fn.popover
+
+ $.fn.popover = Plugin
+ $.fn.popover.Constructor = Popover
+
+
+ // POPOVER NO CONFLICT
+ // ===================
+
+ $.fn.popover.noConflict = function () {
+ $.fn.popover = old
+ return this
+ }
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: scrollspy.js v3.3.1
+ * http://getbootstrap.com/javascript/#scrollspy
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // SCROLLSPY CLASS DEFINITION
+ // ==========================
+
+ function ScrollSpy(element, options) {
+ var process = $.proxy(this.process, this)
+
+ this.$body = $('body')
+ this.$scrollElement = $(element).is('body') ? $(window) : $(element)
+ this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
+ this.selector = (this.options.target || '') + ' .nav li > a'
+ this.offsets = []
+ this.targets = []
+ this.activeTarget = null
+ this.scrollHeight = 0
+
+ this.$scrollElement.on('scroll.bs.scrollspy', process)
+ this.refresh()
+ this.process()
+ }
+
+ ScrollSpy.VERSION = '3.3.1'
+
+ ScrollSpy.DEFAULTS = {
+ offset: 10
+ }
+
+ ScrollSpy.prototype.getScrollHeight = function () {
+ return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
+ }
+
+ ScrollSpy.prototype.refresh = function () {
+ var offsetMethod = 'offset'
+ var offsetBase = 0
+
+ if (!$.isWindow(this.$scrollElement[0])) {
+ offsetMethod = 'position'
+ offsetBase = this.$scrollElement.scrollTop()
+ }
+
+ this.offsets = []
+ this.targets = []
+ this.scrollHeight = this.getScrollHeight()
+
+ var self = this
+
+ this.$body
+ .find(this.selector)
+ .map(function () {
+ var $el = $(this)
+ var href = $el.data('target') || $el.attr('href')
+ var $href = /^#./.test(href) && $(href)
+
+ return ($href
+ && $href.length
+ && $href.is(':visible')
+ && [[$href[offsetMethod]().top + offsetBase, href]]) || null
+ })
+ .sort(function (a, b) { return a[0] - b[0] })
+ .each(function () {
+ self.offsets.push(this[0])
+ self.targets.push(this[1])
+ })
+ }
+
+ ScrollSpy.prototype.process = function () {
+ var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
+ var scrollHeight = this.getScrollHeight()
+ var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height()
+ var offsets = this.offsets
+ var targets = this.targets
+ var activeTarget = this.activeTarget
+ var i
+
+ if (this.scrollHeight != scrollHeight) {
+ this.refresh()
+ }
+
+ if (scrollTop >= maxScroll) {
+ return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
+ }
+
+ if (activeTarget && scrollTop < offsets[0]) {
+ this.activeTarget = null
+ return this.clear()
+ }
+
+ for (i = offsets.length; i--;) {
+ activeTarget != targets[i]
+ && scrollTop >= offsets[i]
+ && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
+ && this.activate(targets[i])
+ }
+ }
+
+ ScrollSpy.prototype.activate = function (target) {
+ this.activeTarget = target
+
+ this.clear()
+
+ var selector = this.selector +
+ '[data-target="' + target + '"],' +
+ this.selector + '[href="' + target + '"]'
+
+ var active = $(selector)
+ .parents('li')
+ .addClass('active')
+
+ if (active.parent('.dropdown-menu').length) {
+ active = active
+ .closest('li.dropdown')
+ .addClass('active')
+ }
+
+ active.trigger('activate.bs.scrollspy')
+ }
+
+ ScrollSpy.prototype.clear = function () {
+ $(this.selector)
+ .parentsUntil(this.options.target, '.active')
+ .removeClass('active')
+ }
+
+
+ // SCROLLSPY PLUGIN DEFINITION
+ // ===========================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.scrollspy')
+ var options = typeof option == 'object' && option
+
+ if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ var old = $.fn.scrollspy
+
+ $.fn.scrollspy = Plugin
+ $.fn.scrollspy.Constructor = ScrollSpy
+
+
+ // SCROLLSPY NO CONFLICT
+ // =====================
+
+ $.fn.scrollspy.noConflict = function () {
+ $.fn.scrollspy = old
+ return this
+ }
+
+
+ // SCROLLSPY DATA-API
+ // ==================
+
+ $(window).on('load.bs.scrollspy.data-api', function () {
+ $('[data-spy="scroll"]').each(function () {
+ var $spy = $(this)
+ Plugin.call($spy, $spy.data())
+ })
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: tab.js v3.3.1
+ * http://getbootstrap.com/javascript/#tabs
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // TAB CLASS DEFINITION
+ // ====================
+
+ var Tab = function (element) {
+ this.element = $(element)
+ }
+
+ Tab.VERSION = '3.3.1'
+
+ Tab.TRANSITION_DURATION = 150
+
+ Tab.prototype.show = function () {
+ var $this = this.element
+ var $ul = $this.closest('ul:not(.dropdown-menu)')
+ var selector = $this.data('target')
+
+ if (!selector) {
+ selector = $this.attr('href')
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+ }
+
+ if ($this.parent('li').hasClass('active')) return
+
+ var $previous = $ul.find('.active:last a')
+ var hideEvent = $.Event('hide.bs.tab', {
+ relatedTarget: $this[0]
+ })
+ var showEvent = $.Event('show.bs.tab', {
+ relatedTarget: $previous[0]
+ })
+
+ $previous.trigger(hideEvent)
+ $this.trigger(showEvent)
+
+ if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
+
+ var $target = $(selector)
+
+ this.activate($this.closest('li'), $ul)
+ this.activate($target, $target.parent(), function () {
+ $previous.trigger({
+ type: 'hidden.bs.tab',
+ relatedTarget: $this[0]
+ })
+ $this.trigger({
+ type: 'shown.bs.tab',
+ relatedTarget: $previous[0]
+ })
+ })
+ }
+
+ Tab.prototype.activate = function (element, container, callback) {
+ var $active = container.find('> .active')
+ var transition = callback
+ && $.support.transition
+ && (($active.length && $active.hasClass('fade')) || !!container.find('> .fade').length)
+
+ function next() {
+ $active
+ .removeClass('active')
+ .find('> .dropdown-menu > .active')
+ .removeClass('active')
+ .end()
+ .find('[data-toggle="tab"]')
+ .attr('aria-expanded', false)
+
+ element
+ .addClass('active')
+ .find('[data-toggle="tab"]')
+ .attr('aria-expanded', true)
+
+ if (transition) {
+ element[0].offsetWidth // reflow for transition
+ element.addClass('in')
+ } else {
+ element.removeClass('fade')
+ }
+
+ if (element.parent('.dropdown-menu')) {
+ element
+ .closest('li.dropdown')
+ .addClass('active')
+ .end()
+ .find('[data-toggle="tab"]')
+ .attr('aria-expanded', true)
+ }
+
+ callback && callback()
+ }
+
+ $active.length && transition ?
+ $active
+ .one('bsTransitionEnd', next)
+ .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
+ next()
+
+ $active.removeClass('in')
+ }
+
+
+ // TAB PLUGIN DEFINITION
+ // =====================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.tab')
+
+ if (!data) $this.data('bs.tab', (data = new Tab(this)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ var old = $.fn.tab
+
+ $.fn.tab = Plugin
+ $.fn.tab.Constructor = Tab
+
+
+ // TAB NO CONFLICT
+ // ===============
+
+ $.fn.tab.noConflict = function () {
+ $.fn.tab = old
+ return this
+ }
+
+
+ // TAB DATA-API
+ // ============
+
+ var clickHandler = function (e) {
+ e.preventDefault()
+ Plugin.call($(this), 'show')
+ }
+
+ $(document)
+ .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
+ .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: affix.js v3.3.1
+ * http://getbootstrap.com/javascript/#affix
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // AFFIX CLASS DEFINITION
+ // ======================
+
+ var Affix = function (element, options) {
+ this.options = $.extend({}, Affix.DEFAULTS, options)
+
+ this.$target = $(this.options.target)
+ .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
+ .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
+
+ this.$element = $(element)
+ this.affixed =
+ this.unpin =
+ this.pinnedOffset = null
+
+ this.checkPosition()
+ }
+
+ Affix.VERSION = '3.3.1'
+
+ Affix.RESET = 'affix affix-top affix-bottom'
+
+ Affix.DEFAULTS = {
+ offset: 0,
+ target: window
+ }
+
+ Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
+ var scrollTop = this.$target.scrollTop()
+ var position = this.$element.offset()
+ var targetHeight = this.$target.height()
+
+ if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false
+
+ if (this.affixed == 'bottom') {
+ if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
+ return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
+ }
+
+ var initializing = this.affixed == null
+ var colliderTop = initializing ? scrollTop : position.top
+ var colliderHeight = initializing ? targetHeight : height
+
+ if (offsetTop != null && colliderTop <= offsetTop) return 'top'
+ if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'
+
+ return false
+ }
+
+ Affix.prototype.getPinnedOffset = function () {
+ if (this.pinnedOffset) return this.pinnedOffset
+ this.$element.removeClass(Affix.RESET).addClass('affix')
+ var scrollTop = this.$target.scrollTop()
+ var position = this.$element.offset()
+ return (this.pinnedOffset = position.top - scrollTop)
+ }
+
+ Affix.prototype.checkPositionWithEventLoop = function () {
+ setTimeout($.proxy(this.checkPosition, this), 1)
+ }
+
+ Affix.prototype.checkPosition = function () {
+ if (!this.$element.is(':visible')) return
+
+ var height = this.$element.height()
+ var offset = this.options.offset
+ var offsetTop = offset.top
+ var offsetBottom = offset.bottom
+ var scrollHeight = $('body').height()
+
+ if (typeof offset != 'object') offsetBottom = offsetTop = offset
+ if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element)
+ if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
+
+ var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
+
+ if (this.affixed != affix) {
+ if (this.unpin != null) this.$element.css('top', '')
+
+ var affixType = 'affix' + (affix ? '-' + affix : '')
+ var e = $.Event(affixType + '.bs.affix')
+
+ this.$element.trigger(e)
+
+ if (e.isDefaultPrevented()) return
+
+ this.affixed = affix
+ this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
+
+ this.$element
+ .removeClass(Affix.RESET)
+ .addClass(affixType)
+ .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
+ }
+
+ if (affix == 'bottom') {
+ this.$element.offset({
+ top: scrollHeight - height - offsetBottom
+ })
+ }
+ }
+
+
+ // AFFIX PLUGIN DEFINITION
+ // =======================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.affix')
+ var options = typeof option == 'object' && option
+
+ if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ var old = $.fn.affix
+
+ $.fn.affix = Plugin
+ $.fn.affix.Constructor = Affix
+
+
+ // AFFIX NO CONFLICT
+ // =================
+
+ $.fn.affix.noConflict = function () {
+ $.fn.affix = old
+ return this
+ }
+
+
+ // AFFIX DATA-API
+ // ==============
+
+ $(window).on('load', function () {
+ $('[data-spy="affix"]').each(function () {
+ var $spy = $(this)
+ var data = $spy.data()
+
+ data.offset = data.offset || {}
+
+ if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
+ if (data.offsetTop != null) data.offset.top = data.offsetTop
+
+ Plugin.call($spy, data)
+ })
+ })
+
+}(jQuery);
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/bootstrap-3.3.1/js/bootstrap.min.js b/examples/Sample App/DMS Sample App/bin/Web App/portal/bootstrap-3.3.1/js/bootstrap.min.js
new file mode 100755
index 0000000..d839865
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/bin/Web App/portal/bootstrap-3.3.1/js/bootstrap.min.js
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v3.3.1 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.1",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.1",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active"));a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.1",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c="prev"==a?-1:1,d=this.getItemIndex(b),e=(d+c)%this.$items.length;return this.$items.eq(e)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i="next"==b?"first":"last",j=this;if(!f.length){if(!this.options.wrap)return;f=this.$element.find(".item")[i]()}if(f.hasClass("active"))return this.sliding=!1;var k=f[0],l=a.Event("slide.bs.carousel",{relatedTarget:k,direction:h});if(this.$element.trigger(l),!l.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var m=a(this.$indicators.children()[this.getItemIndex(f)]);m&&m.addClass("active")}var n=a.Event("slid.bs.carousel",{relatedTarget:k,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),j.sliding=!1,setTimeout(function(){j.$element.trigger(n)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(n)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&"show"==b&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a(this.options.trigger).filter('[href="#'+b.id+'"], [data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.1",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0,trigger:'[data-toggle="collapse"]'},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.find("> .panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":a.extend({},e.data(),{trigger:this});c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=c(d),f={relatedTarget:this};e.hasClass("open")&&(e.trigger(b=a.Event("hide.bs.dropdown",f)),b.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f)))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.1",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('
').insertAfter(a(this)).on("click",b);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(b){if(/(38|40|27|32)/.test(b.which)&&!/input|textarea/i.test(b.target.tagName)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var e=c(d),g=e.hasClass("open");if(!g&&27!=b.which||g&&27==b.which)return 27==b.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.divider):visible a",i=e.find('[role="menu"]'+h+', [role="listbox"]'+h);if(i.length){var j=i.index(b.target);38==b.which&&j>0&&j--,40==b.which&&j
').prependTo(this.$element).on("click.dismiss.bs.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.options.backdrop&&this.adjustBackdrop(),this.adjustDialog()},c.prototype.adjustBackdrop=function(){this.$backdrop.css("height",0).css("height",this.$element[0].scrollHeight)},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){this.bodyIsOverflowing=document.body.scrollHeight>document.documentElement.clientHeight,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right","")},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b,g=f&&f.selector;(e||"destroy"!=b)&&(g?(e||d.data("bs.tooltip",e={}),e[g]||(e[g]=new c(this,f))):e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};c.VERSION="3.3.1",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'
',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(this.options.viewport.selector||this.options.viewport);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c&&c.$tip&&c.$tip.is(":visible")?void(c.hoverState="in"):(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.options.container?a(this.options.container):this.$element.parent(),p=this.getPosition(o);h="bottom"==h&&k.bottom+m>p.bottom?"top":"top"==h&&k.top-m
p.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.width&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type)})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b,g=f&&f.selector;(e||"destroy"!=b)&&(g?(e||d.data("bs.popover",e={}),e[g]||(e[g]=new c(this,f))):e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.1",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},c.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){var e=a.proxy(this.process,this);this.$body=a("body"),this.$scrollElement=a(a(c).is("body")?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",e),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.1",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b="offset",c=0;a.isWindow(this.$scrollElement[0])||(b="position",c=this.$scrollElement.scrollTop()),this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight();var d=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[b]().top+c,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){d.offsets.push(this[0]),d.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.1",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})
+})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=this.unpin=this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.1",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=i?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=a("body").height();"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/bootstrap-3.3.1/js/npm.js b/examples/Sample App/DMS Sample App/bin/Web App/portal/bootstrap-3.3.1/js/npm.js
new file mode 100755
index 0000000..bf6aa80
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/bin/Web App/portal/bootstrap-3.3.1/js/npm.js
@@ -0,0 +1,13 @@
+// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment.
+require('../../js/transition.js')
+require('../../js/alert.js')
+require('../../js/button.js')
+require('../../js/carousel.js')
+require('../../js/collapse.js')
+require('../../js/dropdown.js')
+require('../../js/modal.js')
+require('../../js/tooltip.js')
+require('../../js/popover.js')
+require('../../js/scrollspy.js')
+require('../../js/tab.js')
+require('../../js/affix.js')
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/bootstrap-multiselect/0.9.15/css/bootstrap-multiselect.css b/examples/Sample App/DMS Sample App/bin/Web App/portal/bootstrap-multiselect/0.9.15/css/bootstrap-multiselect.css
new file mode 100755
index 0000000..6a6b68a
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/bin/Web App/portal/bootstrap-multiselect/0.9.15/css/bootstrap-multiselect.css
@@ -0,0 +1 @@
+span.multiselect-native-select{position:relative}span.multiselect-native-select select{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px -1px -1px -3px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important;left:50%;top:30px}.multiselect-container{position:absolute;list-style-type:none;margin:0;padding:0}.multiselect-container .input-group{margin:5px}.multiselect-container .multiselect-reset .input-group{width:93%}.multiselect-container>li{padding:0}.multiselect-container>li>a.multiselect-all label{font-weight:700}.multiselect-container>li.multiselect-group label{margin:0;padding:3px 20px;height:100%;font-weight:700}.multiselect-container>li.multiselect-group-clickable label{cursor:pointer}.multiselect-container>li>a{padding:0}.multiselect-container>li>a>label{margin:0;height:100%;cursor:pointer;font-weight:400;padding:3px 20px 3px 40px}.multiselect-container>li>a>label.checkbox,.multiselect-container>li>a>label.radio{margin:0}.multiselect-container>li>a>label>input[type=checkbox]{margin-bottom:5px}.btn-group>.btn-group:nth-child(2)>.multiselect.btn{border-top-left-radius:4px;border-bottom-left-radius:4px}.form-inline .multiselect-container label.checkbox,.form-inline .multiselect-container label.radio{padding:3px 20px 3px 40px}.form-inline .multiselect-container li a label.checkbox input[type=checkbox],.form-inline .multiselect-container li a label.radio input[type=radio]{margin-left:-20px;margin-right:0}
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/bootstrap-multiselect/0.9.15/js/bootstrap-multiselect.js b/examples/Sample App/DMS Sample App/bin/Web App/portal/bootstrap-multiselect/0.9.15/js/bootstrap-multiselect.js
new file mode 100755
index 0000000..f67fb09
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/bin/Web App/portal/bootstrap-multiselect/0.9.15/js/bootstrap-multiselect.js
@@ -0,0 +1,1776 @@
+/**
+ * Bootstrap Multiselect (http://davidstutz.de/bootstrap-multiselect/)
+ *
+ * Apache License, Version 2.0:
+ * Copyright (c) 2012 - 2018 David Stutz
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a
+ * copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ * BSD 3-Clause License:
+ * Copyright (c) 2012 - 2018 David Stutz
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * - Neither the name of David Stutz nor the names of its contributors may be
+ * used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+(function (root, factory) {
+ // check to see if 'knockout' AMD module is specified if using requirejs
+ if (typeof define === 'function' && define.amd &&
+ typeof require === 'function' && typeof require.specified === 'function' && require.specified('knockout')) {
+
+ // AMD. Register as an anonymous module.
+ define(['jquery', 'knockout'], factory);
+ } else {
+ // Browser globals
+ factory(root.jQuery, root.ko);
+ }
+})(this, function ($, ko) {
+ "use strict";// jshint ;_;
+
+ if (typeof ko !== 'undefined' && ko.bindingHandlers && !ko.bindingHandlers.multiselect) {
+ ko.bindingHandlers.multiselect = {
+ after: ['options', 'value', 'selectedOptions', 'enable', 'disable'],
+
+ init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
+ var $element = $(element);
+ var config = ko.toJS(valueAccessor());
+
+ $element.multiselect(config);
+
+ if (allBindings.has('options')) {
+ var options = allBindings.get('options');
+ if (ko.isObservable(options)) {
+ ko.computed({
+ read: function() {
+ options();
+ setTimeout(function() {
+ var ms = $element.data('multiselect');
+ if (ms)
+ ms.updateOriginalOptions();//Not sure how beneficial this is.
+ $element.multiselect('rebuild');
+ }, 1);
+ },
+ disposeWhenNodeIsRemoved: element
+ });
+ }
+ }
+
+ //value and selectedOptions are two-way, so these will be triggered even by our own actions.
+ //It needs some way to tell if they are triggered because of us or because of outside change.
+ //It doesn't loop but it's a waste of processing.
+ if (allBindings.has('value')) {
+ var value = allBindings.get('value');
+ if (ko.isObservable(value)) {
+ ko.computed({
+ read: function() {
+ value();
+ setTimeout(function() {
+ $element.multiselect('refresh');
+ }, 1);
+ },
+ disposeWhenNodeIsRemoved: element
+ }).extend({ rateLimit: 100, notifyWhenChangesStop: true });
+ }
+ }
+
+ //Switched from arrayChange subscription to general subscription using 'refresh'.
+ //Not sure performance is any better using 'select' and 'deselect'.
+ if (allBindings.has('selectedOptions')) {
+ var selectedOptions = allBindings.get('selectedOptions');
+ if (ko.isObservable(selectedOptions)) {
+ ko.computed({
+ read: function() {
+ selectedOptions();
+ setTimeout(function() {
+ $element.multiselect('refresh');
+ }, 1);
+ },
+ disposeWhenNodeIsRemoved: element
+ }).extend({ rateLimit: 100, notifyWhenChangesStop: true });
+ }
+ }
+
+ var setEnabled = function (enable) {
+ setTimeout(function () {
+ if (enable)
+ $element.multiselect('enable');
+ else
+ $element.multiselect('disable');
+ });
+ };
+
+ if (allBindings.has('enable')) {
+ var enable = allBindings.get('enable');
+ if (ko.isObservable(enable)) {
+ ko.computed({
+ read: function () {
+ setEnabled(enable());
+ },
+ disposeWhenNodeIsRemoved: element
+ }).extend({ rateLimit: 100, notifyWhenChangesStop: true });
+ } else {
+ setEnabled(enable);
+ }
+ }
+
+ if (allBindings.has('disable')) {
+ var disable = allBindings.get('disable');
+ if (ko.isObservable(disable)) {
+ ko.computed({
+ read: function () {
+ setEnabled(!disable());
+ },
+ disposeWhenNodeIsRemoved: element
+ }).extend({ rateLimit: 100, notifyWhenChangesStop: true });
+ } else {
+ setEnabled(!disable);
+ }
+ }
+
+ ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
+ $element.multiselect('destroy');
+ });
+ },
+
+ update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
+ var $element = $(element);
+ var config = ko.toJS(valueAccessor());
+
+ $element.multiselect('setOptions', config);
+ $element.multiselect('rebuild');
+ }
+ };
+ }
+
+ function forEach(array, callback) {
+ for (var index = 0; index < array.length; ++index) {
+ callback(array[index], index);
+ }
+ }
+
+ /**
+ * Constructor to create a new multiselect using the given select.
+ *
+ * @param {jQuery} select
+ * @param {Object} options
+ * @returns {Multiselect}
+ */
+ function Multiselect(select, options) {
+
+ this.$select = $(select);
+ this.options = this.mergeOptions($.extend({}, options, this.$select.data()));
+
+ // Placeholder via data attributes
+ if (this.$select.attr("data-placeholder")) {
+ this.options.nonSelectedText = this.$select.data("placeholder");
+ }
+
+ // Initialization.
+ // We have to clone to create a new reference.
+ this.originalOptions = this.$select.clone()[0].options;
+ this.query = '';
+ this.searchTimeout = null;
+ this.lastToggledInput = null;
+
+ this.options.multiple = this.$select.attr('multiple') === "multiple";
+ this.options.onChange = $.proxy(this.options.onChange, this);
+ this.options.onSelectAll = $.proxy(this.options.onSelectAll, this);
+ this.options.onDeselectAll = $.proxy(this.options.onDeselectAll, this);
+ this.options.onDropdownShow = $.proxy(this.options.onDropdownShow, this);
+ this.options.onDropdownHide = $.proxy(this.options.onDropdownHide, this);
+ this.options.onDropdownShown = $.proxy(this.options.onDropdownShown, this);
+ this.options.onDropdownHidden = $.proxy(this.options.onDropdownHidden, this);
+ this.options.onInitialized = $.proxy(this.options.onInitialized, this);
+ this.options.onFiltering = $.proxy(this.options.onFiltering, this);
+
+ // Build select all if enabled.
+ this.buildContainer();
+ this.buildButton();
+ this.buildDropdown();
+ this.buildReset();
+ this.buildSelectAll();
+ this.buildDropdownOptions();
+ this.buildFilter();
+
+ this.updateButtonText();
+ this.updateSelectAll(true);
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ this.updateOptGroups();
+ }
+
+ this.options.wasDisabled = this.$select.prop('disabled');
+ if (this.options.disableIfEmpty && $('option', this.$select).length <= 0) {
+ this.disable();
+ }
+
+ this.$select.wrap(' ').after(this.$container);
+ this.options.onInitialized(this.$select, this.$container);
+ }
+
+ Multiselect.prototype = {
+
+ defaults: {
+ /**
+ * Default text function will either print 'None selected' in case no
+ * option is selected or a list of the selected options up to a length
+ * of 3 selected options.
+ *
+ * @param {jQuery} options
+ * @param {jQuery} select
+ * @returns {String}
+ */
+ buttonText: function(options, select) {
+ if (this.disabledText.length > 0
+ && (select.prop('disabled') || (options.length == 0 && this.disableIfEmpty))) {
+
+ return this.disabledText;
+ }
+ else if (options.length === 0) {
+ return this.nonSelectedText;
+ }
+ else if (this.allSelectedText
+ && options.length === $('option', $(select)).length
+ && $('option', $(select)).length !== 1
+ && this.multiple) {
+
+ if (this.selectAllNumber) {
+ return this.allSelectedText + ' (' + options.length + ')';
+ }
+ else {
+ return this.allSelectedText;
+ }
+ }
+ else if (this.numberDisplayed != 0 && options.length > this.numberDisplayed) {
+ return options.length + ' ' + this.nSelectedText;
+ }
+ else {
+ var selected = '';
+ var delimiter = this.delimiterText;
+
+ options.each(function() {
+ var label = ($(this).attr('label') !== undefined) ? $(this).attr('label') : $(this).text();
+ selected += label + delimiter;
+ });
+
+ return selected.substr(0, selected.length - this.delimiterText.length);
+ }
+ },
+ /**
+ * Updates the title of the button similar to the buttonText function.
+ *
+ * @param {jQuery} options
+ * @param {jQuery} select
+ * @returns {@exp;selected@call;substr}
+ */
+ buttonTitle: function(options, select) {
+ if (options.length === 0) {
+ return this.nonSelectedText;
+ }
+ else {
+ var selected = '';
+ var delimiter = this.delimiterText;
+
+ options.each(function () {
+ var label = ($(this).attr('label') !== undefined) ? $(this).attr('label') : $(this).text();
+ selected += label + delimiter;
+ });
+ return selected.substr(0, selected.length - this.delimiterText.length);
+ }
+ },
+ checkboxName: function(option) {
+ return false; // no checkbox name
+ },
+ /**
+ * Create a label.
+ *
+ * @param {jQuery} element
+ * @returns {String}
+ */
+ optionLabel: function(element){
+ return $(element).attr('label') || $(element).text();
+ },
+ /**
+ * Create a class.
+ *
+ * @param {jQuery} element
+ * @returns {String}
+ */
+ optionClass: function(element) {
+ return $(element).attr('class') || '';
+ },
+ /**
+ * Triggered on change of the multiselect.
+ *
+ * Not triggered when selecting/deselecting options manually.
+ *
+ * @param {jQuery} option
+ * @param {Boolean} checked
+ */
+ onChange : function(option, checked) {
+
+ },
+ /**
+ * Triggered when the dropdown is shown.
+ *
+ * @param {jQuery} event
+ */
+ onDropdownShow: function(event) {
+
+ },
+ /**
+ * Triggered when the dropdown is hidden.
+ *
+ * @param {jQuery} event
+ */
+ onDropdownHide: function(event) {
+
+ },
+ /**
+ * Triggered after the dropdown is shown.
+ *
+ * @param {jQuery} event
+ */
+ onDropdownShown: function(event) {
+
+ },
+ /**
+ * Triggered after the dropdown is hidden.
+ *
+ * @param {jQuery} event
+ */
+ onDropdownHidden: function(event) {
+
+ },
+ /**
+ * Triggered on select all.
+ */
+ onSelectAll: function() {
+
+ },
+ /**
+ * Triggered on deselect all.
+ */
+ onDeselectAll: function() {
+
+ },
+ /**
+ * Triggered after initializing.
+ *
+ * @param {jQuery} $select
+ * @param {jQuery} $container
+ */
+ onInitialized: function($select, $container) {
+
+ },
+ /**
+ * Triggered on filtering.
+ *
+ * @param {jQuery} $filter
+ */
+ onFiltering: function($filter) {
+
+ },
+ enableHTML: false,
+ buttonClass: 'btn btn-default',
+ inheritClass: false,
+ buttonWidth: 'auto',
+ buttonContainer: '
',
+ dropRight: false,
+ dropUp: false,
+ selectedClass: 'active',
+ // Maximum height of the dropdown menu.
+ // If maximum height is exceeded a scrollbar will be displayed.
+ maxHeight: false,
+ includeSelectAllOption: false,
+ includeSelectAllIfMoreThan: 0,
+ selectAllText: ' Select all',
+ selectAllValue: 'multiselect-all',
+ selectAllName: false,
+ selectAllNumber: true,
+ selectAllJustVisible: true,
+ enableFiltering: false,
+ enableCaseInsensitiveFiltering: false,
+ enableFullValueFiltering: false,
+ enableClickableOptGroups: false,
+ enableCollapsibleOptGroups: false,
+ collapseOptGroupsByDefault: false,
+ filterPlaceholder: 'Search',
+ // possible options: 'text', 'value', 'both'
+ filterBehavior: 'text',
+ includeFilterClearBtn: true,
+ preventInputChangeEvent: false,
+ nonSelectedText: 'None selected',
+ nSelectedText: 'selected',
+ allSelectedText: 'All selected',
+ numberDisplayed: 3,
+ disableIfEmpty: false,
+ disabledText: '',
+ delimiterText: ', ',
+ includeResetOption: false,
+ includeResetDivider: false,
+ resetText: 'Reset',
+ templates: {
+ button: ' ',
+ ul: '',
+ filter: '
',
+ filterClearBtn: ' ',
+ li: ' ',
+ divider: ' ',
+ liGroup: ' ',
+ resetButton: ' '
+ }
+ },
+
+ constructor: Multiselect,
+
+ /**
+ * Builds the container of the multiselect.
+ */
+ buildContainer: function() {
+ this.$container = $(this.options.buttonContainer);
+ this.$container.on('show.bs.dropdown', this.options.onDropdownShow);
+ this.$container.on('hide.bs.dropdown', this.options.onDropdownHide);
+ this.$container.on('shown.bs.dropdown', this.options.onDropdownShown);
+ this.$container.on('hidden.bs.dropdown', this.options.onDropdownHidden);
+ },
+
+ /**
+ * Builds the button of the multiselect.
+ */
+ buildButton: function() {
+ this.$button = $(this.options.templates.button).addClass(this.options.buttonClass);
+ if (this.$select.attr('class') && this.options.inheritClass) {
+ this.$button.addClass(this.$select.attr('class'));
+ }
+ // Adopt active state.
+ if (this.$select.prop('disabled')) {
+ this.disable();
+ }
+ else {
+ this.enable();
+ }
+
+ // Manually add button width if set.
+ if (this.options.buttonWidth && this.options.buttonWidth !== 'auto') {
+ this.$button.css({
+ 'width' : '100%', //this.options.buttonWidth,
+ 'overflow' : 'hidden',
+ 'text-overflow' : 'ellipsis'
+ });
+ this.$container.css({
+ 'width': this.options.buttonWidth
+ });
+ }
+
+ // Keep the tab index from the select.
+ var tabindex = this.$select.attr('tabindex');
+ if (tabindex) {
+ this.$button.attr('tabindex', tabindex);
+ }
+
+ this.$container.prepend(this.$button);
+ },
+
+ /**
+ * Builds the ul representing the dropdown menu.
+ */
+ buildDropdown: function() {
+
+ // Build ul.
+ this.$ul = $(this.options.templates.ul);
+
+ if (this.options.dropRight) {
+ this.$ul.addClass('pull-right');
+ }
+
+ // Set max height of dropdown menu to activate auto scrollbar.
+ if (this.options.maxHeight) {
+ // TODO: Add a class for this option to move the css declarations.
+ this.$ul.css({
+ 'max-height': this.options.maxHeight + 'px',
+ 'overflow-y': 'auto',
+ 'overflow-x': 'hidden'
+ });
+ }
+
+ if (this.options.dropUp) {
+
+ var height = Math.min(this.options.maxHeight, $('option[data-role!="divider"]', this.$select).length*26 + $('option[data-role="divider"]', this.$select).length*19 + (this.options.includeSelectAllOption ? 26 : 0) + (this.options.enableFiltering || this.options.enableCaseInsensitiveFiltering ? 44 : 0));
+ var moveCalc = height + 34;
+
+ this.$ul.css({
+ 'max-height': height + 'px',
+ 'overflow-y': 'auto',
+ 'overflow-x': 'hidden',
+ 'margin-top': "-" + moveCalc + 'px'
+ });
+ }
+
+ this.$container.append(this.$ul);
+ },
+
+ /**
+ * Build the dropdown options and binds all necessary events.
+ *
+ * Uses createDivider and createOptionValue to create the necessary options.
+ */
+ buildDropdownOptions: function() {
+
+ this.$select.children().each($.proxy(function(index, element) {
+
+ var $element = $(element);
+ // Support optgroups and options without a group simultaneously.
+ var tag = $element.prop('tagName')
+ .toLowerCase();
+
+ if ($element.prop('value') === this.options.selectAllValue) {
+ return;
+ }
+
+ if (tag === 'optgroup') {
+ this.createOptgroup(element);
+ }
+ else if (tag === 'option') {
+
+ if ($element.data('role') === 'divider') {
+ this.createDivider();
+ }
+ else {
+ this.createOptionValue(element);
+ }
+
+ }
+
+ // Other illegal tags will be ignored.
+ }, this));
+
+ // Bind the change event on the dropdown elements.
+ $(this.$ul).off('change', 'li:not(.multiselect-group) input[type="checkbox"], li:not(.multiselect-group) input[type="radio"]');
+ $(this.$ul).on('change', 'li:not(.multiselect-group) input[type="checkbox"], li:not(.multiselect-group) input[type="radio"]', $.proxy(function(event) {
+ var $target = $(event.target);
+
+ var checked = $target.prop('checked') || false;
+ var isSelectAllOption = $target.val() === this.options.selectAllValue;
+
+ // Apply or unapply the configured selected class.
+ if (this.options.selectedClass) {
+ if (checked) {
+ $target.closest('li')
+ .addClass(this.options.selectedClass);
+ }
+ else {
+ $target.closest('li')
+ .removeClass(this.options.selectedClass);
+ }
+ }
+
+ // Get the corresponding option.
+ var value = $target.val();
+ var $option = this.getOptionByValue(value);
+
+ var $optionsNotThis = $('option', this.$select).not($option);
+ var $checkboxesNotThis = $('input', this.$container).not($target);
+
+ if (isSelectAllOption) {
+
+ if (checked) {
+ this.selectAll(this.options.selectAllJustVisible, true);
+ }
+ else {
+ this.deselectAll(this.options.selectAllJustVisible, true);
+ }
+ }
+ else {
+ if (checked) {
+ $option.prop('selected', true);
+
+ if (this.options.multiple) {
+ // Simply select additional option.
+ $option.prop('selected', true);
+ }
+ else {
+ // Unselect all other options and corresponding checkboxes.
+ if (this.options.selectedClass) {
+ $($checkboxesNotThis).closest('li').removeClass(this.options.selectedClass);
+ }
+
+ $($checkboxesNotThis).prop('checked', false);
+ $optionsNotThis.prop('selected', false);
+
+ // It's a single selection, so close.
+ this.$button.click();
+ }
+
+ if (this.options.selectedClass === "active") {
+ $optionsNotThis.closest("a").css("outline", "");
+ }
+ }
+ else {
+ // Unselect option.
+ $option.prop('selected', false);
+ }
+
+ // To prevent select all from firing onChange: #575
+ this.options.onChange($option, checked);
+
+ // Do not update select all or optgroups on select all change!
+ this.updateSelectAll();
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ this.updateOptGroups();
+ }
+ }
+
+ this.$select.change();
+ this.updateButtonText();
+
+ if(this.options.preventInputChangeEvent) {
+ return false;
+ }
+ }, this));
+
+ $('li a', this.$ul).on('mousedown', function(e) {
+ if (e.shiftKey) {
+ // Prevent selecting text by Shift+click
+ return false;
+ }
+ });
+
+ $(this.$ul).on('touchstart click', 'li a', $.proxy(function(event) {
+ event.stopPropagation();
+
+ var $target = $(event.target);
+
+ if (event.shiftKey && this.options.multiple) {
+ if($target.is("label")){ // Handles checkbox selection manually (see https://github.com/davidstutz/bootstrap-multiselect/issues/431)
+ event.preventDefault();
+ $target = $target.find("input");
+ $target.prop("checked", !$target.prop("checked"));
+ }
+ var checked = $target.prop('checked') || false;
+
+ if (this.lastToggledInput !== null && this.lastToggledInput !== $target) { // Make sure we actually have a range
+ var from = this.$ul.find("li:visible").index($target.parents("li"));
+ var to = this.$ul.find("li:visible").index(this.lastToggledInput.parents("li"));
+
+ if (from > to) { // Swap the indices
+ var tmp = to;
+ to = from;
+ from = tmp;
+ }
+
+ // Make sure we grab all elements since slice excludes the last index
+ ++to;
+
+ // Change the checkboxes and underlying options
+ var range = this.$ul.find("li").not(".multiselect-filter-hidden").slice(from, to).find("input");
+
+ range.prop('checked', checked);
+
+ if (this.options.selectedClass) {
+ range.closest('li')
+ .toggleClass(this.options.selectedClass, checked);
+ }
+
+ for (var i = 0, j = range.length; i < j; i++) {
+ var $checkbox = $(range[i]);
+
+ var $option = this.getOptionByValue($checkbox.val());
+
+ $option.prop('selected', checked);
+ }
+ }
+
+ // Trigger the select "change" event
+ $target.trigger("change");
+ }
+
+ // Remembers last clicked option
+ if($target.is("input") && !$target.closest("li").is(".multiselect-item")){
+ this.lastToggledInput = $target;
+ }
+
+ $target.blur();
+ }, this));
+
+ // Keyboard support.
+ this.$container.off('keydown.multiselect').on('keydown.multiselect', $.proxy(function(event) {
+ if ($('input[type="text"]', this.$container).is(':focus')) {
+ return;
+ }
+
+ if (event.keyCode === 9 && this.$container.hasClass('open')) {
+ this.$button.click();
+ }
+ else {
+ var $items = $(this.$container).find("li:not(.divider):not(.disabled) a").filter(":visible");
+
+ if (!$items.length) {
+ return;
+ }
+
+ var index = $items.index($items.filter(':focus'));
+
+ // Navigation up.
+ if (event.keyCode === 38 && index > 0) {
+ index--;
+ }
+ // Navigate down.
+ else if (event.keyCode === 40 && index < $items.length - 1) {
+ index++;
+ }
+ else if (!~index) {
+ index = 0;
+ }
+
+ var $current = $items.eq(index);
+ $current.focus();
+
+ if (event.keyCode === 32 || event.keyCode === 13) {
+ var $checkbox = $current.find('input');
+
+ $checkbox.prop("checked", !$checkbox.prop("checked"));
+ $checkbox.change();
+ }
+
+ event.stopPropagation();
+ event.preventDefault();
+ }
+ }, this));
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ $("li.multiselect-group input", this.$ul).on("change", $.proxy(function(event) {
+ event.stopPropagation();
+
+ var $target = $(event.target);
+ var checked = $target.prop('checked') || false;
+
+ var $li = $(event.target).closest('li');
+ var $group = $li.nextUntil("li.multiselect-group")
+ .not('.multiselect-filter-hidden')
+ .not('.disabled');
+
+ var $inputs = $group.find("input");
+
+ var values = [];
+ var $options = [];
+
+ if (this.options.selectedClass) {
+ if (checked) {
+ $li.addClass(this.options.selectedClass);
+ }
+ else {
+ $li.removeClass(this.options.selectedClass);
+ }
+ }
+
+ $.each($inputs, $.proxy(function(index, input) {
+ var value = $(input).val();
+ var $option = this.getOptionByValue(value);
+
+ if (checked) {
+ $(input).prop('checked', true);
+ $(input).closest('li')
+ .addClass(this.options.selectedClass);
+
+ $option.prop('selected', true);
+ }
+ else {
+ $(input).prop('checked', false);
+ $(input).closest('li')
+ .removeClass(this.options.selectedClass);
+
+ $option.prop('selected', false);
+ }
+
+ $options.push(this.getOptionByValue(value));
+ }, this))
+
+ // Cannot use select or deselect here because it would call updateOptGroups again.
+
+ this.options.onChange($options, checked);
+
+ this.$select.change();
+ this.updateButtonText();
+ this.updateSelectAll();
+ }, this));
+ }
+
+ if (this.options.enableCollapsibleOptGroups && this.options.multiple) {
+ $("li.multiselect-group .caret-container", this.$ul).on("click", $.proxy(function(event) {
+ var $li = $(event.target).closest('li');
+ var $inputs = $li.nextUntil("li.multiselect-group")
+ .not('.multiselect-filter-hidden');
+
+ var visible = true;
+ $inputs.each(function() {
+ visible = visible && !$(this).hasClass('multiselect-collapsible-hidden');
+ });
+
+ if (visible) {
+ $inputs.hide()
+ .addClass('multiselect-collapsible-hidden');
+ }
+ else {
+ $inputs.show()
+ .removeClass('multiselect-collapsible-hidden');
+ }
+ }, this));
+
+ $("li.multiselect-all", this.$ul).css('background', '#f3f3f3').css('border-bottom', '1px solid #eaeaea');
+ $("li.multiselect-all > a > label.checkbox", this.$ul).css('padding', '3px 20px 3px 35px');
+ $("li.multiselect-group > a > input", this.$ul).css('margin', '4px 0px 5px -20px');
+ }
+ },
+
+ /**
+ * Create an option using the given select option.
+ *
+ * @param {jQuery} element
+ */
+ createOptionValue: function(element) {
+ var $element = $(element);
+ if ($element.is(':selected')) {
+ $element.prop('selected', true);
+ }
+
+ // Support the label attribute on options.
+ var label = this.options.optionLabel(element);
+ var classes = this.options.optionClass(element);
+ var value = $element.val();
+ var inputType = this.options.multiple ? "checkbox" : "radio";
+
+ var $li = $(this.options.templates.li);
+ var $label = $('label', $li);
+ $label.addClass(inputType);
+ $label.attr("title", label);
+ $li.addClass(classes);
+
+ // Hide all children items when collapseOptGroupsByDefault is true
+ if (this.options.collapseOptGroupsByDefault && $(element).parent().prop("tagName").toLowerCase() === "optgroup") {
+ $li.addClass("multiselect-collapsible-hidden");
+ $li.hide();
+ }
+
+ if (this.options.enableHTML) {
+ $label.html(" " + label);
+ }
+ else {
+ $label.text(" " + label);
+ }
+
+ var $checkbox = $(' ').attr('type', inputType);
+
+ var name = this.options.checkboxName($element);
+ if (name) {
+ $checkbox.attr('name', name);
+ }
+
+ $label.prepend($checkbox);
+
+ var selected = $element.prop('selected') || false;
+ $checkbox.val(value);
+
+ if (value === this.options.selectAllValue) {
+ $li.addClass("multiselect-item multiselect-all");
+ $checkbox.parent().parent()
+ .addClass('multiselect-all');
+ }
+
+ $label.attr('title', $element.attr('title'));
+
+ this.$ul.append($li);
+
+ if ($element.is(':disabled')) {
+ $checkbox.attr('disabled', 'disabled')
+ .prop('disabled', true)
+ .closest('a')
+ .attr("tabindex", "-1")
+ .closest('li')
+ .addClass('disabled');
+ }
+
+ $checkbox.prop('checked', selected);
+
+ if (selected && this.options.selectedClass) {
+ $checkbox.closest('li')
+ .addClass(this.options.selectedClass);
+ }
+ },
+
+ /**
+ * Creates a divider using the given select option.
+ *
+ * @param {jQuery} element
+ */
+ createDivider: function(element) {
+ var $divider = $(this.options.templates.divider);
+ this.$ul.append($divider);
+ },
+
+ /**
+ * Creates an optgroup.
+ *
+ * @param {jQuery} group
+ */
+ createOptgroup: function(group) {
+ var label = $(group).attr("label");
+ var value = $(group).attr("value");
+ var $li = $(' ');
+
+ var classes = this.options.optionClass(group);
+ $li.addClass(classes);
+
+ if (this.options.enableHTML) {
+ $('label b', $li).html(" " + label);
+ }
+ else {
+ $('label b', $li).text(" " + label);
+ }
+
+ if (this.options.enableCollapsibleOptGroups && this.options.multiple) {
+ $('a', $li).append(' ');
+ }
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ $('a label', $li).prepend(' ');
+ }
+
+ if ($(group).is(':disabled')) {
+ $li.addClass('disabled');
+ }
+
+ this.$ul.append($li);
+
+ $("option", group).each($.proxy(function($, group) {
+ this.createOptionValue(group);
+ }, this))
+ },
+
+ /**
+ * Build the reset.
+ *
+ */
+ buildReset: function() {
+ if (this.options.includeResetOption) {
+
+ // Check whether to add a divider after the reset.
+ if (this.options.includeResetDivider) {
+ this.$ul.prepend($(this.options.templates.divider));
+ }
+
+ var $resetButton = $(this.options.templates.resetButton);
+
+ if (this.options.enableHTML) {
+ $('a', $resetButton).html(this.options.resetText);
+ }
+ else {
+ $('a', $resetButton).text(this.options.resetText);
+ }
+
+ $('a', $resetButton).click($.proxy(function(){
+ this.clearSelection();
+ }, this));
+
+ this.$ul.prepend($resetButton);
+ }
+ },
+
+ /**
+ * Build the select all.
+ *
+ * Checks if a select all has already been created.
+ */
+ buildSelectAll: function() {
+ if (typeof this.options.selectAllValue === 'number') {
+ this.options.selectAllValue = this.options.selectAllValue.toString();
+ }
+
+ var alreadyHasSelectAll = this.hasSelectAll();
+
+ if (!alreadyHasSelectAll && this.options.includeSelectAllOption && this.options.multiple
+ && $('option', this.$select).length > this.options.includeSelectAllIfMoreThan) {
+
+ // Check whether to add a divider after the select all.
+ if (this.options.includeSelectAllDivider) {
+ this.$ul.prepend($(this.options.templates.divider));
+ }
+
+ var $li = $(this.options.templates.li);
+ $('label', $li).addClass("checkbox");
+
+ if (this.options.enableHTML) {
+ $('label', $li).html(" " + this.options.selectAllText);
+ }
+ else {
+ $('label', $li).text(" " + this.options.selectAllText);
+ }
+
+ if (this.options.selectAllName) {
+ $('label', $li).prepend(' ');
+ }
+ else {
+ $('label', $li).prepend(' ');
+ }
+
+ var $checkbox = $('input', $li);
+ $checkbox.val(this.options.selectAllValue);
+
+ $li.addClass("multiselect-item multiselect-all");
+ $checkbox.parent().parent()
+ .addClass('multiselect-all');
+
+ this.$ul.prepend($li);
+
+ $checkbox.prop('checked', false);
+ }
+ },
+
+ /**
+ * Builds the filter.
+ */
+ buildFilter: function() {
+
+ // Build filter if filtering OR case insensitive filtering is enabled and the number of options exceeds (or equals) enableFilterLength.
+ if (this.options.enableFiltering || this.options.enableCaseInsensitiveFiltering) {
+ var enableFilterLength = Math.max(this.options.enableFiltering, this.options.enableCaseInsensitiveFiltering);
+
+ if (this.$select.find('option').length >= enableFilterLength) {
+
+ this.$filter = $(this.options.templates.filter);
+ $('input', this.$filter).attr('placeholder', this.options.filterPlaceholder);
+
+ // Adds optional filter clear button
+ if(this.options.includeFilterClearBtn) {
+ var clearBtn = $(this.options.templates.filterClearBtn);
+ clearBtn.on('click', $.proxy(function(event){
+ clearTimeout(this.searchTimeout);
+
+ this.query = '';
+ this.$filter.find('.multiselect-search').val('');
+ $('li', this.$ul).show().removeClass('multiselect-filter-hidden');
+
+ this.updateSelectAll();
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ this.updateOptGroups();
+ }
+
+ }, this));
+ this.$filter.find('.input-group').append(clearBtn);
+ }
+
+ this.$ul.prepend(this.$filter);
+
+ this.$filter.val(this.query).on('click', function(event) {
+ event.stopPropagation();
+ }).on('input keydown', $.proxy(function(event) {
+ // Cancel enter key default behaviour
+ if (event.which === 13) {
+ event.preventDefault();
+ }
+
+ // This is useful to catch "keydown" events after the browser has updated the control.
+ clearTimeout(this.searchTimeout);
+
+ this.searchTimeout = this.asyncFunction($.proxy(function() {
+
+ if (this.query !== event.target.value) {
+ this.query = event.target.value;
+
+ var currentGroup, currentGroupVisible;
+ $.each($('li', this.$ul), $.proxy(function(index, element) {
+ var value = $('input', element).length > 0 ? $('input', element).val() : "";
+ var text = $('label', element).text();
+
+ var filterCandidate = '';
+ if ((this.options.filterBehavior === 'text')) {
+ filterCandidate = text;
+ }
+ else if ((this.options.filterBehavior === 'value')) {
+ filterCandidate = value;
+ }
+ else if (this.options.filterBehavior === 'both') {
+ filterCandidate = text + '\n' + value;
+ }
+
+ if (value !== this.options.selectAllValue && text) {
+
+ // By default lets assume that element is not
+ // interesting for this search.
+ var showElement = false;
+
+ if (this.options.enableCaseInsensitiveFiltering) {
+ filterCandidate = filterCandidate.toLowerCase();
+ this.query = this.query.toLowerCase();
+ }
+
+ if (this.options.enableFullValueFiltering && this.options.filterBehavior !== 'both') {
+ var valueToMatch = filterCandidate.trim().substring(0, this.query.length);
+ if (this.query.indexOf(valueToMatch) > -1) {
+ showElement = true;
+ }
+ }
+ else if (filterCandidate.indexOf(this.query) > -1) {
+ showElement = true;
+ }
+
+ // Toggle current element (group or group item) according to showElement boolean.
+ if(!showElement){
+ $(element).css('display', 'none');
+ $(element).addClass('multiselect-filter-hidden');
+ }
+ if(showElement){
+ $(element).css('display', 'block');
+ $(element).removeClass('multiselect-filter-hidden');
+ }
+
+ // Differentiate groups and group items.
+ if ($(element).hasClass('multiselect-group')) {
+ // Remember group status.
+ currentGroup = element;
+ currentGroupVisible = showElement;
+ }
+ else {
+ // Show group name when at least one of its items is visible.
+ if (showElement) {
+ $(currentGroup).show()
+ .removeClass('multiselect-filter-hidden');
+ }
+
+ // Show all group items when group name satisfies filter.
+ if (!showElement && currentGroupVisible) {
+ $(element).show()
+ .removeClass('multiselect-filter-hidden');
+ }
+ }
+ }
+ }, this));
+ }
+
+ this.updateSelectAll();
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ this.updateOptGroups();
+ }
+
+ this.options.onFiltering(event.target);
+
+ }, this), 300, this);
+ }, this));
+ }
+ }
+ },
+
+ /**
+ * Unbinds the whole plugin.
+ */
+ destroy: function() {
+ this.$container.remove();
+ this.$select.show();
+
+ // reset original state
+ this.$select.prop('disabled', this.options.wasDisabled);
+
+ this.$select.data('multiselect', null);
+ },
+
+ /**
+ * Refreshs the multiselect based on the selected options of the select.
+ */
+ refresh: function () {
+ var inputs = {};
+ $('li input', this.$ul).each(function() {
+ inputs[$(this).val()] = $(this);
+ });
+
+ $('option', this.$select).each($.proxy(function (index, element) {
+ var $elem = $(element);
+ var $input = inputs[$(element).val()];
+
+ if ($elem.is(':selected')) {
+ $input.prop('checked', true);
+
+ if (this.options.selectedClass) {
+ $input.closest('li')
+ .addClass(this.options.selectedClass);
+ }
+ }
+ else {
+ $input.prop('checked', false);
+
+ if (this.options.selectedClass) {
+ $input.closest('li')
+ .removeClass(this.options.selectedClass);
+ }
+ }
+
+ if ($elem.is(":disabled")) {
+ $input.attr('disabled', 'disabled')
+ .prop('disabled', true)
+ .closest('li')
+ .addClass('disabled');
+ }
+ else {
+ $input.prop('disabled', false)
+ .closest('li')
+ .removeClass('disabled');
+ }
+ }, this));
+
+ this.updateButtonText();
+ this.updateSelectAll();
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ this.updateOptGroups();
+ }
+ },
+
+ /**
+ * Select all options of the given values.
+ *
+ * If triggerOnChange is set to true, the on change event is triggered if
+ * and only if one value is passed.
+ *
+ * @param {Array} selectValues
+ * @param {Boolean} triggerOnChange
+ */
+ select: function(selectValues, triggerOnChange) {
+ if(!$.isArray(selectValues)) {
+ selectValues = [selectValues];
+ }
+
+ for (var i = 0; i < selectValues.length; i++) {
+ var value = selectValues[i];
+
+ if (value === null || value === undefined) {
+ continue;
+ }
+
+ var $option = this.getOptionByValue(value);
+ var $checkbox = this.getInputByValue(value);
+
+ if($option === undefined || $checkbox === undefined) {
+ continue;
+ }
+
+ if (!this.options.multiple) {
+ this.deselectAll(false);
+ }
+
+ if (this.options.selectedClass) {
+ $checkbox.closest('li')
+ .addClass(this.options.selectedClass);
+ }
+
+ $checkbox.prop('checked', true);
+ $option.prop('selected', true);
+
+ if (triggerOnChange) {
+ this.options.onChange($option, true);
+ }
+ }
+
+ this.updateButtonText();
+ this.updateSelectAll();
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ this.updateOptGroups();
+ }
+ },
+
+ /**
+ * Clears all selected items.
+ */
+ clearSelection: function () {
+ this.deselectAll(false);
+ this.updateButtonText();
+ this.updateSelectAll();
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ this.updateOptGroups();
+ }
+ },
+
+ /**
+ * Deselects all options of the given values.
+ *
+ * If triggerOnChange is set to true, the on change event is triggered, if
+ * and only if one value is passed.
+ *
+ * @param {Array} deselectValues
+ * @param {Boolean} triggerOnChange
+ */
+ deselect: function(deselectValues, triggerOnChange) {
+ if(!$.isArray(deselectValues)) {
+ deselectValues = [deselectValues];
+ }
+
+ for (var i = 0; i < deselectValues.length; i++) {
+ var value = deselectValues[i];
+
+ if (value === null || value === undefined) {
+ continue;
+ }
+
+ var $option = this.getOptionByValue(value);
+ var $checkbox = this.getInputByValue(value);
+
+ if($option === undefined || $checkbox === undefined) {
+ continue;
+ }
+
+ if (this.options.selectedClass) {
+ $checkbox.closest('li')
+ .removeClass(this.options.selectedClass);
+ }
+
+ $checkbox.prop('checked', false);
+ $option.prop('selected', false);
+
+ if (triggerOnChange) {
+ this.options.onChange($option, false);
+ }
+ }
+
+ this.updateButtonText();
+ this.updateSelectAll();
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ this.updateOptGroups();
+ }
+ },
+
+ /**
+ * Selects all enabled & visible options.
+ *
+ * If justVisible is true or not specified, only visible options are selected.
+ *
+ * @param {Boolean} justVisible
+ * @param {Boolean} triggerOnSelectAll
+ */
+ selectAll: function (justVisible, triggerOnSelectAll) {
+
+ var justVisible = typeof justVisible === 'undefined' ? true : justVisible;
+ var allLis = $("li:not(.divider):not(.disabled):not(.multiselect-group)", this.$ul);
+ var visibleLis = $("li:not(.divider):not(.disabled):not(.multiselect-group):not(.multiselect-filter-hidden):not(.multiselect-collapisble-hidden)", this.$ul).filter(':visible');
+
+ if(justVisible) {
+ $('input:enabled' , visibleLis).prop('checked', true);
+ visibleLis.addClass(this.options.selectedClass);
+
+ $('input:enabled' , visibleLis).each($.proxy(function(index, element) {
+ var value = $(element).val();
+ var option = this.getOptionByValue(value);
+ $(option).prop('selected', true);
+ }, this));
+ }
+ else {
+ $('input:enabled' , allLis).prop('checked', true);
+ allLis.addClass(this.options.selectedClass);
+
+ $('input:enabled' , allLis).each($.proxy(function(index, element) {
+ var value = $(element).val();
+ var option = this.getOptionByValue(value);
+ $(option).prop('selected', true);
+ }, this));
+ }
+
+ $('li input[value="' + this.options.selectAllValue + '"]', this.$ul).prop('checked', true);
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ this.updateOptGroups();
+ }
+
+ if (triggerOnSelectAll) {
+ this.options.onSelectAll();
+ }
+ },
+
+ /**
+ * Deselects all options.
+ *
+ * If justVisible is true or not specified, only visible options are deselected.
+ *
+ * @param {Boolean} justVisible
+ */
+ deselectAll: function (justVisible, triggerOnDeselectAll) {
+
+ var justVisible = typeof justVisible === 'undefined' ? true : justVisible;
+ var allLis = $("li:not(.divider):not(.disabled):not(.multiselect-group)", this.$ul);
+ var visibleLis = $("li:not(.divider):not(.disabled):not(.multiselect-group):not(.multiselect-filter-hidden):not(.multiselect-collapisble-hidden)", this.$ul).filter(':visible');
+
+ if(justVisible) {
+ $('input[type="checkbox"]:enabled' , visibleLis).prop('checked', false);
+ visibleLis.removeClass(this.options.selectedClass);
+
+ $('input[type="checkbox"]:enabled' , visibleLis).each($.proxy(function(index, element) {
+ var value = $(element).val();
+ var option = this.getOptionByValue(value);
+ $(option).prop('selected', false);
+ }, this));
+ }
+ else {
+ $('input[type="checkbox"]:enabled' , allLis).prop('checked', false);
+ allLis.removeClass(this.options.selectedClass);
+
+ $('input[type="checkbox"]:enabled' , allLis).each($.proxy(function(index, element) {
+ var value = $(element).val();
+ var option = this.getOptionByValue(value);
+ $(option).prop('selected', false);
+ }, this));
+ }
+
+ $('li input[value="' + this.options.selectAllValue + '"]', this.$ul).prop('checked', false);
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ this.updateOptGroups();
+ }
+
+ if (triggerOnDeselectAll) {
+ this.options.onDeselectAll();
+ }
+ },
+
+ /**
+ * Rebuild the plugin.
+ *
+ * Rebuilds the dropdown, the filter and the select all option.
+ */
+ rebuild: function() {
+ this.$ul.html('');
+
+ // Important to distinguish between radios and checkboxes.
+ this.options.multiple = this.$select.attr('multiple') === "multiple";
+
+ this.buildSelectAll();
+ this.buildDropdownOptions();
+ this.buildFilter();
+
+ this.updateButtonText();
+ this.updateSelectAll(true);
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ this.updateOptGroups();
+ }
+
+ if (this.options.disableIfEmpty && $('option', this.$select).length <= 0) {
+ this.disable();
+ }
+ else {
+ this.enable();
+ }
+
+ if (this.options.dropRight) {
+ this.$ul.addClass('pull-right');
+ }
+ },
+
+ /**
+ * The provided data will be used to build the dropdown.
+ */
+ dataprovider: function(dataprovider) {
+
+ var groupCounter = 0;
+ var $select = this.$select.empty();
+
+ $.each(dataprovider, function (index, option) {
+ var $tag;
+
+ if ($.isArray(option.children)) { // create optiongroup tag
+ groupCounter++;
+
+ $tag = $(' ').attr({
+ label: option.label || 'Group ' + groupCounter,
+ disabled: !!option.disabled,
+ value: option.value
+ });
+
+ forEach(option.children, function(subOption) { // add children option tags
+ var attributes = {
+ value: subOption.value,
+ label: subOption.label || subOption.value,
+ title: subOption.title,
+ selected: !!subOption.selected,
+ disabled: !!subOption.disabled
+ };
+
+ //Loop through attributes object and add key-value for each attribute
+ for (var key in subOption.attributes) {
+ attributes['data-' + key] = subOption.attributes[key];
+ }
+ //Append original attributes + new data attributes to option
+ $tag.append($(' ').attr(attributes));
+ });
+ }
+ else {
+
+ var attributes = {
+ 'value': option.value,
+ 'label': option.label || option.value,
+ 'title': option.title,
+ 'class': option['class'],
+ 'selected': !!option['selected'],
+ 'disabled': !!option['disabled']
+ };
+ //Loop through attributes object and add key-value for each attribute
+ for (var key in option.attributes) {
+ attributes['data-' + key] = option.attributes[key];
+ }
+ //Append original attributes + new data attributes to option
+ $tag = $(' ').attr(attributes);
+
+ $tag.text(option.label || option.value);
+ }
+
+ $select.append($tag);
+ });
+
+ this.rebuild();
+ },
+
+ /**
+ * Enable the multiselect.
+ */
+ enable: function() {
+ this.$select.prop('disabled', false);
+ this.$button.prop('disabled', false)
+ .removeClass('disabled');
+ },
+
+ /**
+ * Disable the multiselect.
+ */
+ disable: function() {
+ this.$select.prop('disabled', true);
+ this.$button.prop('disabled', true)
+ .addClass('disabled');
+ },
+
+ /**
+ * Set the options.
+ *
+ * @param {Array} options
+ */
+ setOptions: function(options) {
+ this.options = this.mergeOptions(options);
+ },
+
+ /**
+ * Merges the given options with the default options.
+ *
+ * @param {Array} options
+ * @returns {Array}
+ */
+ mergeOptions: function(options) {
+ return $.extend(true, {}, this.defaults, this.options, options);
+ },
+
+ /**
+ * Checks whether a select all checkbox is present.
+ *
+ * @returns {Boolean}
+ */
+ hasSelectAll: function() {
+ return $('li.multiselect-all', this.$ul).length > 0;
+ },
+
+ /**
+ * Update opt groups.
+ */
+ updateOptGroups: function() {
+ var $groups = $('li.multiselect-group', this.$ul)
+ var selectedClass = this.options.selectedClass;
+
+ $groups.each(function() {
+ var $options = $(this).nextUntil('li.multiselect-group')
+ .not('.multiselect-filter-hidden')
+ .not('.disabled');
+
+ var checked = true;
+ $options.each(function() {
+ var $input = $('input', this);
+
+ if (!$input.prop('checked')) {
+ checked = false;
+ }
+ });
+
+ if (selectedClass) {
+ if (checked) {
+ $(this).addClass(selectedClass);
+ }
+ else {
+ $(this).removeClass(selectedClass);
+ }
+ }
+
+ $('input', this).prop('checked', checked);
+ });
+ },
+
+ /**
+ * Updates the select all checkbox based on the currently displayed and selected checkboxes.
+ */
+ updateSelectAll: function(notTriggerOnSelectAll) {
+ if (this.hasSelectAll()) {
+ var allBoxes = $("li:not(.multiselect-item):not(.multiselect-filter-hidden):not(.multiselect-group):not(.disabled) input:enabled", this.$ul);
+ var allBoxesLength = allBoxes.length;
+ var checkedBoxesLength = allBoxes.filter(":checked").length;
+ var selectAllLi = $("li.multiselect-all", this.$ul);
+ var selectAllInput = selectAllLi.find("input");
+
+ if (checkedBoxesLength > 0 && checkedBoxesLength === allBoxesLength) {
+ selectAllInput.prop("checked", true);
+ selectAllLi.addClass(this.options.selectedClass);
+ }
+ else {
+ selectAllInput.prop("checked", false);
+ selectAllLi.removeClass(this.options.selectedClass);
+ }
+ }
+ },
+
+ /**
+ * Update the button text and its title based on the currently selected options.
+ */
+ updateButtonText: function() {
+ var options = this.getSelected();
+
+ // First update the displayed button text.
+ if (this.options.enableHTML) {
+ $('.multiselect .multiselect-selected-text', this.$container).html(this.options.buttonText(options, this.$select));
+ }
+ else {
+ $('.multiselect .multiselect-selected-text', this.$container).text(this.options.buttonText(options, this.$select));
+ }
+
+ // Now update the title attribute of the button.
+ $('.multiselect', this.$container).attr('title', this.options.buttonTitle(options, this.$select));
+ },
+
+ /**
+ * Get all selected options.
+ *
+ * @returns {jQUery}
+ */
+ getSelected: function() {
+ return $('option', this.$select).filter(":selected");
+ },
+
+ /**
+ * Gets a select option by its value.
+ *
+ * @param {String} value
+ * @returns {jQuery}
+ */
+ getOptionByValue: function (value) {
+
+ var options = $('option', this.$select);
+ var valueToCompare = value.toString();
+
+ for (var i = 0; i < options.length; i = i + 1) {
+ var option = options[i];
+ if (option.value === valueToCompare) {
+ return $(option);
+ }
+ }
+ },
+
+ /**
+ * Get the input (radio/checkbox) by its value.
+ *
+ * @param {String} value
+ * @returns {jQuery}
+ */
+ getInputByValue: function (value) {
+
+ var checkboxes = $('li input:not(.multiselect-search)', this.$ul);
+ var valueToCompare = value.toString();
+
+ for (var i = 0; i < checkboxes.length; i = i + 1) {
+ var checkbox = checkboxes[i];
+ if (checkbox.value === valueToCompare) {
+ return $(checkbox);
+ }
+ }
+ },
+
+ /**
+ * Used for knockout integration.
+ */
+ updateOriginalOptions: function() {
+ this.originalOptions = this.$select.clone()[0].options;
+ },
+
+ asyncFunction: function(callback, timeout, self) {
+ var args = Array.prototype.slice.call(arguments, 3);
+ return setTimeout(function() {
+ callback.apply(self || window, args);
+ }, timeout);
+ },
+
+ setAllSelectedText: function(allSelectedText) {
+ this.options.allSelectedText = allSelectedText;
+ this.updateButtonText();
+ }
+ };
+
+ $.fn.multiselect = function(option, parameter, extraOptions) {
+ return this.each(function() {
+ var data = $(this).data('multiselect');
+ var options = typeof option === 'object' && option;
+
+ // Initialize the multiselect.
+ if (!data) {
+ data = new Multiselect(this, options);
+ $(this).data('multiselect', data);
+ }
+
+ // Call multiselect method.
+ if (typeof option === 'string') {
+ data[option](parameter, extraOptions);
+
+ if (option === 'destroy') {
+ $(this).data('multiselect', false);
+ }
+ }
+ });
+ };
+
+ $.fn.multiselect.Constructor = Multiselect;
+
+ $(function() {
+ $("select[data-role=multiselect]").multiselect();
+ });
+
+});
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/css/style.css b/examples/Sample App/DMS Sample App/bin/Web App/portal/css/style.css
new file mode 100755
index 0000000..ef1756c
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/bin/Web App/portal/css/style.css
@@ -0,0 +1,230 @@
+.seclore-remove
+{
+ background-image : url('../images/ic_delete_default.png');
+}
+.seclore-checkin
+{
+ background-image : url('../images/ic_checkin_default.png');
+}
+.seclore-permission
+{
+ background-image : url('../images/ic_view-permission_default.png');
+}
+.seclore-download
+{
+ background-image : url('../images/ic_download_default.png');
+}
+.seclore-activity
+{
+ background-image : url('../images/ic_track_default.png');
+}
+.seclore-access-online
+{
+ background-image : url('../images/online-grey.png');
+ background-size: cover;
+}
+.seclore-access-offline
+{
+ background-image : url('../images/open-seclore.png');
+ background-size: cover;
+}
+
+.seclore-action
+{
+ width : 20px;
+ height : 20px;
+ background-repeat: no-repeat;
+}
+IMG, img
+{
+ border: none;
+}
+
+table thead
+{
+ background-color:#337ab7;
+ color:#fff;
+}
+table thead th
+{
+ background-color:#337ab7;
+ color:#fff;
+}
+
+.table-bordered tr:nth-child(even)
+{
+ background: #f4f4f4;
+}
+.table-bordered tr:nth-child(odd)
+{
+ background: #FFF
+}
+.breadcrumb
+{
+ background-color: #d9edf7;
+}
+
+.header
+{
+ height: 120px;
+ width: 100%;
+}
+.header img
+{
+ height: 100%;
+ width: 100%;
+}
+
+.header .user_name
+{
+ position: absolute;
+ right: 5px;
+ top: 2px;
+ color:#ccc;
+}
+.user_name .logout
+{
+ margin-left:6px;
+}
+.user_name .logout a
+{
+ color:#ccc;
+ text-decoration:underline;
+ font-size: 14px;
+}
+
+.header_inner
+{
+ margin-top: -30px;
+ margin-left: 20px;
+ margin-right: 20px;
+ position: relative;
+}
+
+.header_inner .app_name
+{
+ float: left;
+ font-size: 30px;
+ color: #f4f4f4;
+ margin-top: 25px;
+}
+.header_inner .user_logout{
+ color: #146EA2;
+ float: right;
+ margin-top: 5px;
+}
+.container
+{
+ margin-top: 20px;
+ margin-bottom: 20px;
+
+}
+
+.getstarted-box{
+ text-align: center;
+ margin-top:20px;
+}
+.redirect_link{
+ padding: 0px 40px;
+ display: inline-block;
+ font-family: 'Open Sans', Arial, Helvetica, sans-serif;
+ font-size: 15px;
+ font-weight: 700;
+ height: 42px;
+ line-height: 42px;
+ text-align: center;
+ text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.05);
+ text-transform: uppercase;
+ transition: 0.5s ease;
+ text-decoration: none;
+ border: 2px solid #888;
+}
+.redirect_link:HOVER{
+ color: #FFFFFF;
+ border: 2px solid #146EA2;
+ box-shadow: 0 100px 0 #146EA2 inset;
+ text-decoration: none;
+ border: 2px solid #888;
+}
+.supported_ext
+{
+ font-size: 12px;
+ font-style: italic;
+ color: #333;
+}
+.errors
+{
+ margin-left:10px;
+}
+.footer
+{
+ margin-top: 20px;
+ padding: 5px;
+ border-top: solid 1px #ccc;
+ display: inline-block;
+ width: 100%;
+}
+.version_info
+{
+ float:right;
+ margin-right:20px;
+}
+.footer_info
+{
+ float:left;
+ margin-left:20px;
+}
+
+img.action_icon{
+ width:20px;
+ height:20px;
+}
+
+.table_outer
+{
+ max-height:600px;
+ overflow: auto;
+}
+.title{
+ margin-top:20px;
+}
+
+.folder_form .input {
+ width: 300px;
+ max-width: 300px;
+ float: left;
+}
+
+.folder_form .checkbox {
+ width: 20px;
+}
+
+.file_form .input {
+ width: 350px;
+ max-width: 350px;
+ float: left;
+}
+select.form-control{
+ height:28px;
+ padding:2px;
+}
+#users_rights img{
+ width:15px;
+ height:15px;
+ cursor: pointer;
+}
+
+.readonlyElement{
+ margin-top:5px;
+ background-color:#f4f4f4;
+ padding:2px 4px;
+ border:solid 1px #ccc;
+ float:left;
+}
+.error
+{
+ color:red;
+}
+.success{
+ color: green;
+}
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/images/add.png b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/add.png
new file mode 100755
index 0000000..e39e287
Binary files /dev/null and b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/add.png differ
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/images/ajax-loader.gif b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/ajax-loader.gif
new file mode 100755
index 0000000..1fe22da
Binary files /dev/null and b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/ajax-loader.gif differ
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/images/busy.gif b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/busy.gif
new file mode 100755
index 0000000..e81fd81
Binary files /dev/null and b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/busy.gif differ
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/images/delete.png b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/delete.png
new file mode 100755
index 0000000..059548d
Binary files /dev/null and b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/delete.png differ
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/images/download.png b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/download.png
new file mode 100755
index 0000000..2993e02
Binary files /dev/null and b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/download.png differ
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/images/edit.png b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/edit.png
new file mode 100755
index 0000000..b111711
Binary files /dev/null and b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/edit.png differ
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/images/files.png b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/files.png
new file mode 100755
index 0000000..fa02c62
Binary files /dev/null and b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/files.png differ
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/images/ic_checkin_default.png b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/ic_checkin_default.png
new file mode 100755
index 0000000..c52f10b
Binary files /dev/null and b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/ic_checkin_default.png differ
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/images/ic_delete_default.png b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/ic_delete_default.png
new file mode 100755
index 0000000..e825dbc
Binary files /dev/null and b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/ic_delete_default.png differ
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/images/ic_download_default.png b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/ic_download_default.png
new file mode 100755
index 0000000..c7d1e28
Binary files /dev/null and b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/ic_download_default.png differ
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/images/ic_track_default.png b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/ic_track_default.png
new file mode 100755
index 0000000..dbdbb3e
Binary files /dev/null and b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/ic_track_default.png differ
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/images/ic_txt-file_secured_small.png b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/ic_txt-file_secured_small.png
new file mode 100755
index 0000000..5278661
Binary files /dev/null and b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/ic_txt-file_secured_small.png differ
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/images/ic_view-permission_default.png b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/ic_view-permission_default.png
new file mode 100755
index 0000000..6afe305
Binary files /dev/null and b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/ic_view-permission_default.png differ
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/images/online-blue.png b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/online-blue.png
new file mode 100755
index 0000000..d9fc26d
Binary files /dev/null and b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/online-blue.png differ
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/images/online-grey.png b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/online-grey.png
new file mode 100755
index 0000000..3523eb3
Binary files /dev/null and b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/online-grey.png differ
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/images/open-seclore.png b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/open-seclore.png
new file mode 100755
index 0000000..937f1ec
Binary files /dev/null and b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/open-seclore.png differ
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/images/seclore-header.jpg b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/seclore-header.jpg
new file mode 100755
index 0000000..7ac742a
Binary files /dev/null and b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/seclore-header.jpg differ
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/images/user-rights.gif b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/user-rights.gif
new file mode 100755
index 0000000..040b60c
Binary files /dev/null and b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/user-rights.gif differ
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/images/world-icon.png b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/world-icon.png
new file mode 100755
index 0000000..d9583ee
Binary files /dev/null and b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/world-icon.png differ
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/images/world-icon1.png b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/world-icon1.png
new file mode 100755
index 0000000..91f57d3
Binary files /dev/null and b/examples/Sample App/DMS Sample App/bin/Web App/portal/images/world-icon1.png differ
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/js/common.js b/examples/Sample App/DMS Sample App/bin/Web App/portal/js/common.js
new file mode 100755
index 0000000..db334ad
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/bin/Web App/portal/js/common.js
@@ -0,0 +1,70 @@
+// For below IE 9 Support
+if(!String.prototype.trim)
+{
+ // console.log("define custom trim function");
+ String.prototype.trim= function()
+ {
+ return this.replace(/^\s+|\s+$/gm,'');
+ };
+}
+//For below IE 9 Support
+if( !Array.prototype.indexOf )
+{
+ // console.log("define custom indexOf function");
+ Array.prototype.indexOf = function(elt)
+ {
+ var len = this.length >>> 0;
+
+ var from = Number(arguments[1]) || 0;
+ from = (from < 0)
+ ? Math.ceil(from)
+ : Math.floor(from);
+ if (from < 0)
+ from += len;
+
+ for (; from < len; from++)
+ {
+ if (from in this &&
+ this[from] === elt)
+ return from;
+ }
+ return -1;
+ };
+}
+
+$(document).ready(function(){
+
+ // Error or Info Message will be disappeared after specified time.
+ /*
+ $("#messageDiv").animate({opacity: 0}, 20000, function(){
+ $("#messageDiv").empty();
+ });
+ */
+
+ // Check whether the browser support place holder or not
+ $.support.placeholder = ('placeholder' in document.createElement('input'));
+ if (!$.support.placeholder) {
+ $("[placeholder]").focus(function () {
+ if( $(this).val() == $(this).attr("placeholder") )
+ {
+ $(this).val("");
+ $(this).css('color','#555');
+ }
+ }).blur(function () {
+ if ( $(this).val() == "" ){
+ $(this).val( $(this).attr("placeholder") );
+ $(this).css('color','#999');
+ }
+ }).blur();
+
+ $("[placeholder]").parents("form").submit(function () {
+ $(this).find('[placeholder]').each(function() {
+ if ( $(this).val() == $(this).attr("placeholder") )
+ {
+ $(this).val("");
+ }
+ });
+ });
+ }
+
+});
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/js/file.js b/examples/Sample App/DMS Sample App/bin/Web App/portal/js/file.js
new file mode 100755
index 0000000..dde1e77
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/bin/Web App/portal/js/file.js
@@ -0,0 +1,249 @@
+$(document).ready(function(){
+ // **** File related script START **** //
+
+ var usersRightsArray = new Array();
+ var tempUserArray = new Array();
+
+ function UsersRights(pUsersRights)
+ {
+ this.usersRights = pUsersRights;
+ }
+
+ function UserRight(pUserId, pUsageRights)
+ {
+ this.userId = pUserId;
+ this.usageRights = pUsageRights;
+ }
+
+ // On load prepare existing users with their usage rights
+ $("#users_rights tr.user_right").each(function() {
+ var tdFirst = $(this).find("td:first");
+ var userId = $(this).attr("userid");
+ if( tdFirst == null || tdFirst.text() == null || tdFirst.text().trim() == "" )
+ {
+ tdFirst.text(userId);
+ }
+ var usageRights = $(this).attr("usagerights");
+ tempUserArray.push(userId);
+ var ur = new UserRight(userId, usageRights);
+ usersRightsArray.push(ur);
+
+ });
+
+
+ $("#addUserBtn").click(function(){
+ // Clear the old messages
+ $("#emailId").css("border-color","#ccc");
+ $("#AddUserErrorMsg").text("");
+ $("#AddUserSuccessMsg").text("");
+
+ var userId = $("#emailId").val();
+ if ( userId == $("#emailId").attr("placeholder") )
+ {
+ userId = "";
+ }
+
+ if( userId == null || userId.trim().length == 0 )
+ {
+ $("#emailId").css("border-color","red");
+ $("#AddUserErrorMsg").text("Please enter the user's email id");
+ return;
+ }
+
+ userId = userId.trim();
+ // check whether user already added or not
+ if( tempUserArray.indexOf(userId) > -1)
+ {
+ $("#emailId").css("border-color","red");
+ $("#AddUserErrorMsg").text("User already exists");
+ return;
+ }
+
+ $.ajax({
+ type:'POST',
+ url:'searchUser.do',
+ data:{emailId:userId},
+ dataType:'json',
+ beforeSend:function(){
+ $("#InProgressEl").show();
+ $("#addUserBtn").attr("disabled","disabled");
+ },
+ })
+ .done(function(jsonData) {
+ if( jsonData == undefined || jsonData == null )
+ {
+ $("#AddUserErrorMsg").text("Invalid response received!");
+ return;
+ }
+ if( jsonData.status == -1)
+ {
+ $("#emailId").css("border-color","red");
+ $("#AddUserErrorMsg").text(jsonData.errorMessage);
+ return;
+ }
+
+ var name = jsonData.name;
+
+ // To make consistent display email id at the place of name //
+ var spanIcon = $('').attr({"class":"glyphicon glyphicon-user","aria-hidden":"true"});
+ var tdU = $(" ").append(spanIcon).append(document.createTextNode(" "+userId)).attr("title",name);
+
+ var defaultRights = $("#hiddenSelectEl .select_right").val();
+
+ var rightId = defaultRights;
+ var selectHtml = $("#hiddenSelectEl").html();
+
+ var tdR = $(" ").html(selectHtml);
+
+ var span = $('').attr({"title":"remove","class":"removeRight glyphicon glyphicon-remove","aria-hidden":"true","style":"color:red;cursor:pointer;"});
+ var tdA = $(" ").append(span);
+ var tr = $(" ").append(tdU).append(tdR).append(tdA).attr({"userid":userId,"usagerights":rightId});
+
+ $("#users_rights").append(tr);
+ $("#emailId").val('');
+
+ // Add user to Owner list if not exist
+ if( $("#ownerEmaiId option[value='"+userId+"']").length == 0 )
+ {
+ $("#ownerEmaiId").append($('', {
+ value: userId,
+ text: userId,
+ title: name
+ }));
+ }
+
+ tempUserArray.push(userId);
+
+ var ur = new UserRight(userId, rightId);
+ usersRightsArray.push(ur);
+ })
+ .fail(function() {
+ $("#AddUserErrorMsg").text("Error occured while processing the request");
+ })
+ .always(function() {
+ $("#InProgressEl").hide();
+ $("#addUserBtn").removeAttr("disabled");
+ });
+ });
+
+
+ // On change user rights function call
+ $("#users_rights").on("change",".select_right",function(){
+ var rights = $(this).val();
+ var tr = $(this).parent().parent();
+ var userId = tr.attr("userid");
+
+ for(var i in usersRightsArray)
+ {
+ var ur = usersRightsArray[i];
+ if ( ur.userId == userId )
+ {
+ ur.usageRights = rights;
+ break;
+ }
+ }
+ });
+
+ /*
+ $("#addAction").click(function(){
+ var valid = true;
+ var userId = $("#select_user").val();
+ var rightId = $("#select_right").val();
+
+ if(userId == null || userId.trim().length == 0)
+ {
+ $("#select_user").css("border-color","red");
+ valid = false;
+ }
+ else
+ {
+ // check whether user already added or not
+ if( tempUserArray.indexOf(userId) > -1)
+ {
+ $("#select_user").css("border-color","red");
+ $("#select_user").attr("title","This user has been already added");
+ valid = false;
+ }
+ else{
+ $("#select_user").css("border-color","#ccc");
+ $("#select_user").removeAttr("title");
+ }
+ }
+
+ if(rightId == null || rightId.trim().length == 0)
+ {
+ $("#select_right").css("border-color","red");
+ $("#select_right").attr("title","Select the rights");
+ valid = false;
+ }
+ else{
+ $("#select_right").css("border-color","#ccc");
+ $("#select_right").removeAttr("title");
+ }
+
+
+ if( !valid )
+ {
+ return false;
+ }
+
+
+ var userName = $("#select_user option:selected").text();
+ var rightName = $("#select_right option:selected").text();
+
+ var tdU = $("").text(userName);
+ var tdR = $(" ").text(rightName);
+
+
+ var span = $('').attr({"title":"remove","class":"removeRight glyphicon glyphicon-remove","aria-hidden":"true","style":"color:red;cursor:pointer;"});
+ var tdA = $(" ").append(span);
+ var tr = $(" ").append(tdU).append(tdR).append(tdA).attr({"userid":userId,"usagerights":rightId});
+
+ $("#users_rights tr#select_user_right").before(tr);
+ $("#select_user").val('');
+ $("#select_right").val('');
+
+ tempUserArray.push(userId);
+
+ var ur = new UserRight(userId, rightId);
+ usersRightsArray.push(ur);
+ });
+ */
+
+ $("#users_rights").on("click", ".removeRight", function(){
+
+ var tr = $(this).parent().parent();
+ var userId = tr.attr("userid");
+ var ti = tempUserArray.indexOf(userId);
+
+ tempUserArray.splice(ti, 1);
+
+ for(var i in usersRightsArray)
+ {
+ var ur = usersRightsArray[i];
+ if ( ur.userId == userId )
+ {
+ usersRightsArray.splice(i, 1);
+ break;
+ }
+ }
+
+ tr.remove();
+ });
+
+
+ $("#fileSaveBtn").click(function(){
+
+ try{
+ var lUsersRights = new UsersRights(usersRightsArray);
+ var jsonStr = JSON.stringify(lUsersRights);
+ $("#usersRightsField").val(jsonStr);
+ }
+ catch(error){
+ alert(error);
+ }
+ return true;
+ });
+
+ // **** File related script END **** //
+});
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/js/jquery.min-1.11.1.js b/examples/Sample App/DMS Sample App/bin/Web App/portal/js/jquery.min-1.11.1.js
new file mode 100755
index 0000000..ab28a24
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/bin/Web App/portal/js/jquery.min-1.11.1.js
@@ -0,0 +1,4 @@
+/*! jQuery v1.11.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.1",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="
",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML=" ",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML=" ","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML=" ",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;
+if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML=" a ",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML=" ",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h ]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/\s*$/g,rb={option:[1,""," "],legend:[1,""," "],area:[1,""," "],param:[1,""," "],thead:[1,""],tr:[2,""],col:[2,""],td:[3,""],_default:k.htmlSerialize?[0,"",""]:[1,"X","
"]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1>$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?""!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1>$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("")).appendTo(b.documentElement),b=(Cb[0].contentWindow||Cb[0].contentDocument).document,b.write(),b.close(),c=Eb(a,b),Cb.detach()),Db[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Gb=/^margin/,Hb=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ib,Jb,Kb=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ib=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Hb.test(g)&&Gb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):y.documentElement.currentStyle&&(Ib=function(a){return a.currentStyle},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Hb.test(g)&&!Kb.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Lb(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML=" a ",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.style.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight)),b.innerHTML="",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Mb=/alpha\([^)]*\)/i,Nb=/opacity\s*=\s*([^)]*)/,Ob=/^(none|table(?!-c[ea]).+)/,Pb=new RegExp("^("+S+")(.*)$","i"),Qb=new RegExp("^([+-])=("+S+")","i"),Rb={position:"absolute",visibility:"hidden",display:"block"},Sb={letterSpacing:"0",fontWeight:"400"},Tb=["Webkit","O","Moz","ms"];function Ub(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Tb.length;while(e--)if(b=Tb[e]+c,b in a)return b;return d}function Vb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fb(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Wb(a,b,c){var d=Pb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));return g}function Yb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ib(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Jb(a,b,f),(0>e||null==e)&&(e=a.style[b]),Hb.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xb(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Jb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ub(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||m.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ub(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Jb(a,b,d)),"normal"===f&&b in Sb&&(f=Sb[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Ob.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Rb,function(){return Yb(a,b,d)}):Yb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ib(a);return Wb(a,c,d?Xb(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Nb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Mb,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Mb.test(f)?f.replace(Mb,e):f+" "+e)}}),m.cssHooks.marginRight=Lb(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Jb,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Gb.test(a)||(m.cssHooks[a+b].set=Wb)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ib(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Vb(this,!0)},hide:function(){return Vb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Zb(a,b,c,d,e){return new Zb.prototype.init(a,b,c,d,e)}m.Tween=Zb,Zb.prototype={constructor:Zb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?"":"px")
+},cur:function(){var a=Zb.propHooks[this.prop];return a&&a.get?a.get(this):Zb.propHooks._default.get(this)},run:function(a){var b,c=Zb.propHooks[this.prop];return this.pos=b=this.options.duration?m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Zb.propHooks._default.set(this),this}},Zb.prototype.init.prototype=Zb.prototype,Zb.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Zb.propHooks.scrollTop=Zb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Zb.prototype.init,m.fx.step={};var $b,_b,ac=/^(?:toggle|show|hide)$/,bc=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cc=/queueHooks$/,dc=[ic],ec={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bc.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bc.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fc(){return setTimeout(function(){$b=void 0}),$b=m.now()}function gc(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hc(a,b,c){for(var d,e=(ec[b]||[]).concat(ec["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ic(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fb(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fb(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ac.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fb(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hc(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jc(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kc(a,b,c){var d,e,f=0,g=dc.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$b||fc(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$b||fc(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jc(k,j.opts.specialEasing);g>f;f++)if(d=dc[f].call(j,a,k,j.opts))return d;return m.map(k,hc,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kc,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],ec[c]=ec[c]||[],ec[c].unshift(b)},prefilter:function(a,b){b?dc.unshift(a):dc.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kc(this,m.extend({},a),f);(e||m._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cc.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gc(b,!0),a,d,e)}}),m.each({slideDown:gc("show"),slideUp:gc("hide"),slideToggle:gc("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($b=m.now();ca ",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lc=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lc,""):null==c?"":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mc,nc,oc=m.expr.attrHandle,pc=/^(?:checked|selected)$/i,qc=k.getSetAttribute,rc=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nc:mc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rc&&qc||!pc.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qc?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nc={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rc&&qc||!pc.test(c)?a.setAttribute(!qc&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c=oc[b]||m.find.attr;oc[b]=rc&&qc||!pc.test(b)?function(a,b,d){var e,f;return d||(f=oc[b],oc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,oc[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rc&&qc||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mc&&mc.set(a,b,c)}}),qc||(mc={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},oc.id=oc.name=oc.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mc.set},m.attrHooks.contenteditable={set:function(a,b,c){mc.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sc=/^(?:input|select|textarea|button|object)$/i,tc=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=m.find.attr(a,"tabindex");return b?parseInt(b,10):sc.test(a.nodeName)||tc.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var uc=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(uc," ").indexOf(b)>=0)return!0;return!1}}),m.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var vc=m.now(),wc=/\?/,xc=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xc,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yc,zc,Ac=/#.*$/,Bc=/([?&])_=[^&]*/,Cc=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Dc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ec=/^(?:GET|HEAD)$/,Fc=/^\/\//,Gc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hc={},Ic={},Jc="*/".concat("*");try{zc=location.href}catch(Kc){zc=y.createElement("a"),zc.href="",zc=zc.href}yc=Gc.exec(zc.toLowerCase())||[];function Lc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mc(a,b,c,d){var e={},f=a===Ic;function g(h){var i;return e[h]=!0,m.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Nc(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Oc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zc,type:"GET",isLocal:Dc.test(yc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":m.parseJSON,"text xml":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nc(Nc(a,m.ajaxSettings),b):Nc(m.ajaxSettings,a)},ajaxPrefilter:Lc(Hc),ajaxTransport:Lc(Ic),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cc.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zc)+"").replace(Ac,"").replace(Fc,yc[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(c=Gc.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yc[1]&&c[2]===yc[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yc[3]||("http:"===yc[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mc(Hc,k,b,v),2===t)return v;h=k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Ec.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wc.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bc.test(e)?e.replace(Bc,"$1_="+vc++):e+(wc.test(e)?"&":"?")+"_="+vc++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Jc+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mc(Ic,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Oc(k,v,c)),u=Pc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qc=/%20/g,Rc=/\[\]$/,Sc=/\r?\n/g,Tc=/^(?:submit|button|image|reset|file)$/i,Uc=/^(?:input|select|textarea|keygen)/i;function Vc(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rc.test(a)?d(a,e):Vc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==m.type(b))d(a,b);else for(e in b)Vc(a+"["+e+"]",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vc(c,a[c],b,e);return d.join("&").replace(Qc,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Uc.test(this.nodeName)&&!Tc.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sc,"\r\n")}}):{name:b.name,value:c.replace(Sc,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zc()||$c()}:Zc;var Wc=0,Xc={},Yc=m.ajaxSettings.xhr();a.ActiveXObject&&m(a).on("unload",function(){for(var a in Xc)Xc[a](void 0,!0)}),k.cors=!!Yc&&"withCredentials"in Yc,Yc=k.ajax=!!Yc,Yc&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xc[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xc[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zc(){try{return new a.XMLHttpRequest}catch(b){}}function $c(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _c=[],ad=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_c.pop()||m.expando+"_"+vc++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ad.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ad.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ad,"$1"+e):b.jsonp!==!1&&(b.url+=(wc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_c.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bd=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bd)return bd.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cd=a.document.documentElement;function dd(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dd(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cd;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cd})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dd(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=Lb(k.pixelPosition,function(a,c){return c?(c=Jb(a,b),Hb.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ed=a.jQuery,fd=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fd),b&&a.jQuery===m&&(a.jQuery=ed),m},typeof b===K&&(a.jQuery=a.$=m),m});
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/js/openActivityOnMap.js b/examples/Sample App/DMS Sample App/bin/Web App/portal/js/openActivityOnMap.js
new file mode 100755
index 0000000..b22c618
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/bin/Web App/portal/js/openActivityOnMap.js
@@ -0,0 +1,320 @@
+/**
+ *
+ */
+
+
+mapboxgl.accessToken = mapboxAccessToken;
+var dynamicTable = (function() {
+
+ var _tableId, _table,
+ _fields, _headers,
+ _defaultText;
+
+ /** Builds the row with columns from the specified names.
+ * If the item parameter is specified, the memebers of the names array will be used as property names of the item; otherwise they will be directly parsed as text.
+ */
+ function _buildRowColumns(names, item) {
+ var row = '
';
+ if (names && names.length > 0)
+ {
+ $.each(names, function(index, name) {
+ var c = item ? item[name+''] : name;
+ row += '' + c + ' ';
+ });
+ }
+ row += ' ';
+ return row;
+ }
+
+ /** Builds and sets the headers of the table. */
+ function _setHeaders() {
+ // if no headers specified, we will use the fields as headers.
+ _headers = (_headers == null || _headers.length < 1) ? _fields : _headers;
+ var h = _buildRowColumns(_headers);
+ if (_table.children('thead').length < 1) _table.prepend('
');
+ _table.children('thead').html(h);
+ }
+
+ function _setNoItemsInfo() {
+ if (_table.length < 1) return; //not configured.
+ var colspan = _headers != null && _headers.length > 0 ?
+ 'colspan="' + _headers.length + '"' : '';
+ var content = '
' +
+ _defaultText + ' ';
+ if (_table.children('tbody').length > 0)
+ _table.children('tbody').html(content);
+ else _table.append('
' + content + ' ');
+ }
+
+ function _removeNoItemsInfo() {
+ var c = _table.children('tbody').children('tr');
+ if (c.length == 1 && c.hasClass('no-items')) _table.children('tbody').empty();
+ }
+
+ return {
+ /** Configres the dynamic table. */
+ config: function(tableId, fields, headers, defaultText) {
+ _tableId = tableId;
+ _table = $('#' + tableId);
+ _fields = fields || null;
+ _headers = headers || null;
+ _defaultText = defaultText || 'No items to list...';
+ _setHeaders();
+ _setNoItemsInfo();
+ return this;
+ },
+ /** Loads the specified data to the table body. */
+ load: function(data, append) {
+ if (_table.length < 1) return; //not configured.
+ _setHeaders();
+ _removeNoItemsInfo();
+ if (data && data.length > 0) {
+ var rows = '';
+ $.each(data, function(index, item) {
+ rows += _buildRowColumns(_fields, item);
+ });
+ var mthd = append ? 'append' : 'html';
+ _table.children('tbody')[mthd](rows);
+ }
+ else {
+ _setNoItemsInfo();
+ }
+ return this;
+ },
+ /** Clears the table body. */
+ clear: function() {
+ _setNoItemsInfo();
+ return this;
+ }
+ };
+}());
+
+var map = new mapboxgl.Map({
+ container: 'map',
+ style: 'mapbox://styles/mapbox/streets-v11',
+ center: [-103.59179687498357, 40.66995747013945],
+ zoom: 2
+});
+map.on('load', function() {
+ mapSource = map.addSource("openActivityLog", {
+ type: "geojson",
+
+ data : secloreData
+,
+ cluster: true,
+ clusterMaxZoom: 14, // Max zoom to cluster points on
+ clusterRadius: 50 // Radius of each cluster when clustering points (defaults to 50)
+ }).getSource('openActivityLog');
+
+ map.addLayer({
+ id: "groupOfActivities",
+ type: "circle",
+ source: "openActivityLog",
+ filter: ["has", "point_count"],
+ paint: {
+ "circle-color": [
+ "step",
+ ["get", "point_count"],
+ "#666",
+ 5,
+ "#f1f075",
+ 20,
+ "#f28cb1"
+ ],
+ "circle-radius": [
+ "step",
+ ["get", "point_count"],
+ 25,
+ 5,
+ 30,
+ 20,
+ 40
+ ]
+ }
+ }
+ );
+
+ map.addLayer({
+ id: "groupOfActivities-count",
+ type: "symbol",
+ source: "openActivityLog",
+ filter: ["has", "point_count_abbreviated"],
+ layout: {
+ "text-field": "{point_count_abbreviated}",
+ "text-font": ["DIN Offc Pro Medium", "Arial Unicode MS Bold"],
+ "text-size": 12
+ }
+ });
+ map.addLayer({
+ id: "singleActivity",
+ type: "circle",
+ source: "openActivityLog",
+ filter: ["!", ["has", "point_count"]],
+ paint: {
+ "circle-color": [
+ "step",
+ ["get", "authorized"],
+ "red",
+ 1,
+ "green",
+ 750,
+ "#f28cb1"
+ ],
+ "circle-radius": 6,
+ "circle-stroke-width": 2,
+ "circle-stroke-color": "black"
+ }
+ });
+
+
+
+var hoveredStateId = null;
+ function getAllClusterChildren(error, allChildren, e)
+ {
+ var i = 0;
+ var description = "";
+ for(;i
asd : " + allChildren[i].activity;
+ }
+ openPopUp(e,description);
+ }
+
+
+ var event = null;
+ map.on('mouseenter', 'groupOfActivities', function (e) {
+ if (e.features.length > 0) {
+ var clusterId = e.features[0].properties.cluster_id;
+ event = e;
+ mapSource.getClusterLeaves(clusterId, 200, 0,function(error, allChildren){
+ var description = "";
+ var noOfUsers = 0 ;
+ var users = [];
+ var authCount = 0;
+ var totalActivities = allChildren.length;
+ for(var i = 0;i
0) {
+ var clusterId = e.features[0].properties.cluster_id;
+ event = e;
+ mapSource.getClusterLeaves(clusterId, 200, 0,function(error, allChildren){
+ var description = "";
+ var users = [];
+ var totalActivities = allChildren.length;
+ for(var i = 0;i 0) {
+ event = e;
+ dt.load([e.features[0].properties]);
+ scrollTableUp();
+ }
+ });
+
+
+
+ var popup = new mapboxgl.Popup({
+ closeButton: false,
+ closeOnClick: false
+ });
+
+ map.on('mouseenter', 'singleActivity', function(e){
+ event = e;
+ description=getSinglePointPopupContent(e.features[0].properties);
+ openPopUp(description);
+
+ });
+
+ map.on('mouseleave', 'groupOfActivities', closePopUp);
+ map.on('mouseleave', 'singleActivity', closePopUp);
+
+ function openPopUp(description) {
+ // Change the cursor style as a UI indicator.
+ map.getCanvas().style.cursor = 'pointer';
+
+ var coordinates = event.features[0].geometry.coordinates.slice();
+ ;
+
+ // Ensure that if the map is zoomed out such that multiple
+ // copies of the feature are visible, the popup appears
+ // over the copy being pointed to.
+ while (Math.abs(event.lngLat.lng - coordinates[0]) > 180) {
+ coordinates[0] += event.lngLat.lng > coordinates[0] ? 360 : -360;
+ }
+ // Populate the popup and set its coordinates
+ // based on the feature found.
+ popup.setLngLat(coordinates)
+ .setHTML(description)
+ .addTo(map);
+ }
+
+ function closePopUp(){
+ map.getCanvas().style.cursor = '';
+ popup.remove();
+ }
+
+ var adminLayers = ['admin-0-boundary', 'admin-1-boundary', 'admin-0-boundary-disputed', 'admin-1-boundary-bg', 'admin-0-boundary-bg'];
+ adminLayers.forEach(function(adminLayer) {
+ map.setFilter(adminLayer, ["match", ["get", "worldview"], ["all", "IN"], true, false]);
+ });
+
+ var dt = dynamicTable.config('data-table',
+ ['id', 'filename', 'user', 'client-type', 'time', 'authorizedDisplayString', 'mode'],
+ ['ID', 'Current File Name', 'User', 'Client Type', 'Time', 'Authorized?', 'Mode'], //set to null for field names instead of custom header names
+ 'Click on a point on the map to view its details.');
+ document.getElementById('data-table').classList.add("table");
+ document.getElementById('data-table').classList.add("table-striped");
+});
+function getClusterPopupContent(noOfUsers, totalActivities, authCount)
+{
+ var description= "
";
+ description+= " "+ noOfUsers+"
";
+ description+= " "+ authCount+"
";
+ description+= " "+ (totalActivities - authCount)+"
";
+ description+= " "
+ return description;
+}
+function getSinglePointPopupContent(activityDetails)
+{
+
+ var description= "
";
+ description+= " "+ activityDetails.user;
+ description+= ""
+ return description;
+}
+
+function scrollTableUp()
+{
+ $('html,body').animate({
+ scrollTop: $("#data-table").offset().top},
+ 'slow');
+}
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/SOError.jsp b/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/SOError.jsp
new file mode 100755
index 0000000..462bcee
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/SOError.jsp
@@ -0,0 +1,85 @@
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
+ pageEncoding="ISO-8859-1"%>
+
+
+
+
+
+
+Redirecting to Error Page..
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/appUser.jsp b/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/appUser.jsp
new file mode 100755
index 0000000..10bcacb
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/appUser.jsp
@@ -0,0 +1,86 @@
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
+ pageEncoding="ISO-8859-1"%>
+<%@ taglib prefix="core" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Sr. No.
+ Name (User ID)
+ Edit
+ Delete
+
+
+
+
+
+
+ ${counter.count}
+
+
+
+
+
+
+
+ " title="Edit User Name" class="editUserBtn" userid=" ">
+
+
+
+
+ " title="Delete the user">
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/blacklistedCountriesDropDown.jsp b/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/blacklistedCountriesDropDown.jsp
new file mode 100755
index 0000000..6acefa5
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/blacklistedCountriesDropDown.jsp
@@ -0,0 +1,46 @@
+<%@page import="java.util.HashSet"%>
+<%@page import="java.util.Map.Entry"%>
+<%@page import="java.util.HashMap"%>
+<%@page import="com.seclore.sample.dms.util.GeoLocationUtil"%>
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
+ pageEncoding="ISO-8859-1"%>
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/changeUser.jsp b/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/changeUser.jsp
new file mode 100755
index 0000000..6774fa4
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/changeUser.jsp
@@ -0,0 +1,61 @@
+<%@page import="com.seclore.sample.dms.config.SampleAppConfig"%>
+<%@page import="com.seclore.sample.dms.util.CommonUtil"%>
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
+ pageEncoding="ISO-8859-1"%>
+
+
+
+
+Change User
+
+
+<%
+String lUser = (String) session.getAttribute("name");
+lUser = CommonUtil.isStringEmpty(lUser)?SampleAppConfig.getDummyUserName():lUser;
+%>
+
+Change User Login
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/file.jsp b/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/file.jsp
new file mode 100755
index 0000000..bbfa272
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/file.jsp
@@ -0,0 +1,205 @@
+<%@page import="com.seclore.sample.dms.config.SampleAppConfig"%>
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
+<%@ taglib prefix="core" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/fileList.jsp b/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/fileList.jsp
new file mode 100755
index 0000000..e09e918
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/fileList.jsp
@@ -0,0 +1,139 @@
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
+ pageEncoding="ISO-8859-1"%>
+<%@ taglib prefix="core" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
+
+
+
+
+
+
+
+
+
+
+
Folder:
+
IRM Enabled:
+
+
File List
+
+
+
+
+
+
+ Sr. No.
+ Document
+ Check-in
+ Version
+ Last Modified by
+ Last Modified Time
+
+ Online Access
+
+ Access on Desktop
+ Download
+ Permission
+ Activity
+ Delete
+
+
+
+
+
+
+ ${counter.count}
+ ">
+
+
+ <%-- --%>
+
+
+
+
+
+ &fileId= " title="Check-in the file">
+
+
+
+
+
+
+ .
+
+
+
+
+
+
+
+
+
+
+ <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
+
+
+
+
+
+
+
+
+ &fileId= " title="Access online" target="_blank">
+
+
+
+
+
+
+
+ &fileId= " title="Access on desktop" target="_blank">
+
+
+
+
+
+
+ &fileId= " title="Download the file">
+
+
+
+
+
+
+ &fileId= " title="Add/Edit users and rights on the file">
+
+
+
+
+
+
+ &fileId= " title="Activity">
+
+
+
+
+
+
+ &fileId= " title="Delete the file">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/folder.jsp b/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/folder.jsp
new file mode 100755
index 0000000..c510e73
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/folder.jsp
@@ -0,0 +1,73 @@
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
+ pageEncoding="ISO-8859-1"%>
+<%@ taglib prefix="core" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/folderList.jsp b/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/folderList.jsp
new file mode 100755
index 0000000..8b199f0
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/folderList.jsp
@@ -0,0 +1,77 @@
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
+ pageEncoding="ISO-8859-1"%>
+<%@ taglib prefix="core" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Sr. No.
+ Name
+ IRM Enabled
+ Edit
+ Delete
+
+
+
+
+
+
+ ${counter.count}
+
+
+ " title="View files">
+
+ <%-- --%>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ " title="Edit the folder">
+
+
+
+
+ " title="Delete the folder">
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/footer.jsp b/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/footer.jsp
new file mode 100755
index 0000000..d1aa382
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/footer.jsp
@@ -0,0 +1,16 @@
+ <%@ page import="com.seclore.sample.dms.version.Version" %>
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/header.jsp b/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/header.jsp
new file mode 100755
index 0000000..dca59fe
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/header.jsp
@@ -0,0 +1,52 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
+<%@ taglib prefix="core" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+
+
+
+
+
+My File Share
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/home.jsp b/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/home.jsp
new file mode 100755
index 0000000..b8cb5c5
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/home.jsp
@@ -0,0 +1,28 @@
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
+ pageEncoding="ISO-8859-1"%>
+<%@ taglib prefix="core" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/logs.jsp b/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/logs.jsp
new file mode 100755
index 0000000..ceeeee6
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/logs.jsp
@@ -0,0 +1,91 @@
+<%@page import="com.seclore.sample.dms.config.SampleAppConfig"%>
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
+<%@ taglib prefix="core" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
+
+
+
+
+
+
+
Original File Name :
+<%
+if(SampleAppConfig.isLocationBasedFeatureEnabled())
+{
+%>
+
( &fileId= ">View on map)
+<%
+}
+%>
+
+
+
+
+
+ ID
+ Current File Name
+ User
+ Activity
+ Client Type
+ Time
+ Authorized?
+ Mode
+
+
+
+
+
+
+
+
+
+
+ Protect
+ View
+ Edit
+ Print
+ Redistribute
+ Unprotect
+ Transfer Ownership
+ Accessed Remotely
+ Access on VM
+ Capture Screen
+ Copy Data
+ Macro
+ View in Lite Viewer
+ Create Offline Package
+
+ ${item.activityId}
+
+ (for )
+
+
+
+
+
+
+ Yes
+ No
+
+
+ Online
+ Offline
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/message.jsp b/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/message.jsp
new file mode 100755
index 0000000..f288868
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/message.jsp
@@ -0,0 +1,20 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8"
+ pageEncoding="UTF-8"%>
+<%@ taglib prefix="core" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/open.jsp b/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/open.jsp
new file mode 100755
index 0000000..1c2f766
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/open.jsp
@@ -0,0 +1,96 @@
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
+ pageEncoding="ISO-8859-1"%>
+
+
+
+
+
+
+
Redirecting..
+
+
+
+
+<%
+ String lstrBusyGifURL = (String) request.getAttribute("serviceUrl") + "/portal/images/busy.gif";
+%>
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/openActivityOnMap.jsp b/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/openActivityOnMap.jsp
new file mode 100755
index 0000000..f1a3231
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/openActivityOnMap.jsp
@@ -0,0 +1,121 @@
+<%@page import="com.seclore.sample.dms.config.SampleAppConfig"%>
+<%@page import="java.util.Date"%>
+<%@page import="java.util.List"%>
+<%@page import="com.seclore.sample.dms.core.IPGeoDetails"%>
+<%@page import="com.seclore.sample.dms.core.FileActivityLog"%>
+<%@page import="java.util.HashMap"%>
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
+<%@ taglib prefix="core" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
+
+
+
+
+
+
+
+
+ Folder List
+ "> File List
+ &fileId= "> Activity
+ Map view
+
+
+
+
Open Activies for the file ' '
+
+
+
+
+<%
+HashMap
ip2geodetailsmap = (HashMap)request.getAttribute("ip2geodetailsmap");
+List activitylist = (List)request.getAttribute("fileactivitylog");
+if(ip2geodetailsmap != null && activitylist != null && ip2geodetailsmap.size()>0 && activitylist.size()>0)
+{
+%>
+
+
+
*This is for demonstration purposes only. Map not to scale. Actual map location may vary.
+
+
+
+<%
+}
+else
+{
+ session.setAttribute("ERROR_MESSAGE", "No records found to view on the map");
+}
+
+%>
+
+
+
+
+
+
+
+
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/pageNotFound404.jsp b/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/pageNotFound404.jsp
new file mode 100755
index 0000000..6adee45
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/pageNotFound404.jsp
@@ -0,0 +1,13 @@
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
+ pageEncoding="ISO-8859-1"%>
+<%@ taglib prefix="core" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
+
+
+
+ The page you were looking for could not be found!
+
+
+ Back to Home
+
+
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/serverError.jsp b/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/serverError.jsp
new file mode 100755
index 0000000..b885bc8
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/bin/Web App/portal/pages/serverError.jsp
@@ -0,0 +1,20 @@
+<%@page import="com.seclore.sample.dms.util.LoggerUtil"%>
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
+ pageEncoding="ISO-8859-1"%>
+<%@ taglib prefix="core" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
+<%@ page isErrorPage="true" %>
+
+
+ <%LoggerUtil.logError("Server Error:"+exception.getMessage(), exception);%>
+
+ The server encountered an internal error and was unable to complete your request.
+
+
+ More information about this error may be available in the application error log.
+
+
+
+ Back to Home
+
+
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/doc/1- Installation and Setup.pdf b/examples/Sample App/DMS Sample App/doc/1- Installation and Setup.pdf
new file mode 100755
index 0000000..68c31cb
Binary files /dev/null and b/examples/Sample App/DMS Sample App/doc/1- Installation and Setup.pdf differ
diff --git a/examples/Sample App/DMS Sample App/doc/2- Sanity cases for post deployment check.txt b/examples/Sample App/DMS Sample App/doc/2- Sanity cases for post deployment check.txt
new file mode 100755
index 0000000..e93174b
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/doc/2- Sanity cases for post deployment check.txt
@@ -0,0 +1,29 @@
+Sanity testing to verify the installation of Sample App.
+
+A. Adding a folder and uploading files.
+
+1. Visit Seclore Sample App - "https://[SERVER_NAME]/[SAMPLE_APP_NAME]".
+
+2. Click on the "+ Create New Folder" link on the menu bar.
+
+3. On the next page name your folder, check the 'IRM Enabled' check-box and click on Save.
+
+4. Click on the new folder that you just created from the list of folders that you see on the Folder List page.
+
+5. Click on the "+ Add New File" link on the menu bar.
+
+6. Choose a file you wish to upload, Select an Owner, a Classification and add Users (Search users by their email id, These users should be present in the Policy Server.) with User Rights from the respective dropdown boxes.
+
+7. Save this file. All these action should be completed without any errors.
+
+B. Download, View Online, View on Desktop and check for logs on and uploaded file.
+
+1. Click on any one of the folders listed on the folder list page.
+
+2. On the next page, appears a list of all files uploaded in that folder.
+
+3. Perform the actions that say "Online Access", "Access on Desktop", "Download" and "View Logs" to check if all these work as expected.
+
+4. You may also try and edit certain rights on the file by clicking the "Edit" action.
+
+5. Try an open operation on the downloaded file using DC or Lite Client with an authorized and an unauthorized user to confirm expected behaviour.
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/doc/3- Enabling location based feature.txt b/examples/Sample App/DMS Sample App/doc/3- Enabling location based feature.txt
new file mode 100755
index 0000000..5243785
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/doc/3- Enabling location based feature.txt
@@ -0,0 +1,21 @@
+-------------------------------------
+-- Enabling location based feature --
+-------------------------------------
+
+Pre-requisites :
+1. Map Box API key:
+ - For the API key, Sign in/sign up to 'https://www.mapbox.com/signin/'.
+ - On the dashboard, in the 'Access tokens' section, you can create a token or use the default public token.
+ - This token is the Map box API key.
+2. IPStack API key:
+ - For the API key, Sign in/sign up to 'https://ipstack.com/login'.
+ - On the dashboard, in the 'Your API Access Key' section, you can find the IPStack API key.
+
+
+Steps to enable the feature :
+1. Edit the 'SampleAppConfig.properties' file in '/config' folder.
+2. To enable Location based feature change the value of 'location.based.features.enable' key to 'true'
+3. Enter the values for the following keys
+ a. mapbox.api.key=
+ b. ip.stack.api.key=
+4. Restart Tomcat.
diff --git a/examples/Sample App/DMS Sample App/doc/Database libs/mssql-jdbc-7.0.0.jre8.jar b/examples/Sample App/DMS Sample App/doc/Database libs/mssql-jdbc-7.0.0.jre8.jar
new file mode 100755
index 0000000..9f68c4d
Binary files /dev/null and b/examples/Sample App/DMS Sample App/doc/Database libs/mssql-jdbc-7.0.0.jre8.jar differ
diff --git a/examples/Sample App/DMS Sample App/doc/Database libs/ojdbc8.jar b/examples/Sample App/DMS Sample App/doc/Database libs/ojdbc8.jar
new file mode 100755
index 0000000..95b0340
Binary files /dev/null and b/examples/Sample App/DMS Sample App/doc/Database libs/ojdbc8.jar differ
diff --git a/examples/Sample App/DMS Sample App/doc/Developer's Reference.txt b/examples/Sample App/DMS Sample App/doc/Developer's Reference.txt
new file mode 100755
index 0000000..f0525d3
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/doc/Developer's Reference.txt
@@ -0,0 +1,84 @@
+FileSecure Interfaces integration source code reference.
+
+FS Helper Initialization
+------------------------
+ - At application startup initializing FS Helper library
+ - Below classes are used for the same
+ - com.seclore.sample.dms.listener.ServletContextListenerImpl
+ - contextInitialized( ... )
+ - com.seclore.sample.dms.listener.SecloreWSClientConfig
+ - initializeWSClient( ... )
+
+
+
+Protect File On Download
+-------------------
+ - File download request comes form Web/portal/pages/fileList.jsp
+ - Below servlet is the handler for the same.
+ - com.seclore.sample.dms.servlet.file.DownloadFileServlet
+
+Unprotect File on upload
+------------------------
+ - This feature is not implemented in SampleApplication. But work flow is similar to protect method.
+ - There is FSHelperLibrary.unprotectX( ... ) method to unprotect the file. Refer Java-docs for more details.
+
+
+
+Map/Unmap policy with Folder #NOTE: Not required for Fully Policy Federation
+----------------------------
+ - Create Hot Folder using FS Helper API. Setting flag that the folder is IRM enabled.
+ - Enable folder as IRM request comes form Web/portal/pages/folder.jsp
+ - Below servlet is the handler for the same.
+ - com.seclore.sample.dms.servlet.folder.SaveFolderServlet
+ - mapSeclorePolicy( ... )
+
+
+Seclore Online Integration
+---------------------------------------------
+ - View file request comes form Web/portal/pages/fileList.jsp
+ - The Request can be to open the file in view mode, edit mode or Open file on Desktop Client.
+ - Below servlet is the handler for the same.
+ - com.seclore.sample.webconnect.servlet.ViewFileOnlineServlet
+
+
+Access Right Implementation
+---------------------------
+ - Access Right Adaptor (ARA) request handler which receive request from Policy Server when user open a file and return response with DMS rights.
+ - Below class is the implementation of REST WebService for ARA request.
+ - com.seclore.sample.ara.webservice.ARARequestHandler
+
+ - Method for ping request (/ping)
+ - handleARAPingRequest( ...)
+
+ - Method for get access right request (/getaccessright)
+ - handleARAGetAccessRight( ... )
+
+ - Method to get file information (/getfileinformation)
+ - handleARAGetFileDetails( ... )
+
+ - Developer should refer all classes available in com.seclore.sample.ara.webservice package.
+
+
+
+
+Note:
+=====
+while preparing xml string for request or response. please escape below spacial character for the string which will be written within xml tag.
+ "&" -> "&"
+ "<" -> "<"
+ ">", -> ">"
+ "\"" -> """
+ "'" -> "'";
+
+ Refer: com.seclore.sample.ara.webservice.XMLHelper class and
+ - escapeForXML () method
+
+Example: sample xml is "Sample Sales & purchase report.pdf "
+ here "Sample Sales and purchase report" should be escaped.
+ Use: String fileName = XMLHelper.escapeForXML( "Sample Sales & purchase report" );
+ ""+fileName+" "
+
+
+
+
+
diff --git a/examples/Sample App/DMS Sample App/doc/Policy Federation.zip b/examples/Sample App/DMS Sample App/doc/Policy Federation.zip
new file mode 100755
index 0000000..df20ac1
Binary files /dev/null and b/examples/Sample App/DMS Sample App/doc/Policy Federation.zip differ
diff --git a/examples/Sample App/DMS Sample App/doc/Seclore Online Integration – Developer Guide - v3.2.pdf b/examples/Sample App/DMS Sample App/doc/Seclore Online Integration – Developer Guide - v3.2.pdf
new file mode 100755
index 0000000..49e65ed
Binary files /dev/null and b/examples/Sample App/DMS Sample App/doc/Seclore Online Integration – Developer Guide - v3.2.pdf differ
diff --git a/examples/Sample App/DMS Sample App/scripts/build.sh b/examples/Sample App/DMS Sample App/scripts/build.sh
new file mode 100755
index 0000000..29c3838
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/scripts/build.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+
+set -e
+
+# Set the project root directory
+PROJECT_ROOT=$(dirname "$0")/..
+
+# Clean all bin classes folders
+rm -rf "$PROJECT_ROOT/src/Web/WEB-INF/classes"/*
+
+# Clear the WEBApp dir contents
+rm -rf "$PROJECT_ROOT/bin/Web App"/*
+
+#find and compile all java files
+find "$PROJECT_ROOT/src/source" -name "*.java" -exec javac -d "$PROJECT_ROOT/src/Web/WEB-INF/classes" -cp "$PROJECT_ROOT/src/Web/WEB-INF/lib/*:$PROJECT_ROOT/src/dependencies/*" {} +
+
+# Copy the log4j.properties file from src to compiled classes location
+cp -rf "$PROJECT_ROOT/src/source/log4j.properties" "$PROJECT_ROOT/src/Web/WEB-INF/classes"
+
+# Copy all libs and config files to Web App dir
+cp -rf "$PROJECT_ROOT/src/Web"/* "$PROJECT_ROOT/bin/Web App"
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/.classpath b/examples/Sample App/DMS Sample App/src/.classpath
new file mode 100755
index 0000000..87de350
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/.classpath
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/Sample App/DMS Sample App/src/.project b/examples/Sample App/DMS Sample App/src/.project
new file mode 100755
index 0000000..481b688
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/.project
@@ -0,0 +1,42 @@
+
+
+ EAI Sample App
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.wst.common.project.facet.core.builder
+
+
+
+
+ org.eclipse.wst.validation.validationbuilder
+
+
+
+
+
+ org.eclipse.jem.workbench.JavaEMFNature
+ org.eclipse.wst.common.modulecore.ModuleCoreNature
+ org.eclipse.wst.common.project.facet.core.nature
+ org.eclipse.jdt.core.javanature
+ org.eclipse.wst.jsdt.core.jsNature
+
+
+
+ 1723129030198
+
+ 30
+
+ org.eclipse.core.resources.regexFilterMatcher
+ node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__
+
+
+
+
diff --git a/examples/Sample App/DMS Sample App/src/.settings/.jsdtscope b/examples/Sample App/DMS Sample App/src/.settings/.jsdtscope
new file mode 100755
index 0000000..582472f
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/.settings/.jsdtscope
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/Sample App/DMS Sample App/src/.settings/org.eclipse.jdt.core.prefs b/examples/Sample App/DMS Sample App/src/.settings/org.eclipse.jdt.core.prefs
new file mode 100755
index 0000000..0c68a61
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/examples/Sample App/DMS Sample App/src/.settings/org.eclipse.wst.common.component b/examples/Sample App/DMS Sample App/src/.settings/org.eclipse.wst.common.component
new file mode 100755
index 0000000..a445557
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/.settings/org.eclipse.wst.common.component
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/examples/Sample App/DMS Sample App/src/.settings/org.eclipse.wst.common.project.facet.core.xml b/examples/Sample App/DMS Sample App/src/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100755
index 0000000..e28714c
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/Sample App/DMS Sample App/src/.settings/org.eclipse.wst.jsdt.ui.superType.container b/examples/Sample App/DMS Sample App/src/.settings/org.eclipse.wst.jsdt.ui.superType.container
new file mode 100755
index 0000000..3bd5d0a
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/.settings/org.eclipse.wst.jsdt.ui.superType.container
@@ -0,0 +1 @@
+org.eclipse.wst.jsdt.launching.baseBrowserLibrary
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/.settings/org.eclipse.wst.jsdt.ui.superType.name b/examples/Sample App/DMS Sample App/src/.settings/org.eclipse.wst.jsdt.ui.superType.name
new file mode 100755
index 0000000..05bd71b
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/.settings/org.eclipse.wst.jsdt.ui.superType.name
@@ -0,0 +1 @@
+Window
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/Web/META-INF/MANIFEST.MF b/examples/Sample App/DMS Sample App/src/Web/META-INF/MANIFEST.MF
new file mode 100755
index 0000000..254272e
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Class-Path:
+
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/ara/webservice/ARAClassificationDetails.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/ara/webservice/ARAClassificationDetails.class
new file mode 100644
index 0000000..21d34d1
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/ara/webservice/ARAClassificationDetails.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/ara/webservice/ARAEnvironmentDetails.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/ara/webservice/ARAEnvironmentDetails.class
new file mode 100644
index 0000000..cc41461
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/ara/webservice/ARAEnvironmentDetails.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/ara/webservice/ARAFileDetails.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/ara/webservice/ARAFileDetails.class
new file mode 100644
index 0000000..06abcac
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/ara/webservice/ARAFileDetails.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/ara/webservice/ARAHotFolderDetails.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/ara/webservice/ARAHotFolderDetails.class
new file mode 100644
index 0000000..b6a1ed2
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/ara/webservice/ARAHotFolderDetails.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/ara/webservice/ARAOwnerDetails.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/ara/webservice/ARAOwnerDetails.class
new file mode 100644
index 0000000..fe31503
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/ara/webservice/ARAOwnerDetails.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/ara/webservice/ARARequestHandler.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/ara/webservice/ARARequestHandler.class
new file mode 100644
index 0000000..31e01ea
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/ara/webservice/ARARequestHandler.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/ara/webservice/ARAUserDetails.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/ara/webservice/ARAUserDetails.class
new file mode 100644
index 0000000..06232c5
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/ara/webservice/ARAUserDetails.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/ara/webservice/XMLHelper.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/ara/webservice/XMLHelper.class
new file mode 100644
index 0000000..ea2122b
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/ara/webservice/XMLHelper.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/config/SampleAppConfig.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/config/SampleAppConfig.class
new file mode 100644
index 0000000..004f71f
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/config/SampleAppConfig.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/config/SecloreWSClientConfig.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/config/SecloreWSClientConfig.class
new file mode 100644
index 0000000..af1659e
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/config/SecloreWSClientConfig.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/constant/Constants.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/constant/Constants.class
new file mode 100644
index 0000000..a4065b5
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/constant/Constants.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/AppData.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/AppData.class
new file mode 100644
index 0000000..33b4666
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/AppData.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/AppFile.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/AppFile.class
new file mode 100644
index 0000000..1f47e9e
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/AppFile.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/AppFolder.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/AppFolder.class
new file mode 100644
index 0000000..91495ed
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/AppFolder.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/Classification.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/Classification.class
new file mode 100644
index 0000000..a28ecb5
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/Classification.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/ClassificationData.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/ClassificationData.class
new file mode 100644
index 0000000..6d33aab
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/ClassificationData.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/FileActivityLog.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/FileActivityLog.class
new file mode 100644
index 0000000..9e73599
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/FileActivityLog.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/FileHtmlWrapInfo.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/FileHtmlWrapInfo.class
new file mode 100644
index 0000000..728588f
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/FileHtmlWrapInfo.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/FileMapAdapter$AdaptedFileMap.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/FileMapAdapter$AdaptedFileMap.class
new file mode 100644
index 0000000..bdcf4ab
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/FileMapAdapter$AdaptedFileMap.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/FileMapAdapter.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/FileMapAdapter.class
new file mode 100644
index 0000000..60588fe
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/FileMapAdapter.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/FileOpenTimeLog.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/FileOpenTimeLog.class
new file mode 100644
index 0000000..89fc9ce
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/FileOpenTimeLog.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/FolderMapAdapter$AdaptedFolderMap.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/FolderMapAdapter$AdaptedFolderMap.class
new file mode 100644
index 0000000..52d8ed2
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/FolderMapAdapter$AdaptedFolderMap.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/FolderMapAdapter.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/FolderMapAdapter.class
new file mode 100644
index 0000000..4d47255
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/FolderMapAdapter.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/IPGeoDetails.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/IPGeoDetails.class
new file mode 100644
index 0000000..c28e5cf
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/IPGeoDetails.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/Owner.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/Owner.class
new file mode 100644
index 0000000..4f5048b
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/Owner.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/UserRight.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/UserRight.class
new file mode 100644
index 0000000..f71e93c
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/UserRight.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/master/AppRights.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/master/AppRights.class
new file mode 100644
index 0000000..601cb66
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/master/AppRights.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/master/AppUsers.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/master/AppUsers.class
new file mode 100644
index 0000000..377c6e9
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/master/AppUsers.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/master/Rights.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/master/Rights.class
new file mode 100644
index 0000000..10c9102
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/master/Rights.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/master/RightsMapAdapter$AdaptedRights.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/master/RightsMapAdapter$AdaptedRights.class
new file mode 100644
index 0000000..b6d9a9f
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/master/RightsMapAdapter$AdaptedRights.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/master/RightsMapAdapter.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/master/RightsMapAdapter.class
new file mode 100644
index 0000000..1347652
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/master/RightsMapAdapter.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/master/User.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/master/User.class
new file mode 100644
index 0000000..75a5466
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/master/User.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/master/UserMapAdapter$AdaptedUser.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/master/UserMapAdapter$AdaptedUser.class
new file mode 100644
index 0000000..f2622ca
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/master/UserMapAdapter$AdaptedUser.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/master/UserMapAdapter.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/master/UserMapAdapter.class
new file mode 100644
index 0000000..46593c2
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/core/master/UserMapAdapter.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/filter/AuthorizationFilter.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/filter/AuthorizationFilter.class
new file mode 100644
index 0000000..3a5b99d
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/filter/AuthorizationFilter.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/home/servlet/HomeServlet.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/home/servlet/HomeServlet.class
new file mode 100644
index 0000000..07abfa0
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/home/servlet/HomeServlet.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/listener/ServletContextListenerImpl.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/listener/ServletContextListenerImpl.class
new file mode 100644
index 0000000..44095dd
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/listener/ServletContextListenerImpl.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/log/ChangeLoggerLevelServlet.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/log/ChangeLoggerLevelServlet.class
new file mode 100644
index 0000000..272da36
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/log/ChangeLoggerLevelServlet.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/log/GetAccessOnlineLogServlet.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/log/GetAccessOnlineLogServlet.class
new file mode 100644
index 0000000..f90de58
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/log/GetAccessOnlineLogServlet.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/log/GetLogServlet.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/log/GetLogServlet.class
new file mode 100644
index 0000000..79e28fa
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/log/GetLogServlet.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/security/service/SecurityService.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/security/service/SecurityService.class
new file mode 100644
index 0000000..1369433
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/security/service/SecurityService.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/file/CheckInFileServlet.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/file/CheckInFileServlet.class
new file mode 100644
index 0000000..66a7d52
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/file/CheckInFileServlet.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/file/DeleteFileServlet.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/file/DeleteFileServlet.class
new file mode 100644
index 0000000..4bfc0ca
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/file/DeleteFileServlet.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/file/DownloadFileServlet.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/file/DownloadFileServlet.class
new file mode 100644
index 0000000..498e4c7
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/file/DownloadFileServlet.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/file/FileListServlet.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/file/FileListServlet.class
new file mode 100644
index 0000000..7b0901e
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/file/FileListServlet.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/file/GetMapsForActivityAction.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/file/GetMapsForActivityAction.class
new file mode 100644
index 0000000..a1ffb0c
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/file/GetMapsForActivityAction.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/file/PreAddFileServlet.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/file/PreAddFileServlet.class
new file mode 100644
index 0000000..524b88d
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/file/PreAddFileServlet.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/file/PreEditFileServlet.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/file/PreEditFileServlet.class
new file mode 100644
index 0000000..5292a6e
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/file/PreEditFileServlet.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/file/SaveFileServlet$1.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/file/SaveFileServlet$1.class
new file mode 100644
index 0000000..8c9f97d
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/file/SaveFileServlet$1.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/file/SaveFileServlet.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/file/SaveFileServlet.class
new file mode 100644
index 0000000..9e21d27
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/file/SaveFileServlet.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/file/ViewFileLogsServlet.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/file/ViewFileLogsServlet.class
new file mode 100644
index 0000000..01da6d5
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/file/ViewFileLogsServlet.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/folder/DeleteFolderServlet.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/folder/DeleteFolderServlet.class
new file mode 100644
index 0000000..998f471
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/folder/DeleteFolderServlet.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/folder/FolderListServlet.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/folder/FolderListServlet.class
new file mode 100644
index 0000000..675bd95
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/folder/FolderListServlet.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/folder/PreCreateFolderServlet.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/folder/PreCreateFolderServlet.class
new file mode 100644
index 0000000..907978a
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/folder/PreCreateFolderServlet.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/folder/PreEditFolderServlet.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/folder/PreEditFolderServlet.class
new file mode 100644
index 0000000..9519509
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/folder/PreEditFolderServlet.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/folder/SaveFolderServlet.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/folder/SaveFolderServlet.class
new file mode 100644
index 0000000..4c5d2dd
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/servlet/folder/SaveFolderServlet.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/discovery/core/Discovery.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/discovery/core/Discovery.class
new file mode 100644
index 0000000..70e90e9
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/discovery/core/Discovery.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/discovery/core/DiscoveryVersion.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/discovery/core/DiscoveryVersion.class
new file mode 100644
index 0000000..137a47b
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/discovery/core/DiscoveryVersion.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/discovery/core/ProofKey.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/discovery/core/ProofKey.class
new file mode 100644
index 0000000..3b6757e
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/discovery/core/ProofKey.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/discovery/core/ProofKeyWrapper.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/discovery/core/ProofKeyWrapper.class
new file mode 100644
index 0000000..ff41389
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/discovery/core/ProofKeyWrapper.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/discovery/core/ProofKeys.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/discovery/core/ProofKeys.class
new file mode 100644
index 0000000..87b3165
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/discovery/core/ProofKeys.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/discovery/service/DiscoveryService.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/discovery/service/DiscoveryService.class
new file mode 100644
index 0000000..fa5505e
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/discovery/service/DiscoveryService.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/core/CheckFileResponse.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/core/CheckFileResponse.class
new file mode 100644
index 0000000..a9ac493
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/core/CheckFileResponse.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/core/CloseEventRequest.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/core/CloseEventRequest.class
new file mode 100644
index 0000000..e60fb5a
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/core/CloseEventRequest.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/core/OpenEventRequest.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/core/OpenEventRequest.class
new file mode 100644
index 0000000..df9aa76
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/core/OpenEventRequest.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/core/OpenRequestDetails.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/core/OpenRequestDetails.class
new file mode 100644
index 0000000..140da15
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/core/OpenRequestDetails.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/core/Options.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/core/Options.class
new file mode 100644
index 0000000..15e9b4b
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/core/Options.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/core/PreFlightResponse.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/core/PreFlightResponse.class
new file mode 100644
index 0000000..9b65af3
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/core/PreFlightResponse.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/core/RenewAccessTokenResponse.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/core/RenewAccessTokenResponse.class
new file mode 100644
index 0000000..6ab0613
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/core/RenewAccessTokenResponse.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/core/SessionContext.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/core/SessionContext.class
new file mode 100644
index 0000000..4586916
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/core/SessionContext.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/core/SessionState.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/core/SessionState.class
new file mode 100644
index 0000000..5438e64
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/core/SessionState.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/repository/SessionRepository.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/repository/SessionRepository.class
new file mode 100644
index 0000000..8f2f4bb
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/repository/SessionRepository.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/service/FileOpenService.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/service/FileOpenService.class
new file mode 100644
index 0000000..0d71c69
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/service/FileOpenService.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/service/IntegrationAPIService.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/service/IntegrationAPIService.class
new file mode 100644
index 0000000..92d8553
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/service/IntegrationAPIService.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/service/PreflightService.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/service/PreflightService.class
new file mode 100644
index 0000000..ea9b415
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/service/PreflightService.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/service/RestService.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/service/RestService.class
new file mode 100644
index 0000000..3b89af5
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/integration/service/RestService.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/servlet/RenewAccessTokenController.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/servlet/RenewAccessTokenController.class
new file mode 100644
index 0000000..c57660b
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/servlet/RenewAccessTokenController.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/servlet/SecloreOnlineAPIEndpoints.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/servlet/SecloreOnlineAPIEndpoints.class
new file mode 100644
index 0000000..11b89d2
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/so/servlet/SecloreOnlineAPIEndpoints.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/user/servlet/AddAppUserServlet.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/user/servlet/AddAppUserServlet.class
new file mode 100644
index 0000000..567d451
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/user/servlet/AddAppUserServlet.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/user/servlet/AppUserServlet.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/user/servlet/AppUserServlet.class
new file mode 100644
index 0000000..9027b5e
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/user/servlet/AppUserServlet.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/user/servlet/DeleteAppUserServlet.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/user/servlet/DeleteAppUserServlet.class
new file mode 100644
index 0000000..1bb0f19
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/user/servlet/DeleteAppUserServlet.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/user/servlet/SearchUserServlet.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/user/servlet/SearchUserServlet.class
new file mode 100644
index 0000000..cd2f86f
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/user/servlet/SearchUserServlet.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/user/servlet/UpdateAppUserServlet.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/user/servlet/UpdateAppUserServlet.class
new file mode 100644
index 0000000..e953666
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/user/servlet/UpdateAppUserServlet.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/util/CommonUtil.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/util/CommonUtil.class
new file mode 100644
index 0000000..84da2b3
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/util/CommonUtil.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/util/GeoLocationUtil.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/util/GeoLocationUtil.class
new file mode 100644
index 0000000..ee2fb6f
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/util/GeoLocationUtil.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/util/Global.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/util/Global.class
new file mode 100644
index 0000000..7519887
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/util/Global.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/util/LoggerUtil.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/util/LoggerUtil.class
new file mode 100644
index 0000000..4dd9955
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/util/LoggerUtil.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/util/ParserUtil.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/util/ParserUtil.class
new file mode 100644
index 0000000..c7b80b0
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/util/ParserUtil.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/util/PortalUtil.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/util/PortalUtil.class
new file mode 100644
index 0000000..6d5b15d
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/util/PortalUtil.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/util/SecloreProtectUtil.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/util/SecloreProtectUtil.class
new file mode 100644
index 0000000..bae8063
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/util/SecloreProtectUtil.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/util/xml/XMLDBService.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/util/xml/XMLDBService.class
new file mode 100644
index 0000000..f09d506
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/util/xml/XMLDBService.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/util/xml/XMLDataUtil.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/util/xml/XMLDataUtil.class
new file mode 100644
index 0000000..7771621
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/util/xml/XMLDataUtil.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/version/Version.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/version/Version.class
new file mode 100644
index 0000000..339176a
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/dms/version/Version.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/exceptions/AppFileNotFoundException.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/exceptions/AppFileNotFoundException.class
new file mode 100644
index 0000000..d71b09e
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/exceptions/AppFileNotFoundException.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/exceptions/AppFolderNotFoundException.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/exceptions/AppFolderNotFoundException.class
new file mode 100644
index 0000000..1605b80
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/exceptions/AppFolderNotFoundException.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/exceptions/DMSSampleException.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/exceptions/DMSSampleException.class
new file mode 100644
index 0000000..d089e3f
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/exceptions/DMSSampleException.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/exceptions/FileDetailsNotFoundException.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/exceptions/FileDetailsNotFoundException.class
new file mode 100644
index 0000000..823b38d
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/exceptions/FileDetailsNotFoundException.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/ps/db/DBConnection.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/ps/db/DBConnection.class
new file mode 100644
index 0000000..050d5d4
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/ps/db/DBConnection.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/webconnect/servlet/OpenFileServlet.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/webconnect/servlet/OpenFileServlet.class
new file mode 100644
index 0000000..b14455e
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/webconnect/servlet/OpenFileServlet.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/webconnect/servlet/PostChangeUserServlet.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/webconnect/servlet/PostChangeUserServlet.class
new file mode 100644
index 0000000..eda349c
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/webconnect/servlet/PostChangeUserServlet.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/webconnect/servlet/PreChangeUserServlet.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/webconnect/servlet/PreChangeUserServlet.class
new file mode 100644
index 0000000..7cb88f6
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/webconnect/servlet/PreChangeUserServlet.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/webconnect/servlet/ViewFileOnlineServlet.class b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/webconnect/servlet/ViewFileOnlineServlet.class
new file mode 100644
index 0000000..013399e
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/com/seclore/sample/webconnect/servlet/ViewFileOnlineServlet.class differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/log4j.properties b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/log4j.properties
new file mode 100755
index 0000000..172074e
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/classes/log4j.properties
@@ -0,0 +1,21 @@
+log4j.logger.SampleAppLogger=debug, SampleAppLogger
+log4j.appender.SampleAppLogger=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.SampleAppLogger.File=logs/SecloreSampleApp.log
+log4j.appender.SampleAppLogger.DatePattern='_'yyyy-MMM'.log'
+log4j.appender.SampleAppLogger.layout=org.apache.log4j.PatternLayout
+log4j.appender.SampleAppLogger.layout.ConversionPattern=%d{MMM dd, yyyy HH:mm:ss.SSS} %-5p: %m%n
+
+
+log4j.logger.AccessOnlineLogger=debug, AccessOnlineLogger
+log4j.appender.AccessOnlineLogger=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.AccessOnlineLogger.File=data/Access Online/AccessOnline.log
+log4j.appender.AccessOnlineLogger.DatePattern='_'yyyy-MMM'.log'
+log4j.appender.AccessOnlineLogger.layout=org.apache.log4j.PatternLayout
+log4j.appender.AccessOnlineLogger.layout.ConversionPattern=%d{MMM dd, yyyy HH:mm:ss.SSS} %-5p: %m%n
+
+# Root logger option
+#log4j.rootLogger=INFO, stdout
+#log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+#log4j.appender.stdout.Target=System.out
+#log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+#log4j.appender.stdout.layout.ConversionPattern=%d{dd-MM-yyyy HH:mm:ss} %-5p: %m%n
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/activation-1.1.1.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/activation-1.1.1.jar
new file mode 100755
index 0000000..1b703ab
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/activation-1.1.1.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/bc-fips-1.0.0.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/bc-fips-1.0.0.jar
new file mode 100755
index 0000000..321e563
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/bc-fips-1.0.0.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/bc-fips-1.0.2.4.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/bc-fips-1.0.2.4.jar
new file mode 100644
index 0000000..a38f9d0
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/bc-fips-1.0.2.4.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/bcprov-jdk15on-152.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/bcprov-jdk15on-152.jar
new file mode 100755
index 0000000..6c54dd9
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/bcprov-jdk15on-152.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/commons-codec-1.6.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/commons-codec-1.6.jar
new file mode 100644
index 0000000..ee1bc49
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/commons-codec-1.6.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/disruptor-3.3.7.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/disruptor-3.3.7.jar
new file mode 100644
index 0000000..1777a37
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/disruptor-3.3.7.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/fs-smaillibrary-1.2.7.0.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/fs-smaillibrary-1.2.7.0.jar
new file mode 100644
index 0000000..c01ec4a
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/fs-smaillibrary-1.2.7.0.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/fs-smaillibrary.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/fs-smaillibrary.jar
new file mode 100755
index 0000000..aa95e22
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/fs-smaillibrary.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/fs-ws-client-4.4.18.0.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/fs-ws-client-4.4.18.0.jar
new file mode 100644
index 0000000..d0a949c
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/fs-ws-client-4.4.18.0.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/fs-ws-client.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/fs-ws-client.jar
new file mode 100755
index 0000000..c9dea16
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/fs-ws-client.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/gson-2.2.4.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/gson-2.2.4.jar
new file mode 100755
index 0000000..9478253
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/gson-2.2.4.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/httpclient-4.5.13.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/httpclient-4.5.13.jar
new file mode 100755
index 0000000..218ee25
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/httpclient-4.5.13.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/httpcore-4.4.14.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/httpcore-4.4.14.jar
new file mode 100755
index 0000000..349db18
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/httpcore-4.4.14.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/jackson-annotations-2.12.3.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/jackson-annotations-2.12.3.jar
new file mode 100755
index 0000000..fd71f66
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/jackson-annotations-2.12.3.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/jackson-core-2.12.3.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/jackson-core-2.12.3.jar
new file mode 100755
index 0000000..3062f8f
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/jackson-core-2.12.3.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/jackson-databind-2.12.3.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/jackson-databind-2.12.3.jar
new file mode 100755
index 0000000..47efedf
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/jackson-databind-2.12.3.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/javassist-3.12.1.GA.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/javassist-3.12.1.GA.jar
new file mode 100755
index 0000000..aba1783
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/javassist-3.12.1.GA.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/javax.servlet.jsp.jstl-1.2.1.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/javax.servlet.jsp.jstl-1.2.1.jar
new file mode 100755
index 0000000..a86a365
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/javax.servlet.jsp.jstl-1.2.1.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/javax.servlet.jsp.jstl-api-1.2.1.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/javax.servlet.jsp.jstl-api-1.2.1.jar
new file mode 100755
index 0000000..4b3b433
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/javax.servlet.jsp.jstl-api-1.2.1.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/jaxb-api-2.3.0.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/jaxb-api-2.3.0.jar
new file mode 100755
index 0000000..0817c08
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/jaxb-api-2.3.0.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/jaxb-core-2.3.0.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/jaxb-core-2.3.0.jar
new file mode 100755
index 0000000..864ba31
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/jaxb-core-2.3.0.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/jaxb-impl-2.3.0.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/jaxb-impl-2.3.0.jar
new file mode 100755
index 0000000..02f50ab
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/jaxb-impl-2.3.0.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/jaxrs-api-3.0.9.Final.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/jaxrs-api-3.0.9.Final.jar
new file mode 100755
index 0000000..de09a61
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/jaxrs-api-3.0.9.Final.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/jcip-annotations-1.0.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/jcip-annotations-1.0.jar
new file mode 100755
index 0000000..06e9066
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/jcip-annotations-1.0.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/joda-time-2.3.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/joda-time-2.3.jar
new file mode 100755
index 0000000..9dce4f9
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/joda-time-2.3.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/jsr250-api-1.0.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/jsr250-api-1.0.jar
new file mode 100755
index 0000000..c1f29bf
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/jsr250-api-1.0.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/juniversalchardet-1.0.3.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/juniversalchardet-1.0.3.jar
new file mode 100755
index 0000000..1af703f
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/juniversalchardet-1.0.3.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/log4j-1.2.14.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/log4j-1.2.14.jar
new file mode 100755
index 0000000..6251307
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/log4j-1.2.14.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/log4j-api-2.10.0.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/log4j-api-2.10.0.jar
new file mode 100755
index 0000000..9603b1b
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/log4j-api-2.10.0.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/log4j-api-2.17.1.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/log4j-api-2.17.1.jar
new file mode 100644
index 0000000..1aae243
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/log4j-api-2.17.1.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/log4j-core-2.10.0.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/log4j-core-2.10.0.jar
new file mode 100755
index 0000000..1be9e67
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/log4j-core-2.10.0.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/log4j-core-2.17.1.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/log4j-core-2.17.1.jar
new file mode 100644
index 0000000..4682527
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/log4j-core-2.17.1.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/nimbus-jose-jwt-9.1.3.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/nimbus-jose-jwt-9.1.3.jar
new file mode 100755
index 0000000..7b7563f
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/nimbus-jose-jwt-9.1.3.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/resteasy-jaxrs-3.0.9.Final.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/resteasy-jaxrs-3.0.9.Final.jar
new file mode 100755
index 0000000..a7e2689
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/resteasy-jaxrs-3.0.9.Final.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/scannotation-1.0.2.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/scannotation-1.0.2.jar
new file mode 100755
index 0000000..599753a
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/scannotation-1.0.2.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/seclore-io-1.0.0.0.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/seclore-io-1.0.0.0.jar
new file mode 100644
index 0000000..365237b
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/seclore-io-1.0.0.0.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/xercesImpl-2.12.2.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/xercesImpl-2.12.2.jar
new file mode 100644
index 0000000..ccbae9f
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/xercesImpl-2.12.2.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/xercesImpl-X.jar b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/xercesImpl-X.jar
new file mode 100755
index 0000000..38fca83
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/lib/xercesImpl-X.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/WEB-INF/web.xml b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/web.xml
new file mode 100755
index 0000000..40d2bef
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/WEB-INF/web.xml
@@ -0,0 +1,82 @@
+
+
+ SecloreSampleApp
+
+
+ home
+
+
+
+
+ resteasy.use.builtin.providers
+ true
+
+
+
+
+ ara-resteasy-servlet
+ org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
+
+ resteasy.servlet.mapping.prefix
+ /services
+
+
+ resteasy.resources
+ com.seclore.sample.ara.webservice.ARARequestHandler
+
+
+
+
+ integration-resteasy-servlet
+ org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
+
+ resteasy.resources
+ com.seclore.sample.dms.so.servlet.SecloreOnlineAPIEndpoints,com.seclore.sample.dms.so.servlet.RenewAccessTokenController
+
+
+
+
+
+ ara-resteasy-servlet
+ /services/*
+
+
+
+ integration-resteasy-servlet
+ /seclore/1.0/*
+
+
+
+
+ Protected Context
+ /logs/*
+ /config/*
+ /data/*
+ /SECLORE_TEMP_FOLDER/*
+
+
+
+
+ 404
+ /portal/pages/pageNotFound404.jsp
+
+
+ 500
+ /portal/pages/serverError.jsp
+
+
+ java.lang.Throwable
+ /portal/pages/serverError.jsp
+
+
+ java.lang.IllegalStateException
+ /portal/pages/serverError.jsp
+
+
+ 60
+
+
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/Web/config/SampleAppConfig.properties b/examples/Sample App/DMS Sample App/src/Web/config/SampleAppConfig.properties
new file mode 100755
index 0000000..ca8118a
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/config/SampleAppConfig.properties
@@ -0,0 +1,64 @@
+#Provide the external reference id which is used while creating the HotFolder in Policy Server
+hotFolder.external.ref.id=
+
+#Configs required for Map features
+#Keep location.based.features.enable as false and other values as empty if not configured.
+location.based.features.enable=false
+ip.stack.api.key=
+mapbox.api.key=
+
+#Dummy user name when login context is missing a name.
+#Change it to any name of your choice.
+dummy.user.name=My file share user
+
+# Controls whether the open online mode is view or edit.
+# Set value as view to open the file in view mode.
+# Set value as edit to open the file in edit mode directly.
+open.online.mode=edit
+
+##########################################################
+
+#The Application URL of the DMS Sample App.
+#Example: https://www.acemegroup.com/integrationapp
+EnterpriseAppURL=
+
+#The Application URL of the deployed Seclore Online.
+#Example: https://www.acemegroup.com/secloreonline
+SecloreOnlineURL=
+
+# URL of the Policy Server of which the protected files will be opened via Seclore Online..
+#Example: https://www.acemegroup.com/policyserver
+PolicyServerURL=
+
+#########################Flags##################################
+
+#Allow the user to switch edit mode when the file is opened in view mode.
+#(i.e. Show Edit button when file is opened in View Mode).
+# Set value as 1 to allow showing the button.
+# Set value as 0 to deny showing the button.
+Allow-Edit=1
+
+#Controls whether the a copy of the file can be downloaded from Seclore Online Renderer.
+# Set value as 1 to allow download.
+# Set value as 0 to deny download.
+Allow-Download=1
+
+#Controls whether a file opened in edit mode can save back the edited changes to Seclore Online Integration App.
+# Set value as 1 to allow saveback.
+# Set value as 0 to deny saveback.
+Allow-Saveback=1
+
+#Controls whether the a unprotected copy of the file can be downloaded from Seclore Online Renderer.
+# Set value as 1 to allow.
+# Set value as 0 to deny.
+Allow-Unprotect-Download=1
+
+#Controls whether the copy of the editted file has to be mailed to the user after the file is closed.
+# Set value as 1 to allow.
+# Set value as 0 to deny.
+Email-Copy=1
+
+#Time value in Milliseconds to keep the Access Token Alive.
+#After expiry, Seclore Online will call the 'renewToken' endpoint to extend the expiry of the Access Token
+# Default set here is 1 hour.
+AccessTokenTimeToLive=3600000
diff --git a/examples/Sample App/DMS Sample App/src/Web/config/cabinet config.xml b/examples/Sample App/DMS Sample App/src/Web/config/cabinet config.xml
new file mode 100644
index 0000000..1d6eba7
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/config/cabinet config.xml
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+ false
+
+
+
+
+
+ false
+
+
+ en
+
+
+
+
+ 50
+
+ 900
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/Web/config/config.xml b/examples/Sample App/DMS Sample App/src/Web/config/config.xml
new file mode 100644
index 0000000..11362a7
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/config/config.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+ true
+
+ false
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/Web/config/log4j.properties b/examples/Sample App/DMS Sample App/src/Web/config/log4j.properties
new file mode 100755
index 0000000..dc04007
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/config/log4j.properties
@@ -0,0 +1,15 @@
+
+log4j.category.WSCLIENT=debug, WSCLIENT
+
+# If we want to change the Appender, we have to change
+# UtilFunction.initializeLoggers() too, because it assumes that the appender
+# is 'org.apache.log4j.RollingFileAppender' and changes path of the file by
+# getting appender from this logger.
+log4j.appender.WSCLIENT=com.seclore.fs.ws.client.logger.DailyZippedRollingFileAppender
+# Path of the file should be relative to application ROOT
+log4j.appender.WSCLIENT.File=logs/WSClient.log
+log4j.appender.WSCLIENT.MaxFileSize=5MB
+#log4j.appender.REQUEST_LOGGER.MaxBackupIndex=10
+log4j.appender.WSCLIENT.DatePattern='_'yyyy-MM-dd
+log4j.appender.WSCLIENT.layout=org.apache.log4j.PatternLayout
+log4j.appender.WSCLIENT.layout.ConversionPattern=%d{MMM dd, yyyy HH:mm:ss.SSS} %F:%L%n%p: %m%n
diff --git a/examples/Sample App/DMS Sample App/src/Web/config/log4j2.xml b/examples/Sample App/DMS Sample App/src/Web/config/log4j2.xml
new file mode 100644
index 0000000..0756304
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/config/log4j2.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+ ${ctx:applicationPath}/logs
+
+
+
+
+
+
+
+
+
+
+
+
+ UTF-8
+ %d{MMM dd, yyyy HH:mm:ss.SSS}: %t: %p: %m%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/Web/data/AppDataDB.xml b/examples/Sample App/DMS Sample App/src/Web/data/AppDataDB.xml
new file mode 100755
index 0000000..23b8360
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/data/AppDataDB.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/Web/data/Classification.xml b/examples/Sample App/DMS Sample App/src/Web/data/Classification.xml
new file mode 100755
index 0000000..2138b07
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/data/Classification.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/Web/data/RightsMaster.xml b/examples/Sample App/DMS Sample App/src/Web/data/RightsMaster.xml
new file mode 100755
index 0000000..86f23b8
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/data/RightsMaster.xml
@@ -0,0 +1,29 @@
+
+
+
+ 1
+ Read
+
+
+
+ 2
+ Read + Change
+
+
+
+ 3
+ Read + Print
+
+
+
+ 4
+ Read + Change + Print
+
+
+
+ 5
+ Full Control
+
+
+
+
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/Web/data/UserMaster.xml b/examples/Sample App/DMS Sample App/src/Web/data/UserMaster.xml
new file mode 100755
index 0000000..c36c46d
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/data/UserMaster.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/examples/Sample App/DMS Sample App/src/Web/index.jsp b/examples/Sample App/DMS Sample App/src/Web/index.jsp
new file mode 100755
index 0000000..2c2ecbf
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/index.jsp
@@ -0,0 +1,13 @@
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
+
+
+
+
+Insert title here
+
+
+ <%
+ response.sendRedirect("home");
+ return;
+ %>
+
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/css/bootstrap-theme.css b/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/css/bootstrap-theme.css
new file mode 100755
index 0000000..c4cadf1
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/css/bootstrap-theme.css
@@ -0,0 +1,470 @@
+/*!
+ * Bootstrap v3.3.1 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+.btn-default,
+.btn-primary,
+.btn-success,
+.btn-info,
+.btn-warning,
+.btn-danger {
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
+}
+.btn-default:active,
+.btn-primary:active,
+.btn-success:active,
+.btn-info:active,
+.btn-warning:active,
+.btn-danger:active,
+.btn-default.active,
+.btn-primary.active,
+.btn-success.active,
+.btn-info.active,
+.btn-warning.active,
+.btn-danger.active {
+ -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+ box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+}
+.btn-default .badge,
+.btn-primary .badge,
+.btn-success .badge,
+.btn-info .badge,
+.btn-warning .badge,
+.btn-danger .badge {
+ text-shadow: none;
+}
+.btn:active,
+.btn.active {
+ background-image: none;
+}
+.btn-default {
+ text-shadow: 0 1px 0 #fff;
+ background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);
+ background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));
+ background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+ background-repeat: repeat-x;
+ border-color: #dbdbdb;
+ border-color: #ccc;
+}
+.btn-default:hover,
+.btn-default:focus {
+ background-color: #e0e0e0;
+ background-position: 0 -15px;
+}
+.btn-default:active,
+.btn-default.active {
+ background-color: #e0e0e0;
+ border-color: #dbdbdb;
+}
+.btn-default:disabled,
+.btn-default[disabled] {
+ background-color: #e0e0e0;
+ background-image: none;
+}
+.btn-primary {
+ background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);
+ background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88));
+ background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+ background-repeat: repeat-x;
+ border-color: #245580;
+}
+.btn-primary:hover,
+.btn-primary:focus {
+ background-color: #265a88;
+ background-position: 0 -15px;
+}
+.btn-primary:active,
+.btn-primary.active {
+ background-color: #265a88;
+ border-color: #245580;
+}
+.btn-primary:disabled,
+.btn-primary[disabled] {
+ background-color: #265a88;
+ background-image: none;
+}
+.btn-success {
+ background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);
+ background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));
+ background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+ background-repeat: repeat-x;
+ border-color: #3e8f3e;
+}
+.btn-success:hover,
+.btn-success:focus {
+ background-color: #419641;
+ background-position: 0 -15px;
+}
+.btn-success:active,
+.btn-success.active {
+ background-color: #419641;
+ border-color: #3e8f3e;
+}
+.btn-success:disabled,
+.btn-success[disabled] {
+ background-color: #419641;
+ background-image: none;
+}
+.btn-info {
+ background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
+ background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));
+ background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+ background-repeat: repeat-x;
+ border-color: #28a4c9;
+}
+.btn-info:hover,
+.btn-info:focus {
+ background-color: #2aabd2;
+ background-position: 0 -15px;
+}
+.btn-info:active,
+.btn-info.active {
+ background-color: #2aabd2;
+ border-color: #28a4c9;
+}
+.btn-info:disabled,
+.btn-info[disabled] {
+ background-color: #2aabd2;
+ background-image: none;
+}
+.btn-warning {
+ background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
+ background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));
+ background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+ background-repeat: repeat-x;
+ border-color: #e38d13;
+}
+.btn-warning:hover,
+.btn-warning:focus {
+ background-color: #eb9316;
+ background-position: 0 -15px;
+}
+.btn-warning:active,
+.btn-warning.active {
+ background-color: #eb9316;
+ border-color: #e38d13;
+}
+.btn-warning:disabled,
+.btn-warning[disabled] {
+ background-color: #eb9316;
+ background-image: none;
+}
+.btn-danger {
+ background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
+ background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));
+ background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+ background-repeat: repeat-x;
+ border-color: #b92c28;
+}
+.btn-danger:hover,
+.btn-danger:focus {
+ background-color: #c12e2a;
+ background-position: 0 -15px;
+}
+.btn-danger:active,
+.btn-danger.active {
+ background-color: #c12e2a;
+ border-color: #b92c28;
+}
+.btn-danger:disabled,
+.btn-danger[disabled] {
+ background-color: #c12e2a;
+ background-image: none;
+}
+.thumbnail,
+.img-thumbnail {
+ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
+ box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
+}
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus {
+ background-color: #e8e8e8;
+ background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+ background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
+ background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
+ background-repeat: repeat-x;
+}
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+ background-color: #2e6da4;
+ background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+ background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
+ background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
+ background-repeat: repeat-x;
+}
+.navbar-default {
+ background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);
+ background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%);
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8));
+ background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+ background-repeat: repeat-x;
+ border-radius: 4px;
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
+}
+.navbar-default .navbar-nav > .open > a,
+.navbar-default .navbar-nav > .active > a {
+ background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
+ background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));
+ background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);
+ background-repeat: repeat-x;
+ -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
+ box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
+}
+.navbar-brand,
+.navbar-nav > li > a {
+ text-shadow: 0 1px 0 rgba(255, 255, 255, .25);
+}
+.navbar-inverse {
+ background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);
+ background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));
+ background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+ background-repeat: repeat-x;
+}
+.navbar-inverse .navbar-nav > .open > a,
+.navbar-inverse .navbar-nav > .active > a {
+ background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);
+ background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));
+ background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);
+ background-repeat: repeat-x;
+ -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
+ box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
+}
+.navbar-inverse .navbar-brand,
+.navbar-inverse .navbar-nav > li > a {
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);
+}
+.navbar-static-top,
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+ border-radius: 0;
+}
+@media (max-width: 767px) {
+ .navbar .navbar-nav .open .dropdown-menu > .active > a,
+ .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,
+ .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {
+ color: #fff;
+ background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+ background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
+ background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
+ background-repeat: repeat-x;
+ }
+}
+.alert {
+ text-shadow: 0 1px 0 rgba(255, 255, 255, .2);
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
+}
+.alert-success {
+ background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
+ background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));
+ background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);
+ background-repeat: repeat-x;
+ border-color: #b2dba1;
+}
+.alert-info {
+ background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
+ background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));
+ background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);
+ background-repeat: repeat-x;
+ border-color: #9acfea;
+}
+.alert-warning {
+ background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
+ background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));
+ background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);
+ background-repeat: repeat-x;
+ border-color: #f5e79e;
+}
+.alert-danger {
+ background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
+ background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));
+ background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);
+ background-repeat: repeat-x;
+ border-color: #dca7a7;
+}
+.progress {
+ background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
+ background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));
+ background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);
+ background-repeat: repeat-x;
+}
+.progress-bar {
+ background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);
+ background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090));
+ background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);
+ background-repeat: repeat-x;
+}
+.progress-bar-success {
+ background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);
+ background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));
+ background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);
+ background-repeat: repeat-x;
+}
+.progress-bar-info {
+ background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
+ background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));
+ background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);
+ background-repeat: repeat-x;
+}
+.progress-bar-warning {
+ background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
+ background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));
+ background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);
+ background-repeat: repeat-x;
+}
+.progress-bar-danger {
+ background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);
+ background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));
+ background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);
+ background-repeat: repeat-x;
+}
+.progress-bar-striped {
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+ background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+.list-group {
+ border-radius: 4px;
+ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
+ box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
+}
+.list-group-item.active,
+.list-group-item.active:hover,
+.list-group-item.active:focus {
+ text-shadow: 0 -1px 0 #286090;
+ background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);
+ background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a));
+ background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);
+ background-repeat: repeat-x;
+ border-color: #2b669a;
+}
+.list-group-item.active .badge,
+.list-group-item.active:hover .badge,
+.list-group-item.active:focus .badge {
+ text-shadow: none;
+}
+.panel {
+ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
+ box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
+}
+.panel-default > .panel-heading {
+ background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+ background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
+ background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
+ background-repeat: repeat-x;
+}
+.panel-primary > .panel-heading {
+ background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+ background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
+ background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
+ background-repeat: repeat-x;
+}
+.panel-success > .panel-heading {
+ background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
+ background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));
+ background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);
+ background-repeat: repeat-x;
+}
+.panel-info > .panel-heading {
+ background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
+ background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));
+ background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);
+ background-repeat: repeat-x;
+}
+.panel-warning > .panel-heading {
+ background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
+ background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));
+ background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);
+ background-repeat: repeat-x;
+}
+.panel-danger > .panel-heading {
+ background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
+ background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));
+ background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);
+ background-repeat: repeat-x;
+}
+.well {
+ background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
+ background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));
+ background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);
+ background-repeat: repeat-x;
+ border-color: #dcdcdc;
+ -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
+ box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
+}
+/*# sourceMappingURL=bootstrap-theme.css.map */
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/css/bootstrap-theme.css.map b/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/css/bootstrap-theme.css.map
new file mode 100755
index 0000000..016a8da
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/css/bootstrap-theme.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["less/theme.less","less/mixins/vendor-prefixes.less","bootstrap-theme.css","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"AAcA;;;;;;EAME,0CAAA;ECgDA,6FAAA;EACQ,qFAAA;EC5DT;AFgBC;;;;;;;;;;;;EC2CA,0DAAA;EACQ,kDAAA;EC7CT;AFVD;;;;;;EAiBI,mBAAA;EECH;AFgCC;;EAEE,wBAAA;EE9BH;AFmCD;EGlDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJiCA,6BAAA;EACA,uBAAA;EA+B2C,2BAAA;EAA2B,oBAAA;EExBvE;AFLC;;EAEE,2BAAA;EACA,8BAAA;EEOH;AFJC;;EAEE,2BAAA;EACA,uBAAA;EEMH;AFHC;;EAEE,2BAAA;EACA,wBAAA;EEKH;AFUD;EGnDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJiCA,6BAAA;EACA,uBAAA;EE+BD;AF7BC;;EAEE,2BAAA;EACA,8BAAA;EE+BH;AF5BC;;EAEE,2BAAA;EACA,uBAAA;EE8BH;AF3BC;;EAEE,2BAAA;EACA,wBAAA;EE6BH;AFbD;EGpDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJiCA,6BAAA;EACA,uBAAA;EEuDD;AFrDC;;EAEE,2BAAA;EACA,8BAAA;EEuDH;AFpDC;;EAEE,2BAAA;EACA,uBAAA;EEsDH;AFnDC;;EAEE,2BAAA;EACA,wBAAA;EEqDH;AFpCD;EGrDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJiCA,6BAAA;EACA,uBAAA;EE+ED;AF7EC;;EAEE,2BAAA;EACA,8BAAA;EE+EH;AF5EC;;EAEE,2BAAA;EACA,uBAAA;EE8EH;AF3EC;;EAEE,2BAAA;EACA,wBAAA;EE6EH;AF3DD;EGtDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJiCA,6BAAA;EACA,uBAAA;EEuGD;AFrGC;;EAEE,2BAAA;EACA,8BAAA;EEuGH;AFpGC;;EAEE,2BAAA;EACA,uBAAA;EEsGH;AFnGC;;EAEE,2BAAA;EACA,wBAAA;EEqGH;AFlFD;EGvDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJiCA,6BAAA;EACA,uBAAA;EE+HD;AF7HC;;EAEE,2BAAA;EACA,8BAAA;EE+HH;AF5HC;;EAEE,2BAAA;EACA,uBAAA;EE8HH;AF3HC;;EAEE,2BAAA;EACA,wBAAA;EE6HH;AFnGD;;ECfE,oDAAA;EACQ,4CAAA;ECsHT;AF9FD;;EGxEI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EHuEF,2BAAA;EEoGD;AFlGD;;;EG7EI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH6EF,2BAAA;EEwGD;AF/FD;EG1FI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ECnBF,qEAAA;EJ4GA,oBAAA;EC9CA,6FAAA;EACQ,qFAAA;ECoJT;AF1GD;;EG1FI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EF2CF,0DAAA;EACQ,kDAAA;EC8JT;AFvGD;;EAEE,gDAAA;EEyGD;AFrGD;EG7GI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ECnBF,qEAAA;EFyOD;AF7GD;;EG7GI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EF2CF,yDAAA;EACQ,iDAAA;ECoLT;AFvHD;;EAYI,2CAAA;EE+GH;AF1GD;;;EAGE,kBAAA;EE4GD;AF5FD;EAVI;;;IAGE,aAAA;IG1IF,0EAAA;IACA,qEAAA;IACA,+FAAA;IAAA,wEAAA;IACA,6BAAA;IACA,wHAAA;IDoPD;EACF;AFnGD;EACE,+CAAA;ECxGA,4FAAA;EACQ,oFAAA;EC8MT;AF3FD;EGnKI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH2JF,uBAAA;EEuGD;AFlGD;EGpKI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH2JF,uBAAA;EE+GD;AFzGD;EGrKI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH2JF,uBAAA;EEuHD;AFhHD;EGtKI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH2JF,uBAAA;EE+HD;AFhHD;EG9KI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDiSH;AF7GD;EGxLI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDwSH;AFnHD;EGzLI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED+SH;AFzHD;EG1LI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDsTH;AF/HD;EG3LI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED6TH;AFrID;EG5LI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDoUH;AFxID;EG/JI,+MAAA;EACA,0MAAA;EACA,uMAAA;ED0SH;AFpID;EACE,oBAAA;EC3JA,oDAAA;EACQ,4CAAA;ECkST;AFrID;;;EAGE,+BAAA;EGhNE,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH8MF,uBAAA;EE2ID;AFhJD;;;EAQI,mBAAA;EE6IH;AFnID;EChLE,mDAAA;EACQ,2CAAA;ECsTT;AF7HD;EGzOI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDyWH;AFnID;EG1OI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDgXH;AFzID;EG3OI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDuXH;AF/ID;EG5OI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED8XH;AFrJD;EG7OI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDqYH;AF3JD;EG9OI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED4YH;AF3JD;EGrPI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EHmPF,uBAAA;ECxMA,2FAAA;EACQ,mFAAA;EC0WT","file":"bootstrap-theme.css","sourcesContent":["\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &:disabled,\n &[disabled] {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // See https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n",".btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default:disabled,\n.btn-default[disabled] {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary:disabled,\n.btn-primary[disabled] {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success:disabled,\n.btn-success[disabled] {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info:disabled,\n.btn-info[disabled] {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning:disabled,\n.btn-warning[disabled] {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger:disabled,\n.btn-danger[disabled] {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222222 100%);\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n}\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]}
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/css/bootstrap-theme.min.css b/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/css/bootstrap-theme.min.css
new file mode 100755
index 0000000..4c3e7ba
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/css/bootstrap-theme.min.css
@@ -0,0 +1,5 @@
+/*!
+ * Bootstrap v3.3.1 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-default .badge,.btn-primary .badge,.btn-success .badge,.btn-info .badge,.btn-warning .badge,.btn-danger .badge{text-shadow:none}.btn:active,.btn.active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default:disabled,.btn-default[disabled]{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:hover,.btn-primary:focus{background-color:#265a88;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#265a88;border-color:#245580}.btn-primary:disabled,.btn-primary[disabled]{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-success:disabled,.btn-success[disabled]{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.btn-info:disabled,.btn-info[disabled]{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-warning:disabled,.btn-warning[disabled]{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.btn-danger:disabled,.btn-danger[disabled]{background-color:#c12e2a;background-image:none}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:hover .badge,.list-group-item.active:focus .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)}
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/css/bootstrap.css b/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/css/bootstrap.css
new file mode 100755
index 0000000..c6f3d21
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/css/bootstrap.css
@@ -0,0 +1,6332 @@
+/*!
+ * Bootstrap v3.3.1 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+/*! normalize.css v3.0.2 | MIT License | git.io/normalize */
+html {
+ font-family: sans-serif;
+ -webkit-text-size-adjust: 100%;
+ -ms-text-size-adjust: 100%;
+}
+body {
+ margin: 0;
+}
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+menu,
+nav,
+section,
+summary {
+ display: block;
+}
+audio,
+canvas,
+progress,
+video {
+ display: inline-block;
+ vertical-align: baseline;
+}
+audio:not([controls]) {
+ display: none;
+ height: 0;
+}
+[hidden],
+template {
+ display: none;
+}
+a {
+ background-color: transparent;
+}
+a:active,
+a:hover {
+ outline: 0;
+}
+abbr[title] {
+ border-bottom: 1px dotted;
+}
+b,
+strong {
+ font-weight: bold;
+}
+dfn {
+ font-style: italic;
+}
+h1 {
+ margin: .67em 0;
+ font-size: 2em;
+}
+mark {
+ color: #000;
+ background: #ff0;
+}
+small {
+ font-size: 80%;
+}
+sub,
+sup {
+ position: relative;
+ font-size: 75%;
+ line-height: 0;
+ vertical-align: baseline;
+}
+sup {
+ top: -.5em;
+}
+sub {
+ bottom: -.25em;
+}
+img {
+ border: 0;
+}
+svg:not(:root) {
+ overflow: hidden;
+}
+figure {
+ margin: 1em 40px;
+}
+hr {
+ height: 0;
+ -webkit-box-sizing: content-box;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+}
+pre {
+ overflow: auto;
+}
+code,
+kbd,
+pre,
+samp {
+ font-family: monospace, monospace;
+ font-size: 1em;
+}
+button,
+input,
+optgroup,
+select,
+textarea {
+ margin: 0;
+ font: inherit;
+ color: inherit;
+}
+button {
+ overflow: visible;
+}
+button,
+select {
+ text-transform: none;
+}
+button,
+html input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+ -webkit-appearance: button;
+ cursor: pointer;
+}
+button[disabled],
+html input[disabled] {
+ cursor: default;
+}
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+ padding: 0;
+ border: 0;
+}
+input {
+ line-height: normal;
+}
+input[type="checkbox"],
+input[type="radio"] {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ padding: 0;
+}
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+ height: auto;
+}
+input[type="search"] {
+ -webkit-box-sizing: content-box;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ -webkit-appearance: textfield;
+}
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+fieldset {
+ padding: .35em .625em .75em;
+ margin: 0 2px;
+ border: 1px solid #c0c0c0;
+}
+legend {
+ padding: 0;
+ border: 0;
+}
+textarea {
+ overflow: auto;
+}
+optgroup {
+ font-weight: bold;
+}
+table {
+ border-spacing: 0;
+ border-collapse: collapse;
+}
+td,
+th {
+ padding: 0;
+}
+/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */
+@media print {
+ *,
+ *:before,
+ *:after {
+ color: #000 !important;
+ text-shadow: none !important;
+ background: transparent !important;
+ -webkit-box-shadow: none !important;
+ box-shadow: none !important;
+ }
+ a,
+ a:visited {
+ text-decoration: underline;
+ }
+ a[href]:after {
+ content: " (" attr(href) ")";
+ }
+ abbr[title]:after {
+ content: " (" attr(title) ")";
+ }
+ a[href^="#"]:after,
+ a[href^="javascript:"]:after {
+ content: "";
+ }
+ pre,
+ blockquote {
+ border: 1px solid #999;
+
+ page-break-inside: avoid;
+ }
+ thead {
+ display: table-header-group;
+ }
+ tr,
+ img {
+ page-break-inside: avoid;
+ }
+ img {
+ max-width: 100% !important;
+ }
+ p,
+ h2,
+ h3 {
+ orphans: 3;
+ widows: 3;
+ }
+ h2,
+ h3 {
+ page-break-after: avoid;
+ }
+ select {
+ background: #fff !important;
+ }
+ .navbar {
+ display: none;
+ }
+ .btn > .caret,
+ .dropup > .btn > .caret {
+ border-top-color: #000 !important;
+ }
+ .label {
+ border: 1px solid #000;
+ }
+ .table {
+ border-collapse: collapse !important;
+ }
+ .table td,
+ .table th {
+ background-color: #fff !important;
+ }
+ .table-bordered th,
+ .table-bordered td {
+ border: 1px solid #ddd !important;
+ }
+}
+@font-face {
+ font-family: 'Glyphicons Halflings';
+
+ src: url('../fonts/glyphicons-halflings-regular.eot');
+ src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');
+}
+.glyphicon {
+ position: relative;
+ top: 1px;
+ display: inline-block;
+ font-family: 'Glyphicons Halflings';
+ font-style: normal;
+ font-weight: normal;
+ line-height: 1;
+
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+.glyphicon-asterisk:before {
+ content: "\2a";
+}
+.glyphicon-plus:before {
+ content: "\2b";
+}
+.glyphicon-euro:before,
+.glyphicon-eur:before {
+ content: "\20ac";
+}
+.glyphicon-minus:before {
+ content: "\2212";
+}
+.glyphicon-cloud:before {
+ content: "\2601";
+}
+.glyphicon-envelope:before {
+ content: "\2709";
+}
+.glyphicon-pencil:before {
+ content: "\270f";
+}
+.glyphicon-glass:before {
+ content: "\e001";
+}
+.glyphicon-music:before {
+ content: "\e002";
+}
+.glyphicon-search:before {
+ content: "\e003";
+}
+.glyphicon-heart:before {
+ content: "\e005";
+}
+.glyphicon-star:before {
+ content: "\e006";
+}
+.glyphicon-star-empty:before {
+ content: "\e007";
+}
+.glyphicon-user:before {
+ content: "\e008";
+}
+.glyphicon-film:before {
+ content: "\e009";
+}
+.glyphicon-th-large:before {
+ content: "\e010";
+}
+.glyphicon-th:before {
+ content: "\e011";
+}
+.glyphicon-th-list:before {
+ content: "\e012";
+}
+.glyphicon-ok:before {
+ content: "\e013";
+}
+.glyphicon-remove:before {
+ content: "\e014";
+}
+.glyphicon-zoom-in:before {
+ content: "\e015";
+}
+.glyphicon-zoom-out:before {
+ content: "\e016";
+}
+.glyphicon-off:before {
+ content: "\e017";
+}
+.glyphicon-signal:before {
+ content: "\e018";
+}
+.glyphicon-cog:before {
+ content: "\e019";
+}
+.glyphicon-trash:before {
+ content: "\e020";
+}
+.glyphicon-home:before {
+ content: "\e021";
+}
+.glyphicon-file:before {
+ content: "\e022";
+}
+.glyphicon-time:before {
+ content: "\e023";
+}
+.glyphicon-road:before {
+ content: "\e024";
+}
+.glyphicon-download-alt:before {
+ content: "\e025";
+}
+.glyphicon-download:before {
+ content: "\e026";
+}
+.glyphicon-upload:before {
+ content: "\e027";
+}
+.glyphicon-inbox:before {
+ content: "\e028";
+}
+.glyphicon-play-circle:before {
+ content: "\e029";
+}
+.glyphicon-repeat:before {
+ content: "\e030";
+}
+.glyphicon-refresh:before {
+ content: "\e031";
+}
+.glyphicon-list-alt:before {
+ content: "\e032";
+}
+.glyphicon-lock:before {
+ content: "\e033";
+}
+.glyphicon-flag:before {
+ content: "\e034";
+}
+.glyphicon-headphones:before {
+ content: "\e035";
+}
+.glyphicon-volume-off:before {
+ content: "\e036";
+}
+.glyphicon-volume-down:before {
+ content: "\e037";
+}
+.glyphicon-volume-up:before {
+ content: "\e038";
+}
+.glyphicon-qrcode:before {
+ content: "\e039";
+}
+.glyphicon-barcode:before {
+ content: "\e040";
+}
+.glyphicon-tag:before {
+ content: "\e041";
+}
+.glyphicon-tags:before {
+ content: "\e042";
+}
+.glyphicon-book:before {
+ content: "\e043";
+}
+.glyphicon-bookmark:before {
+ content: "\e044";
+}
+.glyphicon-print:before {
+ content: "\e045";
+}
+.glyphicon-camera:before {
+ content: "\e046";
+}
+.glyphicon-font:before {
+ content: "\e047";
+}
+.glyphicon-bold:before {
+ content: "\e048";
+}
+.glyphicon-italic:before {
+ content: "\e049";
+}
+.glyphicon-text-height:before {
+ content: "\e050";
+}
+.glyphicon-text-width:before {
+ content: "\e051";
+}
+.glyphicon-align-left:before {
+ content: "\e052";
+}
+.glyphicon-align-center:before {
+ content: "\e053";
+}
+.glyphicon-align-right:before {
+ content: "\e054";
+}
+.glyphicon-align-justify:before {
+ content: "\e055";
+}
+.glyphicon-list:before {
+ content: "\e056";
+}
+.glyphicon-indent-left:before {
+ content: "\e057";
+}
+.glyphicon-indent-right:before {
+ content: "\e058";
+}
+.glyphicon-facetime-video:before {
+ content: "\e059";
+}
+.glyphicon-picture:before {
+ content: "\e060";
+}
+.glyphicon-map-marker:before {
+ content: "\e062";
+}
+.glyphicon-adjust:before {
+ content: "\e063";
+}
+.glyphicon-tint:before {
+ content: "\e064";
+}
+.glyphicon-edit:before {
+ content: "\e065";
+}
+.glyphicon-share:before {
+ content: "\e066";
+}
+.glyphicon-check:before {
+ content: "\e067";
+}
+.glyphicon-move:before {
+ content: "\e068";
+}
+.glyphicon-step-backward:before {
+ content: "\e069";
+}
+.glyphicon-fast-backward:before {
+ content: "\e070";
+}
+.glyphicon-backward:before {
+ content: "\e071";
+}
+.glyphicon-play:before {
+ content: "\e072";
+}
+.glyphicon-pause:before {
+ content: "\e073";
+}
+.glyphicon-stop:before {
+ content: "\e074";
+}
+.glyphicon-forward:before {
+ content: "\e075";
+}
+.glyphicon-fast-forward:before {
+ content: "\e076";
+}
+.glyphicon-step-forward:before {
+ content: "\e077";
+}
+.glyphicon-eject:before {
+ content: "\e078";
+}
+.glyphicon-chevron-left:before {
+ content: "\e079";
+}
+.glyphicon-chevron-right:before {
+ content: "\e080";
+}
+.glyphicon-plus-sign:before {
+ content: "\e081";
+}
+.glyphicon-minus-sign:before {
+ content: "\e082";
+}
+.glyphicon-remove-sign:before {
+ content: "\e083";
+}
+.glyphicon-ok-sign:before {
+ content: "\e084";
+}
+.glyphicon-question-sign:before {
+ content: "\e085";
+}
+.glyphicon-info-sign:before {
+ content: "\e086";
+}
+.glyphicon-screenshot:before {
+ content: "\e087";
+}
+.glyphicon-remove-circle:before {
+ content: "\e088";
+}
+.glyphicon-ok-circle:before {
+ content: "\e089";
+}
+.glyphicon-ban-circle:before {
+ content: "\e090";
+}
+.glyphicon-arrow-left:before {
+ content: "\e091";
+}
+.glyphicon-arrow-right:before {
+ content: "\e092";
+}
+.glyphicon-arrow-up:before {
+ content: "\e093";
+}
+.glyphicon-arrow-down:before {
+ content: "\e094";
+}
+.glyphicon-share-alt:before {
+ content: "\e095";
+}
+.glyphicon-resize-full:before {
+ content: "\e096";
+}
+.glyphicon-resize-small:before {
+ content: "\e097";
+}
+.glyphicon-exclamation-sign:before {
+ content: "\e101";
+}
+.glyphicon-gift:before {
+ content: "\e102";
+}
+.glyphicon-leaf:before {
+ content: "\e103";
+}
+.glyphicon-fire:before {
+ content: "\e104";
+}
+.glyphicon-eye-open:before {
+ content: "\e105";
+}
+.glyphicon-eye-close:before {
+ content: "\e106";
+}
+.glyphicon-warning-sign:before {
+ content: "\e107";
+}
+.glyphicon-plane:before {
+ content: "\e108";
+}
+.glyphicon-calendar:before {
+ content: "\e109";
+}
+.glyphicon-random:before {
+ content: "\e110";
+}
+.glyphicon-comment:before {
+ content: "\e111";
+}
+.glyphicon-magnet:before {
+ content: "\e112";
+}
+.glyphicon-chevron-up:before {
+ content: "\e113";
+}
+.glyphicon-chevron-down:before {
+ content: "\e114";
+}
+.glyphicon-retweet:before {
+ content: "\e115";
+}
+.glyphicon-shopping-cart:before {
+ content: "\e116";
+}
+.glyphicon-folder-close:before {
+ content: "\e117";
+}
+.glyphicon-folder-open:before {
+ content: "\e118";
+}
+.glyphicon-resize-vertical:before {
+ content: "\e119";
+}
+.glyphicon-resize-horizontal:before {
+ content: "\e120";
+}
+.glyphicon-hdd:before {
+ content: "\e121";
+}
+.glyphicon-bullhorn:before {
+ content: "\e122";
+}
+.glyphicon-bell:before {
+ content: "\e123";
+}
+.glyphicon-certificate:before {
+ content: "\e124";
+}
+.glyphicon-thumbs-up:before {
+ content: "\e125";
+}
+.glyphicon-thumbs-down:before {
+ content: "\e126";
+}
+.glyphicon-hand-right:before {
+ content: "\e127";
+}
+.glyphicon-hand-left:before {
+ content: "\e128";
+}
+.glyphicon-hand-up:before {
+ content: "\e129";
+}
+.glyphicon-hand-down:before {
+ content: "\e130";
+}
+.glyphicon-circle-arrow-right:before {
+ content: "\e131";
+}
+.glyphicon-circle-arrow-left:before {
+ content: "\e132";
+}
+.glyphicon-circle-arrow-up:before {
+ content: "\e133";
+}
+.glyphicon-circle-arrow-down:before {
+ content: "\e134";
+}
+.glyphicon-globe:before {
+ content: "\e135";
+}
+.glyphicon-wrench:before {
+ content: "\e136";
+}
+.glyphicon-tasks:before {
+ content: "\e137";
+}
+.glyphicon-filter:before {
+ content: "\e138";
+}
+.glyphicon-briefcase:before {
+ content: "\e139";
+}
+.glyphicon-fullscreen:before {
+ content: "\e140";
+}
+.glyphicon-dashboard:before {
+ content: "\e141";
+}
+.glyphicon-paperclip:before {
+ content: "\e142";
+}
+.glyphicon-heart-empty:before {
+ content: "\e143";
+}
+.glyphicon-link:before {
+ content: "\e144";
+}
+.glyphicon-phone:before {
+ content: "\e145";
+}
+.glyphicon-pushpin:before {
+ content: "\e146";
+}
+.glyphicon-usd:before {
+ content: "\e148";
+}
+.glyphicon-gbp:before {
+ content: "\e149";
+}
+.glyphicon-sort:before {
+ content: "\e150";
+}
+.glyphicon-sort-by-alphabet:before {
+ content: "\e151";
+}
+.glyphicon-sort-by-alphabet-alt:before {
+ content: "\e152";
+}
+.glyphicon-sort-by-order:before {
+ content: "\e153";
+}
+.glyphicon-sort-by-order-alt:before {
+ content: "\e154";
+}
+.glyphicon-sort-by-attributes:before {
+ content: "\e155";
+}
+.glyphicon-sort-by-attributes-alt:before {
+ content: "\e156";
+}
+.glyphicon-unchecked:before {
+ content: "\e157";
+}
+.glyphicon-expand:before {
+ content: "\e158";
+}
+.glyphicon-collapse-down:before {
+ content: "\e159";
+}
+.glyphicon-collapse-up:before {
+ content: "\e160";
+}
+.glyphicon-log-in:before {
+ content: "\e161";
+}
+.glyphicon-flash:before {
+ content: "\e162";
+}
+.glyphicon-log-out:before {
+ content: "\e163";
+}
+.glyphicon-new-window:before {
+ content: "\e164";
+}
+.glyphicon-record:before {
+ content: "\e165";
+}
+.glyphicon-save:before {
+ content: "\e166";
+}
+.glyphicon-open:before {
+ content: "\e167";
+}
+.glyphicon-saved:before {
+ content: "\e168";
+}
+.glyphicon-import:before {
+ content: "\e169";
+}
+.glyphicon-export:before {
+ content: "\e170";
+}
+.glyphicon-send:before {
+ content: "\e171";
+}
+.glyphicon-floppy-disk:before {
+ content: "\e172";
+}
+.glyphicon-floppy-saved:before {
+ content: "\e173";
+}
+.glyphicon-floppy-remove:before {
+ content: "\e174";
+}
+.glyphicon-floppy-save:before {
+ content: "\e175";
+}
+.glyphicon-floppy-open:before {
+ content: "\e176";
+}
+.glyphicon-credit-card:before {
+ content: "\e177";
+}
+.glyphicon-transfer:before {
+ content: "\e178";
+}
+.glyphicon-cutlery:before {
+ content: "\e179";
+}
+.glyphicon-header:before {
+ content: "\e180";
+}
+.glyphicon-compressed:before {
+ content: "\e181";
+}
+.glyphicon-earphone:before {
+ content: "\e182";
+}
+.glyphicon-phone-alt:before {
+ content: "\e183";
+}
+.glyphicon-tower:before {
+ content: "\e184";
+}
+.glyphicon-stats:before {
+ content: "\e185";
+}
+.glyphicon-sd-video:before {
+ content: "\e186";
+}
+.glyphicon-hd-video:before {
+ content: "\e187";
+}
+.glyphicon-subtitles:before {
+ content: "\e188";
+}
+.glyphicon-sound-stereo:before {
+ content: "\e189";
+}
+.glyphicon-sound-dolby:before {
+ content: "\e190";
+}
+.glyphicon-sound-5-1:before {
+ content: "\e191";
+}
+.glyphicon-sound-6-1:before {
+ content: "\e192";
+}
+.glyphicon-sound-7-1:before {
+ content: "\e193";
+}
+.glyphicon-copyright-mark:before {
+ content: "\e194";
+}
+.glyphicon-registration-mark:before {
+ content: "\e195";
+}
+.glyphicon-cloud-download:before {
+ content: "\e197";
+}
+.glyphicon-cloud-upload:before {
+ content: "\e198";
+}
+.glyphicon-tree-conifer:before {
+ content: "\e199";
+}
+.glyphicon-tree-deciduous:before {
+ content: "\e200";
+}
+* {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+*:before,
+*:after {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+html {
+ font-size: 10px;
+
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+body {
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 14px;
+ line-height: 1.42857143;
+ color: #333;
+ background-color: #fff;
+}
+input,
+button,
+select,
+textarea {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+}
+a {
+ color: #337ab7;
+ text-decoration: none;
+}
+a:hover,
+a:focus {
+ color: #23527c;
+ text-decoration: underline;
+}
+a:focus {
+ outline: thin dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px;
+}
+figure {
+ margin: 0;
+}
+img {
+ vertical-align: middle;
+}
+.img-responsive,
+.thumbnail > img,
+.thumbnail a > img,
+.carousel-inner > .item > img,
+.carousel-inner > .item > a > img {
+ display: block;
+ max-width: 100%;
+ height: auto;
+}
+.img-rounded {
+ border-radius: 6px;
+}
+.img-thumbnail {
+ display: inline-block;
+ max-width: 100%;
+ height: auto;
+ padding: 4px;
+ line-height: 1.42857143;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ border-radius: 4px;
+ -webkit-transition: all .2s ease-in-out;
+ -o-transition: all .2s ease-in-out;
+ transition: all .2s ease-in-out;
+}
+.img-circle {
+ border-radius: 50%;
+}
+hr {
+ margin-top: 20px;
+ margin-bottom: 20px;
+ border: 0;
+ border-top: 1px solid #eee;
+}
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ border: 0;
+}
+.sr-only-focusable:active,
+.sr-only-focusable:focus {
+ position: static;
+ width: auto;
+ height: auto;
+ margin: 0;
+ overflow: visible;
+ clip: auto;
+}
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+.h1,
+.h2,
+.h3,
+.h4,
+.h5,
+.h6 {
+ font-family: inherit;
+ font-weight: 500;
+ line-height: 1.1;
+ color: inherit;
+}
+h1 small,
+h2 small,
+h3 small,
+h4 small,
+h5 small,
+h6 small,
+.h1 small,
+.h2 small,
+.h3 small,
+.h4 small,
+.h5 small,
+.h6 small,
+h1 .small,
+h2 .small,
+h3 .small,
+h4 .small,
+h5 .small,
+h6 .small,
+.h1 .small,
+.h2 .small,
+.h3 .small,
+.h4 .small,
+.h5 .small,
+.h6 .small {
+ font-weight: normal;
+ line-height: 1;
+ color: #777;
+}
+h1,
+.h1,
+h2,
+.h2,
+h3,
+.h3 {
+ margin-top: 20px;
+ margin-bottom: 10px;
+}
+h1 small,
+.h1 small,
+h2 small,
+.h2 small,
+h3 small,
+.h3 small,
+h1 .small,
+.h1 .small,
+h2 .small,
+.h2 .small,
+h3 .small,
+.h3 .small {
+ font-size: 65%;
+}
+h4,
+.h4,
+h5,
+.h5,
+h6,
+.h6 {
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+h4 small,
+.h4 small,
+h5 small,
+.h5 small,
+h6 small,
+.h6 small,
+h4 .small,
+.h4 .small,
+h5 .small,
+.h5 .small,
+h6 .small,
+.h6 .small {
+ font-size: 75%;
+}
+h1,
+.h1 {
+ font-size: 36px;
+}
+h2,
+.h2 {
+ font-size: 30px;
+}
+h3,
+.h3 {
+ font-size: 24px;
+}
+h4,
+.h4 {
+ font-size: 18px;
+}
+h5,
+.h5 {
+ font-size: 14px;
+}
+h6,
+.h6 {
+ font-size: 12px;
+}
+p {
+ margin: 0 0 10px;
+}
+.lead {
+ margin-bottom: 20px;
+ font-size: 16px;
+ font-weight: 300;
+ line-height: 1.4;
+}
+@media (min-width: 768px) {
+ .lead {
+ font-size: 21px;
+ }
+}
+small,
+.small {
+ font-size: 85%;
+}
+mark,
+.mark {
+ padding: .2em;
+ background-color: #fcf8e3;
+}
+.text-left {
+ text-align: left;
+}
+.text-right {
+ text-align: right;
+}
+.text-center {
+ text-align: center;
+}
+.text-justify {
+ text-align: justify;
+}
+.text-nowrap {
+ white-space: nowrap;
+}
+.text-lowercase {
+ text-transform: lowercase;
+}
+.text-uppercase {
+ text-transform: uppercase;
+}
+.text-capitalize {
+ text-transform: capitalize;
+}
+.text-muted {
+ color: #777;
+}
+.text-primary {
+ color: #337ab7;
+}
+a.text-primary:hover {
+ color: #286090;
+}
+.text-success {
+ color: #3c763d;
+}
+a.text-success:hover {
+ color: #2b542c;
+}
+.text-info {
+ color: #31708f;
+}
+a.text-info:hover {
+ color: #245269;
+}
+.text-warning {
+ color: #8a6d3b;
+}
+a.text-warning:hover {
+ color: #66512c;
+}
+.text-danger {
+ color: #a94442;
+}
+a.text-danger:hover {
+ color: #843534;
+}
+.bg-primary {
+ color: #fff;
+ background-color: #337ab7;
+}
+a.bg-primary:hover {
+ background-color: #286090;
+}
+.bg-success {
+ background-color: #dff0d8;
+}
+a.bg-success:hover {
+ background-color: #c1e2b3;
+}
+.bg-info {
+ background-color: #d9edf7;
+}
+a.bg-info:hover {
+ background-color: #afd9ee;
+}
+.bg-warning {
+ background-color: #fcf8e3;
+}
+a.bg-warning:hover {
+ background-color: #f7ecb5;
+}
+.bg-danger {
+ background-color: #f2dede;
+}
+a.bg-danger:hover {
+ background-color: #e4b9b9;
+}
+.page-header {
+ padding-bottom: 9px;
+ margin: 40px 0 20px;
+ border-bottom: 1px solid #eee;
+}
+ul,
+ol {
+ margin-top: 0;
+ margin-bottom: 10px;
+}
+ul ul,
+ol ul,
+ul ol,
+ol ol {
+ margin-bottom: 0;
+}
+.list-unstyled {
+ padding-left: 0;
+ list-style: none;
+}
+.list-inline {
+ padding-left: 0;
+ margin-left: -5px;
+ list-style: none;
+}
+.list-inline > li {
+ display: inline-block;
+ padding-right: 5px;
+ padding-left: 5px;
+}
+dl {
+ margin-top: 0;
+ margin-bottom: 20px;
+}
+dt,
+dd {
+ line-height: 1.42857143;
+}
+dt {
+ font-weight: bold;
+}
+dd {
+ margin-left: 0;
+}
+@media (min-width: 768px) {
+ .dl-horizontal dt {
+ float: left;
+ width: 160px;
+ overflow: hidden;
+ clear: left;
+ text-align: right;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+ .dl-horizontal dd {
+ margin-left: 180px;
+ }
+}
+abbr[title],
+abbr[data-original-title] {
+ cursor: help;
+ border-bottom: 1px dotted #777;
+}
+.initialism {
+ font-size: 90%;
+ text-transform: uppercase;
+}
+blockquote {
+ padding: 10px 20px;
+ margin: 0 0 20px;
+ font-size: 17.5px;
+ border-left: 5px solid #eee;
+}
+blockquote p:last-child,
+blockquote ul:last-child,
+blockquote ol:last-child {
+ margin-bottom: 0;
+}
+blockquote footer,
+blockquote small,
+blockquote .small {
+ display: block;
+ font-size: 80%;
+ line-height: 1.42857143;
+ color: #777;
+}
+blockquote footer:before,
+blockquote small:before,
+blockquote .small:before {
+ content: '\2014 \00A0';
+}
+.blockquote-reverse,
+blockquote.pull-right {
+ padding-right: 15px;
+ padding-left: 0;
+ text-align: right;
+ border-right: 5px solid #eee;
+ border-left: 0;
+}
+.blockquote-reverse footer:before,
+blockquote.pull-right footer:before,
+.blockquote-reverse small:before,
+blockquote.pull-right small:before,
+.blockquote-reverse .small:before,
+blockquote.pull-right .small:before {
+ content: '';
+}
+.blockquote-reverse footer:after,
+blockquote.pull-right footer:after,
+.blockquote-reverse small:after,
+blockquote.pull-right small:after,
+.blockquote-reverse .small:after,
+blockquote.pull-right .small:after {
+ content: '\00A0 \2014';
+}
+address {
+ margin-bottom: 20px;
+ font-style: normal;
+ line-height: 1.42857143;
+}
+code,
+kbd,
+pre,
+samp {
+ font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
+}
+code {
+ padding: 2px 4px;
+ font-size: 90%;
+ color: #c7254e;
+ background-color: #f9f2f4;
+ border-radius: 4px;
+}
+kbd {
+ padding: 2px 4px;
+ font-size: 90%;
+ color: #fff;
+ background-color: #333;
+ border-radius: 3px;
+ -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);
+ box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);
+}
+kbd kbd {
+ padding: 0;
+ font-size: 100%;
+ font-weight: bold;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+}
+pre {
+ display: block;
+ padding: 9.5px;
+ margin: 0 0 10px;
+ font-size: 13px;
+ line-height: 1.42857143;
+ color: #333;
+ word-break: break-all;
+ word-wrap: break-word;
+ background-color: #f5f5f5;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+}
+pre code {
+ padding: 0;
+ font-size: inherit;
+ color: inherit;
+ white-space: pre-wrap;
+ background-color: transparent;
+ border-radius: 0;
+}
+.pre-scrollable {
+ max-height: 340px;
+ overflow-y: scroll;
+}
+.container {
+ padding-right: 15px;
+ padding-left: 15px;
+ margin-right: auto;
+ margin-left: auto;
+}
+@media (min-width: 768px) {
+ .container {
+ width: 750px;
+ }
+}
+@media (min-width: 992px) {
+ .container {
+ width: 970px;
+ }
+}
+@media (min-width: 1200px) {
+ .container {
+ width: 1170px;
+ }
+}
+.container-fluid {
+ padding-right: 15px;
+ padding-left: 15px;
+ margin-right: auto;
+ margin-left: auto;
+}
+.row {
+ margin-right: -15px;
+ margin-left: -15px;
+}
+.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {
+ position: relative;
+ min-height: 1px;
+ padding-right: 15px;
+ padding-left: 15px;
+}
+.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {
+ float: left;
+}
+.col-xs-12 {
+ width: 100%;
+}
+.col-xs-11 {
+ width: 91.66666667%;
+}
+.col-xs-10 {
+ width: 83.33333333%;
+}
+.col-xs-9 {
+ width: 75%;
+}
+.col-xs-8 {
+ width: 66.66666667%;
+}
+.col-xs-7 {
+ width: 58.33333333%;
+}
+.col-xs-6 {
+ width: 50%;
+}
+.col-xs-5 {
+ width: 41.66666667%;
+}
+.col-xs-4 {
+ width: 33.33333333%;
+}
+.col-xs-3 {
+ width: 25%;
+}
+.col-xs-2 {
+ width: 16.66666667%;
+}
+.col-xs-1 {
+ width: 8.33333333%;
+}
+.col-xs-pull-12 {
+ right: 100%;
+}
+.col-xs-pull-11 {
+ right: 91.66666667%;
+}
+.col-xs-pull-10 {
+ right: 83.33333333%;
+}
+.col-xs-pull-9 {
+ right: 75%;
+}
+.col-xs-pull-8 {
+ right: 66.66666667%;
+}
+.col-xs-pull-7 {
+ right: 58.33333333%;
+}
+.col-xs-pull-6 {
+ right: 50%;
+}
+.col-xs-pull-5 {
+ right: 41.66666667%;
+}
+.col-xs-pull-4 {
+ right: 33.33333333%;
+}
+.col-xs-pull-3 {
+ right: 25%;
+}
+.col-xs-pull-2 {
+ right: 16.66666667%;
+}
+.col-xs-pull-1 {
+ right: 8.33333333%;
+}
+.col-xs-pull-0 {
+ right: auto;
+}
+.col-xs-push-12 {
+ left: 100%;
+}
+.col-xs-push-11 {
+ left: 91.66666667%;
+}
+.col-xs-push-10 {
+ left: 83.33333333%;
+}
+.col-xs-push-9 {
+ left: 75%;
+}
+.col-xs-push-8 {
+ left: 66.66666667%;
+}
+.col-xs-push-7 {
+ left: 58.33333333%;
+}
+.col-xs-push-6 {
+ left: 50%;
+}
+.col-xs-push-5 {
+ left: 41.66666667%;
+}
+.col-xs-push-4 {
+ left: 33.33333333%;
+}
+.col-xs-push-3 {
+ left: 25%;
+}
+.col-xs-push-2 {
+ left: 16.66666667%;
+}
+.col-xs-push-1 {
+ left: 8.33333333%;
+}
+.col-xs-push-0 {
+ left: auto;
+}
+.col-xs-offset-12 {
+ margin-left: 100%;
+}
+.col-xs-offset-11 {
+ margin-left: 91.66666667%;
+}
+.col-xs-offset-10 {
+ margin-left: 83.33333333%;
+}
+.col-xs-offset-9 {
+ margin-left: 75%;
+}
+.col-xs-offset-8 {
+ margin-left: 66.66666667%;
+}
+.col-xs-offset-7 {
+ margin-left: 58.33333333%;
+}
+.col-xs-offset-6 {
+ margin-left: 50%;
+}
+.col-xs-offset-5 {
+ margin-left: 41.66666667%;
+}
+.col-xs-offset-4 {
+ margin-left: 33.33333333%;
+}
+.col-xs-offset-3 {
+ margin-left: 25%;
+}
+.col-xs-offset-2 {
+ margin-left: 16.66666667%;
+}
+.col-xs-offset-1 {
+ margin-left: 8.33333333%;
+}
+.col-xs-offset-0 {
+ margin-left: 0;
+}
+@media (min-width: 768px) {
+ .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {
+ float: left;
+ }
+ .col-sm-12 {
+ width: 100%;
+ }
+ .col-sm-11 {
+ width: 91.66666667%;
+ }
+ .col-sm-10 {
+ width: 83.33333333%;
+ }
+ .col-sm-9 {
+ width: 75%;
+ }
+ .col-sm-8 {
+ width: 66.66666667%;
+ }
+ .col-sm-7 {
+ width: 58.33333333%;
+ }
+ .col-sm-6 {
+ width: 50%;
+ }
+ .col-sm-5 {
+ width: 41.66666667%;
+ }
+ .col-sm-4 {
+ width: 33.33333333%;
+ }
+ .col-sm-3 {
+ width: 25%;
+ }
+ .col-sm-2 {
+ width: 16.66666667%;
+ }
+ .col-sm-1 {
+ width: 8.33333333%;
+ }
+ .col-sm-pull-12 {
+ right: 100%;
+ }
+ .col-sm-pull-11 {
+ right: 91.66666667%;
+ }
+ .col-sm-pull-10 {
+ right: 83.33333333%;
+ }
+ .col-sm-pull-9 {
+ right: 75%;
+ }
+ .col-sm-pull-8 {
+ right: 66.66666667%;
+ }
+ .col-sm-pull-7 {
+ right: 58.33333333%;
+ }
+ .col-sm-pull-6 {
+ right: 50%;
+ }
+ .col-sm-pull-5 {
+ right: 41.66666667%;
+ }
+ .col-sm-pull-4 {
+ right: 33.33333333%;
+ }
+ .col-sm-pull-3 {
+ right: 25%;
+ }
+ .col-sm-pull-2 {
+ right: 16.66666667%;
+ }
+ .col-sm-pull-1 {
+ right: 8.33333333%;
+ }
+ .col-sm-pull-0 {
+ right: auto;
+ }
+ .col-sm-push-12 {
+ left: 100%;
+ }
+ .col-sm-push-11 {
+ left: 91.66666667%;
+ }
+ .col-sm-push-10 {
+ left: 83.33333333%;
+ }
+ .col-sm-push-9 {
+ left: 75%;
+ }
+ .col-sm-push-8 {
+ left: 66.66666667%;
+ }
+ .col-sm-push-7 {
+ left: 58.33333333%;
+ }
+ .col-sm-push-6 {
+ left: 50%;
+ }
+ .col-sm-push-5 {
+ left: 41.66666667%;
+ }
+ .col-sm-push-4 {
+ left: 33.33333333%;
+ }
+ .col-sm-push-3 {
+ left: 25%;
+ }
+ .col-sm-push-2 {
+ left: 16.66666667%;
+ }
+ .col-sm-push-1 {
+ left: 8.33333333%;
+ }
+ .col-sm-push-0 {
+ left: auto;
+ }
+ .col-sm-offset-12 {
+ margin-left: 100%;
+ }
+ .col-sm-offset-11 {
+ margin-left: 91.66666667%;
+ }
+ .col-sm-offset-10 {
+ margin-left: 83.33333333%;
+ }
+ .col-sm-offset-9 {
+ margin-left: 75%;
+ }
+ .col-sm-offset-8 {
+ margin-left: 66.66666667%;
+ }
+ .col-sm-offset-7 {
+ margin-left: 58.33333333%;
+ }
+ .col-sm-offset-6 {
+ margin-left: 50%;
+ }
+ .col-sm-offset-5 {
+ margin-left: 41.66666667%;
+ }
+ .col-sm-offset-4 {
+ margin-left: 33.33333333%;
+ }
+ .col-sm-offset-3 {
+ margin-left: 25%;
+ }
+ .col-sm-offset-2 {
+ margin-left: 16.66666667%;
+ }
+ .col-sm-offset-1 {
+ margin-left: 8.33333333%;
+ }
+ .col-sm-offset-0 {
+ margin-left: 0;
+ }
+}
+@media (min-width: 992px) {
+ .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {
+ float: left;
+ }
+ .col-md-12 {
+ width: 100%;
+ }
+ .col-md-11 {
+ width: 91.66666667%;
+ }
+ .col-md-10 {
+ width: 83.33333333%;
+ }
+ .col-md-9 {
+ width: 75%;
+ }
+ .col-md-8 {
+ width: 66.66666667%;
+ }
+ .col-md-7 {
+ width: 58.33333333%;
+ }
+ .col-md-6 {
+ width: 50%;
+ }
+ .col-md-5 {
+ width: 41.66666667%;
+ }
+ .col-md-4 {
+ width: 33.33333333%;
+ }
+ .col-md-3 {
+ width: 25%;
+ }
+ .col-md-2 {
+ width: 16.66666667%;
+ }
+ .col-md-1 {
+ width: 8.33333333%;
+ }
+ .col-md-pull-12 {
+ right: 100%;
+ }
+ .col-md-pull-11 {
+ right: 91.66666667%;
+ }
+ .col-md-pull-10 {
+ right: 83.33333333%;
+ }
+ .col-md-pull-9 {
+ right: 75%;
+ }
+ .col-md-pull-8 {
+ right: 66.66666667%;
+ }
+ .col-md-pull-7 {
+ right: 58.33333333%;
+ }
+ .col-md-pull-6 {
+ right: 50%;
+ }
+ .col-md-pull-5 {
+ right: 41.66666667%;
+ }
+ .col-md-pull-4 {
+ right: 33.33333333%;
+ }
+ .col-md-pull-3 {
+ right: 25%;
+ }
+ .col-md-pull-2 {
+ right: 16.66666667%;
+ }
+ .col-md-pull-1 {
+ right: 8.33333333%;
+ }
+ .col-md-pull-0 {
+ right: auto;
+ }
+ .col-md-push-12 {
+ left: 100%;
+ }
+ .col-md-push-11 {
+ left: 91.66666667%;
+ }
+ .col-md-push-10 {
+ left: 83.33333333%;
+ }
+ .col-md-push-9 {
+ left: 75%;
+ }
+ .col-md-push-8 {
+ left: 66.66666667%;
+ }
+ .col-md-push-7 {
+ left: 58.33333333%;
+ }
+ .col-md-push-6 {
+ left: 50%;
+ }
+ .col-md-push-5 {
+ left: 41.66666667%;
+ }
+ .col-md-push-4 {
+ left: 33.33333333%;
+ }
+ .col-md-push-3 {
+ left: 25%;
+ }
+ .col-md-push-2 {
+ left: 16.66666667%;
+ }
+ .col-md-push-1 {
+ left: 8.33333333%;
+ }
+ .col-md-push-0 {
+ left: auto;
+ }
+ .col-md-offset-12 {
+ margin-left: 100%;
+ }
+ .col-md-offset-11 {
+ margin-left: 91.66666667%;
+ }
+ .col-md-offset-10 {
+ margin-left: 83.33333333%;
+ }
+ .col-md-offset-9 {
+ margin-left: 75%;
+ }
+ .col-md-offset-8 {
+ margin-left: 66.66666667%;
+ }
+ .col-md-offset-7 {
+ margin-left: 58.33333333%;
+ }
+ .col-md-offset-6 {
+ margin-left: 50%;
+ }
+ .col-md-offset-5 {
+ margin-left: 41.66666667%;
+ }
+ .col-md-offset-4 {
+ margin-left: 33.33333333%;
+ }
+ .col-md-offset-3 {
+ margin-left: 25%;
+ }
+ .col-md-offset-2 {
+ margin-left: 16.66666667%;
+ }
+ .col-md-offset-1 {
+ margin-left: 8.33333333%;
+ }
+ .col-md-offset-0 {
+ margin-left: 0;
+ }
+}
+@media (min-width: 1200px) {
+ .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {
+ float: left;
+ }
+ .col-lg-12 {
+ width: 100%;
+ }
+ .col-lg-11 {
+ width: 91.66666667%;
+ }
+ .col-lg-10 {
+ width: 83.33333333%;
+ }
+ .col-lg-9 {
+ width: 75%;
+ }
+ .col-lg-8 {
+ width: 66.66666667%;
+ }
+ .col-lg-7 {
+ width: 58.33333333%;
+ }
+ .col-lg-6 {
+ width: 50%;
+ }
+ .col-lg-5 {
+ width: 41.66666667%;
+ }
+ .col-lg-4 {
+ width: 33.33333333%;
+ }
+ .col-lg-3 {
+ width: 25%;
+ }
+ .col-lg-2 {
+ width: 16.66666667%;
+ }
+ .col-lg-1 {
+ width: 8.33333333%;
+ }
+ .col-lg-pull-12 {
+ right: 100%;
+ }
+ .col-lg-pull-11 {
+ right: 91.66666667%;
+ }
+ .col-lg-pull-10 {
+ right: 83.33333333%;
+ }
+ .col-lg-pull-9 {
+ right: 75%;
+ }
+ .col-lg-pull-8 {
+ right: 66.66666667%;
+ }
+ .col-lg-pull-7 {
+ right: 58.33333333%;
+ }
+ .col-lg-pull-6 {
+ right: 50%;
+ }
+ .col-lg-pull-5 {
+ right: 41.66666667%;
+ }
+ .col-lg-pull-4 {
+ right: 33.33333333%;
+ }
+ .col-lg-pull-3 {
+ right: 25%;
+ }
+ .col-lg-pull-2 {
+ right: 16.66666667%;
+ }
+ .col-lg-pull-1 {
+ right: 8.33333333%;
+ }
+ .col-lg-pull-0 {
+ right: auto;
+ }
+ .col-lg-push-12 {
+ left: 100%;
+ }
+ .col-lg-push-11 {
+ left: 91.66666667%;
+ }
+ .col-lg-push-10 {
+ left: 83.33333333%;
+ }
+ .col-lg-push-9 {
+ left: 75%;
+ }
+ .col-lg-push-8 {
+ left: 66.66666667%;
+ }
+ .col-lg-push-7 {
+ left: 58.33333333%;
+ }
+ .col-lg-push-6 {
+ left: 50%;
+ }
+ .col-lg-push-5 {
+ left: 41.66666667%;
+ }
+ .col-lg-push-4 {
+ left: 33.33333333%;
+ }
+ .col-lg-push-3 {
+ left: 25%;
+ }
+ .col-lg-push-2 {
+ left: 16.66666667%;
+ }
+ .col-lg-push-1 {
+ left: 8.33333333%;
+ }
+ .col-lg-push-0 {
+ left: auto;
+ }
+ .col-lg-offset-12 {
+ margin-left: 100%;
+ }
+ .col-lg-offset-11 {
+ margin-left: 91.66666667%;
+ }
+ .col-lg-offset-10 {
+ margin-left: 83.33333333%;
+ }
+ .col-lg-offset-9 {
+ margin-left: 75%;
+ }
+ .col-lg-offset-8 {
+ margin-left: 66.66666667%;
+ }
+ .col-lg-offset-7 {
+ margin-left: 58.33333333%;
+ }
+ .col-lg-offset-6 {
+ margin-left: 50%;
+ }
+ .col-lg-offset-5 {
+ margin-left: 41.66666667%;
+ }
+ .col-lg-offset-4 {
+ margin-left: 33.33333333%;
+ }
+ .col-lg-offset-3 {
+ margin-left: 25%;
+ }
+ .col-lg-offset-2 {
+ margin-left: 16.66666667%;
+ }
+ .col-lg-offset-1 {
+ margin-left: 8.33333333%;
+ }
+ .col-lg-offset-0 {
+ margin-left: 0;
+ }
+}
+table {
+ background-color: transparent;
+}
+caption {
+ padding-top: 8px;
+ padding-bottom: 8px;
+ color: #777;
+ text-align: left;
+}
+th {
+ text-align: left;
+}
+.table {
+ width: 100%;
+ max-width: 100%;
+ margin-bottom: 20px;
+}
+.table > thead > tr > th,
+.table > tbody > tr > th,
+.table > tfoot > tr > th,
+.table > thead > tr > td,
+.table > tbody > tr > td,
+.table > tfoot > tr > td {
+ padding: 8px;
+ line-height: 1.42857143;
+ vertical-align: top;
+ border-top: 1px solid #ddd;
+}
+.table > thead > tr > th {
+ vertical-align: bottom;
+ border-bottom: 2px solid #ddd;
+}
+.table > caption + thead > tr:first-child > th,
+.table > colgroup + thead > tr:first-child > th,
+.table > thead:first-child > tr:first-child > th,
+.table > caption + thead > tr:first-child > td,
+.table > colgroup + thead > tr:first-child > td,
+.table > thead:first-child > tr:first-child > td {
+ border-top: 0;
+}
+.table > tbody + tbody {
+ border-top: 2px solid #ddd;
+}
+.table .table {
+ background-color: #fff;
+}
+.table-condensed > thead > tr > th,
+.table-condensed > tbody > tr > th,
+.table-condensed > tfoot > tr > th,
+.table-condensed > thead > tr > td,
+.table-condensed > tbody > tr > td,
+.table-condensed > tfoot > tr > td {
+ padding: 5px;
+}
+.table-bordered {
+ border: 1px solid #ddd;
+}
+.table-bordered > thead > tr > th,
+.table-bordered > tbody > tr > th,
+.table-bordered > tfoot > tr > th,
+.table-bordered > thead > tr > td,
+.table-bordered > tbody > tr > td,
+.table-bordered > tfoot > tr > td {
+ border: 1px solid #ddd;
+}
+.table-bordered > thead > tr > th,
+.table-bordered > thead > tr > td {
+ border-bottom-width: 2px;
+}
+.table-striped > tbody > tr:nth-child(odd) {
+ background-color: #f9f9f9;
+}
+.table-hover > tbody > tr:hover {
+ background-color: #f5f5f5;
+}
+table col[class*="col-"] {
+ position: static;
+ display: table-column;
+ float: none;
+}
+table td[class*="col-"],
+table th[class*="col-"] {
+ position: static;
+ display: table-cell;
+ float: none;
+}
+.table > thead > tr > td.active,
+.table > tbody > tr > td.active,
+.table > tfoot > tr > td.active,
+.table > thead > tr > th.active,
+.table > tbody > tr > th.active,
+.table > tfoot > tr > th.active,
+.table > thead > tr.active > td,
+.table > tbody > tr.active > td,
+.table > tfoot > tr.active > td,
+.table > thead > tr.active > th,
+.table > tbody > tr.active > th,
+.table > tfoot > tr.active > th {
+ background-color: #f5f5f5;
+}
+.table-hover > tbody > tr > td.active:hover,
+.table-hover > tbody > tr > th.active:hover,
+.table-hover > tbody > tr.active:hover > td,
+.table-hover > tbody > tr:hover > .active,
+.table-hover > tbody > tr.active:hover > th {
+ background-color: #e8e8e8;
+}
+.table > thead > tr > td.success,
+.table > tbody > tr > td.success,
+.table > tfoot > tr > td.success,
+.table > thead > tr > th.success,
+.table > tbody > tr > th.success,
+.table > tfoot > tr > th.success,
+.table > thead > tr.success > td,
+.table > tbody > tr.success > td,
+.table > tfoot > tr.success > td,
+.table > thead > tr.success > th,
+.table > tbody > tr.success > th,
+.table > tfoot > tr.success > th {
+ background-color: #dff0d8;
+}
+.table-hover > tbody > tr > td.success:hover,
+.table-hover > tbody > tr > th.success:hover,
+.table-hover > tbody > tr.success:hover > td,
+.table-hover > tbody > tr:hover > .success,
+.table-hover > tbody > tr.success:hover > th {
+ background-color: #d0e9c6;
+}
+.table > thead > tr > td.info,
+.table > tbody > tr > td.info,
+.table > tfoot > tr > td.info,
+.table > thead > tr > th.info,
+.table > tbody > tr > th.info,
+.table > tfoot > tr > th.info,
+.table > thead > tr.info > td,
+.table > tbody > tr.info > td,
+.table > tfoot > tr.info > td,
+.table > thead > tr.info > th,
+.table > tbody > tr.info > th,
+.table > tfoot > tr.info > th {
+ background-color: #d9edf7;
+}
+.table-hover > tbody > tr > td.info:hover,
+.table-hover > tbody > tr > th.info:hover,
+.table-hover > tbody > tr.info:hover > td,
+.table-hover > tbody > tr:hover > .info,
+.table-hover > tbody > tr.info:hover > th {
+ background-color: #c4e3f3;
+}
+.table > thead > tr > td.warning,
+.table > tbody > tr > td.warning,
+.table > tfoot > tr > td.warning,
+.table > thead > tr > th.warning,
+.table > tbody > tr > th.warning,
+.table > tfoot > tr > th.warning,
+.table > thead > tr.warning > td,
+.table > tbody > tr.warning > td,
+.table > tfoot > tr.warning > td,
+.table > thead > tr.warning > th,
+.table > tbody > tr.warning > th,
+.table > tfoot > tr.warning > th {
+ background-color: #fcf8e3;
+}
+.table-hover > tbody > tr > td.warning:hover,
+.table-hover > tbody > tr > th.warning:hover,
+.table-hover > tbody > tr.warning:hover > td,
+.table-hover > tbody > tr:hover > .warning,
+.table-hover > tbody > tr.warning:hover > th {
+ background-color: #faf2cc;
+}
+.table > thead > tr > td.danger,
+.table > tbody > tr > td.danger,
+.table > tfoot > tr > td.danger,
+.table > thead > tr > th.danger,
+.table > tbody > tr > th.danger,
+.table > tfoot > tr > th.danger,
+.table > thead > tr.danger > td,
+.table > tbody > tr.danger > td,
+.table > tfoot > tr.danger > td,
+.table > thead > tr.danger > th,
+.table > tbody > tr.danger > th,
+.table > tfoot > tr.danger > th {
+ background-color: #f2dede;
+}
+.table-hover > tbody > tr > td.danger:hover,
+.table-hover > tbody > tr > th.danger:hover,
+.table-hover > tbody > tr.danger:hover > td,
+.table-hover > tbody > tr:hover > .danger,
+.table-hover > tbody > tr.danger:hover > th {
+ background-color: #ebcccc;
+}
+.table-responsive {
+ min-height: .01%;
+ overflow-x: auto;
+}
+@media screen and (max-width: 767px) {
+ .table-responsive {
+ width: 100%;
+ margin-bottom: 15px;
+ overflow-y: hidden;
+ -ms-overflow-style: -ms-autohiding-scrollbar;
+ border: 1px solid #ddd;
+ }
+ .table-responsive > .table {
+ margin-bottom: 0;
+ }
+ .table-responsive > .table > thead > tr > th,
+ .table-responsive > .table > tbody > tr > th,
+ .table-responsive > .table > tfoot > tr > th,
+ .table-responsive > .table > thead > tr > td,
+ .table-responsive > .table > tbody > tr > td,
+ .table-responsive > .table > tfoot > tr > td {
+ white-space: nowrap;
+ }
+ .table-responsive > .table-bordered {
+ border: 0;
+ }
+ .table-responsive > .table-bordered > thead > tr > th:first-child,
+ .table-responsive > .table-bordered > tbody > tr > th:first-child,
+ .table-responsive > .table-bordered > tfoot > tr > th:first-child,
+ .table-responsive > .table-bordered > thead > tr > td:first-child,
+ .table-responsive > .table-bordered > tbody > tr > td:first-child,
+ .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+ border-left: 0;
+ }
+ .table-responsive > .table-bordered > thead > tr > th:last-child,
+ .table-responsive > .table-bordered > tbody > tr > th:last-child,
+ .table-responsive > .table-bordered > tfoot > tr > th:last-child,
+ .table-responsive > .table-bordered > thead > tr > td:last-child,
+ .table-responsive > .table-bordered > tbody > tr > td:last-child,
+ .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+ border-right: 0;
+ }
+ .table-responsive > .table-bordered > tbody > tr:last-child > th,
+ .table-responsive > .table-bordered > tfoot > tr:last-child > th,
+ .table-responsive > .table-bordered > tbody > tr:last-child > td,
+ .table-responsive > .table-bordered > tfoot > tr:last-child > td {
+ border-bottom: 0;
+ }
+}
+fieldset {
+ min-width: 0;
+ padding: 0;
+ margin: 0;
+ border: 0;
+}
+legend {
+ display: block;
+ width: 100%;
+ padding: 0;
+ margin-bottom: 20px;
+ font-size: 21px;
+ line-height: inherit;
+ color: #333;
+ border: 0;
+ border-bottom: 1px solid #e5e5e5;
+}
+label {
+ display: inline-block;
+ max-width: 100%;
+ margin-bottom: 5px;
+ font-weight: bold;
+}
+input[type="search"] {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+input[type="radio"],
+input[type="checkbox"] {
+ margin: 4px 0 0;
+ margin-top: 1px \9;
+ line-height: normal;
+}
+input[type="file"] {
+ display: block;
+}
+input[type="range"] {
+ display: block;
+ width: 100%;
+}
+select[multiple],
+select[size] {
+ height: auto;
+}
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus {
+ outline: thin dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px;
+}
+output {
+ display: block;
+ padding-top: 7px;
+ font-size: 14px;
+ line-height: 1.42857143;
+ color: #555;
+}
+.form-control {
+ display: block;
+ width: 100%;
+ height: 34px;
+ padding: 6px 12px;
+ 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 ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
+ -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
+ transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
+}
+.form-control:focus {
+ border-color: #66afe9;
+ outline: 0;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);
+ box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);
+}
+.form-control::-moz-placeholder {
+ color: #999;
+ opacity: 1;
+}
+.form-control:-ms-input-placeholder {
+ color: #999;
+}
+.form-control::-webkit-input-placeholder {
+ color: #999;
+}
+.form-control[disabled],
+.form-control[readonly],
+fieldset[disabled] .form-control {
+ cursor: not-allowed;
+ background-color: #eee;
+ opacity: 1;
+}
+textarea.form-control {
+ height: auto;
+}
+input[type="search"] {
+ -webkit-appearance: none;
+}
+@media screen and (-webkit-min-device-pixel-ratio: 0) {
+ input[type="date"],
+ input[type="time"],
+ input[type="datetime-local"],
+ input[type="month"] {
+ line-height: 34px;
+ }
+ input[type="date"].input-sm,
+ input[type="time"].input-sm,
+ input[type="datetime-local"].input-sm,
+ input[type="month"].input-sm {
+ line-height: 30px;
+ }
+ input[type="date"].input-lg,
+ input[type="time"].input-lg,
+ input[type="datetime-local"].input-lg,
+ input[type="month"].input-lg {
+ line-height: 46px;
+ }
+}
+.form-group {
+ margin-bottom: 15px;
+}
+.radio,
+.checkbox {
+ position: relative;
+ display: block;
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+.radio label,
+.checkbox label {
+ min-height: 20px;
+ padding-left: 20px;
+ margin-bottom: 0;
+ font-weight: normal;
+ cursor: pointer;
+}
+.radio input[type="radio"],
+.radio-inline input[type="radio"],
+.checkbox input[type="checkbox"],
+.checkbox-inline input[type="checkbox"] {
+ position: absolute;
+ margin-top: 4px \9;
+ margin-left: -20px;
+}
+.radio + .radio,
+.checkbox + .checkbox {
+ margin-top: -5px;
+}
+.radio-inline,
+.checkbox-inline {
+ display: inline-block;
+ padding-left: 20px;
+ margin-bottom: 0;
+ font-weight: normal;
+ vertical-align: middle;
+ cursor: pointer;
+}
+.radio-inline + .radio-inline,
+.checkbox-inline + .checkbox-inline {
+ margin-top: 0;
+ margin-left: 10px;
+}
+input[type="radio"][disabled],
+input[type="checkbox"][disabled],
+input[type="radio"].disabled,
+input[type="checkbox"].disabled,
+fieldset[disabled] input[type="radio"],
+fieldset[disabled] input[type="checkbox"] {
+ cursor: not-allowed;
+}
+.radio-inline.disabled,
+.checkbox-inline.disabled,
+fieldset[disabled] .radio-inline,
+fieldset[disabled] .checkbox-inline {
+ cursor: not-allowed;
+}
+.radio.disabled label,
+.checkbox.disabled label,
+fieldset[disabled] .radio label,
+fieldset[disabled] .checkbox label {
+ cursor: not-allowed;
+}
+.form-control-static {
+ padding-top: 7px;
+ padding-bottom: 7px;
+ margin-bottom: 0;
+}
+.form-control-static.input-lg,
+.form-control-static.input-sm {
+ padding-right: 0;
+ padding-left: 0;
+}
+.input-sm,
+.form-group-sm .form-control {
+ height: 30px;
+ padding: 5px 10px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px;
+}
+select.input-sm,
+select.form-group-sm .form-control {
+ height: 30px;
+ line-height: 30px;
+}
+textarea.input-sm,
+textarea.form-group-sm .form-control,
+select[multiple].input-sm,
+select[multiple].form-group-sm .form-control {
+ height: auto;
+}
+.input-lg,
+.form-group-lg .form-control {
+ height: 46px;
+ padding: 10px 16px;
+ font-size: 18px;
+ line-height: 1.33;
+ border-radius: 6px;
+}
+select.input-lg,
+select.form-group-lg .form-control {
+ height: 46px;
+ line-height: 46px;
+}
+textarea.input-lg,
+textarea.form-group-lg .form-control,
+select[multiple].input-lg,
+select[multiple].form-group-lg .form-control {
+ height: auto;
+}
+.has-feedback {
+ position: relative;
+}
+.has-feedback .form-control {
+ padding-right: 42.5px;
+}
+.form-control-feedback {
+ position: absolute;
+ top: 0;
+ right: 0;
+ z-index: 2;
+ display: block;
+ width: 34px;
+ height: 34px;
+ line-height: 34px;
+ text-align: center;
+ pointer-events: none;
+}
+.input-lg + .form-control-feedback {
+ width: 46px;
+ height: 46px;
+ line-height: 46px;
+}
+.input-sm + .form-control-feedback {
+ width: 30px;
+ height: 30px;
+ line-height: 30px;
+}
+.has-success .help-block,
+.has-success .control-label,
+.has-success .radio,
+.has-success .checkbox,
+.has-success .radio-inline,
+.has-success .checkbox-inline,
+.has-success.radio label,
+.has-success.checkbox label,
+.has-success.radio-inline label,
+.has-success.checkbox-inline label {
+ color: #3c763d;
+}
+.has-success .form-control {
+ border-color: #3c763d;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+}
+.has-success .form-control:focus {
+ border-color: #2b542c;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;
+}
+.has-success .input-group-addon {
+ color: #3c763d;
+ background-color: #dff0d8;
+ border-color: #3c763d;
+}
+.has-success .form-control-feedback {
+ color: #3c763d;
+}
+.has-warning .help-block,
+.has-warning .control-label,
+.has-warning .radio,
+.has-warning .checkbox,
+.has-warning .radio-inline,
+.has-warning .checkbox-inline,
+.has-warning.radio label,
+.has-warning.checkbox label,
+.has-warning.radio-inline label,
+.has-warning.checkbox-inline label {
+ color: #8a6d3b;
+}
+.has-warning .form-control {
+ border-color: #8a6d3b;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+}
+.has-warning .form-control:focus {
+ border-color: #66512c;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;
+}
+.has-warning .input-group-addon {
+ color: #8a6d3b;
+ background-color: #fcf8e3;
+ border-color: #8a6d3b;
+}
+.has-warning .form-control-feedback {
+ color: #8a6d3b;
+}
+.has-error .help-block,
+.has-error .control-label,
+.has-error .radio,
+.has-error .checkbox,
+.has-error .radio-inline,
+.has-error .checkbox-inline,
+.has-error.radio label,
+.has-error.checkbox label,
+.has-error.radio-inline label,
+.has-error.checkbox-inline label {
+ color: #a94442;
+}
+.has-error .form-control {
+ border-color: #a94442;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+}
+.has-error .form-control:focus {
+ border-color: #843534;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;
+}
+.has-error .input-group-addon {
+ color: #a94442;
+ background-color: #f2dede;
+ border-color: #a94442;
+}
+.has-error .form-control-feedback {
+ color: #a94442;
+}
+.has-feedback label ~ .form-control-feedback {
+ top: 25px;
+}
+.has-feedback label.sr-only ~ .form-control-feedback {
+ top: 0;
+}
+.help-block {
+ display: block;
+ margin-top: 5px;
+ margin-bottom: 10px;
+ color: #737373;
+}
+@media (min-width: 768px) {
+ .form-inline .form-group {
+ display: inline-block;
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .form-inline .form-control {
+ display: inline-block;
+ width: auto;
+ vertical-align: middle;
+ }
+ .form-inline .form-control-static {
+ display: inline-block;
+ }
+ .form-inline .input-group {
+ display: inline-table;
+ vertical-align: middle;
+ }
+ .form-inline .input-group .input-group-addon,
+ .form-inline .input-group .input-group-btn,
+ .form-inline .input-group .form-control {
+ width: auto;
+ }
+ .form-inline .input-group > .form-control {
+ width: 100%;
+ }
+ .form-inline .control-label {
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .form-inline .radio,
+ .form-inline .checkbox {
+ display: inline-block;
+ margin-top: 0;
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .form-inline .radio label,
+ .form-inline .checkbox label {
+ padding-left: 0;
+ }
+ .form-inline .radio input[type="radio"],
+ .form-inline .checkbox input[type="checkbox"] {
+ position: relative;
+ margin-left: 0;
+ }
+ .form-inline .has-feedback .form-control-feedback {
+ top: 0;
+ }
+}
+.form-horizontal .radio,
+.form-horizontal .checkbox,
+.form-horizontal .radio-inline,
+.form-horizontal .checkbox-inline {
+ padding-top: 7px;
+ margin-top: 0;
+ margin-bottom: 0;
+}
+.form-horizontal .radio,
+.form-horizontal .checkbox {
+ min-height: 27px;
+}
+.form-horizontal .form-group {
+ margin-right: -15px;
+ margin-left: -15px;
+}
+@media (min-width: 768px) {
+ .form-horizontal .control-label {
+ padding-top: 7px;
+ margin-bottom: 0;
+ text-align: right;
+ }
+}
+.form-horizontal .has-feedback .form-control-feedback {
+ right: 15px;
+}
+@media (min-width: 768px) {
+ .form-horizontal .form-group-lg .control-label {
+ padding-top: 14.3px;
+ }
+}
+@media (min-width: 768px) {
+ .form-horizontal .form-group-sm .control-label {
+ padding-top: 6px;
+ }
+}
+.btn {
+ display: inline-block;
+ padding: 6px 12px;
+ margin-bottom: 0;
+ font-size: 14px;
+ font-weight: normal;
+ line-height: 1.42857143;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: middle;
+ -ms-touch-action: manipulation;
+ touch-action: manipulation;
+ cursor: pointer;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ background-image: none;
+ border: 1px solid transparent;
+ border-radius: 4px;
+}
+.btn:focus,
+.btn:active:focus,
+.btn.active:focus,
+.btn.focus,
+.btn:active.focus,
+.btn.active.focus {
+ outline: thin dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px;
+}
+.btn:hover,
+.btn:focus,
+.btn.focus {
+ color: #333;
+ text-decoration: none;
+}
+.btn:active,
+.btn.active {
+ background-image: none;
+ outline: 0;
+ -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+ box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+}
+.btn.disabled,
+.btn[disabled],
+fieldset[disabled] .btn {
+ pointer-events: none;
+ cursor: not-allowed;
+ filter: alpha(opacity=65);
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ opacity: .65;
+}
+.btn-default {
+ color: #333;
+ background-color: #fff;
+ border-color: #ccc;
+}
+.btn-default:hover,
+.btn-default:focus,
+.btn-default.focus,
+.btn-default:active,
+.btn-default.active,
+.open > .dropdown-toggle.btn-default {
+ color: #333;
+ background-color: #e6e6e6;
+ border-color: #adadad;
+}
+.btn-default:active,
+.btn-default.active,
+.open > .dropdown-toggle.btn-default {
+ background-image: none;
+}
+.btn-default.disabled,
+.btn-default[disabled],
+fieldset[disabled] .btn-default,
+.btn-default.disabled:hover,
+.btn-default[disabled]:hover,
+fieldset[disabled] .btn-default:hover,
+.btn-default.disabled:focus,
+.btn-default[disabled]:focus,
+fieldset[disabled] .btn-default:focus,
+.btn-default.disabled.focus,
+.btn-default[disabled].focus,
+fieldset[disabled] .btn-default.focus,
+.btn-default.disabled:active,
+.btn-default[disabled]:active,
+fieldset[disabled] .btn-default:active,
+.btn-default.disabled.active,
+.btn-default[disabled].active,
+fieldset[disabled] .btn-default.active {
+ background-color: #fff;
+ border-color: #ccc;
+}
+.btn-default .badge {
+ color: #fff;
+ background-color: #333;
+}
+.btn-primary {
+ color: #fff;
+ background-color: #337ab7;
+ border-color: #2e6da4;
+}
+.btn-primary:hover,
+.btn-primary:focus,
+.btn-primary.focus,
+.btn-primary:active,
+.btn-primary.active,
+.open > .dropdown-toggle.btn-primary {
+ color: #fff;
+ background-color: #286090;
+ border-color: #204d74;
+}
+.btn-primary:active,
+.btn-primary.active,
+.open > .dropdown-toggle.btn-primary {
+ background-image: none;
+}
+.btn-primary.disabled,
+.btn-primary[disabled],
+fieldset[disabled] .btn-primary,
+.btn-primary.disabled:hover,
+.btn-primary[disabled]:hover,
+fieldset[disabled] .btn-primary:hover,
+.btn-primary.disabled:focus,
+.btn-primary[disabled]:focus,
+fieldset[disabled] .btn-primary:focus,
+.btn-primary.disabled.focus,
+.btn-primary[disabled].focus,
+fieldset[disabled] .btn-primary.focus,
+.btn-primary.disabled:active,
+.btn-primary[disabled]:active,
+fieldset[disabled] .btn-primary:active,
+.btn-primary.disabled.active,
+.btn-primary[disabled].active,
+fieldset[disabled] .btn-primary.active {
+ background-color: #337ab7;
+ border-color: #2e6da4;
+}
+.btn-primary .badge {
+ color: #337ab7;
+ background-color: #fff;
+}
+.btn-success {
+ color: #fff;
+ background-color: #5cb85c;
+ border-color: #4cae4c;
+}
+.btn-success:hover,
+.btn-success:focus,
+.btn-success.focus,
+.btn-success:active,
+.btn-success.active,
+.open > .dropdown-toggle.btn-success {
+ color: #fff;
+ background-color: #449d44;
+ border-color: #398439;
+}
+.btn-success:active,
+.btn-success.active,
+.open > .dropdown-toggle.btn-success {
+ background-image: none;
+}
+.btn-success.disabled,
+.btn-success[disabled],
+fieldset[disabled] .btn-success,
+.btn-success.disabled:hover,
+.btn-success[disabled]:hover,
+fieldset[disabled] .btn-success:hover,
+.btn-success.disabled:focus,
+.btn-success[disabled]:focus,
+fieldset[disabled] .btn-success:focus,
+.btn-success.disabled.focus,
+.btn-success[disabled].focus,
+fieldset[disabled] .btn-success.focus,
+.btn-success.disabled:active,
+.btn-success[disabled]:active,
+fieldset[disabled] .btn-success:active,
+.btn-success.disabled.active,
+.btn-success[disabled].active,
+fieldset[disabled] .btn-success.active {
+ background-color: #5cb85c;
+ border-color: #4cae4c;
+}
+.btn-success .badge {
+ color: #5cb85c;
+ background-color: #fff;
+}
+.btn-info {
+ color: #fff;
+ background-color: #5bc0de;
+ border-color: #46b8da;
+}
+.btn-info:hover,
+.btn-info:focus,
+.btn-info.focus,
+.btn-info:active,
+.btn-info.active,
+.open > .dropdown-toggle.btn-info {
+ color: #fff;
+ background-color: #31b0d5;
+ border-color: #269abc;
+}
+.btn-info:active,
+.btn-info.active,
+.open > .dropdown-toggle.btn-info {
+ background-image: none;
+}
+.btn-info.disabled,
+.btn-info[disabled],
+fieldset[disabled] .btn-info,
+.btn-info.disabled:hover,
+.btn-info[disabled]:hover,
+fieldset[disabled] .btn-info:hover,
+.btn-info.disabled:focus,
+.btn-info[disabled]:focus,
+fieldset[disabled] .btn-info:focus,
+.btn-info.disabled.focus,
+.btn-info[disabled].focus,
+fieldset[disabled] .btn-info.focus,
+.btn-info.disabled:active,
+.btn-info[disabled]:active,
+fieldset[disabled] .btn-info:active,
+.btn-info.disabled.active,
+.btn-info[disabled].active,
+fieldset[disabled] .btn-info.active {
+ background-color: #5bc0de;
+ border-color: #46b8da;
+}
+.btn-info .badge {
+ color: #5bc0de;
+ background-color: #fff;
+}
+.btn-warning {
+ color: #fff;
+ background-color: #f0ad4e;
+ border-color: #eea236;
+}
+.btn-warning:hover,
+.btn-warning:focus,
+.btn-warning.focus,
+.btn-warning:active,
+.btn-warning.active,
+.open > .dropdown-toggle.btn-warning {
+ color: #fff;
+ background-color: #ec971f;
+ border-color: #d58512;
+}
+.btn-warning:active,
+.btn-warning.active,
+.open > .dropdown-toggle.btn-warning {
+ background-image: none;
+}
+.btn-warning.disabled,
+.btn-warning[disabled],
+fieldset[disabled] .btn-warning,
+.btn-warning.disabled:hover,
+.btn-warning[disabled]:hover,
+fieldset[disabled] .btn-warning:hover,
+.btn-warning.disabled:focus,
+.btn-warning[disabled]:focus,
+fieldset[disabled] .btn-warning:focus,
+.btn-warning.disabled.focus,
+.btn-warning[disabled].focus,
+fieldset[disabled] .btn-warning.focus,
+.btn-warning.disabled:active,
+.btn-warning[disabled]:active,
+fieldset[disabled] .btn-warning:active,
+.btn-warning.disabled.active,
+.btn-warning[disabled].active,
+fieldset[disabled] .btn-warning.active {
+ background-color: #f0ad4e;
+ border-color: #eea236;
+}
+.btn-warning .badge {
+ color: #f0ad4e;
+ background-color: #fff;
+}
+.btn-danger {
+ color: #fff;
+ background-color: #d9534f;
+ border-color: #d43f3a;
+}
+.btn-danger:hover,
+.btn-danger:focus,
+.btn-danger.focus,
+.btn-danger:active,
+.btn-danger.active,
+.open > .dropdown-toggle.btn-danger {
+ color: #fff;
+ background-color: #c9302c;
+ border-color: #ac2925;
+}
+.btn-danger:active,
+.btn-danger.active,
+.open > .dropdown-toggle.btn-danger {
+ background-image: none;
+}
+.btn-danger.disabled,
+.btn-danger[disabled],
+fieldset[disabled] .btn-danger,
+.btn-danger.disabled:hover,
+.btn-danger[disabled]:hover,
+fieldset[disabled] .btn-danger:hover,
+.btn-danger.disabled:focus,
+.btn-danger[disabled]:focus,
+fieldset[disabled] .btn-danger:focus,
+.btn-danger.disabled.focus,
+.btn-danger[disabled].focus,
+fieldset[disabled] .btn-danger.focus,
+.btn-danger.disabled:active,
+.btn-danger[disabled]:active,
+fieldset[disabled] .btn-danger:active,
+.btn-danger.disabled.active,
+.btn-danger[disabled].active,
+fieldset[disabled] .btn-danger.active {
+ background-color: #d9534f;
+ border-color: #d43f3a;
+}
+.btn-danger .badge {
+ color: #d9534f;
+ background-color: #fff;
+}
+.btn-link {
+ font-weight: normal;
+ color: #337ab7;
+ border-radius: 0;
+}
+.btn-link,
+.btn-link:active,
+.btn-link.active,
+.btn-link[disabled],
+fieldset[disabled] .btn-link {
+ background-color: transparent;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+}
+.btn-link,
+.btn-link:hover,
+.btn-link:focus,
+.btn-link:active {
+ border-color: transparent;
+}
+.btn-link:hover,
+.btn-link:focus {
+ color: #23527c;
+ text-decoration: underline;
+ background-color: transparent;
+}
+.btn-link[disabled]:hover,
+fieldset[disabled] .btn-link:hover,
+.btn-link[disabled]:focus,
+fieldset[disabled] .btn-link:focus {
+ color: #777;
+ text-decoration: none;
+}
+.btn-lg,
+.btn-group-lg > .btn {
+ padding: 10px 16px;
+ font-size: 18px;
+ line-height: 1.33;
+ border-radius: 6px;
+}
+.btn-sm,
+.btn-group-sm > .btn {
+ padding: 5px 10px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px;
+}
+.btn-xs,
+.btn-group-xs > .btn {
+ padding: 1px 5px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px;
+}
+.btn-block {
+ display: block;
+ width: 100%;
+}
+.btn-block + .btn-block {
+ margin-top: 5px;
+}
+input[type="submit"].btn-block,
+input[type="reset"].btn-block,
+input[type="button"].btn-block {
+ width: 100%;
+}
+.fade {
+ opacity: 0;
+ -webkit-transition: opacity .15s linear;
+ -o-transition: opacity .15s linear;
+ transition: opacity .15s linear;
+}
+.fade.in {
+ opacity: 1;
+}
+.collapse {
+ display: none;
+ visibility: hidden;
+}
+.collapse.in {
+ display: block;
+ visibility: visible;
+}
+tr.collapse.in {
+ display: table-row;
+}
+tbody.collapse.in {
+ display: table-row-group;
+}
+.collapsing {
+ position: relative;
+ height: 0;
+ overflow: hidden;
+ -webkit-transition-timing-function: ease;
+ -o-transition-timing-function: ease;
+ transition-timing-function: ease;
+ -webkit-transition-duration: .35s;
+ -o-transition-duration: .35s;
+ transition-duration: .35s;
+ -webkit-transition-property: height, visibility;
+ -o-transition-property: height, visibility;
+ transition-property: height, visibility;
+}
+.caret {
+ display: inline-block;
+ width: 0;
+ height: 0;
+ margin-left: 2px;
+ vertical-align: middle;
+ border-top: 4px solid;
+ border-right: 4px solid transparent;
+ border-left: 4px solid transparent;
+}
+.dropdown {
+ position: relative;
+}
+.dropdown-toggle:focus {
+ outline: 0;
+}
+.dropdown-menu {
+ position: absolute;
+ top: 100%;
+ left: 0;
+ z-index: 1000;
+ display: none;
+ float: left;
+ min-width: 160px;
+ padding: 5px 0;
+ 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: 1px solid rgba(0, 0, 0, .15);
+ border-radius: 4px;
+ -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
+ box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
+}
+.dropdown-menu.pull-right {
+ right: 0;
+ left: auto;
+}
+.dropdown-menu .divider {
+ height: 1px;
+ margin: 9px 0;
+ overflow: hidden;
+ background-color: #e5e5e5;
+}
+.dropdown-menu > li > a {
+ display: block;
+ padding: 3px 20px;
+ clear: both;
+ font-weight: normal;
+ line-height: 1.42857143;
+ color: #333;
+ white-space: nowrap;
+}
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus {
+ color: #262626;
+ text-decoration: none;
+ background-color: #f5f5f5;
+}
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+ color: #fff;
+ text-decoration: none;
+ background-color: #337ab7;
+ outline: 0;
+}
+.dropdown-menu > .disabled > a,
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+ color: #777;
+}
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+ text-decoration: none;
+ cursor: not-allowed;
+ background-color: transparent;
+ background-image: none;
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.open > .dropdown-menu {
+ display: block;
+}
+.open > a {
+ outline: 0;
+}
+.dropdown-menu-right {
+ right: 0;
+ left: auto;
+}
+.dropdown-menu-left {
+ right: auto;
+ left: 0;
+}
+.dropdown-header {
+ display: block;
+ padding: 3px 20px;
+ font-size: 12px;
+ line-height: 1.42857143;
+ color: #777;
+ white-space: nowrap;
+}
+.dropdown-backdrop {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 990;
+}
+.pull-right > .dropdown-menu {
+ right: 0;
+ left: auto;
+}
+.dropup .caret,
+.navbar-fixed-bottom .dropdown .caret {
+ content: "";
+ border-top: 0;
+ border-bottom: 4px solid;
+}
+.dropup .dropdown-menu,
+.navbar-fixed-bottom .dropdown .dropdown-menu {
+ top: auto;
+ bottom: 100%;
+ margin-bottom: 1px;
+}
+@media (min-width: 768px) {
+ .navbar-right .dropdown-menu {
+ right: 0;
+ left: auto;
+ }
+ .navbar-right .dropdown-menu-left {
+ right: auto;
+ left: 0;
+ }
+}
+.btn-group,
+.btn-group-vertical {
+ position: relative;
+ display: inline-block;
+ vertical-align: middle;
+}
+.btn-group > .btn,
+.btn-group-vertical > .btn {
+ position: relative;
+ float: left;
+}
+.btn-group > .btn:hover,
+.btn-group-vertical > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group-vertical > .btn:focus,
+.btn-group > .btn:active,
+.btn-group-vertical > .btn:active,
+.btn-group > .btn.active,
+.btn-group-vertical > .btn.active {
+ z-index: 2;
+}
+.btn-group .btn + .btn,
+.btn-group .btn + .btn-group,
+.btn-group .btn-group + .btn,
+.btn-group .btn-group + .btn-group {
+ margin-left: -1px;
+}
+.btn-toolbar {
+ margin-left: -5px;
+}
+.btn-toolbar .btn-group,
+.btn-toolbar .input-group {
+ float: left;
+}
+.btn-toolbar > .btn,
+.btn-toolbar > .btn-group,
+.btn-toolbar > .input-group {
+ margin-left: 5px;
+}
+.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
+ border-radius: 0;
+}
+.btn-group > .btn:first-child {
+ margin-left: 0;
+}
+.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+.btn-group > .btn:last-child:not(:first-child),
+.btn-group > .dropdown-toggle:not(:first-child) {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.btn-group > .btn-group {
+ float: left;
+}
+.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
+ border-radius: 0;
+}
+.btn-group > .btn-group:first-child > .btn:last-child,
+.btn-group > .btn-group:first-child > .dropdown-toggle {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+.btn-group > .btn-group:last-child > .btn:first-child {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+ outline: 0;
+}
+.btn-group > .btn + .dropdown-toggle {
+ padding-right: 8px;
+ padding-left: 8px;
+}
+.btn-group > .btn-lg + .dropdown-toggle {
+ padding-right: 12px;
+ padding-left: 12px;
+}
+.btn-group.open .dropdown-toggle {
+ -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+ box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+}
+.btn-group.open .dropdown-toggle.btn-link {
+ -webkit-box-shadow: none;
+ box-shadow: none;
+}
+.btn .caret {
+ margin-left: 0;
+}
+.btn-lg .caret {
+ border-width: 5px 5px 0;
+ border-bottom-width: 0;
+}
+.dropup .btn-lg .caret {
+ border-width: 0 5px 5px;
+}
+.btn-group-vertical > .btn,
+.btn-group-vertical > .btn-group,
+.btn-group-vertical > .btn-group > .btn {
+ display: block;
+ float: none;
+ width: 100%;
+ max-width: 100%;
+}
+.btn-group-vertical > .btn-group > .btn {
+ float: none;
+}
+.btn-group-vertical > .btn + .btn,
+.btn-group-vertical > .btn + .btn-group,
+.btn-group-vertical > .btn-group + .btn,
+.btn-group-vertical > .btn-group + .btn-group {
+ margin-top: -1px;
+ margin-left: 0;
+}
+.btn-group-vertical > .btn:not(:first-child):not(:last-child) {
+ border-radius: 0;
+}
+.btn-group-vertical > .btn:first-child:not(:last-child) {
+ border-top-right-radius: 4px;
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn:last-child:not(:first-child) {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+ border-bottom-left-radius: 4px;
+}
+.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
+ border-radius: 0;
+}
+.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,
+.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+.btn-group-justified {
+ display: table;
+ width: 100%;
+ table-layout: fixed;
+ border-collapse: separate;
+}
+.btn-group-justified > .btn,
+.btn-group-justified > .btn-group {
+ display: table-cell;
+ float: none;
+ width: 1%;
+}
+.btn-group-justified > .btn-group .btn {
+ width: 100%;
+}
+.btn-group-justified > .btn-group .dropdown-menu {
+ left: auto;
+}
+[data-toggle="buttons"] > .btn input[type="radio"],
+[data-toggle="buttons"] > .btn-group > .btn input[type="radio"],
+[data-toggle="buttons"] > .btn input[type="checkbox"],
+[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] {
+ position: absolute;
+ clip: rect(0, 0, 0, 0);
+ pointer-events: none;
+}
+.input-group {
+ position: relative;
+ display: table;
+ border-collapse: separate;
+}
+.input-group[class*="col-"] {
+ float: none;
+ padding-right: 0;
+ padding-left: 0;
+}
+.input-group .form-control {
+ position: relative;
+ z-index: 2;
+ float: left;
+ width: 100%;
+ margin-bottom: 0;
+}
+.input-group-lg > .form-control,
+.input-group-lg > .input-group-addon,
+.input-group-lg > .input-group-btn > .btn {
+ height: 46px;
+ padding: 10px 16px;
+ font-size: 18px;
+ line-height: 1.33;
+ border-radius: 6px;
+}
+select.input-group-lg > .form-control,
+select.input-group-lg > .input-group-addon,
+select.input-group-lg > .input-group-btn > .btn {
+ height: 46px;
+ line-height: 46px;
+}
+textarea.input-group-lg > .form-control,
+textarea.input-group-lg > .input-group-addon,
+textarea.input-group-lg > .input-group-btn > .btn,
+select[multiple].input-group-lg > .form-control,
+select[multiple].input-group-lg > .input-group-addon,
+select[multiple].input-group-lg > .input-group-btn > .btn {
+ height: auto;
+}
+.input-group-sm > .form-control,
+.input-group-sm > .input-group-addon,
+.input-group-sm > .input-group-btn > .btn {
+ height: 30px;
+ padding: 5px 10px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px;
+}
+select.input-group-sm > .form-control,
+select.input-group-sm > .input-group-addon,
+select.input-group-sm > .input-group-btn > .btn {
+ height: 30px;
+ line-height: 30px;
+}
+textarea.input-group-sm > .form-control,
+textarea.input-group-sm > .input-group-addon,
+textarea.input-group-sm > .input-group-btn > .btn,
+select[multiple].input-group-sm > .form-control,
+select[multiple].input-group-sm > .input-group-addon,
+select[multiple].input-group-sm > .input-group-btn > .btn {
+ height: auto;
+}
+.input-group-addon,
+.input-group-btn,
+.input-group .form-control {
+ display: table-cell;
+}
+.input-group-addon:not(:first-child):not(:last-child),
+.input-group-btn:not(:first-child):not(:last-child),
+.input-group .form-control:not(:first-child):not(:last-child) {
+ border-radius: 0;
+}
+.input-group-addon,
+.input-group-btn {
+ width: 1%;
+ white-space: nowrap;
+ vertical-align: middle;
+}
+.input-group-addon {
+ padding: 6px 12px;
+ font-size: 14px;
+ font-weight: normal;
+ line-height: 1;
+ color: #555;
+ text-align: center;
+ background-color: #eee;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+}
+.input-group-addon.input-sm {
+ padding: 5px 10px;
+ font-size: 12px;
+ border-radius: 3px;
+}
+.input-group-addon.input-lg {
+ padding: 10px 16px;
+ font-size: 18px;
+ border-radius: 6px;
+}
+.input-group-addon input[type="radio"],
+.input-group-addon input[type="checkbox"] {
+ margin-top: 0;
+}
+.input-group .form-control:first-child,
+.input-group-addon:first-child,
+.input-group-btn:first-child > .btn,
+.input-group-btn:first-child > .btn-group > .btn,
+.input-group-btn:first-child > .dropdown-toggle,
+.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
+.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+.input-group-addon:first-child {
+ border-right: 0;
+}
+.input-group .form-control:last-child,
+.input-group-addon:last-child,
+.input-group-btn:last-child > .btn,
+.input-group-btn:last-child > .btn-group > .btn,
+.input-group-btn:last-child > .dropdown-toggle,
+.input-group-btn:first-child > .btn:not(:first-child),
+.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.input-group-addon:last-child {
+ border-left: 0;
+}
+.input-group-btn {
+ position: relative;
+ font-size: 0;
+ white-space: nowrap;
+}
+.input-group-btn > .btn {
+ position: relative;
+}
+.input-group-btn > .btn + .btn {
+ margin-left: -1px;
+}
+.input-group-btn > .btn:hover,
+.input-group-btn > .btn:focus,
+.input-group-btn > .btn:active {
+ z-index: 2;
+}
+.input-group-btn:first-child > .btn,
+.input-group-btn:first-child > .btn-group {
+ margin-right: -1px;
+}
+.input-group-btn:last-child > .btn,
+.input-group-btn:last-child > .btn-group {
+ margin-left: -1px;
+}
+.nav {
+ padding-left: 0;
+ margin-bottom: 0;
+ list-style: none;
+}
+.nav > li {
+ position: relative;
+ display: block;
+}
+.nav > li > a {
+ position: relative;
+ display: block;
+ padding: 10px 15px;
+}
+.nav > li > a:hover,
+.nav > li > a:focus {
+ text-decoration: none;
+ background-color: #eee;
+}
+.nav > li.disabled > a {
+ color: #777;
+}
+.nav > li.disabled > a:hover,
+.nav > li.disabled > a:focus {
+ color: #777;
+ text-decoration: none;
+ cursor: not-allowed;
+ background-color: transparent;
+}
+.nav .open > a,
+.nav .open > a:hover,
+.nav .open > a:focus {
+ background-color: #eee;
+ border-color: #337ab7;
+}
+.nav .nav-divider {
+ height: 1px;
+ margin: 9px 0;
+ overflow: hidden;
+ background-color: #e5e5e5;
+}
+.nav > li > a > img {
+ max-width: none;
+}
+.nav-tabs {
+ border-bottom: 1px solid #ddd;
+}
+.nav-tabs > li {
+ float: left;
+ margin-bottom: -1px;
+}
+.nav-tabs > li > a {
+ margin-right: 2px;
+ line-height: 1.42857143;
+ border: 1px solid transparent;
+ border-radius: 4px 4px 0 0;
+}
+.nav-tabs > li > a:hover {
+ border-color: #eee #eee #ddd;
+}
+.nav-tabs > li.active > a,
+.nav-tabs > li.active > a:hover,
+.nav-tabs > li.active > a:focus {
+ color: #555;
+ cursor: default;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ border-bottom-color: transparent;
+}
+.nav-tabs.nav-justified {
+ width: 100%;
+ border-bottom: 0;
+}
+.nav-tabs.nav-justified > li {
+ float: none;
+}
+.nav-tabs.nav-justified > li > a {
+ margin-bottom: 5px;
+ text-align: center;
+}
+.nav-tabs.nav-justified > .dropdown .dropdown-menu {
+ top: auto;
+ left: auto;
+}
+@media (min-width: 768px) {
+ .nav-tabs.nav-justified > li {
+ display: table-cell;
+ width: 1%;
+ }
+ .nav-tabs.nav-justified > li > a {
+ margin-bottom: 0;
+ }
+}
+.nav-tabs.nav-justified > li > a {
+ margin-right: 0;
+ border-radius: 4px;
+}
+.nav-tabs.nav-justified > .active > a,
+.nav-tabs.nav-justified > .active > a:hover,
+.nav-tabs.nav-justified > .active > a:focus {
+ border: 1px solid #ddd;
+}
+@media (min-width: 768px) {
+ .nav-tabs.nav-justified > li > a {
+ border-bottom: 1px solid #ddd;
+ border-radius: 4px 4px 0 0;
+ }
+ .nav-tabs.nav-justified > .active > a,
+ .nav-tabs.nav-justified > .active > a:hover,
+ .nav-tabs.nav-justified > .active > a:focus {
+ border-bottom-color: #fff;
+ }
+}
+.nav-pills > li {
+ float: left;
+}
+.nav-pills > li > a {
+ border-radius: 4px;
+}
+.nav-pills > li + li {
+ margin-left: 2px;
+}
+.nav-pills > li.active > a,
+.nav-pills > li.active > a:hover,
+.nav-pills > li.active > a:focus {
+ color: #fff;
+ background-color: #337ab7;
+}
+.nav-stacked > li {
+ float: none;
+}
+.nav-stacked > li + li {
+ margin-top: 2px;
+ margin-left: 0;
+}
+.nav-justified {
+ width: 100%;
+}
+.nav-justified > li {
+ float: none;
+}
+.nav-justified > li > a {
+ margin-bottom: 5px;
+ text-align: center;
+}
+.nav-justified > .dropdown .dropdown-menu {
+ top: auto;
+ left: auto;
+}
+@media (min-width: 768px) {
+ .nav-justified > li {
+ display: table-cell;
+ width: 1%;
+ }
+ .nav-justified > li > a {
+ margin-bottom: 0;
+ }
+}
+.nav-tabs-justified {
+ border-bottom: 0;
+}
+.nav-tabs-justified > li > a {
+ margin-right: 0;
+ border-radius: 4px;
+}
+.nav-tabs-justified > .active > a,
+.nav-tabs-justified > .active > a:hover,
+.nav-tabs-justified > .active > a:focus {
+ border: 1px solid #ddd;
+}
+@media (min-width: 768px) {
+ .nav-tabs-justified > li > a {
+ border-bottom: 1px solid #ddd;
+ border-radius: 4px 4px 0 0;
+ }
+ .nav-tabs-justified > .active > a,
+ .nav-tabs-justified > .active > a:hover,
+ .nav-tabs-justified > .active > a:focus {
+ border-bottom-color: #fff;
+ }
+}
+.tab-content > .tab-pane {
+ display: none;
+ visibility: hidden;
+}
+.tab-content > .active {
+ display: block;
+ visibility: visible;
+}
+.nav-tabs .dropdown-menu {
+ margin-top: -1px;
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+.navbar {
+ position: relative;
+ min-height: 50px;
+ margin-bottom: 20px;
+ border: 1px solid transparent;
+}
+@media (min-width: 768px) {
+ .navbar {
+ border-radius: 4px;
+ }
+}
+@media (min-width: 768px) {
+ .navbar-header {
+ float: left;
+ }
+}
+.navbar-collapse {
+ padding-right: 15px;
+ padding-left: 15px;
+ overflow-x: visible;
+ -webkit-overflow-scrolling: touch;
+ border-top: 1px solid transparent;
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);
+}
+.navbar-collapse.in {
+ overflow-y: auto;
+}
+@media (min-width: 768px) {
+ .navbar-collapse {
+ width: auto;
+ border-top: 0;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ }
+ .navbar-collapse.collapse {
+ display: block !important;
+ height: auto !important;
+ padding-bottom: 0;
+ overflow: visible !important;
+ visibility: visible !important;
+ }
+ .navbar-collapse.in {
+ overflow-y: visible;
+ }
+ .navbar-fixed-top .navbar-collapse,
+ .navbar-static-top .navbar-collapse,
+ .navbar-fixed-bottom .navbar-collapse {
+ padding-right: 0;
+ padding-left: 0;
+ }
+}
+.navbar-fixed-top .navbar-collapse,
+.navbar-fixed-bottom .navbar-collapse {
+ max-height: 340px;
+}
+@media (max-device-width: 480px) and (orientation: landscape) {
+ .navbar-fixed-top .navbar-collapse,
+ .navbar-fixed-bottom .navbar-collapse {
+ max-height: 200px;
+ }
+}
+.container > .navbar-header,
+.container-fluid > .navbar-header,
+.container > .navbar-collapse,
+.container-fluid > .navbar-collapse {
+ margin-right: -15px;
+ margin-left: -15px;
+}
+@media (min-width: 768px) {
+ .container > .navbar-header,
+ .container-fluid > .navbar-header,
+ .container > .navbar-collapse,
+ .container-fluid > .navbar-collapse {
+ margin-right: 0;
+ margin-left: 0;
+ }
+}
+.navbar-static-top {
+ z-index: 1000;
+ border-width: 0 0 1px;
+}
+@media (min-width: 768px) {
+ .navbar-static-top {
+ border-radius: 0;
+ }
+}
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+ position: fixed;
+ right: 0;
+ left: 0;
+ z-index: 1030;
+}
+@media (min-width: 768px) {
+ .navbar-fixed-top,
+ .navbar-fixed-bottom {
+ border-radius: 0;
+ }
+}
+.navbar-fixed-top {
+ top: 0;
+ border-width: 0 0 1px;
+}
+.navbar-fixed-bottom {
+ bottom: 0;
+ margin-bottom: 0;
+ border-width: 1px 0 0;
+}
+.navbar-brand {
+ float: left;
+ height: 50px;
+ padding: 15px 15px;
+ font-size: 18px;
+ line-height: 20px;
+}
+.navbar-brand:hover,
+.navbar-brand:focus {
+ text-decoration: none;
+}
+.navbar-brand > img {
+ display: block;
+}
+@media (min-width: 768px) {
+ .navbar > .container .navbar-brand,
+ .navbar > .container-fluid .navbar-brand {
+ margin-left: -15px;
+ }
+}
+.navbar-toggle {
+ position: relative;
+ float: right;
+ padding: 9px 10px;
+ margin-top: 8px;
+ margin-right: 15px;
+ margin-bottom: 8px;
+ background-color: transparent;
+ background-image: none;
+ border: 1px solid transparent;
+ border-radius: 4px;
+}
+.navbar-toggle:focus {
+ outline: 0;
+}
+.navbar-toggle .icon-bar {
+ display: block;
+ width: 22px;
+ height: 2px;
+ border-radius: 1px;
+}
+.navbar-toggle .icon-bar + .icon-bar {
+ margin-top: 4px;
+}
+@media (min-width: 768px) {
+ .navbar-toggle {
+ display: none;
+ }
+}
+.navbar-nav {
+ margin: 7.5px -15px;
+}
+.navbar-nav > li > a {
+ padding-top: 10px;
+ padding-bottom: 10px;
+ line-height: 20px;
+}
+@media (max-width: 767px) {
+ .navbar-nav .open .dropdown-menu {
+ position: static;
+ float: none;
+ width: auto;
+ margin-top: 0;
+ background-color: transparent;
+ border: 0;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ }
+ .navbar-nav .open .dropdown-menu > li > a,
+ .navbar-nav .open .dropdown-menu .dropdown-header {
+ padding: 5px 15px 5px 25px;
+ }
+ .navbar-nav .open .dropdown-menu > li > a {
+ line-height: 20px;
+ }
+ .navbar-nav .open .dropdown-menu > li > a:hover,
+ .navbar-nav .open .dropdown-menu > li > a:focus {
+ background-image: none;
+ }
+}
+@media (min-width: 768px) {
+ .navbar-nav {
+ float: left;
+ margin: 0;
+ }
+ .navbar-nav > li {
+ float: left;
+ }
+ .navbar-nav > li > a {
+ padding-top: 15px;
+ padding-bottom: 15px;
+ }
+}
+.navbar-form {
+ padding: 10px 15px;
+ margin-top: 8px;
+ margin-right: -15px;
+ margin-bottom: 8px;
+ margin-left: -15px;
+ border-top: 1px solid transparent;
+ border-bottom: 1px solid transparent;
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);
+}
+@media (min-width: 768px) {
+ .navbar-form .form-group {
+ display: inline-block;
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .navbar-form .form-control {
+ display: inline-block;
+ width: auto;
+ vertical-align: middle;
+ }
+ .navbar-form .form-control-static {
+ display: inline-block;
+ }
+ .navbar-form .input-group {
+ display: inline-table;
+ vertical-align: middle;
+ }
+ .navbar-form .input-group .input-group-addon,
+ .navbar-form .input-group .input-group-btn,
+ .navbar-form .input-group .form-control {
+ width: auto;
+ }
+ .navbar-form .input-group > .form-control {
+ width: 100%;
+ }
+ .navbar-form .control-label {
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .navbar-form .radio,
+ .navbar-form .checkbox {
+ display: inline-block;
+ margin-top: 0;
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .navbar-form .radio label,
+ .navbar-form .checkbox label {
+ padding-left: 0;
+ }
+ .navbar-form .radio input[type="radio"],
+ .navbar-form .checkbox input[type="checkbox"] {
+ position: relative;
+ margin-left: 0;
+ }
+ .navbar-form .has-feedback .form-control-feedback {
+ top: 0;
+ }
+}
+@media (max-width: 767px) {
+ .navbar-form .form-group {
+ margin-bottom: 5px;
+ }
+ .navbar-form .form-group:last-child {
+ margin-bottom: 0;
+ }
+}
+@media (min-width: 768px) {
+ .navbar-form {
+ width: auto;
+ padding-top: 0;
+ padding-bottom: 0;
+ margin-right: 0;
+ margin-left: 0;
+ border: 0;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ }
+}
+.navbar-nav > li > .dropdown-menu {
+ margin-top: 0;
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
+ border-top-left-radius: 4px;
+ border-top-right-radius: 4px;
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.navbar-btn {
+ margin-top: 8px;
+ margin-bottom: 8px;
+}
+.navbar-btn.btn-sm {
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+.navbar-btn.btn-xs {
+ margin-top: 14px;
+ margin-bottom: 14px;
+}
+.navbar-text {
+ margin-top: 15px;
+ margin-bottom: 15px;
+}
+@media (min-width: 768px) {
+ .navbar-text {
+ float: left;
+ margin-right: 15px;
+ margin-left: 15px;
+ }
+}
+@media (min-width: 768px) {
+ .navbar-left {
+ float: left !important;
+ }
+ .navbar-right {
+ float: right !important;
+ margin-right: -15px;
+ }
+ .navbar-right ~ .navbar-right {
+ margin-right: 0;
+ }
+}
+.navbar-default {
+ background-color: #f8f8f8;
+ border-color: #e7e7e7;
+}
+.navbar-default .navbar-brand {
+ color: #777;
+}
+.navbar-default .navbar-brand:hover,
+.navbar-default .navbar-brand:focus {
+ color: #5e5e5e;
+ background-color: transparent;
+}
+.navbar-default .navbar-text {
+ color: #777;
+}
+.navbar-default .navbar-nav > li > a {
+ color: #777;
+}
+.navbar-default .navbar-nav > li > a:hover,
+.navbar-default .navbar-nav > li > a:focus {
+ color: #333;
+ background-color: transparent;
+}
+.navbar-default .navbar-nav > .active > a,
+.navbar-default .navbar-nav > .active > a:hover,
+.navbar-default .navbar-nav > .active > a:focus {
+ color: #555;
+ background-color: #e7e7e7;
+}
+.navbar-default .navbar-nav > .disabled > a,
+.navbar-default .navbar-nav > .disabled > a:hover,
+.navbar-default .navbar-nav > .disabled > a:focus {
+ color: #ccc;
+ background-color: transparent;
+}
+.navbar-default .navbar-toggle {
+ border-color: #ddd;
+}
+.navbar-default .navbar-toggle:hover,
+.navbar-default .navbar-toggle:focus {
+ background-color: #ddd;
+}
+.navbar-default .navbar-toggle .icon-bar {
+ background-color: #888;
+}
+.navbar-default .navbar-collapse,
+.navbar-default .navbar-form {
+ border-color: #e7e7e7;
+}
+.navbar-default .navbar-nav > .open > a,
+.navbar-default .navbar-nav > .open > a:hover,
+.navbar-default .navbar-nav > .open > a:focus {
+ color: #555;
+ background-color: #e7e7e7;
+}
+@media (max-width: 767px) {
+ .navbar-default .navbar-nav .open .dropdown-menu > li > a {
+ color: #777;
+ }
+ .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,
+ .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
+ color: #333;
+ background-color: transparent;
+ }
+ .navbar-default .navbar-nav .open .dropdown-menu > .active > a,
+ .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,
+ .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {
+ color: #555;
+ background-color: #e7e7e7;
+ }
+ .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,
+ .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,
+ .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+ color: #ccc;
+ background-color: transparent;
+ }
+}
+.navbar-default .navbar-link {
+ color: #777;
+}
+.navbar-default .navbar-link:hover {
+ color: #333;
+}
+.navbar-default .btn-link {
+ color: #777;
+}
+.navbar-default .btn-link:hover,
+.navbar-default .btn-link:focus {
+ color: #333;
+}
+.navbar-default .btn-link[disabled]:hover,
+fieldset[disabled] .navbar-default .btn-link:hover,
+.navbar-default .btn-link[disabled]:focus,
+fieldset[disabled] .navbar-default .btn-link:focus {
+ color: #ccc;
+}
+.navbar-inverse {
+ background-color: #222;
+ border-color: #080808;
+}
+.navbar-inverse .navbar-brand {
+ color: #9d9d9d;
+}
+.navbar-inverse .navbar-brand:hover,
+.navbar-inverse .navbar-brand:focus {
+ color: #fff;
+ background-color: transparent;
+}
+.navbar-inverse .navbar-text {
+ color: #9d9d9d;
+}
+.navbar-inverse .navbar-nav > li > a {
+ color: #9d9d9d;
+}
+.navbar-inverse .navbar-nav > li > a:hover,
+.navbar-inverse .navbar-nav > li > a:focus {
+ color: #fff;
+ background-color: transparent;
+}
+.navbar-inverse .navbar-nav > .active > a,
+.navbar-inverse .navbar-nav > .active > a:hover,
+.navbar-inverse .navbar-nav > .active > a:focus {
+ color: #fff;
+ background-color: #080808;
+}
+.navbar-inverse .navbar-nav > .disabled > a,
+.navbar-inverse .navbar-nav > .disabled > a:hover,
+.navbar-inverse .navbar-nav > .disabled > a:focus {
+ color: #444;
+ background-color: transparent;
+}
+.navbar-inverse .navbar-toggle {
+ border-color: #333;
+}
+.navbar-inverse .navbar-toggle:hover,
+.navbar-inverse .navbar-toggle:focus {
+ background-color: #333;
+}
+.navbar-inverse .navbar-toggle .icon-bar {
+ background-color: #fff;
+}
+.navbar-inverse .navbar-collapse,
+.navbar-inverse .navbar-form {
+ border-color: #101010;
+}
+.navbar-inverse .navbar-nav > .open > a,
+.navbar-inverse .navbar-nav > .open > a:hover,
+.navbar-inverse .navbar-nav > .open > a:focus {
+ color: #fff;
+ background-color: #080808;
+}
+@media (max-width: 767px) {
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {
+ border-color: #080808;
+ }
+ .navbar-inverse .navbar-nav .open .dropdown-menu .divider {
+ background-color: #080808;
+ }
+ .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
+ color: #9d9d9d;
+ }
+ .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,
+ .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {
+ color: #fff;
+ background-color: transparent;
+ }
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {
+ color: #fff;
+ background-color: #080808;
+ }
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+ color: #444;
+ background-color: transparent;
+ }
+}
+.navbar-inverse .navbar-link {
+ color: #9d9d9d;
+}
+.navbar-inverse .navbar-link:hover {
+ color: #fff;
+}
+.navbar-inverse .btn-link {
+ color: #9d9d9d;
+}
+.navbar-inverse .btn-link:hover,
+.navbar-inverse .btn-link:focus {
+ color: #fff;
+}
+.navbar-inverse .btn-link[disabled]:hover,
+fieldset[disabled] .navbar-inverse .btn-link:hover,
+.navbar-inverse .btn-link[disabled]:focus,
+fieldset[disabled] .navbar-inverse .btn-link:focus {
+ color: #444;
+}
+.breadcrumb {
+ padding: 8px 15px;
+ margin-bottom: 20px;
+ list-style: none;
+ background-color: #f5f5f5;
+ border-radius: 4px;
+}
+.breadcrumb > li {
+ display: inline-block;
+}
+.breadcrumb > li + li:before {
+ padding: 0 5px;
+ color: #ccc;
+ content: "/\00a0";
+}
+.breadcrumb > .active {
+ color: #777;
+}
+.pagination {
+ display: inline-block;
+ padding-left: 0;
+ margin: 20px 0;
+ border-radius: 4px;
+}
+.pagination > li {
+ display: inline;
+}
+.pagination > li > a,
+.pagination > li > span {
+ position: relative;
+ float: left;
+ padding: 6px 12px;
+ margin-left: -1px;
+ line-height: 1.42857143;
+ color: #337ab7;
+ text-decoration: none;
+ background-color: #fff;
+ border: 1px solid #ddd;
+}
+.pagination > li:first-child > a,
+.pagination > li:first-child > span {
+ margin-left: 0;
+ border-top-left-radius: 4px;
+ border-bottom-left-radius: 4px;
+}
+.pagination > li:last-child > a,
+.pagination > li:last-child > span {
+ border-top-right-radius: 4px;
+ border-bottom-right-radius: 4px;
+}
+.pagination > li > a:hover,
+.pagination > li > span:hover,
+.pagination > li > a:focus,
+.pagination > li > span:focus {
+ color: #23527c;
+ background-color: #eee;
+ border-color: #ddd;
+}
+.pagination > .active > a,
+.pagination > .active > span,
+.pagination > .active > a:hover,
+.pagination > .active > span:hover,
+.pagination > .active > a:focus,
+.pagination > .active > span:focus {
+ z-index: 2;
+ color: #fff;
+ cursor: default;
+ background-color: #337ab7;
+ border-color: #337ab7;
+}
+.pagination > .disabled > span,
+.pagination > .disabled > span:hover,
+.pagination > .disabled > span:focus,
+.pagination > .disabled > a,
+.pagination > .disabled > a:hover,
+.pagination > .disabled > a:focus {
+ color: #777;
+ cursor: not-allowed;
+ background-color: #fff;
+ border-color: #ddd;
+}
+.pagination-lg > li > a,
+.pagination-lg > li > span {
+ padding: 10px 16px;
+ font-size: 18px;
+}
+.pagination-lg > li:first-child > a,
+.pagination-lg > li:first-child > span {
+ border-top-left-radius: 6px;
+ border-bottom-left-radius: 6px;
+}
+.pagination-lg > li:last-child > a,
+.pagination-lg > li:last-child > span {
+ border-top-right-radius: 6px;
+ border-bottom-right-radius: 6px;
+}
+.pagination-sm > li > a,
+.pagination-sm > li > span {
+ padding: 5px 10px;
+ font-size: 12px;
+}
+.pagination-sm > li:first-child > a,
+.pagination-sm > li:first-child > span {
+ border-top-left-radius: 3px;
+ border-bottom-left-radius: 3px;
+}
+.pagination-sm > li:last-child > a,
+.pagination-sm > li:last-child > span {
+ border-top-right-radius: 3px;
+ border-bottom-right-radius: 3px;
+}
+.pager {
+ padding-left: 0;
+ margin: 20px 0;
+ text-align: center;
+ list-style: none;
+}
+.pager li {
+ display: inline;
+}
+.pager li > a,
+.pager li > span {
+ display: inline-block;
+ padding: 5px 14px;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ border-radius: 15px;
+}
+.pager li > a:hover,
+.pager li > a:focus {
+ text-decoration: none;
+ background-color: #eee;
+}
+.pager .next > a,
+.pager .next > span {
+ float: right;
+}
+.pager .previous > a,
+.pager .previous > span {
+ float: left;
+}
+.pager .disabled > a,
+.pager .disabled > a:hover,
+.pager .disabled > a:focus,
+.pager .disabled > span {
+ color: #777;
+ cursor: not-allowed;
+ background-color: #fff;
+}
+.label {
+ display: inline;
+ padding: .2em .6em .3em;
+ font-size: 75%;
+ font-weight: bold;
+ line-height: 1;
+ color: #fff;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: baseline;
+ border-radius: .25em;
+}
+a.label:hover,
+a.label:focus {
+ color: #fff;
+ text-decoration: none;
+ cursor: pointer;
+}
+.label:empty {
+ display: none;
+}
+.btn .label {
+ position: relative;
+ top: -1px;
+}
+.label-default {
+ background-color: #777;
+}
+.label-default[href]:hover,
+.label-default[href]:focus {
+ background-color: #5e5e5e;
+}
+.label-primary {
+ background-color: #337ab7;
+}
+.label-primary[href]:hover,
+.label-primary[href]:focus {
+ background-color: #286090;
+}
+.label-success {
+ background-color: #5cb85c;
+}
+.label-success[href]:hover,
+.label-success[href]:focus {
+ background-color: #449d44;
+}
+.label-info {
+ background-color: #5bc0de;
+}
+.label-info[href]:hover,
+.label-info[href]:focus {
+ background-color: #31b0d5;
+}
+.label-warning {
+ background-color: #f0ad4e;
+}
+.label-warning[href]:hover,
+.label-warning[href]:focus {
+ background-color: #ec971f;
+}
+.label-danger {
+ background-color: #d9534f;
+}
+.label-danger[href]:hover,
+.label-danger[href]:focus {
+ background-color: #c9302c;
+}
+.badge {
+ display: inline-block;
+ min-width: 10px;
+ padding: 3px 7px;
+ font-size: 12px;
+ font-weight: bold;
+ line-height: 1;
+ color: #fff;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: baseline;
+ background-color: #777;
+ border-radius: 10px;
+}
+.badge:empty {
+ display: none;
+}
+.btn .badge {
+ position: relative;
+ top: -1px;
+}
+.btn-xs .badge {
+ top: 0;
+ padding: 1px 5px;
+}
+a.badge:hover,
+a.badge:focus {
+ color: #fff;
+ text-decoration: none;
+ cursor: pointer;
+}
+.list-group-item.active > .badge,
+.nav-pills > .active > a > .badge {
+ color: #337ab7;
+ background-color: #fff;
+}
+.list-group-item > .badge {
+ float: right;
+}
+.list-group-item > .badge + .badge {
+ margin-right: 5px;
+}
+.nav-pills > li > a > .badge {
+ margin-left: 3px;
+}
+.jumbotron {
+ padding: 30px 15px;
+ margin-bottom: 30px;
+ color: inherit;
+ background-color: #eee;
+}
+.jumbotron h1,
+.jumbotron .h1 {
+ color: inherit;
+}
+.jumbotron p {
+ margin-bottom: 15px;
+ font-size: 21px;
+ font-weight: 200;
+}
+.jumbotron > hr {
+ border-top-color: #d5d5d5;
+}
+.container .jumbotron,
+.container-fluid .jumbotron {
+ border-radius: 6px;
+}
+.jumbotron .container {
+ max-width: 100%;
+}
+@media screen and (min-width: 768px) {
+ .jumbotron {
+ padding: 48px 0;
+ }
+ .container .jumbotron,
+ .container-fluid .jumbotron {
+ padding-right: 60px;
+ padding-left: 60px;
+ }
+ .jumbotron h1,
+ .jumbotron .h1 {
+ font-size: 63px;
+ }
+}
+.thumbnail {
+ display: block;
+ padding: 4px;
+ margin-bottom: 20px;
+ line-height: 1.42857143;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ border-radius: 4px;
+ -webkit-transition: border .2s ease-in-out;
+ -o-transition: border .2s ease-in-out;
+ transition: border .2s ease-in-out;
+}
+.thumbnail > img,
+.thumbnail a > img {
+ margin-right: auto;
+ margin-left: auto;
+}
+a.thumbnail:hover,
+a.thumbnail:focus,
+a.thumbnail.active {
+ border-color: #337ab7;
+}
+.thumbnail .caption {
+ padding: 9px;
+ color: #333;
+}
+.alert {
+ padding: 15px;
+ margin-bottom: 20px;
+ border: 1px solid transparent;
+ border-radius: 4px;
+}
+.alert h4 {
+ margin-top: 0;
+ color: inherit;
+}
+.alert .alert-link {
+ font-weight: bold;
+}
+.alert > p,
+.alert > ul {
+ margin-bottom: 0;
+}
+.alert > p + p {
+ margin-top: 5px;
+}
+.alert-dismissable,
+.alert-dismissible {
+ padding-right: 35px;
+}
+.alert-dismissable .close,
+.alert-dismissible .close {
+ position: relative;
+ top: -2px;
+ right: -21px;
+ color: inherit;
+}
+.alert-success {
+ color: #3c763d;
+ background-color: #dff0d8;
+ border-color: #d6e9c6;
+}
+.alert-success hr {
+ border-top-color: #c9e2b3;
+}
+.alert-success .alert-link {
+ color: #2b542c;
+}
+.alert-info {
+ color: #31708f;
+ background-color: #d9edf7;
+ border-color: #bce8f1;
+}
+.alert-info hr {
+ border-top-color: #a6e1ec;
+}
+.alert-info .alert-link {
+ color: #245269;
+}
+.alert-warning {
+ color: #8a6d3b;
+ background-color: #fcf8e3;
+ border-color: #faebcc;
+}
+.alert-warning hr {
+ border-top-color: #f7e1b5;
+}
+.alert-warning .alert-link {
+ color: #66512c;
+}
+.alert-danger {
+ color: #a94442;
+ background-color: #f2dede;
+ border-color: #ebccd1;
+}
+.alert-danger hr {
+ border-top-color: #e4b9c0;
+}
+.alert-danger .alert-link {
+ color: #843534;
+}
+@-webkit-keyframes progress-bar-stripes {
+ from {
+ background-position: 40px 0;
+ }
+ to {
+ background-position: 0 0;
+ }
+}
+@-o-keyframes progress-bar-stripes {
+ from {
+ background-position: 40px 0;
+ }
+ to {
+ background-position: 0 0;
+ }
+}
+@keyframes progress-bar-stripes {
+ from {
+ background-position: 40px 0;
+ }
+ to {
+ background-position: 0 0;
+ }
+}
+.progress {
+ height: 20px;
+ margin-bottom: 20px;
+ overflow: hidden;
+ background-color: #f5f5f5;
+ border-radius: 4px;
+ -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);
+}
+.progress-bar {
+ float: left;
+ width: 0;
+ height: 100%;
+ font-size: 12px;
+ line-height: 20px;
+ color: #fff;
+ text-align: center;
+ background-color: #337ab7;
+ -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);
+ box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);
+ -webkit-transition: width .6s ease;
+ -o-transition: width .6s ease;
+ transition: width .6s ease;
+}
+.progress-striped .progress-bar,
+.progress-bar-striped {
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+ background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+ -webkit-background-size: 40px 40px;
+ background-size: 40px 40px;
+}
+.progress.active .progress-bar,
+.progress-bar.active {
+ -webkit-animation: progress-bar-stripes 2s linear infinite;
+ -o-animation: progress-bar-stripes 2s linear infinite;
+ animation: progress-bar-stripes 2s linear infinite;
+}
+.progress-bar-success {
+ background-color: #5cb85c;
+}
+.progress-striped .progress-bar-success {
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+ background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+.progress-bar-info {
+ background-color: #5bc0de;
+}
+.progress-striped .progress-bar-info {
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+ background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+.progress-bar-warning {
+ background-color: #f0ad4e;
+}
+.progress-striped .progress-bar-warning {
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+ background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+.progress-bar-danger {
+ background-color: #d9534f;
+}
+.progress-striped .progress-bar-danger {
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+ background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+.media {
+ margin-top: 15px;
+}
+.media:first-child {
+ margin-top: 0;
+}
+.media-right,
+.media > .pull-right {
+ padding-left: 10px;
+}
+.media-left,
+.media > .pull-left {
+ padding-right: 10px;
+}
+.media-left,
+.media-right,
+.media-body {
+ display: table-cell;
+ vertical-align: top;
+}
+.media-middle {
+ vertical-align: middle;
+}
+.media-bottom {
+ vertical-align: bottom;
+}
+.media-heading {
+ margin-top: 0;
+ margin-bottom: 5px;
+}
+.media-list {
+ padding-left: 0;
+ list-style: none;
+}
+.list-group {
+ padding-left: 0;
+ margin-bottom: 20px;
+}
+.list-group-item {
+ position: relative;
+ display: block;
+ padding: 10px 15px;
+ margin-bottom: -1px;
+ background-color: #fff;
+ border: 1px solid #ddd;
+}
+.list-group-item:first-child {
+ border-top-left-radius: 4px;
+ border-top-right-radius: 4px;
+}
+.list-group-item:last-child {
+ margin-bottom: 0;
+ border-bottom-right-radius: 4px;
+ border-bottom-left-radius: 4px;
+}
+a.list-group-item {
+ color: #555;
+}
+a.list-group-item .list-group-item-heading {
+ color: #333;
+}
+a.list-group-item:hover,
+a.list-group-item:focus {
+ color: #555;
+ text-decoration: none;
+ background-color: #f5f5f5;
+}
+.list-group-item.disabled,
+.list-group-item.disabled:hover,
+.list-group-item.disabled:focus {
+ color: #777;
+ cursor: not-allowed;
+ background-color: #eee;
+}
+.list-group-item.disabled .list-group-item-heading,
+.list-group-item.disabled:hover .list-group-item-heading,
+.list-group-item.disabled:focus .list-group-item-heading {
+ color: inherit;
+}
+.list-group-item.disabled .list-group-item-text,
+.list-group-item.disabled:hover .list-group-item-text,
+.list-group-item.disabled:focus .list-group-item-text {
+ color: #777;
+}
+.list-group-item.active,
+.list-group-item.active:hover,
+.list-group-item.active:focus {
+ z-index: 2;
+ color: #fff;
+ background-color: #337ab7;
+ border-color: #337ab7;
+}
+.list-group-item.active .list-group-item-heading,
+.list-group-item.active:hover .list-group-item-heading,
+.list-group-item.active:focus .list-group-item-heading,
+.list-group-item.active .list-group-item-heading > small,
+.list-group-item.active:hover .list-group-item-heading > small,
+.list-group-item.active:focus .list-group-item-heading > small,
+.list-group-item.active .list-group-item-heading > .small,
+.list-group-item.active:hover .list-group-item-heading > .small,
+.list-group-item.active:focus .list-group-item-heading > .small {
+ color: inherit;
+}
+.list-group-item.active .list-group-item-text,
+.list-group-item.active:hover .list-group-item-text,
+.list-group-item.active:focus .list-group-item-text {
+ color: #c7ddef;
+}
+.list-group-item-success {
+ color: #3c763d;
+ background-color: #dff0d8;
+}
+a.list-group-item-success {
+ color: #3c763d;
+}
+a.list-group-item-success .list-group-item-heading {
+ color: inherit;
+}
+a.list-group-item-success:hover,
+a.list-group-item-success:focus {
+ color: #3c763d;
+ background-color: #d0e9c6;
+}
+a.list-group-item-success.active,
+a.list-group-item-success.active:hover,
+a.list-group-item-success.active:focus {
+ color: #fff;
+ background-color: #3c763d;
+ border-color: #3c763d;
+}
+.list-group-item-info {
+ color: #31708f;
+ background-color: #d9edf7;
+}
+a.list-group-item-info {
+ color: #31708f;
+}
+a.list-group-item-info .list-group-item-heading {
+ color: inherit;
+}
+a.list-group-item-info:hover,
+a.list-group-item-info:focus {
+ color: #31708f;
+ background-color: #c4e3f3;
+}
+a.list-group-item-info.active,
+a.list-group-item-info.active:hover,
+a.list-group-item-info.active:focus {
+ color: #fff;
+ background-color: #31708f;
+ border-color: #31708f;
+}
+.list-group-item-warning {
+ color: #8a6d3b;
+ background-color: #fcf8e3;
+}
+a.list-group-item-warning {
+ color: #8a6d3b;
+}
+a.list-group-item-warning .list-group-item-heading {
+ color: inherit;
+}
+a.list-group-item-warning:hover,
+a.list-group-item-warning:focus {
+ color: #8a6d3b;
+ background-color: #faf2cc;
+}
+a.list-group-item-warning.active,
+a.list-group-item-warning.active:hover,
+a.list-group-item-warning.active:focus {
+ color: #fff;
+ background-color: #8a6d3b;
+ border-color: #8a6d3b;
+}
+.list-group-item-danger {
+ color: #a94442;
+ background-color: #f2dede;
+}
+a.list-group-item-danger {
+ color: #a94442;
+}
+a.list-group-item-danger .list-group-item-heading {
+ color: inherit;
+}
+a.list-group-item-danger:hover,
+a.list-group-item-danger:focus {
+ color: #a94442;
+ background-color: #ebcccc;
+}
+a.list-group-item-danger.active,
+a.list-group-item-danger.active:hover,
+a.list-group-item-danger.active:focus {
+ color: #fff;
+ background-color: #a94442;
+ border-color: #a94442;
+}
+.list-group-item-heading {
+ margin-top: 0;
+ margin-bottom: 5px;
+}
+.list-group-item-text {
+ margin-bottom: 0;
+ line-height: 1.3;
+}
+.panel {
+ margin-bottom: 20px;
+ background-color: #fff;
+ border: 1px solid transparent;
+ border-radius: 4px;
+ -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05);
+ box-shadow: 0 1px 1px rgba(0, 0, 0, .05);
+}
+.panel-body {
+ padding: 15px;
+}
+.panel-heading {
+ padding: 10px 15px;
+ border-bottom: 1px solid transparent;
+ border-top-left-radius: 3px;
+ border-top-right-radius: 3px;
+}
+.panel-heading > .dropdown .dropdown-toggle {
+ color: inherit;
+}
+.panel-title {
+ margin-top: 0;
+ margin-bottom: 0;
+ font-size: 16px;
+ color: inherit;
+}
+.panel-title > a {
+ color: inherit;
+}
+.panel-footer {
+ padding: 10px 15px;
+ background-color: #f5f5f5;
+ border-top: 1px solid #ddd;
+ border-bottom-right-radius: 3px;
+ border-bottom-left-radius: 3px;
+}
+.panel > .list-group,
+.panel > .panel-collapse > .list-group {
+ margin-bottom: 0;
+}
+.panel > .list-group .list-group-item,
+.panel > .panel-collapse > .list-group .list-group-item {
+ border-width: 1px 0;
+ border-radius: 0;
+}
+.panel > .list-group:first-child .list-group-item:first-child,
+.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {
+ border-top: 0;
+ border-top-left-radius: 3px;
+ border-top-right-radius: 3px;
+}
+.panel > .list-group:last-child .list-group-item:last-child,
+.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {
+ border-bottom: 0;
+ border-bottom-right-radius: 3px;
+ border-bottom-left-radius: 3px;
+}
+.panel-heading + .list-group .list-group-item:first-child {
+ border-top-width: 0;
+}
+.list-group + .panel-footer {
+ border-top-width: 0;
+}
+.panel > .table,
+.panel > .table-responsive > .table,
+.panel > .panel-collapse > .table {
+ margin-bottom: 0;
+}
+.panel > .table caption,
+.panel > .table-responsive > .table caption,
+.panel > .panel-collapse > .table caption {
+ padding-right: 15px;
+ padding-left: 15px;
+}
+.panel > .table:first-child,
+.panel > .table-responsive:first-child > .table:first-child {
+ border-top-left-radius: 3px;
+ border-top-right-radius: 3px;
+}
+.panel > .table:first-child > thead:first-child > tr:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {
+ border-top-left-radius: 3px;
+ border-top-right-radius: 3px;
+}
+.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,
+.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {
+ border-top-left-radius: 3px;
+}
+.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,
+.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {
+ border-top-right-radius: 3px;
+}
+.panel > .table:last-child,
+.panel > .table-responsive:last-child > .table:last-child {
+ border-bottom-right-radius: 3px;
+ border-bottom-left-radius: 3px;
+}
+.panel > .table:last-child > tbody:last-child > tr:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {
+ border-bottom-right-radius: 3px;
+ border-bottom-left-radius: 3px;
+}
+.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
+.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {
+ border-bottom-left-radius: 3px;
+}
+.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
+.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {
+ border-bottom-right-radius: 3px;
+}
+.panel > .panel-body + .table,
+.panel > .panel-body + .table-responsive,
+.panel > .table + .panel-body,
+.panel > .table-responsive + .panel-body {
+ border-top: 1px solid #ddd;
+}
+.panel > .table > tbody:first-child > tr:first-child th,
+.panel > .table > tbody:first-child > tr:first-child td {
+ border-top: 0;
+}
+.panel > .table-bordered,
+.panel > .table-responsive > .table-bordered {
+ border: 0;
+}
+.panel > .table-bordered > thead > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,
+.panel > .table-bordered > tbody > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,
+.panel > .table-bordered > tfoot > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,
+.panel > .table-bordered > thead > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,
+.panel > .table-bordered > tbody > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,
+.panel > .table-bordered > tfoot > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+ border-left: 0;
+}
+.panel > .table-bordered > thead > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,
+.panel > .table-bordered > tbody > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,
+.panel > .table-bordered > tfoot > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,
+.panel > .table-bordered > thead > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,
+.panel > .table-bordered > tbody > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,
+.panel > .table-bordered > tfoot > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+ border-right: 0;
+}
+.panel > .table-bordered > thead > tr:first-child > td,
+.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,
+.panel > .table-bordered > tbody > tr:first-child > td,
+.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,
+.panel > .table-bordered > thead > tr:first-child > th,
+.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,
+.panel > .table-bordered > tbody > tr:first-child > th,
+.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {
+ border-bottom: 0;
+}
+.panel > .table-bordered > tbody > tr:last-child > td,
+.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,
+.panel > .table-bordered > tfoot > tr:last-child > td,
+.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,
+.panel > .table-bordered > tbody > tr:last-child > th,
+.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,
+.panel > .table-bordered > tfoot > tr:last-child > th,
+.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {
+ border-bottom: 0;
+}
+.panel > .table-responsive {
+ margin-bottom: 0;
+ border: 0;
+}
+.panel-group {
+ margin-bottom: 20px;
+}
+.panel-group .panel {
+ margin-bottom: 0;
+ border-radius: 4px;
+}
+.panel-group .panel + .panel {
+ margin-top: 5px;
+}
+.panel-group .panel-heading {
+ border-bottom: 0;
+}
+.panel-group .panel-heading + .panel-collapse > .panel-body,
+.panel-group .panel-heading + .panel-collapse > .list-group {
+ border-top: 1px solid #ddd;
+}
+.panel-group .panel-footer {
+ border-top: 0;
+}
+.panel-group .panel-footer + .panel-collapse .panel-body {
+ border-bottom: 1px solid #ddd;
+}
+.panel-default {
+ border-color: #ddd;
+}
+.panel-default > .panel-heading {
+ color: #333;
+ background-color: #f5f5f5;
+ border-color: #ddd;
+}
+.panel-default > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #ddd;
+}
+.panel-default > .panel-heading .badge {
+ color: #f5f5f5;
+ background-color: #333;
+}
+.panel-default > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #ddd;
+}
+.panel-primary {
+ border-color: #337ab7;
+}
+.panel-primary > .panel-heading {
+ color: #fff;
+ background-color: #337ab7;
+ border-color: #337ab7;
+}
+.panel-primary > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #337ab7;
+}
+.panel-primary > .panel-heading .badge {
+ color: #337ab7;
+ background-color: #fff;
+}
+.panel-primary > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #337ab7;
+}
+.panel-success {
+ border-color: #d6e9c6;
+}
+.panel-success > .panel-heading {
+ color: #3c763d;
+ background-color: #dff0d8;
+ border-color: #d6e9c6;
+}
+.panel-success > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #d6e9c6;
+}
+.panel-success > .panel-heading .badge {
+ color: #dff0d8;
+ background-color: #3c763d;
+}
+.panel-success > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #d6e9c6;
+}
+.panel-info {
+ border-color: #bce8f1;
+}
+.panel-info > .panel-heading {
+ color: #31708f;
+ background-color: #d9edf7;
+ border-color: #bce8f1;
+}
+.panel-info > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #bce8f1;
+}
+.panel-info > .panel-heading .badge {
+ color: #d9edf7;
+ background-color: #31708f;
+}
+.panel-info > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #bce8f1;
+}
+.panel-warning {
+ border-color: #faebcc;
+}
+.panel-warning > .panel-heading {
+ color: #8a6d3b;
+ background-color: #fcf8e3;
+ border-color: #faebcc;
+}
+.panel-warning > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #faebcc;
+}
+.panel-warning > .panel-heading .badge {
+ color: #fcf8e3;
+ background-color: #8a6d3b;
+}
+.panel-warning > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #faebcc;
+}
+.panel-danger {
+ border-color: #ebccd1;
+}
+.panel-danger > .panel-heading {
+ color: #a94442;
+ background-color: #f2dede;
+ border-color: #ebccd1;
+}
+.panel-danger > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #ebccd1;
+}
+.panel-danger > .panel-heading .badge {
+ color: #f2dede;
+ background-color: #a94442;
+}
+.panel-danger > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #ebccd1;
+}
+.embed-responsive {
+ position: relative;
+ display: block;
+ height: 0;
+ padding: 0;
+ overflow: hidden;
+}
+.embed-responsive .embed-responsive-item,
+.embed-responsive iframe,
+.embed-responsive embed,
+.embed-responsive object,
+.embed-responsive video {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ border: 0;
+}
+.embed-responsive.embed-responsive-16by9 {
+ padding-bottom: 56.25%;
+}
+.embed-responsive.embed-responsive-4by3 {
+ padding-bottom: 75%;
+}
+.well {
+ min-height: 20px;
+ padding: 19px;
+ margin-bottom: 20px;
+ background-color: #f5f5f5;
+ border: 1px solid #e3e3e3;
+ border-radius: 4px;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);
+}
+.well blockquote {
+ border-color: #ddd;
+ border-color: rgba(0, 0, 0, .15);
+}
+.well-lg {
+ padding: 24px;
+ border-radius: 6px;
+}
+.well-sm {
+ padding: 9px;
+ border-radius: 3px;
+}
+.close {
+ float: right;
+ font-size: 21px;
+ font-weight: bold;
+ line-height: 1;
+ color: #000;
+ text-shadow: 0 1px 0 #fff;
+ filter: alpha(opacity=20);
+ opacity: .2;
+}
+.close:hover,
+.close:focus {
+ color: #000;
+ text-decoration: none;
+ cursor: pointer;
+ filter: alpha(opacity=50);
+ opacity: .5;
+}
+button.close {
+ -webkit-appearance: none;
+ padding: 0;
+ cursor: pointer;
+ background: transparent;
+ border: 0;
+}
+.modal-open {
+ overflow: hidden;
+}
+.modal {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1040;
+ display: none;
+ overflow: hidden;
+ -webkit-overflow-scrolling: touch;
+ outline: 0;
+}
+.modal.fade .modal-dialog {
+ -webkit-transition: -webkit-transform .3s ease-out;
+ -o-transition: -o-transform .3s ease-out;
+ transition: transform .3s ease-out;
+ -webkit-transform: translate(0, -25%);
+ -ms-transform: translate(0, -25%);
+ -o-transform: translate(0, -25%);
+ transform: translate(0, -25%);
+}
+.modal.in .modal-dialog {
+ -webkit-transform: translate(0, 0);
+ -ms-transform: translate(0, 0);
+ -o-transform: translate(0, 0);
+ transform: translate(0, 0);
+}
+.modal-open .modal {
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+.modal-dialog {
+ position: relative;
+ width: auto;
+ margin: 10px;
+}
+.modal-content {
+ position: relative;
+ background-color: #fff;
+ -webkit-background-clip: padding-box;
+ background-clip: padding-box;
+ border: 1px solid #999;
+ 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);
+}
+.modal-backdrop {
+ position: absolute;
+ top: 0;
+ right: 0;
+ left: 0;
+ background-color: #000;
+}
+.modal-backdrop.fade {
+ filter: alpha(opacity=0);
+ opacity: 0;
+}
+.modal-backdrop.in {
+ filter: alpha(opacity=50);
+ opacity: .5;
+}
+.modal-header {
+ min-height: 16.42857143px;
+ padding: 15px;
+ border-bottom: 1px solid #e5e5e5;
+}
+.modal-header .close {
+ margin-top: -2px;
+}
+.modal-title {
+ margin: 0;
+ line-height: 1.42857143;
+}
+.modal-body {
+ position: relative;
+ padding: 15px;
+}
+.modal-footer {
+ padding: 15px;
+ text-align: right;
+ border-top: 1px solid #e5e5e5;
+}
+.modal-footer .btn + .btn {
+ margin-bottom: 0;
+ margin-left: 5px;
+}
+.modal-footer .btn-group .btn + .btn {
+ margin-left: -1px;
+}
+.modal-footer .btn-block + .btn-block {
+ margin-left: 0;
+}
+.modal-scrollbar-measure {
+ position: absolute;
+ top: -9999px;
+ width: 50px;
+ height: 50px;
+ overflow: scroll;
+}
+@media (min-width: 768px) {
+ .modal-dialog {
+ width: 600px;
+ margin: 30px auto;
+ }
+ .modal-content {
+ -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
+ box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
+ }
+ .modal-sm {
+ width: 300px;
+ }
+}
+@media (min-width: 992px) {
+ .modal-lg {
+ width: 900px;
+ }
+}
+.tooltip {
+ position: absolute;
+ z-index: 1070;
+ display: block;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 12px;
+ font-weight: normal;
+ line-height: 1.4;
+ visibility: visible;
+ filter: alpha(opacity=0);
+ opacity: 0;
+}
+.tooltip.in {
+ filter: alpha(opacity=90);
+ opacity: .9;
+}
+.tooltip.top {
+ padding: 5px 0;
+ margin-top: -3px;
+}
+.tooltip.right {
+ padding: 0 5px;
+ margin-left: 3px;
+}
+.tooltip.bottom {
+ padding: 5px 0;
+ margin-top: 3px;
+}
+.tooltip.left {
+ padding: 0 5px;
+ margin-left: -3px;
+}
+.tooltip-inner {
+ max-width: 200px;
+ padding: 3px 8px;
+ color: #fff;
+ text-align: center;
+ text-decoration: none;
+ background-color: #000;
+ border-radius: 4px;
+}
+.tooltip-arrow {
+ position: absolute;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid;
+}
+.tooltip.top .tooltip-arrow {
+ bottom: 0;
+ left: 50%;
+ margin-left: -5px;
+ border-width: 5px 5px 0;
+ border-top-color: #000;
+}
+.tooltip.top-left .tooltip-arrow {
+ right: 5px;
+ bottom: 0;
+ margin-bottom: -5px;
+ border-width: 5px 5px 0;
+ border-top-color: #000;
+}
+.tooltip.top-right .tooltip-arrow {
+ bottom: 0;
+ left: 5px;
+ margin-bottom: -5px;
+ border-width: 5px 5px 0;
+ border-top-color: #000;
+}
+.tooltip.right .tooltip-arrow {
+ top: 50%;
+ left: 0;
+ margin-top: -5px;
+ border-width: 5px 5px 5px 0;
+ border-right-color: #000;
+}
+.tooltip.left .tooltip-arrow {
+ top: 50%;
+ right: 0;
+ margin-top: -5px;
+ border-width: 5px 0 5px 5px;
+ border-left-color: #000;
+}
+.tooltip.bottom .tooltip-arrow {
+ top: 0;
+ left: 50%;
+ margin-left: -5px;
+ border-width: 0 5px 5px;
+ border-bottom-color: #000;
+}
+.tooltip.bottom-left .tooltip-arrow {
+ top: 0;
+ right: 5px;
+ margin-top: -5px;
+ border-width: 0 5px 5px;
+ border-bottom-color: #000;
+}
+.tooltip.bottom-right .tooltip-arrow {
+ top: 0;
+ left: 5px;
+ margin-top: -5px;
+ border-width: 0 5px 5px;
+ border-bottom-color: #000;
+}
+.popover {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1060;
+ display: none;
+ max-width: 276px;
+ padding: 1px;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 14px;
+ font-weight: normal;
+ line-height: 1.42857143;
+ text-align: left;
+ white-space: normal;
+ background-color: #fff;
+ -webkit-background-clip: padding-box;
+ background-clip: padding-box;
+ border: 1px solid #ccc;
+ 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);
+}
+.popover.top {
+ margin-top: -10px;
+}
+.popover.right {
+ margin-left: 10px;
+}
+.popover.bottom {
+ margin-top: 10px;
+}
+.popover.left {
+ margin-left: -10px;
+}
+.popover-title {
+ padding: 8px 14px;
+ margin: 0;
+ font-size: 14px;
+ background-color: #f7f7f7;
+ border-bottom: 1px solid #ebebeb;
+ border-radius: 5px 5px 0 0;
+}
+.popover-content {
+ padding: 9px 14px;
+}
+.popover > .arrow,
+.popover > .arrow:after {
+ position: absolute;
+ display: block;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid;
+}
+.popover > .arrow {
+ border-width: 11px;
+}
+.popover > .arrow:after {
+ content: "";
+ border-width: 10px;
+}
+.popover.top > .arrow {
+ bottom: -11px;
+ left: 50%;
+ margin-left: -11px;
+ border-top-color: #999;
+ border-top-color: rgba(0, 0, 0, .25);
+ border-bottom-width: 0;
+}
+.popover.top > .arrow:after {
+ bottom: 1px;
+ margin-left: -10px;
+ content: " ";
+ border-top-color: #fff;
+ border-bottom-width: 0;
+}
+.popover.right > .arrow {
+ top: 50%;
+ left: -11px;
+ margin-top: -11px;
+ border-right-color: #999;
+ border-right-color: rgba(0, 0, 0, .25);
+ border-left-width: 0;
+}
+.popover.right > .arrow:after {
+ bottom: -10px;
+ left: 1px;
+ content: " ";
+ border-right-color: #fff;
+ border-left-width: 0;
+}
+.popover.bottom > .arrow {
+ top: -11px;
+ left: 50%;
+ margin-left: -11px;
+ border-top-width: 0;
+ border-bottom-color: #999;
+ border-bottom-color: rgba(0, 0, 0, .25);
+}
+.popover.bottom > .arrow:after {
+ top: 1px;
+ margin-left: -10px;
+ content: " ";
+ border-top-width: 0;
+ border-bottom-color: #fff;
+}
+.popover.left > .arrow {
+ top: 50%;
+ right: -11px;
+ margin-top: -11px;
+ border-right-width: 0;
+ border-left-color: #999;
+ border-left-color: rgba(0, 0, 0, .25);
+}
+.popover.left > .arrow:after {
+ right: 1px;
+ bottom: -10px;
+ content: " ";
+ border-right-width: 0;
+ border-left-color: #fff;
+}
+.carousel {
+ position: relative;
+}
+.carousel-inner {
+ position: relative;
+ width: 100%;
+ overflow: hidden;
+}
+.carousel-inner > .item {
+ position: relative;
+ display: none;
+ -webkit-transition: .6s ease-in-out left;
+ -o-transition: .6s ease-in-out left;
+ transition: .6s ease-in-out left;
+}
+.carousel-inner > .item > img,
+.carousel-inner > .item > a > img {
+ line-height: 1;
+}
+@media all and (transform-3d), (-webkit-transform-3d) {
+ .carousel-inner > .item {
+ -webkit-transition: -webkit-transform .6s ease-in-out;
+ -o-transition: -o-transform .6s ease-in-out;
+ transition: transform .6s ease-in-out;
+
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ -webkit-perspective: 1000;
+ perspective: 1000;
+ }
+ .carousel-inner > .item.next,
+ .carousel-inner > .item.active.right {
+ left: 0;
+ -webkit-transform: translate3d(100%, 0, 0);
+ transform: translate3d(100%, 0, 0);
+ }
+ .carousel-inner > .item.prev,
+ .carousel-inner > .item.active.left {
+ left: 0;
+ -webkit-transform: translate3d(-100%, 0, 0);
+ transform: translate3d(-100%, 0, 0);
+ }
+ .carousel-inner > .item.next.left,
+ .carousel-inner > .item.prev.right,
+ .carousel-inner > .item.active {
+ left: 0;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+.carousel-inner > .active,
+.carousel-inner > .next,
+.carousel-inner > .prev {
+ display: block;
+}
+.carousel-inner > .active {
+ left: 0;
+}
+.carousel-inner > .next,
+.carousel-inner > .prev {
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.carousel-inner > .next {
+ left: 100%;
+}
+.carousel-inner > .prev {
+ left: -100%;
+}
+.carousel-inner > .next.left,
+.carousel-inner > .prev.right {
+ left: 0;
+}
+.carousel-inner > .active.left {
+ left: -100%;
+}
+.carousel-inner > .active.right {
+ left: 100%;
+}
+.carousel-control {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ width: 15%;
+ font-size: 20px;
+ color: #fff;
+ text-align: center;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, .6);
+ filter: alpha(opacity=50);
+ opacity: .5;
+}
+.carousel-control.left {
+ background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
+ background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
+ background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001)));
+ background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);
+ background-repeat: repeat-x;
+}
+.carousel-control.right {
+ right: 0;
+ left: auto;
+ background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
+ background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
+ background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5)));
+ background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);
+ background-repeat: repeat-x;
+}
+.carousel-control:hover,
+.carousel-control:focus {
+ color: #fff;
+ text-decoration: none;
+ filter: alpha(opacity=90);
+ outline: 0;
+ opacity: .9;
+}
+.carousel-control .icon-prev,
+.carousel-control .icon-next,
+.carousel-control .glyphicon-chevron-left,
+.carousel-control .glyphicon-chevron-right {
+ position: absolute;
+ top: 50%;
+ z-index: 5;
+ display: inline-block;
+}
+.carousel-control .icon-prev,
+.carousel-control .glyphicon-chevron-left {
+ left: 50%;
+ margin-left: -10px;
+}
+.carousel-control .icon-next,
+.carousel-control .glyphicon-chevron-right {
+ right: 50%;
+ margin-right: -10px;
+}
+.carousel-control .icon-prev,
+.carousel-control .icon-next {
+ width: 20px;
+ height: 20px;
+ margin-top: -10px;
+ font-family: serif;
+}
+.carousel-control .icon-prev:before {
+ content: '\2039';
+}
+.carousel-control .icon-next:before {
+ content: '\203a';
+}
+.carousel-indicators {
+ position: absolute;
+ bottom: 10px;
+ left: 50%;
+ z-index: 15;
+ width: 60%;
+ padding-left: 0;
+ margin-left: -30%;
+ text-align: center;
+ list-style: none;
+}
+.carousel-indicators li {
+ display: inline-block;
+ width: 10px;
+ height: 10px;
+ margin: 1px;
+ text-indent: -999px;
+ cursor: pointer;
+ background-color: #000 \9;
+ background-color: rgba(0, 0, 0, 0);
+ border: 1px solid #fff;
+ border-radius: 10px;
+}
+.carousel-indicators .active {
+ width: 12px;
+ height: 12px;
+ margin: 0;
+ background-color: #fff;
+}
+.carousel-caption {
+ position: absolute;
+ right: 15%;
+ bottom: 20px;
+ left: 15%;
+ z-index: 10;
+ padding-top: 20px;
+ padding-bottom: 20px;
+ color: #fff;
+ text-align: center;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, .6);
+}
+.carousel-caption .btn {
+ text-shadow: none;
+}
+@media screen and (min-width: 768px) {
+ .carousel-control .glyphicon-chevron-left,
+ .carousel-control .glyphicon-chevron-right,
+ .carousel-control .icon-prev,
+ .carousel-control .icon-next {
+ width: 30px;
+ height: 30px;
+ margin-top: -15px;
+ font-size: 30px;
+ }
+ .carousel-control .glyphicon-chevron-left,
+ .carousel-control .icon-prev {
+ margin-left: -15px;
+ }
+ .carousel-control .glyphicon-chevron-right,
+ .carousel-control .icon-next {
+ margin-right: -15px;
+ }
+ .carousel-caption {
+ right: 20%;
+ left: 20%;
+ padding-bottom: 30px;
+ }
+ .carousel-indicators {
+ bottom: 20px;
+ }
+}
+.clearfix:before,
+.clearfix:after,
+.dl-horizontal dd:before,
+.dl-horizontal dd:after,
+.container:before,
+.container:after,
+.container-fluid:before,
+.container-fluid:after,
+.row:before,
+.row:after,
+.form-horizontal .form-group:before,
+.form-horizontal .form-group:after,
+.btn-toolbar:before,
+.btn-toolbar:after,
+.btn-group-vertical > .btn-group:before,
+.btn-group-vertical > .btn-group:after,
+.nav:before,
+.nav:after,
+.navbar:before,
+.navbar:after,
+.navbar-header:before,
+.navbar-header:after,
+.navbar-collapse:before,
+.navbar-collapse:after,
+.pager:before,
+.pager:after,
+.panel-body:before,
+.panel-body:after,
+.modal-footer:before,
+.modal-footer:after {
+ display: table;
+ content: " ";
+}
+.clearfix:after,
+.dl-horizontal dd:after,
+.container:after,
+.container-fluid:after,
+.row:after,
+.form-horizontal .form-group:after,
+.btn-toolbar:after,
+.btn-group-vertical > .btn-group:after,
+.nav:after,
+.navbar:after,
+.navbar-header:after,
+.navbar-collapse:after,
+.pager:after,
+.panel-body:after,
+.modal-footer:after {
+ clear: both;
+}
+.center-block {
+ display: block;
+ margin-right: auto;
+ margin-left: auto;
+}
+.pull-right {
+ float: right !important;
+}
+.pull-left {
+ float: left !important;
+}
+.hide {
+ display: none !important;
+}
+.show {
+ display: block !important;
+}
+.invisible {
+ visibility: hidden;
+}
+.text-hide {
+ font: 0/0 a;
+ color: transparent;
+ text-shadow: none;
+ background-color: transparent;
+ border: 0;
+}
+.hidden {
+ display: none !important;
+ visibility: hidden !important;
+}
+.affix {
+ position: fixed;
+}
+@-ms-viewport {
+ width: device-width;
+}
+.visible-xs,
+.visible-sm,
+.visible-md,
+.visible-lg {
+ display: none !important;
+}
+.visible-xs-block,
+.visible-xs-inline,
+.visible-xs-inline-block,
+.visible-sm-block,
+.visible-sm-inline,
+.visible-sm-inline-block,
+.visible-md-block,
+.visible-md-inline,
+.visible-md-inline-block,
+.visible-lg-block,
+.visible-lg-inline,
+.visible-lg-inline-block {
+ display: none !important;
+}
+@media (max-width: 767px) {
+ .visible-xs {
+ display: block !important;
+ }
+ table.visible-xs {
+ display: table;
+ }
+ tr.visible-xs {
+ display: table-row !important;
+ }
+ th.visible-xs,
+ td.visible-xs {
+ display: table-cell !important;
+ }
+}
+@media (max-width: 767px) {
+ .visible-xs-block {
+ display: block !important;
+ }
+}
+@media (max-width: 767px) {
+ .visible-xs-inline {
+ display: inline !important;
+ }
+}
+@media (max-width: 767px) {
+ .visible-xs-inline-block {
+ display: inline-block !important;
+ }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+ .visible-sm {
+ display: block !important;
+ }
+ table.visible-sm {
+ display: table;
+ }
+ tr.visible-sm {
+ display: table-row !important;
+ }
+ th.visible-sm,
+ td.visible-sm {
+ display: table-cell !important;
+ }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+ .visible-sm-block {
+ display: block !important;
+ }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+ .visible-sm-inline {
+ display: inline !important;
+ }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+ .visible-sm-inline-block {
+ display: inline-block !important;
+ }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+ .visible-md {
+ display: block !important;
+ }
+ table.visible-md {
+ display: table;
+ }
+ tr.visible-md {
+ display: table-row !important;
+ }
+ th.visible-md,
+ td.visible-md {
+ display: table-cell !important;
+ }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+ .visible-md-block {
+ display: block !important;
+ }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+ .visible-md-inline {
+ display: inline !important;
+ }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+ .visible-md-inline-block {
+ display: inline-block !important;
+ }
+}
+@media (min-width: 1200px) {
+ .visible-lg {
+ display: block !important;
+ }
+ table.visible-lg {
+ display: table;
+ }
+ tr.visible-lg {
+ display: table-row !important;
+ }
+ th.visible-lg,
+ td.visible-lg {
+ display: table-cell !important;
+ }
+}
+@media (min-width: 1200px) {
+ .visible-lg-block {
+ display: block !important;
+ }
+}
+@media (min-width: 1200px) {
+ .visible-lg-inline {
+ display: inline !important;
+ }
+}
+@media (min-width: 1200px) {
+ .visible-lg-inline-block {
+ display: inline-block !important;
+ }
+}
+@media (max-width: 767px) {
+ .hidden-xs {
+ display: none !important;
+ }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+ .hidden-sm {
+ display: none !important;
+ }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+ .hidden-md {
+ display: none !important;
+ }
+}
+@media (min-width: 1200px) {
+ .hidden-lg {
+ display: none !important;
+ }
+}
+.visible-print {
+ display: none !important;
+}
+@media print {
+ .visible-print {
+ display: block !important;
+ }
+ table.visible-print {
+ display: table;
+ }
+ tr.visible-print {
+ display: table-row !important;
+ }
+ th.visible-print,
+ td.visible-print {
+ display: table-cell !important;
+ }
+}
+.visible-print-block {
+ display: none !important;
+}
+@media print {
+ .visible-print-block {
+ display: block !important;
+ }
+}
+.visible-print-inline {
+ display: none !important;
+}
+@media print {
+ .visible-print-inline {
+ display: inline !important;
+ }
+}
+.visible-print-inline-block {
+ display: none !important;
+}
+@media print {
+ .visible-print-inline-block {
+ display: inline-block !important;
+ }
+}
+@media print {
+ .hidden-print {
+ display: none !important;
+ }
+}
+/*# sourceMappingURL=bootstrap.css.map */
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/css/bootstrap.css.map b/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/css/bootstrap.css.map
new file mode 100755
index 0000000..a02f6ba
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/css/bootstrap.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["bootstrap.css","less/normalize.less","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"AAAA,6DAA4D;ACQ5D;EACE,yBAAA;EACA,4BAAA;EACA,gCAAA;EDND;ACaD;EACE,WAAA;EDXD;ACwBD;;;;;;;;;;;;;EAaE,gBAAA;EDtBD;AC8BD;;;;EAIE,uBAAA;EACA,0BAAA;ED5BD;ACoCD;EACE,eAAA;EACA,WAAA;EDlCD;AC0CD;;EAEE,eAAA;EDxCD;ACkDD;EACE,+BAAA;EDhDD;ACuDD;;EAEE,YAAA;EDrDD;AC+DD;EACE,2BAAA;ED7DD;ACoED;;EAEE,mBAAA;EDlED;ACyED;EACE,oBAAA;EDvED;AC+ED;EACE,gBAAA;EACA,kBAAA;ED7ED;ACoFD;EACE,kBAAA;EACA,aAAA;EDlFD;ACyFD;EACE,gBAAA;EDvFD;AC8FD;;EAEE,gBAAA;EACA,gBAAA;EACA,oBAAA;EACA,0BAAA;ED5FD;AC+FD;EACE,aAAA;ED7FD;ACgGD;EACE,iBAAA;ED9FD;ACwGD;EACE,WAAA;EDtGD;AC6GD;EACE,kBAAA;ED3GD;ACqHD;EACE,kBAAA;EDnHD;AC0HD;EACE,8BAAA;EACA,iCAAA;UAAA,yBAAA;EACA,WAAA;EDxHD;AC+HD;EACE,gBAAA;ED7HD;ACoID;;;;EAIE,mCAAA;EACA,gBAAA;EDlID;ACoJD;;;;;EAKE,gBAAA;EACA,eAAA;EACA,WAAA;EDlJD;ACyJD;EACE,mBAAA;EDvJD;ACiKD;;EAEE,sBAAA;ED/JD;AC0KD;;;;EAIE,4BAAA;EACA,iBAAA;EDxKD;AC+KD;;EAEE,iBAAA;ED7KD;ACoLD;;EAEE,WAAA;EACA,YAAA;EDlLD;AC0LD;EACE,qBAAA;EDxLD;ACmMD;;EAEE,gCAAA;KAAA,6BAAA;UAAA,wBAAA;EACA,YAAA;EDjMD;AC0MD;;EAEE,cAAA;EDxMD;ACiND;EACE,+BAAA;EACA,8BAAA;EACA,iCAAA;EACA,yBAAA;ED/MD;ACwND;;EAEE,0BAAA;EDtND;AC6ND;EACE,2BAAA;EACA,eAAA;EACA,gCAAA;ED3ND;ACmOD;EACE,WAAA;EACA,YAAA;EDjOD;ACwOD;EACE,gBAAA;EDtOD;AC8OD;EACE,mBAAA;ED5OD;ACsPD;EACE,2BAAA;EACA,mBAAA;EDpPD;ACuPD;;EAEE,YAAA;EDrPD;AACD,sFAAqF;AE1ErF;EAnGI;;;IAGI,oCAAA;IACA,wBAAA;IACA,qCAAA;YAAA,6BAAA;IACA,8BAAA;IFgLL;EE7KC;;IAEI,4BAAA;IF+KL;EE5KC;IACI,8BAAA;IF8KL;EE3KC;IACI,+BAAA;IF6KL;EExKC;;IAEI,aAAA;IF0KL;EEvKC;;IAEI,wBAAA;IACA,0BAAA;IFyKL;EEtKC;IACI,6BAAA;IFwKL;EErKC;;IAEI,0BAAA;IFuKL;EEpKC;IACI,4BAAA;IFsKL;EEnKC;;;IAGI,YAAA;IACA,WAAA;IFqKL;EElKC;;IAEI,yBAAA;IFoKL;EE7JC;IACI,6BAAA;IF+JL;EE3JC;IACI,eAAA;IF6JL;EE3JC;;IAGQ,mCAAA;IF4JT;EEzJC;IACI,wBAAA;IF2JL;EExJC;IACI,sCAAA;IF0JL;EE3JC;;IAKQ,mCAAA;IF0JT;EEvJC;;IAGQ,mCAAA;IFwJT;EACF;AGpPD;EACE,qCAAA;EACA,uDAAA;EACA,6TAAA;EHsPD;AG/OD;EACE,oBAAA;EACA,UAAA;EACA,uBAAA;EACA,qCAAA;EACA,oBAAA;EACA,qBAAA;EACA,gBAAA;EACA,qCAAA;EACA,oCAAA;EHiPD;AG7OmC;EAAW,gBAAA;EHgP9C;AG/OmC;EAAW,gBAAA;EHkP9C;AGhPmC;;EAAW,kBAAA;EHoP9C;AGnPmC;EAAW,kBAAA;EHsP9C;AGrPmC;EAAW,kBAAA;EHwP9C;AGvPmC;EAAW,kBAAA;EH0P9C;AGzPmC;EAAW,kBAAA;EH4P9C;AG3PmC;EAAW,kBAAA;EH8P9C;AG7PmC;EAAW,kBAAA;EHgQ9C;AG/PmC;EAAW,kBAAA;EHkQ9C;AGjQmC;EAAW,kBAAA;EHoQ9C;AGnQmC;EAAW,kBAAA;EHsQ9C;AGrQmC;EAAW,kBAAA;EHwQ9C;AGvQmC;EAAW,kBAAA;EH0Q9C;AGzQmC;EAAW,kBAAA;EH4Q9C;AG3QmC;EAAW,kBAAA;EH8Q9C;AG7QmC;EAAW,kBAAA;EHgR9C;AG/QmC;EAAW,kBAAA;EHkR9C;AGjRmC;EAAW,kBAAA;EHoR9C;AGnRmC;EAAW,kBAAA;EHsR9C;AGrRmC;EAAW,kBAAA;EHwR9C;AGvRmC;EAAW,kBAAA;EH0R9C;AGzRmC;EAAW,kBAAA;EH4R9C;AG3RmC;EAAW,kBAAA;EH8R9C;AG7RmC;EAAW,kBAAA;EHgS9C;AG/RmC;EAAW,kBAAA;EHkS9C;AGjSmC;EAAW,kBAAA;EHoS9C;AGnSmC;EAAW,kBAAA;EHsS9C;AGrSmC;EAAW,kBAAA;EHwS9C;AGvSmC;EAAW,kBAAA;EH0S9C;AGzSmC;EAAW,kBAAA;EH4S9C;AG3SmC;EAAW,kBAAA;EH8S9C;AG7SmC;EAAW,kBAAA;EHgT9C;AG/SmC;EAAW,kBAAA;EHkT9C;AGjTmC;EAAW,kBAAA;EHoT9C;AGnTmC;EAAW,kBAAA;EHsT9C;AGrTmC;EAAW,kBAAA;EHwT9C;AGvTmC;EAAW,kBAAA;EH0T9C;AGzTmC;EAAW,kBAAA;EH4T9C;AG3TmC;EAAW,kBAAA;EH8T9C;AG7TmC;EAAW,kBAAA;EHgU9C;AG/TmC;EAAW,kBAAA;EHkU9C;AGjUmC;EAAW,kBAAA;EHoU9C;AGnUmC;EAAW,kBAAA;EHsU9C;AGrUmC;EAAW,kBAAA;EHwU9C;AGvUmC;EAAW,kBAAA;EH0U9C;AGzUmC;EAAW,kBAAA;EH4U9C;AG3UmC;EAAW,kBAAA;EH8U9C;AG7UmC;EAAW,kBAAA;EHgV9C;AG/UmC;EAAW,kBAAA;EHkV9C;AGjVmC;EAAW,kBAAA;EHoV9C;AGnVmC;EAAW,kBAAA;EHsV9C;AGrVmC;EAAW,kBAAA;EHwV9C;AGvVmC;EAAW,kBAAA;EH0V9C;AGzVmC;EAAW,kBAAA;EH4V9C;AG3VmC;EAAW,kBAAA;EH8V9C;AG7VmC;EAAW,kBAAA;EHgW9C;AG/VmC;EAAW,kBAAA;EHkW9C;AGjWmC;EAAW,kBAAA;EHoW9C;AGnWmC;EAAW,kBAAA;EHsW9C;AGrWmC;EAAW,kBAAA;EHwW9C;AGvWmC;EAAW,kBAAA;EH0W9C;AGzWmC;EAAW,kBAAA;EH4W9C;AG3WmC;EAAW,kBAAA;EH8W9C;AG7WmC;EAAW,kBAAA;EHgX9C;AG/WmC;EAAW,kBAAA;EHkX9C;AGjXmC;EAAW,kBAAA;EHoX9C;AGnXmC;EAAW,kBAAA;EHsX9C;AGrXmC;EAAW,kBAAA;EHwX9C;AGvXmC;EAAW,kBAAA;EH0X9C;AGzXmC;EAAW,kBAAA;EH4X9C;AG3XmC;EAAW,kBAAA;EH8X9C;AG7XmC;EAAW,kBAAA;EHgY9C;AG/XmC;EAAW,kBAAA;EHkY9C;AGjYmC;EAAW,kBAAA;EHoY9C;AGnYmC;EAAW,kBAAA;EHsY9C;AGrYmC;EAAW,kBAAA;EHwY9C;AGvYmC;EAAW,kBAAA;EH0Y9C;AGzYmC;EAAW,kBAAA;EH4Y9C;AG3YmC;EAAW,kBAAA;EH8Y9C;AG7YmC;EAAW,kBAAA;EHgZ9C;AG/YmC;EAAW,kBAAA;EHkZ9C;AGjZmC;EAAW,kBAAA;EHoZ9C;AGnZmC;EAAW,kBAAA;EHsZ9C;AGrZmC;EAAW,kBAAA;EHwZ9C;AGvZmC;EAAW,kBAAA;EH0Z9C;AGzZmC;EAAW,kBAAA;EH4Z9C;AG3ZmC;EAAW,kBAAA;EH8Z9C;AG7ZmC;EAAW,kBAAA;EHga9C;AG/ZmC;EAAW,kBAAA;EHka9C;AGjamC;EAAW,kBAAA;EHoa9C;AGnamC;EAAW,kBAAA;EHsa9C;AGramC;EAAW,kBAAA;EHwa9C;AGvamC;EAAW,kBAAA;EH0a9C;AGzamC;EAAW,kBAAA;EH4a9C;AG3amC;EAAW,kBAAA;EH8a9C;AG7amC;EAAW,kBAAA;EHgb9C;AG/amC;EAAW,kBAAA;EHkb9C;AGjbmC;EAAW,kBAAA;EHob9C;AGnbmC;EAAW,kBAAA;EHsb9C;AGrbmC;EAAW,kBAAA;EHwb9C;AGvbmC;EAAW,kBAAA;EH0b9C;AGzbmC;EAAW,kBAAA;EH4b9C;AG3bmC;EAAW,kBAAA;EH8b9C;AG7bmC;EAAW,kBAAA;EHgc9C;AG/bmC;EAAW,kBAAA;EHkc9C;AGjcmC;EAAW,kBAAA;EHoc9C;AGncmC;EAAW,kBAAA;EHsc9C;AGrcmC;EAAW,kBAAA;EHwc9C;AGvcmC;EAAW,kBAAA;EH0c9C;AGzcmC;EAAW,kBAAA;EH4c9C;AG3cmC;EAAW,kBAAA;EH8c9C;AG7cmC;EAAW,kBAAA;EHgd9C;AG/cmC;EAAW,kBAAA;EHkd9C;AGjdmC;EAAW,kBAAA;EHod9C;AGndmC;EAAW,kBAAA;EHsd9C;AGrdmC;EAAW,kBAAA;EHwd9C;AGvdmC;EAAW,kBAAA;EH0d9C;AGzdmC;EAAW,kBAAA;EH4d9C;AG3dmC;EAAW,kBAAA;EH8d9C;AG7dmC;EAAW,kBAAA;EHge9C;AG/dmC;EAAW,kBAAA;EHke9C;AGjemC;EAAW,kBAAA;EHoe9C;AGnemC;EAAW,kBAAA;EHse9C;AGremC;EAAW,kBAAA;EHwe9C;AGvemC;EAAW,kBAAA;EH0e9C;AGzemC;EAAW,kBAAA;EH4e9C;AG3emC;EAAW,kBAAA;EH8e9C;AG7emC;EAAW,kBAAA;EHgf9C;AG/emC;EAAW,kBAAA;EHkf9C;AGjfmC;EAAW,kBAAA;EHof9C;AGnfmC;EAAW,kBAAA;EHsf9C;AGrfmC;EAAW,kBAAA;EHwf9C;AGvfmC;EAAW,kBAAA;EH0f9C;AGzfmC;EAAW,kBAAA;EH4f9C;AG3fmC;EAAW,kBAAA;EH8f9C;AG7fmC;EAAW,kBAAA;EHggB9C;AG/fmC;EAAW,kBAAA;EHkgB9C;AGjgBmC;EAAW,kBAAA;EHogB9C;AGngBmC;EAAW,kBAAA;EHsgB9C;AGrgBmC;EAAW,kBAAA;EHwgB9C;AGvgBmC;EAAW,kBAAA;EH0gB9C;AGzgBmC;EAAW,kBAAA;EH4gB9C;AG3gBmC;EAAW,kBAAA;EH8gB9C;AG7gBmC;EAAW,kBAAA;EHghB9C;AG/gBmC;EAAW,kBAAA;EHkhB9C;AGjhBmC;EAAW,kBAAA;EHohB9C;AGnhBmC;EAAW,kBAAA;EHshB9C;AGrhBmC;EAAW,kBAAA;EHwhB9C;AGvhBmC;EAAW,kBAAA;EH0hB9C;AGzhBmC;EAAW,kBAAA;EH4hB9C;AG3hBmC;EAAW,kBAAA;EH8hB9C;AG7hBmC;EAAW,kBAAA;EHgiB9C;AG/hBmC;EAAW,kBAAA;EHkiB9C;AGjiBmC;EAAW,kBAAA;EHoiB9C;AGniBmC;EAAW,kBAAA;EHsiB9C;AGriBmC;EAAW,kBAAA;EHwiB9C;AGviBmC;EAAW,kBAAA;EH0iB9C;AGziBmC;EAAW,kBAAA;EH4iB9C;AG3iBmC;EAAW,kBAAA;EH8iB9C;AG7iBmC;EAAW,kBAAA;EHgjB9C;AG/iBmC;EAAW,kBAAA;EHkjB9C;AGjjBmC;EAAW,kBAAA;EHojB9C;AGnjBmC;EAAW,kBAAA;EHsjB9C;AGrjBmC;EAAW,kBAAA;EHwjB9C;AGvjBmC;EAAW,kBAAA;EH0jB9C;AGzjBmC;EAAW,kBAAA;EH4jB9C;AG3jBmC;EAAW,kBAAA;EH8jB9C;AG7jBmC;EAAW,kBAAA;EHgkB9C;AG/jBmC;EAAW,kBAAA;EHkkB9C;AGjkBmC;EAAW,kBAAA;EHokB9C;AGnkBmC;EAAW,kBAAA;EHskB9C;AGrkBmC;EAAW,kBAAA;EHwkB9C;AGvkBmC;EAAW,kBAAA;EH0kB9C;AGzkBmC;EAAW,kBAAA;EH4kB9C;AG3kBmC;EAAW,kBAAA;EH8kB9C;AG7kBmC;EAAW,kBAAA;EHglB9C;AG/kBmC;EAAW,kBAAA;EHklB9C;AGjlBmC;EAAW,kBAAA;EHolB9C;AGnlBmC;EAAW,kBAAA;EHslB9C;AGrlBmC;EAAW,kBAAA;EHwlB9C;AGvlBmC;EAAW,kBAAA;EH0lB9C;AGzlBmC;EAAW,kBAAA;EH4lB9C;AG3lBmC;EAAW,kBAAA;EH8lB9C;AG7lBmC;EAAW,kBAAA;EHgmB9C;AG/lBmC;EAAW,kBAAA;EHkmB9C;AGjmBmC;EAAW,kBAAA;EHomB9C;AGnmBmC;EAAW,kBAAA;EHsmB9C;AGrmBmC;EAAW,kBAAA;EHwmB9C;AGvmBmC;EAAW,kBAAA;EH0mB9C;AGzmBmC;EAAW,kBAAA;EH4mB9C;AG3mBmC;EAAW,kBAAA;EH8mB9C;AG7mBmC;EAAW,kBAAA;EHgnB9C;AG/mBmC;EAAW,kBAAA;EHknB9C;AGjnBmC;EAAW,kBAAA;EHonB9C;AGnnBmC;EAAW,kBAAA;EHsnB9C;AGrnBmC;EAAW,kBAAA;EHwnB9C;AGvnBmC;EAAW,kBAAA;EH0nB9C;AGznBmC;EAAW,kBAAA;EH4nB9C;AG3nBmC;EAAW,kBAAA;EH8nB9C;AI71BD;ECgEE,gCAAA;EACG,6BAAA;EACK,wBAAA;ELgyBT;AI/1BD;;EC6DE,gCAAA;EACG,6BAAA;EACK,wBAAA;ELsyBT;AI71BD;EACE,iBAAA;EACA,+CAAA;EJ+1BD;AI51BD;EACE,6DAAA;EACA,iBAAA;EACA,yBAAA;EACA,gBAAA;EACA,2BAAA;EJ81BD;AI11BD;;;;EAIE,sBAAA;EACA,oBAAA;EACA,sBAAA;EJ41BD;AIt1BD;EACE,gBAAA;EACA,uBAAA;EJw1BD;AIt1BC;;EAEE,gBAAA;EACA,4BAAA;EJw1BH;AIr1BC;EErDA,sBAAA;EAEA,4CAAA;EACA,sBAAA;EN44BD;AI/0BD;EACE,WAAA;EJi1BD;AI30BD;EACE,wBAAA;EJ60BD;AIz0BD;;;;;EGvEE,gBAAA;EACA,iBAAA;EACA,cAAA;EPu5BD;AI70BD;EACE,oBAAA;EJ+0BD;AIz0BD;EACE,cAAA;EACA,yBAAA;EACA,2BAAA;EACA,2BAAA;EACA,oBAAA;EC6FA,0CAAA;EACK,qCAAA;EACG,kCAAA;EEvLR,uBAAA;EACA,iBAAA;EACA,cAAA;EPu6BD;AIz0BD;EACE,oBAAA;EJ20BD;AIr0BD;EACE,kBAAA;EACA,qBAAA;EACA,WAAA;EACA,+BAAA;EJu0BD;AI/zBD;EACE,oBAAA;EACA,YAAA;EACA,aAAA;EACA,cAAA;EACA,YAAA;EACA,kBAAA;EACA,wBAAA;EACA,WAAA;EJi0BD;AIzzBC;;EAEE,kBAAA;EACA,aAAA;EACA,cAAA;EACA,WAAA;EACA,mBAAA;EACA,YAAA;EJ2zBH;AQt8BD;;;;;;;;;;;;EAEE,sBAAA;EACA,kBAAA;EACA,kBAAA;EACA,gBAAA;ERk9BD;AQv9BD;;;;;;;;;;;;;;;;;;;;;;;;EASI,qBAAA;EACA,gBAAA;EACA,gBAAA;ERw+BH;AQp+BD;;;;;;EAGE,kBAAA;EACA,qBAAA;ERy+BD;AQ7+BD;;;;;;;;;;;;EAQI,gBAAA;ERm/BH;AQh/BD;;;;;;EAGE,kBAAA;EACA,qBAAA;ERq/BD;AQz/BD;;;;;;;;;;;;EAQI,gBAAA;ER+/BH;AQ3/BD;;EAAU,iBAAA;ER+/BT;AQ9/BD;;EAAU,iBAAA;ERkgCT;AQjgCD;;EAAU,iBAAA;ERqgCT;AQpgCD;;EAAU,iBAAA;ERwgCT;AQvgCD;;EAAU,iBAAA;ER2gCT;AQ1gCD;;EAAU,iBAAA;ER8gCT;AQxgCD;EACE,kBAAA;ER0gCD;AQvgCD;EACE,qBAAA;EACA,iBAAA;EACA,kBAAA;EACA,kBAAA;ERygCD;AQpgCD;EAAA;IAFI,iBAAA;IR0gCD;EACF;AQlgCD;;EAEE,gBAAA;ERogCD;AQjgCD;;EAEE,2BAAA;EACA,eAAA;ERmgCD;AQ//BD;EAAuB,kBAAA;ERkgCtB;AQjgCD;EAAuB,mBAAA;ERogCtB;AQngCD;EAAuB,oBAAA;ERsgCtB;AQrgCD;EAAuB,qBAAA;ERwgCtB;AQvgCD;EAAuB,qBAAA;ER0gCtB;AQvgCD;EAAuB,2BAAA;ER0gCtB;AQzgCD;EAAuB,2BAAA;ER4gCtB;AQ3gCD;EAAuB,4BAAA;ER8gCtB;AQ3gCD;EACE,gBAAA;ER6gCD;AQ3gCD;ECrGE,gBAAA;ETmnCD;ASlnCC;EACE,gBAAA;ETonCH;AQ9gCD;ECxGE,gBAAA;ETynCD;ASxnCC;EACE,gBAAA;ET0nCH;AQjhCD;EC3GE,gBAAA;ET+nCD;AS9nCC;EACE,gBAAA;ETgoCH;AQphCD;EC9GE,gBAAA;ETqoCD;ASpoCC;EACE,gBAAA;ETsoCH;AQvhCD;ECjHE,gBAAA;ET2oCD;AS1oCC;EACE,gBAAA;ET4oCH;AQthCD;EAGE,aAAA;EE3HA,2BAAA;EVkpCD;AUjpCC;EACE,2BAAA;EVmpCH;AQvhCD;EE9HE,2BAAA;EVwpCD;AUvpCC;EACE,2BAAA;EVypCH;AQ1hCD;EEjIE,2BAAA;EV8pCD;AU7pCC;EACE,2BAAA;EV+pCH;AQ7hCD;EEpIE,2BAAA;EVoqCD;AUnqCC;EACE,2BAAA;EVqqCH;AQhiCD;EEvIE,2BAAA;EV0qCD;AUzqCC;EACE,2BAAA;EV2qCH;AQ9hCD;EACE,qBAAA;EACA,qBAAA;EACA,kCAAA;ERgiCD;AQxhCD;;EAEE,eAAA;EACA,qBAAA;ER0hCD;AQ7hCD;;;;EAMI,kBAAA;ER6hCH;AQthCD;EACE,iBAAA;EACA,kBAAA;ERwhCD;AQphCD;EALE,iBAAA;EACA,kBAAA;EAMA,mBAAA;ERuhCD;AQzhCD;EAKI,uBAAA;EACA,mBAAA;EACA,oBAAA;ERuhCH;AQlhCD;EACE,eAAA;EACA,qBAAA;ERohCD;AQlhCD;;EAEE,yBAAA;ERohCD;AQlhCD;EACE,mBAAA;ERohCD;AQlhCD;EACE,gBAAA;ERohCD;AQ3/BD;EAAA;IAVM,aAAA;IACA,cAAA;IACA,aAAA;IACA,mBAAA;IGtNJ,kBAAA;IACA,yBAAA;IACA,qBAAA;IXguCC;EQrgCH;IAHM,oBAAA;IR2gCH;EACF;AQlgCD;;EAGE,cAAA;EACA,mCAAA;ERmgCD;AQjgCD;EACE,gBAAA;EACA,2BAAA;ERmgCD;AQ//BD;EACE,oBAAA;EACA,kBAAA;EACA,mBAAA;EACA,gCAAA;ERigCD;AQ5/BG;;;EACE,kBAAA;ERggCL;AQ1gCD;;;EAmBI,gBAAA;EACA,gBAAA;EACA,yBAAA;EACA,gBAAA;ER4/BH;AQ1/BG;;;EACE,wBAAA;ER8/BL;AQt/BD;;EAEE,qBAAA;EACA,iBAAA;EACA,iCAAA;EACA,gBAAA;EACA,mBAAA;ERw/BD;AQl/BG;;;;;;EAAW,aAAA;ER0/Bd;AQz/BG;;;;;;EACE,wBAAA;ERggCL;AQ1/BD;EACE,qBAAA;EACA,oBAAA;EACA,yBAAA;ER4/BD;AYlyCD;;;;EAIE,gEAAA;EZoyCD;AYhyCD;EACE,kBAAA;EACA,gBAAA;EACA,gBAAA;EACA,2BAAA;EACA,oBAAA;EZkyCD;AY9xCD;EACE,kBAAA;EACA,gBAAA;EACA,gBAAA;EACA,2BAAA;EACA,oBAAA;EACA,wDAAA;UAAA,gDAAA;EZgyCD;AYtyCD;EASI,YAAA;EACA,iBAAA;EACA,mBAAA;EACA,0BAAA;UAAA,kBAAA;EZgyCH;AY3xCD;EACE,gBAAA;EACA,gBAAA;EACA,kBAAA;EACA,iBAAA;EACA,yBAAA;EACA,uBAAA;EACA,uBAAA;EACA,gBAAA;EACA,2BAAA;EACA,2BAAA;EACA,oBAAA;EZ6xCD;AYxyCD;EAeI,YAAA;EACA,oBAAA;EACA,gBAAA;EACA,uBAAA;EACA,+BAAA;EACA,kBAAA;EZ4xCH;AYvxCD;EACE,mBAAA;EACA,oBAAA;EZyxCD;Aan1CD;ECHE,oBAAA;EACA,mBAAA;EACA,oBAAA;EACA,qBAAA;Edy1CD;Aan1CC;EAAA;IAFE,cAAA;Iby1CD;EACF;Aar1CC;EAAA;IAFE,cAAA;Ib21CD;EACF;Aav1CD;EAAA;IAFI,eAAA;Ib61CD;EACF;Aap1CD;ECvBE,oBAAA;EACA,mBAAA;EACA,oBAAA;EACA,qBAAA;Ed82CD;Aaj1CD;ECvBE,oBAAA;EACA,qBAAA;Ed22CD;Ae32CG;EACE,oBAAA;EAEA,iBAAA;EAEA,oBAAA;EACA,qBAAA;Ef22CL;Ae31CG;EACE,aAAA;Ef61CL;Aet1CC;EACE,aAAA;Efw1CH;Aez1CC;EACE,qBAAA;Ef21CH;Ae51CC;EACE,qBAAA;Ef81CH;Ae/1CC;EACE,YAAA;Efi2CH;Ael2CC;EACE,qBAAA;Efo2CH;Aer2CC;EACE,qBAAA;Efu2CH;Aex2CC;EACE,YAAA;Ef02CH;Ae32CC;EACE,qBAAA;Ef62CH;Ae92CC;EACE,qBAAA;Efg3CH;Aej3CC;EACE,YAAA;Efm3CH;Aep3CC;EACE,qBAAA;Efs3CH;Aev3CC;EACE,oBAAA;Efy3CH;Ae32CC;EACE,aAAA;Ef62CH;Ae92CC;EACE,qBAAA;Efg3CH;Aej3CC;EACE,qBAAA;Efm3CH;Aep3CC;EACE,YAAA;Efs3CH;Aev3CC;EACE,qBAAA;Efy3CH;Ae13CC;EACE,qBAAA;Ef43CH;Ae73CC;EACE,YAAA;Ef+3CH;Aeh4CC;EACE,qBAAA;Efk4CH;Aen4CC;EACE,qBAAA;Efq4CH;Aet4CC;EACE,YAAA;Efw4CH;Aez4CC;EACE,qBAAA;Ef24CH;Ae54CC;EACE,oBAAA;Ef84CH;Ae14CC;EACE,aAAA;Ef44CH;Ae55CC;EACE,YAAA;Ef85CH;Ae/5CC;EACE,oBAAA;Efi6CH;Ael6CC;EACE,oBAAA;Efo6CH;Aer6CC;EACE,WAAA;Efu6CH;Aex6CC;EACE,oBAAA;Ef06CH;Ae36CC;EACE,oBAAA;Ef66CH;Ae96CC;EACE,WAAA;Efg7CH;Aej7CC;EACE,oBAAA;Efm7CH;Aep7CC;EACE,oBAAA;Efs7CH;Aev7CC;EACE,WAAA;Efy7CH;Ae17CC;EACE,oBAAA;Ef47CH;Ae77CC;EACE,mBAAA;Ef+7CH;Ae37CC;EACE,YAAA;Ef67CH;Ae/6CC;EACE,mBAAA;Efi7CH;Ael7CC;EACE,2BAAA;Efo7CH;Aer7CC;EACE,2BAAA;Efu7CH;Aex7CC;EACE,kBAAA;Ef07CH;Ae37CC;EACE,2BAAA;Ef67CH;Ae97CC;EACE,2BAAA;Efg8CH;Aej8CC;EACE,kBAAA;Efm8CH;Aep8CC;EACE,2BAAA;Efs8CH;Aev8CC;EACE,2BAAA;Efy8CH;Ae18CC;EACE,kBAAA;Ef48CH;Ae78CC;EACE,2BAAA;Ef+8CH;Aeh9CC;EACE,0BAAA;Efk9CH;Aen9CC;EACE,iBAAA;Efq9CH;Aaz9CD;EE9BI;IACE,aAAA;If0/CH;Een/CD;IACE,aAAA;Ifq/CD;Eet/CD;IACE,qBAAA;Ifw/CD;Eez/CD;IACE,qBAAA;If2/CD;Ee5/CD;IACE,YAAA;If8/CD;Ee//CD;IACE,qBAAA;IfigDD;EelgDD;IACE,qBAAA;IfogDD;EergDD;IACE,YAAA;IfugDD;EexgDD;IACE,qBAAA;If0gDD;Ee3gDD;IACE,qBAAA;If6gDD;Ee9gDD;IACE,YAAA;IfghDD;EejhDD;IACE,qBAAA;IfmhDD;EephDD;IACE,oBAAA;IfshDD;EexgDD;IACE,aAAA;If0gDD;Ee3gDD;IACE,qBAAA;If6gDD;Ee9gDD;IACE,qBAAA;IfghDD;EejhDD;IACE,YAAA;IfmhDD;EephDD;IACE,qBAAA;IfshDD;EevhDD;IACE,qBAAA;IfyhDD;Ee1hDD;IACE,YAAA;If4hDD;Ee7hDD;IACE,qBAAA;If+hDD;EehiDD;IACE,qBAAA;IfkiDD;EeniDD;IACE,YAAA;IfqiDD;EetiDD;IACE,qBAAA;IfwiDD;EeziDD;IACE,oBAAA;If2iDD;EeviDD;IACE,aAAA;IfyiDD;EezjDD;IACE,YAAA;If2jDD;Ee5jDD;IACE,oBAAA;If8jDD;Ee/jDD;IACE,oBAAA;IfikDD;EelkDD;IACE,WAAA;IfokDD;EerkDD;IACE,oBAAA;IfukDD;EexkDD;IACE,oBAAA;If0kDD;Ee3kDD;IACE,WAAA;If6kDD;Ee9kDD;IACE,oBAAA;IfglDD;EejlDD;IACE,oBAAA;IfmlDD;EeplDD;IACE,WAAA;IfslDD;EevlDD;IACE,oBAAA;IfylDD;Ee1lDD;IACE,mBAAA;If4lDD;EexlDD;IACE,YAAA;If0lDD;Ee5kDD;IACE,mBAAA;If8kDD;Ee/kDD;IACE,2BAAA;IfilDD;EellDD;IACE,2BAAA;IfolDD;EerlDD;IACE,kBAAA;IfulDD;EexlDD;IACE,2BAAA;If0lDD;Ee3lDD;IACE,2BAAA;If6lDD;Ee9lDD;IACE,kBAAA;IfgmDD;EejmDD;IACE,2BAAA;IfmmDD;EepmDD;IACE,2BAAA;IfsmDD;EevmDD;IACE,kBAAA;IfymDD;Ee1mDD;IACE,2BAAA;If4mDD;Ee7mDD;IACE,0BAAA;If+mDD;EehnDD;IACE,iBAAA;IfknDD;EACF;Aa9mDD;EEvCI;IACE,aAAA;IfwpDH;EejpDD;IACE,aAAA;IfmpDD;EeppDD;IACE,qBAAA;IfspDD;EevpDD;IACE,qBAAA;IfypDD;Ee1pDD;IACE,YAAA;If4pDD;Ee7pDD;IACE,qBAAA;If+pDD;EehqDD;IACE,qBAAA;IfkqDD;EenqDD;IACE,YAAA;IfqqDD;EetqDD;IACE,qBAAA;IfwqDD;EezqDD;IACE,qBAAA;If2qDD;Ee5qDD;IACE,YAAA;If8qDD;Ee/qDD;IACE,qBAAA;IfirDD;EelrDD;IACE,oBAAA;IforDD;EetqDD;IACE,aAAA;IfwqDD;EezqDD;IACE,qBAAA;If2qDD;Ee5qDD;IACE,qBAAA;If8qDD;Ee/qDD;IACE,YAAA;IfirDD;EelrDD;IACE,qBAAA;IforDD;EerrDD;IACE,qBAAA;IfurDD;EexrDD;IACE,YAAA;If0rDD;Ee3rDD;IACE,qBAAA;If6rDD;Ee9rDD;IACE,qBAAA;IfgsDD;EejsDD;IACE,YAAA;IfmsDD;EepsDD;IACE,qBAAA;IfssDD;EevsDD;IACE,oBAAA;IfysDD;EersDD;IACE,aAAA;IfusDD;EevtDD;IACE,YAAA;IfytDD;Ee1tDD;IACE,oBAAA;If4tDD;Ee7tDD;IACE,oBAAA;If+tDD;EehuDD;IACE,WAAA;IfkuDD;EenuDD;IACE,oBAAA;IfquDD;EetuDD;IACE,oBAAA;IfwuDD;EezuDD;IACE,WAAA;If2uDD;Ee5uDD;IACE,oBAAA;If8uDD;Ee/uDD;IACE,oBAAA;IfivDD;EelvDD;IACE,WAAA;IfovDD;EervDD;IACE,oBAAA;IfuvDD;EexvDD;IACE,mBAAA;If0vDD;EetvDD;IACE,YAAA;IfwvDD;Ee1uDD;IACE,mBAAA;If4uDD;Ee7uDD;IACE,2BAAA;If+uDD;EehvDD;IACE,2BAAA;IfkvDD;EenvDD;IACE,kBAAA;IfqvDD;EetvDD;IACE,2BAAA;IfwvDD;EezvDD;IACE,2BAAA;If2vDD;Ee5vDD;IACE,kBAAA;If8vDD;Ee/vDD;IACE,2BAAA;IfiwDD;EelwDD;IACE,2BAAA;IfowDD;EerwDD;IACE,kBAAA;IfuwDD;EexwDD;IACE,2BAAA;If0wDD;Ee3wDD;IACE,0BAAA;If6wDD;Ee9wDD;IACE,iBAAA;IfgxDD;EACF;AarwDD;EE9CI;IACE,aAAA;IfszDH;Ee/yDD;IACE,aAAA;IfizDD;EelzDD;IACE,qBAAA;IfozDD;EerzDD;IACE,qBAAA;IfuzDD;EexzDD;IACE,YAAA;If0zDD;Ee3zDD;IACE,qBAAA;If6zDD;Ee9zDD;IACE,qBAAA;Ifg0DD;Eej0DD;IACE,YAAA;Ifm0DD;Eep0DD;IACE,qBAAA;Ifs0DD;Eev0DD;IACE,qBAAA;Ify0DD;Ee10DD;IACE,YAAA;If40DD;Ee70DD;IACE,qBAAA;If+0DD;Eeh1DD;IACE,oBAAA;Ifk1DD;Eep0DD;IACE,aAAA;Ifs0DD;Eev0DD;IACE,qBAAA;Ify0DD;Ee10DD;IACE,qBAAA;If40DD;Ee70DD;IACE,YAAA;If+0DD;Eeh1DD;IACE,qBAAA;Ifk1DD;Een1DD;IACE,qBAAA;Ifq1DD;Eet1DD;IACE,YAAA;Ifw1DD;Eez1DD;IACE,qBAAA;If21DD;Ee51DD;IACE,qBAAA;If81DD;Ee/1DD;IACE,YAAA;Ifi2DD;Eel2DD;IACE,qBAAA;Ifo2DD;Eer2DD;IACE,oBAAA;Ifu2DD;Een2DD;IACE,aAAA;Ifq2DD;Eer3DD;IACE,YAAA;Ifu3DD;Eex3DD;IACE,oBAAA;If03DD;Ee33DD;IACE,oBAAA;If63DD;Ee93DD;IACE,WAAA;Ifg4DD;Eej4DD;IACE,oBAAA;Ifm4DD;Eep4DD;IACE,oBAAA;Ifs4DD;Eev4DD;IACE,WAAA;Ify4DD;Ee14DD;IACE,oBAAA;If44DD;Ee74DD;IACE,oBAAA;If+4DD;Eeh5DD;IACE,WAAA;Ifk5DD;Een5DD;IACE,oBAAA;Ifq5DD;Eet5DD;IACE,mBAAA;Ifw5DD;Eep5DD;IACE,YAAA;Ifs5DD;Eex4DD;IACE,mBAAA;If04DD;Ee34DD;IACE,2BAAA;If64DD;Ee94DD;IACE,2BAAA;Ifg5DD;Eej5DD;IACE,kBAAA;Ifm5DD;Eep5DD;IACE,2BAAA;Ifs5DD;Eev5DD;IACE,2BAAA;Ify5DD;Ee15DD;IACE,kBAAA;If45DD;Ee75DD;IACE,2BAAA;If+5DD;Eeh6DD;IACE,2BAAA;Ifk6DD;Een6DD;IACE,kBAAA;Ifq6DD;Eet6DD;IACE,2BAAA;Ifw6DD;Eez6DD;IACE,0BAAA;If26DD;Ee56DD;IACE,iBAAA;If86DD;EACF;AgBl/DD;EACE,+BAAA;EhBo/DD;AgBl/DD;EACE,kBAAA;EACA,qBAAA;EACA,gBAAA;EACA,kBAAA;EhBo/DD;AgBl/DD;EACE,kBAAA;EhBo/DD;AgB9+DD;EACE,aAAA;EACA,iBAAA;EACA,qBAAA;EhBg/DD;AgBn/DD;;;;;;EAWQ,cAAA;EACA,yBAAA;EACA,qBAAA;EACA,+BAAA;EhBg/DP;AgB9/DD;EAoBI,wBAAA;EACA,kCAAA;EhB6+DH;AgBlgED;;;;;;EA8BQ,eAAA;EhB4+DP;AgB1gED;EAoCI,+BAAA;EhBy+DH;AgB7gED;EAyCI,2BAAA;EhBu+DH;AgBh+DD;;;;;;EAOQ,cAAA;EhBi+DP;AgBt9DD;EACE,2BAAA;EhBw9DD;AgBz9DD;;;;;;EAQQ,2BAAA;EhBy9DP;AgBj+DD;;EAeM,0BAAA;EhBs9DL;AgB58DD;EAEI,2BAAA;EhB68DH;AgBp8DD;EAEI,2BAAA;EhBq8DH;AgB57DD;EACE,kBAAA;EACA,aAAA;EACA,uBAAA;EhB87DD;AgBz7DG;;EACE,kBAAA;EACA,aAAA;EACA,qBAAA;EhB47DL;AiBxkEC;;;;;;;;;;;;EAOI,2BAAA;EjB+kEL;AiBzkEC;;;;;EAMI,2BAAA;EjB0kEL;AiB7lEC;;;;;;;;;;;;EAOI,2BAAA;EjBomEL;AiB9lEC;;;;;EAMI,2BAAA;EjB+lEL;AiBlnEC;;;;;;;;;;;;EAOI,2BAAA;EjBynEL;AiBnnEC;;;;;EAMI,2BAAA;EjBonEL;AiBvoEC;;;;;;;;;;;;EAOI,2BAAA;EjB8oEL;AiBxoEC;;;;;EAMI,2BAAA;EjByoEL;AiB5pEC;;;;;;;;;;;;EAOI,2BAAA;EjBmqEL;AiB7pEC;;;;;EAMI,2BAAA;EjB8pEL;AgB5gED;EACE,kBAAA;EACA,mBAAA;EhB8gED;AgBj9DD;EAAA;IA1DI,aAAA;IACA,qBAAA;IACA,oBAAA;IACA,8CAAA;IACA,2BAAA;IhB+gED;EgBz9DH;IAlDM,kBAAA;IhB8gEH;EgB59DH;;;;;;IAzCY,qBAAA;IhB6gET;EgBp+DH;IAjCM,WAAA;IhBwgEH;EgBv+DH;;;;;;IAxBY,gBAAA;IhBugET;EgB/+DH;;;;;;IApBY,iBAAA;IhB2gET;EgBv/DH;;;;IAPY,kBAAA;IhBogET;EACF;AkB9tED;EACE,YAAA;EACA,WAAA;EACA,WAAA;EAIA,cAAA;ElB6tED;AkB1tED;EACE,gBAAA;EACA,aAAA;EACA,YAAA;EACA,qBAAA;EACA,iBAAA;EACA,sBAAA;EACA,gBAAA;EACA,WAAA;EACA,kCAAA;ElB4tED;AkBztED;EACE,uBAAA;EACA,iBAAA;EACA,oBAAA;EACA,mBAAA;ElB2tED;AkBhtED;Eb4BE,gCAAA;EACG,6BAAA;EACK,wBAAA;ELurET;AkBhtED;;EAEE,iBAAA;EACA,oBAAA;EACA,qBAAA;ElBktED;AkB9sED;EACE,gBAAA;ElBgtED;AkB5sED;EACE,gBAAA;EACA,aAAA;ElB8sED;AkB1sED;;EAEE,cAAA;ElB4sED;AkBxsED;;;EZxEE,sBAAA;EAEA,4CAAA;EACA,sBAAA;ENoxED;AkBxsED;EACE,gBAAA;EACA,kBAAA;EACA,iBAAA;EACA,yBAAA;EACA,gBAAA;ElB0sED;AkBhrED;EACE,gBAAA;EACA,aAAA;EACA,cAAA;EACA,mBAAA;EACA,iBAAA;EACA,yBAAA;EACA,gBAAA;EACA,2BAAA;EACA,wBAAA;EACA,2BAAA;EACA,oBAAA;EbzDA,0DAAA;EACQ,kDAAA;EAyHR,wFAAA;EACK,2EAAA;EACG,wEAAA;ELonET;AmB5vEC;EACE,uBAAA;EACA,YAAA;EdUF,wFAAA;EACQ,gFAAA;ELqvET;AKptEC;EACE,gBAAA;EACA,YAAA;ELstEH;AKptEC;EAA0B,gBAAA;ELutE3B;AKttEC;EAAgC,gBAAA;ELytEjC;AkBxrEC;;;EAGE,qBAAA;EACA,2BAAA;EACA,YAAA;ElB0rEH;AkBtrEC;EACE,cAAA;ElBwrEH;AkB5qED;EACE,0BAAA;ElB8qED;AkB7oED;EArBE;;;;IAIE,mBAAA;IlBqqED;EkBnqED;;;;IAIE,mBAAA;IlBqqED;EkBnqED;;;;IAIE,mBAAA;IlBqqED;EACF;AkB5pED;EACE,qBAAA;ElB8pED;AkBtpED;;EAEE,oBAAA;EACA,gBAAA;EACA,kBAAA;EACA,qBAAA;ElBwpED;AkB7pED;;EAQI,kBAAA;EACA,oBAAA;EACA,kBAAA;EACA,qBAAA;EACA,iBAAA;ElBypEH;AkBtpED;;;;EAIE,oBAAA;EACA,oBAAA;EACA,oBAAA;ElBwpED;AkBrpED;;EAEE,kBAAA;ElBupED;AkBnpED;;EAEE,uBAAA;EACA,oBAAA;EACA,kBAAA;EACA,wBAAA;EACA,qBAAA;EACA,iBAAA;ElBqpED;AkBnpED;;EAEE,eAAA;EACA,mBAAA;ElBqpED;AkB5oEC;;;;;;EAGE,qBAAA;ElBipEH;AkB3oEC;;;;EAEE,qBAAA;ElB+oEH;AkBzoEC;;;;EAGI,qBAAA;ElB4oEL;AkBjoED;EAEE,kBAAA;EACA,qBAAA;EAEA,kBAAA;ElBioED;AkB/nEC;;EAEE,iBAAA;EACA,kBAAA;ElBioEH;AkBvnED;;ECnPE,cAAA;EACA,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,oBAAA;EnB82ED;AmB52EC;;EACE,cAAA;EACA,mBAAA;EnB+2EH;AmB52EC;;;;EAEE,cAAA;EnBg3EH;AkBroED;;ECxPE,cAAA;EACA,oBAAA;EACA,iBAAA;EACA,mBAAA;EACA,oBAAA;EnBi4ED;AmB/3EC;;EACE,cAAA;EACA,mBAAA;EnBk4EH;AmB/3EC;;;;EAEE,cAAA;EnBm4EH;AkB9oED;EAEE,oBAAA;ElB+oED;AkBjpED;EAMI,uBAAA;ElB8oEH;AkB1oED;EACE,oBAAA;EACA,QAAA;EACA,UAAA;EACA,YAAA;EACA,gBAAA;EACA,aAAA;EACA,cAAA;EACA,mBAAA;EACA,oBAAA;EACA,sBAAA;ElB4oED;AkB1oED;EACE,aAAA;EACA,cAAA;EACA,mBAAA;ElB4oED;AkB1oED;EACE,aAAA;EACA,cAAA;EACA,mBAAA;ElB4oED;AkBxoED;;;;;;;;;;ECxVI,gBAAA;EnB4+EH;AkBppED;ECpVI,uBAAA;Ed+CF,0DAAA;EACQ,kDAAA;EL67ET;AmB3+EG;EACE,uBAAA;Ed4CJ,2EAAA;EACQ,mEAAA;ELk8ET;AkB9pED;EC1UI,gBAAA;EACA,uBAAA;EACA,2BAAA;EnB2+EH;AkBnqED;ECpUI,gBAAA;EnB0+EH;AkBnqED;;;;;;;;;;EC3VI,gBAAA;EnB0gFH;AkB/qED;ECvVI,uBAAA;Ed+CF,0DAAA;EACQ,kDAAA;EL29ET;AmBzgFG;EACE,uBAAA;Ed4CJ,2EAAA;EACQ,mEAAA;ELg+ET;AkBzrED;EC7UI,gBAAA;EACA,uBAAA;EACA,2BAAA;EnBygFH;AkB9rED;ECvUI,gBAAA;EnBwgFH;AkB9rED;;;;;;;;;;EC9VI,gBAAA;EnBwiFH;AkB1sED;EC1VI,uBAAA;Ed+CF,0DAAA;EACQ,kDAAA;ELy/ET;AmBviFG;EACE,uBAAA;Ed4CJ,2EAAA;EACQ,mEAAA;EL8/ET;AkBptED;EChVI,gBAAA;EACA,uBAAA;EACA,2BAAA;EnBuiFH;AkBztED;EC1UI,gBAAA;EnBsiFH;AkBrtEC;EACG,WAAA;ElButEJ;AkBrtEC;EACG,QAAA;ElButEJ;AkB7sED;EACE,gBAAA;EACA,iBAAA;EACA,qBAAA;EACA,gBAAA;ElB+sED;AkB3nED;EAAA;IA/DM,uBAAA;IACA,kBAAA;IACA,wBAAA;IlB8rEH;EkBjoEH;IAxDM,uBAAA;IACA,aAAA;IACA,wBAAA;IlB4rEH;EkBtoEH;IAjDM,uBAAA;IlB0rEH;EkBzoEH;IA7CM,uBAAA;IACA,wBAAA;IlByrEH;EkB7oEH;;;IAvCQ,aAAA;IlByrEL;EkBlpEH;IAjCM,aAAA;IlBsrEH;EkBrpEH;IA7BM,kBAAA;IACA,wBAAA;IlBqrEH;EkBzpEH;;IApBM,uBAAA;IACA,eAAA;IACA,kBAAA;IACA,wBAAA;IlBirEH;EkBhqEH;;IAdQ,iBAAA;IlBkrEL;EkBpqEH;;IATM,oBAAA;IACA,gBAAA;IlBirEH;EkBzqEH;IAHM,QAAA;IlB+qEH;EACF;AkBrqED;;;;EASI,eAAA;EACA,kBAAA;EACA,kBAAA;ElBkqEH;AkB7qED;;EAiBI,kBAAA;ElBgqEH;AkBjrED;EJrdE,oBAAA;EACA,qBAAA;EdyoFD;AkBlpEC;EAAA;IANI,mBAAA;IACA,kBAAA;IACA,kBAAA;IlB4pEH;EACF;AkB5rED;EAwCI,aAAA;ElBupEH;AkB1oEC;EAAA;IAHM,qBAAA;IlBipEL;EACF;AkBxoEC;EAAA;IAHM,kBAAA;IlB+oEL;EACF;AoBrqFD;EACE,uBAAA;EACA,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,wBAAA;EACA,gCAAA;MAAA,4BAAA;EACA,iBAAA;EACA,wBAAA;EACA,+BAAA;EACA,qBAAA;EC6BA,mBAAA;EACA,iBAAA;EACA,yBAAA;EACA,oBAAA;EhB4KA,2BAAA;EACG,wBAAA;EACC,uBAAA;EACI,mBAAA;ELg+ET;AoBxqFG;;;;;;EdrBF,sBAAA;EAEA,4CAAA;EACA,sBAAA;ENosFD;AoB5qFC;;;EAGE,gBAAA;EACA,uBAAA;EpB8qFH;AoB3qFC;;EAEE,YAAA;EACA,wBAAA;Ef2BF,0DAAA;EACQ,kDAAA;ELmpFT;AoB3qFC;;;EAGE,qBAAA;EACA,sBAAA;EE9CF,eAAA;EAGA,2BAAA;EjB8DA,0BAAA;EACQ,kBAAA;EL6pFT;AoBvqFD;ECrDE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErB+tFD;AqB7tFC;;;;;;EAME,gBAAA;EACA,2BAAA;EACI,uBAAA;ErB+tFP;AqB7tFC;;;EAGE,wBAAA;ErB+tFH;AqB1tFG;;;;;;;;;;;;;;;;;;EAME,2BAAA;EACI,uBAAA;ErBwuFT;AoBhtFD;ECnBI,gBAAA;EACA,2BAAA;ErBsuFH;AoBjtFD;ECxDE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErB4wFD;AqB1wFC;;;;;;EAME,gBAAA;EACA,2BAAA;EACI,uBAAA;ErB4wFP;AqB1wFC;;;EAGE,wBAAA;ErB4wFH;AqBvwFG;;;;;;;;;;;;;;;;;;EAME,2BAAA;EACI,uBAAA;ErBqxFT;AoB1vFD;ECtBI,gBAAA;EACA,2BAAA;ErBmxFH;AoB1vFD;EC5DE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErByzFD;AqBvzFC;;;;;;EAME,gBAAA;EACA,2BAAA;EACI,uBAAA;ErByzFP;AqBvzFC;;;EAGE,wBAAA;ErByzFH;AqBpzFG;;;;;;;;;;;;;;;;;;EAME,2BAAA;EACI,uBAAA;ErBk0FT;AoBnyFD;EC1BI,gBAAA;EACA,2BAAA;ErBg0FH;AoBnyFD;EChEE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErBs2FD;AqBp2FC;;;;;;EAME,gBAAA;EACA,2BAAA;EACI,uBAAA;ErBs2FP;AqBp2FC;;;EAGE,wBAAA;ErBs2FH;AqBj2FG;;;;;;;;;;;;;;;;;;EAME,2BAAA;EACI,uBAAA;ErB+2FT;AoB50FD;EC9BI,gBAAA;EACA,2BAAA;ErB62FH;AoB50FD;ECpEE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErBm5FD;AqBj5FC;;;;;;EAME,gBAAA;EACA,2BAAA;EACI,uBAAA;ErBm5FP;AqBj5FC;;;EAGE,wBAAA;ErBm5FH;AqB94FG;;;;;;;;;;;;;;;;;;EAME,2BAAA;EACI,uBAAA;ErB45FT;AoBr3FD;EClCI,gBAAA;EACA,2BAAA;ErB05FH;AoBr3FD;ECxEE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErBg8FD;AqB97FC;;;;;;EAME,gBAAA;EACA,2BAAA;EACI,uBAAA;ErBg8FP;AqB97FC;;;EAGE,wBAAA;ErBg8FH;AqB37FG;;;;;;;;;;;;;;;;;;EAME,2BAAA;EACI,uBAAA;ErBy8FT;AoB95FD;ECtCI,gBAAA;EACA,2BAAA;ErBu8FH;AoBz5FD;EACE,gBAAA;EACA,qBAAA;EACA,kBAAA;EpB25FD;AoBz5FC;;;;;EAKE,+BAAA;Ef7BF,0BAAA;EACQ,kBAAA;ELy7FT;AoB15FC;;;;EAIE,2BAAA;EpB45FH;AoB15FC;;EAEE,gBAAA;EACA,4BAAA;EACA,+BAAA;EpB45FH;AoBx5FG;;;;EAEE,gBAAA;EACA,uBAAA;EpB45FL;AoBn5FD;;EC/EE,oBAAA;EACA,iBAAA;EACA,mBAAA;EACA,oBAAA;ErBs+FD;AoBt5FD;;ECnFE,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,oBAAA;ErB6+FD;AoBz5FD;;ECvFE,kBAAA;EACA,iBAAA;EACA,kBAAA;EACA,oBAAA;ErBo/FD;AoBx5FD;EACE,gBAAA;EACA,aAAA;EpB05FD;AoBt5FD;EACE,iBAAA;EpBw5FD;AoBj5FC;;;EACE,aAAA;EpBq5FH;AuBziGD;EACE,YAAA;ElBoLA,0CAAA;EACK,qCAAA;EACG,kCAAA;ELw3FT;AuB5iGC;EACE,YAAA;EvB8iGH;AuB1iGD;EACE,eAAA;EACA,oBAAA;EvB4iGD;AuB1iGC;EAAY,gBAAA;EAAgB,qBAAA;EvB8iG7B;AuB7iGC;EAAY,oBAAA;EvBgjGb;AuB/iGC;EAAY,0BAAA;EvBkjGb;AuB/iGD;EACE,oBAAA;EACA,WAAA;EACA,kBAAA;ElBsKA,iDAAA;EACQ,4CAAA;KAAA,yCAAA;EAOR,oCAAA;EACQ,+BAAA;KAAA,4BAAA;EAGR,0CAAA;EACQ,qCAAA;KAAA,kCAAA;ELo4FT;AwB9kGD;EACE,uBAAA;EACA,UAAA;EACA,WAAA;EACA,kBAAA;EACA,wBAAA;EACA,uBAAA;EACA,qCAAA;EACA,oCAAA;ExBglGD;AwB5kGD;EACE,oBAAA;ExB8kGD;AwB1kGD;EACE,YAAA;ExB4kGD;AwBxkGD;EACE,oBAAA;EACA,WAAA;EACA,SAAA;EACA,eAAA;EACA,eAAA;EACA,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,kBAAA;EACA,iBAAA;EACA,kBAAA;EACA,2BAAA;EACA,2BAAA;EACA,uCAAA;EACA,oBAAA;EnBwBA,qDAAA;EACQ,6CAAA;EmBvBR,sCAAA;UAAA,8BAAA;ExB2kGD;AwBtkGC;EACE,UAAA;EACA,YAAA;ExBwkGH;AwBjmGD;ECvBE,aAAA;EACA,eAAA;EACA,kBAAA;EACA,2BAAA;EzB2nGD;AwBvmGD;EAmCI,gBAAA;EACA,mBAAA;EACA,aAAA;EACA,qBAAA;EACA,yBAAA;EACA,gBAAA;EACA,qBAAA;ExBukGH;AwBjkGC;;EAEE,uBAAA;EACA,gBAAA;EACA,2BAAA;ExBmkGH;AwB7jGC;;;EAGE,gBAAA;EACA,uBAAA;EACA,YAAA;EACA,2BAAA;ExB+jGH;AwBtjGC;;;EAGE,gBAAA;ExBwjGH;AwBpjGC;;EAEE,uBAAA;EACA,+BAAA;EACA,wBAAA;EEzGF,qEAAA;EF2GE,qBAAA;ExBsjGH;AwBjjGD;EAGI,gBAAA;ExBijGH;AwBpjGD;EAQI,YAAA;ExB+iGH;AwBviGD;EACE,YAAA;EACA,UAAA;ExByiGD;AwBjiGD;EACE,SAAA;EACA,aAAA;ExBmiGD;AwB/hGD;EACE,gBAAA;EACA,mBAAA;EACA,iBAAA;EACA,yBAAA;EACA,gBAAA;EACA,qBAAA;ExBiiGD;AwB7hGD;EACE,iBAAA;EACA,SAAA;EACA,UAAA;EACA,WAAA;EACA,QAAA;EACA,cAAA;ExB+hGD;AwB3hGD;EACE,UAAA;EACA,YAAA;ExB6hGD;AwBrhGD;;EAII,eAAA;EACA,0BAAA;EACA,aAAA;ExBqhGH;AwB3hGD;;EAUI,WAAA;EACA,cAAA;EACA,oBAAA;ExBqhGH;AwBhgGD;EAXE;IAnEA,YAAA;IACA,UAAA;IxBklGC;EwBhhGD;IAzDA,SAAA;IACA,aAAA;IxB4kGC;EACF;A2B1tGD;;EAEE,oBAAA;EACA,uBAAA;EACA,wBAAA;E3B4tGD;A2BhuGD;;EAMI,oBAAA;EACA,aAAA;E3B8tGH;A2B5tGG;;;;;;;;EAIE,YAAA;E3BkuGL;A2B5tGD;;;;EAKI,mBAAA;E3B6tGH;A2BxtGD;EACE,mBAAA;E3B0tGD;A2B3tGD;;EAMI,aAAA;E3BytGH;A2B/tGD;;;EAWI,kBAAA;E3BytGH;A2BrtGD;EACE,kBAAA;E3ButGD;A2BntGD;EACE,gBAAA;E3BqtGD;A2BptGC;ECjDA,+BAAA;EACG,4BAAA;E5BwwGJ;A2BntGD;;EC9CE,8BAAA;EACG,2BAAA;E5BqwGJ;A2BltGD;EACE,aAAA;E3BotGD;A2BltGD;EACE,kBAAA;E3BotGD;A2BltGD;;EClEE,+BAAA;EACG,4BAAA;E5BwxGJ;A2BjtGD;EChEE,8BAAA;EACG,2BAAA;E5BoxGJ;A2BhtGD;;EAEE,YAAA;E3BktGD;A2BjsGD;EACE,mBAAA;EACA,oBAAA;E3BmsGD;A2BjsGD;EACE,oBAAA;EACA,qBAAA;E3BmsGD;A2B9rGD;EtB9CE,0DAAA;EACQ,kDAAA;EL+uGT;A2B9rGC;EtBlDA,0BAAA;EACQ,kBAAA;ELmvGT;A2B3rGD;EACE,gBAAA;E3B6rGD;A2B1rGD;EACE,yBAAA;EACA,wBAAA;E3B4rGD;A2BzrGD;EACE,yBAAA;E3B2rGD;A2BprGD;;;EAII,gBAAA;EACA,aAAA;EACA,aAAA;EACA,iBAAA;E3BqrGH;A2B5rGD;EAcM,aAAA;E3BirGL;A2B/rGD;;;;EAsBI,kBAAA;EACA,gBAAA;E3B+qGH;A2B1qGC;EACE,kBAAA;E3B4qGH;A2B1qGC;EACE,8BAAA;ECnKF,+BAAA;EACC,8BAAA;E5Bg1GF;A2B3qGC;EACE,gCAAA;EC/KF,4BAAA;EACC,2BAAA;E5B61GF;A2B3qGD;EACE,kBAAA;E3B6qGD;A2B3qGD;;EC9KE,+BAAA;EACC,8BAAA;E5B61GF;A2B1qGD;EC5LE,4BAAA;EACC,2BAAA;E5By2GF;A2BtqGD;EACE,gBAAA;EACA,aAAA;EACA,qBAAA;EACA,2BAAA;E3BwqGD;A2B5qGD;;EAOI,aAAA;EACA,qBAAA;EACA,WAAA;E3ByqGH;A2BlrGD;EAYI,aAAA;E3ByqGH;A2BrrGD;EAgBI,YAAA;E3BwqGH;A2BvpGD;;;;EAKM,oBAAA;EACA,wBAAA;EACA,sBAAA;E3BwpGL;A6Bj4GD;EACE,oBAAA;EACA,gBAAA;EACA,2BAAA;E7Bm4GD;A6Bh4GC;EACE,aAAA;EACA,iBAAA;EACA,kBAAA;E7Bk4GH;A6B34GD;EAeI,oBAAA;EACA,YAAA;EAKA,aAAA;EAEA,aAAA;EACA,kBAAA;E7B03GH;A6Bj3GD;;;EV8BE,cAAA;EACA,oBAAA;EACA,iBAAA;EACA,mBAAA;EACA,oBAAA;EnBw1GD;AmBt1GC;;;EACE,cAAA;EACA,mBAAA;EnB01GH;AmBv1GC;;;;;;EAEE,cAAA;EnB61GH;A6Bn4GD;;;EVyBE,cAAA;EACA,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,oBAAA;EnB+2GD;AmB72GC;;;EACE,cAAA;EACA,mBAAA;EnBi3GH;AmB92GC;;;;;;EAEE,cAAA;EnBo3GH;A6Bj5GD;;;EAGE,qBAAA;E7Bm5GD;A6Bj5GC;;;EACE,kBAAA;E7Bq5GH;A6Bj5GD;;EAEE,WAAA;EACA,qBAAA;EACA,wBAAA;E7Bm5GD;A6B94GD;EACE,mBAAA;EACA,iBAAA;EACA,qBAAA;EACA,gBAAA;EACA,gBAAA;EACA,oBAAA;EACA,2BAAA;EACA,2BAAA;EACA,oBAAA;E7Bg5GD;A6B74GC;EACE,mBAAA;EACA,iBAAA;EACA,oBAAA;E7B+4GH;A6B74GC;EACE,oBAAA;EACA,iBAAA;EACA,oBAAA;E7B+4GH;A6Bn6GD;;EA0BI,eAAA;E7B64GH;A6Bx4GD;;;;;;;EDhGE,+BAAA;EACG,4BAAA;E5Bi/GJ;A6Bz4GD;EACE,iBAAA;E7B24GD;A6Bz4GD;;;;;;;EDpGE,8BAAA;EACG,2BAAA;E5Bs/GJ;A6B14GD;EACE,gBAAA;E7B44GD;A6Bv4GD;EACE,oBAAA;EAGA,cAAA;EACA,qBAAA;E7Bu4GD;A6B54GD;EAUI,oBAAA;E7Bq4GH;A6B/4GD;EAYM,mBAAA;E7Bs4GL;A6Bn4GG;;;EAGE,YAAA;E7Bq4GL;A6Bh4GC;;EAGI,oBAAA;E7Bi4GL;A6B93GC;;EAGI,mBAAA;E7B+3GL;A8BzhHD;EACE,kBAAA;EACA,iBAAA;EACA,kBAAA;E9B2hHD;A8B9hHD;EAOI,oBAAA;EACA,gBAAA;E9B0hHH;A8BliHD;EAWM,oBAAA;EACA,gBAAA;EACA,oBAAA;E9B0hHL;A8BzhHK;;EAEE,uBAAA;EACA,2BAAA;E9B2hHP;A8BthHG;EACE,gBAAA;E9BwhHL;A8BthHK;;EAEE,gBAAA;EACA,uBAAA;EACA,+BAAA;EACA,qBAAA;E9BwhHP;A8BjhHG;;;EAGE,2BAAA;EACA,uBAAA;E9BmhHL;A8B5jHD;ELHE,aAAA;EACA,eAAA;EACA,kBAAA;EACA,2BAAA;EzBkkHD;A8BlkHD;EA0DI,iBAAA;E9B2gHH;A8BlgHD;EACE,kCAAA;E9BogHD;A8BrgHD;EAGI,aAAA;EAEA,qBAAA;E9BogHH;A8BzgHD;EASM,mBAAA;EACA,yBAAA;EACA,+BAAA;EACA,4BAAA;E9BmgHL;A8BlgHK;EACE,uCAAA;E9BogHP;A8B9/GK;;;EAGE,gBAAA;EACA,2BAAA;EACA,2BAAA;EACA,kCAAA;EACA,iBAAA;E9BggHP;A8B3/GC;EAqDA,aAAA;EA8BA,kBAAA;E9B46GD;A8B//GC;EAwDE,aAAA;E9B08GH;A8BlgHC;EA0DI,oBAAA;EACA,oBAAA;E9B28GL;A8BtgHC;EAgEE,WAAA;EACA,YAAA;E9By8GH;A8B77GD;EAAA;IAPM,qBAAA;IACA,WAAA;I9Bw8GH;E8Bl8GH;IAJQ,kBAAA;I9By8GL;EACF;A8BnhHC;EAuFE,iBAAA;EACA,oBAAA;E9B+7GH;A8BvhHC;;;EA8FE,2BAAA;E9B87GH;A8Bh7GD;EAAA;IATM,kCAAA;IACA,4BAAA;I9B67GH;E8Br7GH;;;IAHM,8BAAA;I9B67GH;EACF;A8B9hHD;EAEI,aAAA;E9B+hHH;A8BjiHD;EAMM,oBAAA;E9B8hHL;A8BpiHD;EASM,kBAAA;E9B8hHL;A8BzhHK;;;EAGE,gBAAA;EACA,2BAAA;E9B2hHP;A8BnhHD;EAEI,aAAA;E9BohHH;A8BthHD;EAIM,iBAAA;EACA,gBAAA;E9BqhHL;A8BzgHD;EACE,aAAA;E9B2gHD;A8B5gHD;EAII,aAAA;E9B2gHH;A8B/gHD;EAMM,oBAAA;EACA,oBAAA;E9B4gHL;A8BnhHD;EAYI,WAAA;EACA,YAAA;E9B0gHH;A8B9/GD;EAAA;IAPM,qBAAA;IACA,WAAA;I9BygHH;E8BngHH;IAJQ,kBAAA;I9B0gHL;EACF;A8BlgHD;EACE,kBAAA;E9BogHD;A8BrgHD;EAKI,iBAAA;EACA,oBAAA;E9BmgHH;A8BzgHD;;;EAYI,2BAAA;E9BkgHH;A8Bp/GD;EAAA;IATM,kCAAA;IACA,4BAAA;I9BigHH;E8Bz/GH;;;IAHM,8BAAA;I9BigHH;EACF;A8Bx/GD;EAEI,eAAA;EACA,oBAAA;E9By/GH;A8B5/GD;EAMI,gBAAA;EACA,qBAAA;E9By/GH;A8Bh/GD;EAEE,kBAAA;EF7OA,4BAAA;EACC,2BAAA;E5B+tHF;A+BztHD;EACE,oBAAA;EACA,kBAAA;EACA,qBAAA;EACA,+BAAA;E/B2tHD;A+BntHD;EAAA;IAFI,oBAAA;I/BytHD;EACF;A+B1sHD;EAAA;IAFI,aAAA;I/BgtHD;EACF;A+BlsHD;EACE,qBAAA;EACA,qBAAA;EACA,oBAAA;EACA,mCAAA;EACA,4DAAA;UAAA,oDAAA;EAEA,mCAAA;E/BmsHD;A+BjsHC;EACE,kBAAA;E/BmsHH;A+BtqHD;EAAA;IAzBI,aAAA;IACA,eAAA;IACA,0BAAA;YAAA,kBAAA;I/BmsHD;E+BjsHC;IACE,2BAAA;IACA,gCAAA;IACA,yBAAA;IACA,mBAAA;IACA,8BAAA;I/BmsHH;E+BhsHC;IACE,qBAAA;I/BksHH;E+B7rHC;;;IAGE,iBAAA;IACA,kBAAA;I/B+rHH;EACF;A+B3rHD;;EAGI,mBAAA;E/B4rHH;A+BvrHC;EAAA;;IAFI,mBAAA;I/B8rHH;EACF;A+BrrHD;;;;EAII,qBAAA;EACA,oBAAA;E/BurHH;A+BjrHC;EAAA;;;;IAHI,iBAAA;IACA,gBAAA;I/B2rHH;EACF;A+B/qHD;EACE,eAAA;EACA,uBAAA;E/BirHD;A+B5qHD;EAAA;IAFI,kBAAA;I/BkrHD;EACF;A+B9qHD;;EAEE,iBAAA;EACA,UAAA;EACA,SAAA;EACA,eAAA;E/BgrHD;A+B1qHD;EAAA;;IAFI,kBAAA;I/BirHD;EACF;A+B/qHD;EACE,QAAA;EACA,uBAAA;E/BirHD;A+B/qHD;EACE,WAAA;EACA,kBAAA;EACA,uBAAA;E/BirHD;A+B3qHD;EACE,aAAA;EACA,oBAAA;EACA,iBAAA;EACA,mBAAA;EACA,cAAA;E/B6qHD;A+B3qHC;;EAEE,uBAAA;E/B6qHH;A+BtrHD;EAaI,gBAAA;E/B4qHH;A+BnqHD;EALI;;IAEE,oBAAA;I/B2qHH;EACF;A+BjqHD;EACE,oBAAA;EACA,cAAA;EACA,oBAAA;EACA,mBAAA;EC/LA,iBAAA;EACA,oBAAA;EDgMA,+BAAA;EACA,wBAAA;EACA,+BAAA;EACA,oBAAA;E/BoqHD;A+BhqHC;EACE,YAAA;E/BkqHH;A+BhrHD;EAmBI,gBAAA;EACA,aAAA;EACA,aAAA;EACA,oBAAA;E/BgqHH;A+BtrHD;EAyBI,iBAAA;E/BgqHH;A+B1pHD;EAAA;IAFI,eAAA;I/BgqHD;EACF;A+BvpHD;EACE,qBAAA;E/BypHD;A+B1pHD;EAII,mBAAA;EACA,sBAAA;EACA,mBAAA;E/BypHH;A+B9nHC;EAAA;IArBI,kBAAA;IACA,aAAA;IACA,aAAA;IACA,eAAA;IACA,+BAAA;IACA,WAAA;IACA,0BAAA;YAAA,kBAAA;I/BupHH;E+BxoHD;;IAZM,4BAAA;I/BwpHL;E+B5oHD;IATM,mBAAA;I/BwpHL;E+BvpHK;;IAEE,wBAAA;I/BypHP;EACF;A+BvoHD;EAAA;IAXI,aAAA;IACA,WAAA;I/BspHD;E+B5oHH;IAPM,aAAA;I/BspHH;E+B/oHH;IALQ,mBAAA;IACA,sBAAA;I/BupHL;EACF;A+B5oHD;EACE,oBAAA;EACA,qBAAA;EACA,oBAAA;EACA,mCAAA;EACA,sCAAA;E1B/NA,8FAAA;EACQ,sFAAA;E2B/DR,iBAAA;EACA,oBAAA;EhC86HD;AkBz9GD;EAAA;IA/DM,uBAAA;IACA,kBAAA;IACA,wBAAA;IlB4hHH;EkB/9GH;IAxDM,uBAAA;IACA,aAAA;IACA,wBAAA;IlB0hHH;EkBp+GH;IAjDM,uBAAA;IlBwhHH;EkBv+GH;IA7CM,uBAAA;IACA,wBAAA;IlBuhHH;EkB3+GH;;;IAvCQ,aAAA;IlBuhHL;EkBh/GH;IAjCM,aAAA;IlBohHH;EkBn/GH;IA7BM,kBAAA;IACA,wBAAA;IlBmhHH;EkBv/GH;;IApBM,uBAAA;IACA,eAAA;IACA,kBAAA;IACA,wBAAA;IlB+gHH;EkB9/GH;;IAdQ,iBAAA;IlBghHL;EkBlgHH;;IATM,oBAAA;IACA,gBAAA;IlB+gHH;EkBvgHH;IAHM,QAAA;IlB6gHH;EACF;A+BrrHC;EAAA;IANI,oBAAA;I/B+rHH;E+B7rHG;IACE,kBAAA;I/B+rHL;EACF;A+B9qHD;EAAA;IARI,aAAA;IACA,WAAA;IACA,gBAAA;IACA,iBAAA;IACA,gBAAA;IACA,mBAAA;I1B1PF,0BAAA;IACQ,kBAAA;ILq7HP;EACF;A+BprHD;EACE,eAAA;EHrUA,4BAAA;EACC,2BAAA;E5B4/HF;A+BprHD;EHzUE,8BAAA;EACC,6BAAA;EAOD,+BAAA;EACC,8BAAA;E5B0/HF;A+BhrHD;EChVE,iBAAA;EACA,oBAAA;EhCmgID;A+BjrHC;ECnVA,kBAAA;EACA,qBAAA;EhCugID;A+BlrHC;ECtVA,kBAAA;EACA,qBAAA;EhC2gID;A+B5qHD;EChWE,kBAAA;EACA,qBAAA;EhC+gID;A+BxqHD;EAAA;IAJI,aAAA;IACA,mBAAA;IACA,oBAAA;I/BgrHD;EACF;A+BvpHD;EAZE;IExWA,wBAAA;IjC+gIC;E+BtqHD;IE5WA,yBAAA;IF8WE,qBAAA;I/BwqHD;E+B1qHD;IAKI,iBAAA;I/BwqHH;EACF;A+B/pHD;EACE,2BAAA;EACA,uBAAA;E/BiqHD;A+BnqHD;EAKI,gBAAA;E/BiqHH;A+BhqHG;;EAEE,gBAAA;EACA,+BAAA;E/BkqHL;A+B3qHD;EAcI,gBAAA;E/BgqHH;A+B9qHD;EAmBM,gBAAA;E/B8pHL;A+B5pHK;;EAEE,gBAAA;EACA,+BAAA;E/B8pHP;A+B1pHK;;;EAGE,gBAAA;EACA,2BAAA;E/B4pHP;A+BxpHK;;;EAGE,gBAAA;EACA,+BAAA;E/B0pHP;A+BlsHD;EA8CI,uBAAA;E/BupHH;A+BtpHG;;EAEE,2BAAA;E/BwpHL;A+BzsHD;EAoDM,2BAAA;E/BwpHL;A+B5sHD;;EA0DI,uBAAA;E/BspHH;A+B/oHK;;;EAGE,2BAAA;EACA,gBAAA;E/BipHP;A+BhnHC;EAAA;IAzBQ,gBAAA;I/B6oHP;E+B5oHO;;IAEE,gBAAA;IACA,+BAAA;I/B8oHT;E+B1oHO;;;IAGE,gBAAA;IACA,2BAAA;I/B4oHT;E+BxoHO;;;IAGE,gBAAA;IACA,+BAAA;I/B0oHT;EACF;A+B5uHD;EA8GI,gBAAA;E/BioHH;A+BhoHG;EACE,gBAAA;E/BkoHL;A+BlvHD;EAqHI,gBAAA;E/BgoHH;A+B/nHG;;EAEE,gBAAA;E/BioHL;A+B7nHK;;;;EAEE,gBAAA;E/BioHP;A+BznHD;EACE,2BAAA;EACA,uBAAA;E/B2nHD;A+B7nHD;EAKI,gBAAA;E/B2nHH;A+B1nHG;;EAEE,gBAAA;EACA,+BAAA;E/B4nHL;A+BroHD;EAcI,gBAAA;E/B0nHH;A+BxoHD;EAmBM,gBAAA;E/BwnHL;A+BtnHK;;EAEE,gBAAA;EACA,+BAAA;E/BwnHP;A+BpnHK;;;EAGE,gBAAA;EACA,2BAAA;E/BsnHP;A+BlnHK;;;EAGE,gBAAA;EACA,+BAAA;E/BonHP;A+B5pHD;EA+CI,uBAAA;E/BgnHH;A+B/mHG;;EAEE,2BAAA;E/BinHL;A+BnqHD;EAqDM,2BAAA;E/BinHL;A+BtqHD;;EA2DI,uBAAA;E/B+mHH;A+BzmHK;;;EAGE,2BAAA;EACA,gBAAA;E/B2mHP;A+BpkHC;EAAA;IA/BQ,uBAAA;I/BumHP;E+BxkHD;IA5BQ,2BAAA;I/BumHP;E+B3kHD;IAzBQ,gBAAA;I/BumHP;E+BtmHO;;IAEE,gBAAA;IACA,+BAAA;I/BwmHT;E+BpmHO;;;IAGE,gBAAA;IACA,2BAAA;I/BsmHT;E+BlmHO;;;IAGE,gBAAA;IACA,+BAAA;I/BomHT;EACF;A+B5sHD;EA+GI,gBAAA;E/BgmHH;A+B/lHG;EACE,gBAAA;E/BimHL;A+BltHD;EAsHI,gBAAA;E/B+lHH;A+B9lHG;;EAEE,gBAAA;E/BgmHL;A+B5lHK;;;;EAEE,gBAAA;E/BgmHP;AkC1uID;EACE,mBAAA;EACA,qBAAA;EACA,kBAAA;EACA,2BAAA;EACA,oBAAA;ElC4uID;AkCjvID;EAQI,uBAAA;ElC4uIH;AkCpvID;EAWM,mBAAA;EACA,gBAAA;EACA,gBAAA;ElC4uIL;AkCzvID;EAkBI,gBAAA;ElC0uIH;AmC9vID;EACE,uBAAA;EACA,iBAAA;EACA,gBAAA;EACA,oBAAA;EnCgwID;AmCpwID;EAOI,iBAAA;EnCgwIH;AmCvwID;;EAUM,oBAAA;EACA,aAAA;EACA,mBAAA;EACA,yBAAA;EACA,uBAAA;EACA,gBAAA;EACA,2BAAA;EACA,2BAAA;EACA,mBAAA;EnCiwIL;AmC/vIG;;EAGI,gBAAA;EPXN,gCAAA;EACG,6BAAA;E5B4wIJ;AmC9vIG;;EPvBF,iCAAA;EACG,8BAAA;E5ByxIJ;AmCzvIG;;;;EAEE,gBAAA;EACA,2BAAA;EACA,uBAAA;EnC6vIL;AmCvvIG;;;;;;EAGE,YAAA;EACA,gBAAA;EACA,2BAAA;EACA,uBAAA;EACA,iBAAA;EnC4vIL;AmClzID;;;;;;EAiEM,gBAAA;EACA,2BAAA;EACA,uBAAA;EACA,qBAAA;EnCyvIL;AmChvID;;EC1EM,oBAAA;EACA,iBAAA;EpC8zIL;AoC5zIG;;ERMF,gCAAA;EACG,6BAAA;E5B0zIJ;AoC3zIG;;ERRF,iCAAA;EACG,8BAAA;E5Bu0IJ;AmC1vID;;EC/EM,mBAAA;EACA,iBAAA;EpC60IL;AoC30IG;;ERMF,gCAAA;EACG,6BAAA;E5By0IJ;AoC10IG;;ERRF,iCAAA;EACG,8BAAA;E5Bs1IJ;AqCz1ID;EACE,iBAAA;EACA,gBAAA;EACA,kBAAA;EACA,oBAAA;ErC21ID;AqC/1ID;EAOI,iBAAA;ErC21IH;AqCl2ID;;EAUM,uBAAA;EACA,mBAAA;EACA,2BAAA;EACA,2BAAA;EACA,qBAAA;ErC41IL;AqC12ID;;EAmBM,uBAAA;EACA,2BAAA;ErC21IL;AqC/2ID;;EA2BM,cAAA;ErCw1IL;AqCn3ID;;EAkCM,aAAA;ErCq1IL;AqCv3ID;;;;EA2CM,gBAAA;EACA,2BAAA;EACA,qBAAA;ErCk1IL;AsCh4ID;EACE,iBAAA;EACA,yBAAA;EACA,gBAAA;EACA,mBAAA;EACA,gBAAA;EACA,gBAAA;EACA,oBAAA;EACA,qBAAA;EACA,0BAAA;EACA,sBAAA;EtCk4ID;AsC93IG;;EAEE,gBAAA;EACA,uBAAA;EACA,iBAAA;EtCg4IL;AsC33IC;EACE,eAAA;EtC63IH;AsCz3IC;EACE,oBAAA;EACA,WAAA;EtC23IH;AsCp3ID;ECtCE,2BAAA;EvC65ID;AuC15IG;;EAEE,2BAAA;EvC45IL;AsCv3ID;EC1CE,2BAAA;EvCo6ID;AuCj6IG;;EAEE,2BAAA;EvCm6IL;AsC13ID;EC9CE,2BAAA;EvC26ID;AuCx6IG;;EAEE,2BAAA;EvC06IL;AsC73ID;EClDE,2BAAA;EvCk7ID;AuC/6IG;;EAEE,2BAAA;EvCi7IL;AsCh4ID;ECtDE,2BAAA;EvCy7ID;AuCt7IG;;EAEE,2BAAA;EvCw7IL;AsCn4ID;EC1DE,2BAAA;EvCg8ID;AuC77IG;;EAEE,2BAAA;EvC+7IL;AwCj8ID;EACE,uBAAA;EACA,iBAAA;EACA,kBAAA;EACA,iBAAA;EACA,mBAAA;EACA,gBAAA;EACA,gBAAA;EACA,0BAAA;EACA,qBAAA;EACA,oBAAA;EACA,2BAAA;EACA,qBAAA;ExCm8ID;AwCh8IC;EACE,eAAA;ExCk8IH;AwC97IC;EACE,oBAAA;EACA,WAAA;ExCg8IH;AwC97IC;EACE,QAAA;EACA,kBAAA;ExCg8IH;AwC37IG;;EAEE,gBAAA;EACA,uBAAA;EACA,iBAAA;ExC67IL;AwCx7IC;;EAEE,gBAAA;EACA,2BAAA;ExC07IH;AwCx7IC;EACE,cAAA;ExC07IH;AwCx7IC;EACE,mBAAA;ExC07IH;AwCx7IC;EACE,kBAAA;ExC07IH;AyC/+ID;EACE,oBAAA;EACA,qBAAA;EACA,gBAAA;EACA,2BAAA;EzCi/ID;AyCr/ID;;EAQI,gBAAA;EzCi/IH;AyCz/ID;EAWI,qBAAA;EACA,iBAAA;EACA,kBAAA;EzCi/IH;AyC9/ID;EAiBI,2BAAA;EzCg/IH;AyC7+IC;;EAEE,oBAAA;EzC++IH;AyCrgJD;EA0BI,iBAAA;EzC8+IH;AyC79ID;EAAA;IAbI,iBAAA;IzC8+ID;EyC5+IC;;IAEE,oBAAA;IACA,qBAAA;IzC8+IH;EyCt+IH;;IAHM,iBAAA;IzC6+IH;EACF;A0CrhJD;EACE,gBAAA;EACA,cAAA;EACA,qBAAA;EACA,yBAAA;EACA,2BAAA;EACA,2BAAA;EACA,oBAAA;ErCiLA,6CAAA;EACK,wCAAA;EACG,qCAAA;ELu2IT;A0CjiJD;;EAaI,mBAAA;EACA,oBAAA;E1CwhJH;A0CphJC;;;EAGE,uBAAA;E1CshJH;A0C3iJD;EA0BI,cAAA;EACA,gBAAA;E1CohJH;A2C7iJD;EACE,eAAA;EACA,qBAAA;EACA,+BAAA;EACA,oBAAA;E3C+iJD;A2CnjJD;EAQI,eAAA;EAEA,gBAAA;E3C6iJH;A2CvjJD;EAcI,mBAAA;E3C4iJH;A2C1jJD;;EAoBI,kBAAA;E3C0iJH;A2C9jJD;EAuBI,iBAAA;E3C0iJH;A2CliJD;;EAEE,qBAAA;E3CoiJD;A2CtiJD;;EAMI,oBAAA;EACA,WAAA;EACA,cAAA;EACA,gBAAA;E3CoiJH;A2C5hJD;ECrDE,2BAAA;EACA,uBAAA;EACA,gBAAA;E5ColJD;A2CjiJD;EChDI,2BAAA;E5ColJH;A2CpiJD;EC7CI,gBAAA;E5ColJH;A2CpiJD;ECxDE,2BAAA;EACA,uBAAA;EACA,gBAAA;E5C+lJD;A2CziJD;ECnDI,2BAAA;E5C+lJH;A2C5iJD;EChDI,gBAAA;E5C+lJH;A2C5iJD;EC3DE,2BAAA;EACA,uBAAA;EACA,gBAAA;E5C0mJD;A2CjjJD;ECtDI,2BAAA;E5C0mJH;A2CpjJD;ECnDI,gBAAA;E5C0mJH;A2CpjJD;EC9DE,2BAAA;EACA,uBAAA;EACA,gBAAA;E5CqnJD;A2CzjJD;ECzDI,2BAAA;E5CqnJH;A2C5jJD;ECtDI,gBAAA;E5CqnJH;A6CvnJD;EACE;IAAQ,6BAAA;I7C0nJP;E6CznJD;IAAQ,0BAAA;I7C4nJP;EACF;A6CznJD;EACE;IAAQ,6BAAA;I7C4nJP;E6C3nJD;IAAQ,0BAAA;I7C8nJP;EACF;A6CjoJD;EACE;IAAQ,6BAAA;I7C4nJP;E6C3nJD;IAAQ,0BAAA;I7C8nJP;EACF;A6CvnJD;EACE,kBAAA;EACA,cAAA;EACA,qBAAA;EACA,2BAAA;EACA,oBAAA;ExCsCA,wDAAA;EACQ,gDAAA;ELolJT;A6CtnJD;EACE,aAAA;EACA,WAAA;EACA,cAAA;EACA,iBAAA;EACA,mBAAA;EACA,gBAAA;EACA,oBAAA;EACA,2BAAA;ExCyBA,wDAAA;EACQ,gDAAA;EAyHR,qCAAA;EACK,gCAAA;EACG,6BAAA;ELw+IT;A6CnnJD;;ECCI,+MAAA;EACA,0MAAA;EACA,uMAAA;EDAF,oCAAA;UAAA,4BAAA;E7CunJD;A6ChnJD;;ExC5CE,4DAAA;EACK,uDAAA;EACG,oDAAA;ELgqJT;A6C7mJD;EErEE,2BAAA;E/CqrJD;A+ClrJC;EDgDE,+MAAA;EACA,0MAAA;EACA,uMAAA;E9CqoJH;A6CjnJD;EEzEE,2BAAA;E/C6rJD;A+C1rJC;EDgDE,+MAAA;EACA,0MAAA;EACA,uMAAA;E9C6oJH;A6CrnJD;EE7EE,2BAAA;E/CqsJD;A+ClsJC;EDgDE,+MAAA;EACA,0MAAA;EACA,uMAAA;E9CqpJH;A6CznJD;EEjFE,2BAAA;E/C6sJD;A+C1sJC;EDgDE,+MAAA;EACA,0MAAA;EACA,uMAAA;E9C6pJH;AgDrtJD;EAEE,kBAAA;EhDstJD;AgDptJC;EACE,eAAA;EhDstJH;AgDltJD;;EAEE,oBAAA;EhDotJD;AgDjtJD;;EAEE,qBAAA;EhDmtJD;AgDhtJD;;;EAGE,qBAAA;EACA,qBAAA;EhDktJD;AgD/sJD;EACE,wBAAA;EhDitJD;AgD9sJD;EACE,wBAAA;EhDgtJD;AgD5sJD;EACE,eAAA;EACA,oBAAA;EhD8sJD;AgDxsJD;EACE,iBAAA;EACA,kBAAA;EhD0sJD;AiD9uJD;EAEE,qBAAA;EACA,iBAAA;EjD+uJD;AiDvuJD;EACE,oBAAA;EACA,gBAAA;EACA,oBAAA;EAEA,qBAAA;EACA,2BAAA;EACA,2BAAA;EjDwuJD;AiDruJC;ErB3BA,8BAAA;EACC,6BAAA;E5BmwJF;AiDtuJC;EACE,kBAAA;ErBvBF,iCAAA;EACC,gCAAA;E5BgwJF;AiD/tJD;EACE,gBAAA;EjDiuJD;AiDluJD;EAII,gBAAA;EjDiuJH;AiD7tJC;;EAEE,uBAAA;EACA,gBAAA;EACA,2BAAA;EjD+tJH;AiDztJC;;;EAGE,2BAAA;EACA,gBAAA;EACA,qBAAA;EjD2tJH;AiDhuJC;;;EASI,gBAAA;EjD4tJL;AiDruJC;;;EAYI,gBAAA;EjD8tJL;AiDztJC;;;EAGE,YAAA;EACA,gBAAA;EACA,2BAAA;EACA,uBAAA;EjD2tJH;AiDjuJC;;;;;;;;;EAYI,gBAAA;EjDguJL;AiD5uJC;;;EAeI,gBAAA;EjDkuJL;AkD9zJC;EACE,gBAAA;EACA,2BAAA;ElDg0JH;AkD9zJG;EACE,gBAAA;ElDg0JL;AkDj0JG;EAII,gBAAA;ElDg0JP;AkD7zJK;;EAEE,gBAAA;EACA,2BAAA;ElD+zJP;AkD7zJK;;;EAGE,aAAA;EACA,2BAAA;EACA,uBAAA;ElD+zJP;AkDp1JC;EACE,gBAAA;EACA,2BAAA;ElDs1JH;AkDp1JG;EACE,gBAAA;ElDs1JL;AkDv1JG;EAII,gBAAA;ElDs1JP;AkDn1JK;;EAEE,gBAAA;EACA,2BAAA;ElDq1JP;AkDn1JK;;;EAGE,aAAA;EACA,2BAAA;EACA,uBAAA;ElDq1JP;AkD12JC;EACE,gBAAA;EACA,2BAAA;ElD42JH;AkD12JG;EACE,gBAAA;ElD42JL;AkD72JG;EAII,gBAAA;ElD42JP;AkDz2JK;;EAEE,gBAAA;EACA,2BAAA;ElD22JP;AkDz2JK;;;EAGE,aAAA;EACA,2BAAA;EACA,uBAAA;ElD22JP;AkDh4JC;EACE,gBAAA;EACA,2BAAA;ElDk4JH;AkDh4JG;EACE,gBAAA;ElDk4JL;AkDn4JG;EAII,gBAAA;ElDk4JP;AkD/3JK;;EAEE,gBAAA;EACA,2BAAA;ElDi4JP;AkD/3JK;;;EAGE,aAAA;EACA,2BAAA;EACA,uBAAA;ElDi4JP;AiDryJD;EACE,eAAA;EACA,oBAAA;EjDuyJD;AiDryJD;EACE,kBAAA;EACA,kBAAA;EjDuyJD;AmD35JD;EACE,qBAAA;EACA,2BAAA;EACA,+BAAA;EACA,oBAAA;E9C0DA,mDAAA;EACQ,2CAAA;ELo2JT;AmD15JD;EACE,eAAA;EnD45JD;AmDv5JD;EACE,oBAAA;EACA,sCAAA;EvBpBA,8BAAA;EACC,6BAAA;E5B86JF;AmD75JD;EAMI,gBAAA;EnD05JH;AmDr5JD;EACE,eAAA;EACA,kBAAA;EACA,iBAAA;EACA,gBAAA;EnDu5JD;AmD35JD;EAOI,gBAAA;EnDu5JH;AmDl5JD;EACE,oBAAA;EACA,2BAAA;EACA,+BAAA;EvBpCA,iCAAA;EACC,gCAAA;E5By7JF;AmD54JD;;EAGI,kBAAA;EnD64JH;AmDh5JD;;EAMM,qBAAA;EACA,kBAAA;EnD84JL;AmD14JG;;EAEI,eAAA;EvBnEN,8BAAA;EACC,6BAAA;E5Bg9JF;AmDz4JG;;EAEI,kBAAA;EvBlEN,iCAAA;EACC,gCAAA;E5B88JF;AmDt4JD;EAEI,qBAAA;EnDu4JH;AmDp4JD;EACE,qBAAA;EnDs4JD;AmD93JD;;;EAII,kBAAA;EnD+3JH;AmDn4JD;;;EAOM,oBAAA;EACA,qBAAA;EnDi4JL;AmDz4JD;;EvB/FE,8BAAA;EACC,6BAAA;E5B4+JF;AmD94JD;;;;EAmBQ,6BAAA;EACA,8BAAA;EnDi4JP;AmDr5JD;;;;;;;;EAwBU,6BAAA;EnDu4JT;AmD/5JD;;;;;;;;EA4BU,8BAAA;EnD64JT;AmDz6JD;;EvBvFE,iCAAA;EACC,gCAAA;E5BogKF;AmD96JD;;;;EAyCQ,gCAAA;EACA,iCAAA;EnD24JP;AmDr7JD;;;;;;;;EA8CU,gCAAA;EnDi5JT;AmD/7JD;;;;;;;;EAkDU,iCAAA;EnDu5JT;AmDz8JD;;;;EA2DI,+BAAA;EnDo5JH;AmD/8JD;;EA+DI,eAAA;EnDo5JH;AmDn9JD;;EAmEI,WAAA;EnDo5JH;AmDv9JD;;;;;;;;;;;;EA0EU,gBAAA;EnD25JT;AmDr+JD;;;;;;;;;;;;EA8EU,iBAAA;EnDq6JT;AmDn/JD;;;;;;;;EAuFU,kBAAA;EnDs6JT;AmD7/JD;;;;;;;;EAgGU,kBAAA;EnDu6JT;AmDvgKD;EAsGI,WAAA;EACA,kBAAA;EnDo6JH;AmD15JD;EACE,qBAAA;EnD45JD;AmD75JD;EAKI,kBAAA;EACA,oBAAA;EnD25JH;AmDj6JD;EASM,iBAAA;EnD25JL;AmDp6JD;EAcI,kBAAA;EnDy5JH;AmDv6JD;;EAkBM,+BAAA;EnDy5JL;AmD36JD;EAuBI,eAAA;EnDu5JH;AmD96JD;EAyBM,kCAAA;EnDw5JL;AmDj5JD;EChPE,uBAAA;EpDooKD;AoDloKC;EACE,gBAAA;EACA,2BAAA;EACA,uBAAA;EpDooKH;AoDvoKC;EAMI,2BAAA;EpDooKL;AoD1oKC;EASI,gBAAA;EACA,2BAAA;EpDooKL;AoDjoKC;EAEI,8BAAA;EpDkoKL;AmDh6JD;ECnPE,uBAAA;EpDspKD;AoDppKC;EACE,gBAAA;EACA,2BAAA;EACA,uBAAA;EpDspKH;AoDzpKC;EAMI,2BAAA;EpDspKL;AoD5pKC;EASI,gBAAA;EACA,2BAAA;EpDspKL;AoDnpKC;EAEI,8BAAA;EpDopKL;AmD/6JD;ECtPE,uBAAA;EpDwqKD;AoDtqKC;EACE,gBAAA;EACA,2BAAA;EACA,uBAAA;EpDwqKH;AoD3qKC;EAMI,2BAAA;EpDwqKL;AoD9qKC;EASI,gBAAA;EACA,2BAAA;EpDwqKL;AoDrqKC;EAEI,8BAAA;EpDsqKL;AmD97JD;ECzPE,uBAAA;EpD0rKD;AoDxrKC;EACE,gBAAA;EACA,2BAAA;EACA,uBAAA;EpD0rKH;AoD7rKC;EAMI,2BAAA;EpD0rKL;AoDhsKC;EASI,gBAAA;EACA,2BAAA;EpD0rKL;AoDvrKC;EAEI,8BAAA;EpDwrKL;AmD78JD;EC5PE,uBAAA;EpD4sKD;AoD1sKC;EACE,gBAAA;EACA,2BAAA;EACA,uBAAA;EpD4sKH;AoD/sKC;EAMI,2BAAA;EpD4sKL;AoDltKC;EASI,gBAAA;EACA,2BAAA;EpD4sKL;AoDzsKC;EAEI,8BAAA;EpD0sKL;AmD59JD;EC/PE,uBAAA;EpD8tKD;AoD5tKC;EACE,gBAAA;EACA,2BAAA;EACA,uBAAA;EpD8tKH;AoDjuKC;EAMI,2BAAA;EpD8tKL;AoDpuKC;EASI,gBAAA;EACA,2BAAA;EpD8tKL;AoD3tKC;EAEI,8BAAA;EpD4tKL;AqD5uKD;EACE,oBAAA;EACA,gBAAA;EACA,WAAA;EACA,YAAA;EACA,kBAAA;ErD8uKD;AqDnvKD;;;;;EAYI,oBAAA;EACA,QAAA;EACA,SAAA;EACA,WAAA;EACA,cAAA;EACA,aAAA;EACA,WAAA;ErD8uKH;AqD1uKC;EACE,wBAAA;ErD4uKH;AqDxuKC;EACE,qBAAA;ErD0uKH;AsDpwKD;EACE,kBAAA;EACA,eAAA;EACA,qBAAA;EACA,2BAAA;EACA,2BAAA;EACA,oBAAA;EjDwDA,yDAAA;EACQ,iDAAA;EL+sKT;AsD9wKD;EASI,oBAAA;EACA,mCAAA;EtDwwKH;AsDnwKD;EACE,eAAA;EACA,oBAAA;EtDqwKD;AsDnwKD;EACE,cAAA;EACA,oBAAA;EtDqwKD;AuD3xKD;EACE,cAAA;EACA,iBAAA;EACA,mBAAA;EACA,gBAAA;EACA,gBAAA;EACA,8BAAA;EjCRA,cAAA;EAGA,2BAAA;EtBoyKD;AuD5xKC;;EAEE,gBAAA;EACA,uBAAA;EACA,iBAAA;EjCfF,cAAA;EAGA,2BAAA;EtB4yKD;AuDzxKC;EACE,YAAA;EACA,iBAAA;EACA,yBAAA;EACA,WAAA;EACA,0BAAA;EvD2xKH;AwD/yKD;EACE,kBAAA;ExDizKD;AwD7yKD;EACE,eAAA;EACA,kBAAA;EACA,iBAAA;EACA,QAAA;EACA,UAAA;EACA,WAAA;EACA,SAAA;EACA,eAAA;EACA,mCAAA;EAIA,YAAA;ExD4yKD;AwDzyKC;EnD+GA,uCAAA;EACI,mCAAA;EACC,kCAAA;EACG,+BAAA;EAkER,qDAAA;EAEK,2CAAA;EACG,qCAAA;EL4nKT;AwD/yKC;EnD2GA,oCAAA;EACI,gCAAA;EACC,+BAAA;EACG,4BAAA;ELusKT;AwDnzKD;EACE,oBAAA;EACA,kBAAA;ExDqzKD;AwDjzKD;EACE,oBAAA;EACA,aAAA;EACA,cAAA;ExDmzKD;AwD/yKD;EACE,oBAAA;EACA,2BAAA;EACA,2BAAA;EACA,sCAAA;EACA,oBAAA;EnDaA,kDAAA;EACQ,0CAAA;EmDZR,sCAAA;UAAA,8BAAA;EAEA,YAAA;ExDizKD;AwD7yKD;EACE,oBAAA;EACA,QAAA;EACA,UAAA;EACA,SAAA;EACA,2BAAA;ExD+yKD;AwD7yKC;ElCnEA,YAAA;EAGA,0BAAA;EtBi3KD;AwDhzKC;ElCpEA,cAAA;EAGA,2BAAA;EtBq3KD;AwD/yKD;EACE,eAAA;EACA,kCAAA;EACA,2BAAA;ExDizKD;AwD9yKD;EACE,kBAAA;ExDgzKD;AwD5yKD;EACE,WAAA;EACA,yBAAA;ExD8yKD;AwDzyKD;EACE,oBAAA;EACA,eAAA;ExD2yKD;AwDvyKD;EACE,eAAA;EACA,mBAAA;EACA,+BAAA;ExDyyKD;AwD5yKD;EAQI,kBAAA;EACA,kBAAA;ExDuyKH;AwDhzKD;EAaI,mBAAA;ExDsyKH;AwDnzKD;EAiBI,gBAAA;ExDqyKH;AwDhyKD;EACE,oBAAA;EACA,cAAA;EACA,aAAA;EACA,cAAA;EACA,kBAAA;ExDkyKD;AwDhxKD;EAZE;IACE,cAAA;IACA,mBAAA;IxD+xKD;EwD7xKD;InDrEA,mDAAA;IACQ,2CAAA;ILq2KP;EwD5xKD;IAAY,cAAA;IxD+xKX;EACF;AwD1xKD;EAFE;IAAY,cAAA;IxDgyKX;EACF;AyD76KD;EACE,oBAAA;EACA,eAAA;EACA,gBAAA;EACA,qBAAA;EAEA,6DAAA;EACA,iBAAA;EACA,qBAAA;EACA,kBAAA;EnCZA,YAAA;EAGA,0BAAA;EtBy7KD;AyD76KC;EnCfA,cAAA;EAGA,2BAAA;EtB67KD;AyDh7KC;EAAW,kBAAA;EAAmB,gBAAA;EzDo7K/B;AyDn7KC;EAAW,kBAAA;EAAmB,gBAAA;EzDu7K/B;AyDt7KC;EAAW,iBAAA;EAAmB,gBAAA;EzD07K/B;AyDz7KC;EAAW,mBAAA;EAAmB,gBAAA;EzD67K/B;AyDz7KD;EACE,kBAAA;EACA,kBAAA;EACA,gBAAA;EACA,oBAAA;EACA,uBAAA;EACA,2BAAA;EACA,oBAAA;EzD27KD;AyDv7KD;EACE,oBAAA;EACA,UAAA;EACA,WAAA;EACA,2BAAA;EACA,qBAAA;EzDy7KD;AyDr7KC;EACE,WAAA;EACA,WAAA;EACA,mBAAA;EACA,yBAAA;EACA,2BAAA;EzDu7KH;AyDr7KC;EACE,WAAA;EACA,YAAA;EACA,qBAAA;EACA,yBAAA;EACA,2BAAA;EzDu7KH;AyDr7KC;EACE,WAAA;EACA,WAAA;EACA,qBAAA;EACA,yBAAA;EACA,2BAAA;EzDu7KH;AyDr7KC;EACE,UAAA;EACA,SAAA;EACA,kBAAA;EACA,6BAAA;EACA,6BAAA;EzDu7KH;AyDr7KC;EACE,UAAA;EACA,UAAA;EACA,kBAAA;EACA,6BAAA;EACA,4BAAA;EzDu7KH;AyDr7KC;EACE,QAAA;EACA,WAAA;EACA,mBAAA;EACA,yBAAA;EACA,8BAAA;EzDu7KH;AyDr7KC;EACE,QAAA;EACA,YAAA;EACA,kBAAA;EACA,yBAAA;EACA,8BAAA;EzDu7KH;AyDr7KC;EACE,QAAA;EACA,WAAA;EACA,kBAAA;EACA,yBAAA;EACA,8BAAA;EzDu7KH;A0DthLD;EACE,oBAAA;EACA,QAAA;EACA,SAAA;EACA,eAAA;EACA,eAAA;EACA,kBAAA;EACA,cAAA;EAEA,6DAAA;EACA,iBAAA;EACA,qBAAA;EACA,yBAAA;EACA,kBAAA;EACA,2BAAA;EACA,sCAAA;UAAA,8BAAA;EACA,2BAAA;EACA,sCAAA;EACA,oBAAA;ErD6CA,mDAAA;EACQ,2CAAA;EqD1CR,qBAAA;E1DshLD;A0DnhLC;EAAY,mBAAA;E1DshLb;A0DrhLC;EAAY,mBAAA;E1DwhLb;A0DvhLC;EAAY,kBAAA;E1D0hLb;A0DzhLC;EAAY,oBAAA;E1D4hLb;A0DzhLD;EACE,WAAA;EACA,mBAAA;EACA,iBAAA;EACA,2BAAA;EACA,kCAAA;EACA,4BAAA;E1D2hLD;A0DxhLD;EACE,mBAAA;E1D0hLD;A0DlhLC;;EAEE,oBAAA;EACA,gBAAA;EACA,UAAA;EACA,WAAA;EACA,2BAAA;EACA,qBAAA;E1DohLH;A0DjhLD;EACE,oBAAA;E1DmhLD;A0DjhLD;EACE,oBAAA;EACA,aAAA;E1DmhLD;A0D/gLC;EACE,WAAA;EACA,oBAAA;EACA,wBAAA;EACA,2BAAA;EACA,uCAAA;EACA,eAAA;E1DihLH;A0DhhLG;EACE,cAAA;EACA,aAAA;EACA,oBAAA;EACA,wBAAA;EACA,2BAAA;E1DkhLL;A0D/gLC;EACE,UAAA;EACA,aAAA;EACA,mBAAA;EACA,sBAAA;EACA,6BAAA;EACA,yCAAA;E1DihLH;A0DhhLG;EACE,cAAA;EACA,WAAA;EACA,eAAA;EACA,sBAAA;EACA,6BAAA;E1DkhLL;A0D/gLC;EACE,WAAA;EACA,oBAAA;EACA,qBAAA;EACA,8BAAA;EACA,0CAAA;EACA,YAAA;E1DihLH;A0DhhLG;EACE,cAAA;EACA,UAAA;EACA,oBAAA;EACA,qBAAA;EACA,8BAAA;E1DkhLL;A0D9gLC;EACE,UAAA;EACA,cAAA;EACA,mBAAA;EACA,uBAAA;EACA,4BAAA;EACA,wCAAA;E1DghLH;A0D/gLG;EACE,cAAA;EACA,YAAA;EACA,uBAAA;EACA,4BAAA;EACA,eAAA;E1DihLL;A2D9oLD;EACE,oBAAA;E3DgpLD;A2D7oLD;EACE,oBAAA;EACA,kBAAA;EACA,aAAA;E3D+oLD;A2DlpLD;EAMI,eAAA;EACA,oBAAA;EtD6KF,2CAAA;EACK,sCAAA;EACG,mCAAA;ELm+KT;A2DzpLD;;EAcM,gBAAA;E3D+oLL;A2DrnLC;EAAA;IArBI,wDAAA;SAAA,8CAAA;YAAA,wCAAA;IACA,qCAAA;YAAA,6BAAA;IACA,2BAAA;YAAA,mBAAA;I3D8oLH;E2D5oLG;;IAEE,4CAAA;YAAA,oCAAA;IACA,SAAA;I3D8oLL;E2D5oLG;;IAEE,6CAAA;YAAA,qCAAA;IACA,SAAA;I3D8oLL;E2D5oLG;;;IAGE,yCAAA;YAAA,iCAAA;IACA,SAAA;I3D8oLL;EACF;A2DprLD;;;EA6CI,gBAAA;E3D4oLH;A2DzrLD;EAiDI,SAAA;E3D2oLH;A2D5rLD;;EAsDI,oBAAA;EACA,QAAA;EACA,aAAA;E3D0oLH;A2DlsLD;EA4DI,YAAA;E3DyoLH;A2DrsLD;EA+DI,aAAA;E3DyoLH;A2DxsLD;;EAmEI,SAAA;E3DyoLH;A2D5sLD;EAuEI,aAAA;E3DwoLH;A2D/sLD;EA0EI,YAAA;E3DwoLH;A2DhoLD;EACE,oBAAA;EACA,QAAA;EACA,SAAA;EACA,WAAA;EACA,YAAA;ErC9FA,cAAA;EAGA,2BAAA;EqC6FA,iBAAA;EACA,gBAAA;EACA,oBAAA;EACA,2CAAA;E3DmoLD;A2D9nLC;EblGE,oGAAA;EACA,+FAAA;EACA,sHAAA;EAAA,gGAAA;EACA,6BAAA;EACA,wHAAA;E9CmuLH;A2DloLC;EACE,YAAA;EACA,UAAA;EbvGA,oGAAA;EACA,+FAAA;EACA,sHAAA;EAAA,gGAAA;EACA,6BAAA;EACA,wHAAA;E9C4uLH;A2DpoLC;;EAEE,YAAA;EACA,gBAAA;EACA,uBAAA;ErCtHF,cAAA;EAGA,2BAAA;EtB2vLD;A2DrqLD;;;;EAsCI,oBAAA;EACA,UAAA;EACA,YAAA;EACA,uBAAA;E3DqoLH;A2D9qLD;;EA6CI,WAAA;EACA,oBAAA;E3DqoLH;A2DnrLD;;EAkDI,YAAA;EACA,qBAAA;E3DqoLH;A2DxrLD;;EAuDI,aAAA;EACA,cAAA;EACA,mBAAA;EACA,oBAAA;E3DqoLH;A2DhoLG;EACE,kBAAA;E3DkoLL;A2D9nLG;EACE,kBAAA;E3DgoLL;A2DtnLD;EACE,oBAAA;EACA,cAAA;EACA,WAAA;EACA,aAAA;EACA,YAAA;EACA,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,oBAAA;E3DwnLD;A2DjoLD;EAYI,uBAAA;EACA,aAAA;EACA,cAAA;EACA,aAAA;EACA,qBAAA;EACA,2BAAA;EACA,qBAAA;EACA,iBAAA;EAUA,2BAAA;EACA,oCAAA;E3D+mLH;A2D7oLD;EAiCI,WAAA;EACA,aAAA;EACA,cAAA;EACA,2BAAA;E3D+mLH;A2DxmLD;EACE,oBAAA;EACA,WAAA;EACA,YAAA;EACA,cAAA;EACA,aAAA;EACA,mBAAA;EACA,sBAAA;EACA,gBAAA;EACA,oBAAA;EACA,2CAAA;E3D0mLD;A2DzmLC;EACE,mBAAA;E3D2mLH;A2DlkLD;EAhCE;;;;IAKI,aAAA;IACA,cAAA;IACA,mBAAA;IACA,iBAAA;I3DomLH;E2D5mLD;;IAYI,oBAAA;I3DomLH;E2DhnLD;;IAgBI,qBAAA;I3DomLH;E2D/lLD;IACE,WAAA;IACA,YAAA;IACA,sBAAA;I3DimLD;E2D7lLD;IACE,cAAA;I3D+lLD;EACF;A4D31LC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE,cAAA;EACA,gBAAA;E5Dy3LH;A4Dv3LC;;;;;;;;;;;;;;;EACE,aAAA;E5Du4LH;AiC/4LD;E4BRE,gBAAA;EACA,mBAAA;EACA,oBAAA;E7D05LD;AiCj5LD;EACE,yBAAA;EjCm5LD;AiCj5LD;EACE,wBAAA;EjCm5LD;AiC34LD;EACE,0BAAA;EjC64LD;AiC34LD;EACE,2BAAA;EjC64LD;AiC34LD;EACE,oBAAA;EjC64LD;AiC34LD;E6BzBE,aAAA;EACA,oBAAA;EACA,mBAAA;EACA,+BAAA;EACA,WAAA;E9Du6LD;AiCz4LD;EACE,0BAAA;EACA,+BAAA;EjC24LD;AiCp4LD;EACE,iBAAA;EjCs4LD;A+Dx6LD;EACE,qBAAA;E/D06LD;A+Dp6LD;;;;ECdE,0BAAA;EhEw7LD;A+Dn6LD;;;;;;;;;;;;EAYE,0BAAA;E/Dq6LD;A+D95LD;EAAA;IChDE,2BAAA;IhEk9LC;EgEj9LD;IAAU,gBAAA;IhEo9LT;EgEn9LD;IAAU,+BAAA;IhEs9LT;EgEr9LD;;IACU,gCAAA;IhEw9LT;EACF;A+Dx6LD;EAAA;IAFI,2BAAA;I/D86LD;EACF;A+Dx6LD;EAAA;IAFI,4BAAA;I/D86LD;EACF;A+Dx6LD;EAAA;IAFI,kCAAA;I/D86LD;EACF;A+Dv6LD;EAAA;ICrEE,2BAAA;IhEg/LC;EgE/+LD;IAAU,gBAAA;IhEk/LT;EgEj/LD;IAAU,+BAAA;IhEo/LT;EgEn/LD;;IACU,gCAAA;IhEs/LT;EACF;A+Dj7LD;EAAA;IAFI,2BAAA;I/Du7LD;EACF;A+Dj7LD;EAAA;IAFI,4BAAA;I/Du7LD;EACF;A+Dj7LD;EAAA;IAFI,kCAAA;I/Du7LD;EACF;A+Dh7LD;EAAA;IC1FE,2BAAA;IhE8gMC;EgE7gMD;IAAU,gBAAA;IhEghMT;EgE/gMD;IAAU,+BAAA;IhEkhMT;EgEjhMD;;IACU,gCAAA;IhEohMT;EACF;A+D17LD;EAAA;IAFI,2BAAA;I/Dg8LD;EACF;A+D17LD;EAAA;IAFI,4BAAA;I/Dg8LD;EACF;A+D17LD;EAAA;IAFI,kCAAA;I/Dg8LD;EACF;A+Dz7LD;EAAA;IC/GE,2BAAA;IhE4iMC;EgE3iMD;IAAU,gBAAA;IhE8iMT;EgE7iMD;IAAU,+BAAA;IhEgjMT;EgE/iMD;;IACU,gCAAA;IhEkjMT;EACF;A+Dn8LD;EAAA;IAFI,2BAAA;I/Dy8LD;EACF;A+Dn8LD;EAAA;IAFI,4BAAA;I/Dy8LD;EACF;A+Dn8LD;EAAA;IAFI,kCAAA;I/Dy8LD;EACF;A+Dl8LD;EAAA;IC5HE,0BAAA;IhEkkMC;EACF;A+Dl8LD;EAAA;ICjIE,0BAAA;IhEukMC;EACF;A+Dl8LD;EAAA;ICtIE,0BAAA;IhE4kMC;EACF;A+Dl8LD;EAAA;IC3IE,0BAAA;IhEilMC;EACF;A+D/7LD;ECnJE,0BAAA;EhEqlMD;A+D57LD;EAAA;ICjKE,2BAAA;IhEimMC;EgEhmMD;IAAU,gBAAA;IhEmmMT;EgElmMD;IAAU,+BAAA;IhEqmMT;EgEpmMD;;IACU,gCAAA;IhEumMT;EACF;A+D18LD;EACE,0BAAA;E/D48LD;A+Dv8LD;EAAA;IAFI,2BAAA;I/D68LD;EACF;A+D38LD;EACE,0BAAA;E/D68LD;A+Dx8LD;EAAA;IAFI,4BAAA;I/D88LD;EACF;A+D58LD;EACE,0BAAA;E/D88LD;A+Dz8LD;EAAA;IAFI,kCAAA;I/D+8LD;EACF;A+Dx8LD;EAAA;ICpLE,0BAAA;IhEgoMC;EACF","file":"bootstrap.css","sourcesContent":["/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: 1px dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n -moz-box-sizing: content-box;\n -webkit-box-sizing: content-box;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important;\n box-shadow: none !important;\n text-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n select {\n background: #fff !important;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('../fonts/glyphicons-halflings-regular.eot');\n src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\2a\";\n}\n.glyphicon-plus:before {\n content: \"\\2b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #ffffff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n background-color: #fcf8e3;\n padding: .2em;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777777;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: '\\00A0 \\2014';\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #ffffff;\n background-color: #333333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n word-break: break-all;\n word-wrap: break-word;\n color: #333333;\n background-color: #f5f5f5;\n border: 1px solid #cccccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n.row {\n margin-left: -15px;\n margin-right: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #dddddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #dddddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #dddddd;\n}\n.table .table {\n background-color: #ffffff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #dddddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #dddddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-child(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #dddddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n min-width: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #ffffff;\n background-image: none;\n border: 1px solid #cccccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999999;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n background-color: #eeeeee;\n opacity: 1;\n}\ntextarea.form-control {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"],\n input[type=\"time\"],\n input[type=\"datetime-local\"],\n input[type=\"month\"] {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.form-control-static {\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-left: 0;\n padding-right: 0;\n}\n.input-sm,\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm,\nselect.form-group-sm .form-control {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\ntextarea.form-group-sm .form-control,\nselect[multiple].input-sm,\nselect[multiple].form-group-sm .form-control {\n height: auto;\n}\n.input-lg,\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.33;\n border-radius: 6px;\n}\nselect.input-lg,\nselect.form-group-lg .form-control {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\ntextarea.form-group-lg .form-control,\nselect[multiple].input-lg,\nselect[multiple].form-group-lg .form-control {\n height: auto;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n border-color: #3c763d;\n background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n border-color: #8a6d3b;\n background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n border-color: #a94442;\n background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-left: -15px;\n margin-right: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: 7px;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 14.3px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n white-space: nowrap;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n outline: 0;\n background-image: none;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n pointer-events: none;\n opacity: 0.65;\n filter: alpha(opacity=65);\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default {\n color: #333333;\n background-color: #ffffff;\n border-color: #cccccc;\n}\n.btn-default:hover,\n.btn-default:focus,\n.btn-default.focus,\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n background-image: none;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #ffffff;\n border-color: #cccccc;\n}\n.btn-default .badge {\n color: #ffffff;\n background-color: #333333;\n}\n.btn-primary {\n color: #ffffff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary.focus,\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #ffffff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n background-image: none;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #ffffff;\n}\n.btn-success {\n color: #ffffff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:hover,\n.btn-success:focus,\n.btn-success.focus,\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #ffffff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n background-image: none;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #ffffff;\n}\n.btn-info {\n color: #ffffff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:hover,\n.btn-info:focus,\n.btn-info.focus,\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #ffffff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n background-image: none;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #ffffff;\n}\n.btn-warning {\n color: #ffffff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning.focus,\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #ffffff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n background-image: none;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #ffffff;\n}\n.btn-danger {\n color: #ffffff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger.focus,\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #ffffff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n background-image: none;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #ffffff;\n}\n.btn-link {\n color: #337ab7;\n font-weight: normal;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.33;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n visibility: hidden;\n}\n.collapse.in {\n display: block;\n visibility: visible;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px solid;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n list-style: none;\n font-size: 14px;\n text-align: left;\n background-color: #ffffff;\n border: 1px solid #cccccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n text-decoration: none;\n color: #262626;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #ffffff;\n text-decoration: none;\n outline: 0;\n background-color: #337ab7;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n cursor: not-allowed;\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n left: auto;\n right: 0;\n}\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n border-top: 0;\n border-bottom: 4px solid;\n content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 1px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n left: auto;\n right: 0;\n }\n .navbar-right .dropdown-menu-left {\n left: 0;\n right: auto;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child > .btn:last-child,\n.btn-group > .btn-group:first-child > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child > .btn:first-child {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-bottom-left-radius: 4px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.33;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #cccccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n margin-left: -1px;\n}\n.nav {\n margin-bottom: 0;\n padding-left: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #dddddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #dddddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-bottom-color: transparent;\n cursor: default;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #dddddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #dddddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #ffffff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #ffffff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #dddddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #dddddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #ffffff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n visibility: hidden;\n}\n.tab-content > .active {\n display: block;\n visibility: visible;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n overflow-x: visible;\n padding-right: 15px;\n padding-left: 15px;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n visibility: visible !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-left: 0;\n padding-right: 0;\n }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.navbar-brand {\n float: left;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n height: 50px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: 15px;\n padding: 9px 10px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n margin-left: -15px;\n margin-right: -15px;\n padding: 10px 15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-left: 15px;\n margin-right: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #cccccc;\n background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n border-color: #dddddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #dddddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n background-color: #e7e7e7;\n color: #555555;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #cccccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-link {\n color: #777777;\n}\n.navbar-default .navbar-link:hover {\n color: #333333;\n}\n.navbar-default .btn-link {\n color: #777777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #cccccc;\n}\n.navbar-inverse {\n background-color: #222222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #ffffff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #ffffff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #ffffff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #ffffff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n background-color: #080808;\n color: #ffffff;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #ffffff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #ffffff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #ffffff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #ffffff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n content: \"/\\00a0\";\n padding: 0 5px;\n color: #cccccc;\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n line-height: 1.42857143;\n text-decoration: none;\n color: #337ab7;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-bottom-left-radius: 4px;\n border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-bottom-right-radius: 4px;\n border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n color: #23527c;\n background-color: #eeeeee;\n border-color: #dddddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 2;\n color: #ffffff;\n background-color: #337ab7;\n border-color: #337ab7;\n cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n background-color: #ffffff;\n border-color: #dddddd;\n cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-bottom-left-radius: 6px;\n border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-bottom-right-radius: 6px;\n border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-bottom-left-radius: 3px;\n border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-bottom-right-radius: 3px;\n border-top-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n list-style: none;\n text-align: center;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n background-color: #ffffff;\n cursor: not-allowed;\n}\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #ffffff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n color: #ffffff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n color: #ffffff;\n line-height: 1;\n vertical-align: baseline;\n white-space: nowrap;\n text-align: center;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #ffffff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #ffffff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding: 30px 15px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n border-radius: 6px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding: 48px 0;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-left: 60px;\n padding-right: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-left: auto;\n margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n background-color: #dff0d8;\n border-color: #d6e9c6;\n color: #3c763d;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n background-color: #d9edf7;\n border-color: #bce8f1;\n color: #31708f;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n background-color: #fcf8e3;\n border-color: #faebcc;\n color: #8a6d3b;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n background-color: #f2dede;\n border-color: #ebccd1;\n color: #a94442;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n overflow: hidden;\n height: 20px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #ffffff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n margin-bottom: 20px;\n padding-left: 0;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n}\n.list-group-item:first-child {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\na.list-group-item {\n color: #555555;\n}\na.list-group-item .list-group-item-heading {\n color: #333333;\n}\na.list-group-item:hover,\na.list-group-item:focus {\n text-decoration: none;\n color: #555555;\n background-color: #f5f5f5;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n background-color: #eeeeee;\n color: #777777;\n cursor: not-allowed;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #ffffff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\na.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\na.list-group-item-success.active:hover,\na.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\na.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\na.list-group-item-info.active:hover,\na.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\na.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\na.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #ffffff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #dddddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-left: 15px;\n padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-left-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #dddddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n border: 0;\n margin-bottom: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #dddddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #dddddd;\n}\n.panel-default {\n border-color: #dddddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #dddddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #dddddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #dddddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #ffffff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #ffffff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n}\n.embed-responsive.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000000;\n text-shadow: 0 1px 0 #ffffff;\n opacity: 0.2;\n filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n color: #000000;\n text-decoration: none;\n cursor: pointer;\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #ffffff;\n border: 1px solid #999999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n background-clip: padding-box;\n outline: 0;\n}\n.modal-backdrop {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n background-color: #000000;\n}\n.modal-backdrop.fade {\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n min-height: 16.42857143px;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n visibility: visible;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 12px;\n font-weight: normal;\n line-height: 1.4;\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.tooltip.in {\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.tooltip.top {\n margin-top: -3px;\n padding: 5px 0;\n}\n.tooltip.right {\n margin-left: 3px;\n padding: 0 5px;\n}\n.tooltip.bottom {\n margin-top: 3px;\n padding: 5px 0;\n}\n.tooltip.left {\n margin-left: -3px;\n padding: 0 5px;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #ffffff;\n text-align: center;\n text-decoration: none;\n background-color: #000000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000000;\n}\n.tooltip.top-left .tooltip-arrow {\n bottom: 0;\n right: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000000;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n font-weight: normal;\n line-height: 1.42857143;\n text-align: left;\n background-color: #ffffff;\n background-clip: padding-box;\n border: 1px solid #cccccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n white-space: normal;\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover-title {\n margin: 0;\n padding: 8px 14px;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow:after {\n border-width: 10px;\n content: \"\";\n}\n.popover.top > .arrow {\n left: 50%;\n margin-left: -11px;\n border-bottom-width: 0;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n bottom: -11px;\n}\n.popover.top > .arrow:after {\n content: \" \";\n bottom: 1px;\n margin-left: -10px;\n border-bottom-width: 0;\n border-top-color: #ffffff;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-left-width: 0;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n content: \" \";\n left: 1px;\n bottom: -10px;\n border-left-width: 0;\n border-right-color: #ffffff;\n}\n.popover.bottom > .arrow {\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n top: -11px;\n}\n.popover.bottom > .arrow:after {\n content: \" \";\n top: 1px;\n margin-left: -10px;\n border-top-width: 0;\n border-bottom-color: #ffffff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: #ffffff;\n bottom: -10px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n}\n.carousel-inner > .item {\n display: none;\n position: relative;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n transition: transform 0.6s ease-in-out;\n backface-visibility: hidden;\n perspective: 1000;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: 15%;\n opacity: 0.5;\n filter: alpha(opacity=50);\n font-size: 20px;\n color: #ffffff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n left: auto;\n right: 0;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n outline: 0;\n color: #ffffff;\n text-decoration: none;\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n z-index: 5;\n display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n margin-top: -10px;\n font-family: serif;\n}\n.carousel-control .icon-prev:before {\n content: '\\2039';\n}\n.carousel-control .icon-next:before {\n content: '\\203a';\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid #ffffff;\n border-radius: 10px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: #ffffff;\n}\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #ffffff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -15px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -15px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -15px;\n }\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-footer:before,\n.modal-footer:after {\n content: \" \";\n display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n visibility: hidden !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS text size adjust after orientation change, without disabling\n// user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability when focused and also mouse hovered in all browsers.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome\n// (include `-moz` to future-proof).\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n -moz-box-sizing: content-box;\n -webkit-box-sizing: content-box; // 2\n box-sizing: content-box;\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n box-shadow: none !important;\n text-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n //\n // Chrome (OSX) fix for https://github.com/twbs/bootstrap/issues/11245\n // Once fixed, we can just straight up remove this.\n select {\n background: #fff !important;\n }\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n // Bootstrap specific changes end\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// Star \n\n// Import the fonts\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('@{icon-font-path}@{icon-font-name}.eot');\n src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\2a\"; } }\n.glyphicon-plus { &:before { content: \"\\2b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // See https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // Default\n outline: thin dotted;\n // WebKit\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n background-color: @state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @grid-float-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n margin-right: auto;\n margin-left: auto;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: (@gutter / -2);\n margin-right: (@gutter / -2);\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n}\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-child(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * 0.75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\n// Set the height of file controls to match text inputs\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &[disabled],\n &[readonly],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n background-color: @input-bg-disabled;\n opacity: 1; // iOS fix for unreadable disabled content\n }\n\n // Reset height for `textarea`s\n textarea& {\n height: auto;\n }\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n\n\n// Special styles for iOS temporal inputs\n//\n// In Mobile Safari, setting `display: block` on temporal inputs causes the\n// text within the input to become vertically misaligned. As a workaround, we\n// set a pixel line-height that matches the given height of the input, but only\n// for Safari.\n\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"],\n input[type=\"time\"],\n input[type=\"datetime-local\"],\n input[type=\"month\"] {\n line-height: @input-height-base;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm {\n line-height: @input-height-small;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg {\n line-height: @input-height-large;\n }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n margin-bottom: 15px;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n\n label {\n min-height: @line-height-computed; // Ensure the input doesn't jump when there is no text\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n// Some special care is needed because s don't inherit their parent's `cursor`.\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n &[disabled],\n &.disabled,\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n}\n// These classes are used directly on s\n.radio-inline,\n.checkbox-inline {\n &.disabled,\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n}\n// These classes are used on elements with descendants\n.radio,\n.checkbox {\n &.disabled,\n fieldset[disabled] & {\n label {\n cursor: @cursor-disabled;\n }\n }\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n // Size it appropriately next to real form controls\n padding-top: (@padding-base-vertical + 1);\n padding-bottom: (@padding-base-vertical + 1);\n // Remove default margin from `p`\n margin-bottom: 0;\n\n &.input-lg,\n &.input-sm {\n padding-left: 0;\n padding-right: 0;\n }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n\n.input-sm,\n.form-group-sm .form-control {\n .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @input-border-radius-small);\n}\n\n.input-lg,\n.form-group-lg .form-control {\n .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @input-border-radius-large);\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n // Enable absolute positioning\n position: relative;\n\n // Ensure icons don't overlap text\n .form-control {\n padding-right: (@input-height-base * 1.25);\n }\n}\n// Feedback icon (requires .glyphicon classes)\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2; // Ensure icon is above input groups\n display: block;\n width: @input-height-base;\n height: @input-height-base;\n line-height: @input-height-base;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback {\n width: @input-height-large;\n height: @input-height-large;\n line-height: @input-height-large;\n}\n.input-sm + .form-control-feedback {\n width: @input-height-small;\n height: @input-height-small;\n line-height: @input-height-small;\n}\n\n// Feedback states\n.has-success {\n .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);\n}\n.has-warning {\n .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);\n}\n.has-error {\n .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);\n}\n\n// Reposition feedback icon if input has visible label above\n.has-feedback label {\n\n & ~ .form-control-feedback {\n top: (@line-height-computed + 5); // Height of the `label` and its margin\n }\n &.sr-only ~ .form-control-feedback {\n top: 0;\n }\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n display: block; // account for any element using help-block\n margin-top: 5px;\n margin-bottom: 10px;\n color: lighten(@text-color, 25%); // lighten the text some for contrast\n}\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n.form-inline {\n\n // Kick in the inline\n @media (min-width: @screen-sm-min) {\n // Inline-block all the things for \"inline\"\n .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // In navbar-form, allow folks to *not* use `.form-group`\n .form-control {\n display: inline-block;\n width: auto; // Prevent labels from stacking above inputs in `.form-group`\n vertical-align: middle;\n }\n\n // Make static controls behave like regular ones\n .form-control-static {\n display: inline-block;\n }\n\n .input-group {\n display: inline-table;\n vertical-align: middle;\n\n .input-group-addon,\n .input-group-btn,\n .form-control {\n width: auto;\n }\n }\n\n // Input groups need that 100% width though\n .input-group > .form-control {\n width: 100%;\n }\n\n .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // Remove default margin on radios/checkboxes that were used for stacking, and\n // then undo the floating of radios and checkboxes to match (which also avoids\n // a bug in WebKit: https://github.com/twbs/bootstrap/issues/1969).\n .radio,\n .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n\n label {\n padding-left: 0;\n }\n }\n .radio input[type=\"radio\"],\n .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n\n // Re-override the feedback icon.\n .has-feedback .form-control-feedback {\n top: 0;\n }\n }\n}\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n // Consistent vertical alignment of radios and checkboxes\n //\n // Labels also get some reset styles, but that is scoped to a media query below.\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n // Account for padding we're adding to ensure the alignment and of help text\n // and other content below items\n .radio,\n .checkbox {\n min-height: (@line-height-computed + (@padding-base-vertical + 1));\n }\n\n // Make form groups behave like rows\n .form-group {\n .make-row();\n }\n\n // Reset spacing and right align labels, but scope to media queries so that\n // labels on narrow viewports stack the same as a default form example.\n @media (min-width: @screen-sm-min) {\n .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n }\n\n // Validation states\n //\n // Reposition the icon because it's now within a grid column and columns have\n // `position: relative;` on them. Also accounts for the grid gutter padding.\n .has-feedback .form-control-feedback {\n right: (@grid-gutter-width / 2);\n }\n\n // Form group sizes\n //\n // Quick utility class for applying `.input-lg` and `.input-sm` styles to the\n // inputs and labels within a `.form-group`.\n .form-group-lg {\n @media (min-width: @screen-sm-min) {\n .control-label {\n padding-top: ((@padding-large-vertical * @line-height-large) + 1);\n }\n }\n }\n .form-group-sm {\n @media (min-width: @screen-sm-min) {\n .control-label {\n padding-top: (@padding-small-vertical + 1);\n }\n }\n }\n}\n","// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\n // Color the label and help text\n .help-block,\n .control-label,\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline,\n &.radio label,\n &.checkbox label,\n &.radio-inline label,\n &.checkbox-inline label {\n color: @text-color;\n }\n // Set the border and box shadow on specific inputs to match\n .form-control {\n border-color: @border-color;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n &:focus {\n border-color: darken(@border-color, 10%);\n @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);\n .box-shadow(@shadow);\n }\n }\n // Set validation states also for addons\n .input-group-addon {\n color: @text-color;\n border-color: @border-color;\n background-color: @background-color;\n }\n // Optional feedback icon\n .form-control-feedback {\n color: @text-color;\n }\n}\n\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-border-focus` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n.form-control-focus(@color: @input-border-focus) {\n @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);\n &:focus {\n border-color: @color;\n outline: 0;\n .box-shadow(~\"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}\");\n }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. ``\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n display: inline-block;\n margin-bottom: 0; // For input.btn\n font-weight: @btn-font-weight;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n white-space: nowrap;\n .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @border-radius-base);\n .user-select(none);\n\n &,\n &:active,\n &.active {\n &:focus,\n &.focus {\n .tab-focus();\n }\n }\n\n &:hover,\n &:focus,\n &.focus {\n color: @btn-default-color;\n text-decoration: none;\n }\n\n &:active,\n &.active {\n outline: 0;\n background-image: none;\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n pointer-events: none; // Future-proof disabling of clicks\n .opacity(.65);\n .box-shadow(none);\n }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n color: @link-color;\n font-weight: normal;\n border-radius: 0;\n\n &,\n &:active,\n &.active,\n &[disabled],\n fieldset[disabled] & {\n background-color: transparent;\n .box-shadow(none);\n }\n &,\n &:hover,\n &:focus,\n &:active {\n border-color: transparent;\n }\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: underline;\n background-color: transparent;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @btn-link-disabled-color;\n text-decoration: none;\n }\n }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n // line-height: ensure even-numbered height of button next to large input\n .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n.btn-sm {\n // line-height: ensure proper height of button next to small input\n .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n.btn-xs {\n .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n color: @color;\n background-color: @background;\n border-color: @border;\n\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: @background;\n border-color: @border;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n}\n","// Opacity\n\n.opacity(@opacity) {\n opacity: @opacity;\n // IE8 filter\n @opacity-ie: (@opacity * 100);\n filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n opacity: 0;\n .transition(opacity .15s linear);\n &.in {\n opacity: 1;\n }\n}\n\n.collapse {\n display: none;\n visibility: hidden;\n\n &.in { display: block; visibility: visible; }\n tr&.in { display: table-row; }\n tbody&.in { display: table-row-group; }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n .transition-property(~\"height, visibility\");\n .transition-duration(.35s);\n .transition-timing-function(ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: @caret-width-base solid;\n border-right: @caret-width-base solid transparent;\n border-left: @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropdown {\n position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: @zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0; // override default ul\n list-style: none;\n font-size: @font-size-base;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n background-color: @dropdown-bg;\n border: 1px solid @dropdown-fallback-border; // IE8 fallback\n border: 1px solid @dropdown-border;\n border-radius: @border-radius-base;\n .box-shadow(0 6px 12px rgba(0,0,0,.175));\n background-clip: padding-box;\n\n // Aligns the dropdown menu to right\n //\n // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n &.pull-right {\n right: 0;\n left: auto;\n }\n\n // Dividers (basically an hr) within the dropdown\n .divider {\n .nav-divider(@dropdown-divider-bg);\n }\n\n // Links within the dropdown menu\n > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: @line-height-base;\n color: @dropdown-link-color;\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n &:hover,\n &:focus {\n text-decoration: none;\n color: @dropdown-link-hover-color;\n background-color: @dropdown-link-hover-bg;\n }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-active-color;\n text-decoration: none;\n outline: 0;\n background-color: @dropdown-link-active-bg;\n }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-disabled-color;\n }\n\n // Nuke hover/focus effects\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none; // Remove CSS gradient\n .reset-filter();\n cursor: @cursor-disabled;\n }\n}\n\n// Open state for the dropdown\n.open {\n // Show the menu\n > .dropdown-menu {\n display: block;\n }\n\n // Remove the outline when :focus is triggered\n > a {\n outline: 0;\n }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n left: auto; // Reset the default from `.dropdown-menu`\n right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: @font-size-small;\n line-height: @line-height-base;\n color: @dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n // Reverse the caret\n .caret {\n border-top: 0;\n border-bottom: @caret-width-base solid;\n content: \"\";\n }\n // Different positioning for bottom up menu\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 1px;\n }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-right {\n .dropdown-menu {\n .dropdown-menu-right();\n }\n // Necessary for overrides of the default right aligned menu.\n // Will remove come v4 in all likelihood.\n .dropdown-menu-left {\n .dropdown-menu-left();\n }\n }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; // match .btn alignment given font-size hack above\n > .btn {\n position: relative;\n float: left;\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active,\n &.active {\n z-index: 2;\n }\n }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n .btn + .btn,\n .btn + .btn-group,\n .btn-group + .btn,\n .btn-group + .btn-group {\n margin-left: -1px;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n margin-left: -5px; // Offset the first child's margin\n &:extend(.clearfix all);\n\n .btn-group,\n .input-group {\n float: left;\n }\n > .btn,\n > .btn-group,\n > .input-group {\n margin-left: 5px;\n }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n margin-left: 0;\n &:not(:last-child):not(.dropdown-toggle) {\n .border-right-radius(0);\n }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-right-radius(0);\n }\n}\n.btn-group > .btn-group:last-child > .btn:first-child {\n .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n .box-shadow(none);\n }\n}\n\n\n// Reposition the caret\n.btn .caret {\n margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n border-width: @caret-width-large @caret-width-large 0;\n border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n > .btn,\n > .btn-group,\n > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n }\n\n // Clear floats so dropdown menus can be properly placed\n > .btn-group {\n &:extend(.clearfix all);\n > .btn {\n float: none;\n }\n }\n\n > .btn + .btn,\n > .btn + .btn-group,\n > .btn-group + .btn,\n > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n }\n}\n\n.btn-group-vertical > .btn {\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n &:first-child:not(:last-child) {\n border-top-right-radius: @border-radius-base;\n .border-bottom-radius(0);\n }\n &:last-child:not(:first-child) {\n border-bottom-left-radius: @border-radius-base;\n .border-top-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-bottom-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n > .btn,\n > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n }\n > .btn-group .btn {\n width: 100%;\n }\n\n > .btn-group .dropdown-menu {\n left: auto;\n }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n > .btn,\n > .btn-group > .btn {\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0,0,0,0);\n pointer-events: none;\n }\n }\n}\n","// Single side border-radius\n\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n position: relative; // For dropdowns\n display: table;\n border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n // Undo padding and float of grid classes\n &[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n }\n\n .form-control {\n // Ensure that the input is always above the *appended* addon button for\n // proper border colors.\n position: relative;\n z-index: 2;\n\n // IE9 fubars the placeholder attribute in text inputs and the arrows on\n // select elements in input groups. To fix it, we float the input. Details:\n // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n float: left;\n\n width: 100%;\n margin-bottom: 0;\n }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n .input-lg();\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n .input-sm();\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 1;\n color: @input-color;\n text-align: center;\n background-color: @input-group-addon-bg;\n border: 1px solid @input-group-addon-border-color;\n border-radius: @border-radius-base;\n\n // Sizing\n &.input-sm {\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n border-radius: @border-radius-small;\n }\n &.input-lg {\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n border-radius: @border-radius-large;\n }\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n .border-right-radius(0);\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n .border-left-radius(0);\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n position: relative;\n // Jankily prevent input button groups from wrapping with `white-space` and\n // `font-size` in combination with `inline-block` on buttons.\n font-size: 0;\n white-space: nowrap;\n\n // Negative margin for spacing, position for bringing hovered/focused/actived\n // element above the siblings.\n > .btn {\n position: relative;\n + .btn {\n margin-left: -1px;\n }\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active {\n z-index: 2;\n }\n }\n\n // Negative margin to only have a 1px border between the two\n &:first-child {\n > .btn,\n > .btn-group {\n margin-right: -1px;\n }\n }\n &:last-child {\n > .btn,\n > .btn-group {\n margin-left: -1px;\n }\n }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n margin-bottom: 0;\n padding-left: 0; // Override default ul/ol\n list-style: none;\n &:extend(.clearfix all);\n\n > li {\n position: relative;\n display: block;\n\n > a {\n position: relative;\n display: block;\n padding: @nav-link-padding;\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @nav-link-hover-bg;\n }\n }\n\n // Disabled state sets text to gray and nukes hover/tab effects\n &.disabled > a {\n color: @nav-disabled-link-color;\n\n &:hover,\n &:focus {\n color: @nav-disabled-link-hover-color;\n text-decoration: none;\n background-color: transparent;\n cursor: @cursor-disabled;\n }\n }\n }\n\n // Open dropdowns\n .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @nav-link-hover-bg;\n border-color: @link-color;\n }\n }\n\n // Nav dividers (deprecated with v3.0.1)\n //\n // This should have been removed in v3 with the dropping of `.nav-list`, but\n // we missed it. We don't currently support this anywhere, but in the interest\n // of maintaining backward compatibility in case you use it, it's deprecated.\n .nav-divider {\n .nav-divider();\n }\n\n // Prevent IE8 from misplacing imgs\n //\n // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n > li > a > img {\n max-width: none;\n }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n border-bottom: 1px solid @nav-tabs-border-color;\n > li {\n float: left;\n // Make the list-items overlay the bottom border\n margin-bottom: -1px;\n\n // Actual tabs (as links)\n > a {\n margin-right: 2px;\n line-height: @line-height-base;\n border: 1px solid transparent;\n border-radius: @border-radius-base @border-radius-base 0 0;\n &:hover {\n border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n }\n }\n\n // Active state, and its :hover to override normal :hover\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-tabs-active-link-hover-color;\n background-color: @nav-tabs-active-link-hover-bg;\n border: 1px solid @nav-tabs-active-link-hover-border-color;\n border-bottom-color: transparent;\n cursor: default;\n }\n }\n }\n // pulling this in mainly for less shorthand\n &.nav-justified {\n .nav-justified();\n .nav-tabs-justified();\n }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n > li {\n float: left;\n\n // Links rendered as pills\n > a {\n border-radius: @nav-pills-border-radius;\n }\n + li {\n margin-left: 2px;\n }\n\n // Active state\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-pills-active-link-hover-color;\n background-color: @nav-pills-active-link-hover-bg;\n }\n }\n }\n}\n\n\n// Stacked pills\n.nav-stacked {\n > li {\n float: none;\n + li {\n margin-top: 2px;\n margin-left: 0; // no need for this gap between nav items\n }\n }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n width: 100%;\n\n > li {\n float: none;\n > a {\n text-align: center;\n margin-bottom: 5px;\n }\n }\n\n > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n }\n\n @media (min-width: @screen-sm-min) {\n > li {\n display: table-cell;\n width: 1%;\n > a {\n margin-bottom: 0;\n }\n }\n }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n border-bottom: 0;\n\n > li > a {\n // Override margin from .nav-tabs\n margin-right: 0;\n border-radius: @border-radius-base;\n }\n\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border: 1px solid @nav-tabs-justified-link-border-color;\n }\n\n @media (min-width: @screen-sm-min) {\n > li > a {\n border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n border-radius: @border-radius-base @border-radius-base 0 0;\n }\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border-bottom-color: @nav-tabs-justified-active-link-border-color;\n }\n }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n > .tab-pane {\n display: none;\n visibility: hidden;\n }\n > .active {\n display: block;\n visibility: visible;\n }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n // make dropdown border overlap tab border\n margin-top: -1px;\n // Remove the top rounded corners here since there is a hard edge above the menu\n .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n margin-bottom: @navbar-margin-bottom;\n border: 1px solid transparent;\n\n // Prevent floats from breaking the navbar\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: @navbar-border-radius;\n }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n overflow-x: visible;\n padding-right: @navbar-padding-horizontal;\n padding-left: @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n &:extend(.clearfix all);\n -webkit-overflow-scrolling: touch;\n\n &.in {\n overflow-y: auto;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border-top: 0;\n box-shadow: none;\n\n &.collapse {\n display: block !important;\n visibility: visible !important;\n height: auto !important;\n padding-bottom: 0; // Override default setting\n overflow: visible !important;\n }\n\n &.in {\n overflow-y: visible;\n }\n\n // Undo the collapse side padding for navbars with containers to ensure\n // alignment of right-aligned contents.\n .navbar-fixed-top &,\n .navbar-static-top &,\n .navbar-fixed-bottom & {\n padding-left: 0;\n padding-right: 0;\n }\n }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n .navbar-collapse {\n max-height: @navbar-collapse-max-height;\n\n @media (max-device-width: @screen-xs-min) and (orientation: landscape) {\n max-height: 200px;\n }\n }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n > .navbar-header,\n > .navbar-collapse {\n margin-right: -@navbar-padding-horizontal;\n margin-left: -@navbar-padding-horizontal;\n\n @media (min-width: @grid-float-breakpoint) {\n margin-right: 0;\n margin-left: 0;\n }\n }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n z-index: @zindex-navbar;\n border-width: 0 0 1px;\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: @zindex-navbar-fixed;\n\n // Undo the rounded corners\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0; // override .navbar defaults\n border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n float: left;\n padding: @navbar-padding-vertical @navbar-padding-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-computed;\n height: @navbar-height;\n\n &:hover,\n &:focus {\n text-decoration: none;\n }\n\n > img {\n display: block;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n .navbar > .container &,\n .navbar > .container-fluid & {\n margin-left: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: @navbar-padding-horizontal;\n padding: 9px 10px;\n .navbar-vertical-align(34px);\n background-color: transparent;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n border-radius: @border-radius-base;\n\n // We remove the `outline` here, but later compensate by attaching `:hover`\n // styles to `:focus`.\n &:focus {\n outline: 0;\n }\n\n // Bars\n .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n }\n .icon-bar + .icon-bar {\n margin-top: 4px;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n display: none;\n }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: @line-height-computed;\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n > li > a,\n .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n > li > a {\n line-height: @line-height-computed;\n &:hover,\n &:focus {\n background-image: none;\n }\n }\n }\n }\n\n // Uncollapse the nav\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin: 0;\n\n > li {\n float: left;\n > a {\n padding-top: @navbar-padding-vertical;\n padding-bottom: @navbar-padding-vertical;\n }\n }\n }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n margin-left: -@navbar-padding-horizontal;\n margin-right: -@navbar-padding-horizontal;\n padding: 10px @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n\n // Mixin behavior for optimum display\n .form-inline();\n\n .form-group {\n @media (max-width: @grid-float-breakpoint-max) {\n margin-bottom: 5px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n }\n\n // Vertically center in expanded, horizontal navbar\n .navbar-vertical-align(@input-height-base);\n\n // Undo 100% width for pull classes\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n .box-shadow(none);\n }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n .border-top-radius(@navbar-border-radius);\n .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n .navbar-vertical-align(@input-height-base);\n\n &.btn-sm {\n .navbar-vertical-align(@input-height-small);\n }\n &.btn-xs {\n .navbar-vertical-align(22);\n }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n .navbar-vertical-align(@line-height-computed);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin-left: @navbar-padding-horizontal;\n margin-right: @navbar-padding-horizontal;\n }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-left { .pull-left(); }\n .navbar-right {\n .pull-right();\n margin-right: -@navbar-padding-horizontal;\n\n ~ .navbar-right {\n margin-right: 0;\n }\n }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n background-color: @navbar-default-bg;\n border-color: @navbar-default-border;\n\n .navbar-brand {\n color: @navbar-default-brand-color;\n &:hover,\n &:focus {\n color: @navbar-default-brand-hover-color;\n background-color: @navbar-default-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-default-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-default-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n\n .navbar-toggle {\n border-color: @navbar-default-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-default-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-default-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: @navbar-default-border;\n }\n\n // Dropdown menu items\n .navbar-nav {\n // Remove background color from open dropdown\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-default-link-active-bg;\n color: @navbar-default-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n > li > a {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n }\n }\n\n\n // Links in navbars\n //\n // Add a class to ensure links outside the navbar nav are colored correctly.\n\n .navbar-link {\n color: @navbar-default-link-color;\n &:hover {\n color: @navbar-default-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n }\n }\n }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n background-color: @navbar-inverse-bg;\n border-color: @navbar-inverse-border;\n\n .navbar-brand {\n color: @navbar-inverse-brand-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-brand-hover-color;\n background-color: @navbar-inverse-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-inverse-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-inverse-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n\n // Darken the responsive nav toggle\n .navbar-toggle {\n border-color: @navbar-inverse-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-inverse-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-inverse-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: darken(@navbar-inverse-bg, 7%);\n }\n\n // Dropdowns\n .navbar-nav {\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-inverse-link-active-bg;\n color: @navbar-inverse-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display\n .open .dropdown-menu {\n > .dropdown-header {\n border-color: @navbar-inverse-border;\n }\n .divider {\n background-color: @navbar-inverse-border;\n }\n > li > a {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n }\n }\n\n .navbar-link {\n color: @navbar-inverse-link-color;\n &:hover {\n color: @navbar-inverse-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n }\n }\n }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n.navbar-vertical-align(@element-height) {\n margin-top: ((@navbar-height - @element-height) / 2);\n margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n .clearfix();\n}\n.center-block {\n .center-block();\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n display: none !important;\n visibility: hidden !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n position: fixed;\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n margin-bottom: @line-height-computed;\n list-style: none;\n background-color: @breadcrumb-bg;\n border-radius: @border-radius-base;\n\n > li {\n display: inline-block;\n\n + li:before {\n content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n padding: 0 5px;\n color: @breadcrumb-color;\n }\n }\n\n > .active {\n color: @breadcrumb-active-color;\n }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: @line-height-computed 0;\n border-radius: @border-radius-base;\n\n > li {\n display: inline; // Remove list-style and block-level defaults\n > a,\n > span {\n position: relative;\n float: left; // Collapse white-space\n padding: @padding-base-vertical @padding-base-horizontal;\n line-height: @line-height-base;\n text-decoration: none;\n color: @pagination-color;\n background-color: @pagination-bg;\n border: 1px solid @pagination-border;\n margin-left: -1px;\n }\n &:first-child {\n > a,\n > span {\n margin-left: 0;\n .border-left-radius(@border-radius-base);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius-base);\n }\n }\n }\n\n > li > a,\n > li > span {\n &:hover,\n &:focus {\n color: @pagination-hover-color;\n background-color: @pagination-hover-bg;\n border-color: @pagination-hover-border;\n }\n }\n\n > .active > a,\n > .active > span {\n &,\n &:hover,\n &:focus {\n z-index: 2;\n color: @pagination-active-color;\n background-color: @pagination-active-bg;\n border-color: @pagination-active-border;\n cursor: default;\n }\n }\n\n > .disabled {\n > span,\n > span:hover,\n > span:focus,\n > a,\n > a:hover,\n > a:focus {\n color: @pagination-disabled-color;\n background-color: @pagination-disabled-bg;\n border-color: @pagination-disabled-border;\n cursor: @cursor-disabled;\n }\n }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @border-radius-small);\n}\n","// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) {\n > li {\n > a,\n > span {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n }\n &:first-child {\n > a,\n > span {\n .border-left-radius(@border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius);\n }\n }\n }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n padding-left: 0;\n margin: @line-height-computed 0;\n list-style: none;\n text-align: center;\n &:extend(.clearfix all);\n li {\n display: inline;\n > a,\n > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: @pager-bg;\n border: 1px solid @pager-border;\n border-radius: @pager-border-radius;\n }\n\n > a:hover,\n > a:focus {\n text-decoration: none;\n background-color: @pager-hover-bg;\n }\n }\n\n .next {\n > a,\n > span {\n float: right;\n }\n }\n\n .previous {\n > a,\n > span {\n float: left;\n }\n }\n\n .disabled {\n > a,\n > a:hover,\n > a:focus,\n > span {\n color: @pager-disabled-color;\n background-color: @pager-bg;\n cursor: @cursor-disabled;\n }\n }\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: @label-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n\n // Add hover effects, but only for links\n a& {\n &:hover,\n &:focus {\n color: @label-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Empty labels collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for labels in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n .label-variant(@label-default-bg);\n}\n\n.label-primary {\n .label-variant(@label-primary-bg);\n}\n\n.label-success {\n .label-variant(@label-success-bg);\n}\n\n.label-info {\n .label-variant(@label-info-bg);\n}\n\n.label-warning {\n .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n .label-variant(@label-danger-bg);\n}\n","// Labels\n\n.label-variant(@color) {\n background-color: @color;\n\n &[href] {\n &:hover,\n &:focus {\n background-color: darken(@color, 10%);\n }\n }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: @font-size-small;\n font-weight: @badge-font-weight;\n color: @badge-color;\n line-height: @badge-line-height;\n vertical-align: baseline;\n white-space: nowrap;\n text-align: center;\n background-color: @badge-bg;\n border-radius: @badge-border-radius;\n\n // Empty badges collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for badges in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n .btn-xs & {\n top: 0;\n padding: 1px 5px;\n }\n\n // Hover state, but only for links\n a& {\n &:hover,\n &:focus {\n color: @badge-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Account for badges in navs\n .list-group-item.active > &,\n .nav-pills > .active > a > & {\n color: @badge-active-color;\n background-color: @badge-active-bg;\n }\n .list-group-item > & {\n float: right;\n }\n .list-group-item > & + & {\n margin-right: 5px;\n }\n .nav-pills > li > a > & {\n margin-left: 3px;\n }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n padding: @jumbotron-padding (@jumbotron-padding / 2);\n margin-bottom: @jumbotron-padding;\n color: @jumbotron-color;\n background-color: @jumbotron-bg;\n\n h1,\n .h1 {\n color: @jumbotron-heading-color;\n }\n p {\n margin-bottom: (@jumbotron-padding / 2);\n font-size: @jumbotron-font-size;\n font-weight: 200;\n }\n\n > hr {\n border-top-color: darken(@jumbotron-bg, 10%);\n }\n\n .container &,\n .container-fluid & {\n border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n }\n\n .container {\n max-width: 100%;\n }\n\n @media screen and (min-width: @screen-sm-min) {\n padding: (@jumbotron-padding * 1.6) 0;\n\n .container &,\n .container-fluid & {\n padding-left: (@jumbotron-padding * 2);\n padding-right: (@jumbotron-padding * 2);\n }\n\n h1,\n .h1 {\n font-size: (@font-size-base * 4.5);\n }\n }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n display: block;\n padding: @thumbnail-padding;\n margin-bottom: @line-height-computed;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(border .2s ease-in-out);\n\n > img,\n a > img {\n &:extend(.img-responsive);\n margin-left: auto;\n margin-right: auto;\n }\n\n // Add a hover state for linked versions only\n a&:hover,\n a&:focus,\n a&.active {\n border-color: @link-color;\n }\n\n // Image captions\n .caption {\n padding: @thumbnail-caption-padding;\n color: @thumbnail-caption-color;\n }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n padding: @alert-padding;\n margin-bottom: @line-height-computed;\n border: 1px solid transparent;\n border-radius: @alert-border-radius;\n\n // Headings for larger alerts\n h4 {\n margin-top: 0;\n // Specified for the h4 to prevent conflicts of changing @headings-color\n color: inherit;\n }\n // Provide class for links that match alerts\n .alert-link {\n font-weight: @alert-link-font-weight;\n }\n\n // Improve alignment and spacing of inner content\n > p,\n > ul {\n margin-bottom: 0;\n }\n > p + p {\n margin-top: 5px;\n }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n padding-right: (@alert-padding + 20);\n\n // Adjust close link position\n .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n.alert-info {\n .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n.alert-warning {\n .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n.alert-danger {\n .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","// Alerts\n\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n overflow: hidden;\n height: @line-height-computed;\n margin-bottom: @line-height-computed;\n background-color: @progress-bg;\n border-radius: @progress-border-radius;\n .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: @font-size-small;\n line-height: @line-height-computed;\n color: @progress-bar-color;\n text-align: center;\n background-color: @progress-bar-bg;\n .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n .transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n #gradient > .striped();\n background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Progress bars\n\n.progress-bar-variant(@color) {\n background-color: @color;\n\n // Deprecated parent class requirement as of v3.2.0\n .progress-striped & {\n #gradient > .striped();\n }\n}\n",".media {\n // Proper spacing between instances of .media\n margin-top: 15px;\n\n &:first-child {\n margin-top: 0;\n }\n}\n\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n\n.media-middle {\n vertical-align: middle;\n}\n\n.media-bottom {\n vertical-align: bottom;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n\n// Media list variation\n//\n// Undo default ul/ol styles\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on , , or .\n\n.list-group {\n // No need to set list-style: none; since .list-group-item is block level\n margin-bottom: 20px;\n padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: @list-group-bg;\n border: 1px solid @list-group-border;\n\n // Round the first and last items\n &:first-child {\n .border-top-radius(@list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n .border-bottom-radius(@list-group-border-radius);\n }\n}\n\n\n// Linked list items\n//\n// Use anchor elements instead of `li`s or `div`s to create linked list items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item {\n color: @list-group-link-color;\n\n .list-group-item-heading {\n color: @list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n text-decoration: none;\n color: @list-group-link-hover-color;\n background-color: @list-group-hover-bg;\n }\n}\n\n.list-group-item {\n // Disabled state\n &.disabled,\n &.disabled:hover,\n &.disabled:focus {\n background-color: @list-group-disabled-bg;\n color: @list-group-disabled-color;\n cursor: @cursor-disabled;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-disabled-text-color;\n }\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: @list-group-active-color;\n background-color: @list-group-active-bg;\n border-color: @list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading,\n .list-group-item-heading > small,\n .list-group-item-heading > .small {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-active-text-color;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n","// List Groups\n\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;\n background-color: @background;\n\n a& {\n color: @color;\n\n .list-group-item-heading {\n color: inherit;\n }\n\n &:hover,\n &:focus {\n color: @color;\n background-color: darken(@background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: @color;\n border-color: @color;\n }\n }\n }\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: @line-height-computed;\n background-color: @panel-bg;\n border: 1px solid transparent;\n border-radius: @panel-border-radius;\n .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n padding: @panel-body-padding;\n &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n padding: @panel-heading-padding;\n border-bottom: 1px solid transparent;\n .border-top-radius((@panel-border-radius - 1));\n\n > .dropdown .dropdown-toggle {\n color: inherit;\n }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: ceil((@font-size-base * 1.125));\n color: inherit;\n\n > a {\n color: inherit;\n }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n padding: @panel-footer-padding;\n background-color: @panel-footer-bg;\n border-top: 1px solid @panel-inner-border;\n .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n > .list-group,\n > .panel-collapse > .list-group {\n margin-bottom: 0;\n\n .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n }\n\n // Add border top radius for first one\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n .border-top-radius((@panel-border-radius - 1));\n }\n }\n // Add border bottom radius for last one\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n .border-bottom-radius((@panel-border-radius - 1));\n }\n }\n }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n .list-group-item:first-child {\n border-top-width: 0;\n }\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n > .table,\n > .table-responsive > .table,\n > .panel-collapse > .table {\n margin-bottom: 0;\n\n caption {\n padding-left: @panel-body-padding;\n padding-right: @panel-body-padding;\n }\n }\n // Add border top radius for first one\n > .table:first-child,\n > .table-responsive:first-child > .table:first-child {\n .border-top-radius((@panel-border-radius - 1));\n\n > thead:first-child,\n > tbody:first-child {\n > tr:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n border-top-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-top-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n // Add border bottom radius for last one\n > .table:last-child,\n > .table-responsive:last-child > .table:last-child {\n .border-bottom-radius((@panel-border-radius - 1));\n\n > tbody:last-child,\n > tfoot:last-child {\n > tr:last-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n border-bottom-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-bottom-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n > .panel-body + .table,\n > .panel-body + .table-responsive,\n > .table + .panel-body,\n > .table-responsive + .panel-body {\n border-top: 1px solid @table-border-color;\n }\n > .table > tbody:first-child > tr:first-child th,\n > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n }\n > .table-bordered,\n > .table-responsive > .table-bordered {\n border: 0;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n > thead,\n > tbody {\n > tr:first-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n > tbody,\n > tfoot {\n > tr:last-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n }\n > .table-responsive {\n border: 0;\n margin-bottom: 0;\n }\n}\n\n\n// Collapsable panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n margin-bottom: @line-height-computed;\n\n // Tighten up margin so it's only between panels\n .panel {\n margin-bottom: 0;\n border-radius: @panel-border-radius;\n\n + .panel {\n margin-top: 5px;\n }\n }\n\n .panel-heading {\n border-bottom: 0;\n\n + .panel-collapse > .panel-body,\n + .panel-collapse > .list-group {\n border-top: 1px solid @panel-inner-border;\n }\n }\n\n .panel-footer {\n border-top: 0;\n + .panel-collapse .panel-body {\n border-bottom: 1px solid @panel-inner-border;\n }\n }\n}\n\n\n// Contextual variations\n.panel-default {\n .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n","// Panels\n\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n border-color: @border;\n\n & > .panel-heading {\n color: @heading-text-color;\n background-color: @heading-bg-color;\n border-color: @heading-border;\n\n + .panel-collapse > .panel-body {\n border-top-color: @border;\n }\n .badge {\n color: @heading-bg-color;\n background-color: @heading-text-color;\n }\n }\n & > .panel-footer {\n + .panel-collapse > .panel-body {\n border-bottom-color: @border;\n }\n }\n}\n","// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n\n .embed-responsive-item,\n iframe,\n embed,\n object,\n video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n }\n\n // Modifier class for 16:9 aspect ratio\n &.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n }\n\n // Modifier class for 4:3 aspect ratio\n &.embed-responsive-4by3 {\n padding-bottom: 75%;\n }\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: @well-bg;\n border: 1px solid @well-border;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0,0,0,.15);\n }\n}\n\n// Sizes\n.well-lg {\n padding: 24px;\n border-radius: @border-radius-large;\n}\n.well-sm {\n padding: 9px;\n border-radius: @border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: (@font-size-base * 1.5);\n font-weight: @close-font-weight;\n line-height: 1;\n color: @close-color;\n text-shadow: @close-text-shadow;\n .opacity(.2);\n\n &:hover,\n &:focus {\n color: @close-color;\n text-decoration: none;\n cursor: pointer;\n .opacity(.5);\n }\n\n // Additional properties for button version\n // iOS requires the button element instead of an anchor tag.\n // If you want the anchor version, it requires `href=\"#\"`.\n button& {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n }\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal;\n -webkit-overflow-scrolling: touch;\n\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n .translate(0, -25%);\n .transition-transform(~\"0.3s ease-out\");\n }\n &.in .modal-dialog { .translate(0, 0) }\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n background-color: @modal-content-bg;\n border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid @modal-content-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 3px 9px rgba(0,0,0,.5));\n background-clip: padding-box;\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n background-color: @modal-backdrop-bg;\n // Fade for backdrop\n &.fade { .opacity(0); }\n &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n padding: @modal-title-padding;\n border-bottom: 1px solid @modal-header-border-color;\n min-height: (@modal-title-padding + @modal-title-line-height);\n}\n// Close icon\n.modal-header .close {\n margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n margin: 0;\n line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n padding: @modal-inner-padding;\n text-align: right; // right align buttons\n border-top: 1px solid @modal-footer-border-color;\n &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n // Properly space out buttons\n .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n }\n // but override that for button groups\n .btn-group .btn + .btn {\n margin-left: -1px;\n }\n // and override it for block buttons as well\n .btn-block + .btn-block {\n margin-left: 0;\n }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n width: @modal-md;\n margin: 30px auto;\n }\n .modal-content {\n .box-shadow(0 5px 15px rgba(0,0,0,.5));\n }\n\n // Modal sizes\n .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n .modal-lg { width: @modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n z-index: @zindex-tooltip;\n display: block;\n visibility: visible;\n // Reset font and text propertes given new insertion method\n font-family: @font-family-base;\n font-size: @font-size-small;\n font-weight: normal;\n line-height: 1.4;\n .opacity(0);\n\n &.in { .opacity(@tooltip-opacity); }\n &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; }\n &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; }\n &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; }\n &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: @tooltip-max-width;\n padding: 3px 8px;\n color: @tooltip-color;\n text-align: center;\n text-decoration: none;\n background-color: @tooltip-bg;\n border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1\n.tooltip {\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n bottom: 0;\n right: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n left: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n border-right-color: @tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-left-color: @tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n right: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n left: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: @zindex-popover;\n display: none;\n max-width: @popover-max-width;\n padding: 1px;\n // Reset font and text propertes given new insertion method\n font-family: @font-family-base;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: @line-height-base;\n text-align: left;\n background-color: @popover-bg;\n background-clip: padding-box;\n border: 1px solid @popover-fallback-border-color;\n border: 1px solid @popover-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n // Overrides for proper insertion\n white-space: normal;\n\n // Offset the popover to account for the popover arrow\n &.top { margin-top: -@popover-arrow-width; }\n &.right { margin-left: @popover-arrow-width; }\n &.bottom { margin-top: @popover-arrow-width; }\n &.left { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n margin: 0; // reset heading margin\n padding: 8px 14px;\n font-size: @font-size-base;\n background-color: @popover-title-bg;\n border-bottom: 1px solid darken(@popover-title-bg, 5%);\n border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n &,\n &:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n }\n}\n.popover > .arrow {\n border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n border-width: @popover-arrow-width;\n content: \"\";\n}\n\n.popover {\n &.top > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-top-color: @popover-arrow-outer-color;\n bottom: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n bottom: 1px;\n margin-left: -@popover-arrow-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-color;\n }\n }\n &.right > .arrow {\n top: 50%;\n left: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-right-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n left: 1px;\n bottom: -@popover-arrow-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-color;\n }\n }\n &.bottom > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-bottom-color: @popover-arrow-outer-color;\n top: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n top: 1px;\n margin-left: -@popover-arrow-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-color;\n }\n }\n\n &.left > .arrow {\n top: 50%;\n right: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-right-width: 0;\n border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-left-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: @popover-arrow-color;\n bottom: -@popover-arrow-width;\n }\n }\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n\n > .item {\n display: none;\n position: relative;\n .transition(.6s ease-in-out left);\n\n // Account for jankitude on images\n > img,\n > a > img {\n &:extend(.img-responsive);\n line-height: 1;\n }\n\n // WebKit CSS3 transforms for supported devices\n @media all and (transform-3d), (-webkit-transform-3d) {\n transition: transform .6s ease-in-out;\n backface-visibility: hidden;\n perspective: 1000;\n\n &.next,\n &.active.right {\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n &.prev,\n &.active.left {\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n &.next.left,\n &.prev.right,\n &.active {\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n }\n }\n\n > .active,\n > .next,\n > .prev {\n display: block;\n }\n\n > .active {\n left: 0;\n }\n\n > .next,\n > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n }\n\n > .next {\n left: 100%;\n }\n > .prev {\n left: -100%;\n }\n > .next.left,\n > .prev.right {\n left: 0;\n }\n\n > .active.left {\n left: -100%;\n }\n > .active.right {\n left: 100%;\n }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: @carousel-control-width;\n .opacity(@carousel-control-opacity);\n font-size: @carousel-control-font-size;\n color: @carousel-control-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n // We can't have this transition here because WebKit cancels the carousel\n // animation if you trip this while in the middle of another animation.\n\n // Set gradients for backgrounds\n &.left {\n #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n }\n &.right {\n left: auto;\n right: 0;\n #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n }\n\n // Hover/focus state\n &:hover,\n &:focus {\n outline: 0;\n color: @carousel-control-color;\n text-decoration: none;\n .opacity(.9);\n }\n\n // Toggles\n .icon-prev,\n .icon-next,\n .glyphicon-chevron-left,\n .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n z-index: 5;\n display: inline-block;\n }\n .icon-prev,\n .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n }\n .icon-next,\n .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n }\n .icon-prev,\n .icon-next {\n width: 20px;\n height: 20px;\n margin-top: -10px;\n font-family: serif;\n }\n\n\n .icon-prev {\n &:before {\n content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n }\n }\n .icon-next {\n &:before {\n content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n }\n }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n\n li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid @carousel-indicator-border-color;\n border-radius: 10px;\n cursor: pointer;\n\n // IE8-9 hack for event handling\n //\n // Internet Explorer 8-9 does not support clicks on elements without a set\n // `background-color`. We cannot use `filter` since that's not viewed as a\n // background color by the browser. Thus, a hack is needed.\n //\n // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n // set alpha transparency for the best results possible.\n background-color: #000 \\9; // IE8\n background-color: rgba(0,0,0,0); // IE9\n }\n .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: @carousel-indicator-active-bg;\n }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: @carousel-caption-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n & .btn {\n text-shadow: none; // No shadow for button elements in carousel-caption\n }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n // Scale up the controls a smidge\n .carousel-control {\n .glyphicon-chevron-left,\n .glyphicon-chevron-right,\n .icon-prev,\n .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -15px;\n font-size: 30px;\n }\n .glyphicon-chevron-left,\n .icon-prev {\n margin-left: -15px;\n }\n .glyphicon-chevron-right,\n .icon-next {\n margin-right: -15px;\n }\n }\n\n // Show and left align the captions\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n\n // Move up the indicators\n .carousel-indicators {\n bottom: 20px;\n }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n","// Center-align a block level element\n\n.center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n","// CSS image replacement\n//\n// Heads up! v3 launched with with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (will be removed in v4)\n.hide-text() {\n font: ~\"0/0\" a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n// New mixin to use as of v3.0.1\n.text-hide() {\n .hide-text();\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n width: device-width;\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n .responsive-invisibility();\n}\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n\n.visible-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-visibility();\n }\n}\n.visible-xs-block {\n @media (max-width: @screen-xs-max) {\n display: block !important;\n }\n}\n.visible-xs-inline {\n @media (max-width: @screen-xs-max) {\n display: inline !important;\n }\n}\n.visible-xs-inline-block {\n @media (max-width: @screen-xs-max) {\n display: inline-block !important;\n }\n}\n\n.visible-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-visibility();\n }\n}\n.visible-sm-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: block !important;\n }\n}\n.visible-sm-inline {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline !important;\n }\n}\n.visible-sm-inline-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline-block !important;\n }\n}\n\n.visible-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-visibility();\n }\n}\n.visible-md-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: block !important;\n }\n}\n.visible-md-inline {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline !important;\n }\n}\n.visible-md-inline-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline-block !important;\n }\n}\n\n.visible-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-visibility();\n }\n}\n.visible-lg-block {\n @media (min-width: @screen-lg-min) {\n display: block !important;\n }\n}\n.visible-lg-inline {\n @media (min-width: @screen-lg-min) {\n display: inline !important;\n }\n}\n.visible-lg-inline-block {\n @media (min-width: @screen-lg-min) {\n display: inline-block !important;\n }\n}\n\n.hidden-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-invisibility();\n }\n}\n.hidden-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-invisibility();\n }\n}\n.hidden-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-invisibility();\n }\n}\n.hidden-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-invisibility();\n }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n.visible-print {\n .responsive-invisibility();\n\n @media print {\n .responsive-visibility();\n }\n}\n.visible-print-block {\n display: none !important;\n\n @media print {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n\n @media print {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n\n @media print {\n display: inline-block !important;\n }\n}\n\n.hidden-print {\n @media print {\n .responsive-invisibility();\n }\n}\n","// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n display: block !important;\n table& { display: table; }\n tr& { display: table-row !important; }\n th&,\n td& { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n display: none !important;\n}\n"]}
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/css/bootstrap.min.css b/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/css/bootstrap.min.css
new file mode 100755
index 0000000..b6fe4e0
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/css/bootstrap.min.css
@@ -0,0 +1,5 @@
+/*!
+ * Bootstrap v3.3.1 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ *//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:before,:after{color:#000!important;text-shadow:none!important;background:transparent!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:hover,a:focus{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=radio],input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;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 ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px}input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{position:absolute;margin-top:4px \9;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],input[type=radio].disabled,input[type=checkbox].disabled,fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm,.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm,select.form-group-sm .form-control{height:30px;line-height:30px}textarea.input-sm,textarea.form-group-sm .form-control,select[multiple].input-sm,select[multiple].form-group-sm .form-control{height:auto}.input-lg,.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg,select.form-group-lg .form-control{height:46px;line-height:46px}textarea.input-lg,textarea.form-group-lg .form-control,select[multiple].input-lg,select[multiple].form-group-lg .form-control{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;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;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default.focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary:hover,.btn-primary:focus,.btn-primary.focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success.focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info.focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning.focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger.focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none;visibility:hidden}.collapse.in{display:block;visibility:visible}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;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:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=radio],[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=radio],.input-group-addon input[type=checkbox]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none;visibility:hidden}.tab-content>.active{display:block;visibility:visible}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important;visibility:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px 15px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding:48px 0}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-right:auto;margin-left:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-right:15px;padding-left:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;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)}.modal-backdrop{position:absolute;top:0;right:0;left:0;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:1.4;visibility:visible;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:1.42857143;text-align:left;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;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)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;perspective:1000}.carousel-inner>.item.next,.carousel-inner>.item.active.right{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{display:table;content:" "}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/fonts/glyphicons-halflings-regular.eot b/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/fonts/glyphicons-halflings-regular.eot
new file mode 100755
index 0000000..4a4ca86
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/fonts/glyphicons-halflings-regular.eot differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/fonts/glyphicons-halflings-regular.svg b/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/fonts/glyphicons-halflings-regular.svg
new file mode 100755
index 0000000..25691af
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/fonts/glyphicons-halflings-regular.svg
@@ -0,0 +1,229 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/fonts/glyphicons-halflings-regular.ttf b/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/fonts/glyphicons-halflings-regular.ttf
new file mode 100755
index 0000000..67fa00b
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/fonts/glyphicons-halflings-regular.ttf differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/fonts/glyphicons-halflings-regular.woff b/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/fonts/glyphicons-halflings-regular.woff
new file mode 100755
index 0000000..8c54182
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/fonts/glyphicons-halflings-regular.woff differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/js/bootstrap.js b/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/js/bootstrap.js
new file mode 100755
index 0000000..b6ac8d9
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/js/bootstrap.js
@@ -0,0 +1,2320 @@
+/*!
+ * Bootstrap v3.3.1 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+if (typeof jQuery === 'undefined') {
+ throw new Error('Bootstrap\'s JavaScript requires jQuery')
+}
+
++function ($) {
+ var version = $.fn.jquery.split(' ')[0].split('.')
+ if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1)) {
+ throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher')
+ }
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: transition.js v3.3.1
+ * http://getbootstrap.com/javascript/#transitions
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
+ // ============================================================
+
+ function transitionEnd() {
+ var el = document.createElement('bootstrap')
+
+ var transEndEventNames = {
+ WebkitTransition : 'webkitTransitionEnd',
+ MozTransition : 'transitionend',
+ OTransition : 'oTransitionEnd otransitionend',
+ transition : 'transitionend'
+ }
+
+ for (var name in transEndEventNames) {
+ if (el.style[name] !== undefined) {
+ return { end: transEndEventNames[name] }
+ }
+ }
+
+ return false // explicit for ie8 ( ._.)
+ }
+
+ // http://blog.alexmaccaw.com/css-transitions
+ $.fn.emulateTransitionEnd = function (duration) {
+ var called = false
+ var $el = this
+ $(this).one('bsTransitionEnd', function () { called = true })
+ var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
+ setTimeout(callback, duration)
+ return this
+ }
+
+ $(function () {
+ $.support.transition = transitionEnd()
+
+ if (!$.support.transition) return
+
+ $.event.special.bsTransitionEnd = {
+ bindType: $.support.transition.end,
+ delegateType: $.support.transition.end,
+ handle: function (e) {
+ if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
+ }
+ }
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: alert.js v3.3.1
+ * http://getbootstrap.com/javascript/#alerts
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // ALERT CLASS DEFINITION
+ // ======================
+
+ var dismiss = '[data-dismiss="alert"]'
+ var Alert = function (el) {
+ $(el).on('click', dismiss, this.close)
+ }
+
+ Alert.VERSION = '3.3.1'
+
+ Alert.TRANSITION_DURATION = 150
+
+ Alert.prototype.close = function (e) {
+ var $this = $(this)
+ var selector = $this.attr('data-target')
+
+ if (!selector) {
+ selector = $this.attr('href')
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+ }
+
+ var $parent = $(selector)
+
+ if (e) e.preventDefault()
+
+ if (!$parent.length) {
+ $parent = $this.closest('.alert')
+ }
+
+ $parent.trigger(e = $.Event('close.bs.alert'))
+
+ if (e.isDefaultPrevented()) return
+
+ $parent.removeClass('in')
+
+ function removeElement() {
+ // detach from parent, fire event then clean up data
+ $parent.detach().trigger('closed.bs.alert').remove()
+ }
+
+ $.support.transition && $parent.hasClass('fade') ?
+ $parent
+ .one('bsTransitionEnd', removeElement)
+ .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
+ removeElement()
+ }
+
+
+ // ALERT PLUGIN DEFINITION
+ // =======================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.alert')
+
+ if (!data) $this.data('bs.alert', (data = new Alert(this)))
+ if (typeof option == 'string') data[option].call($this)
+ })
+ }
+
+ var old = $.fn.alert
+
+ $.fn.alert = Plugin
+ $.fn.alert.Constructor = Alert
+
+
+ // ALERT NO CONFLICT
+ // =================
+
+ $.fn.alert.noConflict = function () {
+ $.fn.alert = old
+ return this
+ }
+
+
+ // ALERT DATA-API
+ // ==============
+
+ $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: button.js v3.3.1
+ * http://getbootstrap.com/javascript/#buttons
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // BUTTON PUBLIC CLASS DEFINITION
+ // ==============================
+
+ var Button = function (element, options) {
+ this.$element = $(element)
+ this.options = $.extend({}, Button.DEFAULTS, options)
+ this.isLoading = false
+ }
+
+ Button.VERSION = '3.3.1'
+
+ Button.DEFAULTS = {
+ loadingText: 'loading...'
+ }
+
+ Button.prototype.setState = function (state) {
+ var d = 'disabled'
+ var $el = this.$element
+ var val = $el.is('input') ? 'val' : 'html'
+ var data = $el.data()
+
+ state = state + 'Text'
+
+ if (data.resetText == null) $el.data('resetText', $el[val]())
+
+ // push to event loop to allow forms to submit
+ setTimeout($.proxy(function () {
+ $el[val](data[state] == null ? this.options[state] : data[state])
+
+ if (state == 'loadingText') {
+ this.isLoading = true
+ $el.addClass(d).attr(d, d)
+ } else if (this.isLoading) {
+ this.isLoading = false
+ $el.removeClass(d).removeAttr(d)
+ }
+ }, this), 0)
+ }
+
+ Button.prototype.toggle = function () {
+ var changed = true
+ var $parent = this.$element.closest('[data-toggle="buttons"]')
+
+ if ($parent.length) {
+ var $input = this.$element.find('input')
+ if ($input.prop('type') == 'radio') {
+ if ($input.prop('checked') && this.$element.hasClass('active')) changed = false
+ else $parent.find('.active').removeClass('active')
+ }
+ if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')
+ } else {
+ this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
+ }
+
+ if (changed) this.$element.toggleClass('active')
+ }
+
+
+ // BUTTON PLUGIN DEFINITION
+ // ========================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.button')
+ var options = typeof option == 'object' && option
+
+ if (!data) $this.data('bs.button', (data = new Button(this, options)))
+
+ if (option == 'toggle') data.toggle()
+ else if (option) data.setState(option)
+ })
+ }
+
+ var old = $.fn.button
+
+ $.fn.button = Plugin
+ $.fn.button.Constructor = Button
+
+
+ // BUTTON NO CONFLICT
+ // ==================
+
+ $.fn.button.noConflict = function () {
+ $.fn.button = old
+ return this
+ }
+
+
+ // BUTTON DATA-API
+ // ===============
+
+ $(document)
+ .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
+ var $btn = $(e.target)
+ if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
+ Plugin.call($btn, 'toggle')
+ e.preventDefault()
+ })
+ .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
+ $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: carousel.js v3.3.1
+ * http://getbootstrap.com/javascript/#carousel
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // CAROUSEL CLASS DEFINITION
+ // =========================
+
+ var Carousel = function (element, options) {
+ this.$element = $(element)
+ this.$indicators = this.$element.find('.carousel-indicators')
+ this.options = options
+ this.paused =
+ this.sliding =
+ this.interval =
+ this.$active =
+ this.$items = null
+
+ this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))
+
+ this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
+ .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
+ .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
+ }
+
+ Carousel.VERSION = '3.3.1'
+
+ Carousel.TRANSITION_DURATION = 600
+
+ Carousel.DEFAULTS = {
+ interval: 5000,
+ pause: 'hover',
+ wrap: true,
+ keyboard: true
+ }
+
+ Carousel.prototype.keydown = function (e) {
+ if (/input|textarea/i.test(e.target.tagName)) return
+ switch (e.which) {
+ case 37: this.prev(); break
+ case 39: this.next(); break
+ default: return
+ }
+
+ e.preventDefault()
+ }
+
+ Carousel.prototype.cycle = function (e) {
+ e || (this.paused = false)
+
+ this.interval && clearInterval(this.interval)
+
+ this.options.interval
+ && !this.paused
+ && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
+
+ return this
+ }
+
+ Carousel.prototype.getItemIndex = function (item) {
+ this.$items = item.parent().children('.item')
+ return this.$items.index(item || this.$active)
+ }
+
+ Carousel.prototype.getItemForDirection = function (direction, active) {
+ var delta = direction == 'prev' ? -1 : 1
+ var activeIndex = this.getItemIndex(active)
+ var itemIndex = (activeIndex + delta) % this.$items.length
+ return this.$items.eq(itemIndex)
+ }
+
+ Carousel.prototype.to = function (pos) {
+ var that = this
+ var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
+
+ if (pos > (this.$items.length - 1) || pos < 0) return
+
+ if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
+ if (activeIndex == pos) return this.pause().cycle()
+
+ return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
+ }
+
+ Carousel.prototype.pause = function (e) {
+ e || (this.paused = true)
+
+ if (this.$element.find('.next, .prev').length && $.support.transition) {
+ this.$element.trigger($.support.transition.end)
+ this.cycle(true)
+ }
+
+ this.interval = clearInterval(this.interval)
+
+ return this
+ }
+
+ Carousel.prototype.next = function () {
+ if (this.sliding) return
+ return this.slide('next')
+ }
+
+ Carousel.prototype.prev = function () {
+ if (this.sliding) return
+ return this.slide('prev')
+ }
+
+ Carousel.prototype.slide = function (type, next) {
+ var $active = this.$element.find('.item.active')
+ var $next = next || this.getItemForDirection(type, $active)
+ var isCycling = this.interval
+ var direction = type == 'next' ? 'left' : 'right'
+ var fallback = type == 'next' ? 'first' : 'last'
+ var that = this
+
+ if (!$next.length) {
+ if (!this.options.wrap) return
+ $next = this.$element.find('.item')[fallback]()
+ }
+
+ if ($next.hasClass('active')) return (this.sliding = false)
+
+ var relatedTarget = $next[0]
+ var slideEvent = $.Event('slide.bs.carousel', {
+ relatedTarget: relatedTarget,
+ direction: direction
+ })
+ this.$element.trigger(slideEvent)
+ if (slideEvent.isDefaultPrevented()) return
+
+ this.sliding = true
+
+ isCycling && this.pause()
+
+ if (this.$indicators.length) {
+ this.$indicators.find('.active').removeClass('active')
+ var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
+ $nextIndicator && $nextIndicator.addClass('active')
+ }
+
+ var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
+ if ($.support.transition && this.$element.hasClass('slide')) {
+ $next.addClass(type)
+ $next[0].offsetWidth // force reflow
+ $active.addClass(direction)
+ $next.addClass(direction)
+ $active
+ .one('bsTransitionEnd', function () {
+ $next.removeClass([type, direction].join(' ')).addClass('active')
+ $active.removeClass(['active', direction].join(' '))
+ that.sliding = false
+ setTimeout(function () {
+ that.$element.trigger(slidEvent)
+ }, 0)
+ })
+ .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
+ } else {
+ $active.removeClass('active')
+ $next.addClass('active')
+ this.sliding = false
+ this.$element.trigger(slidEvent)
+ }
+
+ isCycling && this.cycle()
+
+ return this
+ }
+
+
+ // CAROUSEL PLUGIN DEFINITION
+ // ==========================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.carousel')
+ var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
+ var action = typeof option == 'string' ? option : options.slide
+
+ if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
+ if (typeof option == 'number') data.to(option)
+ else if (action) data[action]()
+ else if (options.interval) data.pause().cycle()
+ })
+ }
+
+ var old = $.fn.carousel
+
+ $.fn.carousel = Plugin
+ $.fn.carousel.Constructor = Carousel
+
+
+ // CAROUSEL NO CONFLICT
+ // ====================
+
+ $.fn.carousel.noConflict = function () {
+ $.fn.carousel = old
+ return this
+ }
+
+
+ // CAROUSEL DATA-API
+ // =================
+
+ var clickHandler = function (e) {
+ var href
+ var $this = $(this)
+ var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
+ if (!$target.hasClass('carousel')) return
+ var options = $.extend({}, $target.data(), $this.data())
+ var slideIndex = $this.attr('data-slide-to')
+ if (slideIndex) options.interval = false
+
+ Plugin.call($target, options)
+
+ if (slideIndex) {
+ $target.data('bs.carousel').to(slideIndex)
+ }
+
+ e.preventDefault()
+ }
+
+ $(document)
+ .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
+ .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)
+
+ $(window).on('load', function () {
+ $('[data-ride="carousel"]').each(function () {
+ var $carousel = $(this)
+ Plugin.call($carousel, $carousel.data())
+ })
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: collapse.js v3.3.1
+ * http://getbootstrap.com/javascript/#collapse
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // COLLAPSE PUBLIC CLASS DEFINITION
+ // ================================
+
+ var Collapse = function (element, options) {
+ this.$element = $(element)
+ this.options = $.extend({}, Collapse.DEFAULTS, options)
+ this.$trigger = $(this.options.trigger).filter('[href="#' + element.id + '"], [data-target="#' + element.id + '"]')
+ this.transitioning = null
+
+ if (this.options.parent) {
+ this.$parent = this.getParent()
+ } else {
+ this.addAriaAndCollapsedClass(this.$element, this.$trigger)
+ }
+
+ if (this.options.toggle) this.toggle()
+ }
+
+ Collapse.VERSION = '3.3.1'
+
+ Collapse.TRANSITION_DURATION = 350
+
+ Collapse.DEFAULTS = {
+ toggle: true,
+ trigger: '[data-toggle="collapse"]'
+ }
+
+ Collapse.prototype.dimension = function () {
+ var hasWidth = this.$element.hasClass('width')
+ return hasWidth ? 'width' : 'height'
+ }
+
+ Collapse.prototype.show = function () {
+ if (this.transitioning || this.$element.hasClass('in')) return
+
+ var activesData
+ var actives = this.$parent && this.$parent.find('> .panel').children('.in, .collapsing')
+
+ if (actives && actives.length) {
+ activesData = actives.data('bs.collapse')
+ if (activesData && activesData.transitioning) return
+ }
+
+ var startEvent = $.Event('show.bs.collapse')
+ this.$element.trigger(startEvent)
+ if (startEvent.isDefaultPrevented()) return
+
+ if (actives && actives.length) {
+ Plugin.call(actives, 'hide')
+ activesData || actives.data('bs.collapse', null)
+ }
+
+ var dimension = this.dimension()
+
+ this.$element
+ .removeClass('collapse')
+ .addClass('collapsing')[dimension](0)
+ .attr('aria-expanded', true)
+
+ this.$trigger
+ .removeClass('collapsed')
+ .attr('aria-expanded', true)
+
+ this.transitioning = 1
+
+ var complete = function () {
+ this.$element
+ .removeClass('collapsing')
+ .addClass('collapse in')[dimension]('')
+ this.transitioning = 0
+ this.$element
+ .trigger('shown.bs.collapse')
+ }
+
+ if (!$.support.transition) return complete.call(this)
+
+ var scrollSize = $.camelCase(['scroll', dimension].join('-'))
+
+ this.$element
+ .one('bsTransitionEnd', $.proxy(complete, this))
+ .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
+ }
+
+ Collapse.prototype.hide = function () {
+ if (this.transitioning || !this.$element.hasClass('in')) return
+
+ var startEvent = $.Event('hide.bs.collapse')
+ this.$element.trigger(startEvent)
+ if (startEvent.isDefaultPrevented()) return
+
+ var dimension = this.dimension()
+
+ this.$element[dimension](this.$element[dimension]())[0].offsetHeight
+
+ this.$element
+ .addClass('collapsing')
+ .removeClass('collapse in')
+ .attr('aria-expanded', false)
+
+ this.$trigger
+ .addClass('collapsed')
+ .attr('aria-expanded', false)
+
+ this.transitioning = 1
+
+ var complete = function () {
+ this.transitioning = 0
+ this.$element
+ .removeClass('collapsing')
+ .addClass('collapse')
+ .trigger('hidden.bs.collapse')
+ }
+
+ if (!$.support.transition) return complete.call(this)
+
+ this.$element
+ [dimension](0)
+ .one('bsTransitionEnd', $.proxy(complete, this))
+ .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
+ }
+
+ Collapse.prototype.toggle = function () {
+ this[this.$element.hasClass('in') ? 'hide' : 'show']()
+ }
+
+ Collapse.prototype.getParent = function () {
+ return $(this.options.parent)
+ .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
+ .each($.proxy(function (i, element) {
+ var $element = $(element)
+ this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
+ }, this))
+ .end()
+ }
+
+ Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
+ var isOpen = $element.hasClass('in')
+
+ $element.attr('aria-expanded', isOpen)
+ $trigger
+ .toggleClass('collapsed', !isOpen)
+ .attr('aria-expanded', isOpen)
+ }
+
+ function getTargetFromTrigger($trigger) {
+ var href
+ var target = $trigger.attr('data-target')
+ || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
+
+ return $(target)
+ }
+
+
+ // COLLAPSE PLUGIN DEFINITION
+ // ==========================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.collapse')
+ var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
+
+ if (!data && options.toggle && option == 'show') options.toggle = false
+ if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ var old = $.fn.collapse
+
+ $.fn.collapse = Plugin
+ $.fn.collapse.Constructor = Collapse
+
+
+ // COLLAPSE NO CONFLICT
+ // ====================
+
+ $.fn.collapse.noConflict = function () {
+ $.fn.collapse = old
+ return this
+ }
+
+
+ // COLLAPSE DATA-API
+ // =================
+
+ $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
+ var $this = $(this)
+
+ if (!$this.attr('data-target')) e.preventDefault()
+
+ var $target = getTargetFromTrigger($this)
+ var data = $target.data('bs.collapse')
+ var option = data ? 'toggle' : $.extend({}, $this.data(), { trigger: this })
+
+ Plugin.call($target, option)
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: dropdown.js v3.3.1
+ * http://getbootstrap.com/javascript/#dropdowns
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // DROPDOWN CLASS DEFINITION
+ // =========================
+
+ var backdrop = '.dropdown-backdrop'
+ var toggle = '[data-toggle="dropdown"]'
+ var Dropdown = function (element) {
+ $(element).on('click.bs.dropdown', this.toggle)
+ }
+
+ Dropdown.VERSION = '3.3.1'
+
+ Dropdown.prototype.toggle = function (e) {
+ var $this = $(this)
+
+ if ($this.is('.disabled, :disabled')) return
+
+ var $parent = getParent($this)
+ var isActive = $parent.hasClass('open')
+
+ clearMenus()
+
+ if (!isActive) {
+ if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
+ // if mobile we use a backdrop because click events don't delegate
+ $('
').insertAfter($(this)).on('click', clearMenus)
+ }
+
+ var relatedTarget = { relatedTarget: this }
+ $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
+
+ if (e.isDefaultPrevented()) return
+
+ $this
+ .trigger('focus')
+ .attr('aria-expanded', 'true')
+
+ $parent
+ .toggleClass('open')
+ .trigger('shown.bs.dropdown', relatedTarget)
+ }
+
+ return false
+ }
+
+ Dropdown.prototype.keydown = function (e) {
+ if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return
+
+ var $this = $(this)
+
+ e.preventDefault()
+ e.stopPropagation()
+
+ if ($this.is('.disabled, :disabled')) return
+
+ var $parent = getParent($this)
+ var isActive = $parent.hasClass('open')
+
+ if ((!isActive && e.which != 27) || (isActive && e.which == 27)) {
+ if (e.which == 27) $parent.find(toggle).trigger('focus')
+ return $this.trigger('click')
+ }
+
+ var desc = ' li:not(.divider):visible a'
+ var $items = $parent.find('[role="menu"]' + desc + ', [role="listbox"]' + desc)
+
+ if (!$items.length) return
+
+ var index = $items.index(e.target)
+
+ if (e.which == 38 && index > 0) index-- // up
+ if (e.which == 40 && index < $items.length - 1) index++ // down
+ if (!~index) index = 0
+
+ $items.eq(index).trigger('focus')
+ }
+
+ function clearMenus(e) {
+ if (e && e.which === 3) return
+ $(backdrop).remove()
+ $(toggle).each(function () {
+ var $this = $(this)
+ var $parent = getParent($this)
+ var relatedTarget = { relatedTarget: this }
+
+ if (!$parent.hasClass('open')) return
+
+ $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
+
+ if (e.isDefaultPrevented()) return
+
+ $this.attr('aria-expanded', 'false')
+ $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
+ })
+ }
+
+ function getParent($this) {
+ var selector = $this.attr('data-target')
+
+ if (!selector) {
+ selector = $this.attr('href')
+ selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+ }
+
+ var $parent = selector && $(selector)
+
+ return $parent && $parent.length ? $parent : $this.parent()
+ }
+
+
+ // DROPDOWN PLUGIN DEFINITION
+ // ==========================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.dropdown')
+
+ if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
+ if (typeof option == 'string') data[option].call($this)
+ })
+ }
+
+ var old = $.fn.dropdown
+
+ $.fn.dropdown = Plugin
+ $.fn.dropdown.Constructor = Dropdown
+
+
+ // DROPDOWN NO CONFLICT
+ // ====================
+
+ $.fn.dropdown.noConflict = function () {
+ $.fn.dropdown = old
+ return this
+ }
+
+
+ // APPLY TO STANDARD DROPDOWN ELEMENTS
+ // ===================================
+
+ $(document)
+ .on('click.bs.dropdown.data-api', clearMenus)
+ .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
+ .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
+ .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
+ .on('keydown.bs.dropdown.data-api', '[role="menu"]', Dropdown.prototype.keydown)
+ .on('keydown.bs.dropdown.data-api', '[role="listbox"]', Dropdown.prototype.keydown)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: modal.js v3.3.1
+ * http://getbootstrap.com/javascript/#modals
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // MODAL CLASS DEFINITION
+ // ======================
+
+ var Modal = function (element, options) {
+ this.options = options
+ this.$body = $(document.body)
+ this.$element = $(element)
+ this.$backdrop =
+ this.isShown = null
+ this.scrollbarWidth = 0
+
+ if (this.options.remote) {
+ this.$element
+ .find('.modal-content')
+ .load(this.options.remote, $.proxy(function () {
+ this.$element.trigger('loaded.bs.modal')
+ }, this))
+ }
+ }
+
+ Modal.VERSION = '3.3.1'
+
+ Modal.TRANSITION_DURATION = 300
+ Modal.BACKDROP_TRANSITION_DURATION = 150
+
+ Modal.DEFAULTS = {
+ backdrop: true,
+ keyboard: true,
+ show: true
+ }
+
+ Modal.prototype.toggle = function (_relatedTarget) {
+ return this.isShown ? this.hide() : this.show(_relatedTarget)
+ }
+
+ Modal.prototype.show = function (_relatedTarget) {
+ var that = this
+ var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
+
+ this.$element.trigger(e)
+
+ if (this.isShown || e.isDefaultPrevented()) return
+
+ this.isShown = true
+
+ this.checkScrollbar()
+ this.setScrollbar()
+ this.$body.addClass('modal-open')
+
+ this.escape()
+ this.resize()
+
+ this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
+
+ this.backdrop(function () {
+ var transition = $.support.transition && that.$element.hasClass('fade')
+
+ if (!that.$element.parent().length) {
+ that.$element.appendTo(that.$body) // don't move modals dom position
+ }
+
+ that.$element
+ .show()
+ .scrollTop(0)
+
+ if (that.options.backdrop) that.adjustBackdrop()
+ that.adjustDialog()
+
+ if (transition) {
+ that.$element[0].offsetWidth // force reflow
+ }
+
+ that.$element
+ .addClass('in')
+ .attr('aria-hidden', false)
+
+ that.enforceFocus()
+
+ var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
+
+ transition ?
+ that.$element.find('.modal-dialog') // wait for modal to slide in
+ .one('bsTransitionEnd', function () {
+ that.$element.trigger('focus').trigger(e)
+ })
+ .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
+ that.$element.trigger('focus').trigger(e)
+ })
+ }
+
+ Modal.prototype.hide = function (e) {
+ if (e) e.preventDefault()
+
+ e = $.Event('hide.bs.modal')
+
+ this.$element.trigger(e)
+
+ if (!this.isShown || e.isDefaultPrevented()) return
+
+ this.isShown = false
+
+ this.escape()
+ this.resize()
+
+ $(document).off('focusin.bs.modal')
+
+ this.$element
+ .removeClass('in')
+ .attr('aria-hidden', true)
+ .off('click.dismiss.bs.modal')
+
+ $.support.transition && this.$element.hasClass('fade') ?
+ this.$element
+ .one('bsTransitionEnd', $.proxy(this.hideModal, this))
+ .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
+ this.hideModal()
+ }
+
+ Modal.prototype.enforceFocus = function () {
+ $(document)
+ .off('focusin.bs.modal') // guard against infinite focus loop
+ .on('focusin.bs.modal', $.proxy(function (e) {
+ if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
+ this.$element.trigger('focus')
+ }
+ }, this))
+ }
+
+ Modal.prototype.escape = function () {
+ if (this.isShown && this.options.keyboard) {
+ this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
+ e.which == 27 && this.hide()
+ }, this))
+ } else if (!this.isShown) {
+ this.$element.off('keydown.dismiss.bs.modal')
+ }
+ }
+
+ Modal.prototype.resize = function () {
+ if (this.isShown) {
+ $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
+ } else {
+ $(window).off('resize.bs.modal')
+ }
+ }
+
+ Modal.prototype.hideModal = function () {
+ var that = this
+ this.$element.hide()
+ this.backdrop(function () {
+ that.$body.removeClass('modal-open')
+ that.resetAdjustments()
+ that.resetScrollbar()
+ that.$element.trigger('hidden.bs.modal')
+ })
+ }
+
+ Modal.prototype.removeBackdrop = function () {
+ this.$backdrop && this.$backdrop.remove()
+ this.$backdrop = null
+ }
+
+ Modal.prototype.backdrop = function (callback) {
+ var that = this
+ var animate = this.$element.hasClass('fade') ? 'fade' : ''
+
+ if (this.isShown && this.options.backdrop) {
+ var doAnimate = $.support.transition && animate
+
+ this.$backdrop = $('
')
+ .prependTo(this.$element)
+ .on('click.dismiss.bs.modal', $.proxy(function (e) {
+ if (e.target !== e.currentTarget) return
+ this.options.backdrop == 'static'
+ ? this.$element[0].focus.call(this.$element[0])
+ : this.hide.call(this)
+ }, this))
+
+ if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
+
+ this.$backdrop.addClass('in')
+
+ if (!callback) return
+
+ doAnimate ?
+ this.$backdrop
+ .one('bsTransitionEnd', callback)
+ .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
+ callback()
+
+ } else if (!this.isShown && this.$backdrop) {
+ this.$backdrop.removeClass('in')
+
+ var callbackRemove = function () {
+ that.removeBackdrop()
+ callback && callback()
+ }
+ $.support.transition && this.$element.hasClass('fade') ?
+ this.$backdrop
+ .one('bsTransitionEnd', callbackRemove)
+ .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
+ callbackRemove()
+
+ } else if (callback) {
+ callback()
+ }
+ }
+
+ // these following methods are used to handle overflowing modals
+
+ Modal.prototype.handleUpdate = function () {
+ if (this.options.backdrop) this.adjustBackdrop()
+ this.adjustDialog()
+ }
+
+ Modal.prototype.adjustBackdrop = function () {
+ this.$backdrop
+ .css('height', 0)
+ .css('height', this.$element[0].scrollHeight)
+ }
+
+ Modal.prototype.adjustDialog = function () {
+ var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
+
+ this.$element.css({
+ paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
+ paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
+ })
+ }
+
+ Modal.prototype.resetAdjustments = function () {
+ this.$element.css({
+ paddingLeft: '',
+ paddingRight: ''
+ })
+ }
+
+ Modal.prototype.checkScrollbar = function () {
+ this.bodyIsOverflowing = document.body.scrollHeight > document.documentElement.clientHeight
+ this.scrollbarWidth = this.measureScrollbar()
+ }
+
+ Modal.prototype.setScrollbar = function () {
+ var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
+ if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
+ }
+
+ Modal.prototype.resetScrollbar = function () {
+ this.$body.css('padding-right', '')
+ }
+
+ Modal.prototype.measureScrollbar = function () { // thx walsh
+ var scrollDiv = document.createElement('div')
+ scrollDiv.className = 'modal-scrollbar-measure'
+ this.$body.append(scrollDiv)
+ var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
+ this.$body[0].removeChild(scrollDiv)
+ return scrollbarWidth
+ }
+
+
+ // MODAL PLUGIN DEFINITION
+ // =======================
+
+ function Plugin(option, _relatedTarget) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.modal')
+ var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
+
+ if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
+ if (typeof option == 'string') data[option](_relatedTarget)
+ else if (options.show) data.show(_relatedTarget)
+ })
+ }
+
+ var old = $.fn.modal
+
+ $.fn.modal = Plugin
+ $.fn.modal.Constructor = Modal
+
+
+ // MODAL NO CONFLICT
+ // =================
+
+ $.fn.modal.noConflict = function () {
+ $.fn.modal = old
+ return this
+ }
+
+
+ // MODAL DATA-API
+ // ==============
+
+ $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
+ var $this = $(this)
+ var href = $this.attr('href')
+ var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
+ var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
+
+ if ($this.is('a')) e.preventDefault()
+
+ $target.one('show.bs.modal', function (showEvent) {
+ if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
+ $target.one('hidden.bs.modal', function () {
+ $this.is(':visible') && $this.trigger('focus')
+ })
+ })
+ Plugin.call($target, option, this)
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: tooltip.js v3.3.1
+ * http://getbootstrap.com/javascript/#tooltip
+ * Inspired by the original jQuery.tipsy by Jason Frame
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // TOOLTIP PUBLIC CLASS DEFINITION
+ // ===============================
+
+ var Tooltip = function (element, options) {
+ this.type =
+ this.options =
+ this.enabled =
+ this.timeout =
+ this.hoverState =
+ this.$element = null
+
+ this.init('tooltip', element, options)
+ }
+
+ Tooltip.VERSION = '3.3.1'
+
+ Tooltip.TRANSITION_DURATION = 150
+
+ Tooltip.DEFAULTS = {
+ animation: true,
+ placement: 'top',
+ selector: false,
+ template: '
',
+ trigger: 'hover focus',
+ title: '',
+ delay: 0,
+ html: false,
+ container: false,
+ viewport: {
+ selector: 'body',
+ padding: 0
+ }
+ }
+
+ Tooltip.prototype.init = function (type, element, options) {
+ this.enabled = true
+ this.type = type
+ this.$element = $(element)
+ this.options = this.getOptions(options)
+ this.$viewport = this.options.viewport && $(this.options.viewport.selector || this.options.viewport)
+
+ var triggers = this.options.trigger.split(' ')
+
+ for (var i = triggers.length; i--;) {
+ var trigger = triggers[i]
+
+ if (trigger == 'click') {
+ this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
+ } else if (trigger != 'manual') {
+ var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin'
+ var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
+
+ this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
+ this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
+ }
+ }
+
+ this.options.selector ?
+ (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
+ this.fixTitle()
+ }
+
+ Tooltip.prototype.getDefaults = function () {
+ return Tooltip.DEFAULTS
+ }
+
+ Tooltip.prototype.getOptions = function (options) {
+ options = $.extend({}, this.getDefaults(), this.$element.data(), options)
+
+ if (options.delay && typeof options.delay == 'number') {
+ options.delay = {
+ show: options.delay,
+ hide: options.delay
+ }
+ }
+
+ return options
+ }
+
+ Tooltip.prototype.getDelegateOptions = function () {
+ var options = {}
+ var defaults = this.getDefaults()
+
+ this._options && $.each(this._options, function (key, value) {
+ if (defaults[key] != value) options[key] = value
+ })
+
+ return options
+ }
+
+ Tooltip.prototype.enter = function (obj) {
+ var self = obj instanceof this.constructor ?
+ obj : $(obj.currentTarget).data('bs.' + this.type)
+
+ if (self && self.$tip && self.$tip.is(':visible')) {
+ self.hoverState = 'in'
+ return
+ }
+
+ if (!self) {
+ self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
+ $(obj.currentTarget).data('bs.' + this.type, self)
+ }
+
+ clearTimeout(self.timeout)
+
+ self.hoverState = 'in'
+
+ if (!self.options.delay || !self.options.delay.show) return self.show()
+
+ self.timeout = setTimeout(function () {
+ if (self.hoverState == 'in') self.show()
+ }, self.options.delay.show)
+ }
+
+ Tooltip.prototype.leave = function (obj) {
+ var self = obj instanceof this.constructor ?
+ obj : $(obj.currentTarget).data('bs.' + this.type)
+
+ if (!self) {
+ self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
+ $(obj.currentTarget).data('bs.' + this.type, self)
+ }
+
+ clearTimeout(self.timeout)
+
+ self.hoverState = 'out'
+
+ if (!self.options.delay || !self.options.delay.hide) return self.hide()
+
+ self.timeout = setTimeout(function () {
+ if (self.hoverState == 'out') self.hide()
+ }, self.options.delay.hide)
+ }
+
+ Tooltip.prototype.show = function () {
+ var e = $.Event('show.bs.' + this.type)
+
+ if (this.hasContent() && this.enabled) {
+ this.$element.trigger(e)
+
+ var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
+ if (e.isDefaultPrevented() || !inDom) return
+ var that = this
+
+ var $tip = this.tip()
+
+ var tipId = this.getUID(this.type)
+
+ this.setContent()
+ $tip.attr('id', tipId)
+ this.$element.attr('aria-describedby', tipId)
+
+ if (this.options.animation) $tip.addClass('fade')
+
+ var placement = typeof this.options.placement == 'function' ?
+ this.options.placement.call(this, $tip[0], this.$element[0]) :
+ this.options.placement
+
+ var autoToken = /\s?auto?\s?/i
+ var autoPlace = autoToken.test(placement)
+ if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
+
+ $tip
+ .detach()
+ .css({ top: 0, left: 0, display: 'block' })
+ .addClass(placement)
+ .data('bs.' + this.type, this)
+
+ this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
+
+ var pos = this.getPosition()
+ var actualWidth = $tip[0].offsetWidth
+ var actualHeight = $tip[0].offsetHeight
+
+ if (autoPlace) {
+ var orgPlacement = placement
+ var $container = this.options.container ? $(this.options.container) : this.$element.parent()
+ var containerDim = this.getPosition($container)
+
+ placement = placement == 'bottom' && pos.bottom + actualHeight > containerDim.bottom ? 'top' :
+ placement == 'top' && pos.top - actualHeight < containerDim.top ? 'bottom' :
+ placement == 'right' && pos.right + actualWidth > containerDim.width ? 'left' :
+ placement == 'left' && pos.left - actualWidth < containerDim.left ? 'right' :
+ placement
+
+ $tip
+ .removeClass(orgPlacement)
+ .addClass(placement)
+ }
+
+ var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
+
+ this.applyPlacement(calculatedOffset, placement)
+
+ var complete = function () {
+ var prevHoverState = that.hoverState
+ that.$element.trigger('shown.bs.' + that.type)
+ that.hoverState = null
+
+ if (prevHoverState == 'out') that.leave(that)
+ }
+
+ $.support.transition && this.$tip.hasClass('fade') ?
+ $tip
+ .one('bsTransitionEnd', complete)
+ .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
+ complete()
+ }
+ }
+
+ Tooltip.prototype.applyPlacement = function (offset, placement) {
+ var $tip = this.tip()
+ var width = $tip[0].offsetWidth
+ var height = $tip[0].offsetHeight
+
+ // manually read margins because getBoundingClientRect includes difference
+ var marginTop = parseInt($tip.css('margin-top'), 10)
+ var marginLeft = parseInt($tip.css('margin-left'), 10)
+
+ // we must check for NaN for ie 8/9
+ if (isNaN(marginTop)) marginTop = 0
+ if (isNaN(marginLeft)) marginLeft = 0
+
+ offset.top = offset.top + marginTop
+ offset.left = offset.left + marginLeft
+
+ // $.fn.offset doesn't round pixel values
+ // so we use setOffset directly with our own function B-0
+ $.offset.setOffset($tip[0], $.extend({
+ using: function (props) {
+ $tip.css({
+ top: Math.round(props.top),
+ left: Math.round(props.left)
+ })
+ }
+ }, offset), 0)
+
+ $tip.addClass('in')
+
+ // check to see if placing tip in new offset caused the tip to resize itself
+ var actualWidth = $tip[0].offsetWidth
+ var actualHeight = $tip[0].offsetHeight
+
+ if (placement == 'top' && actualHeight != height) {
+ offset.top = offset.top + height - actualHeight
+ }
+
+ var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
+
+ if (delta.left) offset.left += delta.left
+ else offset.top += delta.top
+
+ var isVertical = /top|bottom/.test(placement)
+ var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
+ var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'
+
+ $tip.offset(offset)
+ this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
+ }
+
+ Tooltip.prototype.replaceArrow = function (delta, dimension, isHorizontal) {
+ this.arrow()
+ .css(isHorizontal ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
+ .css(isHorizontal ? 'top' : 'left', '')
+ }
+
+ Tooltip.prototype.setContent = function () {
+ var $tip = this.tip()
+ var title = this.getTitle()
+
+ $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
+ $tip.removeClass('fade in top bottom left right')
+ }
+
+ Tooltip.prototype.hide = function (callback) {
+ var that = this
+ var $tip = this.tip()
+ var e = $.Event('hide.bs.' + this.type)
+
+ function complete() {
+ if (that.hoverState != 'in') $tip.detach()
+ that.$element
+ .removeAttr('aria-describedby')
+ .trigger('hidden.bs.' + that.type)
+ callback && callback()
+ }
+
+ this.$element.trigger(e)
+
+ if (e.isDefaultPrevented()) return
+
+ $tip.removeClass('in')
+
+ $.support.transition && this.$tip.hasClass('fade') ?
+ $tip
+ .one('bsTransitionEnd', complete)
+ .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
+ complete()
+
+ this.hoverState = null
+
+ return this
+ }
+
+ Tooltip.prototype.fixTitle = function () {
+ var $e = this.$element
+ if ($e.attr('title') || typeof ($e.attr('data-original-title')) != 'string') {
+ $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
+ }
+ }
+
+ Tooltip.prototype.hasContent = function () {
+ return this.getTitle()
+ }
+
+ Tooltip.prototype.getPosition = function ($element) {
+ $element = $element || this.$element
+
+ var el = $element[0]
+ var isBody = el.tagName == 'BODY'
+
+ var elRect = el.getBoundingClientRect()
+ if (elRect.width == null) {
+ // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
+ elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
+ }
+ var elOffset = isBody ? { top: 0, left: 0 } : $element.offset()
+ var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
+ var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
+
+ return $.extend({}, elRect, scroll, outerDims, elOffset)
+ }
+
+ Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
+ return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } :
+ placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
+ placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
+ /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
+
+ }
+
+ Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
+ var delta = { top: 0, left: 0 }
+ if (!this.$viewport) return delta
+
+ var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
+ var viewportDimensions = this.getPosition(this.$viewport)
+
+ if (/right|left/.test(placement)) {
+ var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll
+ var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
+ if (topEdgeOffset < viewportDimensions.top) { // top overflow
+ delta.top = viewportDimensions.top - topEdgeOffset
+ } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
+ delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
+ }
+ } else {
+ var leftEdgeOffset = pos.left - viewportPadding
+ var rightEdgeOffset = pos.left + viewportPadding + actualWidth
+ if (leftEdgeOffset < viewportDimensions.left) { // left overflow
+ delta.left = viewportDimensions.left - leftEdgeOffset
+ } else if (rightEdgeOffset > viewportDimensions.width) { // right overflow
+ delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
+ }
+ }
+
+ return delta
+ }
+
+ Tooltip.prototype.getTitle = function () {
+ var title
+ var $e = this.$element
+ var o = this.options
+
+ title = $e.attr('data-original-title')
+ || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
+
+ return title
+ }
+
+ Tooltip.prototype.getUID = function (prefix) {
+ do prefix += ~~(Math.random() * 1000000)
+ while (document.getElementById(prefix))
+ return prefix
+ }
+
+ Tooltip.prototype.tip = function () {
+ return (this.$tip = this.$tip || $(this.options.template))
+ }
+
+ Tooltip.prototype.arrow = function () {
+ return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
+ }
+
+ Tooltip.prototype.enable = function () {
+ this.enabled = true
+ }
+
+ Tooltip.prototype.disable = function () {
+ this.enabled = false
+ }
+
+ Tooltip.prototype.toggleEnabled = function () {
+ this.enabled = !this.enabled
+ }
+
+ Tooltip.prototype.toggle = function (e) {
+ var self = this
+ if (e) {
+ self = $(e.currentTarget).data('bs.' + this.type)
+ if (!self) {
+ self = new this.constructor(e.currentTarget, this.getDelegateOptions())
+ $(e.currentTarget).data('bs.' + this.type, self)
+ }
+ }
+
+ self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
+ }
+
+ Tooltip.prototype.destroy = function () {
+ var that = this
+ clearTimeout(this.timeout)
+ this.hide(function () {
+ that.$element.off('.' + that.type).removeData('bs.' + that.type)
+ })
+ }
+
+
+ // TOOLTIP PLUGIN DEFINITION
+ // =========================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.tooltip')
+ var options = typeof option == 'object' && option
+ var selector = options && options.selector
+
+ if (!data && option == 'destroy') return
+ if (selector) {
+ if (!data) $this.data('bs.tooltip', (data = {}))
+ if (!data[selector]) data[selector] = new Tooltip(this, options)
+ } else {
+ if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
+ }
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ var old = $.fn.tooltip
+
+ $.fn.tooltip = Plugin
+ $.fn.tooltip.Constructor = Tooltip
+
+
+ // TOOLTIP NO CONFLICT
+ // ===================
+
+ $.fn.tooltip.noConflict = function () {
+ $.fn.tooltip = old
+ return this
+ }
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: popover.js v3.3.1
+ * http://getbootstrap.com/javascript/#popovers
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // POPOVER PUBLIC CLASS DEFINITION
+ // ===============================
+
+ var Popover = function (element, options) {
+ this.init('popover', element, options)
+ }
+
+ if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
+
+ Popover.VERSION = '3.3.1'
+
+ Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
+ placement: 'right',
+ trigger: 'click',
+ content: '',
+ template: '
'
+ })
+
+
+ // NOTE: POPOVER EXTENDS tooltip.js
+ // ================================
+
+ Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
+
+ Popover.prototype.constructor = Popover
+
+ Popover.prototype.getDefaults = function () {
+ return Popover.DEFAULTS
+ }
+
+ Popover.prototype.setContent = function () {
+ var $tip = this.tip()
+ var title = this.getTitle()
+ var content = this.getContent()
+
+ $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
+ $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events
+ this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
+ ](content)
+
+ $tip.removeClass('fade top bottom left right in')
+
+ // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
+ // this manually by checking the contents.
+ if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
+ }
+
+ Popover.prototype.hasContent = function () {
+ return this.getTitle() || this.getContent()
+ }
+
+ Popover.prototype.getContent = function () {
+ var $e = this.$element
+ var o = this.options
+
+ return $e.attr('data-content')
+ || (typeof o.content == 'function' ?
+ o.content.call($e[0]) :
+ o.content)
+ }
+
+ Popover.prototype.arrow = function () {
+ return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
+ }
+
+ Popover.prototype.tip = function () {
+ if (!this.$tip) this.$tip = $(this.options.template)
+ return this.$tip
+ }
+
+
+ // POPOVER PLUGIN DEFINITION
+ // =========================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.popover')
+ var options = typeof option == 'object' && option
+ var selector = options && options.selector
+
+ if (!data && option == 'destroy') return
+ if (selector) {
+ if (!data) $this.data('bs.popover', (data = {}))
+ if (!data[selector]) data[selector] = new Popover(this, options)
+ } else {
+ if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
+ }
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ var old = $.fn.popover
+
+ $.fn.popover = Plugin
+ $.fn.popover.Constructor = Popover
+
+
+ // POPOVER NO CONFLICT
+ // ===================
+
+ $.fn.popover.noConflict = function () {
+ $.fn.popover = old
+ return this
+ }
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: scrollspy.js v3.3.1
+ * http://getbootstrap.com/javascript/#scrollspy
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // SCROLLSPY CLASS DEFINITION
+ // ==========================
+
+ function ScrollSpy(element, options) {
+ var process = $.proxy(this.process, this)
+
+ this.$body = $('body')
+ this.$scrollElement = $(element).is('body') ? $(window) : $(element)
+ this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
+ this.selector = (this.options.target || '') + ' .nav li > a'
+ this.offsets = []
+ this.targets = []
+ this.activeTarget = null
+ this.scrollHeight = 0
+
+ this.$scrollElement.on('scroll.bs.scrollspy', process)
+ this.refresh()
+ this.process()
+ }
+
+ ScrollSpy.VERSION = '3.3.1'
+
+ ScrollSpy.DEFAULTS = {
+ offset: 10
+ }
+
+ ScrollSpy.prototype.getScrollHeight = function () {
+ return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
+ }
+
+ ScrollSpy.prototype.refresh = function () {
+ var offsetMethod = 'offset'
+ var offsetBase = 0
+
+ if (!$.isWindow(this.$scrollElement[0])) {
+ offsetMethod = 'position'
+ offsetBase = this.$scrollElement.scrollTop()
+ }
+
+ this.offsets = []
+ this.targets = []
+ this.scrollHeight = this.getScrollHeight()
+
+ var self = this
+
+ this.$body
+ .find(this.selector)
+ .map(function () {
+ var $el = $(this)
+ var href = $el.data('target') || $el.attr('href')
+ var $href = /^#./.test(href) && $(href)
+
+ return ($href
+ && $href.length
+ && $href.is(':visible')
+ && [[$href[offsetMethod]().top + offsetBase, href]]) || null
+ })
+ .sort(function (a, b) { return a[0] - b[0] })
+ .each(function () {
+ self.offsets.push(this[0])
+ self.targets.push(this[1])
+ })
+ }
+
+ ScrollSpy.prototype.process = function () {
+ var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
+ var scrollHeight = this.getScrollHeight()
+ var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height()
+ var offsets = this.offsets
+ var targets = this.targets
+ var activeTarget = this.activeTarget
+ var i
+
+ if (this.scrollHeight != scrollHeight) {
+ this.refresh()
+ }
+
+ if (scrollTop >= maxScroll) {
+ return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
+ }
+
+ if (activeTarget && scrollTop < offsets[0]) {
+ this.activeTarget = null
+ return this.clear()
+ }
+
+ for (i = offsets.length; i--;) {
+ activeTarget != targets[i]
+ && scrollTop >= offsets[i]
+ && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
+ && this.activate(targets[i])
+ }
+ }
+
+ ScrollSpy.prototype.activate = function (target) {
+ this.activeTarget = target
+
+ this.clear()
+
+ var selector = this.selector +
+ '[data-target="' + target + '"],' +
+ this.selector + '[href="' + target + '"]'
+
+ var active = $(selector)
+ .parents('li')
+ .addClass('active')
+
+ if (active.parent('.dropdown-menu').length) {
+ active = active
+ .closest('li.dropdown')
+ .addClass('active')
+ }
+
+ active.trigger('activate.bs.scrollspy')
+ }
+
+ ScrollSpy.prototype.clear = function () {
+ $(this.selector)
+ .parentsUntil(this.options.target, '.active')
+ .removeClass('active')
+ }
+
+
+ // SCROLLSPY PLUGIN DEFINITION
+ // ===========================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.scrollspy')
+ var options = typeof option == 'object' && option
+
+ if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ var old = $.fn.scrollspy
+
+ $.fn.scrollspy = Plugin
+ $.fn.scrollspy.Constructor = ScrollSpy
+
+
+ // SCROLLSPY NO CONFLICT
+ // =====================
+
+ $.fn.scrollspy.noConflict = function () {
+ $.fn.scrollspy = old
+ return this
+ }
+
+
+ // SCROLLSPY DATA-API
+ // ==================
+
+ $(window).on('load.bs.scrollspy.data-api', function () {
+ $('[data-spy="scroll"]').each(function () {
+ var $spy = $(this)
+ Plugin.call($spy, $spy.data())
+ })
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: tab.js v3.3.1
+ * http://getbootstrap.com/javascript/#tabs
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // TAB CLASS DEFINITION
+ // ====================
+
+ var Tab = function (element) {
+ this.element = $(element)
+ }
+
+ Tab.VERSION = '3.3.1'
+
+ Tab.TRANSITION_DURATION = 150
+
+ Tab.prototype.show = function () {
+ var $this = this.element
+ var $ul = $this.closest('ul:not(.dropdown-menu)')
+ var selector = $this.data('target')
+
+ if (!selector) {
+ selector = $this.attr('href')
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+ }
+
+ if ($this.parent('li').hasClass('active')) return
+
+ var $previous = $ul.find('.active:last a')
+ var hideEvent = $.Event('hide.bs.tab', {
+ relatedTarget: $this[0]
+ })
+ var showEvent = $.Event('show.bs.tab', {
+ relatedTarget: $previous[0]
+ })
+
+ $previous.trigger(hideEvent)
+ $this.trigger(showEvent)
+
+ if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
+
+ var $target = $(selector)
+
+ this.activate($this.closest('li'), $ul)
+ this.activate($target, $target.parent(), function () {
+ $previous.trigger({
+ type: 'hidden.bs.tab',
+ relatedTarget: $this[0]
+ })
+ $this.trigger({
+ type: 'shown.bs.tab',
+ relatedTarget: $previous[0]
+ })
+ })
+ }
+
+ Tab.prototype.activate = function (element, container, callback) {
+ var $active = container.find('> .active')
+ var transition = callback
+ && $.support.transition
+ && (($active.length && $active.hasClass('fade')) || !!container.find('> .fade').length)
+
+ function next() {
+ $active
+ .removeClass('active')
+ .find('> .dropdown-menu > .active')
+ .removeClass('active')
+ .end()
+ .find('[data-toggle="tab"]')
+ .attr('aria-expanded', false)
+
+ element
+ .addClass('active')
+ .find('[data-toggle="tab"]')
+ .attr('aria-expanded', true)
+
+ if (transition) {
+ element[0].offsetWidth // reflow for transition
+ element.addClass('in')
+ } else {
+ element.removeClass('fade')
+ }
+
+ if (element.parent('.dropdown-menu')) {
+ element
+ .closest('li.dropdown')
+ .addClass('active')
+ .end()
+ .find('[data-toggle="tab"]')
+ .attr('aria-expanded', true)
+ }
+
+ callback && callback()
+ }
+
+ $active.length && transition ?
+ $active
+ .one('bsTransitionEnd', next)
+ .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
+ next()
+
+ $active.removeClass('in')
+ }
+
+
+ // TAB PLUGIN DEFINITION
+ // =====================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.tab')
+
+ if (!data) $this.data('bs.tab', (data = new Tab(this)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ var old = $.fn.tab
+
+ $.fn.tab = Plugin
+ $.fn.tab.Constructor = Tab
+
+
+ // TAB NO CONFLICT
+ // ===============
+
+ $.fn.tab.noConflict = function () {
+ $.fn.tab = old
+ return this
+ }
+
+
+ // TAB DATA-API
+ // ============
+
+ var clickHandler = function (e) {
+ e.preventDefault()
+ Plugin.call($(this), 'show')
+ }
+
+ $(document)
+ .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
+ .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: affix.js v3.3.1
+ * http://getbootstrap.com/javascript/#affix
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // AFFIX CLASS DEFINITION
+ // ======================
+
+ var Affix = function (element, options) {
+ this.options = $.extend({}, Affix.DEFAULTS, options)
+
+ this.$target = $(this.options.target)
+ .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
+ .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
+
+ this.$element = $(element)
+ this.affixed =
+ this.unpin =
+ this.pinnedOffset = null
+
+ this.checkPosition()
+ }
+
+ Affix.VERSION = '3.3.1'
+
+ Affix.RESET = 'affix affix-top affix-bottom'
+
+ Affix.DEFAULTS = {
+ offset: 0,
+ target: window
+ }
+
+ Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
+ var scrollTop = this.$target.scrollTop()
+ var position = this.$element.offset()
+ var targetHeight = this.$target.height()
+
+ if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false
+
+ if (this.affixed == 'bottom') {
+ if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
+ return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
+ }
+
+ var initializing = this.affixed == null
+ var colliderTop = initializing ? scrollTop : position.top
+ var colliderHeight = initializing ? targetHeight : height
+
+ if (offsetTop != null && colliderTop <= offsetTop) return 'top'
+ if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'
+
+ return false
+ }
+
+ Affix.prototype.getPinnedOffset = function () {
+ if (this.pinnedOffset) return this.pinnedOffset
+ this.$element.removeClass(Affix.RESET).addClass('affix')
+ var scrollTop = this.$target.scrollTop()
+ var position = this.$element.offset()
+ return (this.pinnedOffset = position.top - scrollTop)
+ }
+
+ Affix.prototype.checkPositionWithEventLoop = function () {
+ setTimeout($.proxy(this.checkPosition, this), 1)
+ }
+
+ Affix.prototype.checkPosition = function () {
+ if (!this.$element.is(':visible')) return
+
+ var height = this.$element.height()
+ var offset = this.options.offset
+ var offsetTop = offset.top
+ var offsetBottom = offset.bottom
+ var scrollHeight = $('body').height()
+
+ if (typeof offset != 'object') offsetBottom = offsetTop = offset
+ if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element)
+ if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
+
+ var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
+
+ if (this.affixed != affix) {
+ if (this.unpin != null) this.$element.css('top', '')
+
+ var affixType = 'affix' + (affix ? '-' + affix : '')
+ var e = $.Event(affixType + '.bs.affix')
+
+ this.$element.trigger(e)
+
+ if (e.isDefaultPrevented()) return
+
+ this.affixed = affix
+ this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
+
+ this.$element
+ .removeClass(Affix.RESET)
+ .addClass(affixType)
+ .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
+ }
+
+ if (affix == 'bottom') {
+ this.$element.offset({
+ top: scrollHeight - height - offsetBottom
+ })
+ }
+ }
+
+
+ // AFFIX PLUGIN DEFINITION
+ // =======================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.affix')
+ var options = typeof option == 'object' && option
+
+ if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ var old = $.fn.affix
+
+ $.fn.affix = Plugin
+ $.fn.affix.Constructor = Affix
+
+
+ // AFFIX NO CONFLICT
+ // =================
+
+ $.fn.affix.noConflict = function () {
+ $.fn.affix = old
+ return this
+ }
+
+
+ // AFFIX DATA-API
+ // ==============
+
+ $(window).on('load', function () {
+ $('[data-spy="affix"]').each(function () {
+ var $spy = $(this)
+ var data = $spy.data()
+
+ data.offset = data.offset || {}
+
+ if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
+ if (data.offsetTop != null) data.offset.top = data.offsetTop
+
+ Plugin.call($spy, data)
+ })
+ })
+
+}(jQuery);
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/js/bootstrap.min.js b/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/js/bootstrap.min.js
new file mode 100755
index 0000000..d839865
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/js/bootstrap.min.js
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v3.3.1 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.1",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.1",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active"));a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.1",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c="prev"==a?-1:1,d=this.getItemIndex(b),e=(d+c)%this.$items.length;return this.$items.eq(e)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i="next"==b?"first":"last",j=this;if(!f.length){if(!this.options.wrap)return;f=this.$element.find(".item")[i]()}if(f.hasClass("active"))return this.sliding=!1;var k=f[0],l=a.Event("slide.bs.carousel",{relatedTarget:k,direction:h});if(this.$element.trigger(l),!l.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var m=a(this.$indicators.children()[this.getItemIndex(f)]);m&&m.addClass("active")}var n=a.Event("slid.bs.carousel",{relatedTarget:k,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),j.sliding=!1,setTimeout(function(){j.$element.trigger(n)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(n)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&"show"==b&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a(this.options.trigger).filter('[href="#'+b.id+'"], [data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.1",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0,trigger:'[data-toggle="collapse"]'},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.find("> .panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":a.extend({},e.data(),{trigger:this});c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=c(d),f={relatedTarget:this};e.hasClass("open")&&(e.trigger(b=a.Event("hide.bs.dropdown",f)),b.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f)))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.1",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('
').insertAfter(a(this)).on("click",b);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(b){if(/(38|40|27|32)/.test(b.which)&&!/input|textarea/i.test(b.target.tagName)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var e=c(d),g=e.hasClass("open");if(!g&&27!=b.which||g&&27==b.which)return 27==b.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.divider):visible a",i=e.find('[role="menu"]'+h+', [role="listbox"]'+h);if(i.length){var j=i.index(b.target);38==b.which&&j>0&&j--,40==b.which&&j
').prependTo(this.$element).on("click.dismiss.bs.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.options.backdrop&&this.adjustBackdrop(),this.adjustDialog()},c.prototype.adjustBackdrop=function(){this.$backdrop.css("height",0).css("height",this.$element[0].scrollHeight)},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){this.bodyIsOverflowing=document.body.scrollHeight>document.documentElement.clientHeight,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right","")},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b,g=f&&f.selector;(e||"destroy"!=b)&&(g?(e||d.data("bs.tooltip",e={}),e[g]||(e[g]=new c(this,f))):e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};c.VERSION="3.3.1",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'
',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(this.options.viewport.selector||this.options.viewport);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c&&c.$tip&&c.$tip.is(":visible")?void(c.hoverState="in"):(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.options.container?a(this.options.container):this.$element.parent(),p=this.getPosition(o);h="bottom"==h&&k.bottom+m>p.bottom?"top":"top"==h&&k.top-m
p.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.width&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type)})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b,g=f&&f.selector;(e||"destroy"!=b)&&(g?(e||d.data("bs.popover",e={}),e[g]||(e[g]=new c(this,f))):e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.1",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},c.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){var e=a.proxy(this.process,this);this.$body=a("body"),this.$scrollElement=a(a(c).is("body")?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",e),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.1",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b="offset",c=0;a.isWindow(this.$scrollElement[0])||(b="position",c=this.$scrollElement.scrollTop()),this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight();var d=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[b]().top+c,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){d.offsets.push(this[0]),d.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.1",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})
+})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=this.unpin=this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.1",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=i?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=a("body").height();"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/js/npm.js b/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/js/npm.js
new file mode 100755
index 0000000..bf6aa80
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-3.3.1/js/npm.js
@@ -0,0 +1,13 @@
+// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment.
+require('../../js/transition.js')
+require('../../js/alert.js')
+require('../../js/button.js')
+require('../../js/carousel.js')
+require('../../js/collapse.js')
+require('../../js/dropdown.js')
+require('../../js/modal.js')
+require('../../js/tooltip.js')
+require('../../js/popover.js')
+require('../../js/scrollspy.js')
+require('../../js/tab.js')
+require('../../js/affix.js')
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-multiselect/0.9.15/css/bootstrap-multiselect.css b/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-multiselect/0.9.15/css/bootstrap-multiselect.css
new file mode 100755
index 0000000..6a6b68a
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-multiselect/0.9.15/css/bootstrap-multiselect.css
@@ -0,0 +1 @@
+span.multiselect-native-select{position:relative}span.multiselect-native-select select{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px -1px -1px -3px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important;left:50%;top:30px}.multiselect-container{position:absolute;list-style-type:none;margin:0;padding:0}.multiselect-container .input-group{margin:5px}.multiselect-container .multiselect-reset .input-group{width:93%}.multiselect-container>li{padding:0}.multiselect-container>li>a.multiselect-all label{font-weight:700}.multiselect-container>li.multiselect-group label{margin:0;padding:3px 20px;height:100%;font-weight:700}.multiselect-container>li.multiselect-group-clickable label{cursor:pointer}.multiselect-container>li>a{padding:0}.multiselect-container>li>a>label{margin:0;height:100%;cursor:pointer;font-weight:400;padding:3px 20px 3px 40px}.multiselect-container>li>a>label.checkbox,.multiselect-container>li>a>label.radio{margin:0}.multiselect-container>li>a>label>input[type=checkbox]{margin-bottom:5px}.btn-group>.btn-group:nth-child(2)>.multiselect.btn{border-top-left-radius:4px;border-bottom-left-radius:4px}.form-inline .multiselect-container label.checkbox,.form-inline .multiselect-container label.radio{padding:3px 20px 3px 40px}.form-inline .multiselect-container li a label.checkbox input[type=checkbox],.form-inline .multiselect-container li a label.radio input[type=radio]{margin-left:-20px;margin-right:0}
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-multiselect/0.9.15/js/bootstrap-multiselect.js b/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-multiselect/0.9.15/js/bootstrap-multiselect.js
new file mode 100755
index 0000000..f67fb09
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/portal/bootstrap-multiselect/0.9.15/js/bootstrap-multiselect.js
@@ -0,0 +1,1776 @@
+/**
+ * Bootstrap Multiselect (http://davidstutz.de/bootstrap-multiselect/)
+ *
+ * Apache License, Version 2.0:
+ * Copyright (c) 2012 - 2018 David Stutz
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a
+ * copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ * BSD 3-Clause License:
+ * Copyright (c) 2012 - 2018 David Stutz
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * - Neither the name of David Stutz nor the names of its contributors may be
+ * used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+(function (root, factory) {
+ // check to see if 'knockout' AMD module is specified if using requirejs
+ if (typeof define === 'function' && define.amd &&
+ typeof require === 'function' && typeof require.specified === 'function' && require.specified('knockout')) {
+
+ // AMD. Register as an anonymous module.
+ define(['jquery', 'knockout'], factory);
+ } else {
+ // Browser globals
+ factory(root.jQuery, root.ko);
+ }
+})(this, function ($, ko) {
+ "use strict";// jshint ;_;
+
+ if (typeof ko !== 'undefined' && ko.bindingHandlers && !ko.bindingHandlers.multiselect) {
+ ko.bindingHandlers.multiselect = {
+ after: ['options', 'value', 'selectedOptions', 'enable', 'disable'],
+
+ init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
+ var $element = $(element);
+ var config = ko.toJS(valueAccessor());
+
+ $element.multiselect(config);
+
+ if (allBindings.has('options')) {
+ var options = allBindings.get('options');
+ if (ko.isObservable(options)) {
+ ko.computed({
+ read: function() {
+ options();
+ setTimeout(function() {
+ var ms = $element.data('multiselect');
+ if (ms)
+ ms.updateOriginalOptions();//Not sure how beneficial this is.
+ $element.multiselect('rebuild');
+ }, 1);
+ },
+ disposeWhenNodeIsRemoved: element
+ });
+ }
+ }
+
+ //value and selectedOptions are two-way, so these will be triggered even by our own actions.
+ //It needs some way to tell if they are triggered because of us or because of outside change.
+ //It doesn't loop but it's a waste of processing.
+ if (allBindings.has('value')) {
+ var value = allBindings.get('value');
+ if (ko.isObservable(value)) {
+ ko.computed({
+ read: function() {
+ value();
+ setTimeout(function() {
+ $element.multiselect('refresh');
+ }, 1);
+ },
+ disposeWhenNodeIsRemoved: element
+ }).extend({ rateLimit: 100, notifyWhenChangesStop: true });
+ }
+ }
+
+ //Switched from arrayChange subscription to general subscription using 'refresh'.
+ //Not sure performance is any better using 'select' and 'deselect'.
+ if (allBindings.has('selectedOptions')) {
+ var selectedOptions = allBindings.get('selectedOptions');
+ if (ko.isObservable(selectedOptions)) {
+ ko.computed({
+ read: function() {
+ selectedOptions();
+ setTimeout(function() {
+ $element.multiselect('refresh');
+ }, 1);
+ },
+ disposeWhenNodeIsRemoved: element
+ }).extend({ rateLimit: 100, notifyWhenChangesStop: true });
+ }
+ }
+
+ var setEnabled = function (enable) {
+ setTimeout(function () {
+ if (enable)
+ $element.multiselect('enable');
+ else
+ $element.multiselect('disable');
+ });
+ };
+
+ if (allBindings.has('enable')) {
+ var enable = allBindings.get('enable');
+ if (ko.isObservable(enable)) {
+ ko.computed({
+ read: function () {
+ setEnabled(enable());
+ },
+ disposeWhenNodeIsRemoved: element
+ }).extend({ rateLimit: 100, notifyWhenChangesStop: true });
+ } else {
+ setEnabled(enable);
+ }
+ }
+
+ if (allBindings.has('disable')) {
+ var disable = allBindings.get('disable');
+ if (ko.isObservable(disable)) {
+ ko.computed({
+ read: function () {
+ setEnabled(!disable());
+ },
+ disposeWhenNodeIsRemoved: element
+ }).extend({ rateLimit: 100, notifyWhenChangesStop: true });
+ } else {
+ setEnabled(!disable);
+ }
+ }
+
+ ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
+ $element.multiselect('destroy');
+ });
+ },
+
+ update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
+ var $element = $(element);
+ var config = ko.toJS(valueAccessor());
+
+ $element.multiselect('setOptions', config);
+ $element.multiselect('rebuild');
+ }
+ };
+ }
+
+ function forEach(array, callback) {
+ for (var index = 0; index < array.length; ++index) {
+ callback(array[index], index);
+ }
+ }
+
+ /**
+ * Constructor to create a new multiselect using the given select.
+ *
+ * @param {jQuery} select
+ * @param {Object} options
+ * @returns {Multiselect}
+ */
+ function Multiselect(select, options) {
+
+ this.$select = $(select);
+ this.options = this.mergeOptions($.extend({}, options, this.$select.data()));
+
+ // Placeholder via data attributes
+ if (this.$select.attr("data-placeholder")) {
+ this.options.nonSelectedText = this.$select.data("placeholder");
+ }
+
+ // Initialization.
+ // We have to clone to create a new reference.
+ this.originalOptions = this.$select.clone()[0].options;
+ this.query = '';
+ this.searchTimeout = null;
+ this.lastToggledInput = null;
+
+ this.options.multiple = this.$select.attr('multiple') === "multiple";
+ this.options.onChange = $.proxy(this.options.onChange, this);
+ this.options.onSelectAll = $.proxy(this.options.onSelectAll, this);
+ this.options.onDeselectAll = $.proxy(this.options.onDeselectAll, this);
+ this.options.onDropdownShow = $.proxy(this.options.onDropdownShow, this);
+ this.options.onDropdownHide = $.proxy(this.options.onDropdownHide, this);
+ this.options.onDropdownShown = $.proxy(this.options.onDropdownShown, this);
+ this.options.onDropdownHidden = $.proxy(this.options.onDropdownHidden, this);
+ this.options.onInitialized = $.proxy(this.options.onInitialized, this);
+ this.options.onFiltering = $.proxy(this.options.onFiltering, this);
+
+ // Build select all if enabled.
+ this.buildContainer();
+ this.buildButton();
+ this.buildDropdown();
+ this.buildReset();
+ this.buildSelectAll();
+ this.buildDropdownOptions();
+ this.buildFilter();
+
+ this.updateButtonText();
+ this.updateSelectAll(true);
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ this.updateOptGroups();
+ }
+
+ this.options.wasDisabled = this.$select.prop('disabled');
+ if (this.options.disableIfEmpty && $('option', this.$select).length <= 0) {
+ this.disable();
+ }
+
+ this.$select.wrap(' ').after(this.$container);
+ this.options.onInitialized(this.$select, this.$container);
+ }
+
+ Multiselect.prototype = {
+
+ defaults: {
+ /**
+ * Default text function will either print 'None selected' in case no
+ * option is selected or a list of the selected options up to a length
+ * of 3 selected options.
+ *
+ * @param {jQuery} options
+ * @param {jQuery} select
+ * @returns {String}
+ */
+ buttonText: function(options, select) {
+ if (this.disabledText.length > 0
+ && (select.prop('disabled') || (options.length == 0 && this.disableIfEmpty))) {
+
+ return this.disabledText;
+ }
+ else if (options.length === 0) {
+ return this.nonSelectedText;
+ }
+ else if (this.allSelectedText
+ && options.length === $('option', $(select)).length
+ && $('option', $(select)).length !== 1
+ && this.multiple) {
+
+ if (this.selectAllNumber) {
+ return this.allSelectedText + ' (' + options.length + ')';
+ }
+ else {
+ return this.allSelectedText;
+ }
+ }
+ else if (this.numberDisplayed != 0 && options.length > this.numberDisplayed) {
+ return options.length + ' ' + this.nSelectedText;
+ }
+ else {
+ var selected = '';
+ var delimiter = this.delimiterText;
+
+ options.each(function() {
+ var label = ($(this).attr('label') !== undefined) ? $(this).attr('label') : $(this).text();
+ selected += label + delimiter;
+ });
+
+ return selected.substr(0, selected.length - this.delimiterText.length);
+ }
+ },
+ /**
+ * Updates the title of the button similar to the buttonText function.
+ *
+ * @param {jQuery} options
+ * @param {jQuery} select
+ * @returns {@exp;selected@call;substr}
+ */
+ buttonTitle: function(options, select) {
+ if (options.length === 0) {
+ return this.nonSelectedText;
+ }
+ else {
+ var selected = '';
+ var delimiter = this.delimiterText;
+
+ options.each(function () {
+ var label = ($(this).attr('label') !== undefined) ? $(this).attr('label') : $(this).text();
+ selected += label + delimiter;
+ });
+ return selected.substr(0, selected.length - this.delimiterText.length);
+ }
+ },
+ checkboxName: function(option) {
+ return false; // no checkbox name
+ },
+ /**
+ * Create a label.
+ *
+ * @param {jQuery} element
+ * @returns {String}
+ */
+ optionLabel: function(element){
+ return $(element).attr('label') || $(element).text();
+ },
+ /**
+ * Create a class.
+ *
+ * @param {jQuery} element
+ * @returns {String}
+ */
+ optionClass: function(element) {
+ return $(element).attr('class') || '';
+ },
+ /**
+ * Triggered on change of the multiselect.
+ *
+ * Not triggered when selecting/deselecting options manually.
+ *
+ * @param {jQuery} option
+ * @param {Boolean} checked
+ */
+ onChange : function(option, checked) {
+
+ },
+ /**
+ * Triggered when the dropdown is shown.
+ *
+ * @param {jQuery} event
+ */
+ onDropdownShow: function(event) {
+
+ },
+ /**
+ * Triggered when the dropdown is hidden.
+ *
+ * @param {jQuery} event
+ */
+ onDropdownHide: function(event) {
+
+ },
+ /**
+ * Triggered after the dropdown is shown.
+ *
+ * @param {jQuery} event
+ */
+ onDropdownShown: function(event) {
+
+ },
+ /**
+ * Triggered after the dropdown is hidden.
+ *
+ * @param {jQuery} event
+ */
+ onDropdownHidden: function(event) {
+
+ },
+ /**
+ * Triggered on select all.
+ */
+ onSelectAll: function() {
+
+ },
+ /**
+ * Triggered on deselect all.
+ */
+ onDeselectAll: function() {
+
+ },
+ /**
+ * Triggered after initializing.
+ *
+ * @param {jQuery} $select
+ * @param {jQuery} $container
+ */
+ onInitialized: function($select, $container) {
+
+ },
+ /**
+ * Triggered on filtering.
+ *
+ * @param {jQuery} $filter
+ */
+ onFiltering: function($filter) {
+
+ },
+ enableHTML: false,
+ buttonClass: 'btn btn-default',
+ inheritClass: false,
+ buttonWidth: 'auto',
+ buttonContainer: '
',
+ dropRight: false,
+ dropUp: false,
+ selectedClass: 'active',
+ // Maximum height of the dropdown menu.
+ // If maximum height is exceeded a scrollbar will be displayed.
+ maxHeight: false,
+ includeSelectAllOption: false,
+ includeSelectAllIfMoreThan: 0,
+ selectAllText: ' Select all',
+ selectAllValue: 'multiselect-all',
+ selectAllName: false,
+ selectAllNumber: true,
+ selectAllJustVisible: true,
+ enableFiltering: false,
+ enableCaseInsensitiveFiltering: false,
+ enableFullValueFiltering: false,
+ enableClickableOptGroups: false,
+ enableCollapsibleOptGroups: false,
+ collapseOptGroupsByDefault: false,
+ filterPlaceholder: 'Search',
+ // possible options: 'text', 'value', 'both'
+ filterBehavior: 'text',
+ includeFilterClearBtn: true,
+ preventInputChangeEvent: false,
+ nonSelectedText: 'None selected',
+ nSelectedText: 'selected',
+ allSelectedText: 'All selected',
+ numberDisplayed: 3,
+ disableIfEmpty: false,
+ disabledText: '',
+ delimiterText: ', ',
+ includeResetOption: false,
+ includeResetDivider: false,
+ resetText: 'Reset',
+ templates: {
+ button: ' ',
+ ul: '',
+ filter: '
',
+ filterClearBtn: ' ',
+ li: ' ',
+ divider: ' ',
+ liGroup: ' ',
+ resetButton: ' '
+ }
+ },
+
+ constructor: Multiselect,
+
+ /**
+ * Builds the container of the multiselect.
+ */
+ buildContainer: function() {
+ this.$container = $(this.options.buttonContainer);
+ this.$container.on('show.bs.dropdown', this.options.onDropdownShow);
+ this.$container.on('hide.bs.dropdown', this.options.onDropdownHide);
+ this.$container.on('shown.bs.dropdown', this.options.onDropdownShown);
+ this.$container.on('hidden.bs.dropdown', this.options.onDropdownHidden);
+ },
+
+ /**
+ * Builds the button of the multiselect.
+ */
+ buildButton: function() {
+ this.$button = $(this.options.templates.button).addClass(this.options.buttonClass);
+ if (this.$select.attr('class') && this.options.inheritClass) {
+ this.$button.addClass(this.$select.attr('class'));
+ }
+ // Adopt active state.
+ if (this.$select.prop('disabled')) {
+ this.disable();
+ }
+ else {
+ this.enable();
+ }
+
+ // Manually add button width if set.
+ if (this.options.buttonWidth && this.options.buttonWidth !== 'auto') {
+ this.$button.css({
+ 'width' : '100%', //this.options.buttonWidth,
+ 'overflow' : 'hidden',
+ 'text-overflow' : 'ellipsis'
+ });
+ this.$container.css({
+ 'width': this.options.buttonWidth
+ });
+ }
+
+ // Keep the tab index from the select.
+ var tabindex = this.$select.attr('tabindex');
+ if (tabindex) {
+ this.$button.attr('tabindex', tabindex);
+ }
+
+ this.$container.prepend(this.$button);
+ },
+
+ /**
+ * Builds the ul representing the dropdown menu.
+ */
+ buildDropdown: function() {
+
+ // Build ul.
+ this.$ul = $(this.options.templates.ul);
+
+ if (this.options.dropRight) {
+ this.$ul.addClass('pull-right');
+ }
+
+ // Set max height of dropdown menu to activate auto scrollbar.
+ if (this.options.maxHeight) {
+ // TODO: Add a class for this option to move the css declarations.
+ this.$ul.css({
+ 'max-height': this.options.maxHeight + 'px',
+ 'overflow-y': 'auto',
+ 'overflow-x': 'hidden'
+ });
+ }
+
+ if (this.options.dropUp) {
+
+ var height = Math.min(this.options.maxHeight, $('option[data-role!="divider"]', this.$select).length*26 + $('option[data-role="divider"]', this.$select).length*19 + (this.options.includeSelectAllOption ? 26 : 0) + (this.options.enableFiltering || this.options.enableCaseInsensitiveFiltering ? 44 : 0));
+ var moveCalc = height + 34;
+
+ this.$ul.css({
+ 'max-height': height + 'px',
+ 'overflow-y': 'auto',
+ 'overflow-x': 'hidden',
+ 'margin-top': "-" + moveCalc + 'px'
+ });
+ }
+
+ this.$container.append(this.$ul);
+ },
+
+ /**
+ * Build the dropdown options and binds all necessary events.
+ *
+ * Uses createDivider and createOptionValue to create the necessary options.
+ */
+ buildDropdownOptions: function() {
+
+ this.$select.children().each($.proxy(function(index, element) {
+
+ var $element = $(element);
+ // Support optgroups and options without a group simultaneously.
+ var tag = $element.prop('tagName')
+ .toLowerCase();
+
+ if ($element.prop('value') === this.options.selectAllValue) {
+ return;
+ }
+
+ if (tag === 'optgroup') {
+ this.createOptgroup(element);
+ }
+ else if (tag === 'option') {
+
+ if ($element.data('role') === 'divider') {
+ this.createDivider();
+ }
+ else {
+ this.createOptionValue(element);
+ }
+
+ }
+
+ // Other illegal tags will be ignored.
+ }, this));
+
+ // Bind the change event on the dropdown elements.
+ $(this.$ul).off('change', 'li:not(.multiselect-group) input[type="checkbox"], li:not(.multiselect-group) input[type="radio"]');
+ $(this.$ul).on('change', 'li:not(.multiselect-group) input[type="checkbox"], li:not(.multiselect-group) input[type="radio"]', $.proxy(function(event) {
+ var $target = $(event.target);
+
+ var checked = $target.prop('checked') || false;
+ var isSelectAllOption = $target.val() === this.options.selectAllValue;
+
+ // Apply or unapply the configured selected class.
+ if (this.options.selectedClass) {
+ if (checked) {
+ $target.closest('li')
+ .addClass(this.options.selectedClass);
+ }
+ else {
+ $target.closest('li')
+ .removeClass(this.options.selectedClass);
+ }
+ }
+
+ // Get the corresponding option.
+ var value = $target.val();
+ var $option = this.getOptionByValue(value);
+
+ var $optionsNotThis = $('option', this.$select).not($option);
+ var $checkboxesNotThis = $('input', this.$container).not($target);
+
+ if (isSelectAllOption) {
+
+ if (checked) {
+ this.selectAll(this.options.selectAllJustVisible, true);
+ }
+ else {
+ this.deselectAll(this.options.selectAllJustVisible, true);
+ }
+ }
+ else {
+ if (checked) {
+ $option.prop('selected', true);
+
+ if (this.options.multiple) {
+ // Simply select additional option.
+ $option.prop('selected', true);
+ }
+ else {
+ // Unselect all other options and corresponding checkboxes.
+ if (this.options.selectedClass) {
+ $($checkboxesNotThis).closest('li').removeClass(this.options.selectedClass);
+ }
+
+ $($checkboxesNotThis).prop('checked', false);
+ $optionsNotThis.prop('selected', false);
+
+ // It's a single selection, so close.
+ this.$button.click();
+ }
+
+ if (this.options.selectedClass === "active") {
+ $optionsNotThis.closest("a").css("outline", "");
+ }
+ }
+ else {
+ // Unselect option.
+ $option.prop('selected', false);
+ }
+
+ // To prevent select all from firing onChange: #575
+ this.options.onChange($option, checked);
+
+ // Do not update select all or optgroups on select all change!
+ this.updateSelectAll();
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ this.updateOptGroups();
+ }
+ }
+
+ this.$select.change();
+ this.updateButtonText();
+
+ if(this.options.preventInputChangeEvent) {
+ return false;
+ }
+ }, this));
+
+ $('li a', this.$ul).on('mousedown', function(e) {
+ if (e.shiftKey) {
+ // Prevent selecting text by Shift+click
+ return false;
+ }
+ });
+
+ $(this.$ul).on('touchstart click', 'li a', $.proxy(function(event) {
+ event.stopPropagation();
+
+ var $target = $(event.target);
+
+ if (event.shiftKey && this.options.multiple) {
+ if($target.is("label")){ // Handles checkbox selection manually (see https://github.com/davidstutz/bootstrap-multiselect/issues/431)
+ event.preventDefault();
+ $target = $target.find("input");
+ $target.prop("checked", !$target.prop("checked"));
+ }
+ var checked = $target.prop('checked') || false;
+
+ if (this.lastToggledInput !== null && this.lastToggledInput !== $target) { // Make sure we actually have a range
+ var from = this.$ul.find("li:visible").index($target.parents("li"));
+ var to = this.$ul.find("li:visible").index(this.lastToggledInput.parents("li"));
+
+ if (from > to) { // Swap the indices
+ var tmp = to;
+ to = from;
+ from = tmp;
+ }
+
+ // Make sure we grab all elements since slice excludes the last index
+ ++to;
+
+ // Change the checkboxes and underlying options
+ var range = this.$ul.find("li").not(".multiselect-filter-hidden").slice(from, to).find("input");
+
+ range.prop('checked', checked);
+
+ if (this.options.selectedClass) {
+ range.closest('li')
+ .toggleClass(this.options.selectedClass, checked);
+ }
+
+ for (var i = 0, j = range.length; i < j; i++) {
+ var $checkbox = $(range[i]);
+
+ var $option = this.getOptionByValue($checkbox.val());
+
+ $option.prop('selected', checked);
+ }
+ }
+
+ // Trigger the select "change" event
+ $target.trigger("change");
+ }
+
+ // Remembers last clicked option
+ if($target.is("input") && !$target.closest("li").is(".multiselect-item")){
+ this.lastToggledInput = $target;
+ }
+
+ $target.blur();
+ }, this));
+
+ // Keyboard support.
+ this.$container.off('keydown.multiselect').on('keydown.multiselect', $.proxy(function(event) {
+ if ($('input[type="text"]', this.$container).is(':focus')) {
+ return;
+ }
+
+ if (event.keyCode === 9 && this.$container.hasClass('open')) {
+ this.$button.click();
+ }
+ else {
+ var $items = $(this.$container).find("li:not(.divider):not(.disabled) a").filter(":visible");
+
+ if (!$items.length) {
+ return;
+ }
+
+ var index = $items.index($items.filter(':focus'));
+
+ // Navigation up.
+ if (event.keyCode === 38 && index > 0) {
+ index--;
+ }
+ // Navigate down.
+ else if (event.keyCode === 40 && index < $items.length - 1) {
+ index++;
+ }
+ else if (!~index) {
+ index = 0;
+ }
+
+ var $current = $items.eq(index);
+ $current.focus();
+
+ if (event.keyCode === 32 || event.keyCode === 13) {
+ var $checkbox = $current.find('input');
+
+ $checkbox.prop("checked", !$checkbox.prop("checked"));
+ $checkbox.change();
+ }
+
+ event.stopPropagation();
+ event.preventDefault();
+ }
+ }, this));
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ $("li.multiselect-group input", this.$ul).on("change", $.proxy(function(event) {
+ event.stopPropagation();
+
+ var $target = $(event.target);
+ var checked = $target.prop('checked') || false;
+
+ var $li = $(event.target).closest('li');
+ var $group = $li.nextUntil("li.multiselect-group")
+ .not('.multiselect-filter-hidden')
+ .not('.disabled');
+
+ var $inputs = $group.find("input");
+
+ var values = [];
+ var $options = [];
+
+ if (this.options.selectedClass) {
+ if (checked) {
+ $li.addClass(this.options.selectedClass);
+ }
+ else {
+ $li.removeClass(this.options.selectedClass);
+ }
+ }
+
+ $.each($inputs, $.proxy(function(index, input) {
+ var value = $(input).val();
+ var $option = this.getOptionByValue(value);
+
+ if (checked) {
+ $(input).prop('checked', true);
+ $(input).closest('li')
+ .addClass(this.options.selectedClass);
+
+ $option.prop('selected', true);
+ }
+ else {
+ $(input).prop('checked', false);
+ $(input).closest('li')
+ .removeClass(this.options.selectedClass);
+
+ $option.prop('selected', false);
+ }
+
+ $options.push(this.getOptionByValue(value));
+ }, this))
+
+ // Cannot use select or deselect here because it would call updateOptGroups again.
+
+ this.options.onChange($options, checked);
+
+ this.$select.change();
+ this.updateButtonText();
+ this.updateSelectAll();
+ }, this));
+ }
+
+ if (this.options.enableCollapsibleOptGroups && this.options.multiple) {
+ $("li.multiselect-group .caret-container", this.$ul).on("click", $.proxy(function(event) {
+ var $li = $(event.target).closest('li');
+ var $inputs = $li.nextUntil("li.multiselect-group")
+ .not('.multiselect-filter-hidden');
+
+ var visible = true;
+ $inputs.each(function() {
+ visible = visible && !$(this).hasClass('multiselect-collapsible-hidden');
+ });
+
+ if (visible) {
+ $inputs.hide()
+ .addClass('multiselect-collapsible-hidden');
+ }
+ else {
+ $inputs.show()
+ .removeClass('multiselect-collapsible-hidden');
+ }
+ }, this));
+
+ $("li.multiselect-all", this.$ul).css('background', '#f3f3f3').css('border-bottom', '1px solid #eaeaea');
+ $("li.multiselect-all > a > label.checkbox", this.$ul).css('padding', '3px 20px 3px 35px');
+ $("li.multiselect-group > a > input", this.$ul).css('margin', '4px 0px 5px -20px');
+ }
+ },
+
+ /**
+ * Create an option using the given select option.
+ *
+ * @param {jQuery} element
+ */
+ createOptionValue: function(element) {
+ var $element = $(element);
+ if ($element.is(':selected')) {
+ $element.prop('selected', true);
+ }
+
+ // Support the label attribute on options.
+ var label = this.options.optionLabel(element);
+ var classes = this.options.optionClass(element);
+ var value = $element.val();
+ var inputType = this.options.multiple ? "checkbox" : "radio";
+
+ var $li = $(this.options.templates.li);
+ var $label = $('label', $li);
+ $label.addClass(inputType);
+ $label.attr("title", label);
+ $li.addClass(classes);
+
+ // Hide all children items when collapseOptGroupsByDefault is true
+ if (this.options.collapseOptGroupsByDefault && $(element).parent().prop("tagName").toLowerCase() === "optgroup") {
+ $li.addClass("multiselect-collapsible-hidden");
+ $li.hide();
+ }
+
+ if (this.options.enableHTML) {
+ $label.html(" " + label);
+ }
+ else {
+ $label.text(" " + label);
+ }
+
+ var $checkbox = $(' ').attr('type', inputType);
+
+ var name = this.options.checkboxName($element);
+ if (name) {
+ $checkbox.attr('name', name);
+ }
+
+ $label.prepend($checkbox);
+
+ var selected = $element.prop('selected') || false;
+ $checkbox.val(value);
+
+ if (value === this.options.selectAllValue) {
+ $li.addClass("multiselect-item multiselect-all");
+ $checkbox.parent().parent()
+ .addClass('multiselect-all');
+ }
+
+ $label.attr('title', $element.attr('title'));
+
+ this.$ul.append($li);
+
+ if ($element.is(':disabled')) {
+ $checkbox.attr('disabled', 'disabled')
+ .prop('disabled', true)
+ .closest('a')
+ .attr("tabindex", "-1")
+ .closest('li')
+ .addClass('disabled');
+ }
+
+ $checkbox.prop('checked', selected);
+
+ if (selected && this.options.selectedClass) {
+ $checkbox.closest('li')
+ .addClass(this.options.selectedClass);
+ }
+ },
+
+ /**
+ * Creates a divider using the given select option.
+ *
+ * @param {jQuery} element
+ */
+ createDivider: function(element) {
+ var $divider = $(this.options.templates.divider);
+ this.$ul.append($divider);
+ },
+
+ /**
+ * Creates an optgroup.
+ *
+ * @param {jQuery} group
+ */
+ createOptgroup: function(group) {
+ var label = $(group).attr("label");
+ var value = $(group).attr("value");
+ var $li = $(' ');
+
+ var classes = this.options.optionClass(group);
+ $li.addClass(classes);
+
+ if (this.options.enableHTML) {
+ $('label b', $li).html(" " + label);
+ }
+ else {
+ $('label b', $li).text(" " + label);
+ }
+
+ if (this.options.enableCollapsibleOptGroups && this.options.multiple) {
+ $('a', $li).append(' ');
+ }
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ $('a label', $li).prepend(' ');
+ }
+
+ if ($(group).is(':disabled')) {
+ $li.addClass('disabled');
+ }
+
+ this.$ul.append($li);
+
+ $("option", group).each($.proxy(function($, group) {
+ this.createOptionValue(group);
+ }, this))
+ },
+
+ /**
+ * Build the reset.
+ *
+ */
+ buildReset: function() {
+ if (this.options.includeResetOption) {
+
+ // Check whether to add a divider after the reset.
+ if (this.options.includeResetDivider) {
+ this.$ul.prepend($(this.options.templates.divider));
+ }
+
+ var $resetButton = $(this.options.templates.resetButton);
+
+ if (this.options.enableHTML) {
+ $('a', $resetButton).html(this.options.resetText);
+ }
+ else {
+ $('a', $resetButton).text(this.options.resetText);
+ }
+
+ $('a', $resetButton).click($.proxy(function(){
+ this.clearSelection();
+ }, this));
+
+ this.$ul.prepend($resetButton);
+ }
+ },
+
+ /**
+ * Build the select all.
+ *
+ * Checks if a select all has already been created.
+ */
+ buildSelectAll: function() {
+ if (typeof this.options.selectAllValue === 'number') {
+ this.options.selectAllValue = this.options.selectAllValue.toString();
+ }
+
+ var alreadyHasSelectAll = this.hasSelectAll();
+
+ if (!alreadyHasSelectAll && this.options.includeSelectAllOption && this.options.multiple
+ && $('option', this.$select).length > this.options.includeSelectAllIfMoreThan) {
+
+ // Check whether to add a divider after the select all.
+ if (this.options.includeSelectAllDivider) {
+ this.$ul.prepend($(this.options.templates.divider));
+ }
+
+ var $li = $(this.options.templates.li);
+ $('label', $li).addClass("checkbox");
+
+ if (this.options.enableHTML) {
+ $('label', $li).html(" " + this.options.selectAllText);
+ }
+ else {
+ $('label', $li).text(" " + this.options.selectAllText);
+ }
+
+ if (this.options.selectAllName) {
+ $('label', $li).prepend(' ');
+ }
+ else {
+ $('label', $li).prepend(' ');
+ }
+
+ var $checkbox = $('input', $li);
+ $checkbox.val(this.options.selectAllValue);
+
+ $li.addClass("multiselect-item multiselect-all");
+ $checkbox.parent().parent()
+ .addClass('multiselect-all');
+
+ this.$ul.prepend($li);
+
+ $checkbox.prop('checked', false);
+ }
+ },
+
+ /**
+ * Builds the filter.
+ */
+ buildFilter: function() {
+
+ // Build filter if filtering OR case insensitive filtering is enabled and the number of options exceeds (or equals) enableFilterLength.
+ if (this.options.enableFiltering || this.options.enableCaseInsensitiveFiltering) {
+ var enableFilterLength = Math.max(this.options.enableFiltering, this.options.enableCaseInsensitiveFiltering);
+
+ if (this.$select.find('option').length >= enableFilterLength) {
+
+ this.$filter = $(this.options.templates.filter);
+ $('input', this.$filter).attr('placeholder', this.options.filterPlaceholder);
+
+ // Adds optional filter clear button
+ if(this.options.includeFilterClearBtn) {
+ var clearBtn = $(this.options.templates.filterClearBtn);
+ clearBtn.on('click', $.proxy(function(event){
+ clearTimeout(this.searchTimeout);
+
+ this.query = '';
+ this.$filter.find('.multiselect-search').val('');
+ $('li', this.$ul).show().removeClass('multiselect-filter-hidden');
+
+ this.updateSelectAll();
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ this.updateOptGroups();
+ }
+
+ }, this));
+ this.$filter.find('.input-group').append(clearBtn);
+ }
+
+ this.$ul.prepend(this.$filter);
+
+ this.$filter.val(this.query).on('click', function(event) {
+ event.stopPropagation();
+ }).on('input keydown', $.proxy(function(event) {
+ // Cancel enter key default behaviour
+ if (event.which === 13) {
+ event.preventDefault();
+ }
+
+ // This is useful to catch "keydown" events after the browser has updated the control.
+ clearTimeout(this.searchTimeout);
+
+ this.searchTimeout = this.asyncFunction($.proxy(function() {
+
+ if (this.query !== event.target.value) {
+ this.query = event.target.value;
+
+ var currentGroup, currentGroupVisible;
+ $.each($('li', this.$ul), $.proxy(function(index, element) {
+ var value = $('input', element).length > 0 ? $('input', element).val() : "";
+ var text = $('label', element).text();
+
+ var filterCandidate = '';
+ if ((this.options.filterBehavior === 'text')) {
+ filterCandidate = text;
+ }
+ else if ((this.options.filterBehavior === 'value')) {
+ filterCandidate = value;
+ }
+ else if (this.options.filterBehavior === 'both') {
+ filterCandidate = text + '\n' + value;
+ }
+
+ if (value !== this.options.selectAllValue && text) {
+
+ // By default lets assume that element is not
+ // interesting for this search.
+ var showElement = false;
+
+ if (this.options.enableCaseInsensitiveFiltering) {
+ filterCandidate = filterCandidate.toLowerCase();
+ this.query = this.query.toLowerCase();
+ }
+
+ if (this.options.enableFullValueFiltering && this.options.filterBehavior !== 'both') {
+ var valueToMatch = filterCandidate.trim().substring(0, this.query.length);
+ if (this.query.indexOf(valueToMatch) > -1) {
+ showElement = true;
+ }
+ }
+ else if (filterCandidate.indexOf(this.query) > -1) {
+ showElement = true;
+ }
+
+ // Toggle current element (group or group item) according to showElement boolean.
+ if(!showElement){
+ $(element).css('display', 'none');
+ $(element).addClass('multiselect-filter-hidden');
+ }
+ if(showElement){
+ $(element).css('display', 'block');
+ $(element).removeClass('multiselect-filter-hidden');
+ }
+
+ // Differentiate groups and group items.
+ if ($(element).hasClass('multiselect-group')) {
+ // Remember group status.
+ currentGroup = element;
+ currentGroupVisible = showElement;
+ }
+ else {
+ // Show group name when at least one of its items is visible.
+ if (showElement) {
+ $(currentGroup).show()
+ .removeClass('multiselect-filter-hidden');
+ }
+
+ // Show all group items when group name satisfies filter.
+ if (!showElement && currentGroupVisible) {
+ $(element).show()
+ .removeClass('multiselect-filter-hidden');
+ }
+ }
+ }
+ }, this));
+ }
+
+ this.updateSelectAll();
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ this.updateOptGroups();
+ }
+
+ this.options.onFiltering(event.target);
+
+ }, this), 300, this);
+ }, this));
+ }
+ }
+ },
+
+ /**
+ * Unbinds the whole plugin.
+ */
+ destroy: function() {
+ this.$container.remove();
+ this.$select.show();
+
+ // reset original state
+ this.$select.prop('disabled', this.options.wasDisabled);
+
+ this.$select.data('multiselect', null);
+ },
+
+ /**
+ * Refreshs the multiselect based on the selected options of the select.
+ */
+ refresh: function () {
+ var inputs = {};
+ $('li input', this.$ul).each(function() {
+ inputs[$(this).val()] = $(this);
+ });
+
+ $('option', this.$select).each($.proxy(function (index, element) {
+ var $elem = $(element);
+ var $input = inputs[$(element).val()];
+
+ if ($elem.is(':selected')) {
+ $input.prop('checked', true);
+
+ if (this.options.selectedClass) {
+ $input.closest('li')
+ .addClass(this.options.selectedClass);
+ }
+ }
+ else {
+ $input.prop('checked', false);
+
+ if (this.options.selectedClass) {
+ $input.closest('li')
+ .removeClass(this.options.selectedClass);
+ }
+ }
+
+ if ($elem.is(":disabled")) {
+ $input.attr('disabled', 'disabled')
+ .prop('disabled', true)
+ .closest('li')
+ .addClass('disabled');
+ }
+ else {
+ $input.prop('disabled', false)
+ .closest('li')
+ .removeClass('disabled');
+ }
+ }, this));
+
+ this.updateButtonText();
+ this.updateSelectAll();
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ this.updateOptGroups();
+ }
+ },
+
+ /**
+ * Select all options of the given values.
+ *
+ * If triggerOnChange is set to true, the on change event is triggered if
+ * and only if one value is passed.
+ *
+ * @param {Array} selectValues
+ * @param {Boolean} triggerOnChange
+ */
+ select: function(selectValues, triggerOnChange) {
+ if(!$.isArray(selectValues)) {
+ selectValues = [selectValues];
+ }
+
+ for (var i = 0; i < selectValues.length; i++) {
+ var value = selectValues[i];
+
+ if (value === null || value === undefined) {
+ continue;
+ }
+
+ var $option = this.getOptionByValue(value);
+ var $checkbox = this.getInputByValue(value);
+
+ if($option === undefined || $checkbox === undefined) {
+ continue;
+ }
+
+ if (!this.options.multiple) {
+ this.deselectAll(false);
+ }
+
+ if (this.options.selectedClass) {
+ $checkbox.closest('li')
+ .addClass(this.options.selectedClass);
+ }
+
+ $checkbox.prop('checked', true);
+ $option.prop('selected', true);
+
+ if (triggerOnChange) {
+ this.options.onChange($option, true);
+ }
+ }
+
+ this.updateButtonText();
+ this.updateSelectAll();
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ this.updateOptGroups();
+ }
+ },
+
+ /**
+ * Clears all selected items.
+ */
+ clearSelection: function () {
+ this.deselectAll(false);
+ this.updateButtonText();
+ this.updateSelectAll();
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ this.updateOptGroups();
+ }
+ },
+
+ /**
+ * Deselects all options of the given values.
+ *
+ * If triggerOnChange is set to true, the on change event is triggered, if
+ * and only if one value is passed.
+ *
+ * @param {Array} deselectValues
+ * @param {Boolean} triggerOnChange
+ */
+ deselect: function(deselectValues, triggerOnChange) {
+ if(!$.isArray(deselectValues)) {
+ deselectValues = [deselectValues];
+ }
+
+ for (var i = 0; i < deselectValues.length; i++) {
+ var value = deselectValues[i];
+
+ if (value === null || value === undefined) {
+ continue;
+ }
+
+ var $option = this.getOptionByValue(value);
+ var $checkbox = this.getInputByValue(value);
+
+ if($option === undefined || $checkbox === undefined) {
+ continue;
+ }
+
+ if (this.options.selectedClass) {
+ $checkbox.closest('li')
+ .removeClass(this.options.selectedClass);
+ }
+
+ $checkbox.prop('checked', false);
+ $option.prop('selected', false);
+
+ if (triggerOnChange) {
+ this.options.onChange($option, false);
+ }
+ }
+
+ this.updateButtonText();
+ this.updateSelectAll();
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ this.updateOptGroups();
+ }
+ },
+
+ /**
+ * Selects all enabled & visible options.
+ *
+ * If justVisible is true or not specified, only visible options are selected.
+ *
+ * @param {Boolean} justVisible
+ * @param {Boolean} triggerOnSelectAll
+ */
+ selectAll: function (justVisible, triggerOnSelectAll) {
+
+ var justVisible = typeof justVisible === 'undefined' ? true : justVisible;
+ var allLis = $("li:not(.divider):not(.disabled):not(.multiselect-group)", this.$ul);
+ var visibleLis = $("li:not(.divider):not(.disabled):not(.multiselect-group):not(.multiselect-filter-hidden):not(.multiselect-collapisble-hidden)", this.$ul).filter(':visible');
+
+ if(justVisible) {
+ $('input:enabled' , visibleLis).prop('checked', true);
+ visibleLis.addClass(this.options.selectedClass);
+
+ $('input:enabled' , visibleLis).each($.proxy(function(index, element) {
+ var value = $(element).val();
+ var option = this.getOptionByValue(value);
+ $(option).prop('selected', true);
+ }, this));
+ }
+ else {
+ $('input:enabled' , allLis).prop('checked', true);
+ allLis.addClass(this.options.selectedClass);
+
+ $('input:enabled' , allLis).each($.proxy(function(index, element) {
+ var value = $(element).val();
+ var option = this.getOptionByValue(value);
+ $(option).prop('selected', true);
+ }, this));
+ }
+
+ $('li input[value="' + this.options.selectAllValue + '"]', this.$ul).prop('checked', true);
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ this.updateOptGroups();
+ }
+
+ if (triggerOnSelectAll) {
+ this.options.onSelectAll();
+ }
+ },
+
+ /**
+ * Deselects all options.
+ *
+ * If justVisible is true or not specified, only visible options are deselected.
+ *
+ * @param {Boolean} justVisible
+ */
+ deselectAll: function (justVisible, triggerOnDeselectAll) {
+
+ var justVisible = typeof justVisible === 'undefined' ? true : justVisible;
+ var allLis = $("li:not(.divider):not(.disabled):not(.multiselect-group)", this.$ul);
+ var visibleLis = $("li:not(.divider):not(.disabled):not(.multiselect-group):not(.multiselect-filter-hidden):not(.multiselect-collapisble-hidden)", this.$ul).filter(':visible');
+
+ if(justVisible) {
+ $('input[type="checkbox"]:enabled' , visibleLis).prop('checked', false);
+ visibleLis.removeClass(this.options.selectedClass);
+
+ $('input[type="checkbox"]:enabled' , visibleLis).each($.proxy(function(index, element) {
+ var value = $(element).val();
+ var option = this.getOptionByValue(value);
+ $(option).prop('selected', false);
+ }, this));
+ }
+ else {
+ $('input[type="checkbox"]:enabled' , allLis).prop('checked', false);
+ allLis.removeClass(this.options.selectedClass);
+
+ $('input[type="checkbox"]:enabled' , allLis).each($.proxy(function(index, element) {
+ var value = $(element).val();
+ var option = this.getOptionByValue(value);
+ $(option).prop('selected', false);
+ }, this));
+ }
+
+ $('li input[value="' + this.options.selectAllValue + '"]', this.$ul).prop('checked', false);
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ this.updateOptGroups();
+ }
+
+ if (triggerOnDeselectAll) {
+ this.options.onDeselectAll();
+ }
+ },
+
+ /**
+ * Rebuild the plugin.
+ *
+ * Rebuilds the dropdown, the filter and the select all option.
+ */
+ rebuild: function() {
+ this.$ul.html('');
+
+ // Important to distinguish between radios and checkboxes.
+ this.options.multiple = this.$select.attr('multiple') === "multiple";
+
+ this.buildSelectAll();
+ this.buildDropdownOptions();
+ this.buildFilter();
+
+ this.updateButtonText();
+ this.updateSelectAll(true);
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ this.updateOptGroups();
+ }
+
+ if (this.options.disableIfEmpty && $('option', this.$select).length <= 0) {
+ this.disable();
+ }
+ else {
+ this.enable();
+ }
+
+ if (this.options.dropRight) {
+ this.$ul.addClass('pull-right');
+ }
+ },
+
+ /**
+ * The provided data will be used to build the dropdown.
+ */
+ dataprovider: function(dataprovider) {
+
+ var groupCounter = 0;
+ var $select = this.$select.empty();
+
+ $.each(dataprovider, function (index, option) {
+ var $tag;
+
+ if ($.isArray(option.children)) { // create optiongroup tag
+ groupCounter++;
+
+ $tag = $(' ').attr({
+ label: option.label || 'Group ' + groupCounter,
+ disabled: !!option.disabled,
+ value: option.value
+ });
+
+ forEach(option.children, function(subOption) { // add children option tags
+ var attributes = {
+ value: subOption.value,
+ label: subOption.label || subOption.value,
+ title: subOption.title,
+ selected: !!subOption.selected,
+ disabled: !!subOption.disabled
+ };
+
+ //Loop through attributes object and add key-value for each attribute
+ for (var key in subOption.attributes) {
+ attributes['data-' + key] = subOption.attributes[key];
+ }
+ //Append original attributes + new data attributes to option
+ $tag.append($(' ').attr(attributes));
+ });
+ }
+ else {
+
+ var attributes = {
+ 'value': option.value,
+ 'label': option.label || option.value,
+ 'title': option.title,
+ 'class': option['class'],
+ 'selected': !!option['selected'],
+ 'disabled': !!option['disabled']
+ };
+ //Loop through attributes object and add key-value for each attribute
+ for (var key in option.attributes) {
+ attributes['data-' + key] = option.attributes[key];
+ }
+ //Append original attributes + new data attributes to option
+ $tag = $(' ').attr(attributes);
+
+ $tag.text(option.label || option.value);
+ }
+
+ $select.append($tag);
+ });
+
+ this.rebuild();
+ },
+
+ /**
+ * Enable the multiselect.
+ */
+ enable: function() {
+ this.$select.prop('disabled', false);
+ this.$button.prop('disabled', false)
+ .removeClass('disabled');
+ },
+
+ /**
+ * Disable the multiselect.
+ */
+ disable: function() {
+ this.$select.prop('disabled', true);
+ this.$button.prop('disabled', true)
+ .addClass('disabled');
+ },
+
+ /**
+ * Set the options.
+ *
+ * @param {Array} options
+ */
+ setOptions: function(options) {
+ this.options = this.mergeOptions(options);
+ },
+
+ /**
+ * Merges the given options with the default options.
+ *
+ * @param {Array} options
+ * @returns {Array}
+ */
+ mergeOptions: function(options) {
+ return $.extend(true, {}, this.defaults, this.options, options);
+ },
+
+ /**
+ * Checks whether a select all checkbox is present.
+ *
+ * @returns {Boolean}
+ */
+ hasSelectAll: function() {
+ return $('li.multiselect-all', this.$ul).length > 0;
+ },
+
+ /**
+ * Update opt groups.
+ */
+ updateOptGroups: function() {
+ var $groups = $('li.multiselect-group', this.$ul)
+ var selectedClass = this.options.selectedClass;
+
+ $groups.each(function() {
+ var $options = $(this).nextUntil('li.multiselect-group')
+ .not('.multiselect-filter-hidden')
+ .not('.disabled');
+
+ var checked = true;
+ $options.each(function() {
+ var $input = $('input', this);
+
+ if (!$input.prop('checked')) {
+ checked = false;
+ }
+ });
+
+ if (selectedClass) {
+ if (checked) {
+ $(this).addClass(selectedClass);
+ }
+ else {
+ $(this).removeClass(selectedClass);
+ }
+ }
+
+ $('input', this).prop('checked', checked);
+ });
+ },
+
+ /**
+ * Updates the select all checkbox based on the currently displayed and selected checkboxes.
+ */
+ updateSelectAll: function(notTriggerOnSelectAll) {
+ if (this.hasSelectAll()) {
+ var allBoxes = $("li:not(.multiselect-item):not(.multiselect-filter-hidden):not(.multiselect-group):not(.disabled) input:enabled", this.$ul);
+ var allBoxesLength = allBoxes.length;
+ var checkedBoxesLength = allBoxes.filter(":checked").length;
+ var selectAllLi = $("li.multiselect-all", this.$ul);
+ var selectAllInput = selectAllLi.find("input");
+
+ if (checkedBoxesLength > 0 && checkedBoxesLength === allBoxesLength) {
+ selectAllInput.prop("checked", true);
+ selectAllLi.addClass(this.options.selectedClass);
+ }
+ else {
+ selectAllInput.prop("checked", false);
+ selectAllLi.removeClass(this.options.selectedClass);
+ }
+ }
+ },
+
+ /**
+ * Update the button text and its title based on the currently selected options.
+ */
+ updateButtonText: function() {
+ var options = this.getSelected();
+
+ // First update the displayed button text.
+ if (this.options.enableHTML) {
+ $('.multiselect .multiselect-selected-text', this.$container).html(this.options.buttonText(options, this.$select));
+ }
+ else {
+ $('.multiselect .multiselect-selected-text', this.$container).text(this.options.buttonText(options, this.$select));
+ }
+
+ // Now update the title attribute of the button.
+ $('.multiselect', this.$container).attr('title', this.options.buttonTitle(options, this.$select));
+ },
+
+ /**
+ * Get all selected options.
+ *
+ * @returns {jQUery}
+ */
+ getSelected: function() {
+ return $('option', this.$select).filter(":selected");
+ },
+
+ /**
+ * Gets a select option by its value.
+ *
+ * @param {String} value
+ * @returns {jQuery}
+ */
+ getOptionByValue: function (value) {
+
+ var options = $('option', this.$select);
+ var valueToCompare = value.toString();
+
+ for (var i = 0; i < options.length; i = i + 1) {
+ var option = options[i];
+ if (option.value === valueToCompare) {
+ return $(option);
+ }
+ }
+ },
+
+ /**
+ * Get the input (radio/checkbox) by its value.
+ *
+ * @param {String} value
+ * @returns {jQuery}
+ */
+ getInputByValue: function (value) {
+
+ var checkboxes = $('li input:not(.multiselect-search)', this.$ul);
+ var valueToCompare = value.toString();
+
+ for (var i = 0; i < checkboxes.length; i = i + 1) {
+ var checkbox = checkboxes[i];
+ if (checkbox.value === valueToCompare) {
+ return $(checkbox);
+ }
+ }
+ },
+
+ /**
+ * Used for knockout integration.
+ */
+ updateOriginalOptions: function() {
+ this.originalOptions = this.$select.clone()[0].options;
+ },
+
+ asyncFunction: function(callback, timeout, self) {
+ var args = Array.prototype.slice.call(arguments, 3);
+ return setTimeout(function() {
+ callback.apply(self || window, args);
+ }, timeout);
+ },
+
+ setAllSelectedText: function(allSelectedText) {
+ this.options.allSelectedText = allSelectedText;
+ this.updateButtonText();
+ }
+ };
+
+ $.fn.multiselect = function(option, parameter, extraOptions) {
+ return this.each(function() {
+ var data = $(this).data('multiselect');
+ var options = typeof option === 'object' && option;
+
+ // Initialize the multiselect.
+ if (!data) {
+ data = new Multiselect(this, options);
+ $(this).data('multiselect', data);
+ }
+
+ // Call multiselect method.
+ if (typeof option === 'string') {
+ data[option](parameter, extraOptions);
+
+ if (option === 'destroy') {
+ $(this).data('multiselect', false);
+ }
+ }
+ });
+ };
+
+ $.fn.multiselect.Constructor = Multiselect;
+
+ $(function() {
+ $("select[data-role=multiselect]").multiselect();
+ });
+
+});
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/css/style.css b/examples/Sample App/DMS Sample App/src/Web/portal/css/style.css
new file mode 100755
index 0000000..ef1756c
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/portal/css/style.css
@@ -0,0 +1,230 @@
+.seclore-remove
+{
+ background-image : url('../images/ic_delete_default.png');
+}
+.seclore-checkin
+{
+ background-image : url('../images/ic_checkin_default.png');
+}
+.seclore-permission
+{
+ background-image : url('../images/ic_view-permission_default.png');
+}
+.seclore-download
+{
+ background-image : url('../images/ic_download_default.png');
+}
+.seclore-activity
+{
+ background-image : url('../images/ic_track_default.png');
+}
+.seclore-access-online
+{
+ background-image : url('../images/online-grey.png');
+ background-size: cover;
+}
+.seclore-access-offline
+{
+ background-image : url('../images/open-seclore.png');
+ background-size: cover;
+}
+
+.seclore-action
+{
+ width : 20px;
+ height : 20px;
+ background-repeat: no-repeat;
+}
+IMG, img
+{
+ border: none;
+}
+
+table thead
+{
+ background-color:#337ab7;
+ color:#fff;
+}
+table thead th
+{
+ background-color:#337ab7;
+ color:#fff;
+}
+
+.table-bordered tr:nth-child(even)
+{
+ background: #f4f4f4;
+}
+.table-bordered tr:nth-child(odd)
+{
+ background: #FFF
+}
+.breadcrumb
+{
+ background-color: #d9edf7;
+}
+
+.header
+{
+ height: 120px;
+ width: 100%;
+}
+.header img
+{
+ height: 100%;
+ width: 100%;
+}
+
+.header .user_name
+{
+ position: absolute;
+ right: 5px;
+ top: 2px;
+ color:#ccc;
+}
+.user_name .logout
+{
+ margin-left:6px;
+}
+.user_name .logout a
+{
+ color:#ccc;
+ text-decoration:underline;
+ font-size: 14px;
+}
+
+.header_inner
+{
+ margin-top: -30px;
+ margin-left: 20px;
+ margin-right: 20px;
+ position: relative;
+}
+
+.header_inner .app_name
+{
+ float: left;
+ font-size: 30px;
+ color: #f4f4f4;
+ margin-top: 25px;
+}
+.header_inner .user_logout{
+ color: #146EA2;
+ float: right;
+ margin-top: 5px;
+}
+.container
+{
+ margin-top: 20px;
+ margin-bottom: 20px;
+
+}
+
+.getstarted-box{
+ text-align: center;
+ margin-top:20px;
+}
+.redirect_link{
+ padding: 0px 40px;
+ display: inline-block;
+ font-family: 'Open Sans', Arial, Helvetica, sans-serif;
+ font-size: 15px;
+ font-weight: 700;
+ height: 42px;
+ line-height: 42px;
+ text-align: center;
+ text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.05);
+ text-transform: uppercase;
+ transition: 0.5s ease;
+ text-decoration: none;
+ border: 2px solid #888;
+}
+.redirect_link:HOVER{
+ color: #FFFFFF;
+ border: 2px solid #146EA2;
+ box-shadow: 0 100px 0 #146EA2 inset;
+ text-decoration: none;
+ border: 2px solid #888;
+}
+.supported_ext
+{
+ font-size: 12px;
+ font-style: italic;
+ color: #333;
+}
+.errors
+{
+ margin-left:10px;
+}
+.footer
+{
+ margin-top: 20px;
+ padding: 5px;
+ border-top: solid 1px #ccc;
+ display: inline-block;
+ width: 100%;
+}
+.version_info
+{
+ float:right;
+ margin-right:20px;
+}
+.footer_info
+{
+ float:left;
+ margin-left:20px;
+}
+
+img.action_icon{
+ width:20px;
+ height:20px;
+}
+
+.table_outer
+{
+ max-height:600px;
+ overflow: auto;
+}
+.title{
+ margin-top:20px;
+}
+
+.folder_form .input {
+ width: 300px;
+ max-width: 300px;
+ float: left;
+}
+
+.folder_form .checkbox {
+ width: 20px;
+}
+
+.file_form .input {
+ width: 350px;
+ max-width: 350px;
+ float: left;
+}
+select.form-control{
+ height:28px;
+ padding:2px;
+}
+#users_rights img{
+ width:15px;
+ height:15px;
+ cursor: pointer;
+}
+
+.readonlyElement{
+ margin-top:5px;
+ background-color:#f4f4f4;
+ padding:2px 4px;
+ border:solid 1px #ccc;
+ float:left;
+}
+.error
+{
+ color:red;
+}
+.success{
+ color: green;
+}
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/images/add.png b/examples/Sample App/DMS Sample App/src/Web/portal/images/add.png
new file mode 100755
index 0000000..e39e287
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/portal/images/add.png differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/images/ajax-loader.gif b/examples/Sample App/DMS Sample App/src/Web/portal/images/ajax-loader.gif
new file mode 100755
index 0000000..1fe22da
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/portal/images/ajax-loader.gif differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/images/busy.gif b/examples/Sample App/DMS Sample App/src/Web/portal/images/busy.gif
new file mode 100755
index 0000000..e81fd81
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/portal/images/busy.gif differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/images/delete.png b/examples/Sample App/DMS Sample App/src/Web/portal/images/delete.png
new file mode 100755
index 0000000..059548d
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/portal/images/delete.png differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/images/download.png b/examples/Sample App/DMS Sample App/src/Web/portal/images/download.png
new file mode 100755
index 0000000..2993e02
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/portal/images/download.png differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/images/edit.png b/examples/Sample App/DMS Sample App/src/Web/portal/images/edit.png
new file mode 100755
index 0000000..b111711
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/portal/images/edit.png differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/images/files.png b/examples/Sample App/DMS Sample App/src/Web/portal/images/files.png
new file mode 100755
index 0000000..fa02c62
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/portal/images/files.png differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/images/ic_checkin_default.png b/examples/Sample App/DMS Sample App/src/Web/portal/images/ic_checkin_default.png
new file mode 100755
index 0000000..c52f10b
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/portal/images/ic_checkin_default.png differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/images/ic_delete_default.png b/examples/Sample App/DMS Sample App/src/Web/portal/images/ic_delete_default.png
new file mode 100755
index 0000000..e825dbc
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/portal/images/ic_delete_default.png differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/images/ic_download_default.png b/examples/Sample App/DMS Sample App/src/Web/portal/images/ic_download_default.png
new file mode 100755
index 0000000..c7d1e28
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/portal/images/ic_download_default.png differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/images/ic_track_default.png b/examples/Sample App/DMS Sample App/src/Web/portal/images/ic_track_default.png
new file mode 100755
index 0000000..dbdbb3e
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/portal/images/ic_track_default.png differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/images/ic_txt-file_secured_small.png b/examples/Sample App/DMS Sample App/src/Web/portal/images/ic_txt-file_secured_small.png
new file mode 100755
index 0000000..5278661
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/portal/images/ic_txt-file_secured_small.png differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/images/ic_view-permission_default.png b/examples/Sample App/DMS Sample App/src/Web/portal/images/ic_view-permission_default.png
new file mode 100755
index 0000000..6afe305
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/portal/images/ic_view-permission_default.png differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/images/online-blue.png b/examples/Sample App/DMS Sample App/src/Web/portal/images/online-blue.png
new file mode 100755
index 0000000..d9fc26d
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/portal/images/online-blue.png differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/images/online-grey.png b/examples/Sample App/DMS Sample App/src/Web/portal/images/online-grey.png
new file mode 100755
index 0000000..3523eb3
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/portal/images/online-grey.png differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/images/open-seclore.png b/examples/Sample App/DMS Sample App/src/Web/portal/images/open-seclore.png
new file mode 100755
index 0000000..937f1ec
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/portal/images/open-seclore.png differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/images/seclore-header.jpg b/examples/Sample App/DMS Sample App/src/Web/portal/images/seclore-header.jpg
new file mode 100755
index 0000000..7ac742a
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/portal/images/seclore-header.jpg differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/images/user-rights.gif b/examples/Sample App/DMS Sample App/src/Web/portal/images/user-rights.gif
new file mode 100755
index 0000000..040b60c
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/portal/images/user-rights.gif differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/images/world-icon.png b/examples/Sample App/DMS Sample App/src/Web/portal/images/world-icon.png
new file mode 100755
index 0000000..d9583ee
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/portal/images/world-icon.png differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/images/world-icon1.png b/examples/Sample App/DMS Sample App/src/Web/portal/images/world-icon1.png
new file mode 100755
index 0000000..91f57d3
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/Web/portal/images/world-icon1.png differ
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/js/common.js b/examples/Sample App/DMS Sample App/src/Web/portal/js/common.js
new file mode 100755
index 0000000..db334ad
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/portal/js/common.js
@@ -0,0 +1,70 @@
+// For below IE 9 Support
+if(!String.prototype.trim)
+{
+ // console.log("define custom trim function");
+ String.prototype.trim= function()
+ {
+ return this.replace(/^\s+|\s+$/gm,'');
+ };
+}
+//For below IE 9 Support
+if( !Array.prototype.indexOf )
+{
+ // console.log("define custom indexOf function");
+ Array.prototype.indexOf = function(elt)
+ {
+ var len = this.length >>> 0;
+
+ var from = Number(arguments[1]) || 0;
+ from = (from < 0)
+ ? Math.ceil(from)
+ : Math.floor(from);
+ if (from < 0)
+ from += len;
+
+ for (; from < len; from++)
+ {
+ if (from in this &&
+ this[from] === elt)
+ return from;
+ }
+ return -1;
+ };
+}
+
+$(document).ready(function(){
+
+ // Error or Info Message will be disappeared after specified time.
+ /*
+ $("#messageDiv").animate({opacity: 0}, 20000, function(){
+ $("#messageDiv").empty();
+ });
+ */
+
+ // Check whether the browser support place holder or not
+ $.support.placeholder = ('placeholder' in document.createElement('input'));
+ if (!$.support.placeholder) {
+ $("[placeholder]").focus(function () {
+ if( $(this).val() == $(this).attr("placeholder") )
+ {
+ $(this).val("");
+ $(this).css('color','#555');
+ }
+ }).blur(function () {
+ if ( $(this).val() == "" ){
+ $(this).val( $(this).attr("placeholder") );
+ $(this).css('color','#999');
+ }
+ }).blur();
+
+ $("[placeholder]").parents("form").submit(function () {
+ $(this).find('[placeholder]').each(function() {
+ if ( $(this).val() == $(this).attr("placeholder") )
+ {
+ $(this).val("");
+ }
+ });
+ });
+ }
+
+});
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/js/file.js b/examples/Sample App/DMS Sample App/src/Web/portal/js/file.js
new file mode 100755
index 0000000..dde1e77
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/portal/js/file.js
@@ -0,0 +1,249 @@
+$(document).ready(function(){
+ // **** File related script START **** //
+
+ var usersRightsArray = new Array();
+ var tempUserArray = new Array();
+
+ function UsersRights(pUsersRights)
+ {
+ this.usersRights = pUsersRights;
+ }
+
+ function UserRight(pUserId, pUsageRights)
+ {
+ this.userId = pUserId;
+ this.usageRights = pUsageRights;
+ }
+
+ // On load prepare existing users with their usage rights
+ $("#users_rights tr.user_right").each(function() {
+ var tdFirst = $(this).find("td:first");
+ var userId = $(this).attr("userid");
+ if( tdFirst == null || tdFirst.text() == null || tdFirst.text().trim() == "" )
+ {
+ tdFirst.text(userId);
+ }
+ var usageRights = $(this).attr("usagerights");
+ tempUserArray.push(userId);
+ var ur = new UserRight(userId, usageRights);
+ usersRightsArray.push(ur);
+
+ });
+
+
+ $("#addUserBtn").click(function(){
+ // Clear the old messages
+ $("#emailId").css("border-color","#ccc");
+ $("#AddUserErrorMsg").text("");
+ $("#AddUserSuccessMsg").text("");
+
+ var userId = $("#emailId").val();
+ if ( userId == $("#emailId").attr("placeholder") )
+ {
+ userId = "";
+ }
+
+ if( userId == null || userId.trim().length == 0 )
+ {
+ $("#emailId").css("border-color","red");
+ $("#AddUserErrorMsg").text("Please enter the user's email id");
+ return;
+ }
+
+ userId = userId.trim();
+ // check whether user already added or not
+ if( tempUserArray.indexOf(userId) > -1)
+ {
+ $("#emailId").css("border-color","red");
+ $("#AddUserErrorMsg").text("User already exists");
+ return;
+ }
+
+ $.ajax({
+ type:'POST',
+ url:'searchUser.do',
+ data:{emailId:userId},
+ dataType:'json',
+ beforeSend:function(){
+ $("#InProgressEl").show();
+ $("#addUserBtn").attr("disabled","disabled");
+ },
+ })
+ .done(function(jsonData) {
+ if( jsonData == undefined || jsonData == null )
+ {
+ $("#AddUserErrorMsg").text("Invalid response received!");
+ return;
+ }
+ if( jsonData.status == -1)
+ {
+ $("#emailId").css("border-color","red");
+ $("#AddUserErrorMsg").text(jsonData.errorMessage);
+ return;
+ }
+
+ var name = jsonData.name;
+
+ // To make consistent display email id at the place of name //
+ var spanIcon = $('').attr({"class":"glyphicon glyphicon-user","aria-hidden":"true"});
+ var tdU = $(" ").append(spanIcon).append(document.createTextNode(" "+userId)).attr("title",name);
+
+ var defaultRights = $("#hiddenSelectEl .select_right").val();
+
+ var rightId = defaultRights;
+ var selectHtml = $("#hiddenSelectEl").html();
+
+ var tdR = $(" ").html(selectHtml);
+
+ var span = $('').attr({"title":"remove","class":"removeRight glyphicon glyphicon-remove","aria-hidden":"true","style":"color:red;cursor:pointer;"});
+ var tdA = $(" ").append(span);
+ var tr = $(" ").append(tdU).append(tdR).append(tdA).attr({"userid":userId,"usagerights":rightId});
+
+ $("#users_rights").append(tr);
+ $("#emailId").val('');
+
+ // Add user to Owner list if not exist
+ if( $("#ownerEmaiId option[value='"+userId+"']").length == 0 )
+ {
+ $("#ownerEmaiId").append($('', {
+ value: userId,
+ text: userId,
+ title: name
+ }));
+ }
+
+ tempUserArray.push(userId);
+
+ var ur = new UserRight(userId, rightId);
+ usersRightsArray.push(ur);
+ })
+ .fail(function() {
+ $("#AddUserErrorMsg").text("Error occured while processing the request");
+ })
+ .always(function() {
+ $("#InProgressEl").hide();
+ $("#addUserBtn").removeAttr("disabled");
+ });
+ });
+
+
+ // On change user rights function call
+ $("#users_rights").on("change",".select_right",function(){
+ var rights = $(this).val();
+ var tr = $(this).parent().parent();
+ var userId = tr.attr("userid");
+
+ for(var i in usersRightsArray)
+ {
+ var ur = usersRightsArray[i];
+ if ( ur.userId == userId )
+ {
+ ur.usageRights = rights;
+ break;
+ }
+ }
+ });
+
+ /*
+ $("#addAction").click(function(){
+ var valid = true;
+ var userId = $("#select_user").val();
+ var rightId = $("#select_right").val();
+
+ if(userId == null || userId.trim().length == 0)
+ {
+ $("#select_user").css("border-color","red");
+ valid = false;
+ }
+ else
+ {
+ // check whether user already added or not
+ if( tempUserArray.indexOf(userId) > -1)
+ {
+ $("#select_user").css("border-color","red");
+ $("#select_user").attr("title","This user has been already added");
+ valid = false;
+ }
+ else{
+ $("#select_user").css("border-color","#ccc");
+ $("#select_user").removeAttr("title");
+ }
+ }
+
+ if(rightId == null || rightId.trim().length == 0)
+ {
+ $("#select_right").css("border-color","red");
+ $("#select_right").attr("title","Select the rights");
+ valid = false;
+ }
+ else{
+ $("#select_right").css("border-color","#ccc");
+ $("#select_right").removeAttr("title");
+ }
+
+
+ if( !valid )
+ {
+ return false;
+ }
+
+
+ var userName = $("#select_user option:selected").text();
+ var rightName = $("#select_right option:selected").text();
+
+ var tdU = $("").text(userName);
+ var tdR = $(" ").text(rightName);
+
+
+ var span = $('').attr({"title":"remove","class":"removeRight glyphicon glyphicon-remove","aria-hidden":"true","style":"color:red;cursor:pointer;"});
+ var tdA = $(" ").append(span);
+ var tr = $(" ").append(tdU).append(tdR).append(tdA).attr({"userid":userId,"usagerights":rightId});
+
+ $("#users_rights tr#select_user_right").before(tr);
+ $("#select_user").val('');
+ $("#select_right").val('');
+
+ tempUserArray.push(userId);
+
+ var ur = new UserRight(userId, rightId);
+ usersRightsArray.push(ur);
+ });
+ */
+
+ $("#users_rights").on("click", ".removeRight", function(){
+
+ var tr = $(this).parent().parent();
+ var userId = tr.attr("userid");
+ var ti = tempUserArray.indexOf(userId);
+
+ tempUserArray.splice(ti, 1);
+
+ for(var i in usersRightsArray)
+ {
+ var ur = usersRightsArray[i];
+ if ( ur.userId == userId )
+ {
+ usersRightsArray.splice(i, 1);
+ break;
+ }
+ }
+
+ tr.remove();
+ });
+
+
+ $("#fileSaveBtn").click(function(){
+
+ try{
+ var lUsersRights = new UsersRights(usersRightsArray);
+ var jsonStr = JSON.stringify(lUsersRights);
+ $("#usersRightsField").val(jsonStr);
+ }
+ catch(error){
+ alert(error);
+ }
+ return true;
+ });
+
+ // **** File related script END **** //
+});
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/js/jquery.min-1.11.1.js b/examples/Sample App/DMS Sample App/src/Web/portal/js/jquery.min-1.11.1.js
new file mode 100755
index 0000000..ab28a24
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/portal/js/jquery.min-1.11.1.js
@@ -0,0 +1,4 @@
+/*! jQuery v1.11.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.1",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="
",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML=" ",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML=" ","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML=" ",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;
+if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML=" a ",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML=" ",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h ]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/\s*$/g,rb={option:[1,""," "],legend:[1,""," "],area:[1,""," "],param:[1,""," "],thead:[1,""],tr:[2,""],col:[2,""],td:[3,""],_default:k.htmlSerialize?[0,"",""]:[1,"X","
"]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1>$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?""!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1>$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("")).appendTo(b.documentElement),b=(Cb[0].contentWindow||Cb[0].contentDocument).document,b.write(),b.close(),c=Eb(a,b),Cb.detach()),Db[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Gb=/^margin/,Hb=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ib,Jb,Kb=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ib=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Hb.test(g)&&Gb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):y.documentElement.currentStyle&&(Ib=function(a){return a.currentStyle},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Hb.test(g)&&!Kb.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Lb(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML=" a ",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.style.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight)),b.innerHTML="",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Mb=/alpha\([^)]*\)/i,Nb=/opacity\s*=\s*([^)]*)/,Ob=/^(none|table(?!-c[ea]).+)/,Pb=new RegExp("^("+S+")(.*)$","i"),Qb=new RegExp("^([+-])=("+S+")","i"),Rb={position:"absolute",visibility:"hidden",display:"block"},Sb={letterSpacing:"0",fontWeight:"400"},Tb=["Webkit","O","Moz","ms"];function Ub(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Tb.length;while(e--)if(b=Tb[e]+c,b in a)return b;return d}function Vb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fb(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Wb(a,b,c){var d=Pb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));return g}function Yb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ib(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Jb(a,b,f),(0>e||null==e)&&(e=a.style[b]),Hb.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xb(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Jb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ub(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||m.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ub(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Jb(a,b,d)),"normal"===f&&b in Sb&&(f=Sb[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Ob.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Rb,function(){return Yb(a,b,d)}):Yb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ib(a);return Wb(a,c,d?Xb(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Nb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Mb,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Mb.test(f)?f.replace(Mb,e):f+" "+e)}}),m.cssHooks.marginRight=Lb(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Jb,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Gb.test(a)||(m.cssHooks[a+b].set=Wb)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ib(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Vb(this,!0)},hide:function(){return Vb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Zb(a,b,c,d,e){return new Zb.prototype.init(a,b,c,d,e)}m.Tween=Zb,Zb.prototype={constructor:Zb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?"":"px")
+},cur:function(){var a=Zb.propHooks[this.prop];return a&&a.get?a.get(this):Zb.propHooks._default.get(this)},run:function(a){var b,c=Zb.propHooks[this.prop];return this.pos=b=this.options.duration?m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Zb.propHooks._default.set(this),this}},Zb.prototype.init.prototype=Zb.prototype,Zb.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Zb.propHooks.scrollTop=Zb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Zb.prototype.init,m.fx.step={};var $b,_b,ac=/^(?:toggle|show|hide)$/,bc=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cc=/queueHooks$/,dc=[ic],ec={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bc.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bc.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fc(){return setTimeout(function(){$b=void 0}),$b=m.now()}function gc(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hc(a,b,c){for(var d,e=(ec[b]||[]).concat(ec["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ic(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fb(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fb(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ac.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fb(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hc(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jc(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kc(a,b,c){var d,e,f=0,g=dc.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$b||fc(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$b||fc(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jc(k,j.opts.specialEasing);g>f;f++)if(d=dc[f].call(j,a,k,j.opts))return d;return m.map(k,hc,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kc,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],ec[c]=ec[c]||[],ec[c].unshift(b)},prefilter:function(a,b){b?dc.unshift(a):dc.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kc(this,m.extend({},a),f);(e||m._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cc.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gc(b,!0),a,d,e)}}),m.each({slideDown:gc("show"),slideUp:gc("hide"),slideToggle:gc("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($b=m.now();ca ",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lc=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lc,""):null==c?"":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mc,nc,oc=m.expr.attrHandle,pc=/^(?:checked|selected)$/i,qc=k.getSetAttribute,rc=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nc:mc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rc&&qc||!pc.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qc?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nc={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rc&&qc||!pc.test(c)?a.setAttribute(!qc&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c=oc[b]||m.find.attr;oc[b]=rc&&qc||!pc.test(b)?function(a,b,d){var e,f;return d||(f=oc[b],oc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,oc[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rc&&qc||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mc&&mc.set(a,b,c)}}),qc||(mc={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},oc.id=oc.name=oc.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mc.set},m.attrHooks.contenteditable={set:function(a,b,c){mc.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sc=/^(?:input|select|textarea|button|object)$/i,tc=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=m.find.attr(a,"tabindex");return b?parseInt(b,10):sc.test(a.nodeName)||tc.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var uc=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(uc," ").indexOf(b)>=0)return!0;return!1}}),m.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var vc=m.now(),wc=/\?/,xc=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xc,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yc,zc,Ac=/#.*$/,Bc=/([?&])_=[^&]*/,Cc=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Dc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ec=/^(?:GET|HEAD)$/,Fc=/^\/\//,Gc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hc={},Ic={},Jc="*/".concat("*");try{zc=location.href}catch(Kc){zc=y.createElement("a"),zc.href="",zc=zc.href}yc=Gc.exec(zc.toLowerCase())||[];function Lc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mc(a,b,c,d){var e={},f=a===Ic;function g(h){var i;return e[h]=!0,m.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Nc(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Oc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zc,type:"GET",isLocal:Dc.test(yc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":m.parseJSON,"text xml":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nc(Nc(a,m.ajaxSettings),b):Nc(m.ajaxSettings,a)},ajaxPrefilter:Lc(Hc),ajaxTransport:Lc(Ic),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cc.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zc)+"").replace(Ac,"").replace(Fc,yc[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(c=Gc.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yc[1]&&c[2]===yc[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yc[3]||("http:"===yc[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mc(Hc,k,b,v),2===t)return v;h=k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Ec.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wc.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bc.test(e)?e.replace(Bc,"$1_="+vc++):e+(wc.test(e)?"&":"?")+"_="+vc++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Jc+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mc(Ic,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Oc(k,v,c)),u=Pc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qc=/%20/g,Rc=/\[\]$/,Sc=/\r?\n/g,Tc=/^(?:submit|button|image|reset|file)$/i,Uc=/^(?:input|select|textarea|keygen)/i;function Vc(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rc.test(a)?d(a,e):Vc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==m.type(b))d(a,b);else for(e in b)Vc(a+"["+e+"]",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vc(c,a[c],b,e);return d.join("&").replace(Qc,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Uc.test(this.nodeName)&&!Tc.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sc,"\r\n")}}):{name:b.name,value:c.replace(Sc,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zc()||$c()}:Zc;var Wc=0,Xc={},Yc=m.ajaxSettings.xhr();a.ActiveXObject&&m(a).on("unload",function(){for(var a in Xc)Xc[a](void 0,!0)}),k.cors=!!Yc&&"withCredentials"in Yc,Yc=k.ajax=!!Yc,Yc&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xc[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xc[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zc(){try{return new a.XMLHttpRequest}catch(b){}}function $c(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _c=[],ad=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_c.pop()||m.expando+"_"+vc++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ad.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ad.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ad,"$1"+e):b.jsonp!==!1&&(b.url+=(wc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_c.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bd=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bd)return bd.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cd=a.document.documentElement;function dd(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dd(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cd;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cd})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dd(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=Lb(k.pixelPosition,function(a,c){return c?(c=Jb(a,b),Hb.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ed=a.jQuery,fd=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fd),b&&a.jQuery===m&&(a.jQuery=ed),m},typeof b===K&&(a.jQuery=a.$=m),m});
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/js/openActivityOnMap.js b/examples/Sample App/DMS Sample App/src/Web/portal/js/openActivityOnMap.js
new file mode 100755
index 0000000..b22c618
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/portal/js/openActivityOnMap.js
@@ -0,0 +1,320 @@
+/**
+ *
+ */
+
+
+mapboxgl.accessToken = mapboxAccessToken;
+var dynamicTable = (function() {
+
+ var _tableId, _table,
+ _fields, _headers,
+ _defaultText;
+
+ /** Builds the row with columns from the specified names.
+ * If the item parameter is specified, the memebers of the names array will be used as property names of the item; otherwise they will be directly parsed as text.
+ */
+ function _buildRowColumns(names, item) {
+ var row = '
';
+ if (names && names.length > 0)
+ {
+ $.each(names, function(index, name) {
+ var c = item ? item[name+''] : name;
+ row += '' + c + ' ';
+ });
+ }
+ row += ' ';
+ return row;
+ }
+
+ /** Builds and sets the headers of the table. */
+ function _setHeaders() {
+ // if no headers specified, we will use the fields as headers.
+ _headers = (_headers == null || _headers.length < 1) ? _fields : _headers;
+ var h = _buildRowColumns(_headers);
+ if (_table.children('thead').length < 1) _table.prepend('
');
+ _table.children('thead').html(h);
+ }
+
+ function _setNoItemsInfo() {
+ if (_table.length < 1) return; //not configured.
+ var colspan = _headers != null && _headers.length > 0 ?
+ 'colspan="' + _headers.length + '"' : '';
+ var content = '
' +
+ _defaultText + ' ';
+ if (_table.children('tbody').length > 0)
+ _table.children('tbody').html(content);
+ else _table.append('
' + content + ' ');
+ }
+
+ function _removeNoItemsInfo() {
+ var c = _table.children('tbody').children('tr');
+ if (c.length == 1 && c.hasClass('no-items')) _table.children('tbody').empty();
+ }
+
+ return {
+ /** Configres the dynamic table. */
+ config: function(tableId, fields, headers, defaultText) {
+ _tableId = tableId;
+ _table = $('#' + tableId);
+ _fields = fields || null;
+ _headers = headers || null;
+ _defaultText = defaultText || 'No items to list...';
+ _setHeaders();
+ _setNoItemsInfo();
+ return this;
+ },
+ /** Loads the specified data to the table body. */
+ load: function(data, append) {
+ if (_table.length < 1) return; //not configured.
+ _setHeaders();
+ _removeNoItemsInfo();
+ if (data && data.length > 0) {
+ var rows = '';
+ $.each(data, function(index, item) {
+ rows += _buildRowColumns(_fields, item);
+ });
+ var mthd = append ? 'append' : 'html';
+ _table.children('tbody')[mthd](rows);
+ }
+ else {
+ _setNoItemsInfo();
+ }
+ return this;
+ },
+ /** Clears the table body. */
+ clear: function() {
+ _setNoItemsInfo();
+ return this;
+ }
+ };
+}());
+
+var map = new mapboxgl.Map({
+ container: 'map',
+ style: 'mapbox://styles/mapbox/streets-v11',
+ center: [-103.59179687498357, 40.66995747013945],
+ zoom: 2
+});
+map.on('load', function() {
+ mapSource = map.addSource("openActivityLog", {
+ type: "geojson",
+
+ data : secloreData
+,
+ cluster: true,
+ clusterMaxZoom: 14, // Max zoom to cluster points on
+ clusterRadius: 50 // Radius of each cluster when clustering points (defaults to 50)
+ }).getSource('openActivityLog');
+
+ map.addLayer({
+ id: "groupOfActivities",
+ type: "circle",
+ source: "openActivityLog",
+ filter: ["has", "point_count"],
+ paint: {
+ "circle-color": [
+ "step",
+ ["get", "point_count"],
+ "#666",
+ 5,
+ "#f1f075",
+ 20,
+ "#f28cb1"
+ ],
+ "circle-radius": [
+ "step",
+ ["get", "point_count"],
+ 25,
+ 5,
+ 30,
+ 20,
+ 40
+ ]
+ }
+ }
+ );
+
+ map.addLayer({
+ id: "groupOfActivities-count",
+ type: "symbol",
+ source: "openActivityLog",
+ filter: ["has", "point_count_abbreviated"],
+ layout: {
+ "text-field": "{point_count_abbreviated}",
+ "text-font": ["DIN Offc Pro Medium", "Arial Unicode MS Bold"],
+ "text-size": 12
+ }
+ });
+ map.addLayer({
+ id: "singleActivity",
+ type: "circle",
+ source: "openActivityLog",
+ filter: ["!", ["has", "point_count"]],
+ paint: {
+ "circle-color": [
+ "step",
+ ["get", "authorized"],
+ "red",
+ 1,
+ "green",
+ 750,
+ "#f28cb1"
+ ],
+ "circle-radius": 6,
+ "circle-stroke-width": 2,
+ "circle-stroke-color": "black"
+ }
+ });
+
+
+
+var hoveredStateId = null;
+ function getAllClusterChildren(error, allChildren, e)
+ {
+ var i = 0;
+ var description = "";
+ for(;i
asd : " + allChildren[i].activity;
+ }
+ openPopUp(e,description);
+ }
+
+
+ var event = null;
+ map.on('mouseenter', 'groupOfActivities', function (e) {
+ if (e.features.length > 0) {
+ var clusterId = e.features[0].properties.cluster_id;
+ event = e;
+ mapSource.getClusterLeaves(clusterId, 200, 0,function(error, allChildren){
+ var description = "";
+ var noOfUsers = 0 ;
+ var users = [];
+ var authCount = 0;
+ var totalActivities = allChildren.length;
+ for(var i = 0;i
0) {
+ var clusterId = e.features[0].properties.cluster_id;
+ event = e;
+ mapSource.getClusterLeaves(clusterId, 200, 0,function(error, allChildren){
+ var description = "";
+ var users = [];
+ var totalActivities = allChildren.length;
+ for(var i = 0;i 0) {
+ event = e;
+ dt.load([e.features[0].properties]);
+ scrollTableUp();
+ }
+ });
+
+
+
+ var popup = new mapboxgl.Popup({
+ closeButton: false,
+ closeOnClick: false
+ });
+
+ map.on('mouseenter', 'singleActivity', function(e){
+ event = e;
+ description=getSinglePointPopupContent(e.features[0].properties);
+ openPopUp(description);
+
+ });
+
+ map.on('mouseleave', 'groupOfActivities', closePopUp);
+ map.on('mouseleave', 'singleActivity', closePopUp);
+
+ function openPopUp(description) {
+ // Change the cursor style as a UI indicator.
+ map.getCanvas().style.cursor = 'pointer';
+
+ var coordinates = event.features[0].geometry.coordinates.slice();
+ ;
+
+ // Ensure that if the map is zoomed out such that multiple
+ // copies of the feature are visible, the popup appears
+ // over the copy being pointed to.
+ while (Math.abs(event.lngLat.lng - coordinates[0]) > 180) {
+ coordinates[0] += event.lngLat.lng > coordinates[0] ? 360 : -360;
+ }
+ // Populate the popup and set its coordinates
+ // based on the feature found.
+ popup.setLngLat(coordinates)
+ .setHTML(description)
+ .addTo(map);
+ }
+
+ function closePopUp(){
+ map.getCanvas().style.cursor = '';
+ popup.remove();
+ }
+
+ var adminLayers = ['admin-0-boundary', 'admin-1-boundary', 'admin-0-boundary-disputed', 'admin-1-boundary-bg', 'admin-0-boundary-bg'];
+ adminLayers.forEach(function(adminLayer) {
+ map.setFilter(adminLayer, ["match", ["get", "worldview"], ["all", "IN"], true, false]);
+ });
+
+ var dt = dynamicTable.config('data-table',
+ ['id', 'filename', 'user', 'client-type', 'time', 'authorizedDisplayString', 'mode'],
+ ['ID', 'Current File Name', 'User', 'Client Type', 'Time', 'Authorized?', 'Mode'], //set to null for field names instead of custom header names
+ 'Click on a point on the map to view its details.');
+ document.getElementById('data-table').classList.add("table");
+ document.getElementById('data-table').classList.add("table-striped");
+});
+function getClusterPopupContent(noOfUsers, totalActivities, authCount)
+{
+ var description= "
";
+ description+= " "+ noOfUsers+"
";
+ description+= " "+ authCount+"
";
+ description+= " "+ (totalActivities - authCount)+"
";
+ description+= " "
+ return description;
+}
+function getSinglePointPopupContent(activityDetails)
+{
+
+ var description= "
";
+ description+= " "+ activityDetails.user;
+ description+= ""
+ return description;
+}
+
+function scrollTableUp()
+{
+ $('html,body').animate({
+ scrollTop: $("#data-table").offset().top},
+ 'slow');
+}
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/pages/SOError.jsp b/examples/Sample App/DMS Sample App/src/Web/portal/pages/SOError.jsp
new file mode 100755
index 0000000..462bcee
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/portal/pages/SOError.jsp
@@ -0,0 +1,85 @@
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
+ pageEncoding="ISO-8859-1"%>
+
+
+
+
+
+
+Redirecting to Error Page..
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/pages/appUser.jsp b/examples/Sample App/DMS Sample App/src/Web/portal/pages/appUser.jsp
new file mode 100755
index 0000000..10bcacb
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/portal/pages/appUser.jsp
@@ -0,0 +1,86 @@
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
+ pageEncoding="ISO-8859-1"%>
+<%@ taglib prefix="core" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Sr. No.
+ Name (User ID)
+ Edit
+ Delete
+
+
+
+
+
+
+ ${counter.count}
+
+
+
+
+
+
+
+ " title="Edit User Name" class="editUserBtn" userid=" ">
+
+
+
+
+ " title="Delete the user">
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/pages/blacklistedCountriesDropDown.jsp b/examples/Sample App/DMS Sample App/src/Web/portal/pages/blacklistedCountriesDropDown.jsp
new file mode 100755
index 0000000..6acefa5
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/portal/pages/blacklistedCountriesDropDown.jsp
@@ -0,0 +1,46 @@
+<%@page import="java.util.HashSet"%>
+<%@page import="java.util.Map.Entry"%>
+<%@page import="java.util.HashMap"%>
+<%@page import="com.seclore.sample.dms.util.GeoLocationUtil"%>
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
+ pageEncoding="ISO-8859-1"%>
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/pages/changeUser.jsp b/examples/Sample App/DMS Sample App/src/Web/portal/pages/changeUser.jsp
new file mode 100755
index 0000000..6774fa4
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/portal/pages/changeUser.jsp
@@ -0,0 +1,61 @@
+<%@page import="com.seclore.sample.dms.config.SampleAppConfig"%>
+<%@page import="com.seclore.sample.dms.util.CommonUtil"%>
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
+ pageEncoding="ISO-8859-1"%>
+
+
+
+
+Change User
+
+
+<%
+String lUser = (String) session.getAttribute("name");
+lUser = CommonUtil.isStringEmpty(lUser)?SampleAppConfig.getDummyUserName():lUser;
+%>
+
+Change User Login
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/pages/file.jsp b/examples/Sample App/DMS Sample App/src/Web/portal/pages/file.jsp
new file mode 100755
index 0000000..bbfa272
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/portal/pages/file.jsp
@@ -0,0 +1,205 @@
+<%@page import="com.seclore.sample.dms.config.SampleAppConfig"%>
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
+<%@ taglib prefix="core" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/pages/fileList.jsp b/examples/Sample App/DMS Sample App/src/Web/portal/pages/fileList.jsp
new file mode 100755
index 0000000..e09e918
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/portal/pages/fileList.jsp
@@ -0,0 +1,139 @@
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
+ pageEncoding="ISO-8859-1"%>
+<%@ taglib prefix="core" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
+
+
+
+
+
+
+
+
+
+
+
Folder:
+
IRM Enabled:
+
+
File List
+
+
+
+
+
+
+ Sr. No.
+ Document
+ Check-in
+ Version
+ Last Modified by
+ Last Modified Time
+
+ Online Access
+
+ Access on Desktop
+ Download
+ Permission
+ Activity
+ Delete
+
+
+
+
+
+
+ ${counter.count}
+ ">
+
+
+ <%-- --%>
+
+
+
+
+
+ &fileId= " title="Check-in the file">
+
+
+
+
+
+
+ .
+
+
+
+
+
+
+
+
+
+
+ <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
+
+
+
+
+
+
+
+
+ &fileId= " title="Access online" target="_blank">
+
+
+
+
+
+
+
+ &fileId= " title="Access on desktop" target="_blank">
+
+
+
+
+
+
+ &fileId= " title="Download the file">
+
+
+
+
+
+
+ &fileId= " title="Add/Edit users and rights on the file">
+
+
+
+
+
+
+ &fileId= " title="Activity">
+
+
+
+
+
+
+ &fileId= " title="Delete the file">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/pages/folder.jsp b/examples/Sample App/DMS Sample App/src/Web/portal/pages/folder.jsp
new file mode 100755
index 0000000..c510e73
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/portal/pages/folder.jsp
@@ -0,0 +1,73 @@
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
+ pageEncoding="ISO-8859-1"%>
+<%@ taglib prefix="core" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/pages/folderList.jsp b/examples/Sample App/DMS Sample App/src/Web/portal/pages/folderList.jsp
new file mode 100755
index 0000000..8b199f0
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/portal/pages/folderList.jsp
@@ -0,0 +1,77 @@
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
+ pageEncoding="ISO-8859-1"%>
+<%@ taglib prefix="core" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Sr. No.
+ Name
+ IRM Enabled
+ Edit
+ Delete
+
+
+
+
+
+
+ ${counter.count}
+
+
+ " title="View files">
+
+ <%-- --%>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ " title="Edit the folder">
+
+
+
+
+ " title="Delete the folder">
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/pages/footer.jsp b/examples/Sample App/DMS Sample App/src/Web/portal/pages/footer.jsp
new file mode 100755
index 0000000..d1aa382
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/portal/pages/footer.jsp
@@ -0,0 +1,16 @@
+ <%@ page import="com.seclore.sample.dms.version.Version" %>
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/pages/header.jsp b/examples/Sample App/DMS Sample App/src/Web/portal/pages/header.jsp
new file mode 100755
index 0000000..dca59fe
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/portal/pages/header.jsp
@@ -0,0 +1,52 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
+<%@ taglib prefix="core" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+
+
+
+
+
+My File Share
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/pages/home.jsp b/examples/Sample App/DMS Sample App/src/Web/portal/pages/home.jsp
new file mode 100755
index 0000000..b8cb5c5
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/portal/pages/home.jsp
@@ -0,0 +1,28 @@
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
+ pageEncoding="ISO-8859-1"%>
+<%@ taglib prefix="core" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/pages/logs.jsp b/examples/Sample App/DMS Sample App/src/Web/portal/pages/logs.jsp
new file mode 100755
index 0000000..ceeeee6
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/portal/pages/logs.jsp
@@ -0,0 +1,91 @@
+<%@page import="com.seclore.sample.dms.config.SampleAppConfig"%>
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
+<%@ taglib prefix="core" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
+
+
+
+
+
+
+
Original File Name :
+<%
+if(SampleAppConfig.isLocationBasedFeatureEnabled())
+{
+%>
+
( &fileId= ">View on map)
+<%
+}
+%>
+
+
+
+
+
+ ID
+ Current File Name
+ User
+ Activity
+ Client Type
+ Time
+ Authorized?
+ Mode
+
+
+
+
+
+
+
+
+
+
+ Protect
+ View
+ Edit
+ Print
+ Redistribute
+ Unprotect
+ Transfer Ownership
+ Accessed Remotely
+ Access on VM
+ Capture Screen
+ Copy Data
+ Macro
+ View in Lite Viewer
+ Create Offline Package
+
+ ${item.activityId}
+
+ (for )
+
+
+
+
+
+
+ Yes
+ No
+
+
+ Online
+ Offline
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/pages/message.jsp b/examples/Sample App/DMS Sample App/src/Web/portal/pages/message.jsp
new file mode 100755
index 0000000..f288868
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/portal/pages/message.jsp
@@ -0,0 +1,20 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8"
+ pageEncoding="UTF-8"%>
+<%@ taglib prefix="core" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/pages/open.jsp b/examples/Sample App/DMS Sample App/src/Web/portal/pages/open.jsp
new file mode 100755
index 0000000..1c2f766
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/portal/pages/open.jsp
@@ -0,0 +1,96 @@
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
+ pageEncoding="ISO-8859-1"%>
+
+
+
+
+
+
+
Redirecting..
+
+
+
+
+<%
+ String lstrBusyGifURL = (String) request.getAttribute("serviceUrl") + "/portal/images/busy.gif";
+%>
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/pages/openActivityOnMap.jsp b/examples/Sample App/DMS Sample App/src/Web/portal/pages/openActivityOnMap.jsp
new file mode 100755
index 0000000..f1a3231
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/portal/pages/openActivityOnMap.jsp
@@ -0,0 +1,121 @@
+<%@page import="com.seclore.sample.dms.config.SampleAppConfig"%>
+<%@page import="java.util.Date"%>
+<%@page import="java.util.List"%>
+<%@page import="com.seclore.sample.dms.core.IPGeoDetails"%>
+<%@page import="com.seclore.sample.dms.core.FileActivityLog"%>
+<%@page import="java.util.HashMap"%>
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
+<%@ taglib prefix="core" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
+
+
+
+
+
+
+
+
+ Folder List
+ "> File List
+ &fileId= "> Activity
+ Map view
+
+
+
+
Open Activies for the file ' '
+
+
+
+
+<%
+HashMap
ip2geodetailsmap = (HashMap)request.getAttribute("ip2geodetailsmap");
+List activitylist = (List)request.getAttribute("fileactivitylog");
+if(ip2geodetailsmap != null && activitylist != null && ip2geodetailsmap.size()>0 && activitylist.size()>0)
+{
+%>
+
+
+
*This is for demonstration purposes only. Map not to scale. Actual map location may vary.
+
+
+
+<%
+}
+else
+{
+ session.setAttribute("ERROR_MESSAGE", "No records found to view on the map");
+}
+
+%>
+
+
+
+
+
+
+
+
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/pages/pageNotFound404.jsp b/examples/Sample App/DMS Sample App/src/Web/portal/pages/pageNotFound404.jsp
new file mode 100755
index 0000000..6adee45
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/portal/pages/pageNotFound404.jsp
@@ -0,0 +1,13 @@
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
+ pageEncoding="ISO-8859-1"%>
+<%@ taglib prefix="core" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
+
+
+
+ The page you were looking for could not be found!
+
+
+ Back to Home
+
+
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/Web/portal/pages/serverError.jsp b/examples/Sample App/DMS Sample App/src/Web/portal/pages/serverError.jsp
new file mode 100755
index 0000000..b885bc8
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/Web/portal/pages/serverError.jsp
@@ -0,0 +1,20 @@
+<%@page import="com.seclore.sample.dms.util.LoggerUtil"%>
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
+ pageEncoding="ISO-8859-1"%>
+<%@ taglib prefix="core" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
+<%@ page isErrorPage="true" %>
+
+
+ <%LoggerUtil.logError("Server Error:"+exception.getMessage(), exception);%>
+
+ The server encountered an internal error and was unable to complete your request.
+
+
+ More information about this error may be available in the application error log.
+
+
+
+ Back to Home
+
+
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/dependencies/javax.servlet-api-4.0.0.jar b/examples/Sample App/DMS Sample App/src/dependencies/javax.servlet-api-4.0.0.jar
new file mode 100755
index 0000000..9c9f4b7
Binary files /dev/null and b/examples/Sample App/DMS Sample App/src/dependencies/javax.servlet-api-4.0.0.jar differ
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/ara/webservice/ARAClassificationDetails.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/ara/webservice/ARAClassificationDetails.java
new file mode 100755
index 0000000..9e3d809
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/ara/webservice/ARAClassificationDetails.java
@@ -0,0 +1,39 @@
+package com.seclore.sample.ara.webservice;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * Represents Policy Server classification information.
+ *
+ */
+@XmlRootElement(name = "ara-classification-details")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class ARAClassificationDetails {
+ /** Unique identifier of the Classification generated by FileSecure. */
+ @XmlElement(name = "fs-id")
+ private String fsId;
+
+ /** Name of the classification in FileSecure */
+ @XmlElement(name = "name")
+ private String name;
+
+ public String getFsId() {
+ return fsId;
+ }
+
+ public void setFsId(String fsId) {
+ this.fsId = fsId;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/ara/webservice/ARAEnvironmentDetails.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/ara/webservice/ARAEnvironmentDetails.java
new file mode 100755
index 0000000..f98ccdf
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/ara/webservice/ARAEnvironmentDetails.java
@@ -0,0 +1,23 @@
+package com.seclore.sample.ara.webservice;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement(name="ara-environment-details")
+@XmlAccessorType(XmlAccessType.FIELD)
+
+public class ARAEnvironmentDetails {
+ @XmlElement(name="request-ip-address")
+ private String requestIPAddress;
+
+ public String getRequestIPAddress() {
+ return requestIPAddress;
+ }
+
+ public void setRequestIPAddress(String requestIPAddress) {
+ this.requestIPAddress = requestIPAddress;
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/ara/webservice/ARAFileDetails.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/ara/webservice/ARAFileDetails.java
new file mode 100755
index 0000000..300f192
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/ara/webservice/ARAFileDetails.java
@@ -0,0 +1,85 @@
+package com.seclore.sample.ara.webservice;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * Represents Policy Server File information
+ *
+ */
+@XmlRootElement(name = "ara-file-details")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class ARAFileDetails {
+ /**
+ * Hot Folder id created by Policy Server
+ */
+ @XmlElement(name = "fs-id")
+ private String fsId;
+
+ /**
+ * External application (i.e. DMS) folder Id
+ */
+ @XmlElement(name = "ext-id")
+ private String extId;
+
+ /**
+ * External application (i.e. DMS) folder name
+ */
+ @XmlElement(name = "ext-name")
+ private String extName;
+
+ /**
+ * Any external data which is mentioned at time of folder creation.
+ */
+ @XmlElement(name = "ext-data")
+ private String extData;
+
+ /**
+ * Any external app id which is mentioned at time of folder creation.
+ */
+ @XmlElement(name = "ext-app-id")
+ private String extAppId;
+
+ public String getFsId() {
+ return fsId;
+ }
+
+ public void setFsId(String fsId) {
+ this.fsId = fsId;
+ }
+
+ public String getExtId() {
+ return extId;
+ }
+
+ public void setExtId(String extId) {
+ this.extId = extId;
+ }
+
+ public String getExtName() {
+ return extName;
+ }
+
+ public void setExtName(String extName) {
+ this.extName = extName;
+ }
+
+ public String getExtData() {
+ return extData;
+ }
+
+ public void setExtData(String extData) {
+ this.extData = extData;
+ }
+
+ public String getExtAppId() {
+ return extAppId;
+ }
+
+ public void setExtAppId(String extAppId) {
+ this.extAppId = extAppId;
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/ara/webservice/ARAHotFolderDetails.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/ara/webservice/ARAHotFolderDetails.java
new file mode 100755
index 0000000..41d0bb0
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/ara/webservice/ARAHotFolderDetails.java
@@ -0,0 +1,86 @@
+package com.seclore.sample.ara.webservice;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * Represents Policy Server Folder information
+ *
+ */
+@XmlRootElement(name = "ara-hot-folder-details")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class ARAHotFolderDetails {
+
+ /**
+ * Hot Folder id created by Policy Server
+ */
+ @XmlElement(name = "fs-id")
+ private String fsId;
+
+ /**
+ * External application (i.e. DMS) folder Id
+ */
+ @XmlElement(name = "ext-id")
+ private String extId;
+
+ /**
+ * External application (i.e. DMS) folder name
+ */
+ @XmlElement(name = "ext-name")
+ private String extName;
+
+ /**
+ * Any external data which is mentioned at time of folder creation.
+ */
+ @XmlElement(name = "ext-data")
+ private String extData;
+
+ /**
+ * Any external app id which is mentioned at time of folder creation.
+ */
+ @XmlElement(name = "ext-app-id")
+ private String extAppId;
+
+ public String getFsId() {
+ return fsId;
+ }
+
+ public void setFsId(String fsId) {
+ this.fsId = fsId;
+ }
+
+ public String getExtId() {
+ return extId;
+ }
+
+ public void setExtId(String extId) {
+ this.extId = extId;
+ }
+
+ public String getExtName() {
+ return extName;
+ }
+
+ public void setExtName(String extName) {
+ this.extName = extName;
+ }
+
+ public String getExtData() {
+ return extData;
+ }
+
+ public void setExtData(String extData) {
+ this.extData = extData;
+ }
+
+ public String getExtAppId() {
+ return extAppId;
+ }
+
+ public void setExtAppId(String extAppId) {
+ this.extAppId = extAppId;
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/ara/webservice/ARAOwnerDetails.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/ara/webservice/ARAOwnerDetails.java
new file mode 100755
index 0000000..d9ab3c4
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/ara/webservice/ARAOwnerDetails.java
@@ -0,0 +1,37 @@
+package com.seclore.sample.ara.webservice;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ *
+ * Represents Policy Server File Owner information
+ */
+@XmlRootElement(name = "ara-owner-details")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class ARAOwnerDetails {
+ /** File Owner Details */
+ @XmlElement(name = "ara-user-details")
+ private ARAUserDetails araUserDetails;
+
+ /**
+ * Get File Owner user
+ *
+ * @return
+ */
+ public ARAUserDetails getAraUserDetails() {
+ return araUserDetails;
+ }
+
+ /**
+ * Set File Owner user
+ *
+ * @param araUserDetails
+ */
+ public void setAraUserDetails(ARAUserDetails araUserDetails) {
+ this.araUserDetails = araUserDetails;
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/ara/webservice/ARARequestHandler.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/ara/webservice/ARARequestHandler.java
new file mode 100755
index 0000000..2559b17
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/ara/webservice/ARARequestHandler.java
@@ -0,0 +1,493 @@
+package com.seclore.sample.ara.webservice;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.ext.Provider;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.seclore.sample.dms.constant.Constants;
+import com.seclore.sample.dms.core.AppFile;
+import com.seclore.sample.dms.core.Classification;
+import com.seclore.sample.dms.core.Owner;
+import com.seclore.sample.dms.util.GeoLocationUtil;
+import com.seclore.sample.dms.util.LoggerUtil;
+import com.seclore.sample.dms.util.xml.XMLDBService;
+
+/**
+ * Access Right Adaptor (ARA) request handler which receive request from Policy
+ * Server and return response with DMS rights.
+ *
+ */
+@Path("/request")
+@Provider
+public class ARARequestHandler {
+
+ /**
+ * Handle Access Right Adaptor ping request
+ *
+ * @param pingRequsetXML - Request XML received in the HTTP request body
+ * @return Response XML
+ */
+ @GET
+ @POST
+ @Path("/ping")
+ @Consumes(MediaType.APPLICATION_XML)
+ @Produces(MediaType.APPLICATION_XML)
+ public String handleARAPingRequest(String pingRequsetXML) {
+ String lstrMethodName = this.getClass().getName() + "::handleARAPingRequest:: ";
+ LoggerUtil.logDebug(lstrMethodName + "START");
+
+ Document document = XMLHelper.parseDocument(pingRequsetXML);
+ Node rootNode = XMLHelper.getRootNode(document);
+
+ String requestId = XMLHelper.parseRequestId(rootNode);
+ String errorMessageXML = "";
+ String displayMessageXML = "";
+ String pingResponseXML = "" +
+ "" +
+ "" + XMLHelper.escapeForXML(requestId) + " " +
+ "1 " +
+ "" + XMLHelper.SUCCESS + " " +
+ errorMessageXML + displayMessageXML +
+ " " +
+
+ "" +
+ "" +
+ "" + XMLHelper.PROTOCOL_VERSION + " " +
+ " " +
+
+ "" +
+ "1 " +
+ "2 " +
+ "3 " +
+ "4 " +
+ " " +
+ " " +
+
+ " ";
+
+ String lstrReqResp = "" + pingRequsetXML + pingResponseXML + " ";
+ LoggerUtil.logDebug(lstrMethodName + "[" + requestId + "]:" + "Request and Response XML: " + lstrReqResp);
+ LoggerUtil.logDebug(lstrMethodName + "[" + requestId + "]:" + "END");
+ return pingResponseXML;
+ }
+
+ /**
+ * Handle Access Right Adaptor get access right request
+ *
+ * @return XML response
+ * @param requsetXML - Request XML received in the HTTP request body
+ * @return Response XML
+ */
+ @GET
+ @POST
+ @Path("/getaccessright")
+ @Consumes(MediaType.APPLICATION_XML)
+ @Produces(MediaType.APPLICATION_XML)
+ public String handleARAGetAccessRight(String requsetXML) {
+ String lstrMethodName = this.getClass().getName() + "::handleARAGetAccessRight:: ";
+ LoggerUtil.logDebug(lstrMethodName + "START");
+ LoggerUtil.logDebug(lstrMethodName + ": Received ARA Request XML:- " + requsetXML);
+
+ Document document = XMLHelper.parseDocument(requsetXML);
+ Node rootNode = XMLHelper.getRootNode(document);
+ String requestId = XMLHelper.parseRequestId(rootNode);
+
+ String errorMessageXML = "";
+ String displayMessageXML = "";
+ String status = XMLHelper.SUCCESS;
+ int fsPrimaryRight = 0;
+ String fileName = "";
+ String lstrXMLOwner = "";
+ String lstrXMLClassification = "";
+ String lstrXMLARADispMsg = "";
+ try {
+ Node requestDetailsNode = XMLHelper.parseNode("ara-request-details-get-access-right", rootNode);
+ ARAHotFolderDetails hfDetails = XMLHelper.parseHFDetails(requestDetailsNode);
+ ARAClassificationDetails classificationDetails = XMLHelper.parseClassification(requestDetailsNode);
+ ARAUserDetails userDetails = XMLHelper.parseUserDetails(requestDetailsNode);
+ ARAFileDetails fileDetails = XMLHelper.parseFileDetails(requestDetailsNode);
+ ARAOwnerDetails ownereDetails = XMLHelper.parseOwnerDetails(requestDetailsNode);
+ ARAEnvironmentDetails environmentDetails = XMLHelper.parseEnvironmentDetails(requestDetailsNode);
+
+ fileName = fileDetails.getExtName();
+ String lstrExtnData = fileDetails.getExtData();
+
+ if (lstrExtnData == null || lstrExtnData.trim().isEmpty()) {
+ throw new Exception("File External Reference data not found!");
+ }
+
+ String userId = userDetails.getExtId();
+ String emailId = userDetails.getEmailId();
+
+ LoggerUtil.logDebug(lstrMethodName + "[" + requestId + "]:" + " UserId: " + userId);
+ LoggerUtil.logDebug(lstrMethodName + "[" + requestId + "]:" + " EmailId: " + emailId);
+
+ JsonParser lJsonParser = new JsonParser();
+ JsonObject lJsonObj = (JsonObject) lJsonParser.parse(lstrExtnData.trim());
+ JsonElement lJsonElement = lJsonObj.get(Constants.KEY_HF_EXTN_REF_ID);
+ if (lJsonElement == null) {
+ throw new Exception("'" + Constants.KEY_HF_EXTN_REF_ID + "' not found in file external data");
+ }
+ String lstrExtnHfid = lJsonElement.getAsString();
+ String lstrCountryCode = null;
+ try {
+ if (!(environmentDetails == null || environmentDetails.getRequestIPAddress() == null
+ || environmentDetails.getRequestIPAddress().trim().isEmpty())) {
+ LoggerUtil.logDebug(
+ "Request IP address in environment details : " + environmentDetails.getRequestIPAddress());
+ lstrCountryCode = GeoLocationUtil
+ .getCountryCodeFromIPAddress(environmentDetails.getRequestIPAddress());
+ LoggerUtil.logDebug(
+ "Country code for '" + environmentDetails.getRequestIPAddress() + "' : " + lstrCountryCode);
+ } else {
+ LoggerUtil.logError("Valid environment details not found.");
+ }
+ } catch (Exception e) {
+ LoggerUtil.logError(lstrMethodName + "Error while fetching country code from IP Address : "
+ + environmentDetails.getRequestIPAddress(), e);
+ }
+ boolean isCountryBlacklisted = XMLDBService.isCountryBlackListed(lstrCountryCode, lstrExtnHfid,
+ fileDetails.getExtId());
+ if (isCountryBlacklisted == true) {
+ lstrXMLARADispMsg = ""
+ + XMLHelper.escapeForXML(
+ "File '" + fileDetails.getExtName() + "' is being accessed from a blacklisted country ")
+ + " ";
+ LoggerUtil.logDebug(lstrMethodName + "[" + requestId + "]:" + "File '" + fileDetails.getExtName()
+ + "' is being accessed from a blacklisted country : "
+ + GeoLocationUtil.getCountryCodeToNameMap().get(lstrCountryCode));
+ } else {
+ // int rights = XMLDBService.getUserRights( userId, emailId,
+ // hfDetails.getExtId() ,fileDetails.getExtId() );
+ int rights = XMLDBService.getUserRights(userId, emailId, lstrExtnHfid, fileDetails.getExtId());
+
+ if (rights == Constants.FILE_NOT_EXIST) {
+ status = "-1";
+ errorMessageXML = ""
+ + XMLHelper.escapeForXML("Requested File '" + fileDetails.getExtName() + "' does not exist")
+ + " ";
+ displayMessageXML = ""
+ + XMLHelper.escapeForXML("Requested File '" + fileDetails.getExtName() + "' does not exist")
+ + " ";
+ LoggerUtil.logDebug(lstrMethodName + "[" + requestId + "]:" + " Requested File '"
+ + fileDetails.getExtName() + "' does not exist");
+ } else if (rights == Constants.NO_RIGHTS) {
+ lstrXMLARADispMsg = ""
+ + XMLHelper.escapeForXML("User'" + userDetails.getName()
+ + "' does not have rights on file '" + fileDetails.getExtName() + "'")
+ + " ";
+ LoggerUtil.logDebug(lstrMethodName + "[" + requestId + "]:" + " User'" + userDetails.getName()
+ + "' does not have rights on file '" + fileDetails.getExtName() + "'");
+ } else {
+ fsPrimaryRight = mapWithFileSecureRights(rights);
+ }
+ }
+
+ // get file owner
+ if (status == XMLHelper.SUCCESS) {
+ // Prepare Owner XML
+ AppFile lFile = XMLDBService.getFile(lstrExtnHfid, fileDetails.getExtId());
+ Owner lOwner = lFile.getOwner();
+ lstrXMLOwner = prepareOwnerXML(requestId, lOwner, ownereDetails);
+
+ // Prepare Classification XML
+ Classification lClassification = lFile.getClassification();
+ lstrXMLClassification = prepareClassificationXML(requestId, lClassification, classificationDetails);
+
+ }
+ } catch (Exception exp) {
+ status = "-290013";
+ errorMessageXML = ""
+ + XMLHelper.escapeForXML("Error occured while fetching the rights - " + exp.getMessage())
+ + " ";
+ displayMessageXML = ""
+ + XMLHelper.escapeForXML("Some error occured while fetching the rights") + " ";
+ LoggerUtil.logError(lstrMethodName + "[" + requestId + "]:" + " Error occured while fetching the rights - "
+ + exp.getMessage(), exp);
+ }
+
+ // Construct response header XML
+ String respHeaderXML = "" +
+ "" + requestId + " " +
+ "1 " +
+ "" + status + " " +
+ errorMessageXML +
+ displayMessageXML +
+ " ";
+
+ String respDetailsXML = "";
+ if (status == XMLHelper.SUCCESS) {
+ respDetailsXML = generateResponseDetailsXML(fsPrimaryRight, lstrXMLARADispMsg, fileName, lstrXMLOwner,
+ lstrXMLClassification);
+ }
+
+ // Construct response XML
+ String responseXML = "" +
+ respHeaderXML +
+ respDetailsXML +
+ " ";
+
+ String lstrReqResp = "" + requsetXML + responseXML + " ";
+ LoggerUtil.logInfo(lstrMethodName + "[" + requestId + "]:" + " Request and Response XML: " + lstrReqResp);
+ LoggerUtil.logDebug(lstrMethodName + "[" + requestId + "]:" + "END");
+ return responseXML;
+ }
+
+ @GET
+ @POST
+ @Path("/getfileinformation")
+ @Consumes(MediaType.APPLICATION_XML)
+ @Produces(MediaType.APPLICATION_XML)
+ public String handleARAGetFileDetails(String requsetXML) {
+ String lstrMethodName = this.getClass().getName() + "::handleARAGetFileDetails:: ";
+ LoggerUtil.logDebug(lstrMethodName + "START");
+ LoggerUtil.logDebug(lstrMethodName + "Received GetFileDetails Request XML:- " + requsetXML);
+
+ Document document = XMLHelper.parseDocument(requsetXML);
+ Node rootNode = XMLHelper.getRootNode(document);
+ String requestId = XMLHelper.parseRequestId(rootNode);
+
+ String errorMessageXML = "";
+ String displayMessageXML = "";
+ String status = XMLHelper.SUCCESS;
+ String fileName = "";
+ String lstrXMLOwner = "";
+ String lstrXMLClassification = "";
+ try {
+ Node requestDetailsNode = XMLHelper.parseNode("ara-request-details-get-file-information", rootNode);
+ ARAHotFolderDetails hfDetails = XMLHelper.parseHFDetails(requestDetailsNode);
+ ARAClassificationDetails classificationDetails = XMLHelper.parseClassification(requestDetailsNode);
+ ARAFileDetails fileDetails = XMLHelper.parseFileDetails(requestDetailsNode);
+ ARAOwnerDetails ownereDetails = XMLHelper.parseOwnerDetails(requestDetailsNode);
+
+ fileName = fileDetails.getExtName();
+ String lstrExtnData = fileDetails.getExtData();
+
+ if (lstrExtnData == null || lstrExtnData.trim().isEmpty()) {
+ throw new Exception("File External Reference data not found!");
+ }
+
+ LoggerUtil.logDebug(lstrMethodName + "[" + requestId + "]:" + "FS FileID: " + fileDetails.getFsId());
+ LoggerUtil.logDebug(lstrMethodName + "[" + requestId + "]:" + "Ext FileID: " + fileDetails.getExtId());
+ LoggerUtil.logDebug(lstrMethodName + "[" + requestId + "]:" + "Ext FileName: " + fileName);
+
+ JsonParser lJsonParser = new JsonParser();
+ JsonObject lJsonObj = (JsonObject) lJsonParser.parse(lstrExtnData.trim());
+ JsonElement lJsonElement = lJsonObj.get(Constants.KEY_HF_EXTN_REF_ID);
+ if (lJsonElement == null) {
+ throw new Exception("'" + Constants.KEY_HF_EXTN_REF_ID + "' not found in file external data");
+ }
+ String lstrExtnHfid = lJsonElement.getAsString();
+
+ AppFile lFile = XMLDBService.getFile(lstrExtnHfid, fileDetails.getExtId());
+ if (lFile == null) {
+ status = "-1";
+ errorMessageXML = ""
+ + XMLHelper.escapeForXML("Requested File '" + fileDetails.getExtName() + "' does not exist")
+ + " ";
+ displayMessageXML = ""
+ + XMLHelper.escapeForXML("Requested File '" + fileDetails.getExtName() + "' does not exist")
+ + " ";
+ LoggerUtil.logDebug(lstrMethodName + "[" + requestId + "]:" + " Requested File '"
+ + fileDetails.getExtName() + "' does not exist");
+ } else {
+ // Prepare Owner XML
+ Owner lOwner = lFile.getOwner();
+ lstrXMLOwner = prepareOwnerXML(requestId, lOwner, ownereDetails);
+
+ // Prepare Classification XML
+ Classification lClassification = lFile.getClassification();
+ lstrXMLClassification = prepareClassificationXML(requestId, lClassification, classificationDetails);
+ }
+ } catch (Exception exp) {
+ status = "-2";
+ errorMessageXML = ""
+ + XMLHelper.escapeForXML("Error occured while fetching the file details- " + exp.getMessage())
+ + " ";
+ displayMessageXML = ""
+ + XMLHelper.escapeForXML("Some error occured while fetching the file details")
+ + " ";
+ LoggerUtil.logError(lstrMethodName + "[" + requestId + "]:"
+ + " Error occured while fetching the file details - " + exp.getMessage(), exp);
+ }
+
+ // Construct response header XML
+ String respHeaderXML = "" +
+ "" + requestId + " " +
+ "1 " +
+ "" + status + " " +
+ errorMessageXML +
+ displayMessageXML +
+ " ";
+
+ String respDetailsXML = "";
+ if (status == XMLHelper.SUCCESS) {
+ respDetailsXML = "" +
+ lstrXMLClassification +
+ lstrXMLOwner +
+ " ";
+
+ }
+
+ // Construct response XML
+ String responseXML = "" +
+ respHeaderXML +
+ respDetailsXML +
+ " ";
+
+ String lstrReqResp = "" + requsetXML + responseXML + " ";
+ LoggerUtil.logInfo(lstrMethodName + "[" + requestId + "]:" + "Request and Response XML: " + lstrReqResp);
+ LoggerUtil.logDebug(lstrMethodName + "[" + requestId + "]:" + "END");
+ return responseXML;
+ }
+
+ /**
+ * Generate get access right response details
+ *
+ * @param pFSPrimaryRight
+ * @param pFileName
+ * @param pOwnerXML
+ * @param pClassificationXML
+ * @return
+ */
+ private String generateResponseDetailsXML(int pFSPrimaryRight, String pXMLARADispMsg, String pFileName,
+ String pOwnerXML, String pClassificationXML) {
+
+ String lstrXMLWaterMark = "";
+ if (pFSPrimaryRight != 0) {
+ lstrXMLWaterMark = "" +
+ "" +
+ "This document is '$FILECLASS$' " +
+ "User- $USERNAME$ " +
+ "File- " + XMLHelper.escapeForXML(pFileName) + "($FILEID$) " +
+ "$VIEWTIME$ " +
+ " " +
+ " ";
+ }
+ // Construct response details xml = "";
+ String respDetailsXML = "" +
+ "" +
+ "" + pFSPrimaryRight + " " +
+ /* "false "+ */
+ " " +
+
+ // ARA-Display-Message if there is no right
+ pXMLARADispMsg +
+
+ // Water mark XML
+ lstrXMLWaterMark +
+
+ // Add classification and owner XML
+ pClassificationXML +
+ pOwnerXML +
+ " ";
+ return respDetailsXML;
+ }
+
+ /**
+ * Map application rights to Seclore FileSecure right
+ *
+ * @param rights
+ * @return
+ */
+ private int mapWithFileSecureRights(int rights) {
+ if (rights == 0) {
+ return 0;
+ }
+
+ // Read
+ else if (rights == 1) {
+ // View | Light View | Copy Data | Screen Capture
+ return (2 | 6 | 258 | 514);
+ }
+
+ // Read + Change
+ else if (rights == 2) {
+ // View | Light View | Edit | Copy Data | Screen Capture
+ return (2 | 6 | 34 | 258 | 514);
+ }
+
+ // Read + Print
+ else if (rights == 3) {
+ // View | Light View | Print | Copy Data | Screen Capture
+ return (2 | 6 | 10 | 258 | 514);
+ }
+
+ // Read + Change + Print
+ else if (rights == 4) {
+ // View | Light View | Print | Edit | Copy Data | Screen Capture
+ return (2 | 6 | 10 | 34 | 258 | 514);
+ }
+
+ // Full Control
+ else if (rights == 5) {
+ // View|Lite Viewer|Print|Edit|Full Control|Copy Data|Screen Capture| Macro
+ return (2 | 6 | 10 | 34 | 170 | 258 | 514 | 1026);
+ }
+ return 0;
+
+ }
+
+ private String prepareOwnerXML(String pRequestId, Owner lOwner, ARAOwnerDetails ownereDetails) throws Exception {
+ String lstrMethodName = this.getClass().getName() + "::prepareOwnerXML::";
+ LoggerUtil.logDebug(lstrMethodName + "[" + pRequestId + "]:" + "START");
+ if (lOwner != null) {
+ String emailXML = "";
+ String lstrEmailId = lOwner.getEmailId();
+ if (lstrEmailId != null && !lstrEmailId.trim().isEmpty()) {
+ emailXML = "" + XMLHelper.escapeForXML(lstrEmailId) + " ";
+ }
+
+ // if email-id is available
+ if (!emailXML.isEmpty()) {
+ String lstrXML = "" + emailXML
+ + " ";
+ LoggerUtil.logInfo(lstrMethodName + "[" + pRequestId + "]:"
+ + "File Owner details return by application: " + lstrXML);
+ LoggerUtil.logDebug(lstrMethodName + "[" + pRequestId + "]:" + "END");
+ return lstrXML;
+ }
+ }
+
+ // Default Owner
+ String lstrXML = XMLHelper.generatOwnerDetailsXML(ownereDetails);
+ LoggerUtil.logInfo(lstrMethodName + "[" + pRequestId + "]:"
+ + "Same file owner (received in request) is returned by application: " + lstrXML);
+ LoggerUtil.logDebug(lstrMethodName + "[" + pRequestId + "]:" + "END");
+ return lstrXML;
+ }
+
+ private String prepareClassificationXML(String pRequestId, Classification lClassification,
+ ARAClassificationDetails classificationDetails) throws Exception {
+ String lstrMethodName = this.getClass().getName() + "::prepareClassificationXML::";
+ LoggerUtil.logDebug(lstrMethodName + "[" + pRequestId + "]:" + "START");
+ if (lClassification != null) {
+ String lstrClsfin = lClassification.getId();
+ if (lstrClsfin != null && !lstrClsfin.trim().isEmpty()) {
+ LoggerUtil.logInfo(lstrMethodName + "[" + pRequestId + "]:" + "Classification return by application: "
+ + lClassification.getName() + "(" + lstrClsfin + ")");
+ String lstrXML = "" + lstrClsfin + " "
+ + lClassification.getName() + " ";
+ LoggerUtil.logDebug(lstrMethodName + "[" + pRequestId + "]:" + "END");
+ return lstrXML;
+ }
+ }
+
+ // Default Classification
+ String lstrXML = XMLHelper.generatClassificationDetailsXML(classificationDetails);
+ LoggerUtil.logInfo(lstrMethodName + "[" + pRequestId + "]:"
+ + "Same classification (received in request) is return by application: " + lstrXML);
+ LoggerUtil.logDebug(lstrMethodName + "[" + pRequestId + "]:" + "END");
+ return lstrXML;
+ }
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/ara/webservice/ARAUserDetails.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/ara/webservice/ARAUserDetails.java
new file mode 100755
index 0000000..913bc6f
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/ara/webservice/ARAUserDetails.java
@@ -0,0 +1,63 @@
+package com.seclore.sample.ara.webservice;
+
+import java.io.Serializable;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * Represents Policy Server User details
+ *
+ */
+@XmlRootElement(name = "ara-user-details")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class ARAUserDetails implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @XmlElement(name = "ext-id")
+ private String extId;
+
+ @XmlElement(name = "rep-code")
+ private String repoCode;
+
+ @XmlElement(name = "name")
+ private String name;
+
+ @XmlElement(name = "email-id")
+ private String emailId;
+
+ public String getExtId() {
+ return extId;
+ }
+
+ public void setExtId(String extId) {
+ this.extId = extId;
+ }
+
+ public String getRepoCode() {
+ return repoCode;
+ }
+
+ public void setRepoCode(String repoCode) {
+ this.repoCode = repoCode;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getEmailId() {
+ return emailId;
+ }
+
+ public void setEmailId(String emailId) {
+ this.emailId = emailId;
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/ara/webservice/XMLHelper.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/ara/webservice/XMLHelper.java
new file mode 100755
index 0000000..9882902
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/ara/webservice/XMLHelper.java
@@ -0,0 +1,236 @@
+package com.seclore.sample.ara.webservice;
+
+import java.io.StringReader;
+import java.io.StringWriter;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpressionException;
+import javax.xml.xpath.XPathFactory;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+
+import com.seclore.sample.dms.util.LoggerUtil;
+
+/**
+ * XML helper class used to parse information from request XML.
+ *
+ */
+public class XMLHelper {
+ public static final String PROTOCOL_VERSION = "1";
+ public static final String SUCCESS = "1";
+ private static XPath xpath = XPathFactory.newInstance().newXPath();
+
+ public static Document parseDocument(String xmlString) {
+ try {
+ DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder builder = builderFactory.newDocumentBuilder();
+ Document xmlDocument = builder.parse(new InputSource(new StringReader(xmlString)));
+ return xmlDocument;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public static Node getRootNode(Document document) {
+ NodeList nodeList = document.getChildNodes();
+
+ return nodeList.item(0);
+ }
+
+ /**
+ * @param xmlTagName
+ * @param parentNode
+ * @return
+ */
+ public static Node parseNode(String xmlTagName, Node parentNode) {
+ try {
+ Node node = (Node) xpath.evaluate(xmlTagName, parentNode, XPathConstants.NODE);
+ return node;
+ } catch (XPathExpressionException e) {
+ LoggerUtil.logError("Error while parsing - " + xmlTagName, e);
+ }
+ return null;
+ }
+
+ /**
+ * @param xmlTagName
+ * @param parentNode
+ * @return
+ */
+ public static NodeList parseNodeList(String xmlTagName, Node parentNode) {
+ try {
+ NodeList nodeList = (NodeList) xpath.evaluate(xmlTagName, parentNode, XPathConstants.NODESET);
+ return nodeList;
+ } catch (XPathExpressionException e) {
+ LoggerUtil.logError("Error while parsing - " + xmlTagName, e);
+ }
+ return null;
+ }
+
+ public static String parseRequestId(Node parentNode) {
+ try {
+ String requestId = (String) xpath.evaluate("//ara-request-header/request-id/text()", parentNode,
+ XPathConstants.STRING);
+ return requestId;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ public static ARAUserDetails parseUserDetails(Node parentNode) {
+ try {
+ Node node = (Node) xpath.evaluate("//ara-request-details-get-access-right/ara-user-details", parentNode,
+ XPathConstants.NODE);
+ if (node == null) {
+ return null;
+ }
+ JAXBContext jaxbContext = JAXBContext.newInstance(ARAUserDetails.class);
+ Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
+ ARAUserDetails userDetails = (ARAUserDetails) jaxbUnmarshaller.unmarshal(node);
+ return userDetails;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public static ARAHotFolderDetails parseHFDetails(Node parentNode) {
+ try {
+ Node node = (Node) xpath.evaluate("ara-hot-folder-details", parentNode, XPathConstants.NODE);
+ if (node == null) {
+ return null;
+ }
+ JAXBContext jaxbContext = JAXBContext.newInstance(ARAHotFolderDetails.class);
+ Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
+ ARAHotFolderDetails hfDetails = (ARAHotFolderDetails) jaxbUnmarshaller.unmarshal(node);
+ return hfDetails;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public static ARAFileDetails parseFileDetails(Node parentNode) {
+ try {
+ Node node = (Node) xpath.evaluate("ara-file-details", parentNode, XPathConstants.NODE);
+ if (node == null) {
+ return null;
+ }
+ JAXBContext jaxbContext = JAXBContext.newInstance(ARAFileDetails.class);
+ Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
+ ARAFileDetails fileDetails = (ARAFileDetails) jaxbUnmarshaller.unmarshal(node);
+ return fileDetails;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public static ARAClassificationDetails parseClassification(Node parentNode) {
+ try {
+ Node node = (Node) xpath.evaluate("ara-classification-details", parentNode, XPathConstants.NODE);
+ if (node == null) {
+ return null;
+ }
+ JAXBContext jaxbContext = JAXBContext.newInstance(ARAClassificationDetails.class);
+ Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
+ ARAClassificationDetails classificationDetails = (ARAClassificationDetails) jaxbUnmarshaller
+ .unmarshal(node);
+ return classificationDetails;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public static ARAOwnerDetails parseOwnerDetails(Node parentNode) {
+ try {
+ Node node = (Node) xpath.evaluate("ara-owner-details", parentNode, XPathConstants.NODE);
+ if (node == null) {
+ return null;
+ }
+ JAXBContext jaxbContext = JAXBContext.newInstance(ARAOwnerDetails.class);
+ Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
+ ARAOwnerDetails ownerDetails = (ARAOwnerDetails) jaxbUnmarshaller.unmarshal(node);
+ return ownerDetails;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public static ARAEnvironmentDetails parseEnvironmentDetails(Node parentNode) {
+ try {
+ Node node = (Node) xpath.evaluate("ara-environment-details", parentNode, XPathConstants.NODE);
+ if (node == null) {
+ return null;
+ }
+ JAXBContext jaxbContext = JAXBContext.newInstance(ARAEnvironmentDetails.class);
+ Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
+ ARAEnvironmentDetails environmentDetails = (ARAEnvironmentDetails) jaxbUnmarshaller.unmarshal(node);
+ return environmentDetails;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public static String generatOwnerDetailsXML(ARAOwnerDetails pARAOwnerDetails) throws Exception {
+ if (pARAOwnerDetails == null) {
+ return "";
+ }
+
+ try {
+ JAXBContext jaxbContext = JAXBContext.newInstance(ARAOwnerDetails.class);
+ Marshaller lMarshaller = jaxbContext.createMarshaller();
+ lMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, false);
+ lMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
+ StringWriter lsw = new StringWriter();
+ lMarshaller.marshal(pARAOwnerDetails, new StreamResult(lsw));
+ return lsw.toString();
+ } catch (Exception e) {
+ throw e;
+ }
+ }
+
+ public static String generatClassificationDetailsXML(ARAClassificationDetails classificationDetails)
+ throws Exception {
+ if (classificationDetails == null) {
+ return "";
+ }
+
+ try {
+ JAXBContext jaxbContext = JAXBContext.newInstance(ARAClassificationDetails.class);
+ Marshaller lMarshaller = jaxbContext.createMarshaller();
+ lMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, false);
+ lMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
+ StringWriter lsw = new StringWriter();
+ lMarshaller.marshal(classificationDetails, new StreamResult(lsw));
+ return lsw.toString();
+ } catch (Exception e) {
+ throw e;
+ }
+ }
+
+ public static String escapeForXML(String strXML) {
+ if (strXML == null || strXML.trim().isEmpty()) {
+ return strXML;
+ }
+
+ return strXML.replace("&", "&").replace("<", "<").replace(">", ">").replace("\"", """)
+ .replace("'", "'");
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/config/SampleAppConfig.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/config/SampleAppConfig.java
new file mode 100755
index 0000000..49f4ab2
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/config/SampleAppConfig.java
@@ -0,0 +1,319 @@
+package com.seclore.sample.dms.config;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
+
+import com.seclore.sample.dms.util.CommonUtil;
+import com.seclore.sample.dms.util.LoggerUtil;
+import com.seclore.sample.exceptions.DMSSampleException;
+
+/**
+ *Holds the App level config.
+ *
+ */
+public class SampleAppConfig
+{
+ private static final String SAMPLE_APP_CONFIG_PATH = "config" + File.separator + "SampleAppConfig.properties";
+
+ private static String mstrExtnHotFolderId;
+
+ private static boolean mbLocationBasedFeatureEnabled;
+
+ private static String mstrIPStackApiKey;
+
+ private static String mstrMapboxApiKey;
+
+ private static String mstrDummyUserName;
+
+ private static String mstrOpenOnlineMode;
+
+ private static String mstrEnterpriseAppURL;
+
+ private static String mstrPolicyServerURL;
+
+ private static String mstrSecloreOnlineURL;
+
+ private static boolean mAllowEdit;
+
+ private static boolean mAllowDownload;
+
+ private static boolean mAllowUnprotectedDownload;
+
+ private static boolean mEmailCopy;
+
+ private static boolean mAllowSaveback;
+
+ private static String mstrATTTL;
+
+ public static void initializeSampleAppConfig(String pAppPath)
+ {
+ InputStream lInputStream = null;
+ try
+ {
+
+ Properties lProps = new Properties();
+
+ String lstrSampleAppConfigFile = pAppPath + File.separator + SAMPLE_APP_CONFIG_PATH;
+ lInputStream = new FileInputStream(lstrSampleAppConfigFile);
+ lProps.load(lInputStream);
+
+ // Fetch hot folder external id
+ String lstrHFExtnRefId = lProps.getProperty("hotFolder.external.ref.id", "");
+ if (lstrHFExtnRefId == null || lstrHFExtnRefId.trim().isEmpty())
+ {
+ throw new Exception("HotFolder External Reference id is not configured!");
+ }
+
+ mstrExtnHotFolderId = lstrHFExtnRefId.trim();
+
+ String lstrLocationBasedFeatureEnabled = lProps.getProperty("location.based.features.enable", "false");
+ if (lstrLocationBasedFeatureEnabled == null || lstrLocationBasedFeatureEnabled.trim().isEmpty())
+ {
+ mbLocationBasedFeatureEnabled = false;
+ }
+ else
+ {
+ try
+ {
+ mbLocationBasedFeatureEnabled = Boolean.parseBoolean(lstrLocationBasedFeatureEnabled);
+ }
+ catch (Exception e)
+ {
+ }
+ }
+
+ if (mbLocationBasedFeatureEnabled == true)
+ {
+ String lstrIPStackApiKey = lProps.getProperty("ip.stack.api.key", "");
+ if (lstrIPStackApiKey == null || lstrIPStackApiKey.trim().isEmpty())
+ {
+ throw new Exception("IPStack API key is not configured!");
+ }
+ mstrIPStackApiKey = lstrIPStackApiKey.trim();
+
+ String lstrMapboxApiKey = lProps.getProperty("mapbox.api.key", "");
+ if (lstrMapboxApiKey == null || lstrMapboxApiKey.trim().isEmpty())
+ {
+ throw new Exception("Mapbox API key is not configured!");
+ }
+ mstrMapboxApiKey = lstrMapboxApiKey.trim();
+ }
+
+ String lstrDummyUser = lProps.getProperty("dummy.user.name", "Dummy User");
+ if (lstrDummyUser == null || lstrDummyUser.trim().isEmpty())
+ {
+ throw new Exception("Dummy User Reference id is not configured!");
+ }
+ mstrDummyUserName = lstrDummyUser.trim();
+
+ String lstrOpenOnlineMode = lProps.getProperty("open.online.mode", "view");
+ if (lstrOpenOnlineMode == null || lstrOpenOnlineMode.trim().isEmpty())
+ {
+ throw new Exception("Open Online mode is not configured!.Set to default view mode.");
+ }
+ mstrOpenOnlineMode = lstrOpenOnlineMode.trim();
+
+ mstrEnterpriseAppURL = CommonUtil.removeEndSlash(getPropertyFromProperties(lProps, "EnterpriseAppURL"));
+ mstrSecloreOnlineURL = CommonUtil.removeEndSlash(getPropertyFromProperties(lProps, "SecloreOnlineURL"));
+ mstrPolicyServerURL = CommonUtil.removeEndSlash(getPropertyFromProperties(lProps, "PolicyServerURL"));
+
+ mstrATTTL = getPropertyFromProperties(lProps, "AccessTokenTimeToLive");
+
+ mAllowEdit = getFlagFromProperties(lProps, "Allow-Edit");
+ mAllowDownload = getFlagFromProperties(lProps, "Allow-Download");
+ mAllowSaveback = getFlagFromProperties(lProps, "Allow-Saveback");
+ mAllowUnprotectedDownload = getFlagFromProperties(lProps, "Allow-Unprotect-Download");
+ mEmailCopy = getFlagFromProperties(lProps, "Email-Copy");
+
+ }
+ catch (Exception lEx)
+ {
+ LoggerUtil.logError("Error while initialize HotFolder config properties", lEx);
+ }
+ finally
+ {
+ if (lInputStream != null)
+ {
+ try
+ {
+ lInputStream.close();
+ }
+ catch (IOException ioException)
+ {
+ }
+ }
+ }
+ }
+
+ private static String getPropertyFromProperties(Properties pProperties,
+ String pProperty) throws DMSSampleException
+ {
+ if (pProperties.containsKey(pProperty) && !CommonUtil.isStringEmpty((String) pProperties.get(pProperty))
+ && pProperties.get(pProperty) != null)
+ {
+ return ((String) pProperties.get(pProperty)).trim();
+ }
+ else
+ {
+ throw new DMSSampleException(pProperty + " not found in Configurations.");
+ }
+ }
+
+ private static boolean getFlagFromProperties(Properties pProperties,
+ String pProperty) throws DMSSampleException
+ {
+ if (pProperties.containsKey(pProperty) && pProperties.get(pProperty) != ""
+ && pProperties.get(pProperty) != null)
+ {
+ return ((String) pProperties.get(pProperty)).trim().equals("1") ? true : false;
+ }
+ else
+ {
+ throw new DMSSampleException(pProperty + " flag not set not found in Configurations.");
+ }
+ }
+
+ public static String getExternalHotFolderId()
+ {
+ return mstrExtnHotFolderId;
+ }
+
+ public static boolean isLocationBasedFeatureEnabled()
+ {
+ return mbLocationBasedFeatureEnabled;
+ }
+
+ public static void setLocationBasedFeatureEnabled(boolean pLocationBasedFeatureEnabled)
+ {
+ mbLocationBasedFeatureEnabled = pLocationBasedFeatureEnabled;
+ }
+
+ public static String getDummyUserName()
+ {
+ return mstrDummyUserName;
+ }
+
+ public static void setDummyUserName(String pDummyUserName)
+ {
+ mstrDummyUserName = pDummyUserName;
+ }
+
+ public static String getMapboxApiKey()
+ {
+ return mstrMapboxApiKey;
+ }
+
+ public static String getIPStackApiKey()
+ {
+ return mstrIPStackApiKey;
+ }
+
+ public static void setIPStackApiKey(String pIPStackApiKey)
+ {
+ mstrIPStackApiKey = pIPStackApiKey;
+ }
+
+ public static String getOpenOnlineMode()
+ {
+ return mstrOpenOnlineMode;
+ }
+
+ public static void setOpenOnlineMode(String pOpenOnlineMode)
+ {
+ SampleAppConfig.mstrOpenOnlineMode = pOpenOnlineMode;
+ }
+
+ public static String getEnterpriseAppURL()
+ {
+ return mstrEnterpriseAppURL;
+ }
+
+ public static void setEnterpriseAppURL(String pEnterpriseAppURL)
+ {
+ SampleAppConfig.mstrEnterpriseAppURL = pEnterpriseAppURL;
+ }
+
+ public static String getPSURL()
+ {
+ return mstrPolicyServerURL;
+ }
+
+ public static void setmPSURLs(String pPSURL)
+ {
+ SampleAppConfig.mstrPolicyServerURL = pPSURL;
+ }
+
+ public static String getSecloreOnlineURL()
+ {
+ return mstrSecloreOnlineURL;
+ }
+
+ public static void setSecloreOnlineURL(String pSecloreOnlineURL)
+ {
+ SampleAppConfig.mstrSecloreOnlineURL = pSecloreOnlineURL;
+ }
+
+ public static boolean isAllowEdit()
+ {
+ return mAllowEdit;
+ }
+
+ public static void setAllowEdit(boolean pAllowEdit)
+ {
+ SampleAppConfig.mAllowEdit = pAllowEdit;
+ }
+
+ public static boolean isAllowDownload()
+ {
+ return mAllowDownload;
+ }
+
+ public static void setAllowDownload(boolean pAllowDownload)
+ {
+ SampleAppConfig.mAllowDownload = pAllowDownload;
+ }
+
+ public static boolean isAllowUnprotect()
+ {
+ return mAllowUnprotectedDownload;
+ }
+
+ public static void setAllowUnprotect(boolean pAllowUnprotect)
+ {
+ SampleAppConfig.mAllowUnprotectedDownload = pAllowUnprotect;
+ }
+
+ public static boolean isEmailCopy()
+ {
+ return mEmailCopy;
+ }
+
+ public static void setEmailCopy(boolean pEmailCopy)
+ {
+ SampleAppConfig.mEmailCopy = pEmailCopy;
+ }
+
+ public static boolean isAllowSaveback()
+ {
+ return mAllowSaveback;
+ }
+
+ public static void setAllowSaveback(boolean pAllowSaveback)
+ {
+ SampleAppConfig.mAllowSaveback = pAllowSaveback;
+ }
+
+ public static String getATTTL()
+ {
+ return mstrATTTL;
+ }
+
+ public static void setATTTL(String pATTTL)
+ {
+ SampleAppConfig.mstrATTTL = pATTTL;
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/config/SecloreWSClientConfig.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/config/SecloreWSClientConfig.java
new file mode 100755
index 0000000..50bccae
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/config/SecloreWSClientConfig.java
@@ -0,0 +1,155 @@
+package com.seclore.sample.dms.config;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.nio.charset.Charset;
+
+import org.w3c.dom.Node;
+
+import com.seclore.fs.helper.exception.FSHelperException;
+import com.seclore.fs.helper.library.FSHelperLibrary;
+import com.seclore.sample.dms.util.Global;
+import com.seclore.sample.dms.util.ParserUtil;
+
+/**
+ * A utility class used to initialize and terminate WSClient Library
+ *
+ */
+public class SecloreWSClientConfig {
+ private static final String FS_LOGGER_CONFIG_PATH = "config" + File.separator + "config.xml";
+ private static final String FS_TENANT_CONFIG_PATH = "config" + File.separator + "cabinet config.xml";
+ private static final String FS_TENANT_RESOURCE_PATH = "config";
+
+ /** Used to connect at time of File upload using WebConnect Integration */
+ private static String sstrProxyServerName = null;
+
+ /** Used to connect at time of File upload using WebConnect Integration */
+ private static int siProxyServerPort = -1;
+
+ public static void initializeWSClient(String appPath) {
+ String wsClientLoggerConfigFilePath = appPath + File.separator + FS_LOGGER_CONFIG_PATH;
+ String loggerConfigContentXMLString = null;
+ String wsClientTenantConfigFilePath = appPath + File.separator + FS_TENANT_CONFIG_PATH;
+ String tenantConfigContentXMLString = null;
+ String wsClientTenantResourcePath = appPath + File.separator + FS_TENANT_RESOURCE_PATH;
+ try {
+
+ loggerConfigContentXMLString = getConfigFileContent(wsClientLoggerConfigFilePath);
+ tenantConfigContentXMLString = getConfigFileContent(wsClientTenantConfigFilePath);
+
+ // Initialize method takes WSClient config content not the config file path.
+ FSHelperLibrary.initialize(loggerConfigContentXMLString);
+ FSHelperLibrary.initializeHelper(Global.getFSTenantId(), wsClientTenantResourcePath,
+ tenantConfigContentXMLString);
+ System.out.println("Seclore WSClient Library has been initialized successfully");
+
+ } catch (FSHelperException e) {
+ System.out.println("Seclore WSClient Library has not been Initialized!");
+ e.printStackTrace();
+ } catch (Exception e) {
+ System.out.println("Seclore WSClient Library has not been Initialized!");
+ e.printStackTrace();
+ }
+
+ // -------- Extract proxy-details for WebConnect Integration START
+ // --------------- //
+ // proxy-details from WSClient config will be used to connect Policy Server.
+ // If WebConnect Integration will not be required then no need to do this.
+ initializeProxyDetails(loggerConfigContentXMLString);
+ // -------- Extract proxy-details for WebConnect Integration END ---------------
+ // //
+
+ }
+
+ /**
+ * @param pConfigFilePath - Absolute path of the WSClient config file.
+ * @return String - WSClient config file content.
+ * @throws Exception
+ */
+ private static String getConfigFileContent(String pConfigFilePath) throws Exception {
+
+ File file = new File(pConfigFilePath);
+
+ // Checking whether the file exist or not
+ if (file.exists() == false || file.isDirectory()) {
+ throw new Exception("Configuration File does not exist at '" + file.getAbsolutePath() + "'.");
+ }
+
+ String lstrReturn = "";
+ InputStream lFileIOS = null;
+ BufferedReader lReader = null;
+ try {
+ lFileIOS = new FileInputStream(file);
+ lReader = new BufferedReader(new InputStreamReader(lFileIOS, Charset.forName("UTF-16")));
+
+ StringBuilder out = new StringBuilder();
+ String line = "";
+
+ while ((line = lReader.readLine()) != null) {
+ out.append(line);
+ }
+ lstrReturn = out.toString();
+ } catch (Exception exception) {
+ exception.printStackTrace();
+ } finally {
+ if (lFileIOS != null) {
+ lFileIOS.close();
+ }
+
+ if (lReader != null) {
+ lReader.close();
+ }
+
+ }
+
+ return lstrReturn;
+ }
+
+ private static void initializeProxyDetails(String xmlString) {
+ Node rootNode = ParserUtil.getRootNode(xmlString);
+ Node proxyDetailsNode = ParserUtil.parseNode("proxy-details", rootNode);
+ if (proxyDetailsNode == null) {
+ return;
+ }
+
+ String lstrProxySerevrName = ParserUtil.parseString("server", proxyDetailsNode);
+ if (lstrProxySerevrName == null || lstrProxySerevrName.trim().isEmpty()) {
+ return;
+ }
+ String lstrProxySerevrPort = ParserUtil.parseString("port", proxyDetailsNode);
+ if (lstrProxySerevrPort == null || lstrProxySerevrPort.trim().isEmpty()) {
+ return;
+ }
+
+ try {
+ siProxyServerPort = Integer.parseInt(lstrProxySerevrPort);
+ } catch (NumberFormatException nfe) {
+ return;
+ }
+ sstrProxyServerName = lstrProxySerevrName;
+ }
+
+ public static void terminateWSClient() {
+ try {
+ FSHelperLibrary.logInfo("Terminating FSHelper Library");
+ if (FSHelperLibrary.isTerminated() == false) {
+ System.out.println("FSHelperLibrary.isTerminated(): " + FSHelperLibrary.isTerminated());
+ FSHelperLibrary.terminate();
+ }
+ } catch (FSHelperException e) {
+ FSHelperLibrary.logError(e.getMessage(), e);
+ }
+ }
+
+ public static String getProxyServerName() {
+ return sstrProxyServerName;
+ }
+
+ public static int getProxyServerPort() {
+ return siProxyServerPort;
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/constant/Constants.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/constant/Constants.java
new file mode 100755
index 0000000..e8a951d
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/constant/Constants.java
@@ -0,0 +1,68 @@
+package com.seclore.sample.dms.constant;
+
+import java.io.File;
+
+public class Constants
+{
+ public static final String DATA_DIR = "data" + File.separator + "FileStore";
+
+ public static final int FILE_NOT_EXIST = -1;
+ public static final int NO_RIGHTS = 0;
+
+ /* Max file size allowed to upload in MB*/
+ public static final long MAX_FILE_SIZE = 50;
+
+ public static final String KEY_HF_EXTN_REF_ID = "hotfolder-extn-ref-id";
+
+ // App Details for header.
+ public static final String REQUESTING_APP_NAME = "DMS Sample App";
+
+ public static final String REQUESTING_APP_VERSION = "3.0";
+
+ // Algorithm for calculating file hash.
+ public static final String FILE_HASH_ALGO = "SHA-256";
+
+ // Temporary file folder for storing file on disk.
+ public static final String TEMP_FILES = "Temp_files";
+
+ public static final String CONTENT_DISPOSITION = "Content-Disposition";
+
+ public static final String CONTENT_LENGTH = "Content-Length";
+
+ public static final String CONTENT_TYPE = "Content-Type";
+
+ public static final String SAVE_EVENT_MODE = "SAVE_EVENT_MODE";
+
+ public static final String AUTHORIZATION = "Authorization";
+
+ public static final String BEARER = "Bearer ";
+
+ // X-Seclore-Headers starts
+ public static final String X_SECLORE_POLICYSERVERURL = "X-Seclore-PolicyServerURL";
+
+ public static final String X_SECLORE_TIMESTAMP = "X-Seclore-TimeStamp";
+
+ public static final String X_SECLORE_PROOF = "X-Seclore-Proof";
+
+ public static final String X_SECLORE_PROOFOLD = "X-Seclore-ProofOld";
+
+ public static final String X_SECLORE_SESSIONCONTEXT = "X-Seclore-SessionContext";
+
+ public static final String X_SECLORE_FILEHASH = "X-Seclore-FileHash";
+
+ public static final String X_SECLORE_FILENAME = "X-Seclore-FileName";
+
+ public static final String X_SECLORE_REQUEST_ID = "X-Request-Id";
+
+ public static final String X_SECLORE_APPNAME = "X-Seclore-RequestingAppName";
+
+ public static final String X_SECLORE_APPVERSION = "X-Seclore-RequestingAppVersion";
+
+ public static final String X_SECLORE_ERRORCODE = "X-Seclore-ErrorCode";
+
+ public static final String X_SECLORE_ERRORMSG = "X-Seclore-ErrorMsg";
+
+ public static final String X_SECLORE_ERRORURL = "X-Seclore-ErrorURL";
+
+ // X-Seclore-Headers ends
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/AppData.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/AppData.java
new file mode 100755
index 0000000..daf67c0
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/AppData.java
@@ -0,0 +1,38 @@
+package com.seclore.sample.dms.core;
+
+import java.io.Serializable;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+
+@XmlRootElement(name="app-data")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class AppData implements Serializable
+{
+ private static final long serialVersionUID = 1L;
+
+ @XmlJavaTypeAdapter(FolderMapAdapter.class)
+ @XmlElement(name="app-folders")
+ private Map folderMap;
+
+ public AppData()
+ {
+ folderMap = new LinkedHashMap();
+ }
+
+ public Map getFolderMap()
+ {
+ return folderMap;
+ }
+
+ public void setFolderMap(Map mapFolders)
+ {
+ this.folderMap = mapFolders;
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/AppFile.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/AppFile.java
new file mode 100755
index 0000000..1fbaec2
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/AppFile.java
@@ -0,0 +1,222 @@
+package com.seclore.sample.dms.core;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement(name="app-file")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class AppFile implements Serializable
+{
+ private static final long serialVersionUID = 1L;
+
+ @XmlElement(name="id",required=true)
+ private String id;
+
+ @XmlElement(name="name")
+ private String name;
+
+ @XmlElement(name="owner")
+ private Owner owner;
+
+ @XmlElement(name="classification")
+ private Classification classification;
+
+ @XmlElement(name="content-type")
+ private String contentType;
+
+ @XmlElementWrapper(name="users-rights")
+ @XmlElement(name="user-right")
+ private Set usersRights;
+
+ @XmlElementWrapper(name="blacklist-countries")
+ @XmlElement(name="blacklist-country")
+ private Set blacklistCountries;
+
+ @XmlElement(name="views")
+ private int views;
+
+ @XmlElement(name="major-version")
+ private int majorVersion;
+
+ @XmlElement(name="minor-version")
+ private int minorVersion;
+
+ @XmlElement(name="lm-time")
+ private long lmTime;
+
+ @XmlElement(name="lm-by-user")
+ private String lmByUser;
+
+
+
+ public AppFile()
+ {
+ usersRights = new LinkedHashSet();
+ blacklistCountries = new LinkedHashSet();
+ classification = null;
+ owner = null;
+ views = 0;
+ majorVersion = 1;
+ lmTime = (new Date()).getTime();
+
+ }
+
+ public String getId() {
+ return id;
+ }
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getContentType() {
+ return contentType;
+ }
+ public void setContentType(String contentType)
+ {
+ this.contentType = contentType;
+ }
+
+ public Set getUserRightList()
+ {
+ return usersRights;
+ }
+ public void setUserRightList(Set pUsersRights)
+ {
+ if(pUsersRights == null)
+ {
+ pUsersRights = new LinkedHashSet();
+ }
+ this.usersRights = pUsersRights;
+ }
+
+ public Set getBlacklistedCountries()
+ {
+ return blacklistCountries;
+ }
+ public void setBlacklistedCountries(Set blacklistCountries)
+ {
+ if(blacklistCountries == null)
+ {
+ blacklistCountries = new LinkedHashSet();
+ }
+ this.blacklistCountries = blacklistCountries;
+ }
+
+ public Owner getOwner()
+ {
+ return owner;
+ }
+
+ public void setOwner(Owner owner)
+ {
+ this.owner = owner;
+ }
+
+ public Classification getClassification()
+ {
+ return classification;
+ }
+
+ public void setClassification(Classification classification)
+ {
+ this.classification = classification;
+ }
+
+ public int getViews()
+ {
+ return views;
+ }
+
+ public void setViews(int pViews)
+ {
+ views = pViews;
+ }
+
+ public int getMajorVersion()
+ {
+ return majorVersion;
+ }
+
+ public void setMajorVersion(int pMajorVersion)
+ {
+ majorVersion = pMajorVersion;
+ }
+
+ public int getMinorVersion()
+ {
+ return minorVersion;
+ }
+
+ public void setMinorVersion(int pMinorVersion)
+ {
+ minorVersion = pMinorVersion;
+ }
+
+ public String getLmByUser()
+ {
+ return lmByUser;
+ }
+
+ public void setLmByUser(String pLmByUser)
+ {
+ lmByUser = pLmByUser;
+ }
+
+ public long getLmTime()
+ {
+ return lmTime;
+ }
+
+ public void setLmTime(long pLmTime)
+ {
+ lmTime = pLmTime;
+ }
+
+
+ @Override
+ public int hashCode()
+ {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((id == null) ? 0 : id.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj)
+ {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ AppFile other = (AppFile) obj;
+ if (id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!id.equals(other.id))
+ return false;
+ return true;
+ }
+
+
+
+
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/AppFolder.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/AppFolder.java
new file mode 100755
index 0000000..f655023
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/AppFolder.java
@@ -0,0 +1,115 @@
+package com.seclore.sample.dms.core;
+
+import java.io.Serializable;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+@XmlRootElement(name="app-folder")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class AppFolder implements Serializable
+{
+ private static final long serialVersionUID = 1L;
+
+ @XmlElement(name="id",required=true)
+ private String id;
+
+ @XmlElement(name="name")
+ private String name;
+
+ @XmlElement(name="irm-enabled")
+ private Boolean irmEnabled;
+
+ @XmlJavaTypeAdapter(FileMapAdapter.class)
+ @XmlElement(name="app-files")
+ private Map fileMap;
+
+
+ public AppFolder()
+ {
+ fileMap = new LinkedHashMap();
+ irmEnabled = false;
+ }
+
+ public Map getFileMap() {
+ return fileMap;
+ }
+
+ public void setFileMap(Map fileMap) {
+ this.fileMap = fileMap;
+ }
+
+ public String getId()
+ {
+ return id;
+ }
+
+ public void setId(String id)
+ {
+ this.id = id;
+ }
+
+ public String getName()
+ {
+ return name;
+ }
+
+ public void setName(String name)
+ {
+ this.name = name;
+ }
+
+ public Boolean getIrmEnabled()
+ {
+ return irmEnabled;
+ }
+
+ public void setIrmEnabled(Boolean irmEnabled)
+ {
+ this.irmEnabled = irmEnabled;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((id == null) ? 0 : id.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ {
+ return true;
+ }
+ if (obj == null)
+ {
+ return false;
+ }
+ if (getClass() != obj.getClass())
+ {
+ return false;
+ }
+ AppFolder other = (AppFolder) obj;
+ if (id == null)
+ {
+ if (other.id != null)
+ {
+ return false;
+ }
+ }
+ else if (!id.equals(other.id))
+ {
+ return false;
+ }
+ return true;
+ }
+
+
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/Classification.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/Classification.java
new file mode 100755
index 0000000..ae64298
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/Classification.java
@@ -0,0 +1,79 @@
+package com.seclore.sample.dms.core;
+
+import java.io.Serializable;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement(name="classification")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class Classification implements Serializable
+{
+ private static final long serialVersionUID = 1L;
+
+ @XmlElement(name="id",required=true)
+ private String id;
+
+ @XmlElement(name="name")
+ private String name;
+
+ @XmlElement(name="description")
+ private String description;
+
+ public String getId() {
+ return id;
+ }
+ public void setId(String id) {
+ this.id = id;
+ }
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+ public String getDescription() {
+ return description;
+ }
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((id == null) ? 0 : id.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj)
+ {
+ if (this == obj)
+ {
+ return true;
+ }
+ if (obj == null)
+ {
+ return false;
+ }
+ if ( getClass() != obj.getClass() )
+ {
+ return false;
+ }
+ Classification other = (Classification) obj;
+ if ( id == null && other.id != null )
+ {
+ return false;
+ }
+ else if ( !id.equals( other.id ) )
+ {
+ return false;
+ }
+ return true;
+ }
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/ClassificationData.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/ClassificationData.java
new file mode 100755
index 0000000..0b0b95a
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/ClassificationData.java
@@ -0,0 +1,29 @@
+package com.seclore.sample.dms.core;
+
+import java.io.Serializable;
+import java.util.Set;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement(name="classifications")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class ClassificationData implements Serializable
+{
+ private static final long serialVersionUID = 1L;
+
+ @XmlElement(name="classification")
+ private Set classifications;
+
+ public Set getClassifications()
+ {
+ return classifications;
+ }
+
+ public void setClassifications(Set classifications)
+ {
+ this.classifications = classifications;
+ }
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/FileActivityLog.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/FileActivityLog.java
new file mode 100755
index 0000000..0deada4
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/FileActivityLog.java
@@ -0,0 +1,132 @@
+package com.seclore.sample.dms.core;
+
+
+public class FileActivityLog {
+
+
+ private long ActivityId;
+ private String User;
+ private String UserQID;
+ private int Activity;
+ private String Timestamp;
+ private String RequestIPAddress;
+ /**
+ * @return the timestamp
+ */
+ public String getTimestamp()
+ {
+ return Timestamp;
+ }
+ /**
+ * @param timestamp the timestamp to set
+ */
+ public void setTimestamp(String timestamp)
+ {
+ Timestamp = timestamp;
+ }
+ private int Mode;
+ private int Authorized;
+ private String Client;
+ private String CurrentFileName;
+
+ /**
+ * @return the currentFileName
+ */
+ public String getCurrentFileName() {
+ return CurrentFileName;
+ }
+ /**
+ * @param currentFileName the currentFileName to set
+ */
+ public void setCurrentFileName(String currentFileName) {
+ CurrentFileName = currentFileName;
+ }
+ /**
+ * @return the client
+ */
+ public String getClient() {
+ return Client;
+ }
+ /**
+ * @param client the client to set
+ */
+ public void setClient(String client) {
+ Client = client;
+ }
+ /**
+ * @return the activityId
+ */
+ public long getActivityId() {
+ return ActivityId;
+ }
+ /**
+ * @param activityId the activityId to set
+ */
+ public void setActivityId(long activityId) {
+ ActivityId = activityId;
+ }
+ /**
+ * @return the user
+ */
+ public String getUser() {
+ return User;
+ }
+ /**
+ * @param user the user to set
+ */
+ public void setUser(String user) {
+ User = user;
+ }
+
+ public String getUserQID() {
+ return UserQID;
+ }
+ public void setUserQID(String userQID) {
+ UserQID = userQID;
+ }
+ /**
+ * @return the activity
+ */
+ public int getActivity() {
+ return Activity;
+ }
+ /**
+ * @param activity the activity to set
+ */
+ public void setActivity(int activity) {
+ Activity = activity;
+ }
+
+ /**
+ * @return the mode
+ */
+ public int getMode() {
+ return Mode;
+ }
+ /**
+ * @param mode the mode to set
+ */
+ public void setMode(int mode) {
+ Mode = mode;
+ }
+ /**
+ * @return the authorized
+ */
+ public int getAuthorized() {
+ return Authorized;
+ }
+ /**
+ * @param authorized the authorized to set
+ */
+ public void setAuthorized(int authorized) {
+ Authorized = authorized;
+ }
+ public String getRequestIPAddress() {
+ return RequestIPAddress;
+ }
+ public void setRequestIPAddress(String requestIPAddress) {
+ RequestIPAddress = requestIPAddress;
+ }
+
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/FileHtmlWrapInfo.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/FileHtmlWrapInfo.java
new file mode 100755
index 0000000..9575943
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/FileHtmlWrapInfo.java
@@ -0,0 +1,27 @@
+package com.seclore.sample.dms.core;
+
+public class FileHtmlWrapInfo
+{
+
+ private boolean mbHtmlWrapEnabled = false;
+ private boolean mbHtmlWrapStatus = false;
+
+ public boolean isHtmlWrapEnabled()
+ {
+ return mbHtmlWrapEnabled;
+ }
+ public void setHtmlWrapEnable(boolean pHtmlWrapEnable)
+ {
+ mbHtmlWrapEnabled = pHtmlWrapEnable;
+ }
+ public boolean getHtmlWrapStatus()
+ {
+ return mbHtmlWrapStatus;
+ }
+ public void setHtmlWrapStatus(boolean pHtmlWrapStatus)
+ {
+ mbHtmlWrapStatus = pHtmlWrapStatus;
+ }
+
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/FileMapAdapter.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/FileMapAdapter.java
new file mode 100755
index 0000000..4f407d1
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/FileMapAdapter.java
@@ -0,0 +1,48 @@
+package com.seclore.sample.dms.core;
+
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Set;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.adapters.XmlAdapter;
+
+import com.seclore.sample.dms.core.FileMapAdapter.AdaptedFileMap;
+
+
+
+public class FileMapAdapter extends XmlAdapter>
+{
+
+ public static class AdaptedFileMap
+ {
+ @XmlElement(name="app-file")
+ private Set fileList = new LinkedHashSet();
+ }
+
+ @Override
+ public Map unmarshal(AdaptedFileMap adaptedFileMap) throws Exception
+ {
+ Map fileMap = new LinkedHashMap();
+ for (AppFile appFile : adaptedFileMap.fileList)
+ {
+ String fileId = appFile.getId();
+ if( fileId != null && !fileId.trim().isEmpty() )
+ {
+ fileMap.put(fileId, appFile);
+ }
+ }
+ return fileMap;
+ }
+
+ @Override
+ public AdaptedFileMap marshal(Map mapFiles) throws Exception
+ {
+ AdaptedFileMap adaptedFileMap = new AdaptedFileMap();
+ adaptedFileMap.fileList = new LinkedHashSet(mapFiles.values());
+ return adaptedFileMap;
+ }
+}
+
+
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/FileOpenTimeLog.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/FileOpenTimeLog.java
new file mode 100755
index 0000000..b142b3e
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/FileOpenTimeLog.java
@@ -0,0 +1,58 @@
+package com.seclore.sample.dms.core;
+
+public class FileOpenTimeLog {
+
+ private String fileExtRef;
+ private long openActivityID;
+ private String openTimeStamp;
+ private long closeActivityID;
+ private String closeTimeStamp;
+ private long openTime;
+ private String displayOpenTime;
+
+
+ public String getFileExtRef() {
+ return fileExtRef;
+ }
+ public void setFileExtRef(String fileExtRef) {
+ this.fileExtRef = fileExtRef;
+ }
+ public long getOpenActivityID() {
+ return openActivityID;
+ }
+ public void setOpenActivityID(long openActivityID) {
+ this.openActivityID = openActivityID;
+ }
+ public String getOpenTimeStamp() {
+ return openTimeStamp;
+ }
+ public void setOpenTimeStamp(String openTimeStamp) {
+ this.openTimeStamp = openTimeStamp;
+ }
+ public long getCloseActivityID() {
+ return closeActivityID;
+ }
+ public void setCloseActivityID(long closeActivityID) {
+ this.closeActivityID = closeActivityID;
+ }
+ public String getCloseTimeStamp() {
+ return closeTimeStamp;
+ }
+ public void setCloseTimeStamp(String closeTimeStamp) {
+ this.closeTimeStamp = closeTimeStamp;
+ }
+ public long getOpenTime() {
+ return openTime;
+ }
+ public void setOpenTime(long openTime) {
+ this.openTime = openTime;
+ }
+ public String getDisplayOpenTime() {
+ return displayOpenTime;
+ }
+ public void setDisplayOpenTime(String displayOpenTime) {
+ this.displayOpenTime = displayOpenTime;
+ }
+
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/FolderMapAdapter.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/FolderMapAdapter.java
new file mode 100755
index 0000000..6f7c717
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/FolderMapAdapter.java
@@ -0,0 +1,48 @@
+package com.seclore.sample.dms.core;
+
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Set;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.adapters.XmlAdapter;
+
+import com.seclore.sample.dms.core.FolderMapAdapter.AdaptedFolderMap;
+
+
+
+public class FolderMapAdapter extends XmlAdapter>
+{
+
+ public static class AdaptedFolderMap
+ {
+ @XmlElement(name="app-folder")
+ private Set folderList = new LinkedHashSet();
+ }
+
+ @Override
+ public Map unmarshal(AdaptedFolderMap adaptedFolderMap) throws Exception
+ {
+ Map folderMap = new LinkedHashMap();
+
+ for (AppFolder appFolder : adaptedFolderMap.folderList)
+ {
+ String folderId = appFolder.getId();
+ if( folderId != null && !folderId.trim().isEmpty() )
+ {
+ folderMap.put(folderId, appFolder);
+ }
+ }
+ return folderMap;
+ }
+
+ @Override
+ public AdaptedFolderMap marshal(Map mapFolders) throws Exception
+ {
+ AdaptedFolderMap adaptedFolderMap = new AdaptedFolderMap();
+ adaptedFolderMap.folderList = new LinkedHashSet(mapFolders.values());
+ return adaptedFolderMap;
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/IPGeoDetails.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/IPGeoDetails.java
new file mode 100755
index 0000000..152bdbf
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/IPGeoDetails.java
@@ -0,0 +1,137 @@
+package com.seclore.sample.dms.core;
+
+import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+
+
+@JsonIgnoreProperties({"hostname", "type", "location", "time_zone", "currency", "connection", "security"})
+public class IPGeoDetails implements Serializable
+{
+ private static final long serialVersionUID = 1L;
+
+ @JsonProperty("ip")
+ private String ip;
+
+ @JsonProperty("continent_code")
+ private String continentCode;
+
+ @JsonProperty("continent_name")
+ private String continentName;
+
+ @JsonProperty("country_code")
+ private String countryCode;
+
+ @JsonProperty("country_name")
+ private String countryName;
+
+ @JsonProperty("region_code")
+ private String regionCode;
+
+ @JsonProperty("region_name")
+ private String regionName;
+
+ @JsonProperty("city")
+ private String city;
+
+ @JsonProperty("zip")
+ private String zip;
+
+ @JsonProperty("latitude")
+ private String latitude;
+
+ @JsonProperty("longitude")
+ private String longitude;
+
+ public String getIp() {
+ return ip;
+ }
+
+ public void setIp(String ip) {
+ this.ip = ip;
+ }
+
+ public String getContinentCode() {
+ return continentCode;
+ }
+
+ public void setContinentCode(String continentCode) {
+ this.continentCode = continentCode;
+ }
+
+
+ public String getContinentName() {
+ return continentName;
+ }
+
+ public void setContinentName(String continentName) {
+ this.continentName = continentName;
+ }
+
+ public String getCountryCode() {
+ return countryCode;
+ }
+
+ public void setCountryCode(String countryCode) {
+ this.countryCode = countryCode;
+ }
+
+ public String getCountryName() {
+ return countryName;
+ }
+
+ public void setCountryName(String countryName) {
+ this.countryName = countryName;
+ }
+
+ public String getRegionCode() {
+ return regionCode;
+ }
+
+ public void setRegionCode(String regionCode) {
+ this.regionCode = regionCode;
+ }
+
+ public String getRegionName() {
+ return regionName;
+ }
+
+ public void setRegionName(String regionName) {
+ this.regionName = regionName;
+ }
+
+ public String getCity() {
+ return city;
+ }
+
+ public void setCity(String city) {
+ this.city = city;
+ }
+
+ public String getZip() {
+ return zip;
+ }
+
+ public void setZip(String zip) {
+ this.zip = zip;
+ }
+
+ public String getLatitude() {
+ return latitude;
+ }
+
+ public void setLatitude(String latitude) {
+ this.latitude = latitude;
+ }
+
+ public String getLongitude() {
+ return longitude;
+ }
+
+ public void setLongitude(String longitude) {
+ this.longitude = longitude;
+ }
+
+}
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/Owner.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/Owner.java
new file mode 100755
index 0000000..cd38cf5
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/Owner.java
@@ -0,0 +1,77 @@
+package com.seclore.sample.dms.core;
+
+import java.io.Serializable;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement(name="owner")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class Owner implements Serializable
+{
+ private static final long serialVersionUID = 1L;
+ @XmlElement(name="email-id")
+ private String emailId;
+
+ @XmlElement(name="name")
+ private String name;
+
+ public String getEmailId()
+ {
+ return emailId;
+ }
+
+ public void setEmailId(String emailId)
+ {
+ this.emailId = emailId;
+ }
+
+ public String getName()
+ {
+ return name;
+ }
+
+ public void setName(String name)
+ {
+ this.name = name;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ int i = (emailId == null ? 0: emailId.hashCode() );
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + i;
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj)
+ {
+ if (this == obj)
+ {
+ return true;
+ }
+ if (obj == null)
+ {
+ return false;
+ }
+ if ( getClass() != obj.getClass() )
+ {
+ return false;
+ }
+ Owner other = (Owner) obj;
+ if ( emailId == null && other.emailId != null)
+ {
+ return false;
+ }
+ else if ( !emailId.equals( other.emailId ) )
+ {
+ return false;
+ }
+ return true;
+ }
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/UserRight.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/UserRight.java
new file mode 100755
index 0000000..1076c0f
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/UserRight.java
@@ -0,0 +1,67 @@
+package com.seclore.sample.dms.core;
+
+import java.io.Serializable;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement(name="user-right")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class UserRight implements Serializable
+{
+
+ private static final long serialVersionUID = 1L;
+ @XmlElement(name="user-id")
+ private String userId;
+
+ @XmlElement(name="usage-rights")
+ private Integer usageRights;
+
+ public String getUserId()
+ {
+ return userId;
+ }
+
+ public void setUserId(String pUserId)
+ {
+ this.userId = pUserId;
+ }
+
+ public Integer getUsageRights()
+ {
+ return usageRights;
+ }
+ public void setUsageRights(Integer usageRights)
+ {
+ this.usageRights = usageRights;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((userId == null) ? 0 : userId.hashCode());
+ return result;
+ }
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ UserRight other = (UserRight) obj;
+ if (userId == null) {
+ if (other.userId != null)
+ return false;
+ } else if (!userId.equals(other.userId))
+ return false;
+ return true;
+ }
+
+
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/master/AppRights.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/master/AppRights.java
new file mode 100755
index 0000000..77f5b14
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/master/AppRights.java
@@ -0,0 +1,40 @@
+package com.seclore.sample.dms.core.master;
+
+import java.io.Serializable;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+
+@XmlRootElement(name="rights-master")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class AppRights implements Serializable
+{
+ private static final long serialVersionUID = 1L;
+
+ @XmlJavaTypeAdapter(RightsMapAdapter.class)
+ @XmlElement(name="rights-list")
+ private Map rightsMap;
+
+ public AppRights()
+ {
+ rightsMap = new LinkedHashMap();
+ }
+
+ public Map getRightsMap()
+ {
+ return rightsMap;
+ }
+
+ public void setRightsMap(Map rightsMap)
+ {
+ this.rightsMap = rightsMap;
+ }
+
+
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/master/AppUsers.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/master/AppUsers.java
new file mode 100755
index 0000000..ab24c19
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/master/AppUsers.java
@@ -0,0 +1,38 @@
+package com.seclore.sample.dms.core.master;
+
+import java.io.Serializable;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+
+@XmlRootElement(name="user-master")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class AppUsers implements Serializable
+{
+ private static final long serialVersionUID = 1L;
+
+ @XmlJavaTypeAdapter(UserMapAdapter.class)
+ @XmlElement(name="users")
+ private Map userMap;
+
+ public AppUsers()
+ {
+ userMap = new LinkedHashMap();
+ }
+
+ public Map getUserMap()
+ {
+ return userMap;
+ }
+
+ public void setUserMap(Map userMap)
+ {
+ this.userMap = userMap;
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/master/Rights.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/master/Rights.java
new file mode 100755
index 0000000..de6e642
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/master/Rights.java
@@ -0,0 +1,65 @@
+package com.seclore.sample.dms.core.master;
+
+import java.io.Serializable;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement(name="rights")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class Rights implements Serializable
+{
+
+ private static final long serialVersionUID = 1L;
+
+ @XmlElement(name="id")
+ private Integer id;
+
+ @XmlElement(name="text")
+ private String text;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((id == null) ? 0 : id.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Rights other = (Rights) obj;
+ if (id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!id.equals(other.id))
+ return false;
+ return true;
+ }
+
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/master/RightsMapAdapter.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/master/RightsMapAdapter.java
new file mode 100755
index 0000000..c083196
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/master/RightsMapAdapter.java
@@ -0,0 +1,46 @@
+package com.seclore.sample.dms.core.master;
+
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Set;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.adapters.XmlAdapter;
+
+import com.seclore.sample.dms.core.master.RightsMapAdapter.AdaptedRights;
+
+public class RightsMapAdapter extends XmlAdapter>
+{
+
+ public static class AdaptedRights
+ {
+ @XmlElement(name="rights")
+ private Set rights = new LinkedHashSet();
+ }
+
+
+
+ @Override
+ public Map unmarshal(AdaptedRights adaptedRights) throws Exception {
+ Map rightsMap = new LinkedHashMap();
+
+ for (Rights rights : adaptedRights.rights)
+ {
+ Integer id = rights.getId();
+ if( id != null)
+ {
+ rightsMap.put(id, rights);
+ }
+ }
+ return rightsMap;
+ }
+
+ @Override
+ public AdaptedRights marshal(Map map) throws Exception {
+ AdaptedRights adaptedRights = new AdaptedRights();
+ adaptedRights.rights = new LinkedHashSet(map.values());
+ return adaptedRights;
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/master/User.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/master/User.java
new file mode 100755
index 0000000..7dc0984
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/master/User.java
@@ -0,0 +1,65 @@
+package com.seclore.sample.dms.core.master;
+
+import java.io.Serializable;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement(name="user")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class User implements Serializable
+{
+ private static final long serialVersionUID = 1L;
+
+ @XmlElement(name="id")
+ private String id;
+
+ @XmlElement(name="name")
+ private String name;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((id == null) ? 0 : id.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ User other = (User) obj;
+ if (id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!id.equals(other.id))
+ return false;
+ return true;
+ }
+
+
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/master/UserMapAdapter.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/master/UserMapAdapter.java
new file mode 100755
index 0000000..3540e2f
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/core/master/UserMapAdapter.java
@@ -0,0 +1,47 @@
+package com.seclore.sample.dms.core.master;
+
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Set;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.adapters.XmlAdapter;
+
+import com.seclore.sample.dms.core.master.UserMapAdapter.AdaptedUser;
+
+public class UserMapAdapter extends XmlAdapter>
+{
+
+ public static class AdaptedUser
+ {
+ @XmlElement(name="user")
+ private Set user = new LinkedHashSet();
+ }
+
+
+
+ @Override
+ public Map unmarshal(AdaptedUser adaptedUser) throws Exception
+ {
+ Map userMap = new LinkedHashMap();
+ for (User user : adaptedUser.user)
+ {
+ String id = user.getId();
+ if( id != null && !id.trim().isEmpty())
+ {
+ userMap.put(id, user);
+ }
+ }
+ return userMap;
+ }
+
+ @Override
+ public AdaptedUser marshal(Map map) throws Exception
+ {
+ AdaptedUser adaptedUser = new AdaptedUser();
+ adaptedUser.user = new LinkedHashSet(map.values());
+ return adaptedUser;
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/filter/AuthorizationFilter.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/filter/AuthorizationFilter.java
new file mode 100755
index 0000000..2d28019
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/filter/AuthorizationFilter.java
@@ -0,0 +1,202 @@
+package com.seclore.sample.dms.filter;
+
+import java.io.IOException;
+import java.text.ParseException;
+import java.util.Map;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.annotation.WebFilter;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.http.HttpStatus;
+
+import com.nimbusds.jose.JOSEException;
+import com.seclore.sample.dms.constant.Constants;
+import com.seclore.sample.dms.security.service.SecurityService;
+import com.seclore.sample.dms.util.CommonUtil;
+import com.seclore.sample.dms.util.LoggerUtil;
+import com.seclore.sample.exceptions.DMSSampleException;
+
+/**
+ * This filter will validate all the requests sent to DMS Sample App.
+ *
+ * It checks for 1. Access Token validation 2. File token validation and 3. Proof validation.
+ *
+ */
+@WebFilter("/seclore/1.0/*")
+public class AuthorizationFilter implements Filter
+{
+ /**
+ * The file token comes right after this string
+ */
+ private final String SECLORE_1_FILES = "/seclore/1.0/files/";
+
+ @Override
+ public void doFilter(ServletRequest pRequest, ServletResponse pResponse,
+ FilterChain lFilterChain) throws IOException, ServletException
+ {
+ LoggerUtil.logDebug("AuthorizationFilter STARTS ");
+
+ HttpServletRequest lHttpRequest = (HttpServletRequest) pRequest;
+ HttpServletResponse lHttpResponse = ((HttpServletResponse) pResponse);
+
+ //Print headers.
+ printHeaders(lHttpRequest);
+
+ String lstrRequestURL = lHttpRequest.getRequestURL().toString();
+
+ //Get ContextPath after AppName by replacing the trailing slash(/) if found.
+ String lstrContextPath = lHttpRequest.getRequestURI().substring(lHttpRequest.getContextPath().length()).replaceAll("[/]+$", "");
+
+ //Check whether endpoint is renew.
+ if(lstrContextPath.startsWith("/seclore/1.0/renewToken"))
+ {
+ //Do not perform validation for renew token.
+ //Validation for renew token will be performed in it's controller.
+ lFilterChain.doFilter(lHttpRequest, lHttpResponse);
+ return;
+ }
+
+ //Check whether endpoint is edit.
+ if(lstrContextPath.startsWith("/seclore/1.0/files/") && lstrContextPath.contains("/edit"))
+ {
+ //Do not perform validation for edit endpoint.
+ lFilterChain.doFilter(lHttpRequest, lHttpResponse);
+ return;
+ }
+
+ // Extract Headers from Request.
+ String lstrRequestID = lHttpRequest.getHeader(Constants.X_SECLORE_REQUEST_ID);
+ String lstrAuthorizationHeader = lHttpRequest.getHeader(Constants.AUTHORIZATION);
+
+ if (CommonUtil.isEmptyString(lstrAuthorizationHeader))
+ {
+ LoggerUtil.logError("Authorization header not found in path for requestID " + lstrRequestID);
+
+ setErrorHttpResponse(lHttpResponse,HttpStatus.SC_UNAUTHORIZED,lstrRequestID
+ ,"-1000","Empty Authorization Header.");
+ return;
+ }
+
+ //Extract Auth Token.
+ String lstrBearerToken = CommonUtil.getAuthorizationToken(lstrAuthorizationHeader);
+
+ try
+ {
+ // Validate Token for signature and expiry.
+ Map lClaimSet = SecurityService.validateToken(lstrBearerToken);
+
+ // Extract fileToken from URL path.
+ String lstrToken = getFileTokenFromURL(lstrRequestURL);
+
+ if (CommonUtil.isEmptyString(lstrToken))
+ {
+ LoggerUtil.logError("File Token not found in path for requestID " + lstrRequestID);
+
+ setErrorHttpResponse(lHttpResponse,HttpStatus.SC_NOT_FOUND,lstrRequestID,
+ "-1000","File Token in Claimset doesn't match with the Path paramter");
+
+ return;
+ }
+
+ // Validate whether File Token is present in Claim Set.
+ if (SecurityService.validateFileToken(lClaimSet, lstrToken) == false)
+ {
+ LoggerUtil.logError("File Token not found in Claim Setfor requestID " + lstrRequestID);
+
+ setErrorHttpResponse(lHttpResponse,HttpStatus.SC_UNAUTHORIZED,
+ lstrRequestID, "-1000","File Token in Claimset doesn't match with the Path paramter");
+ return;
+ }
+ }
+ catch (DMSSampleException | JOSEException
+ | ParseException e)
+ {
+ // SecloreOnlineIntegrationException will be thrown if request
+ // has expired.
+ if (e instanceof DMSSampleException)
+ {
+ LoggerUtil.logError(e.getMessage() + lstrRequestID);
+
+ setErrorHttpResponse(lHttpResponse,HttpStatus.SC_UNAUTHORIZED,
+ lstrRequestID,"-1000","The token is not valid.");
+ return;
+ }
+ else
+ {
+ setErrorHttpResponse(lHttpResponse,HttpStatus.SC_UNAUTHORIZED,
+ lstrRequestID,"-1000",e.getMessage());
+ return;
+ }
+ }
+
+ // Extract proofs for Seclore Online Validation
+ String lstrProof = lHttpRequest.getHeader(Constants.X_SECLORE_PROOF);
+ String lstrProofOld = lHttpRequest.getHeader(Constants.X_SECLORE_PROOFOLD);
+ String lstrTimeStamp = lHttpRequest.getHeader(Constants.X_SECLORE_TIMESTAMP);
+
+ try
+ {
+ // Perform Proof validation.
+ SecurityService.validateProofKeys(lstrRequestURL, lstrProof, lstrProofOld, lstrBearerToken, lstrTimeStamp);
+ LoggerUtil.logDebug("AuthorizationFilter ENDS for requestID " + lstrRequestID);
+ }
+ catch (DMSSampleException e)
+ {
+ LoggerUtil.logError("The Proofs are invalid for request id:"+lstrRequestID);
+
+ setErrorHttpResponse(lHttpResponse,HttpStatus.SC_INTERNAL_SERVER_ERROR,
+ lstrRequestID,"-1000", "The Proofs are invalid");
+ return;
+ }
+
+ lFilterChain.doFilter(lHttpRequest, lHttpResponse);
+
+ }
+
+ private static void setErrorHttpResponse(HttpServletResponse pResponse,int pStatus,
+ String pRequestID,String pErrorCode, String pErrorMsg) throws IOException
+ {
+ pResponse.setStatus(pStatus);
+ pResponse.setHeader(Constants.X_SECLORE_REQUEST_ID, pRequestID);
+ pResponse.setHeader(Constants.X_SECLORE_ERRORCODE, pErrorCode);
+ pResponse.setHeader(Constants.X_SECLORE_ERRORMSG, pErrorMsg);
+ pResponse.sendError(pStatus, pErrorMsg);
+ }
+ /**
+ * Extract the file token from URl
+ *
+ * eg: https://example.com/App/Seclore/1.0/files/MyToken/contents witll
+ * return 'MyToken'
+ *
+ * @param pURL
+ * @return
+ */
+ private String getFileTokenFromURL(String pURL)
+ {
+ int start = pURL.indexOf(SECLORE_1_FILES) + SECLORE_1_FILES.length();
+
+ String lstrFileToken = pURL.substring(start);
+
+ if (lstrFileToken.contains("/"))
+ {
+ return lstrFileToken.substring(0, lstrFileToken.indexOf('/'));
+ }
+ return lstrFileToken;
+ }
+
+ private void printHeaders(HttpServletRequest lRequest)
+ {
+ LoggerUtil.logDebug("Authoriization filter for URL :" + lRequest.getRequestURL());
+ LoggerUtil.logDebug("Header Requesting App:" + lRequest.getHeader(Constants.REQUESTING_APP_NAME));
+ LoggerUtil.logDebug("Header Requesting Version:" + lRequest.getHeader(Constants.REQUESTING_APP_VERSION));
+ LoggerUtil.logDebug("Header Requesting ID:" + lRequest.getHeader(Constants.X_SECLORE_REQUEST_ID));
+ LoggerUtil.logDebug("Header Content-Type:" + lRequest.getHeader(Constants.CONTENT_TYPE));
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/home/servlet/HomeServlet.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/home/servlet/HomeServlet.java
new file mode 100755
index 0000000..7857d5b
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/home/servlet/HomeServlet.java
@@ -0,0 +1,49 @@
+package com.seclore.sample.dms.home.servlet;
+
+import java.io.IOException;
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.seclore.sample.dms.util.LoggerUtil;
+
+/**
+ * Servlet implementation class HomeServlet
+ */
+@WebServlet("/home")
+public class HomeServlet extends HttpServlet
+{
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @see HttpServlet#HttpServlet()
+ */
+ public HomeServlet()
+ {
+ super();
+ }
+
+ /**
+ * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ doPost(request, response);
+ }
+
+ /**
+ * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ LoggerUtil.logDebug("HomeServlet::doPost::START");
+
+ LoggerUtil.logDebug("HomeServlet::doPost::END");
+ response.sendRedirect("folderList.do");
+ return;
+
+
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/listener/ServletContextListenerImpl.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/listener/ServletContextListenerImpl.java
new file mode 100755
index 0000000..bbf0a6e
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/listener/ServletContextListenerImpl.java
@@ -0,0 +1,56 @@
+package com.seclore.sample.dms.listener;
+
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+import javax.servlet.annotation.WebListener;
+
+import com.seclore.fs.helper.exception.FSHelperException;
+import com.seclore.fs.helper.library.FSHelper;
+import com.seclore.fs.helper.library.FSHelperLibrary;
+import com.seclore.sample.dms.config.SecloreWSClientConfig;
+import com.seclore.sample.dms.util.Global;
+
+/**
+ * Application Lifecycle Listener implementation class
+ * ServletContextListenerImpl
+ *
+ */
+@WebListener
+public class ServletContextListenerImpl implements ServletContextListener {
+ /** Default constructor. */
+ public ServletContextListenerImpl() {
+
+ }
+
+ /**
+ * @see ServletContextListener#contextInitialized(ServletContextEvent)
+ */
+ public void contextInitialized(ServletContextEvent sce) {
+ String appPath = sce.getServletContext().getRealPath("");
+
+ // Initialize application specific requirements
+ Global.initializeApplication(appPath);
+
+ // ========= Seclore WSClient Initialization START =========//
+ SecloreWSClientConfig.initializeWSClient(appPath);
+ // ========= Seclore WSClient Initialization END =========//
+
+ try {
+ FSHelper lFSTenant = FSHelperLibrary.getHelper(Global.getFSTenantId());
+ Global.setFSTenant(lFSTenant);
+ } catch (FSHelperException e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * @see ServletContextListener#contextDestroyed(ServletContextEvent)
+ */
+ public void contextDestroyed(ServletContextEvent arg0) {
+
+ // =========== Terminate Seclore WS Client START =========//
+ SecloreWSClientConfig.terminateWSClient();
+ // =========== Terminate Seclore WS Client END =========//
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/log/ChangeLoggerLevelServlet.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/log/ChangeLoggerLevelServlet.java
new file mode 100755
index 0000000..71b2b91
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/log/ChangeLoggerLevelServlet.java
@@ -0,0 +1,48 @@
+package com.seclore.sample.dms.log;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.seclore.sample.dms.util.LoggerUtil;
+
+/**
+ * Servlet implementation class ChangeDebugModeServlet
+ */
+@WebServlet("/changeloggerlevel.do")
+public class ChangeLoggerLevelServlet extends HttpServlet
+{
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @see HttpServlet#HttpServlet()
+ */
+ public ChangeLoggerLevelServlet()
+ {
+ super();
+ }
+
+ /**
+ * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ doPost(request, response);
+ }
+
+ /**
+ * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ String lstrlevel = request.getParameter("level");
+ LoggerUtil.setLoggerLevel(lstrlevel);
+ response.sendRedirect("home");
+ return;
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/log/GetAccessOnlineLogServlet.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/log/GetAccessOnlineLogServlet.java
new file mode 100755
index 0000000..8b82c71
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/log/GetAccessOnlineLogServlet.java
@@ -0,0 +1,90 @@
+package com.seclore.sample.dms.log;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.seclore.sample.dms.util.Global;
+
+/**
+ * Servlet implementation class GetLogServlet
+ */
+@WebServlet(name = "getAccessOnlineLogServlet", urlPatterns = { "/getaccesslogs.do" })
+public class GetAccessOnlineLogServlet extends HttpServlet
+{
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @see HttpServlet#HttpServlet()
+ */
+ public GetAccessOnlineLogServlet()
+ {
+ super();
+ }
+
+ /**
+ * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ doPost(request, response);
+ }
+
+ /**
+ * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ InputStream fileInputStream = null;
+ try
+ {
+ String logFilePath = Global.getAppRealPath() + File.separator + "data/Access Online/AccessOnline.log";
+ // Get file data as ByteStream
+ fileInputStream = new FileInputStream( logFilePath );
+ response.setContentType("text/x-log");
+ response.setContentLength( fileInputStream.available() );
+ response.setHeader("Content-Disposition", "attachment; filename=\"AccessOnline.log\"");
+
+ ServletOutputStream servletOutputStream = response.getOutputStream();
+ byte[] bufferData = new byte[1024];
+ int lRead = 0;
+
+ while( ( lRead = fileInputStream.read(bufferData) ) != -1 )
+ {
+ servletOutputStream.write(bufferData, 0, lRead);
+ }
+
+ try{
+ servletOutputStream.flush();
+ }
+ catch(IOException ioExp){}
+
+ }
+ catch(Exception lEx)
+ {
+
+ }
+ finally
+ {
+ if( fileInputStream != null)
+ {
+ try{
+ fileInputStream.close();
+ fileInputStream = null;
+ }
+ catch(IOException ioExp){
+ // Ignore
+ }
+ }
+ }
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/log/GetLogServlet.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/log/GetLogServlet.java
new file mode 100755
index 0000000..91e6e55
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/log/GetLogServlet.java
@@ -0,0 +1,101 @@
+package com.seclore.sample.dms.log;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.seclore.sample.dms.util.Global;
+
+/**
+ * Servlet implementation class GetLogServlet
+ */
+@WebServlet(name = "getLogServlet", urlPatterns = { "/getlog.do" })
+public class GetLogServlet extends HttpServlet
+{
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @see HttpServlet#HttpServlet()
+ */
+ public GetLogServlet()
+ {
+ super();
+ }
+
+ /**
+ * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ doPost(request, response);
+ }
+
+ /**
+ * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ InputStream fileInputStream = null;
+ String logType = request.getParameter("type");
+ String logFileName = "SecloreSampleApp.log";
+ if("1".equals(logType))
+ {
+ logFileName = "WSClient.log";
+ }
+ else if("2".equals(logType))
+ {
+ logFileName = "SecloreSampleApp.log";
+ }
+
+ try
+ {
+ String logFilePath = Global.getAppRealPath() + File.separator + "logs" + File.separator + logFileName;
+ // Get file data as ByteStream
+ fileInputStream = new FileInputStream( logFilePath );
+ response.setContentType("text/x-log");
+ response.setContentLength( fileInputStream.available() );
+ response.setHeader("Content-Disposition", "attachment; filename=\""+logFileName+"\"");
+
+ ServletOutputStream servletOutputStream = response.getOutputStream();
+ byte[] bufferData = new byte[1024];
+ int lRead = 0;
+
+ while( ( lRead = fileInputStream.read(bufferData) ) != -1 )
+ {
+ servletOutputStream.write(bufferData, 0, lRead);
+ }
+
+ try{
+ servletOutputStream.flush();
+ }
+ catch(IOException ioExp){}
+
+ }
+ catch(Exception lEx)
+ {
+
+ }
+ finally
+ {
+ if( fileInputStream != null)
+ {
+ try{
+ fileInputStream.close();
+ fileInputStream = null;
+ }
+ catch(IOException ioExp){
+ // Ignore
+ }
+ }
+ }
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/security/service/SecurityService.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/security/service/SecurityService.java
new file mode 100755
index 0000000..138256b
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/security/service/SecurityService.java
@@ -0,0 +1,503 @@
+package com.seclore.sample.dms.security.service;
+
+import java.io.UnsupportedEncodingException;
+import java.math.BigInteger;
+import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
+import java.security.KeyFactory;
+import java.security.Provider;
+import java.security.PublicKey;
+import java.security.Security;
+import java.security.Signature;
+import java.security.interfaces.RSAPublicKey;
+import java.security.spec.KeySpec;
+import java.security.spec.RSAPublicKeySpec;
+import java.sql.Timestamp;
+import java.text.ParseException;
+import java.util.Base64;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+import com.nimbusds.jose.JOSEException;
+import com.nimbusds.jose.JWSAlgorithm;
+import com.nimbusds.jose.JWSHeader;
+import com.nimbusds.jose.JWSSigner;
+import com.nimbusds.jose.JWSVerifier;
+import com.nimbusds.jose.KeyLengthException;
+import com.nimbusds.jose.crypto.MACSigner;
+import com.nimbusds.jose.crypto.MACVerifier;
+import com.nimbusds.jwt.JWTClaimsSet;
+import com.nimbusds.jwt.JWTClaimsSet.Builder;
+import com.nimbusds.jwt.SignedJWT;
+import com.seclore.sample.dms.config.SampleAppConfig;
+import com.seclore.sample.dms.so.discovery.core.Discovery;
+import com.seclore.sample.dms.so.discovery.core.ProofKey;
+import com.seclore.sample.dms.so.discovery.service.DiscoveryService;
+import com.seclore.sample.dms.so.integration.core.RenewAccessTokenResponse;
+import com.seclore.sample.dms.util.CommonUtil;
+import com.seclore.sample.dms.util.LoggerUtil;
+import com.seclore.sample.dms.util.xml.XMLDBService;
+import com.seclore.sample.exceptions.DMSSampleException;
+
+/**
+ * Service for Access Token and Proof validation.
+ *
+ */
+public class SecurityService
+{
+ private static final String USER_NAME = "USER_NAME";
+
+ private static final String UTF_8 = "UTF-8";
+
+ private static final String BCFIPS = "BCFIPS";
+
+ private static final String URL = "URL";
+
+ private static final String FILE_EXPIRY = "File-Expiry";
+
+ private static final String FILE_TOKEN = "File-Token";
+
+ private static final String SO_INTEGRATION_APP = "SO Integration App";
+
+ private static final byte[] JWT_SIGNINING_KEY =
+ { 77, 120, 101, 106, 65, 109, 51, 113, 108, 78, 114, 57, 77, 118, 68, 117, 103, 103, 54,
+ 65, 120, 102, 82, 99, 53, 109, 51, 76, 67, 98, 82, 113 };
+
+ /**
+ * Generate JWT Token for file token. SO URL and Expiry is taken from Config
+ * Service.
+ *
+ * @param pFileToken
+ * @throws DMSSampleException
+ */
+ public static String generateAccessToken(String pFileToken,String pUserName) throws DMSSampleException
+ {
+ LoggerUtil.logDebug("SecurityService::generateAccessToken() STARTS for :" + pFileToken);
+
+ if (CommonUtil.isEmptyString(pFileToken))
+ {
+ LoggerUtil.logError("File Token is empty");
+ throw new DMSSampleException("Empty File Token in generateAccessToken()");
+ }
+ if (CommonUtil.isEmptyString(pUserName))
+ {
+ pUserName = SampleAppConfig.getDummyUserName();
+ }
+
+ // Get SO URL and Access Token Time to Live.
+ String lstrSOURL = SampleAppConfig.getSecloreOnlineURL();
+ String lstrATTL = SampleAppConfig.getATTTL();
+
+ // Get Expiry time.
+ long lExpiryTme = System.currentTimeMillis() + Long.parseLong(lstrATTL);
+
+ // Generate Payload
+ Map pPayload = new HashMap();
+
+ pPayload.put(FILE_TOKEN, pFileToken);
+ pPayload.put(FILE_EXPIRY, lExpiryTme);
+ pPayload.put(USER_NAME, pUserName);
+ pPayload.put(URL, lstrSOURL);
+
+ // Convert expiry time from long to Date object.
+ Timestamp ts = new Timestamp(lExpiryTme);
+ Date lExpiryDate = new Date(ts.getTime());
+
+ LoggerUtil.logDebug("SecurityService::generateAccessToken() ENDS for :" + pFileToken);
+ return generateJWT(pPayload, lExpiryDate);
+ }
+
+ /**
+ * Verifies whether JWT Token has expired.
+ *
+ * @param pJWTString
+ * @return ClaimSet if the token is verified.
+ * @throws DMSSampleException
+ * if JWT is not verified.
+ * @throws ParseException
+ * @throws JOSEException
+ * @throws UnsupportedEncodingException
+ */
+ public static Map validateToken(String pJWTString)
+ throws DMSSampleException, UnsupportedEncodingException, JOSEException, ParseException
+ {
+ LoggerUtil.logDebug("SecurityService::validateToken() STARTS");
+ JWTClaimsSet lClaimSet = verifyToken(pJWTString);
+
+ Map lClaims = lClaimSet.getClaims();
+
+ verifyExpiry(lClaimSet.getExpirationTime());
+
+ return lClaims;
+ }
+
+ /**
+ * Validates whether the file Token provided is present in the claimset.
+ *
+ * @param pClaimSet
+ * @param pFileToken
+ * @return
+ */
+ public static boolean validateFileToken(Map pClaimSet, String pFileToken)
+ {
+ LoggerUtil.logDebug("SecurityService::validateFileToken() STARTS for :" + pFileToken);
+
+ if (pClaimSet == null || pFileToken == null) return false;
+
+ String lstrClaimSetFileToken = (String) pClaimSet.get(FILE_TOKEN);
+
+ if (lstrClaimSetFileToken == null) return false;
+
+ if (pFileToken.equalsIgnoreCase(lstrClaimSetFileToken)) return true;
+
+ LoggerUtil.logDebug("SecurityService::generateAccessToken() ENDS for :" + pFileToken);
+ return false;
+ }
+
+ /**
+ * Generates a token with extended expiry.
+ *
+ * @param pToken
+ * @return
+ * @throws DMSSampleException
+ * @throws UnsupportedEncodingException
+ * @throws JOSEException
+ * @throws ParseException
+ *
+ */
+ public static RenewAccessTokenResponse getRenewedToken(String pToken) throws DMSSampleException
+ {
+ LoggerUtil.logDebug("SecurityService::getRenewedToken() STARTS for :" + pToken);
+
+ if (CommonUtil.isEmptyString(pToken))
+ {
+ LoggerUtil.logError(" JWT String is empty in getRenwedToken()");
+ throw new DMSSampleException("Empty JWT String in getRenewedToken()");
+ }
+
+ JWTClaimsSet lClaimSet;
+ try
+ {
+ lClaimSet = verifyToken(pToken);
+ }
+ catch (UnsupportedEncodingException | DMSSampleException
+ | JOSEException | ParseException e)
+ {
+ LoggerUtil.logError("Exception found in SecurityService::getRenewedToken()", e);
+ throw new DMSSampleException(e.getMessage(), e);
+ }
+
+ Map lClaims = lClaimSet.getClaims();
+ String lstrClaimSetFileToken = (String) lClaims.get(FILE_TOKEN);
+
+ String lsrtUserName = ((String) lClaims.get(USER_NAME)) != null?
+ (String) lClaims.get(USER_NAME):SampleAppConfig.getDummyUserName();
+
+ if (lstrClaimSetFileToken != null && XMLDBService.whetherFileTokenExists(lstrClaimSetFileToken))
+ {
+ RenewAccessTokenResponse lRenewAccessTokenResponse = new RenewAccessTokenResponse();
+
+ String lstrAccessToken = generateAccessToken(lstrClaimSetFileToken,lsrtUserName);
+ long lATTL = Long.parseLong(SampleAppConfig.getATTTL());
+
+ lRenewAccessTokenResponse.setAccessToken(lstrAccessToken);
+
+ //Get expiry time by adding the ATTTL to current time.
+ Calendar lExpiryTime = Calendar.getInstance();
+ lExpiryTime.add(Calendar.MINUTE, CommonUtil.convertMilliSecondsToMinutes(lATTL));
+
+ lRenewAccessTokenResponse.setExpiry(lExpiryTime.getTimeInMillis());
+
+ LoggerUtil.logDebug("SecurityService::generateAccessToken() ENDS for :" + pToken);
+ return lRenewAccessTokenResponse;
+ }
+ else
+ {
+ LoggerUtil.logError("File Token " + pToken + " is not present in repository");
+ throw new DMSSampleException("File Token in ClaimSet is not present in FileRepository");
+ }
+ }
+
+ /**
+ * Validate both proofs with the keys from discovery.
+ *
+ * If failed, discovery will be reloaded and tried again.
+ *
+ * @param pNewProof
+ * @param pOldProof
+ * @param pAccessToken
+ * @param pTimeStamp
+ * @return
+ * @throws DMSSampleException
+ * If arguments passed are null.
+ */
+ public static boolean validateProofKeys(String pURL, String pNewProof,
+ String pOldProof, String pAccessToken, String pTimeStamp) throws DMSSampleException
+ {
+ LoggerUtil.logDebug("SecurityService::validateProofKeys() STARTS");
+
+ if (pNewProof == null || pOldProof == null || pAccessToken == null || pTimeStamp == null)
+ {
+ throw new DMSSampleException("Cannot validate proof due to empty headers");
+ }
+
+ try
+ {
+ validateProofs(pURL, pNewProof, pOldProof, pAccessToken, pTimeStamp);
+ LoggerUtil.logDebug("SecurityService::validateProofKeys() ENDS");
+
+ return true;
+ }
+ catch (DMSSampleException e)
+ {
+ LoggerUtil.logError("Proof Validation failed, will retry with reloaded discovery.", e);
+ DiscoveryService.reloadDiscovery();
+ }
+
+ try
+ {
+ validateProofs(pURL, pNewProof, pOldProof, pAccessToken, pTimeStamp);
+ return true;
+ }
+ catch (DMSSampleException e)
+ {
+ LoggerUtil.logError("Proof Validation failed even with reloaded discovery.", e);
+ throw new DMSSampleException("Proof Validation failed with reloaded discovery.");
+ }
+ }
+
+ private static void validateProofs(String pURL, String pNewProof,
+ String pOldProof, String pAuthToken, String pTimeStamp) throws DMSSampleException
+ {
+ Discovery lDiscovery = DiscoveryService.getDiscovery();
+ byte[] lbtexpectedProof = getExpectedProofBytes(pURL, pAuthToken, pTimeStamp);
+ ProofKey lOldProofKey = lDiscovery.getProoKeys().getOldProofKeyWrapper().getProofKey();
+ ProofKey lNewProofKey = lDiscovery.getProoKeys().getNewProofKeyWrapper().getProofKey();
+ boolean isNewKeyNewProofValid = false, isNewKeyOldProofValid = false,
+ isOldKeyNewProofValid = false;
+ try
+ {
+ // should verify correctly using X-Seclore-Proof and Current Key
+ // from
+ // Discovery
+ isNewKeyNewProofValid = verifyProof(lNewProofKey.getModulus(),
+ lNewProofKey.getExponent(), pNewProof, lbtexpectedProof);
+ // should verify correctly using X-Seclore-ProofOld and Current Key
+ // from Discovery
+ isNewKeyOldProofValid = verifyProof(lNewProofKey.getModulus(),
+ lNewProofKey.getExponent(), pOldProof, lbtexpectedProof);
+ // should verify correctly using X-Seclore-Proof and Old Key from
+ // Discovery
+ isOldKeyNewProofValid = verifyProof(lOldProofKey.getModulus(),
+ lOldProofKey.getExponent(), pNewProof, lbtexpectedProof);
+ }
+ catch (Exception lException)
+ {
+ throw new DMSSampleException("Unable to validate proof.", lException);
+ }
+ if (isNewKeyNewProofValid || isNewKeyOldProofValid || isOldKeyNewProofValid)
+ {
+ return;
+ }
+ else
+ {
+ throw new DMSSampleException("Proof Validation failed.");
+ }
+ }
+
+ private static byte[] getExpectedProofBytes(String pUrl, final String pAccessToken, final String pTimestamp)
+ {
+ final byte[] accessTokenBytes = pAccessToken.getBytes(StandardCharsets.UTF_8);
+
+ final byte[] hostUrlBytes = pUrl.toUpperCase().getBytes(StandardCharsets.UTF_8);
+
+ final Long timestamp = Long.valueOf(pTimestamp);
+
+ final ByteBuffer byteBuffer = ByteBuffer.allocate(4 + accessTokenBytes.length + 4 + hostUrlBytes.length + 4 + 8);
+ byteBuffer.putInt(accessTokenBytes.length);
+ byteBuffer.put(accessTokenBytes);
+ byteBuffer.putInt(hostUrlBytes.length);
+ byteBuffer.put(hostUrlBytes);
+ byteBuffer.putInt(8);
+ byteBuffer.putLong(timestamp);
+
+ return byteBuffer.array();
+ }
+
+ /**
+ * @param pSecloreProofKey
+ * - Proof key from REST header
+ * @param pExpectedProofArray
+ * - Byte Array from Specfication -- Contains query string, time
+ * and access key combined by defined algorithm in spec 4 bytes
+ * that represent the length, in bytes, of the access_token on
+ * the request. The access_token. 4 bytes that represent the
+ * length, in bytes, of the full URL of the Seclore request,
+ * including any query string parameters. The Seclore request URL
+ * in all uppercase. All query string parameters on the request
+ * URL should be included. 4 bytes that represent the length, in
+ * bytes, of the X-Seclore-TimeStamp value. The
+ * X-Seclore-TimeStamp value.
+ * @return
+ * @throws Exception
+ */
+ private static boolean verifyProof(String pModulus, String pExponent, String pSecloreProofKey,
+ byte[] pExpectedProofArray) throws Exception
+ {
+ PublicKey publicKey = getPublicKey(pModulus, pExponent);
+
+ Signature verifier = Signature.getInstance("SHA256withRSA");
+ verifier.initVerify(publicKey);
+ verifier.update(pExpectedProofArray); // Or whatever interface
+ // specifies.
+
+ final byte[] signedProof = Base64.getDecoder().decode(pSecloreProofKey);
+
+ return verifier.verify(signedProof);
+ }
+
+ /**
+ * Gets a public RSA Key using Seclore Discovery Modulus and Exponent for
+ * PKI Signed Validation
+ *
+ * @param pModulus
+ * @param pExponent
+ * @return
+ * @throws Exception
+ */
+ private static RSAPublicKey getPublicKey(String pModulus, String pExponent) throws Exception
+ {
+ BigInteger lMod = new BigInteger(1, Base64.getDecoder().decode(pModulus));
+ BigInteger lExp = new BigInteger(1, Base64.getDecoder().decode(pExponent));
+ KeyFactory lFactory = KeyFactory.getInstance("RSA");
+ KeySpec lKeySpec = new RSAPublicKeySpec(lMod, lExp);
+
+ return (RSAPublicKey) lFactory.generatePublic(lKeySpec);
+ }
+
+ /**
+ * Generate JWT Token using Nimbus Library.
+ *
+ * @param pPayload
+ * @param pKey
+ * @param pExpiry
+ * @return
+ * @throws DMSSampleException
+ */
+ private static String generateJWT(Map pPayload, Date pExpiry)
+ throws DMSSampleException
+ {
+ // get Current time;
+ Date lDate = new Date();
+
+ Builder lBuilder = new JWTClaimsSet.Builder();
+
+ if (pPayload == null)
+ {
+ pPayload = new HashMap();
+ }
+
+ for (Map.Entry lEntry : pPayload.entrySet())
+ {
+ lBuilder.claim(lEntry.getKey(), lEntry.getValue());
+ }
+ lBuilder.issuer(SO_INTEGRATION_APP);
+ lBuilder.issueTime(lDate);
+
+ // Set Expiry time in token
+ lBuilder.expirationTime(pExpiry);
+ JWSAlgorithm lJWSAlgorithm = JWSAlgorithm.HS256;
+ SignedJWT lSignedJWT = new SignedJWT(new JWSHeader(lJWSAlgorithm), lBuilder.build());
+
+ // Create HMAC signer
+ JWSSigner lSigner = null;
+ try
+ {
+ lSigner = new MACSigner(JWT_SIGNINING_KEY);
+ Provider lSecurityProvider = Security.getProvider(BCFIPS);
+ lSigner.getJCAContext().setProvider(lSecurityProvider);
+ lSignedJWT.sign(lSigner);
+ }
+ catch (KeyLengthException lKeyLengthException)
+ {
+ LoggerUtil.logError("Key Length Exception while generating JWT token.");
+ throw new DMSSampleException(lKeyLengthException.getMessage(), lKeyLengthException);
+ }
+ catch (JOSEException lJOSEException)
+ {
+ LoggerUtil.logError("Error while signing JWT token.");
+ throw new DMSSampleException(lJOSEException.getMessage(), lJOSEException);
+ }
+
+ return lSignedJWT.serialize();
+ }
+
+ /**
+ * Validates whether the JWT was signed with JWT_SIGNINING_KEY.
+ * Doesn't check for expiry.
+ *
+ * @param pJWT
+ * @return JWTClaimsSet if validated.
+ * @throws DMSSampleException
+ * @throws UnsupportedEncodingException
+ * @throws JOSEException
+ * @throws ParseException
+ */
+ private static JWTClaimsSet verifyToken(String pJWT)
+ throws DMSSampleException, UnsupportedEncodingException, JOSEException, ParseException
+ {
+
+ if (CommonUtil.isEmptyString(pJWT))
+ {
+ LoggerUtil.logError("Empty JWT String found in Security Service");
+ throw new DMSSampleException("Empty JWT String found in Security Service");
+ }
+
+ try
+ {
+ SignedJWT lSignedJWT = SignedJWT.parse(pJWT);
+ JWSVerifier lVerifier = null;
+ try
+ {
+ lVerifier = new MACVerifier(new String(JWT_SIGNINING_KEY, UTF_8));
+ Provider lSecurityProvider = Security.getProvider(BCFIPS);
+ lVerifier.getJCAContext().setProvider(lSecurityProvider);
+ if (!lSignedJWT.verify(lVerifier))
+ {
+ LoggerUtil.logError("JWT validation failed.");
+
+ throw new DMSSampleException("Validation failed for JWT Token");
+ }
+ }
+ catch (JOSEException e)
+ {
+ LoggerUtil.logError(" Error while validating access token.");
+ throw e;
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ LoggerUtil.logError("UnSupported Encoding Exception while validating access token.");
+ throw e;
+ }
+
+ return lSignedJWT.getJWTClaimsSet();
+
+ }
+ catch (ParseException e)
+ {
+ LoggerUtil.logError("Unable to parse JWT String while validating access token.");
+ throw e;
+ }
+ }
+
+ private static void verifyExpiry(Date pExpiryDate) throws DMSSampleException
+ {
+ if (new Date().after(pExpiryDate))
+ {
+ LoggerUtil.logError("Access Token has expired.");
+ throw new DMSSampleException("Access Token has expired.");
+ }
+ }
+}
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/file/CheckInFileServlet.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/file/CheckInFileServlet.java
new file mode 100755
index 0000000..bb4ce87
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/file/CheckInFileServlet.java
@@ -0,0 +1,115 @@
+package com.seclore.sample.dms.servlet.file;
+
+import java.io.IOException;
+import java.util.Date;
+
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import com.seclore.sample.dms.config.SampleAppConfig;
+import com.seclore.sample.dms.core.AppFile;
+import com.seclore.sample.dms.core.AppFolder;
+import com.seclore.sample.dms.util.CommonUtil;
+import com.seclore.sample.dms.util.LoggerUtil;
+import com.seclore.sample.dms.util.xml.XMLDBService;
+
+/**
+ * Servlet implementation class DeleteFileServlet
+ */
+@WebServlet(name = "CheckInFileServlet", urlPatterns = { "/checkInFile.do" })
+public class CheckInFileServlet extends HttpServlet
+{
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @see HttpServlet#HttpServlet()
+ */
+ public CheckInFileServlet()
+ {
+ super();
+ }
+
+ /**
+ * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ doPost(request, response);
+ }
+
+ /**
+ * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ LoggerUtil.logDebug("CheckInFileServlet::doPost::START");
+ HttpSession session = request.getSession();
+ String fileId = request.getParameter("fileId");
+ String folderId = request.getParameter("folderId");
+
+ if(folderId == null || folderId.trim().isEmpty())
+ {
+ session.setAttribute("ERROR_MESSAGE", "The folder for selected file could not be found!");
+ response.sendRedirect("folderList.do");
+ return;
+ }
+
+ AppFolder lFolder = XMLDBService.getFolder(folderId);
+ if( lFolder == null )
+ {
+ session.setAttribute("ERROR_MESSAGE", "The folder for selected file could not be found!");
+ response.sendRedirect("folderList.do");
+ return;
+ }
+
+ if(fileId == null || fileId.trim().isEmpty())
+ {
+ session.setAttribute("ERROR_MESSAGE", "The file for selected file could not be found!");
+ response.sendRedirect("fileList.do?folderId="+folderId);
+ return;
+ }
+
+
+ AppFile lFile = XMLDBService.getFile(folderId,fileId);
+ if( lFile == null )
+ {
+ session.setAttribute("ERROR_MESSAGE", "The file for selected file could not be found!");
+ response.sendRedirect("fileList.do?folderId="+folderId);
+ return;
+ }
+
+ HttpSession lSession = request.getSession();
+ String lstrUserName = (String)lSession.getAttribute("name");
+ lstrUserName = CommonUtil.isStringEmpty(lstrUserName) ? SampleAppConfig.getDummyUserName() : lstrUserName;
+ updateMajorFileVersion(lFile,lFolder, lstrUserName, (new Date()).getTime());
+
+ LoggerUtil.logDebug("CheckInFileServlet::doPost::END");
+ response.sendRedirect("fileList.do?folderId="+folderId);
+ return;
+ }
+
+ private void updateMajorFileVersion(AppFile pAppFile, AppFolder pAppFolder, String pLMByUser, long pLMTime)
+ {
+ LoggerUtil.logDebug("CheckInFileServlet::updateMajorFileVersion:: File-"+pAppFile.getId());
+ if(pAppFile.getMinorVersion()>0)
+ {
+ int liVersion = pAppFile.getMajorVersion();
+ liVersion++;
+ pAppFile.setMajorVersion(liVersion);
+ pAppFile.setMinorVersion(0);
+ pAppFile.setLmTime(pLMTime);
+ pAppFile.setLmByUser(pLMByUser);
+ XMLDBService.updateFile(pAppFolder.getId(), pAppFile);
+ LoggerUtil.logDebug("CheckInFileServlet::updateMajorFileVersion:: Updated.");
+ }
+ else
+ {
+ LoggerUtil.logDebug("CheckInFileServlet::updateMajorFileVersion:: Already up to date.");
+ }
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/file/DeleteFileServlet.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/file/DeleteFileServlet.java
new file mode 100755
index 0000000..dd493ed
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/file/DeleteFileServlet.java
@@ -0,0 +1,96 @@
+package com.seclore.sample.dms.servlet.file;
+
+import java.io.IOException;
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import com.seclore.sample.dms.core.AppFile;
+import com.seclore.sample.dms.core.AppFolder;
+import com.seclore.sample.dms.util.LoggerUtil;
+import com.seclore.sample.dms.util.xml.XMLDBService;
+
+/**
+ * Servlet implementation class DeleteFileServlet
+ */
+@WebServlet(name = "deleteFileServlet", urlPatterns = { "/deleteFile.do" })
+public class DeleteFileServlet extends HttpServlet
+{
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @see HttpServlet#HttpServlet()
+ */
+ public DeleteFileServlet()
+ {
+ super();
+ }
+
+ /**
+ * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ doPost(request, response);
+ }
+
+ /**
+ * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ LoggerUtil.logDebug("DeleteFileServlet::doPost::START");
+ HttpSession session = request.getSession();
+ String fileId = request.getParameter("fileId");
+ String folderId = request.getParameter("folderId");
+
+ if(folderId == null || folderId.trim().isEmpty())
+ {
+ session.setAttribute("ERROR_MESSAGE", "The folder for selected file could not be found!");
+ response.sendRedirect("folderList.do");
+ return;
+ }
+
+ AppFolder lFolder = XMLDBService.getFolder(folderId);
+ if( lFolder == null )
+ {
+ session.setAttribute("ERROR_MESSAGE", "The folder for selected file could not be found!");
+ response.sendRedirect("folderList.do");
+ return;
+ }
+
+ if(fileId == null || fileId.trim().isEmpty())
+ {
+ session.setAttribute("ERROR_MESSAGE", "The file you were deleting for could not be found!");
+ response.sendRedirect("fileList.do?folderId="+folderId);
+ return;
+ }
+
+
+ AppFile lFile = XMLDBService.getFile(folderId,fileId);
+ if( lFile == null )
+ {
+ session.setAttribute("ERROR_MESSAGE", "The file you were deleting for could not be found!");
+ response.sendRedirect("fileList.do?folderId="+folderId);
+ return;
+ }
+
+ if ( XMLDBService.deleteFile(folderId, lFile))
+ {
+ LoggerUtil.logInfo("User '"+session.getAttribute("name")+"' deleted the file '"+lFile.getName()+"' from folder '"+lFolder.getName()+"'");
+ session.setAttribute("SUCCESS_MESSAGE", "File has been deleted successfully!");
+ }
+ else
+ {
+ session.setAttribute("ERROR_MESSAGE", "File deletion faild, Please try again!");
+ }
+
+ LoggerUtil.logDebug("DeleteFileServlet::doPost::END");
+ response.sendRedirect("fileList.do?folderId="+folderId);
+ return;
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/file/DownloadFileServlet.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/file/DownloadFileServlet.java
new file mode 100755
index 0000000..c3490c5
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/file/DownloadFileServlet.java
@@ -0,0 +1,218 @@
+package com.seclore.sample.dms.servlet.file;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import com.seclore.sample.dms.config.SampleAppConfig;
+import com.seclore.sample.dms.constant.Constants;
+import com.seclore.sample.dms.core.AppFile;
+import com.seclore.sample.dms.core.AppFolder;
+import com.seclore.sample.dms.core.FileHtmlWrapInfo;
+import com.seclore.sample.dms.util.CommonUtil;
+import com.seclore.sample.dms.util.Global;
+import com.seclore.sample.dms.util.LoggerUtil;
+import com.seclore.sample.dms.util.ParserUtil;
+import com.seclore.sample.dms.util.SecloreProtectUtil;
+import com.seclore.sample.dms.util.xml.XMLDBService;
+
+/**
+ * Servlet implementation class DownloadFileServlet
+ * Handle file download request
+ *
+ */
+@WebServlet(name = "downloadFileServlet", urlPatterns = { "/downloadFile.do" })
+public class DownloadFileServlet extends HttpServlet {
+ private static final long serialVersionUID = 1L;
+ private static final String TEMP_FOLDER_PATH = Global.getAppRealPath() + File.separator + "SECLORE_TEMP_FOLDER";
+ private FileHtmlWrapInfo mFileHtmlWrapInfo;
+
+ /**
+ * @see HttpServlet#HttpServlet()
+ */
+ public DownloadFileServlet() {
+ super();
+ }
+
+ /**
+ * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
+ * response)
+ */
+ protected void doGet(HttpServletRequest request, HttpServletResponse response)
+ throws ServletException, IOException {
+ doPost(request, response);
+ }
+
+ /**
+ * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
+ * response)
+ */
+ protected void doPost(HttpServletRequest request, HttpServletResponse response)
+ throws ServletException, IOException {
+ LoggerUtil.logDebug("DownloadFileServlet::doPost::START");
+ HttpSession session = request.getSession();
+ mFileHtmlWrapInfo = new FileHtmlWrapInfo();
+ String folderId = request.getParameter("folderId");
+ String fileId = request.getParameter("fileId");
+ boolean lbJustWrapped = false;
+
+ // ======== File and Folder Validations - START ======== //
+ if (folderId == null || folderId.trim().isEmpty()) {
+ session.setAttribute("ERROR_MESSAGE", "The folder for selected file could not be found!");
+ response.sendRedirect("folderList.do");
+ return;
+ }
+
+ AppFolder lAppFolder = XMLDBService.getFolder(folderId);
+ if (lAppFolder == null) {
+ session.setAttribute("ERROR_MESSAGE", "The folder for selected file could not be found!");
+ response.sendRedirect("folderList.do");
+ return;
+ }
+
+ if (fileId == null || fileId.trim().isEmpty()) {
+ session.setAttribute("ERROR_MESSAGE", "The file you were looking for could not be found!");
+ response.sendRedirect("fileList.do?folderId=" + folderId);
+ return;
+ }
+
+ AppFile lAppFile = XMLDBService.getFile(folderId, fileId);
+ if (lAppFile == null) {
+ session.setAttribute("ERROR_MESSAGE", "The file you were looking for could not be found!");
+ response.sendRedirect("fileList.do?folderId=" + folderId);
+ return;
+ }
+ // ======== File and Folder Validations - END ======== //
+
+ String fileName = lAppFile.getName();
+ String originalFilePath = Global.getAppDataDir() + File.separator + folderId + File.separator + fileName;
+ File lfile = new File(originalFilePath);
+ if (!lfile.exists()) {
+ session.setAttribute("ERROR_MESSAGE", "The file you were looking for could not be found!");
+ response.sendRedirect("fileList.do?folderId=" + folderId);
+ return;
+ }
+
+ InputStream fileInputStream = null;
+ try {
+
+ // ********************************************************* //
+ // ****** Seclore File Protection integration - START ****** //
+ // ********************************************************* //
+
+ // ****** WRITE TEMP FILE ****** //
+ // Create Temporary folder if not exist
+ createTempFolder(TEMP_FOLDER_PATH);
+ String tempFileName = CommonUtil.addTimeStampToFileName(fileName);
+ String tempFilePath = TEMP_FOLDER_PATH + File.separator + tempFileName;
+ try {
+ SecloreProtectUtil.copyAndReplaceFile(originalFilePath, tempFilePath);
+ } finally {
+
+ }
+
+ // If folder is non-IRM enabled, make no checks. Just download the file
+ if (lAppFolder.getIrmEnabled() == false) {
+ fileInputStream = new FileInputStream(new File(tempFilePath));
+ } else {
+ Gson lGson = new Gson();
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty(Constants.KEY_HF_EXTN_REF_ID, lAppFolder.getId());
+ String lstrExtnRefData = lGson.toJson(jsonObject);
+
+ String lstrExtnHFid = SampleAppConfig.getExternalHotFolderId();
+ // === Construct Protection details XML
+ String protectionDetailsXML = "" +
+ "" +
+ "" + ParserUtil.escapeForXML(lstrExtnHFid) + " " +
+ "" + ParserUtil.escapeForXML("") + " " +
+ "" + ParserUtil.escapeForXML("") + " " +
+ "" + ParserUtil.escapeForXML("") + " " +
+ " " +
+ " " +
+
+ "" +
+ "" +
+ "" + ParserUtil.escapeForXML(lAppFile.getId()) + " " +
+ "" + ParserUtil.escapeForXML(lAppFile.getName()) + " " +
+ "" + ParserUtil.escapeForXML(lstrExtnRefData) + " " +
+ "" + ParserUtil.escapeForXML("") + " " +
+ " " +
+ " ";
+
+ // ****** Protect TEMP File and Get protected content ****** //
+ String displayFileName = lAppFile.getName();
+ mFileHtmlWrapInfo.setHtmlWrapEnable(true);
+ fileInputStream = SecloreProtectUtil.protectFile(tempFilePath, displayFileName, protectionDetailsXML,
+ mFileHtmlWrapInfo);
+ lbJustWrapped = mFileHtmlWrapInfo.getHtmlWrapStatus();
+
+ }
+
+ // ******************************************************* //
+ // ****** Seclore File Protection integration - END ****** //
+ // ******************************************************* //
+
+ response.setContentType((lbJustWrapped == true ? "text/html" : lAppFile.getContentType()));
+ response.setContentLength(fileInputStream.available());
+ response.setHeader("Content-Disposition",
+ "attachment; filename=\"" + lAppFile.getName() + (lbJustWrapped == true ? ".html" : "") + "\"");
+
+ ServletOutputStream servletOutputStream = response.getOutputStream();
+ byte[] bufferData = new byte[1024];
+ int lRead = 0;
+
+ while ((lRead = fileInputStream.read(bufferData)) != -1) {
+ servletOutputStream.write(bufferData, 0, lRead);
+ }
+
+ try {
+ servletOutputStream.flush();
+ LoggerUtil.logInfo("DownloadFileServlet::doPost::Downloaded successfully.");
+ } catch (IOException ioExp) {
+ }
+
+ } catch (Exception lEx) {
+ LoggerUtil.logError("Error occured while downloading the file", lEx);
+ session.setAttribute("ERROR_MESSAGE",
+ "Error occured while downloading the file- '" + lEx.getMessage() + "'");
+ LoggerUtil.logDebug("DownloadFileServlet::doPost::END");
+ response.sendRedirect("fileList.do?folderId=" + folderId);
+ return;
+ } finally {
+ if (fileInputStream != null) {
+ try {
+ fileInputStream.close();
+ fileInputStream = null;
+ } catch (IOException ioExp) {
+ // Ignore
+ }
+ }
+ }
+
+ LoggerUtil.logDebug("DownloadFileServlet::doPost::END");
+ }
+
+ /**
+ * Create Temporary Folder if not exist
+ *
+ * @param pTempFolderPath
+ */
+ private void createTempFolder(String pTempFolderPath) {
+ File tempFolder = new File(pTempFolderPath);
+ if (!tempFolder.exists()) {
+ tempFolder.mkdirs();
+ }
+ }
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/file/FileListServlet.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/file/FileListServlet.java
new file mode 100755
index 0000000..dbc3c2f
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/file/FileListServlet.java
@@ -0,0 +1,72 @@
+package com.seclore.sample.dms.servlet.file;
+
+import java.io.IOException;
+import java.util.Collection;
+
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import com.seclore.sample.dms.core.AppFile;
+import com.seclore.sample.dms.core.AppFolder;
+import com.seclore.sample.dms.util.LoggerUtil;
+import com.seclore.sample.dms.util.xml.XMLDBService;
+
+/**
+ * Servlet implementation class FileListServlet
+ */
+@WebServlet(name = "fileListServlet", urlPatterns = { "/fileList.do" })
+public class FileListServlet extends HttpServlet {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @see HttpServlet#HttpServlet()
+ */
+ public FileListServlet()
+ {
+ super();
+ }
+
+ /**
+ * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ doPost(request, response);
+ }
+
+ /**
+ * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ LoggerUtil.logDebug("FileListServlet::doPost::START");
+ HttpSession session = request.getSession();
+ String folderId = request.getParameter("folderId");
+
+ if( folderId == null || folderId.trim().isEmpty() )
+ {
+ LoggerUtil.logDebug("FileListServlet::doPost::Folder ID not found to displaye the file list");
+ session.setAttribute("ERROR_MESSAGE", "Please specify a valid folder ID!");
+ response.sendRedirect("folderList.do");
+ return;
+ }
+ AppFolder folder = XMLDBService.getFolder(folderId);
+ if( folder == null )
+ {
+ session.setAttribute("ERROR_MESSAGE", "The folder for selected file could not be found!");
+ response.sendRedirect("folderList.do");
+ return;
+ }
+
+ Collection fileList = XMLDBService.getFileList(folderId);
+ request.setAttribute("folder", folder);
+ request.setAttribute("fileList", fileList);
+ request.getRequestDispatcher("/portal/pages/fileList.jsp").forward(request, response);
+ LoggerUtil.logDebug("FileListServlet::doPost::END");
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/file/GetMapsForActivityAction.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/file/GetMapsForActivityAction.java
new file mode 100755
index 0000000..3195d7e
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/file/GetMapsForActivityAction.java
@@ -0,0 +1,144 @@
+package com.seclore.sample.dms.servlet.file;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import com.seclore.sample.dms.config.SampleAppConfig;
+import com.seclore.sample.dms.core.AppFile;
+import com.seclore.sample.dms.core.AppFolder;
+import com.seclore.sample.dms.core.FileActivityLog;
+import com.seclore.sample.dms.core.IPGeoDetails;
+import com.seclore.sample.dms.util.GeoLocationUtil;
+import com.seclore.sample.dms.util.LoggerUtil;
+import com.seclore.sample.dms.util.PortalUtil;
+import com.seclore.sample.dms.util.xml.XMLDBService;
+import com.seclore.sample.ps.db.DBConnection;
+
+/**
+ * Servlet implementation class for ViewFileLogs
+ */
+@WebServlet(name = "getMapsForActivityServlet", urlPatterns = { "/GetMapsForActivityAction.do" })
+public class GetMapsForActivityAction extends HttpServlet {
+
+ private static final long serialVersionUID = 1L;
+
+
+
+ /**
+ * @see HttpServlet#HttpServlet()
+ */
+ public GetMapsForActivityAction()
+ {
+ super();
+ }
+
+ /**
+ * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ doPost(request, response);
+ }
+
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ String lstrMethodName = "GetMapsForActivityAction :: doPost :: ";
+ LoggerUtil.logDebug(lstrMethodName + "START");
+ HttpSession session = request.getSession();
+ try {
+ if(SampleAppConfig.isLocationBasedFeatureEnabled() == false)
+ {
+ throw new Exception("Location Based Features are disabled.");
+ }
+ String mapboxApiKey = SampleAppConfig.getMapboxApiKey();
+ if( mapboxApiKey == null || mapboxApiKey.trim().isEmpty() )
+ {
+ throw new Exception("MapBox API is not configured.");
+ }
+
+ String fileId = request.getParameter("fileId");
+ String folderId = request.getParameter("folderId");
+
+ List lliFileActivityLog = null;
+ HashMap lIP2GeoDetailsMap = null;
+
+ if(folderId == null || folderId.trim().isEmpty())
+ {
+ throw new Exception("The folder for selected file could not be found!");
+ }
+
+ AppFolder lFolder = XMLDBService.getFolder(folderId);
+ if( lFolder == null )
+ {
+ throw new Exception("The folder for selected file could not be found!");
+ }
+
+ if(fileId == null || fileId.trim().isEmpty())
+ {
+ throw new Exception( "The file you were deleting for could not be found!");
+ }
+
+
+ AppFile lFile = XMLDBService.getFile(folderId,fileId);
+ if( lFile == null )
+ {
+ throw new Exception("The file you were accessing could not be found!");
+ }
+
+ lliFileActivityLog = DBConnection.getFileLogsByFileId(fileId, true);
+ if(lliFileActivityLog != null)
+ {
+ lIP2GeoDetailsMap = new HashMap();
+ LoggerUtil.logDebug(lstrMethodName + "No of file activity log returned : " + lliFileActivityLog.size());
+ for(FileActivityLog fal : lliFileActivityLog)
+ {
+ try
+ {
+ if( lIP2GeoDetailsMap.containsKey(fal.getRequestIPAddress()) == false )
+ {
+ IPGeoDetails lGeoDetails = GeoLocationUtil.getGeoDetailsFromIPAddress(fal.getRequestIPAddress());
+ if(lGeoDetails.getLatitude() == null || lGeoDetails.getLongitude() ==null)
+ {
+ LoggerUtil.logDebug(lstrMethodName + "Latitude/Longitude returned null by IPStack for IP " + fal.getRequestIPAddress());
+ lGeoDetails = null;
+ }
+ lIP2GeoDetailsMap.put(fal.getRequestIPAddress(), lGeoDetails);
+ }
+ } catch (Exception e)
+ {
+ LoggerUtil.logError(lstrMethodName + "Error while fetching Geo Details from IPStack.", e);
+ }
+ }
+ LoggerUtil.logDebug(lstrMethodName + "Size of IP2GeoDetailsMap : " + lIP2GeoDetailsMap.size());
+ }
+ else
+ {
+ LoggerUtil.logDebug(lstrMethodName + "File Activity log returned is null");
+ }
+ request.setAttribute("ip2geodetailsmap", lIP2GeoDetailsMap);
+ PortalUtil.setRequestAttributes(request, lliFileActivityLog);
+ PortalUtil.setRequestAttributes(request, lFile, lFolder);
+
+ LoggerUtil.logDebug(lstrMethodName + "END");
+ request.getRequestDispatcher("/portal/pages/openActivityOnMap.jsp").forward(request, response);
+ }
+ catch(Exception e)
+ {
+ session.setAttribute("ERROR_MESSAGE", e.getMessage());
+ LoggerUtil.logError(lstrMethodName, e);
+ response.sendRedirect("folderList.do");
+ }
+ }
+
+
+
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/file/PreAddFileServlet.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/file/PreAddFileServlet.java
new file mode 100755
index 0000000..d93cdfe
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/file/PreAddFileServlet.java
@@ -0,0 +1,73 @@
+package com.seclore.sample.dms.servlet.file;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import com.seclore.sample.dms.core.AppFile;
+import com.seclore.sample.dms.core.AppFolder;
+import com.seclore.sample.dms.util.LoggerUtil;
+import com.seclore.sample.dms.util.PortalUtil;
+import com.seclore.sample.dms.util.xml.XMLDBService;
+
+/**
+ * Servlet implementation class PreAddFileServlet
+ */
+@WebServlet(name = "preAddFileServlet", urlPatterns = { "/addFile.do" })
+public class PreAddFileServlet extends HttpServlet
+{
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @see HttpServlet#HttpServlet()
+ */
+ public PreAddFileServlet()
+ {
+ super();
+ }
+
+ /**
+ * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ doPost(request, response);
+ }
+
+ /**
+ * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ LoggerUtil.logDebug("PreAddFileServlet::doPost::START");
+ HttpSession session = request.getSession();
+ String folderId = request.getParameter("folderId");
+
+ if( folderId == null || folderId.trim().isEmpty() )
+ {
+ session.setAttribute("ERROR_MESSAGE", "Please specify a valid folder ID!");
+ response.sendRedirect("folderList.do");
+ return;
+ }
+
+ AppFolder lFolder = XMLDBService.getFolder(folderId);
+ if( lFolder == null )
+ {
+ session.setAttribute("ERROR_MESSAGE", "The folder for selected file could not be found!");
+ response.sendRedirect("folderList.do");
+ return;
+ }
+
+ AppFile lFile = new AppFile();
+ PortalUtil.setRequestAttributes(request, lFile, lFolder );
+ LoggerUtil.logDebug("PreAddFileServlet::doPost::END");
+ request.getRequestDispatcher("/portal/pages/file.jsp").forward(request, response);
+ return;
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/file/PreEditFileServlet.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/file/PreEditFileServlet.java
new file mode 100755
index 0000000..b294d62
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/file/PreEditFileServlet.java
@@ -0,0 +1,90 @@
+package com.seclore.sample.dms.servlet.file;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import com.seclore.sample.dms.core.AppFile;
+import com.seclore.sample.dms.core.AppFolder;
+import com.seclore.sample.dms.util.LoggerUtil;
+import com.seclore.sample.dms.util.PortalUtil;
+import com.seclore.sample.dms.util.xml.XMLDBService;
+
+/**
+ * Servlet implementation class EditFileServlet
+ */
+@WebServlet(name = "preEditFileServlet", urlPatterns = { "/editFile.do" })
+public class PreEditFileServlet extends HttpServlet
+{
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @see HttpServlet#HttpServlet()
+ */
+ public PreEditFileServlet()
+ {
+ super();
+ }
+
+ /**
+ * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ doPost(request, response);
+ }
+
+ /**
+ * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ LoggerUtil.logDebug("PreEditFileServlet::doPost::START");
+ HttpSession session = request.getSession();
+
+ String fileId = request.getParameter("fileId");
+ String folderId = request.getParameter("folderId");
+
+ if(folderId == null || folderId.trim().isEmpty())
+ {
+ session.setAttribute("ERROR_MESSAGE", "The folder for selected file could not be found!");
+ response.sendRedirect("folderList.do");
+ return;
+ }
+
+ AppFolder lFolder = XMLDBService.getFolder(folderId);
+ if( lFolder == null )
+ {
+ session.setAttribute("ERROR_MESSAGE", "The folder for selected file could not be found!");
+ response.sendRedirect("folderList.do");
+ return;
+ }
+
+ if(fileId == null || fileId.trim().isEmpty())
+ {
+ session.setAttribute("ERROR_MESSAGE", "The file you were looking for could not be found!");
+ response.sendRedirect("fileList.do?folderId="+folderId);
+ return;
+ }
+
+
+ AppFile lFile = XMLDBService.getFile(folderId,fileId);
+ if( lFile == null )
+ {
+ session.setAttribute("ERROR_MESSAGE", "The file you were looking for could not be found!");
+ response.sendRedirect("fileList.do?folderId="+folderId);
+ return;
+ }
+
+ PortalUtil.setRequestAttributes(request, lFile, lFolder );
+ LoggerUtil.logDebug("PreEditFileServlet::doPost::END");
+ request.getRequestDispatcher("/portal/pages/file.jsp").forward(request, response);
+ return;
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/file/SaveFileServlet.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/file/SaveFileServlet.java
new file mode 100755
index 0000000..fc3f3f5
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/file/SaveFileServlet.java
@@ -0,0 +1,385 @@
+package com.seclore.sample.dms.servlet.file;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.Type;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.Set;
+import java.util.UUID;
+
+import javax.servlet.ServletException;
+import javax.servlet.annotation.MultipartConfig;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import javax.servlet.http.Part;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonNull;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.google.gson.reflect.TypeToken;
+import com.seclore.fs.helper.exception.FSHelperException;
+import com.seclore.sample.dms.config.SampleAppConfig;
+import com.seclore.sample.dms.constant.Constants;
+import com.seclore.sample.dms.core.AppFile;
+import com.seclore.sample.dms.core.AppFolder;
+import com.seclore.sample.dms.core.Classification;
+import com.seclore.sample.dms.core.Owner;
+import com.seclore.sample.dms.core.UserRight;
+import com.seclore.sample.dms.core.master.User;
+import com.seclore.sample.dms.util.CommonUtil;
+import com.seclore.sample.dms.util.Global;
+import com.seclore.sample.dms.util.LoggerUtil;
+import com.seclore.sample.dms.util.PortalUtil;
+import com.seclore.sample.dms.util.xml.XMLDBService;
+
+
+/**
+ * Servlet implementation class SaveFileServlet
+ */
+@WebServlet(name = "saveFileServlet", urlPatterns = { "/saveFile.do" })
+@MultipartConfig(maxFileSize=(Constants.MAX_FILE_SIZE+2)*1024*1024)
+public class SaveFileServlet extends HttpServlet
+{
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @see HttpServlet#HttpServlet()
+ */
+ public SaveFileServlet()
+ {
+ super();
+ }
+
+ /**
+ * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ doPost(request, response);
+ }
+
+ /**
+ * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ LoggerUtil.logDebug("SaveFileServlet::doPost::START");
+ HttpSession session = request.getSession();
+
+ // First read the file, if file size will be more than MAX_FILE_SIZE, then part and all other parameter will be null.
+ Part part = null;
+ boolean isError = false;
+ String errorMessage = "";
+ try
+ {
+ part = request.getPart("file");
+ }
+ catch(IOException ioException)
+ {
+ LoggerUtil.logError("SaveFileServlet::doPost::"+ioException.getMessage(), ioException);
+ // Request aborted
+ if(ioException.getMessage().contains("org.apache.tomcat.util.http.fileupload.FileUploadBase$IOFileUploadException"))
+ {
+ return;
+ }
+ else
+ {
+ isError = true;
+ errorMessage = ioException.getMessage();
+ }
+ }
+ catch(IllegalStateException iex)
+ {
+ LoggerUtil.logError("SaveFileServlet::doPost::"+iex.getMessage(), iex);
+ isError = true;
+ // file size exceeded
+ if(iex.getMessage().contains("org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException"))
+ {
+ errorMessage = "The file exceeds its maximum permitted size of "+Constants.MAX_FILE_SIZE+"MB";
+ }
+ else
+ {
+ errorMessage = iex.getMessage();
+ }
+ }
+
+ if( isError )
+ {
+ session.setAttribute("ERROR_MESSAGE", errorMessage);
+ response.sendRedirect("folderList.do");
+ return;
+ }
+
+ String folderId = request.getParameter("folderId");
+ if( folderId == null || folderId.trim().isEmpty() )
+ {
+ LoggerUtil.logDebug("SaveFileServlet::doPost::Folder ID not found to add the file");
+ session.setAttribute("ERROR_MESSAGE", "Please specify a valid folder ID!");
+ response.sendRedirect("folderList.do");
+ return;
+ }
+ AppFolder lFolder = XMLDBService.getFolder(folderId);
+ if( lFolder == null )
+ {
+ session.setAttribute("ERROR_MESSAGE", "The folder for the file could not be found!");
+ response.sendRedirect("folderList.do");
+ return;
+ }
+
+ String fileId = request.getParameter("fileId");
+ String usersRightsJson = request.getParameter("usersRightsJson");
+ String ownerEmailId = request.getParameter("ownerEmaiId");
+ String classificationId = request.getParameter("classification");
+ String blacklistedCountries[] = request.getParameterValues("blacklistedCountries");
+ String userName = (String) session.getAttribute("name");
+
+ Set newUserRights = parseUserRights(usersRightsJson);
+ Set newBlacklistedCountries = convertStringArrayToSet(blacklistedCountries);
+
+ Owner lOwner = null;
+ if( ownerEmailId != null && !ownerEmailId.trim().isEmpty() )
+ {
+ User user = XMLDBService.getAppUserById(ownerEmailId);
+ lOwner = new Owner();
+ lOwner.setEmailId( ownerEmailId.trim() );
+ lOwner.setName( user.getName() );
+ }
+
+ Classification lClassification = null;
+ if( classificationId != null && !classificationId.trim().isEmpty() )
+ {
+ try
+ {
+ Integer.parseInt( classificationId );
+ lClassification = XMLDBService.getClassification( classificationId );
+ }catch(NumberFormatException nfe) { /*Default Classification*/}
+ }
+
+ if(CommonUtil.isStringEmpty(userName))
+ {
+ userName = SampleAppConfig.getDummyUserName();
+ }
+
+ AppFile lNewAppFile = new AppFile();
+ lNewAppFile.setUserRightList(newUserRights);
+ lNewAppFile.setBlacklistedCountries(newBlacklistedCountries);
+ lNewAppFile.setOwner(lOwner);
+ lNewAppFile.setClassification(lClassification);
+ lNewAppFile.setLmByUser(userName);
+
+ // New file
+ if( fileId == null || fileId.trim().isEmpty() )
+ {
+ String filename = getFileName(part);
+ LoggerUtil.logDebug("SaveFileServlet::doPost::File Name: "+filename);
+
+ if( filename == null || filename.isEmpty() )
+ {
+ PortalUtil.setRequestAttributes(request, lNewAppFile, lFolder );
+ request.setAttribute("ERROR_MESSAGE", "Please select the file!");
+ request.getRequestDispatcher("/portal/pages/file.jsp").forward(request, response);
+ return;
+ }
+
+ String folderPath = Global.getAppDataDir()+ File.separator + folderId;
+
+ File lFileFolder = new File(folderPath);
+ if ( !lFileFolder.exists() )
+ {
+ lFileFolder.mkdirs();
+ }
+
+ String filePath = folderPath + File.separator + filename;
+
+ // ------- Rename file if already exist -START -------- //
+ File lFile = new File(filePath);
+ int no = 2;
+ // File extension including .
+ String fileExt = filename.substring( filename.lastIndexOf(".") );
+ // File name without extension
+ String fileNameWOExt = filename.substring( 0, filename.lastIndexOf(".") );
+ while( lFile.exists() )
+ {
+ filename = fileNameWOExt + " ("+no+")" + fileExt;
+ filePath = folderPath + File.separator + filename;
+ lFile = new File(filePath);
+ no++;
+ }
+ // ------- Rename file if already exist -END --------- //
+
+ // Write file on disk
+ try
+ {
+ part.write(filePath);
+ }
+ catch(IOException exception)
+ {
+ LoggerUtil.logError("SaveFileServlet::doPost::Failed to write the file on disk for user '"+session.getAttribute("name")+"'",exception);
+ PortalUtil.setRequestAttributes(request, lNewAppFile, lFolder );
+ request.setAttribute("ERROR_MESSAGE", "The file has not been uploaded, Please try again!");
+ request.getRequestDispatcher("/portal/pages/file.jsp").forward(request, response);
+ return;
+ }
+
+ try
+ {
+ // In this sample application we do not allow to upload protected file
+ // But in actual DMS or VDR integration id depends on business requirements.
+ boolean isProtected = Global.getFSTenant().isProtectedFile(filePath);
+ boolean isWrapped = Global.getFSTenant().isHTMLWrapped(filePath);
+
+ if(isProtected || isWrapped)
+ {
+ File file = new File(filePath);
+ try{
+ file.delete();
+ }catch(Exception ex){}
+ PortalUtil.setRequestAttributes(request, lNewAppFile, lFolder );
+ LoggerUtil.logError("SaveFileServlet::doPost::User '"+session.getAttribute("name")+"' tried to add already protected file in to '"+lFolder.getName()+"' folder.");
+ request.setAttribute("ERROR_MESSAGE", "The file is already protected, Please upload unprotected file!");
+ request.getRequestDispatcher("/portal/pages/file.jsp").forward(request, response);
+ return;
+ }
+ }
+ catch (FSHelperException e)
+ {
+ LoggerUtil.logError("SaveFileServlet::doPost::Error while checking isProtectedFile", e);
+ PortalUtil.setRequestAttributes(request, lNewAppFile, lFolder );
+ request.setAttribute("ERROR_MESSAGE", "The file has not been uploaded, Please try again!");
+ request.getRequestDispatcher("/portal/pages/file.jsp").forward(request, response);
+ return;
+ }
+
+ fileId = UUID.randomUUID().toString();
+ lNewAppFile.setId( fileId );
+ lNewAppFile.setName( filename );
+ lNewAppFile.setContentType( part.getContentType() );
+
+ if ( XMLDBService.addNewFile( folderId, lNewAppFile ) )
+ {
+ LoggerUtil.logInfo("SaveFileServlet::doPost::User '"+session.getAttribute("name")+"' succesfully added the file'"+lNewAppFile.getName()+"' in to '"+lFolder.getName()+"' folder.");
+ session.setAttribute("SUCCESS_MESSAGE", "The file has been uploaded successfully!");
+ }
+ else
+ {
+ LoggerUtil.logInfo("SaveFileServlet::doPost::User '"+session.getAttribute("name")+"' failed to add the file'"+lNewAppFile.getName()+"' in to '"+lFolder.getName()+"' folder.");
+ PortalUtil.setRequestAttributes(request, lNewAppFile, lFolder );
+ request.setAttribute("ERROR_MESSAGE", "The file has not been uploaded, Please try again!");
+ request.getRequestDispatcher("/portal/pages/file.jsp").forward(request, response);
+ return;
+ }
+
+ }
+ // Edit existing file details
+ else
+ {
+ AppFile lAppFile = XMLDBService.getFile(folderId,fileId);
+ if( lAppFile == null )
+ {
+ session.setAttribute("ERROR_MESSAGE", "The file you were looking for could not be found!");
+ response.sendRedirect("fileList.do?folderId="+folderId);
+ return;
+ }
+ lNewAppFile.setId( lAppFile.getId() );
+ lNewAppFile.setName( lAppFile.getName() );
+ lNewAppFile.setContentType( lAppFile.getContentType() );
+ if( XMLDBService.updateFile(folderId, lNewAppFile ) )
+ {
+ LoggerUtil.logInfo("SaveFileServlet::doPost::User '"+session.getAttribute("name")+"' uptade the access rights to the file'"+lAppFile.getName()+"' in to '"+lFolder.getName()+"' folder.");
+ session.setAttribute("SUCCESS_MESSAGE", "The file has been updated successfully!");
+ }
+ else
+ {
+ PortalUtil.setRequestAttributes(request, lAppFile, lFolder );
+ request.setAttribute("ERROR_MESSAGE", "The file has not been updated, Please try again!");
+ request.getRequestDispatcher("/portal/pages/file.jsp").forward(request, response);
+ return;
+ }
+ }
+
+ LoggerUtil.logDebug("SaveFileServlet::doPost::END");
+ response.sendRedirect("fileList.do?folderId="+folderId);
+ return;
+
+ }
+
+ /**
+ * Extract file name from Part
+ * @param part
+ * @return File Name
+ */
+ private String getFileName(Part part)
+ {
+ String filename = "";
+ if( part == null )
+ {
+ return filename;
+ }
+ String cd = part.getHeader("Content-Disposition");
+
+ if( cd == null)
+ {
+ return filename;
+ }
+
+ for(String content : cd.split(";"))
+ {
+ if(content.trim().startsWith("filename"))
+ {
+ filename = content.substring(content.indexOf("=")+1);
+ filename = filename.trim().replace("\"","");
+ int i = filename.lastIndexOf(File.separator);
+ if(i > -1)
+ {
+ filename = filename.substring(i+1);
+ }
+ break;
+ }
+ }
+ return filename;
+ }
+
+
+ /**
+ * @param jsonString Example :- "{\"usersRights\":[{\"userId\":\"2\",\"usageRights\":\"1\"},{\"userId\":\"1\",\"usageRights\":\"2\"}]}";
+ * @return Set
+ */
+ private static Set parseUserRights(String jsonString)
+ {
+ Set lsetUserRight = new LinkedHashSet();
+
+ if (jsonString == null || jsonString.trim().isEmpty() )
+ {
+ return lsetUserRight;
+ }
+
+ Object jsonElement = new JsonParser().parse( jsonString );
+ if(jsonElement == null || jsonElement instanceof JsonNull)
+ {
+ return lsetUserRight;
+ }
+ JsonObject jsonObject = (JsonObject) jsonElement;
+ Type listType = new TypeToken>() {}.getType();
+ Gson gson = new Gson();
+ lsetUserRight = gson.fromJson( jsonObject.get("usersRights"), listType);
+
+ return lsetUserRight;
+ }
+
+ private static Set convertStringArrayToSet(String[] pArray){
+ HashSet output = new HashSet();
+ if(pArray!=null)
+ {
+ for(String lString : pArray)
+ {
+ output.add(lString);
+ }
+ }
+ return output;
+ }
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/file/ViewFileLogsServlet.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/file/ViewFileLogsServlet.java
new file mode 100755
index 0000000..0f0c91e
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/file/ViewFileLogsServlet.java
@@ -0,0 +1,105 @@
+package com.seclore.sample.dms.servlet.file;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import com.seclore.sample.dms.core.AppFile;
+import com.seclore.sample.dms.core.AppFolder;
+import com.seclore.sample.dms.core.FileActivityLog;
+import com.seclore.sample.dms.core.FileOpenTimeLog;
+import com.seclore.sample.dms.util.LoggerUtil;
+import com.seclore.sample.dms.util.PortalUtil;
+import com.seclore.sample.dms.util.xml.XMLDBService;
+import com.seclore.sample.ps.db.DBConnection;
+
+/**
+ * Servlet implementation class for ViewFileLogs
+ */
+@WebServlet(name = "viewFileLogsServlet", urlPatterns = { "/viewFileLogs.do" })
+public class ViewFileLogsServlet extends HttpServlet {
+
+ private static final long serialVersionUID = 1L;
+
+
+
+ /**
+ * @see HttpServlet#HttpServlet()
+ */
+ public ViewFileLogsServlet()
+ {
+ super();
+ }
+
+ /**
+ * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ doPost(request, response);
+ }
+
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ LoggerUtil.logDebug("ViewFileLogsServlet::doPost::START");
+ HttpSession session = request.getSession();
+ String fileId = request.getParameter("fileId");
+ String folderId = request.getParameter("folderId");
+ List lliFileActivityLog = null;
+ HashMap lmapFileOpenTime = null;
+
+ if(folderId == null || folderId.trim().isEmpty())
+ {
+ session.setAttribute("ERROR_MESSAGE", "The folder for selected file could not be found!");
+ response.sendRedirect("folderList.do");
+ return;
+ }
+
+ AppFolder lFolder = XMLDBService.getFolder(folderId);
+ if( lFolder == null )
+ {
+ session.setAttribute("ERROR_MESSAGE", "The folder for selected file could not be found!");
+ response.sendRedirect("folderList.do");
+ return;
+ }
+
+ if(fileId == null || fileId.trim().isEmpty())
+ {
+ session.setAttribute("ERROR_MESSAGE", "The file you were deleting for could not be found!");
+ response.sendRedirect("fileList.do?folderId="+folderId);
+ return;
+ }
+
+
+ AppFile lFile = XMLDBService.getFile(folderId,fileId);
+ if( lFile == null )
+ {
+ session.setAttribute("ERROR_MESSAGE", "The file you were deleting for could not be found!");
+ response.sendRedirect("fileList.do?folderId="+folderId);
+ return;
+ }
+
+ //lPSFileId = DBConnection.getFileIdByExtFileId(fileId);
+
+ lliFileActivityLog = DBConnection.getFileLogsByFileId(fileId, false);
+ lmapFileOpenTime = DBConnection.getFileOpenTime(fileId,lliFileActivityLog);
+
+ request.setAttribute("opentimeactivityidmap", lmapFileOpenTime);
+ PortalUtil.setRequestAttributes(request, lliFileActivityLog);
+ PortalUtil.setRequestAttributes(request, lFile, lFolder);
+
+ LoggerUtil.logDebug("ViewFileLogsServlet::doPost::END");
+ request.getRequestDispatcher("/portal/pages/logs.jsp").forward(request, response);
+ return;
+ }
+
+
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/folder/DeleteFolderServlet.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/folder/DeleteFolderServlet.java
new file mode 100755
index 0000000..19314c2
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/folder/DeleteFolderServlet.java
@@ -0,0 +1,78 @@
+package com.seclore.sample.dms.servlet.folder;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import com.seclore.sample.dms.core.AppFolder;
+import com.seclore.sample.dms.util.LoggerUtil;
+import com.seclore.sample.dms.util.xml.XMLDBService;
+
+/**
+ * Delete selected folder
+ */
+@WebServlet(name = "deleteFolderServlet", urlPatterns = { "/deleteFolder.do" })
+public class DeleteFolderServlet extends HttpServlet {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @see HttpServlet#HttpServlet()
+ */
+ public DeleteFolderServlet()
+ {
+ super();
+ }
+
+ /**
+ * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ doPost(request, response);
+ }
+
+ /**
+ * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ LoggerUtil.logDebug("DeleteFolderServlet::doPost::START");
+ HttpSession session = request.getSession();
+ String folderId = request.getParameter("folderId");
+
+ if( folderId == null || folderId.trim().isEmpty() )
+ {
+ session.setAttribute("ERROR_MESSAGE", "The folder you were looking for could not be found!");
+ response.sendRedirect("folderList.do");
+ return;
+ }
+
+ AppFolder lFolder = XMLDBService.getFolder(folderId);
+
+ if( lFolder == null )
+ {
+ session.setAttribute("ERROR_MESSAGE", "The folder you were looking for could not be found!");
+ response.sendRedirect("folderList.do");
+ return;
+ }
+
+ if ( XMLDBService.deleteFolder( lFolder) )
+ {
+ LoggerUtil.logInfo("User '"+session.getAttribute("name")+"' deleted the folder '"+lFolder.getName()+"'");
+ session.setAttribute("SUCCESS_MESSAGE", "Folder has been deleted successfully!");
+ }
+ else
+ {
+ request.setAttribute("ERROR_MESSAGE", "Folder deletion faild, Please try again!");
+ }
+
+ LoggerUtil.logDebug("DeleteFolderServlet::doPost::END");
+ response.sendRedirect("folderList.do");
+ return;
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/folder/FolderListServlet.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/folder/FolderListServlet.java
new file mode 100755
index 0000000..334d3f7
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/folder/FolderListServlet.java
@@ -0,0 +1,55 @@
+package com.seclore.sample.dms.servlet.folder;
+
+import java.io.IOException;
+import java.util.Collection;
+
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.seclore.sample.dms.core.AppFolder;
+import com.seclore.sample.dms.util.LoggerUtil;
+import com.seclore.sample.dms.util.xml.XMLDBService;
+
+/**
+ * List all the folders
+ */
+@WebServlet(name = "folderListServlet", urlPatterns = { "/folderList.do" })
+public class FolderListServlet extends HttpServlet
+{
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @see HttpServlet#HttpServlet()
+ */
+ public FolderListServlet()
+ {
+ super();
+ }
+
+ /**
+ * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ doPost(request, response);
+ }
+
+ /**
+ * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ LoggerUtil.logDebug("FolderListServlet : doPost : start");
+
+ Collection folderList = XMLDBService.getFolderList();
+ request.setAttribute("folderList", folderList);
+
+ LoggerUtil.logDebug("FolderListServlet : doPost : end");
+ request.getRequestDispatcher("/portal/pages/folderList.jsp").forward(request, response);
+ return;
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/folder/PreCreateFolderServlet.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/folder/PreCreateFolderServlet.java
new file mode 100755
index 0000000..89e0489
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/folder/PreCreateFolderServlet.java
@@ -0,0 +1,49 @@
+package com.seclore.sample.dms.servlet.folder;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.seclore.sample.dms.core.AppFolder;
+
+/**
+ * Servlet implementation class PreCreateFolderServlet
+ */
+@WebServlet(name = "preCreateFolderServlet", urlPatterns = { "/createFolder.do" })
+public class PreCreateFolderServlet extends HttpServlet
+{
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @see HttpServlet#HttpServlet()
+ */
+ public PreCreateFolderServlet()
+ {
+ super();
+ // TODO Auto-generated constructor stub
+ }
+
+ /**
+ * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ doPost(request, response);
+ }
+
+ /**
+ * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ request.setAttribute("folder", new AppFolder());
+ request.getRequestDispatcher("/portal/pages/folder.jsp").forward(request, response);
+ return;
+
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/folder/PreEditFolderServlet.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/folder/PreEditFolderServlet.java
new file mode 100755
index 0000000..b9ff6ea
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/folder/PreEditFolderServlet.java
@@ -0,0 +1,67 @@
+package com.seclore.sample.dms.servlet.folder;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import com.seclore.sample.dms.core.AppFolder;
+import com.seclore.sample.dms.util.LoggerUtil;
+import com.seclore.sample.dms.util.xml.XMLDBService;
+
+/**
+ * Servlet implementation class PreEditFolderServlet
+ */
+@WebServlet(name = "preEditFolderServlet", urlPatterns = { "/editFolder.do" })
+public class PreEditFolderServlet extends HttpServlet {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @see HttpServlet#HttpServlet()
+ */
+ public PreEditFolderServlet() {
+ super();
+ // TODO Auto-generated constructor stub
+ }
+
+ /**
+ * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ doPost(request, response);
+ }
+
+ /**
+ * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ LoggerUtil.logDebug("PreEditFolderServlet::doPost::START");
+ HttpSession session = request.getSession();
+ String folderId = request.getParameter("folderId");
+
+ if( folderId == null || folderId.trim().isEmpty() )
+ {
+ session.setAttribute("ERROR_MESSAGE", "Please specify a valid folder ID!");
+ response.sendRedirect("folderList.do");
+ return;
+ }
+
+ AppFolder folder = XMLDBService.getFolder(folderId);
+
+ if( folder == null )
+ {
+ session.setAttribute("ERROR_MESSAGE", "The folder you were looking for could not be found!");
+ response.sendRedirect("folderList.do");
+ return;
+ }
+ request.setAttribute("folder", folder);
+ LoggerUtil.logDebug("PreEditFolderServlet::doPost::END");
+ request.getRequestDispatcher("/portal/pages/folder.jsp").forward(request, response);
+ return;
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/folder/SaveFolderServlet.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/folder/SaveFolderServlet.java
new file mode 100755
index 0000000..461cfc3
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/servlet/folder/SaveFolderServlet.java
@@ -0,0 +1,134 @@
+package com.seclore.sample.dms.servlet.folder;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import com.seclore.sample.dms.core.AppFolder;
+import com.seclore.sample.dms.util.LoggerUtil;
+import com.seclore.sample.dms.util.xml.XMLDBService;
+
+/**
+ * Servlet implementation class SaveFolderServlet
+ */
+@WebServlet(name = "saveFolderServlet", urlPatterns = { "/saveFolder.do" })
+public class SaveFolderServlet extends HttpServlet
+{
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @see HttpServlet#HttpServlet()
+ */
+ public SaveFolderServlet()
+ {
+ super();
+ }
+
+ /**
+ * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ doPost(request, response);
+ }
+
+ /**
+ * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ LoggerUtil.logDebug("SaveFolderServlet::doPost::START");
+
+ HttpSession session = request.getSession();
+
+ AppFolder lFolder = new AppFolder();
+ if ( !validateRequest( lFolder, request ) )
+ {
+ request.setAttribute("folder", lFolder);
+ request.getRequestDispatcher("/portal/pages/folder.jsp").forward(request, response);
+ return;
+ }
+
+ // Create New folder
+ if( lFolder.getId() == null || lFolder.getId().isEmpty() )
+ {
+ if ( !XMLDBService.createNewFolder(lFolder) )
+ {
+ request.setAttribute("folder", lFolder);
+ request.setAttribute("ERROR_MESSAGE", "Folder creation faild, Please try again!");
+ request.getRequestDispatcher("/portal/pages/folder.jsp").forward(request, response);
+ return;
+ }
+
+ session.setAttribute("SUCCESS_MESSAGE", "Folder has been created successfully!");
+
+ }
+ // Update existing folder
+ else
+ {
+ AppFolder existingFolder = XMLDBService.getFolder( lFolder.getId() );
+
+ if( existingFolder == null )
+ {
+ session.setAttribute("ERROR_MESSAGE", "The folder you were updating, could not be found!");
+ response.sendRedirect("folderList.do");
+ return;
+ }
+
+
+
+ if ( !XMLDBService.updateFolder( lFolder ) )
+ {
+ request.setAttribute("folder", lFolder);
+ request.setAttribute("ERROR_MESSAGE", "Folder updation faild, Please try again!");
+ request.getRequestDispatcher("/portal/pages/folder.jsp").forward(request, response);
+ return;
+ }
+ session.setAttribute("SUCCESS_MESSAGE", "Folder has been updated successfully!");
+
+ }
+
+ LoggerUtil.logDebug("SaveFolderServlet::doPost::END");
+ response.sendRedirect("folderList.do");
+ return;
+
+ }
+
+ private boolean validateRequest(AppFolder folder, HttpServletRequest request)
+ {
+ String folderName = request.getParameter("name");
+ String folderId = request.getParameter("id");
+ String irmEnabled = request.getParameter("irmEnabled");
+ Boolean lbIrmEnabled = false;
+
+ if( "true".equalsIgnoreCase(irmEnabled ) )
+ {
+ lbIrmEnabled = true;
+ }
+
+ boolean flag = true;
+ folder.setIrmEnabled(lbIrmEnabled);
+
+ if( folderName == null || folderName.trim().isEmpty() )
+ {
+ request.setAttribute("ERROR_MESSAGE", "Please provide folder name!");
+ flag = false;
+ }
+ else
+ {
+ folder.setName(folderName.trim());
+ }
+
+ // Just trim folder id if there
+ if( folderId != null && !folderId.trim().isEmpty() )
+ {
+ folder.setId( folderId.trim() );
+ }
+
+ return flag;
+ }
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/discovery/core/Discovery.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/discovery/core/Discovery.java
new file mode 100755
index 0000000..55ec87c
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/discovery/core/Discovery.java
@@ -0,0 +1,76 @@
+package com.seclore.sample.dms.so.discovery.core;
+
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
+
+/**
+ * {
+ "proof-keys": {
+ "old": {
+ "proof-key": {
+ "modulus" : "",
+ "exponent" : "",
+ "algo":"SHA256RSA"
+ }
+ },
+ "new": {
+ "proof-key": {
+ "modulus" : "",
+ "exponent" : "",
+ "algo":"SHA256RSA"
+ }
+ }
+ },
+ "versions" : [1.0,2.0],
+ "supported-features" : ["1"]
+}
+
+ *
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonAutoDetect(getterVisibility = Visibility.NONE)
+public class Discovery
+{
+ @JsonProperty("proof-keys")
+ ProofKeys mProoKeys;
+
+ @JsonProperty("versions")
+ List mlistVersions;
+
+ @JsonProperty("supported-features")
+ List mlistSupportedFeatures;
+
+ public List getVersions()
+ {
+ return mlistVersions;
+ }
+
+ public void setVersions(List pVersions)
+ {
+ mlistVersions = pVersions;
+ }
+
+ public ProofKeys getProoKeys()
+ {
+ return mProoKeys;
+ }
+
+ public void setProoKeys(ProofKeys pProoKeys)
+ {
+ mProoKeys = pProoKeys;
+ }
+
+ public List getSupportedFeatures()
+ {
+ return mlistSupportedFeatures;
+ }
+
+ public void setSupportedFeatures(List plistSupportedFeatures)
+ {
+ this.mlistSupportedFeatures = plistSupportedFeatures;
+ }
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/discovery/core/DiscoveryVersion.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/discovery/core/DiscoveryVersion.java
new file mode 100755
index 0000000..8001994
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/discovery/core/DiscoveryVersion.java
@@ -0,0 +1,22 @@
+package com.seclore.sample.dms.so.discovery.core;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Contains Supported Discovery Versions. Add new supported versions here.
+ */
+public class DiscoveryVersion
+{
+ private static List mlistSupportedDiscoveryVersions = new ArrayList();
+
+ static
+ {
+ mlistSupportedDiscoveryVersions.add("1.0");
+ }
+
+ public static List getSupportedDiscoveryVersions()
+ {
+ return mlistSupportedDiscoveryVersions;
+ }
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/discovery/core/ProofKey.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/discovery/core/ProofKey.java
new file mode 100755
index 0000000..0374466
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/discovery/core/ProofKey.java
@@ -0,0 +1,54 @@
+package com.seclore.sample.dms.so.discovery.core;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonAutoDetect(getterVisibility = Visibility.NONE)
+@JsonRootName("proof-key")
+public class ProofKey
+{
+
+ @JsonProperty("modulus")
+ private String mstrModulus;
+
+ @JsonProperty("exponent")
+ private String mstrExponent;
+
+ @JsonProperty("algo")
+ private String mstrAlgo;
+
+ public String getModulus()
+ {
+ return mstrModulus;
+ }
+
+ public void setModulus(String pModulus)
+ {
+ mstrModulus = pModulus;
+ }
+
+ public String getExponent()
+ {
+ return mstrExponent;
+ }
+
+ public void setExponent(String pExponent)
+ {
+ mstrExponent = pExponent;
+ }
+
+ public String getAlgo()
+ {
+ return mstrAlgo;
+ }
+
+ public void setAlgo(String pAlgo)
+ {
+ mstrAlgo = pAlgo;
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/discovery/core/ProofKeyWrapper.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/discovery/core/ProofKeyWrapper.java
new file mode 100755
index 0000000..ce3f219
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/discovery/core/ProofKeyWrapper.java
@@ -0,0 +1,25 @@
+package com.seclore.sample.dms.so.discovery.core;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonAutoDetect(getterVisibility = Visibility.NONE)
+public class ProofKeyWrapper
+{
+ @JsonProperty("proof-key")
+ private ProofKey mProofKey;
+
+ public ProofKey getProofKey()
+ {
+ return mProofKey;
+ }
+
+ public void setProofKey(ProofKey pProofKey)
+ {
+ mProofKey = pProofKey;
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/discovery/core/ProofKeys.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/discovery/core/ProofKeys.java
new file mode 100755
index 0000000..32578fe
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/discovery/core/ProofKeys.java
@@ -0,0 +1,38 @@
+package com.seclore.sample.dms.so.discovery.core;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonAutoDetect(getterVisibility = Visibility.NONE)
+public class ProofKeys
+{
+ @JsonProperty("old")
+ private ProofKeyWrapper mOldProofKeyWrapper;
+
+ @JsonProperty("new")
+ private ProofKeyWrapper mNewProofKeyWrapper;
+
+ public ProofKeyWrapper getOldProofKeyWrapper()
+ {
+ return mOldProofKeyWrapper;
+ }
+
+ public void setOldProofKeyWrapper(ProofKeyWrapper pOldProofKeyWrapper)
+ {
+ mOldProofKeyWrapper = pOldProofKeyWrapper;
+ }
+
+ public ProofKeyWrapper getNewProofKeyWrapper()
+ {
+ return mNewProofKeyWrapper;
+ }
+
+ public void setNewProofKeyWrapper(ProofKeyWrapper pNewProofKeyWrapper)
+ {
+ mNewProofKeyWrapper = pNewProofKeyWrapper;
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/discovery/service/DiscoveryService.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/discovery/service/DiscoveryService.java
new file mode 100755
index 0000000..740c13f
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/discovery/service/DiscoveryService.java
@@ -0,0 +1,172 @@
+package com.seclore.sample.dms.so.discovery.service;
+
+import java.math.BigInteger;
+import java.security.KeyFactory;
+import java.security.interfaces.RSAPublicKey;
+import java.security.spec.KeySpec;
+import java.security.spec.RSAPublicKeySpec;
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.seclore.sample.dms.config.SampleAppConfig;
+import com.seclore.sample.dms.constant.Constants;
+import com.seclore.sample.dms.so.discovery.core.Discovery;
+import com.seclore.sample.dms.so.discovery.core.DiscoveryVersion;
+import com.seclore.sample.dms.so.discovery.core.ProofKey;
+import com.seclore.sample.dms.so.discovery.core.ProofKeyWrapper;
+import com.seclore.sample.dms.so.discovery.core.ProofKeys;
+import com.seclore.sample.dms.so.integration.service.RestService;
+import com.seclore.sample.dms.util.CommonUtil;
+import com.seclore.sample.dms.util.LoggerUtil;
+import com.seclore.sample.exceptions.DMSSampleException;
+
+
+/**
+ * This service is responsible for performing, storing, validating and reloading
+ * discovery data from Seclore Online.
+ */
+public class DiscoveryService
+{
+ private static Discovery mDiscovery;
+
+ private static final String DISCOVERY_URL = "/seclore/discovery";
+
+ public static void initialize() throws DMSSampleException
+ {
+ LoggerUtil.logInfo("DiscoveryService::initialize() STARTS");
+
+ // Get SO URL from config
+ String lstrSOURL = SampleAppConfig.getSecloreOnlineURL();
+
+ // Populate headers
+ Map lMapOfHeaders = new HashMap();
+ lMapOfHeaders.put(Constants.X_SECLORE_REQUEST_ID, CommonUtil.generateRequestID());
+
+ // Empty Parameters
+ Map lMapOfParameters = new HashMap();
+
+ // Fire discovery request.
+ Discovery lDiscovery = RestService.getRequest(CommonUtil.removeEndSlash(lstrSOURL) + DISCOVERY_URL,
+ lMapOfHeaders, lMapOfParameters, Discovery.class);
+
+ // Validate output
+ validate(lDiscovery);
+
+ mDiscovery = lDiscovery;
+
+ LoggerUtil.logInfo("DiscoveryService::initialize() ENDS");
+ }
+
+ public static Discovery getDiscovery() throws DMSSampleException
+ {
+ if (mDiscovery == null)
+ {
+ initialize();
+ }
+ return mDiscovery;
+ }
+
+ public static Discovery reloadDiscovery() throws DMSSampleException
+ {
+ LoggerUtil.logDebug("DiscoveryService::reloadDiscovery() STARTS");
+
+ mDiscovery = null;
+ initialize();
+
+ LoggerUtil.logDebug("DiscoveryService::reloadDiscovery() ENDS");
+ return mDiscovery;
+ }
+
+ private static void validate(Discovery pDiscovery) throws DMSSampleException
+ {
+ LoggerUtil.logDebug("DiscoveryService::validate() STARTS");
+
+ if (pDiscovery == null)
+ {
+ throw new DMSSampleException("Discovery is Null/Empty");
+ }
+ validateVersion(pDiscovery.getVersions());
+ validateProofKeys(pDiscovery.getProoKeys());
+
+ LoggerUtil.logDebug("DiscoveryService::validate() ENDS");
+ }
+
+ private static void validateVersion(List plistDiscoveryVersions) throws DMSSampleException
+ {
+ if (CommonUtil.isEmptyList((plistDiscoveryVersions)))
+ {
+ throw new DMSSampleException("Version is empty in Discovery.");
+ }
+
+ // check whether supported version is present in SO.
+ // We will check whether the major version (1.x,2.x) sent by Seclore
+ // Online matches with our version.
+ for (String lVersion : plistDiscoveryVersions)
+ {
+ if (DiscoveryVersion.getSupportedDiscoveryVersions().contains(lVersion))
+ {
+ return;
+ }
+ }
+ throw new DMSSampleException("Version mismatch in Discovery.");
+
+ }
+
+ private static void validateProofKeys(ProofKeys pProofKeys) throws DMSSampleException
+ {
+ if (pProofKeys == null)
+ {
+ throw new DMSSampleException("Proof Keys is missing in Discovery");
+ }
+ validateKeyWrapper(pProofKeys.getOldProofKeyWrapper());
+ validateKeyWrapper(pProofKeys.getNewProofKeyWrapper());
+ }
+
+ private static void validateKeyWrapper(ProofKeyWrapper pProofKeyWrapper) throws DMSSampleException
+ {
+ if (pProofKeyWrapper == null)
+ {
+ throw new DMSSampleException("Proof Key wrapper is missing in Discovery.");
+ }
+
+ validateKey(pProofKeyWrapper.getProofKey());
+ }
+
+ private static void validateKey(ProofKey pProofKey) throws DMSSampleException
+ {
+ if (pProofKey == null)
+ throw new DMSSampleException("Proof Key is missing in Discovery");
+
+ if (CommonUtil.isEmptyString(pProofKey.getAlgo()))
+ throw new DMSSampleException("Algo is missing in Discovery");
+
+ if (CommonUtil.isEmptyString(pProofKey.getExponent()))
+ throw new DMSSampleException("Exponent is missing in discovery");
+
+ if (CommonUtil.isEmptyString(pProofKey.getModulus()))
+ throw new DMSSampleException("Modulus is missing in Discovery.");
+
+ try
+ {
+ // Form public using the modulus and exponent.
+ getPublicKey(pProofKey.getModulus(), pProofKey.getExponent());
+ }
+ catch (Exception lException)
+ {
+ throw new DMSSampleException("Cannot form key from modulus and exponent in Discovery.");
+ }
+ }
+
+ private static RSAPublicKey getPublicKey(String pModulus, String pExponent) throws Exception
+ {
+ BigInteger lMod = new BigInteger(1, Base64.getDecoder().decode(pModulus));
+ BigInteger lExp = new BigInteger(1, Base64.getDecoder().decode(pExponent));
+ KeyFactory lFactory = KeyFactory.getInstance("RSA");
+ KeySpec lKeySpec = new RSAPublicKeySpec(lMod, lExp);
+
+ return (RSAPublicKey) lFactory.generatePublic(lKeySpec);
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/core/CheckFileResponse.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/core/CheckFileResponse.java
new file mode 100755
index 0000000..53b9cf1
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/core/CheckFileResponse.java
@@ -0,0 +1,129 @@
+package com.seclore.sample.dms.so.integration.core;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonAutoDetect(getterVisibility = Visibility.NONE,isGetterVisibility = Visibility.NONE)
+public class CheckFileResponse
+{
+
+ @JsonProperty("file-name")
+ private String mstrFileName;
+
+ @JsonProperty("file-hash")
+ private String mstrFileHash;
+
+ @JsonProperty("file-hash-algo")
+ private String mstrFileHashAlgo;
+
+ @JsonProperty("file-size")
+ private String mstrFileSize;
+
+ @JsonProperty("login-hint")
+ private String mstrLoginHint;
+
+ @JsonProperty("login-method")
+ private String mstrLoginMethod;
+
+ @JsonProperty("iframe-domain")
+ private String mstrIframeDomain;
+
+ @JsonProperty("allowed-action")
+ private String[] mAllowedAction;
+
+ @JsonProperty("options")
+ private Options mOptions;
+
+ public String getFileName()
+ {
+ return mstrFileName;
+ }
+
+ public void setFileName(String pFileName)
+ {
+ mstrFileName = pFileName;
+ }
+
+ public String getFileHash()
+ {
+ return mstrFileHash;
+ }
+
+ public void setFileHash(String pFileHash)
+ {
+ mstrFileHash = pFileHash;
+ }
+
+ public String getFileHashAlgo()
+ {
+ return mstrFileHashAlgo;
+ }
+
+ public void setFileHashAlgo(String pFileHashAlgo)
+ {
+ mstrFileHashAlgo = pFileHashAlgo;
+ }
+
+ public String getFileSize()
+ {
+ return mstrFileSize;
+ }
+
+ public void setFileSize(String pFileSize)
+ {
+ mstrFileSize = pFileSize;
+ }
+
+ public String getLoginHint()
+ {
+ return mstrLoginHint;
+ }
+
+ public void setLoginHint(String pLoginHint)
+ {
+ mstrLoginHint = pLoginHint;
+ }
+
+ public String getLoginMethod()
+ {
+ return mstrLoginMethod;
+ }
+
+ public void setLoginMethod(String pLoginMethod)
+ {
+ mstrLoginMethod = pLoginMethod;
+ }
+
+ public String getIframeDomain()
+ {
+ return mstrIframeDomain;
+ }
+
+ public void setIframeDomain(String pIframeDomain)
+ {
+ mstrIframeDomain = pIframeDomain;
+ }
+
+ public String[] getAllowedAction()
+ {
+ return mAllowedAction;
+ }
+
+ public void setAllowedAction(String[] pAllowedAction)
+ {
+ mAllowedAction = pAllowedAction;
+ }
+
+ public Options getOptions()
+ {
+ return mOptions;
+ }
+
+ public void setOptions(Options pOptions)
+ {
+ mOptions = pOptions;
+ }
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/core/CloseEventRequest.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/core/CloseEventRequest.java
new file mode 100755
index 0000000..94130c3
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/core/CloseEventRequest.java
@@ -0,0 +1,24 @@
+package com.seclore.sample.dms.so.integration.core;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonAutoDetect(getterVisibility = Visibility.NONE)
+public class CloseEventRequest
+{
+ @JsonProperty("mode")
+ private String mstrMode;
+
+ public String getMode()
+ {
+ return mstrMode;
+ }
+
+ public void setMode(String pMode)
+ {
+ mstrMode = pMode;
+ }
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/core/OpenEventRequest.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/core/OpenEventRequest.java
new file mode 100755
index 0000000..cc5ebc0
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/core/OpenEventRequest.java
@@ -0,0 +1,25 @@
+package com.seclore.sample.dms.so.integration.core;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonAutoDetect(getterVisibility = Visibility.NONE)
+public class OpenEventRequest
+{
+ @JsonProperty("actual-allowed-action")
+ private String mstrActualAllowedAction;
+
+ public String getActualAllowedAction()
+ {
+ return mstrActualAllowedAction;
+ }
+
+ public void setActualAllowedAction(String actualAllowedAction)
+ {
+ mstrActualAllowedAction = actualAllowedAction;
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/core/OpenRequestDetails.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/core/OpenRequestDetails.java
new file mode 100755
index 0000000..bf3eaf3
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/core/OpenRequestDetails.java
@@ -0,0 +1,94 @@
+package com.seclore.sample.dms.so.integration.core;
+
+/**
+ * This class will store the paramters requeired to open the 'open' endpoint of
+ * Seclore Online.
+ *
+ */
+public class OpenRequestDetails
+{
+ private String mstrAccessToken;
+
+ private String mstrAccessTokenTTL;
+
+ private String mstrFileToken;
+
+ private String mstrServiceURL;
+
+ private String mstrAgentless;
+
+ private String mstrPolicyServerURL;
+
+ private String mstrSessionContext;
+
+ public String getAccessToken()
+ {
+ return mstrAccessToken;
+ }
+
+ public void setAccessToken(String pAccessToken)
+ {
+ this.mstrAccessToken = pAccessToken;
+ }
+
+ public String getAccessTokenTTL()
+ {
+ return mstrAccessTokenTTL;
+ }
+
+ public void setAccessTokenTTL(String pAccessTokenTTL)
+ {
+ this.mstrAccessTokenTTL = pAccessTokenTTL;
+ }
+
+ public String getFileToken()
+ {
+ return mstrFileToken;
+ }
+
+ public void setFileToken(String pFileToken)
+ {
+ this.mstrFileToken = pFileToken;
+ }
+
+ public String getServiceURL()
+ {
+ return mstrServiceURL;
+ }
+
+ public void setServiceURL(String pServiceURL)
+ {
+ this.mstrServiceURL = pServiceURL;
+ }
+
+ public String getAgentless()
+ {
+ return mstrAgentless;
+ }
+
+ public void setAgentless(String pAgentless)
+ {
+ this.mstrAgentless = pAgentless;
+ }
+
+ public String getPolicyServerURL()
+ {
+ return mstrPolicyServerURL;
+ }
+
+ public void setPolicyServerURL(String pPolicyServerURL)
+ {
+ this.mstrPolicyServerURL = pPolicyServerURL;
+ }
+
+ public String getSessionContext()
+ {
+ return mstrSessionContext;
+ }
+
+ public void setSessionContext(String pSessionContext)
+ {
+ this.mstrSessionContext = pSessionContext;
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/core/Options.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/core/Options.java
new file mode 100755
index 0000000..f341a48
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/core/Options.java
@@ -0,0 +1,97 @@
+package com.seclore.sample.dms.so.integration.core;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+/**
+ * "options": {
+ "allow-edit": boolean,
+ "allow-download": boolean,
+ "allow-unprotected-download": int,
+ "email-copy": boolean,
+ "allow-saveback": boolean
+ }
+ *
+ *
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonAutoDetect(getterVisibility = Visibility.NONE,isGetterVisibility = Visibility.NONE)
+public class Options
+{
+ @JsonProperty("allow-edit")
+ private boolean mAllowEdit;
+
+ @JsonProperty("allow-download")
+ private boolean mAllowDownload;
+
+ @JsonProperty("allow-unprotected-download")
+ private int mAllowUnprotectedDownload;
+
+ @JsonProperty("email-copy")
+ private boolean mEmailCopy;
+
+ @JsonProperty("allow-saveback")
+ private boolean mAllowSaveback;
+
+ @JsonIgnore
+ public boolean isAllowEdit()
+ {
+ return mAllowEdit;
+ }
+
+ public void setAllowEdit(boolean pAllowEdit)
+ {
+ this.mAllowEdit = pAllowEdit;
+ }
+
+ @JsonIgnore
+ public boolean isAllowDownload()
+ {
+ return mAllowDownload;
+ }
+
+ public void setAllowDownload(boolean pAllowDownload)
+ {
+ this.mAllowDownload = pAllowDownload;
+ }
+
+ @JsonIgnore
+ public int isAllowUnprotectedCopy()
+ {
+ return mAllowUnprotectedDownload;
+ }
+
+ public void setAllowUnprotectedCopy(int pAllowUnprotectedCopy)
+ {
+ this.mAllowUnprotectedDownload = pAllowUnprotectedCopy;
+ }
+
+ @JsonIgnore
+ public boolean isEmailCopy()
+ {
+ return mEmailCopy;
+ }
+
+ public void setEmailCopy(boolean pEmailCopy)
+ {
+ this.mEmailCopy = pEmailCopy;
+ }
+
+ @JsonIgnore
+ public boolean isAllowSaveback()
+ {
+ return mAllowSaveback;
+ }
+
+ /**
+ * @param pAllowSaveback
+ */
+ public void setAllowSaveback(boolean pAllowSaveback)
+ {
+ this.mAllowSaveback = pAllowSaveback;
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/core/PreFlightResponse.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/core/PreFlightResponse.java
new file mode 100755
index 0000000..d06f77d
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/core/PreFlightResponse.java
@@ -0,0 +1,32 @@
+package com.seclore.sample.dms.so.integration.core;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+@JsonIgnoreProperties(
+{ "allowedActions" })
+public class PreFlightResponse
+{
+ @JsonProperty("allowed-action")
+ private List mAllowedAction;
+
+ public PreFlightResponse()
+ {
+ super();
+ this.mAllowedAction = new ArrayList();
+ }
+
+ public List getAllowedAction()
+ {
+ return mAllowedAction;
+ }
+
+ public void setAllowedAction(List pAllowedAction)
+ {
+ this.mAllowedAction = pAllowedAction;
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/core/RenewAccessTokenResponse.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/core/RenewAccessTokenResponse.java
new file mode 100755
index 0000000..25944a4
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/core/RenewAccessTokenResponse.java
@@ -0,0 +1,41 @@
+package com.seclore.sample.dms.so.integration.core;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonAutoDetect(getterVisibility = Visibility.NONE)
+public class RenewAccessTokenResponse
+{
+ @JsonProperty("access-token")
+ private String mstrAccessToken;
+
+ /**
+ * Returns the expiry time as UTC milliseconds from the epoch.
+ */
+ @JsonProperty("access-token-ttl")
+ private long mExpiry;
+
+ public String getAccessToken()
+ {
+ return mstrAccessToken;
+ }
+
+ public void setAccessToken(String pAccessToken)
+ {
+ this.mstrAccessToken = pAccessToken;
+ }
+
+ public long getExpiry()
+ {
+ return mExpiry;
+ }
+
+ public void setExpiry(long pExpiry)
+ {
+ this.mExpiry = pExpiry;
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/core/SessionContext.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/core/SessionContext.java
new file mode 100755
index 0000000..5072271
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/core/SessionContext.java
@@ -0,0 +1,43 @@
+package com.seclore.sample.dms.so.integration.core;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
+
+/**
+ * Session Context class holds the Session state by storing the session id.
+ *
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonAutoDetect(getterVisibility = Visibility.NONE)
+public class SessionContext
+{
+
+ @JsonProperty("session-id")
+ private String mstrSessionID;
+
+ @JsonProperty("user-name")
+ private String mstrUserName;
+
+ public String getUserName()
+ {
+ return mstrUserName;
+ }
+
+ public void setUserName(String pUserName)
+ {
+ this.mstrUserName = pUserName;
+ }
+
+ public String getSessionID()
+ {
+ return mstrSessionID;
+ }
+
+ public void setSessionID(String pSessionID)
+ {
+ this.mstrSessionID = pSessionID;
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/core/SessionState.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/core/SessionState.java
new file mode 100755
index 0000000..b47a148
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/core/SessionState.java
@@ -0,0 +1,58 @@
+package com.seclore.sample.dms.so.integration.core;
+
+/**
+ * This POJO class represents the session data for the app.
+ *
+ */
+public class SessionState
+{
+ public static final String VIEW = "view";
+ public static final String EDIT = "edit";
+ /**
+ * File Token for which the Session Context is created.
+ */
+ private String mstrFileToken;
+
+ /**
+ * Unique Session ID identifier.
+ */
+ private String mstrSessionID;
+
+ /**
+ * This is the mode in which the file is allowed to open.
+ * Values:
+ * view : if file can be opened in view mode.
+ * edit : if file can be opened in edit mode
+ */
+ private String mMode;
+
+ public String getMode()
+ {
+ return mMode;
+ }
+
+ public void setMode(String pMode)
+ {
+ mMode = pMode;
+ }
+
+ public String getFileToken()
+ {
+ return mstrFileToken;
+ }
+
+ public void setFileToken(String pfileToken)
+ {
+ mstrFileToken = pfileToken;
+ }
+
+ public String getSessionID()
+ {
+ return mstrSessionID;
+ }
+
+ public void setSessionID(String pSessionID)
+ {
+ mstrSessionID = pSessionID;
+ }
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/repository/SessionRepository.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/repository/SessionRepository.java
new file mode 100755
index 0000000..31b81bb
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/repository/SessionRepository.java
@@ -0,0 +1,92 @@
+package com.seclore.sample.dms.so.integration.repository;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.seclore.sample.dms.so.integration.core.SessionState;
+import com.seclore.sample.dms.util.CommonUtil;
+import com.seclore.sample.dms.util.LoggerUtil;
+import com.seclore.sample.exceptions.DMSSampleException;
+
+/**
+ * Repository to store Session Context States for File Tokens. This will be used
+ * to retrieve Session data when APIs are called.
+ *
+ */
+public class SessionRepository
+{
+ private static Map mMapOfSessionIDAndState = new HashMap();
+
+ /**
+ * Adds the Session State in the repository.
+ *
+ * @param pSessionState
+ * @throws DMSSampleException
+ */
+ public static void addSessionState(SessionState pSessionState) throws DMSSampleException
+ {
+ if (pSessionState == null || pSessionState.getSessionID() == null || pSessionState.getFileToken() == null)
+ {
+ throw new DMSSampleException("Cannot store SessionSTate since some value is missing/empty.");
+ }
+
+ mMapOfSessionIDAndState.put(pSessionState.getSessionID(), pSessionState);
+ }
+
+ /**
+ * Returns the Session State stored against the Session ID provided.
+ *
+ * @param pSessionID
+ * @return
+ */
+ public static SessionState getFileData(String pSessionID)
+ {
+ return mMapOfSessionIDAndState.getOrDefault(pSessionID, null);
+ }
+
+ /**
+ * Deletes the Session data from repository.
+ *
+ * @param pSessionID
+ * @return
+ */
+ public static boolean deleteState(String pSessionID)
+ {
+ LoggerUtil.logInfo("SessionRepository::deleteState() for SessionID " + pSessionID);
+
+ SessionState lSessionState = mMapOfSessionIDAndState.remove(pSessionID);
+
+ return lSessionState == null ? false:true;
+ }
+
+ /**
+ * Check whether the pSessionID exists in Session Repository.
+ *
+ * @param pFileTOken
+ * @return
+ */
+ public static boolean sessionIDExists(String pSessionID)
+ {
+ if (pSessionID == null) return false;
+
+ return mMapOfSessionIDAndState.containsKey(pSessionID);
+ }
+
+ public static void checkOutFile(String pSessionID) throws DMSSampleException
+ {
+ if (CommonUtil.isEmptyString(pSessionID) == true)
+ {
+ throw new DMSSampleException("Session ID not found in SessionRepository");
+ }
+
+ SessionState lSessionState = mMapOfSessionIDAndState.get(pSessionID);
+
+ if (lSessionState == null)
+ {
+ throw new DMSSampleException("Session State not found");
+ }
+
+ lSessionState.setMode(SessionState.EDIT);
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/service/FileOpenService.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/service/FileOpenService.java
new file mode 100755
index 0000000..f18677e
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/service/FileOpenService.java
@@ -0,0 +1,168 @@
+package com.seclore.sample.dms.so.integration.service;
+
+import com.seclore.sample.dms.config.SampleAppConfig;
+import com.seclore.sample.dms.core.AppFile;
+import com.seclore.sample.dms.core.AppFolder;
+import com.seclore.sample.dms.security.service.SecurityService;
+import com.seclore.sample.dms.so.integration.core.OpenRequestDetails;
+import com.seclore.sample.dms.so.integration.core.SessionContext;
+import com.seclore.sample.dms.so.integration.core.SessionState;
+import com.seclore.sample.dms.so.integration.repository.SessionRepository;
+import com.seclore.sample.dms.util.CommonUtil;
+import com.seclore.sample.dms.util.LoggerUtil;
+import com.seclore.sample.dms.util.xml.XMLDBService;
+import com.seclore.sample.exceptions.DMSSampleException;
+
+/**
+ * Perform preflight and generate Open Parameters for view, edit and CFAD mode.
+ */
+public class FileOpenService
+{
+ /**
+ * Pass agentless as 1 if the file is to be opened in Seclore Online
+ */
+ private static final String OPEN_ONLINE = "1";
+
+ /**
+ * Pass agentless as 0 if the file is to be opened in Native App(Eg: Seclore Dekstop Client).
+ */
+ private static final String OPEN_NATIVELY = "0";
+
+ public static OpenRequestDetails openViewMode(String pFileToken,
+ AppFile pAppFile,
+ AppFolder pAppFolder,
+ String pUserName)
+ throws DMSSampleException
+ {
+ LoggerUtil.logInfo("FileOpenService::openViewMode() STARTS for token : " + pFileToken);
+
+ // perform preflight for the file to be opened.
+ PreflightService.preflight(SampleAppConfig.getSecloreOnlineURL(),
+ pAppFile.getName(),
+ CommonUtil.getFileSize(XMLDBService.getPhysicalFileLocation(pAppFolder, pAppFile)),
+ OPEN_ONLINE,
+ SampleAppConfig.getPSURL());
+
+ // Create session context and Add Session State to Repository.
+ String lstrSessionID = CommonUtil.generateSessionContext();
+
+ SessionState lSessionState = new SessionState();
+ lSessionState.setFileToken(pFileToken);
+ lSessionState.setSessionID(lstrSessionID);
+ lSessionState.setMode(SessionState.VIEW);
+
+ SessionRepository.addSessionState(lSessionState);
+
+ // Create Session Context for Open RequestDetails
+ SessionContext lSessionContext = new SessionContext();
+ lSessionContext.setSessionID(lstrSessionID);
+ lSessionContext.setUserName(pUserName);
+
+ LoggerUtil.logInfo("FileOpenService::openViewMode() ENDS for token : " + pFileToken);
+
+ return generateOpenRequestDetails(pFileToken, lSessionContext, OPEN_ONLINE,pUserName);
+ }
+
+ /**
+ * Performs preflight on Seclore Online and prepares to open file in edit mode.
+ * SessionContext is needed in case the file is switching to edit mode from view.
+ * Pass null if simply opening in edit mode.
+ * @param pFileToken
+ * @param pSessionContext
+ * @return
+ * @throws DMSSampleException
+ */
+ public static OpenRequestDetails openEditMode(String pFileToken,
+ AppFile pAppFile,
+ AppFolder pAppFolder,
+ SessionContext pSessionContext,
+ String pUserName) throws DMSSampleException
+ {
+ LoggerUtil.logInfo("FileOpenService::openEditMode() STARTS for token : " + pFileToken);
+
+ // perform preflight for the file to be opened.
+ String lPreflightResponse = PreflightService.preflight(SampleAppConfig.getSecloreOnlineURL(),
+ pAppFile.getName(),
+ CommonUtil.getFileSize(XMLDBService.getPhysicalFileLocation(pAppFolder, pAppFile)),
+ OPEN_ONLINE,
+ SampleAppConfig.getPSURL());
+
+ if (lPreflightResponse.equalsIgnoreCase("edit") == false)
+ {
+ LoggerUtil.logInfo("FileOpenService::openEditMode() STARTS switching to view mode: " + pFileToken);
+ return openViewMode(pFileToken,pAppFile,pAppFolder,pUserName);
+ }
+
+ if (pSessionContext == null)
+ {
+ // Create session context and Add Session State to Repository.
+ String lstrSessionID = CommonUtil.generateSessionContext();
+
+ SessionState lSessionState = new SessionState();
+ lSessionState.setFileToken(pFileToken);
+ lSessionState.setSessionID(lstrSessionID);
+
+ SessionRepository.addSessionState(lSessionState);
+
+ IntegrationAPIService.initEdit(pFileToken, lstrSessionID);
+
+ pSessionContext = new SessionContext();
+ pSessionContext.setSessionID(lstrSessionID);
+ pSessionContext.setUserName(pUserName);
+ }
+
+ LoggerUtil.logInfo("FileOpenService::openEditMode() ENDS for token : " + pFileToken);
+ return generateOpenRequestDetails(pFileToken, pSessionContext, OPEN_ONLINE,pUserName);
+ }
+
+ public static OpenRequestDetails openCFAD(String pFileToken,
+ AppFile pAppFile,AppFolder pAppFolder,String pUserName) throws DMSSampleException
+ {
+ LoggerUtil.logInfo("FileOpenService::openCFAD() STARTS for token : " + pFileToken);
+
+ // perform preflight for the file to be opened.
+ PreflightService.preflight(SampleAppConfig.getSecloreOnlineURL(),
+ pAppFile.getName(),
+ CommonUtil.getFileSize(XMLDBService.getPhysicalFileLocation(pAppFolder, pAppFile)),
+ OPEN_NATIVELY,
+ SampleAppConfig.getPSURL());
+
+ // Create session context and Add Session State to Repository.
+ String lstrSessionID = CommonUtil.generateSessionContext();
+
+ SessionState lSessionState = new SessionState();
+ lSessionState.setFileToken(pFileToken);
+ lSessionState.setSessionID(lstrSessionID);
+ lSessionState.setMode(SessionState.VIEW);
+
+ SessionRepository.addSessionState(lSessionState);
+
+ // Create Session Context for Open Request Details.
+ SessionContext lSessionContext = new SessionContext();
+ lSessionContext.setSessionID(lstrSessionID);
+ lSessionContext.setUserName(pUserName);
+
+ LoggerUtil.logInfo("FileOpenService::openCFAD() ENDS for token : " + pFileToken);
+ return generateOpenRequestDetails(pFileToken, lSessionContext, OPEN_NATIVELY,pUserName);
+ }
+
+ private static OpenRequestDetails generateOpenRequestDetails(String pFileToken,
+ SessionContext pSessionContext, String pAgentless,String pUserName) throws DMSSampleException
+ {
+ OpenRequestDetails lOpenRequestDetails = new OpenRequestDetails();
+ lOpenRequestDetails.setAccessToken(SecurityService.generateAccessToken(pFileToken,pUserName));
+
+ String lstrATTL = SampleAppConfig.getATTTL();
+ long lExpiryTme = System.currentTimeMillis() + Long.parseLong(lstrATTL);
+
+ lOpenRequestDetails.setAccessTokenTTL(Long.toString(lExpiryTme));
+ lOpenRequestDetails.setFileToken(pFileToken);
+ lOpenRequestDetails.setPolicyServerURL(SampleAppConfig.getPSURL());
+ lOpenRequestDetails.setServiceURL(SampleAppConfig.getEnterpriseAppURL());
+ lOpenRequestDetails.setAgentless(pAgentless);
+
+ lOpenRequestDetails.setSessionContext(CommonUtil.base64Encode(CommonUtil.getJSONStringFromObject(pSessionContext, null)));
+
+ return lOpenRequestDetails;
+ }
+}
\ No newline at end of file
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/service/IntegrationAPIService.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/service/IntegrationAPIService.java
new file mode 100755
index 0000000..b3c5e13
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/service/IntegrationAPIService.java
@@ -0,0 +1,383 @@
+package com.seclore.sample.dms.so.integration.service;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
+import java.text.ParseException;
+import java.util.Date;
+
+import javax.servlet.http.HttpServletResponse;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import com.nimbusds.jose.JOSEException;
+import com.seclore.fs.helper.exception.FSHelperException;
+import com.seclore.sample.dms.config.SampleAppConfig;
+import com.seclore.sample.dms.constant.Constants;
+import com.seclore.sample.dms.core.AppFile;
+import com.seclore.sample.dms.core.AppFolder;
+import com.seclore.sample.dms.core.FileHtmlWrapInfo;
+import com.seclore.sample.dms.security.service.SecurityService;
+import com.seclore.sample.dms.so.integration.core.CheckFileResponse;
+import com.seclore.sample.dms.so.integration.core.Options;
+import com.seclore.sample.dms.so.integration.core.RenewAccessTokenResponse;
+import com.seclore.sample.dms.so.integration.core.SessionContext;
+import com.seclore.sample.dms.so.integration.core.SessionState;
+import com.seclore.sample.dms.so.integration.repository.SessionRepository;
+import com.seclore.sample.dms.util.CommonUtil;
+import com.seclore.sample.dms.util.LoggerUtil;
+import com.seclore.sample.dms.util.ParserUtil;
+import com.seclore.sample.dms.util.SecloreProtectUtil;
+import com.seclore.sample.dms.util.xml.XMLDBService;
+import com.seclore.sample.exceptions.AppFileNotFoundException;
+import com.seclore.sample.exceptions.AppFolderNotFoundException;
+import com.seclore.sample.exceptions.DMSSampleException;
+import com.seclore.sample.exceptions.FileDetailsNotFoundException;
+
+/**
+ * This Service will provide the API response details.
+ *
+ */
+public class IntegrationAPIService
+{
+
+ private static final String HTML = ".html";
+
+ public static CheckFileResponse checkFile(SessionContext pSessionContext, String pFileToken)
+ throws DMSSampleException
+ {
+ LoggerUtil.logDebug("IntegrationAPIService::checkFile() STARTS for token : " + pFileToken);
+
+ // Validation
+ if (pSessionContext == null || pFileToken == null)
+ {
+ LoggerUtil.logError("Validation failed in checkFile.");
+ throw new DMSSampleException("Validation failed in checkFile.");
+ }
+
+ AppFile lAppFile = XMLDBService.getAppFileFromFileToken(pFileToken);
+ AppFolder lAppFolder = XMLDBService.getAppFolderFromFileToken(pFileToken);
+
+ if (lAppFile == null)
+ {
+ throw new AppFileNotFoundException("AppFile not found for file token");
+ }
+ if (lAppFolder == null)
+ {
+ throw new AppFolderNotFoundException("AppFolder not found for file token");
+ }
+
+ // Populate CheckFileResponse.
+
+ //Populate file related data.
+ CheckFileResponse lCheckFileResponse = new CheckFileResponse();
+ lCheckFileResponse.setFileName( lAppFile.getName()+HTML );
+ lCheckFileResponse.setFileHash(
+ CommonUtil.getFileHash(XMLDBService.getPhysicalFileLocation(lAppFolder, lAppFile)));
+ lCheckFileResponse.setFileHashAlgo(Constants.FILE_HASH_ALGO);
+ lCheckFileResponse.setFileSize(
+ CommonUtil.getFileSize(XMLDBService.getPhysicalFileLocation(lAppFolder, lAppFile)));
+
+
+ // Populate Options from AppConfig
+ Options lOptions = new Options();
+ lOptions.setAllowDownload(SampleAppConfig.isAllowDownload());
+ lOptions.setAllowUnprotectedCopy(SampleAppConfig.isAllowUnprotect() ? 1 : 0);
+ lOptions.setAllowSaveback(SampleAppConfig.isAllowSaveback());
+ lOptions.setEmailCopy(SampleAppConfig.isEmailCopy());
+ lOptions.setAllowDownload(SampleAppConfig.isAllowDownload());
+ lOptions.setAllowEdit(SampleAppConfig.isAllowEdit());
+ lCheckFileResponse.setOptions(lOptions);
+
+ lCheckFileResponse.setAllowedAction(getAllowedAction(pSessionContext));
+
+ LoggerUtil.logDebug("IntegrationAPIService::checkFile() ENDS for token : " + pFileToken
+ + ", Allowed action is " + lCheckFileResponse.getAllowedAction()[0]);
+ return lCheckFileResponse;
+ }
+
+ public static void getFile(HttpServletResponse pResponse, OutputStream pOutputStream, String pFileToken)
+ throws DMSSampleException
+ {
+ LoggerUtil.logDebug("IntegrationAPIService::getFile() STARTS for token : " + pFileToken);
+
+ //Validation
+ if (pFileToken == null)
+ {
+ throw new FileDetailsNotFoundException("Validation failed in getFile.");
+ }
+
+ AppFile lAppFile = XMLDBService.getAppFileFromFileToken(pFileToken);
+ AppFolder lAppFolder = XMLDBService.getAppFolderFromFileToken(pFileToken);
+
+ if (lAppFile == null)
+ {
+ throw new AppFileNotFoundException("AppFile not found for file token");
+ }
+ if (lAppFolder == null)
+ {
+ throw new AppFolderNotFoundException("AppFolder not found for file token");
+ }
+
+ //Set Response Header file names.
+ pResponse.setHeader(Constants.CONTENT_DISPOSITION,
+ CommonUtil.getContentDispositionHeader(lAppFile.getName()+HTML));
+ pResponse.setHeader(Constants.X_SECLORE_FILENAME, lAppFile.getName()+HTML);
+
+ try
+ {
+ InputStream lProtectedFileInputStream = protectFile(lAppFile,lAppFolder);
+ CommonUtil.writeFileToOutputStream(lProtectedFileInputStream, pOutputStream);
+ }
+ catch (IOException e)
+ {
+ LoggerUtil.logError(e.getMessage());
+ throw new DMSSampleException(e.getMessage(), e);
+ }
+
+ LoggerUtil.logDebug("IntegrationAPIService::getFile() ENDS for token : " + pFileToken);
+ }
+
+ public static void putFile(String pFileToken,String pUserName,InputStream pInputStream) throws DMSSampleException
+ {
+ LoggerUtil.logDebug("IntegrationAPIService::putFile() STARTS for token : " + pFileToken);
+
+ //Validation
+ if (pFileToken == null)
+ {
+ throw new FileDetailsNotFoundException("Validation failed in putFile.");
+ }
+
+ AppFile lAppFile = XMLDBService.getAppFileFromFileToken(pFileToken);
+ AppFolder lAppFolder = XMLDBService.getAppFolderFromFileToken(pFileToken);
+
+ if (lAppFile == null)
+ {
+ throw new AppFileNotFoundException("AppFile not found for file token");
+ }
+ if (lAppFolder == null)
+ {
+ throw new AppFolderNotFoundException("AppFolder not found for file token");
+ }
+
+ //Temporary location to write the file.
+ String lstrTempDownloadPath = SecloreProtectUtil.TEMP_FOLDER_PATH + File.separator
+ + CommonUtil.addTimeStampToFileName(lAppFile.getName()) +HTML;
+
+ try
+ {
+
+ //Write file to temp path.
+ CommonUtil.writeInputStreamToFile(pInputStream, lstrTempDownloadPath);
+
+ //Unwrap to a new path
+ String lProtectedFilePath = SecloreProtectUtil.unwrapFile(lstrTempDownloadPath);
+
+ //Delete Wrapped file
+ SecloreProtectUtil.deleteFile(lstrTempDownloadPath);
+
+ //Unprotect file
+ SecloreProtectUtil.unprotectFile(lProtectedFilePath, lAppFile.getName());
+
+ //Copy unprotected file to original path.
+ String lstrOriginalFilePath = XMLDBService.getPhysicalFileLocation(lAppFolder, lAppFile);
+ SecloreProtectUtil.copyAndReplaceFile(lProtectedFilePath, lstrOriginalFilePath);
+
+ ///Delete temporary unprotected file.
+ SecloreProtectUtil.deleteFile(lProtectedFilePath);
+
+ updateMinorFileVersion(lAppFile,lAppFolder,pUserName,(new Date()).getTime());
+ }
+ catch (IOException | FSHelperException e)
+ {
+ LoggerUtil.logError(e.getMessage(),e);
+ throw new DMSSampleException(e.getMessage(), e);
+ }
+ finally
+ {
+ try
+ {
+ pInputStream.close();
+ }
+ catch (IOException e)
+ {
+ LoggerUtil.logError("Unable to close pInputstream in IntegrationApiService::putFile()");
+ }
+ }
+ LoggerUtil.logDebug("IntegrationAPIService::putFile() for token : " + pFileToken);
+ }
+
+ public static void initEdit(String pFileToken, String pSessionID) throws DMSSampleException
+ {
+ LoggerUtil.logDebug("IntegrationAPIService::initEdit() called");
+
+ //Validation in Session Repository.
+ if (SessionRepository.sessionIDExists(pSessionID) == false)
+ throw new FileDetailsNotFoundException("Session State not found in Session Repository.");
+
+ //Change mode to edit.
+ SessionRepository.checkOutFile(pSessionID);
+ }
+
+ public static void edit()
+ {
+ LoggerUtil.logDebug("IntegrationAPIService::edit() called");
+ // Do Nothing.
+ }
+
+ public static RenewAccessTokenResponse renewAccesToken(String pAccessToken)
+ throws DMSSampleException, UnsupportedEncodingException, JOSEException, ParseException
+ {
+ return SecurityService.getRenewedToken(pAccessToken);
+ }
+
+ public static void openEvent(String pFileToken)
+ {
+ // DO Nothing.
+ LoggerUtil.logInfo("File Open event received for token : " + pFileToken);
+ }
+
+ public static void closeEvent(String pFileToken, String pSessionID,String pUserName) throws DMSSampleException
+ {
+ LoggerUtil.logInfo("File Close event received for token : " + pFileToken);
+
+ //Validation
+ if (pFileToken == null)
+ {
+ throw new FileDetailsNotFoundException("Validation failed in closeFile.");
+ }
+
+ AppFile lAppFile = XMLDBService.getAppFileFromFileToken(pFileToken);
+ AppFolder lAppFolder = XMLDBService.getAppFolderFromFileToken(pFileToken);
+
+ if (lAppFile == null)
+ {
+ throw new AppFileNotFoundException("AppFile not found for file token");
+ }
+ if (lAppFolder == null)
+ {
+ throw new AppFolderNotFoundException("AppFolder not found for file token");
+ }
+
+ SessionRepository.deleteState(pSessionID);
+
+ }
+
+ /**
+ * Return Edit only if the mode is edit.
+ *
+ * @param pSessionContext
+ * @return
+ */
+ private static String[] getAllowedAction(SessionContext pSessionContext)
+ {
+ SessionState lSessionState = SessionRepository.getFileData(pSessionContext.getSessionID());
+
+ if (lSessionState.getMode().equals(SessionState.EDIT))
+ {
+ return new String[]
+ { "Edit" };
+ }
+ else
+ {
+ return new String[]
+ { "View" };
+ }
+ }
+
+ private static InputStream protectFile(AppFile pAppFile,AppFolder pAppFolder) throws DMSSampleException
+ {
+
+ LoggerUtil.logDebug("protectFile() Starts");
+ createTempFolder( SecloreProtectUtil.TEMP_FOLDER_PATH );
+ String tempFileName = CommonUtil.addTimeStampToFileName(pAppFile.getName());
+ String tempFilePath = SecloreProtectUtil.TEMP_FOLDER_PATH + File.separator +tempFileName;
+ String originalFilePath = XMLDBService.getPhysicalFileLocation(pAppFolder, pAppFile);
+
+ try
+ {
+ SecloreProtectUtil.copyAndReplaceFile(originalFilePath, tempFilePath);
+ }
+ catch (IOException e)
+ {
+ LoggerUtil.logError("IOException in protectFile() ", e);
+ throw new DMSSampleException(e.getMessage(), e);
+ }
+
+ LoggerUtil.logDebug(" protectFile()Temp copy created.");
+
+ Gson lGson = new Gson();
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty( Constants.KEY_HF_EXTN_REF_ID, pAppFolder.getId() );
+ String lstrExtnRefData = lGson.toJson(jsonObject);
+ String lstrExtnHFid = SampleAppConfig.getExternalHotFolderId();
+
+ // === Construct Protection details XML
+ String protectionDetailsXML = "" +
+ ""+
+ //""+XMLUtil.escapeForXML(pAppFolder.getId()) +" "+
+ //""+XMLUtil.escapeForXML(pAppFolder.getName())+" "+
+ ""+ParserUtil.escapeForXML( lstrExtnHFid ) +" "+
+ ""+ParserUtil.escapeForXML("")+" "+
+ ""+ParserUtil.escapeForXML("")+" " +
+ ""+ParserUtil.escapeForXML("")+" " +
+ " " +
+ " "+
+
+ "" +
+ ""+
+ ""+ParserUtil.escapeForXML(pAppFile.getId())+" "+
+ ""+ParserUtil.escapeForXML(pAppFile.getName())+" "+
+ ""+ParserUtil.escapeForXML( lstrExtnRefData )+" " +
+ ""+ParserUtil.escapeForXML("")+" " +
+ " " +
+ " ";
+ LoggerUtil.logDebug("protectFile() ProtectionDetailsXml : " + protectionDetailsXML);
+
+ // ****** Protect TEMP File and Get protected content ****** //
+ String displayFileName = pAppFile.getName();
+ FileHtmlWrapInfo lFileHtmlWrapInfo = new FileHtmlWrapInfo();
+ lFileHtmlWrapInfo.setHtmlWrapEnable(true);
+ InputStream fileInputStream;
+ try
+ {
+ fileInputStream = SecloreProtectUtil.protectFile( tempFilePath, displayFileName,
+ protectionDetailsXML, lFileHtmlWrapInfo );
+ }
+ catch (Exception e)
+ {
+ LoggerUtil.logError(e.getMessage(), e);
+ throw new DMSSampleException(e.getMessage(), e);
+ }
+
+ // ****** Protection END ******** //
+
+ return fileInputStream;
+ }
+
+ /**
+ * Create Temporary Folder if not exist
+ * @param pTempFolderPath
+ */
+ private static void createTempFolder(String pTempFolderPath)
+ {
+ File tempFolder = new File( pTempFolderPath );
+ if( !tempFolder.exists() )
+ {
+ tempFolder.mkdirs();
+ }
+ }
+
+ private static void updateMinorFileVersion(AppFile pAppFile,
+ AppFolder pAppFolder, String pLMByUser, long pLMTime)
+ {
+ int liMinorVersion = pAppFile.getMinorVersion();
+ liMinorVersion++;
+ pAppFile.setMinorVersion(liMinorVersion);
+ pAppFile.setLmTime(pLMTime);
+ pAppFile.setLmByUser(pLMByUser);
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/service/PreflightService.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/service/PreflightService.java
new file mode 100755
index 0000000..3774302
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/service/PreflightService.java
@@ -0,0 +1,44 @@
+package com.seclore.sample.dms.so.integration.service;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.seclore.sample.dms.constant.Constants;
+import com.seclore.sample.dms.so.integration.core.PreFlightResponse;
+import com.seclore.sample.dms.util.LoggerUtil;
+import com.seclore.sample.exceptions.DMSSampleException;
+
+/**
+ * This Service will fire the pre-flight request to Seclore Online.
+ *
+ */
+public class PreflightService
+{
+ private static final String PREFLIGHT_ENDPOINT = "/seclore/1.0/files/preflight";
+
+ private static final String PREFLIGHT_PARAM_AGENTLESS = "agentless";
+ private static final String PREFLIGHT_PARAM_SIZE = "size";
+ private static final String PREFLIGHT_PARAM_FILE_NAME = "name";
+
+ public static String preflight(String pSOURL, String pFileName, String pFileSize,
+ String pAgentless, String pPSURL) throws DMSSampleException
+ {
+ LoggerUtil.logInfo("PreFlightService::preflight() STARTS for name: "+pFileName+" and Size : "+pFileSize);
+
+ Map lMapOfParameters = new HashMap();
+ lMapOfParameters.put(PREFLIGHT_PARAM_FILE_NAME, pFileName);
+ lMapOfParameters.put(PREFLIGHT_PARAM_SIZE, pFileSize);
+ lMapOfParameters.put(PREFLIGHT_PARAM_AGENTLESS, pAgentless);
+
+ Map lMapOfHeaders = new HashMap();
+ lMapOfHeaders.put(Constants.X_SECLORE_POLICYSERVERURL, pPSURL);
+
+ PreFlightResponse lPreFlightResponse = RestService.getRequest(pSOURL + PREFLIGHT_ENDPOINT,
+ lMapOfHeaders, lMapOfParameters, PreFlightResponse.class);
+
+ LoggerUtil.logInfo("PreFlightService::preflight() ENDS Allowed-action: " +
+ lPreFlightResponse.getAllowedAction().get(0));
+
+ return lPreFlightResponse.getAllowedAction().get(0);
+ }
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/service/RestService.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/service/RestService.java
new file mode 100755
index 0000000..5670565
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/integration/service/RestService.java
@@ -0,0 +1,144 @@
+package com.seclore.sample.dms.so.integration.service;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.net.URLDecoder;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.net.http.HttpResponse.BodyHandlers;
+import java.nio.charset.StandardCharsets;
+import java.util.Map;
+
+import org.apache.http.client.utils.URIBuilder;
+
+import com.seclore.sample.dms.constant.Constants;
+import com.seclore.sample.dms.util.CommonUtil;
+import com.seclore.sample.dms.util.LoggerUtil;
+import com.seclore.sample.exceptions.DMSSampleException;
+
+
+/**
+ * This Service makes REST calls from DMS Sample APP.
+ *
+ */
+public class RestService
+{
+
+ /**
+ * Performs a GET request on provided URI.
+ *
+ * @param pURL
+ * - Complete URL where the GET request will be fired.
+ * @param pMapOfHeaders
+ * - All request headers.
+ * @param pMapOfParameters
+ * - Parameters(If any) needed to pass in GET request.
+ * @param pClass
+ * - JSON Response class
+ * @return
+ * @throws DMSSampleException
+ * if the request returns 500 or the request itself fails.
+ */
+ public static T getRequest(String pURL, Map pMapOfHeaders,
+ Map pMapOfParameters, Class pClass) throws DMSSampleException
+ {
+ LoggerUtil.logInfo("RestService::getRequest() STARTS - Response class: " + pClass.getName());
+ try
+ {
+ // Create URI from URL provided.
+ URIBuilder lBuilder = new URIBuilder(pURL);
+
+ // Add Parameters, if any
+ addParameters(pMapOfParameters, lBuilder);
+
+ // Create HTTP request
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(lBuilder.build())
+ .headers(getHeaders(pMapOfHeaders)).build();
+
+ // Create HTTP client to send request.
+ HttpClient client = HttpClient.newHttpClient();
+
+ // Get the response from the fired HTTP request.
+ HttpResponse response = client.send(request, BodyHandlers.ofString());
+
+ if (response.statusCode() == 200)
+ {
+ // Return the proper response object.
+ LoggerUtil.logInfo("RestService::getRequest() ENDS");
+ return CommonUtil.getObjectFromJSONString(pClass, response.body(), null);
+ }
+ else
+ {
+ LoggerUtil.logError("RestService::getRequest() status :" + response.statusCode());
+
+ // Error case.
+ String lstrErrorCode = response.headers()
+ .firstValue(Constants.X_SECLORE_ERRORCODE.toLowerCase()).get();
+
+ String lstrErrorMsg = response.headers()
+ .firstValue(Constants.X_SECLORE_ERRORMSG.toLowerCase()).get();
+
+ // Extract Error URL from Response if provided.
+ String lstrErrorURL = response.headers()
+ .firstValue(Constants.X_SECLORE_ERRORURL.toLowerCase()).get();
+
+ if (CommonUtil.isEmptyString(lstrErrorURL) == false)
+ {
+
+ LoggerUtil.logInfo("RestService::getRequest() ENDS");
+
+
+ String lstrFinalErrorCode = CommonUtil.isEmptyString(lstrErrorCode) ? "-1000" : lstrErrorCode;
+ String lstrDecodedCode = URLDecoder.decode(lstrFinalErrorCode, StandardCharsets.UTF_8);
+
+ String lstrDecodedMsg = URLDecoder.decode(lstrErrorMsg, StandardCharsets.UTF_8);
+
+ String lstrFinalErrorURL = CommonUtil.isEmptyString(lstrErrorURL) ? null : lstrErrorURL;
+ String lstrDecodedURL = URLDecoder.decode(lstrFinalErrorURL, StandardCharsets.UTF_8);
+
+
+ throw new DMSSampleException(lstrDecodedCode+ " " +lstrDecodedMsg,
+ lstrDecodedURL);
+ }
+
+ LoggerUtil.logInfo("RestService::getRequest() ENDS");
+ throw new DMSSampleException(lstrErrorCode + " " + lstrErrorMsg);
+ }
+ }
+ catch (URISyntaxException e1)
+ {
+ LoggerUtil.logError("Incorrect URL Syntax in GET call : " + pURL, e1);
+ throw new DMSSampleException(e1.getMessage(), e1);
+ }
+ catch (IOException | InterruptedException e)
+ {
+ LoggerUtil.logError("Error While make the GET call for URL : " + pURL, e);
+ throw new DMSSampleException(e.getMessage(), e);
+ }
+ }
+
+ private static String[] getHeaders(Map pMapOfHeaders)
+ {
+ String[] larrHeaders = new String[pMapOfHeaders.size() * 2];
+
+ int lIndex = 0;
+
+ for (String Key : pMapOfHeaders.keySet())
+ {
+ larrHeaders[lIndex] = Key;
+ larrHeaders[++lIndex] = pMapOfHeaders.get(Key);
+ }
+
+ return larrHeaders;
+ }
+
+ private static void addParameters(Map pMapOfParameters, URIBuilder pBuilder)
+ {
+ for (String Key : pMapOfParameters.keySet())
+ {
+ pBuilder.setParameter(Key, pMapOfParameters.get(Key));
+ }
+ }
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/servlet/RenewAccessTokenController.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/servlet/RenewAccessTokenController.java
new file mode 100755
index 0000000..57b6e3a
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/servlet/RenewAccessTokenController.java
@@ -0,0 +1,68 @@
+package com.seclore.sample.dms.so.servlet;
+
+import java.io.UnsupportedEncodingException;
+import java.text.ParseException;
+
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.ext.Provider;
+
+import com.nimbusds.jose.JOSEException;
+import com.seclore.sample.dms.constant.Constants;
+import com.seclore.sample.dms.so.integration.core.RenewAccessTokenResponse;
+import com.seclore.sample.dms.so.integration.service.IntegrationAPIService;
+import com.seclore.sample.dms.util.CommonUtil;
+import com.seclore.sample.dms.util.LoggerUtil;
+import com.seclore.sample.exceptions.DMSSampleException;
+
+/**
+ * This controller exposes the API to renew the expired access token.
+ *
+ */
+@Path("/seclore/1.0/renewToken")
+@Provider
+public class RenewAccessTokenController
+{
+ @POST
+ @Produces(MediaType.APPLICATION_JSON)
+ public Response renewAccessToken(
+ @HeaderParam(Constants.AUTHORIZATION) String pAuthorizationheader,
+ @HeaderParam(Constants.X_SECLORE_REQUEST_ID) String pRequestID)
+ {
+ LoggerUtil.logInfo("RenewAccessTokenController::openVirenewAccessTokenewMode() STARTS for RequestID : "
+ + pRequestID);
+
+ String lstrAccessToken = CommonUtil.getAuthorizationToken(pAuthorizationheader);
+
+ try
+ {
+ RenewAccessTokenResponse lRenewAccessTokenResponse =
+ IntegrationAPIService.renewAccesToken(lstrAccessToken);
+
+ LoggerUtil.logInfo("RenewAccessTokenController::openVirenewAccessTokenewMode() ENDS for RequestID : "
+ + pRequestID);
+
+ //Build response
+ return Response.status(Response.Status.OK)
+ .type(MediaType.APPLICATION_JSON)
+ .header(Constants.X_SECLORE_REQUEST_ID, pRequestID)
+ .entity(CommonUtil.getJSONStringFromObject(lRenewAccessTokenResponse, null)).build();
+
+ }
+ catch (DMSSampleException | UnsupportedEncodingException
+ | JOSEException | ParseException e)
+ {
+ LoggerUtil.logError(e.getMessage(), e);
+
+ return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
+ .header(Constants.X_SECLORE_REQUEST_ID, pRequestID)
+ .header(Constants.X_SECLORE_ERRORCODE, "-1000")
+ .header(Constants.X_SECLORE_ERRORMSG, e.getMessage()).build();
+ }
+
+ }
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/servlet/SecloreOnlineAPIEndpoints.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/servlet/SecloreOnlineAPIEndpoints.java
new file mode 100755
index 0000000..6181ba6
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/so/servlet/SecloreOnlineAPIEndpoints.java
@@ -0,0 +1,469 @@
+package com.seclore.sample.dms.so.servlet;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.text.ParseException;
+import java.util.Map;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import javax.ws.rs.FormParam;
+import javax.ws.rs.GET;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.ext.Provider;
+
+import com.nimbusds.jose.JOSEException;
+import com.seclore.sample.dms.config.SampleAppConfig;
+import com.seclore.sample.dms.constant.Constants;
+import com.seclore.sample.dms.core.AppFile;
+import com.seclore.sample.dms.core.AppFolder;
+import com.seclore.sample.dms.security.service.SecurityService;
+import com.seclore.sample.dms.so.integration.core.CheckFileResponse;
+import com.seclore.sample.dms.so.integration.core.OpenRequestDetails;
+import com.seclore.sample.dms.so.integration.core.SessionContext;
+import com.seclore.sample.dms.so.integration.service.FileOpenService;
+import com.seclore.sample.dms.so.integration.service.IntegrationAPIService;
+import com.seclore.sample.dms.util.CommonUtil;
+import com.seclore.sample.dms.util.LoggerUtil;
+import com.seclore.sample.dms.util.xml.XMLDBService;
+import com.seclore.sample.exceptions.AppFileNotFoundException;
+import com.seclore.sample.exceptions.AppFolderNotFoundException;
+import com.seclore.sample.exceptions.DMSSampleException;
+import com.seclore.sample.exceptions.FileDetailsNotFoundException;
+
+/**
+ * This controller exposes the APIs to Seclore Online for File-related services.
+ *
+ */
+@Path("/seclore/1.0/files")
+@Provider
+public class SecloreOnlineAPIEndpoints
+{
+
+ private static final String SECLORE_ONLINE_OPEN_ENDPOINT = "/seclore/1.0/files/open";
+
+ @GET
+ @Path("{file-token}")
+ @Produces(MediaType.APPLICATION_JSON)
+ public Response checkFile(
+ @HeaderParam(Constants.AUTHORIZATION) String pAuthorizationheader,
+ @HeaderParam(Constants.X_SECLORE_SESSIONCONTEXT) String pSessionContext,
+ @HeaderParam(Constants.X_SECLORE_REQUEST_ID) String pRequestID,
+ @PathParam("file-token") String pFileToken)
+ {
+ LoggerUtil.logDebug("RestAPIController::checkFile() STARTS for RequestID : " + pRequestID);
+ try
+ {
+
+ if (pSessionContext == null)
+ {
+ throw new DMSSampleException("Session Context Header is missing");
+ }
+
+ // Get Session Context Object from JSON
+ SessionContext lSessionContext = CommonUtil.getObjectFromJSONString(SessionContext.class,
+ CommonUtil.base64Decode(pSessionContext), null);
+
+ // Fetch Check File Response from Service.
+ CheckFileResponse lCheckFileResponse = IntegrationAPIService.checkFile(lSessionContext, pFileToken);
+
+ LoggerUtil.logDebug("RestAPIController::checkFile() ENDS for RequestID : " + pRequestID);
+
+ return Response.status(Response.Status.OK)
+ .type(MediaType.APPLICATION_JSON)
+ .header(Constants.X_SECLORE_REQUEST_ID, pRequestID)
+ .header(Constants.X_SECLORE_SESSIONCONTEXT, pSessionContext)
+ .entity(CommonUtil.getJSONStringFromObject(lCheckFileResponse, null)).build();
+ }
+ catch (DMSSampleException e)
+ {
+ LoggerUtil.logError(e.getMessage(), e);
+
+ Response.Status lStatus = Response.Status.INTERNAL_SERVER_ERROR;
+ if (e instanceof FileDetailsNotFoundException)
+ {
+ lStatus = Response.Status.NOT_FOUND;
+ }
+
+ return Response.status(lStatus)
+ .header(Constants.X_SECLORE_REQUEST_ID, pRequestID)
+ .header(Constants.X_SECLORE_ERRORCODE, "-1000")
+ .header(Constants.X_SECLORE_ERRORMSG, e.getMessage())
+ .header(Constants.X_SECLORE_SESSIONCONTEXT, pSessionContext).build();
+ }
+ }
+
+ @GET
+ @Path("{file-token}/contents")
+ public void getFile(@HeaderParam("Authorization") String pAuthorizationheader,
+ @HeaderParam("X-Seclore-SessionContext") String pSessionContext,
+ @HeaderParam("X-Request-Id") String pRequestID,
+ @HeaderParam("X-Seclore-FileHash") String pFileHash,
+ @HeaderParam("X-Seclore-FileName") String pFileName,
+ @PathParam("file-token") String pFileToken,
+ @Context HttpServletResponse pResponse)
+ {
+ LoggerUtil.logDebug("RestAPIController::getFile() STARTS for RequestID : " + pRequestID);
+ try
+ {
+ try
+ {
+ //Set response Headers before writing the file in response.
+ pResponse.setHeader(Constants.X_SECLORE_SESSIONCONTEXT, pSessionContext);
+ pResponse.setHeader(Constants.X_SECLORE_REQUEST_ID, pRequestID);
+
+ //Write the getFile response in outputstream.
+ IntegrationAPIService.getFile(pResponse, pResponse.getOutputStream(), pFileToken);
+ }
+ catch (IOException e)
+ {
+ LoggerUtil.logError(e.getMessage());
+ throw new DMSSampleException(e.getMessage(), e);
+ }
+
+ LoggerUtil.logDebug("RestAPIController::getFile() ENDS for RequestID : " + pRequestID);
+ return;
+ }
+ catch (DMSSampleException e)
+ {
+ LoggerUtil.logError(e.getMessage(), (Throwable) e);
+
+ int lStatus = HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
+ if (e instanceof FileDetailsNotFoundException)
+ lStatus = HttpServletResponse.SC_NOT_FOUND;
+
+ pResponse.setStatus(lStatus);
+ pResponse.setHeader(Constants.X_SECLORE_REQUEST_ID, pRequestID);
+ pResponse.setHeader(Constants.X_SECLORE_ERRORCODE, "-1000");
+ pResponse.setHeader(Constants.X_SECLORE_ERRORMSG, e.getMessage());
+ pResponse.setHeader(Constants.X_SECLORE_SESSIONCONTEXT, pSessionContext);
+ }
+ }
+
+ @GET
+ @Path("{file-token}/download")
+ public void downloadFile(@HeaderParam("Authorization") String pAuthorizationheader,
+ @HeaderParam("X-Seclore-SessionContext") String pSessionContext,
+ @HeaderParam("X-Request-Id") String pRequestID,
+ @HeaderParam("X-Seclore-FileHash") String pFileHash,
+ @HeaderParam("X-Seclore-FileName") String pFileName,
+ @PathParam("file-token") String pFileToken,
+ @Context HttpServletResponse pResponse)
+ {
+ LoggerUtil.logDebug("RestAPIController::downloadFile() STARTS for RequestID : " + pRequestID);
+ try
+ {
+ try
+ {
+ //Set response Headers before writing the file in response.
+ pResponse.setHeader(Constants.X_SECLORE_SESSIONCONTEXT, pSessionContext);
+ pResponse.setHeader(Constants.X_SECLORE_REQUEST_ID, pRequestID);
+
+ //Write the getFile response in outputstream.
+ IntegrationAPIService.getFile(pResponse, pResponse.getOutputStream(), pFileToken);
+ }
+ catch (IOException e)
+ {
+ LoggerUtil.logError(e.getMessage());
+ throw new DMSSampleException(e.getMessage(), e);
+ }
+
+ LoggerUtil.logDebug("RestAPIController::downloadFile() ENDS for RequestID : " + pRequestID);
+ return;
+ }
+ catch (DMSSampleException e)
+ {
+ LoggerUtil.logError(e.getMessage(), (Throwable) e);
+
+ int lStatus = HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
+ if (e instanceof FileDetailsNotFoundException)
+ lStatus = HttpServletResponse.SC_NOT_FOUND;
+
+ pResponse.setStatus(lStatus);
+ pResponse.setHeader(Constants.X_SECLORE_REQUEST_ID, pRequestID);
+ pResponse.setHeader(Constants.X_SECLORE_ERRORCODE, "-1000");
+ pResponse.setHeader(Constants.X_SECLORE_ERRORMSG, e.getMessage());
+ pResponse.setHeader(Constants.X_SECLORE_SESSIONCONTEXT, pSessionContext);
+ }
+ }
+
+ @POST
+ @Path("{file-token}/contents")
+ @Produces(MediaType.APPLICATION_OCTET_STREAM)
+ public Response putFile(
+ @HeaderParam(Constants.X_SECLORE_REQUEST_ID) String pRequestID,
+ @HeaderParam("Authorization") String pAuthorizationheader,
+ @PathParam("file-token") String pFileToken,
+ @HeaderParam("X-Seclore-SessionContext") String pSessionContext,
+ @Context HttpServletRequest pRequest,
+ @Context HttpServletResponse pResponse)
+ {
+ LoggerUtil.logDebug("RestAPIController::putFile() for RequestID : " + pRequestID);
+
+ try
+ {
+ String lstrUserName = getUserNameFromAccessToken(pAuthorizationheader);
+
+ IntegrationAPIService.putFile(pFileToken,lstrUserName,pRequest.getInputStream());
+ }
+ catch (DMSSampleException | JOSEException | ParseException | IOException e)
+ {
+ LoggerUtil.logError(e.getMessage(), (Throwable) e);
+
+ Response.Status lStatus = Response.Status.INTERNAL_SERVER_ERROR;
+ if (e instanceof FileDetailsNotFoundException)
+ {
+ lStatus = Response.Status.NOT_FOUND;
+ }
+
+ return Response.status(lStatus)
+ .header(Constants.X_SECLORE_REQUEST_ID, pRequestID)
+ .header(Constants.X_SECLORE_ERRORCODE, "-1000")
+ .header(Constants.X_SECLORE_ERRORMSG, e.getMessage())
+ .header(Constants.X_SECLORE_SESSIONCONTEXT, pSessionContext).build();
+
+ }
+
+ return Response.status(Response.Status.OK)
+ .header(Constants.X_SECLORE_REQUEST_ID, pRequestID)
+ .header(Constants.X_SECLORE_SESSIONCONTEXT, pSessionContext).build();
+ }
+
+
+
+ @POST
+ @Path("{file-token}/initedit")
+ public Response initEdit(
+ @HeaderParam(Constants.AUTHORIZATION) String pAuthorizationheader,
+ @HeaderParam(Constants.X_SECLORE_SESSIONCONTEXT) String pSessionContext,
+ @HeaderParam(Constants.X_SECLORE_REQUEST_ID) String pRequestID,
+ @PathParam("file-token") String pFileToken)
+ {
+ LoggerUtil.logDebug("RestAPIController::initEdit() STARTS for RequestID : " + pRequestID);
+ try
+ {
+ // Get Session Context Object from JSON
+ SessionContext lSessionContext = CommonUtil.getObjectFromJSONString(SessionContext.class,
+ CommonUtil.base64Decode(pSessionContext), null);
+
+ //Validation
+ if (lSessionContext == null)
+ throw new DMSSampleException("Invalid Session Context in initEdit()");
+
+ IntegrationAPIService.initEdit(pFileToken, lSessionContext.getSessionID());
+
+ LoggerUtil.logDebug("RestAPIController::initEdit() ENDS for RequestID : " + pRequestID);
+ return Response.status(Response.Status.OK)
+ .header(Constants.X_SECLORE_REQUEST_ID, pRequestID)
+ .header(Constants.X_SECLORE_SESSIONCONTEXT, pSessionContext).build();
+ }
+ catch (DMSSampleException e)
+ {
+ Response.Status lStatus = Response.Status.INTERNAL_SERVER_ERROR;
+ if (e instanceof FileDetailsNotFoundException)
+ {
+ lStatus = Response.Status.NOT_FOUND;
+ }
+
+ return Response.status(lStatus)
+ .header(Constants.X_SECLORE_REQUEST_ID, pRequestID)
+ .header(Constants.X_SECLORE_ERRORCODE, "-1000")
+ .header(Constants.X_SECLORE_ERRORMSG, e.getMessage())
+ .header(Constants.X_SECLORE_SESSIONCONTEXT, pSessionContext).build();
+ }
+ }
+
+ @POST
+ @Path("{file-token}/edit")
+ public void edit(
+ @Context HttpServletRequest pRequest,
+ @Context HttpServletResponse pResponse,
+ @FormParam("accessToken") String pAccessToken,
+ @FormParam("fileToken") String pFileToken,
+ @FormParam("sessionContext") String pSessionContext,
+ @FormParam("requestID") String pRequestID) throws ServletException, IOException
+ {
+ LoggerUtil.logDebug("RestAPIController::edit() STARTS for RequestID : " + pRequestID);
+ try
+ {
+ //Get Session Context.
+ SessionContext lSessionContext = CommonUtil.getObjectFromJSONString(SessionContext.class,
+ CommonUtil.base64Decode(pSessionContext), null);
+
+ String lstrUserName = getUserNameFromSessionContext(lSessionContext);
+ AppFile lAppFile = XMLDBService.getAppFileFromFileToken(pFileToken);
+ AppFolder lAppFolder = XMLDBService.getAppFolderFromFileToken(pFileToken);
+
+ if (lAppFile == null)
+ {
+ throw new AppFileNotFoundException("AppFile not found for file token");
+ }
+ if (lAppFolder == null)
+ {
+ throw new AppFolderNotFoundException("AppFolder not found for file token");
+ }
+
+ //Perform preflight for edit mode and generate OpenRequestDetails.
+ OpenRequestDetails lOpenRequestDetails =
+ FileOpenService.openEditMode(pFileToken,lAppFile,lAppFolder, lSessionContext,lstrUserName);
+
+ //Populate attributes reuqired for file opening.
+ pRequest.setAttribute("accessToken", lOpenRequestDetails.getAccessToken());
+ pRequest.setAttribute("accessTokenExpiry", lOpenRequestDetails.getAccessTokenTTL());
+ pRequest.setAttribute("fileToken", lOpenRequestDetails.getFileToken());
+ pRequest.setAttribute("serviceUrl", lOpenRequestDetails.getServiceURL());
+ pRequest.setAttribute("agentless", lOpenRequestDetails.getAgentless());
+ pRequest.setAttribute("policyServerURL", lOpenRequestDetails.getPolicyServerURL());
+ pRequest.setAttribute("sessionContext", lOpenRequestDetails.getSessionContext());
+ pRequest.setAttribute("redirectUrl", getOpenEndpoint());
+
+ pRequest.getRequestDispatcher("/portal/pages/open.jsp").forward(pRequest, pResponse);
+ }
+ catch (DMSSampleException e)
+ {
+ LoggerUtil.logError("Error in edit(). " + e.getMessage(), e);
+
+ // In case of Error, check whether an Error URL is mentioned in
+ // exception. If present, display that.
+ if (e.getRedirectURL() != null)
+ {
+ try
+ {
+ pRequest.setAttribute("accessToken", pAccessToken);
+ pRequest.setAttribute("fileToken", pFileToken);
+ pRequest.setAttribute("serviceUrl",
+ SampleAppConfig.getEnterpriseAppURL());
+
+ LoggerUtil.logDebug("RestAPIController::edit() ENDS for RequestID : " + pRequestID);
+
+ pRequest.getRequestDispatcher("/portal/pages/SOError.jsp").forward(pRequest, pResponse);
+ }
+ catch (ServletException | IOException e1)
+ {
+ LoggerUtil.logError("Exception when forwarding the request to error page in edit().", e1);
+ }
+ }
+
+ HttpSession lsession = pRequest.getSession();
+ lsession.setAttribute("ERROR_MESSAGE", e.getMessage());
+
+ pRequest.getRequestDispatcher("folderList.do").forward(pRequest, pResponse);
+
+ }
+ catch (JOSEException |ParseException e)
+ {
+
+ try
+ {
+ pRequest.setAttribute("accessToken", pAccessToken);
+ pRequest.setAttribute("fileToken", pFileToken);
+ pRequest.setAttribute("serviceUrl",
+ SampleAppConfig.getEnterpriseAppURL());
+
+ LoggerUtil.logDebug("RestAPIController::edit() ENDS for RequestID : " + pRequestID);
+
+ pRequest.getRequestDispatcher("/portal/pages/SOError.jsp").forward(pRequest, pResponse);
+ }
+ catch (ServletException | IOException e1)
+ {
+ LoggerUtil.logError("Exception when forwarding the request to error page in edit().", e1);
+ }
+ }
+ }
+
+ @POST
+ @Path("{file-token}/events/open")
+ public Response openEvent(
+ @HeaderParam(Constants.X_SECLORE_SESSIONCONTEXT) String pSessionContext,
+ @HeaderParam(Constants.X_SECLORE_REQUEST_ID) String pRequestID,
+ @PathParam("file-token") String pFileToken)
+ {
+ LoggerUtil.logDebug("RestAPIController::openEvent() STARTS for RequestID : " + pRequestID);
+ IntegrationAPIService.openEvent(pFileToken);
+
+ LoggerUtil.logDebug("RestAPIController::openEvent() ENDS for RequestID : " + pRequestID);
+
+ return Response.status(Response.Status.OK)
+ .header(Constants.X_SECLORE_REQUEST_ID, pRequestID)
+ .header(Constants.X_SECLORE_SESSIONCONTEXT, pSessionContext).build();
+
+ }
+
+ @POST
+ @Path("{file-token}/events/close")
+ public Response closeEvent(
+ @HeaderParam(Constants.AUTHORIZATION) String pAuthorizationheader,
+ @HeaderParam(Constants.X_SECLORE_SESSIONCONTEXT) String pSessionContext,
+ @HeaderParam(Constants.X_SECLORE_REQUEST_ID) String pRequestID,
+ @PathParam("file-token") String pFileToken)
+ {
+ LoggerUtil.logDebug("RestAPIController::closeEvent() STARTS for RequestID : " + pRequestID);
+
+ try
+ {
+ String lstrUserName = getUserNameFromAccessToken(pAuthorizationheader);
+
+ SessionContext lSessionContext = CommonUtil.getObjectFromJSONString(SessionContext.class,
+ CommonUtil.base64Decode(pSessionContext), null);
+
+ IntegrationAPIService.closeEvent(pFileToken, lSessionContext.getSessionID(),lstrUserName);
+ }
+ catch (DMSSampleException | UnsupportedEncodingException | JOSEException | ParseException e)
+ {
+ // Do nothing.
+ }
+
+ LoggerUtil.logDebug("RestAPIController::closeEvent() ENDS for RequestID : " + pRequestID);
+ return Response.status(Response.Status.OK)
+ .header(Constants.X_SECLORE_REQUEST_ID, pRequestID)
+ .header(Constants.X_SECLORE_SESSIONCONTEXT, pSessionContext).build();
+ }
+
+ private String getOpenEndpoint() throws DMSSampleException
+ {
+ return SampleAppConfig.getSecloreOnlineURL() + SECLORE_ONLINE_OPEN_ENDPOINT;
+ }
+
+ private String getUserNameFromSessionContext(SessionContext pSessionContext)
+ throws DMSSampleException, UnsupportedEncodingException, JOSEException, ParseException
+ {
+ if(CommonUtil.isEmptyString(pSessionContext.getUserName()))
+ {
+ return SampleAppConfig.getDummyUserName();
+ }
+ return pSessionContext.getUserName();
+ }
+
+ private String getUserNameFromAccessToken(String pAuthorizationheader)
+ throws DMSSampleException, UnsupportedEncodingException, JOSEException, ParseException
+ {
+ //Extract Auth Token.
+ String lstrBearerToken = CommonUtil.getAuthorizationToken(pAuthorizationheader);
+
+ // Get User Name from header.
+ Map lClaimSet = SecurityService.validateToken(lstrBearerToken);
+ String lstrUserName = getUserName(lClaimSet);
+ return lstrUserName;
+ }
+
+ private String getUserName(Map lClaims)
+ {
+ String lUserName = (String) lClaims.get("USER_NAME");
+
+ if(CommonUtil.isEmptyString(lUserName) == true )
+ {
+ return SampleAppConfig.getDummyUserName();
+ }
+ return lUserName;
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/user/servlet/AddAppUserServlet.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/user/servlet/AddAppUserServlet.java
new file mode 100755
index 0000000..3c01e6e
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/user/servlet/AddAppUserServlet.java
@@ -0,0 +1,68 @@
+package com.seclore.sample.dms.user.servlet;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import com.seclore.sample.dms.util.xml.XMLDBService;
+
+/**
+ * Servlet implementation class AddAppUserServlet
+ */
+@WebServlet("/addUser.do")
+public class AddAppUserServlet extends HttpServlet
+{
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @see HttpServlet#HttpServlet()
+ */
+ public AddAppUserServlet()
+ {
+ super();
+ }
+
+ /**
+ * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ doPost(request, response);
+ }
+
+ /**
+ * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ HttpSession session = request.getSession();
+
+ String userId = request.getParameter("userId");
+ String name = request.getParameter("name");
+
+ if( XMLDBService.getAppUserById(userId) != null )
+ {
+ session.setAttribute("ERROR_MESSAGE", "Another user already exist in the system with the same ext id/emailid.");
+ response.sendRedirect("user.do");
+ return;
+ }
+
+ if(XMLDBService.addNewAppUser(userId, name))
+ {
+ session.setAttribute("SUCCESS_MESSAGE", "New user '"+userId+"' have been added successfully.");
+ }
+ else
+ {
+ session.setAttribute("ERROR_MESSAGE", "New user '"+userId+"' have not been added.");
+ }
+
+ response.sendRedirect("user.do");
+ return;
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/user/servlet/AppUserServlet.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/user/servlet/AppUserServlet.java
new file mode 100755
index 0000000..cc7191c
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/user/servlet/AppUserServlet.java
@@ -0,0 +1,50 @@
+package com.seclore.sample.dms.user.servlet;
+
+import java.io.IOException;
+import java.util.Map;
+
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.seclore.sample.dms.core.master.User;
+import com.seclore.sample.dms.util.xml.XMLDBService;
+
+/**
+ * Servlet implementation class AppUserServlet
+ */
+@WebServlet("/user.do")
+public class AppUserServlet extends HttpServlet
+{
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @see HttpServlet#HttpServlet()
+ */
+ public AppUserServlet()
+ {
+ super();
+ }
+
+ /**
+ * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ doPost(request, response);
+ }
+
+ /**
+ * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ Map lmapUsers = XMLDBService.getAppUsers();
+
+ request.setAttribute("users", lmapUsers.values());
+ request.getRequestDispatcher("/portal/pages/appUser.jsp").forward(request, response);
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/user/servlet/DeleteAppUserServlet.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/user/servlet/DeleteAppUserServlet.java
new file mode 100755
index 0000000..00fa7fb
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/user/servlet/DeleteAppUserServlet.java
@@ -0,0 +1,67 @@
+package com.seclore.sample.dms.user.servlet;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import com.seclore.sample.dms.util.xml.XMLDBService;
+
+/**
+ * Servlet implementation class DeleteAppUserServlet
+ */
+@WebServlet("/deleteUser.do")
+public class DeleteAppUserServlet extends HttpServlet
+{
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @see HttpServlet#HttpServlet()
+ */
+ public DeleteAppUserServlet()
+ {
+ super();
+ }
+
+ /**
+ * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ doPost(request, response);
+ }
+
+ /**
+ * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ HttpSession session = request.getSession();
+
+ String userId = request.getParameter("userId");
+
+ if( XMLDBService.getAppUserById(userId) == null )
+ {
+ session.setAttribute("ERROR_MESSAGE", "User '"+userId+"' could not be found!");
+ response.sendRedirect("user.do");
+ return;
+ }
+
+ if( XMLDBService.deleteAppUser(userId) )
+ {
+ session.setAttribute("SUCCESS_MESSAGE", "User '"+userId+"' have been deleted successfully.");
+ }
+ else
+ {
+ session.setAttribute("ERROR_MESSAGE", "User '"+userId+"' have not been deleted.");
+ }
+
+ response.sendRedirect("user.do");
+ return;
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/user/servlet/SearchUserServlet.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/user/servlet/SearchUserServlet.java
new file mode 100755
index 0000000..985e5dc
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/user/servlet/SearchUserServlet.java
@@ -0,0 +1,140 @@
+package com.seclore.sample.dms.user.servlet;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import com.seclore.sample.dms.util.Global;
+import com.seclore.sample.dms.util.LoggerUtil;
+import com.seclore.sample.dms.util.ParserUtil;
+import com.seclore.sample.dms.util.xml.XMLDBService;
+
+@WebServlet({ "/searchUser.do" })
+public class SearchUserServlet extends HttpServlet
+{
+ private static final long serialVersionUID = 1L;
+
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ doPost(request, response);
+ }
+
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ LoggerUtil.logDebug("SearchUserServlet:doPost::START");
+ String lstrEmailId = request.getParameter("emailId");
+ String lstrName = null;
+ if ((lstrEmailId == null) || (lstrEmailId.trim().isEmpty()))
+ {
+ writeErrorResponse(response, -1, "Please enter the user's email id");
+ return;
+ }
+ lstrEmailId = lstrEmailId.trim();
+
+ String lstrSearchEntityXML = "2 "
+ + ParserUtil.escapeForXML(lstrEmailId)
+ + " ";
+ try
+ {
+ String responseXML = Global.getFSTenant().sendRequest(null, 74, lstrSearchEntityXML);
+ LoggerUtil.logError("SearchUserServlet:doPost::Response XML:- " + responseXML);
+ Node rootNode = ParserUtil.getRootNode(responseXML);
+ Node requestStatusNode = ParserUtil.parseNode("request-status", rootNode);
+ String returnValue = ParserUtil.parseString("return-value", requestStatusNode);
+ if (!"1".equals(returnValue))
+ {
+ if ("-220372".equals(returnValue))
+ {
+ writeErrorResponse(response, -1, "User with this email id does not exist");
+ return;
+ }
+ String errorMessage = ParserUtil.parseString("error-message", requestStatusNode);
+ String displayMessage = ParserUtil.parseString("display-message", requestStatusNode);
+ if ( (displayMessage == null) || (displayMessage.trim().isEmpty()) )
+ {
+ displayMessage = errorMessage;
+ }
+ writeErrorResponse(response, -1, displayMessage);
+ return;
+ }
+ Node entitiesNode = ParserUtil.parseNode("entities", rootNode);
+ if (entitiesNode == null)
+ {
+ writeErrorResponse(response, -1, "User with this email id does not exist");
+ return;
+ }
+ NodeList entitiesList = ParserUtil.parseNodeList("entity", entitiesNode);
+ if ((entitiesList == null) || (entitiesList.getLength() == 0))
+ {
+ writeErrorResponse(response, -1, "User with this email id does not exist");
+ return;
+ }
+
+ Node entity = entitiesList.item(0);
+ lstrName = ParserUtil.parseString("name", entity);
+ if (lstrName == null)
+ {
+ lstrName = lstrEmailId;
+ }
+
+ if (XMLDBService.getAppUserById(lstrEmailId) == null)
+ {
+ XMLDBService.addNewAppUser(lstrEmailId, lstrName);
+ }
+ writeSuccessResponse(response, lstrEmailId, lstrName);
+ LoggerUtil.logDebug("SearchUserServlet:doPost::END");
+ return;
+ }
+ catch (Exception e)
+ {
+ LoggerUtil.logError("SearchUserServlet:doPost::Error while searching the entity", e);
+ writeErrorResponse(response, -1, e.getMessage());
+ LoggerUtil.logDebug("SearchUserServlet:doPost::END");
+ }
+ }
+
+ private void writeErrorResponse(HttpServletResponse response, int pStatus, String pErrorMsg)
+ {
+ LoggerUtil.logDebug("SearchUserServlet:doPost:writeErrorResponse::START");
+ try
+ {
+ ServletOutputStream out = response.getOutputStream();
+ Gson gson = new Gson();
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("status", Integer.valueOf(pStatus));
+ jsonObject.addProperty("errorMessage", pErrorMsg);
+ out.print(gson.toJson(jsonObject));
+ out.flush();
+ }
+ catch (IOException localIOException){ }
+ LoggerUtil.logDebug("SearchUserServlet:doPost:writeErrorResponse::END");
+ }
+
+ private void writeSuccessResponse(HttpServletResponse response, String pEmailId, String pName)
+ {
+ LoggerUtil.logDebug("SearchUserServlet:doPost:writeSuccessResponse::START");
+ try
+ {
+ ServletOutputStream out = response.getOutputStream();
+ Gson gson = new Gson();
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("status", Integer.valueOf(1));
+ jsonObject.addProperty("name", pName);
+ jsonObject.addProperty("emailId", pEmailId);
+ out.print(gson.toJson(jsonObject));
+ out.flush();
+ }
+ catch (IOException localIOException) { }
+ LoggerUtil.logDebug("SearchUserServlet:doPost:writeSuccessResponse::END");
+ }
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/user/servlet/UpdateAppUserServlet.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/user/servlet/UpdateAppUserServlet.java
new file mode 100755
index 0000000..7a7d796
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/user/servlet/UpdateAppUserServlet.java
@@ -0,0 +1,68 @@
+package com.seclore.sample.dms.user.servlet;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import com.seclore.sample.dms.util.xml.XMLDBService;
+
+/**
+ * Servlet implementation class UpdateAppUserServlet
+ */
+@WebServlet("/updateUser.do")
+public class UpdateAppUserServlet extends HttpServlet
+{
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @see HttpServlet#HttpServlet()
+ */
+ public UpdateAppUserServlet()
+ {
+ super();
+ }
+
+ /**
+ * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ doPost(request, response);
+ }
+
+ /**
+ * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ HttpSession session = request.getSession();
+
+ String userId = request.getParameter("userId");
+ String name = request.getParameter("name");
+
+ if( XMLDBService.getAppUserById(userId) == null )
+ {
+ session.setAttribute("ERROR_MESSAGE", "User '"+userId+"' could not be found!");
+ response.sendRedirect("user.do");
+ return;
+ }
+
+ if( XMLDBService.updateAppUser(userId, name) )
+ {
+ session.setAttribute("SUCCESS_MESSAGE", "User '"+userId+"' have been updated successfully.");
+ }
+ else
+ {
+ session.setAttribute("ERROR_MESSAGE", "User '"+userId+"' have not been updated.");
+ }
+
+ response.sendRedirect("user.do");
+ return;
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/util/CommonUtil.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/util/CommonUtil.java
new file mode 100755
index 0000000..ccd6389
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/util/CommonUtil.java
@@ -0,0 +1,443 @@
+package com.seclore.sample.dms.util;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Base64;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.seclore.sample.dms.constant.Constants;
+import com.seclore.sample.exceptions.DMSSampleException;
+
+public class CommonUtil
+{
+
+ public static String addTimeStampToFileName(String pFileName)
+ {
+ return pFileName.substring( 0, pFileName.lastIndexOf(".") )
+ + "_" + new Date().getTime() + pFileName.substring( pFileName.lastIndexOf(".") );
+ }
+
+
+ public static void closeStream(InputStream pIntputStream){
+
+ if( pIntputStream == null ) return;
+
+ try {
+ pIntputStream.close();
+ }
+ catch(IOException e) {
+ // Log the exception
+ }
+ }
+
+ public static void closeStream(OutputStream pOutputStream){
+
+ if( pOutputStream == null ) return;
+
+ try {
+ pOutputStream.close();
+ }
+ catch(IOException e) {
+ // Log the exception
+ }
+ }
+
+ /**
+ * Checks whether the String is empty or null or holds only spaces.
+ * @param pString
+ * @return
+ */
+ public static boolean isStringEmpty(String pString)
+ {
+ if(pString == null)
+ {
+ return true;
+ }
+ return pString.trim().isEmpty();
+ }
+
+ /**
+ * Removes slash '\' from the end of String.
+ * Eg: Input 'www.seclore.com/ps/' will return 'www.seclore.com/ps'
+ *
+ * @param pParam
+ * @return
+ */
+ public static String removeEndSlash(String pParam)
+ {
+ if (pParam == null) return pParam;
+
+ while (pParam.length() > 1
+ && (pParam.charAt(pParam.length() - 1) == '/'
+ || pParam.charAt(pParam.length() - 1) == '\\'))
+ {
+ pParam = pParam.substring(0, pParam.length() - 1);
+ }
+ return pParam;
+ }
+
+ /**
+ * Value String suffix for Content DIspositioin header.
+ */
+ private static final String ATTACHMENT_FILENAME_UTF_8 = "attachment; filename*=UTF-8''";
+
+
+ /**Base64 Decodes the string input
+ * @param pInput
+ * @return
+ */
+ public static String base64Decode(String pInput)
+ {
+ return new String(Base64.getDecoder().decode(pInput));
+ }
+
+ /**Base64 Encodes the string input
+ * @param pInput
+ * @return
+ */
+ public static String base64Encode(String pInput)
+ {
+ return new String(Base64.getEncoder().encode(pInput.getBytes()));
+ }
+
+ /**
+ * Returns the size of the file in bytes.
+ * @param pFilePath
+ * @return file size in bytes.
+ */
+ public static String getFileSize(String pFilePath)
+ {
+ File lFile = new File(pFilePath);
+ return String.valueOf(lFile.length());
+ }
+
+ /**
+ * Makes the Value for Content Disposition header using file name. Adds UTF-8 encoding as well.
+ * @param pFileName
+ * @return
+ * @throws DMSSampleException
+ */
+ public static String getContentDispositionHeader(String pFileName) throws DMSSampleException
+ {
+ try
+ {
+ return URLEncoder.encode(ATTACHMENT_FILENAME_UTF_8 + pFileName,"UTF-8");
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ LoggerUtil.logError(e.getMessage(), e);
+ throw new DMSSampleException("Encoding Exception when creating content disposition header", e);
+ }
+ }
+
+ /**
+ * Reads the header value and returns the string value after 'Bearer'. Returns null if not found.
+ * @param pHeaderValue
+ * @return
+ */
+ public static String getAuthorizationToken(String pHeaderValue)
+ {
+ if (pHeaderValue.startsWith(Constants.BEARER) && pHeaderValue.length() > Constants.BEARER.length())
+ {
+ return pHeaderValue.substring(Constants.BEARER.length());
+ }
+ return null;
+ }
+
+ /**
+ * @param pFileName
+ * @return Extension of the file. (The part after '.')
+ */
+ public static String getFileExtension(String pFileName)
+ {
+ int extIndex = pFileName.lastIndexOf(".");
+ if (extIndex < 0)
+ {
+ return "";
+ }
+
+ String ext = pFileName.substring(extIndex + 1);
+ return ext;
+ }
+
+ /**
+ * Calculates the hash of the file stored at the path. Uses SHA-256.
+ * @param pFilePath
+ * @return
+ * @throws DMSSampleException
+ */
+ public static String getFileHash(String pFilePath) throws DMSSampleException
+ {
+ try
+ {
+ MessageDigest lDigest = MessageDigest.getInstance(Constants.FILE_HASH_ALGO);
+ // Get file input stream for reading the file content
+ FileInputStream fis = new FileInputStream(new File(pFilePath));
+ // Create byte array to read data in chunks
+ byte[] byteArray = new byte[1024];
+ int bytesCount = 0;
+
+ // Read file data and update in message digest
+ while ((bytesCount = fis.read(byteArray)) != -1)
+ {
+ lDigest.update(byteArray, 0, bytesCount);
+ }
+ ;
+
+ // close the stream; We don't need it now.
+ fis.close();
+
+ // Get the hash's bytes
+ byte[] bytes = lDigest.digest();
+
+ // This bytes[] has bytes in decimal format;
+ // Convert it to hexadecimal format
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < bytes.length; i++)
+ {
+ sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
+ }
+
+ // return complete hash
+ return sb.toString();
+ }
+ catch (NoSuchAlgorithmException e)
+ {
+ LoggerUtil.logError("No File Hash Algorithm found", e);
+ throw new DMSSampleException("No File Hash Algorithm found", e);
+ }
+ catch (FileNotFoundException e)
+ {
+ LoggerUtil.logError("File not found", e);
+ throw new DMSSampleException("File not found", e);
+ }
+ catch (IOException e)
+ {
+ LoggerUtil.logError("Unable to open the file", e);
+ throw new DMSSampleException("Unable to open the file", e);
+ }
+ }
+
+ /**
+ * Converts the JSON String to a Java Object passed in pClass.
+ * @param pClass
+ * @param pJSONString
+ * @param pMapDeserializationFeature
+ * @return
+ * @throws DMSSampleException
+ */
+ public static T getObjectFromJSONString(Class pClass, String pJSONString,
+ Map pMapDeserializationFeature)
+ throws DMSSampleException
+ {
+ if (pClass == null || CommonUtil.isEmptyString(pJSONString) == true)
+ {
+ return null;
+ }
+
+ try
+ {
+ // create an object of 'Jackson' ObjectMapper class
+ ObjectMapper lObjectMapper = new ObjectMapper();
+
+ // configure DeserializationFeature
+ if (pMapDeserializationFeature != null)
+ {
+ for (Map.Entry lEntry : pMapDeserializationFeature.entrySet())
+ {
+ lObjectMapper.configure(lEntry.getKey(), lEntry.getValue());
+ }
+ }
+
+ // Convert JSON string to Object.
+ return lObjectMapper.readValue(pJSONString, pClass);
+ }
+ catch (IOException pException)
+ {
+ throw new DMSSampleException(
+ "Error occured while converting JSON string into object", pException);
+ }
+
+ }
+
+ /**
+ * This method will generate JSON string, using object passed to it.
+ *
+ * @param pObject
+ * object of type Object which need to be converted to JSON
+ * String
+ * @param pMapSerializationFeature
+ * configure SerializationFeature on ObjectMapper
+ * @return String JSON String
+ * @throws DMSSampleException
+ * If any error occurs while processing the given object
+ */
+ public static String getJSONStringFromObject(Object pObject,
+ Map pMapSerializationFeature) throws DMSSampleException
+ {
+ if (pObject == null)
+ {
+ return null;
+ }
+
+ try
+ {
+ // create an object of 'Jackson' ObjectMapper class
+ ObjectMapper lObjectMapper = new ObjectMapper();
+ // configure SerializationFeature on ObjectMapper
+ if (pMapSerializationFeature != null)
+ {
+ for (Map.Entry lEntry : pMapSerializationFeature.entrySet())
+ {
+ lObjectMapper.configure(lEntry.getKey(), lEntry.getValue());
+ }
+ }
+
+ // convert & return this object as Json String
+ return lObjectMapper.writeValueAsString(pObject);
+ }
+ catch (JsonProcessingException pException)
+ {
+ throw new DMSSampleException(
+ "Error occured while converting Object into JSON", pException);
+ }
+ }
+
+ /**
+ * Checks whether the string is null or empty.
+ * @param pValue
+ * @return
+ */
+ public static boolean isEmptyString(String pValue)
+ {
+ if (pValue == null || pValue.trim().equals(""))
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /**
+ * Generates Random UUID without the hyphen(-).
+ * @return
+ */
+ public static String getGUID()
+ {
+ return UUID.randomUUID().toString().replace("-", "");
+ }
+
+ /**
+ * Generates Random UUID without the hyphen(-).
+ * @return
+ */
+ public static String generateRequestID()
+ {
+ return getGUID();
+ }
+
+ /**
+ * Generates Random UUID without the hyphen(-).
+ * @return
+ */
+ public static String generateSessionContext()
+ {
+ return getGUID();
+ }
+
+ /**
+ * Checks whether the list is empty or null.
+ *
+ * @param pList
+ * @return
+ */
+ public static boolean isEmptyList(List pList)
+ {
+ if (pList == null || pList.isEmpty() || pList.size() < 1) return true;
+ return false;
+ }
+
+ /**
+ * Writes from Inputstream to the Outputstream.
+ *
+ * @param pOutputStream
+ * @throws IOException
+ */
+ public static void writeFileToOutputStream(InputStream pInputStream,OutputStream pOutputStream) throws IOException
+ {
+ BufferedInputStream lDownloadFileStream = null;
+ try
+ {
+ lDownloadFileStream = new BufferedInputStream(pInputStream);
+ int lBytesRead = 0;
+ byte[] lDataBuffer = new byte[4096];
+ while ((lBytesRead = lDownloadFileStream.read(lDataBuffer, 0, 4096)) != -1)
+ pOutputStream.write(lDataBuffer, 0, lBytesRead);
+ }
+ finally
+ {
+ if (lDownloadFileStream != null) lDownloadFileStream.close();
+ }
+ }
+
+ public static void writeInputStreamToFile(InputStream pInputStream,String pFilePath) throws IOException
+ {
+
+ OutputStream lOutputStream = new FileOutputStream(pFilePath);
+
+ byte[] buffer = new byte[4096];
+ int bytesRead;
+ while ((bytesRead = pInputStream.read(buffer)) != -1)
+ {
+ lOutputStream.write(buffer, 0, bytesRead);
+ }
+
+ closeStream(lOutputStream);
+ }
+
+ /**
+ * Converts Milliseconds to Minutes.
+ * @param lMilliSeconds
+ * @return
+ */
+ public static int convertMilliSecondsToMinutes(long lMilliSeconds)
+ {
+ return (int) (lMilliSeconds/60000);
+ }
+
+ /**
+ * Returns the filename from filepath.
+ * This is required for IE as the form upload return full path of the file.
+ *
+ * Will return original pFilePath if it is not a path.
+ * @param pFilePath
+ * @return
+ */
+ public static String getFileNameFromPath(String pFilePath)
+ {
+ if(pFilePath.contains(File.separator))
+ return pFilePath.substring(pFilePath.lastIndexOf(File.separator) + 1);
+
+ return pFilePath;
+ }
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/util/GeoLocationUtil.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/util/GeoLocationUtil.java
new file mode 100755
index 0000000..ca38375
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/util/GeoLocationUtil.java
@@ -0,0 +1,131 @@
+package com.seclore.sample.dms.util;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Locale;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.seclore.sample.dms.config.SampleAppConfig;
+import com.seclore.sample.dms.core.IPGeoDetails;
+
+public class GeoLocationUtil
+{
+ private static HashMap smapCountryCode2Name = new HashMap();
+ private static String sstrIPStackUrl = "http://api.ipstack.com/";
+
+ static
+ {
+ String[] countryCodes = Locale.getISOCountries();
+ for(String countryCode: countryCodes)
+ {
+ Locale locale = new Locale("", countryCode);
+ smapCountryCode2Name.put(locale.getCountry(), locale.getDisplayCountry());
+ }
+ }
+
+ private static String getGeoDetailsJSONFromIPAddress(String pIPAddress) throws Exception
+ {
+ if(SampleAppConfig.isLocationBasedFeatureEnabled() == false)
+ {
+ throw new Exception("Location based features are disabled.");
+ }
+ if(pIPAddress == null || pIPAddress.trim().isEmpty())
+ {
+ throw new Exception("IP Address is invalid.");
+ }
+ String ipStackApiKey = SampleAppConfig.getIPStackApiKey();
+ if(ipStackApiKey == null || ipStackApiKey.trim().isEmpty())
+ {
+ throw new Exception("IPStack API key is not configured.");
+ }
+ String responseString = null;
+
+ String lUrl = sstrIPStackUrl + pIPAddress + "?access_key=" + ipStackApiKey;
+ responseString = sendHttpGetRequest(lUrl);
+
+ JsonObject jsonObject = new JsonParser().parse(responseString).getAsJsonObject();
+ JsonObject errorObj = jsonObject.getAsJsonObject("error");
+ if(errorObj != null)
+ {
+ String errorCode = errorObj.get("code").getAsString();
+ String errorInfo = errorObj.get("info").getAsString();
+ throw new Exception("IPStackresponded with an error : " + errorInfo + " ( " + errorCode + " ) " );
+ }
+
+ return responseString;
+ }
+
+ public static IPGeoDetails getGeoDetailsFromIPAddress(String pIPAddress) throws Exception
+ {
+ String geoDetailsJson = getGeoDetailsJSONFromIPAddress(pIPAddress);
+ IPGeoDetails ipGeoDetails = (IPGeoDetails) ParserUtil.getObjectFromJson(geoDetailsJson, IPGeoDetails.class);
+
+ return ipGeoDetails;
+ }
+
+ public static String getCountryCodeFromIPAddress(String pIPAddress) throws Exception
+ {
+ return getGeoDetailsFromIPAddress(pIPAddress).getCountryCode();
+ }
+
+ public static HashMap getCountryCodeToNameMap()
+ {
+ return (HashMap) smapCountryCode2Name.clone();
+ }
+
+ public static String sendHttpGetRequest(String pUrl) throws Exception
+ {
+ String response = "";
+ HttpURLConnection lConnection = null;
+ BufferedReader br = null;
+ try
+ {
+
+ URL lUrl = new URL(pUrl);
+
+ lConnection = (HttpURLConnection) lUrl.openConnection();
+ lConnection.setDoInput(true);
+ lConnection.setDoOutput(true);
+ lConnection.setRequestMethod("GET");
+ int responseCode = lConnection.getResponseCode();
+ if(responseCode == HttpURLConnection.HTTP_OK)
+ {
+ br = new BufferedReader( new InputStreamReader( lConnection.getInputStream() ) );
+ String inputLine ;
+ StringBuilder lsbResponse = new StringBuilder();
+ while( ( inputLine = br.readLine() ) != null )
+ {
+ lsbResponse.append(inputLine);
+ }
+ response = lsbResponse.toString();
+ }
+ else
+ {
+ throw new Exception("Server responded with an error : " + lConnection.getResponseMessage() + " ( " + lConnection.getResponseCode() + " ) " );
+ }
+ } catch (IOException e) {
+ LoggerUtil.logError(e.getMessage(), e);
+ throw new Exception("Error sending HTTP request.");
+ }
+ finally
+ {
+ if(br != null)
+ {
+ try
+ {
+ br.close();
+ }
+ catch (Exception e) {
+ // Ignore
+ }
+ br = null;
+ }
+ }
+ return response;
+ }
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/util/Global.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/util/Global.java
new file mode 100755
index 0000000..520f649
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/util/Global.java
@@ -0,0 +1,74 @@
+package com.seclore.sample.dms.util;
+
+import java.io.File;
+
+import com.seclore.fs.helper.exception.FSHelperException;
+import com.seclore.fs.helper.library.FSHelper;
+import com.seclore.sample.dms.config.SampleAppConfig;
+import com.seclore.sample.dms.constant.Constants;
+import com.seclore.sample.dms.util.xml.XMLDataUtil;
+
+public class Global {
+
+ private static String mstrAppRealPath = "";
+
+ private static String mFSTenantId = "tenant-1";
+
+ private static FSHelper mFSTenant = null;
+
+ public static void initializeApplication(String pAppRealPath)
+ {
+ mstrAppRealPath = pAppRealPath;
+
+ // Initialize logger
+ LoggerUtil.initializeLogger( pAppRealPath );
+
+ // Initialize app-data
+ XMLDataUtil.initializeAppData( pAppRealPath );
+
+
+ SampleAppConfig.initializeSampleAppConfig( pAppRealPath );
+ }
+
+
+
+ /**
+ * Get application real path
+ * @return
+ */
+ public static String getAppRealPath()
+ {
+ return mstrAppRealPath;
+ }
+
+
+ /**
+ * Get application data directory where all folder and files will be created.
+ * @return
+ */
+ public static String getAppDataDir()
+ {
+ return getAppRealPath() + File.separator + Constants.DATA_DIR + File.separator;
+ }
+
+ public static String getFSTenantId()
+ {
+ return mFSTenantId;
+ }
+
+ public static FSHelper getFSTenant() throws FSHelperException
+ {
+ if(mFSTenant == null)
+ {
+ throw new FSHelperException(-1, "Tenant Not Initialised.");
+ }
+ return mFSTenant;
+ }
+
+
+ public static void setFSTenant(FSHelper pFSTenant)
+ {
+ mFSTenant = pFSTenant;
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/util/LoggerUtil.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/util/LoggerUtil.java
new file mode 100755
index 0000000..cd28627
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/util/LoggerUtil.java
@@ -0,0 +1,118 @@
+package com.seclore.sample.dms.util;
+
+import java.io.File;
+
+import org.apache.log4j.FileAppender;
+import org.apache.log4j.Level;
+import org.apache.log4j.Logger;
+
+public class LoggerUtil
+{
+ private static final String SAMPLE_APP_LOGGER = "SampleAppLogger";
+
+ private static Logger logger = null;
+
+ public static void initializeLogger(String appPath)
+ {
+ logger = Logger.getLogger(SAMPLE_APP_LOGGER);
+ if(logger == null)
+ {
+ return;
+ }
+
+ FileAppender appender = (FileAppender) logger.getAppender(SAMPLE_APP_LOGGER);
+ if(appender == null)
+ {
+ return;
+ }
+
+ String logFile = appender.getFile();
+ if( logFile == null || logFile.trim().isEmpty() )
+ {
+ logFile = "logs/SecloreSampleApp.log";
+ }
+ appender.setFile(appPath+File.separator+logFile);
+ appender.setEncoding("UTF-8");
+ appender.activateOptions();
+
+ logger.info("LoggerUtil::initializeLogger:: SampleAppLogger initialized succesfully.");
+ }
+
+ public static void logInfo(String pMessage)
+ {
+ if(logger != null)
+ {
+ logger.info(pMessage);
+ }
+ }
+
+ public static void logDebug(String pMessage)
+ {
+ if(logger != null)
+ {
+ logger.debug(pMessage);
+ }
+ }
+
+ public static void logError(String pMessage)
+ {
+ if(logger != null)
+ {
+ logger.error(pMessage);
+ }
+ }
+
+ public static void logError(String pMessage, Throwable pThrowable)
+ {
+ if(logger != null)
+ {
+ logger.error(pMessage,pThrowable);
+ }
+ }
+
+ /**
+ * Set logger level, at run time if required
+ * @param pLevel
+ */
+ public static void setLoggerLevel(String pLevel)
+ {
+ if(logger == null)
+ {
+ return;
+ }
+
+ if( "all".equalsIgnoreCase(pLevel) )
+ {
+ logger.setLevel(Level.ALL);
+ }
+ else if("debug".equalsIgnoreCase(pLevel))
+ {
+ logger.setLevel(Level.DEBUG);
+ }
+ else if("error".equalsIgnoreCase(pLevel))
+ {
+ logger.setLevel(Level.ERROR);
+ }
+ else if("fatal".equalsIgnoreCase(pLevel))
+ {
+ logger.setLevel(Level.FATAL);
+ }
+ else if("info".equalsIgnoreCase(pLevel))
+ {
+ logger.setLevel(Level.INFO);
+ }
+ else if("off".equalsIgnoreCase(pLevel))
+ {
+ logger.setLevel(Level.OFF);
+ }
+ else if("trace".equalsIgnoreCase(pLevel))
+ {
+ logger.setLevel(Level.TRACE);
+ }
+ else if("warn".equalsIgnoreCase(pLevel))
+ {
+ logger.setLevel(Level.WARN);
+ }
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/util/ParserUtil.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/util/ParserUtil.java
new file mode 100755
index 0000000..04ae024
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/util/ParserUtil.java
@@ -0,0 +1,210 @@
+package com.seclore.sample.dms.util;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringReader;
+import java.io.StringWriter;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpressionException;
+import javax.xml.xpath.XPathFactory;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class ParserUtil
+{
+ private static XPath xpath = null;
+ static
+ {
+ xpath = XPathFactory.newInstance().newXPath();
+ }
+
+
+ /**
+ * @param xmlString
+ * @return
+ */
+ public static Document parseDocument(String xmlString)
+ {
+ InputStream inputStream = null;
+ try
+ {
+ DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder builder = builderFactory.newDocumentBuilder();
+ Document xmlDocument = builder.parse( new InputSource(new StringReader(xmlString)) );
+ return xmlDocument;
+ }
+ catch (Exception e)
+ {
+ LoggerUtil.logError("Error while parsing - "+xmlString, e);
+ }
+ finally
+ {
+ if(inputStream != null)
+ {
+ try{
+ inputStream.close();
+ }
+ catch(IOException ioException)
+ {
+ //ignore
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * @param document
+ * @return
+ */
+ public static Node getRootNode(Document document)
+ {
+ NodeList nodeList = document.getChildNodes();
+ return nodeList.item(0);
+ }
+
+ /**
+ * @param XML String
+ * @return
+ */
+ public static Node getRootNode(String xmlString)
+ {
+ Document document = parseDocument(xmlString);
+ return getRootNode(document);
+ }
+
+ /**
+ * @param xmlTagName
+ * @param parentNode
+ * @return
+ */
+ public static Node parseNode(String xmlTagName, Node parentNode)
+ {
+ try
+ {
+ Node node = (Node) xpath.evaluate(xmlTagName, parentNode, XPathConstants.NODE);
+ return node;
+ }
+ catch (XPathExpressionException e)
+ {
+ LoggerUtil.logError("Error while parsing - "+xmlTagName, e);
+ }
+ return null;
+ }
+
+ /**
+ * @param xmlTagName
+ * @param parentNode
+ * @return
+ */
+ public static NodeList parseNodeList(String xmlTagName, Node parentNode)
+ {
+ try
+ {
+ NodeList nodeList = (NodeList) xpath.evaluate(xmlTagName, parentNode, XPathConstants.NODESET);
+ return nodeList;
+ }
+ catch (XPathExpressionException e)
+ {
+ LoggerUtil.logError("Error while parsing - "+xmlTagName, e);
+ }
+ return null;
+ }
+
+ /**
+ * @param xmlTagName
+ * @param parentNode
+ * @return
+ */
+ public static String parseString(String xmlTagName, Node parentNode)
+ {
+ try
+ {
+ String requestId = (String) xpath.evaluate(xmlTagName+"/text()", parentNode, XPathConstants.STRING);
+ return requestId;
+ }
+ catch (XPathExpressionException e)
+ {
+ LoggerUtil.logError("Error while parsing - "+xmlTagName, e);
+ }
+ return null;
+ }
+
+ public static String escapeForXML(String strXML)
+ {
+ if(strXML == null || strXML.trim().isEmpty())
+ {
+ return strXML;
+ }
+
+ return strXML.replace("&", "&").replace("<", "<").replace(">", ">").replace("\"", """).replace("'", "'");
+ }
+
+// public static Object getObjectFromXml(String pXml,Class pClass) throws JAXBException, InstantiationException, IllegalAccessException, ParserConfigurationException, SAXException, IOException{
+// InputStream lInputStream = new ByteArrayInputStream(pXml.getBytes(StandardCharsets.UTF_8));
+// //create JAXB context
+// JAXBContext context =
+// JAXBContext.newInstance(pClass);
+// //Create Unmarshaller using JAXB context
+// Unmarshaller unmarshaller =
+// context.createUnmarshaller();
+// Object lObj = unmarshaller.unmarshal(lInputStream);
+// return lObj;
+// }
+
+ public static Object getObjectFromXml(String pXml,Class pClass) throws JAXBException, InstantiationException, IllegalAccessException, ParserConfigurationException, SAXException, IOException{
+
+ //create JAXB context
+ JAXBContext context =
+ JAXBContext.newInstance(pClass);
+ //Create Unmarshaller using JAXB context
+ Unmarshaller unmarshaller =
+ context.createUnmarshaller();
+ Object lObj = unmarshaller.unmarshal(getRootNode(pXml));
+ return lObj;
+ }
+
+
+ public static String getXmlFromOject(Object pObject) throws JAXBException{
+ //create JAXB context
+ JAXBContext context =
+ JAXBContext.newInstance(pObject.getClass());
+ //Create Unmarshaller using JAXB context
+ Marshaller marshaller =
+ context.createMarshaller();
+ StringWriter sw = new StringWriter();
+ marshaller.marshal(pObject, sw);
+ return sw.toString();
+ }
+
+ public static Object getObjectFromJson(String pJson, Class pClass) throws JsonParseException, JsonMappingException, IOException
+ {
+ ObjectMapper mapper = new ObjectMapper();
+ return mapper.readValue(pJson, pClass);
+ }
+
+ public static Object getJsonFromOject(Object pObject) throws JsonProcessingException
+ {
+ ObjectMapper mapper = new ObjectMapper();
+ return mapper.writeValueAsString(pObject);
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/util/PortalUtil.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/util/PortalUtil.java
new file mode 100755
index 0000000..a27be8f
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/util/PortalUtil.java
@@ -0,0 +1,101 @@
+package com.seclore.sample.dms.util;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.List;
+import java.util.Set;
+
+import javax.servlet.http.HttpServletRequest;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import com.seclore.sample.dms.core.AppFile;
+import com.seclore.sample.dms.core.AppFolder;
+import com.seclore.sample.dms.core.Classification;
+import com.seclore.sample.dms.core.FileActivityLog;
+import com.seclore.sample.dms.core.UserRight;
+import com.seclore.sample.dms.util.xml.XMLDBService;
+
+
+public class PortalUtil
+{
+ /**
+ * @param usersRight Set
+ * @return Example :- "{\"usersRights\":[{\"userId\":\"2\",\"usageRights\":\"1\"},{\"userId\":\"1\",\"usageRights\":\"2\"}]}";
+ */
+ public static String getJsonString(Set usersRight)
+ {
+ Gson gson = new Gson();
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.add("usersRights", gson.toJsonTree(usersRight) );
+ return gson.toJson(jsonObject);
+ }
+
+ public static void setRequestAttributes(HttpServletRequest pRequest, AppFile pFile, AppFolder pFolder)
+ {
+ // Get the classifications from Policy Server
+ Set lClassifications = null;
+ try
+ {
+ lClassifications = SecloreProtectUtil.getClassifications();
+ }
+ catch (Exception e)
+ {
+ LoggerUtil.logError("Error while getting classification from Policy Server, Taking classification from local", e);
+ // Get the classifications from local (cached)
+ lClassifications = XMLDBService.getClassifications();
+ }
+
+ pRequest.setAttribute("selectedUsersRights", pFile.getUserRightList() );
+ pRequest.setAttribute("blacklistedCountries", pFile.getBlacklistedCountries() );
+ pRequest.setAttribute("rightsMap", XMLDBService.getAppRights());
+ pRequest.setAttribute("usersMap", XMLDBService.getAppUsers());
+ pRequest.setAttribute("folderName", pFolder.getName());
+ pRequest.setAttribute("folderId", pFolder.getId());
+ pRequest.setAttribute("file", pFile);
+ pRequest.setAttribute("classifications", lClassifications);
+ }
+
+ public static void setRequestAttributes(HttpServletRequest pRequest, List lliFileActivityLog)
+ {
+ pRequest.setAttribute("fileactivitylog", lliFileActivityLog);
+ }
+ /**
+ * This method encodes the url value
+ * @param Value
+ * @return
+ */
+
+ public static String getEncodedParamValue( String pParamValue)
+ {
+ try
+ {
+ String lstrRetVal = URLEncoder.encode(pParamValue, "UTF-8");
+ return lstrRetVal;
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ return pParamValue;
+ }
+ }
+
+ public static String getApplicationUrl(HttpServletRequest request)
+ {
+
+ String applicationUrl = "";
+ String scheme = request.getScheme();
+ String serverName = request.getServerName();
+ Integer serverPort = request.getServerPort();
+ String contextPath = request.getContextPath();
+ if( serverPort == 80 || serverPort == 443 )
+ {
+ applicationUrl = scheme+"://"+serverName+contextPath;
+ }
+ else
+ {
+ applicationUrl = scheme+"://"+serverName+":"+serverPort+contextPath;
+ }
+
+ return applicationUrl;
+ }
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/util/SecloreProtectUtil.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/util/SecloreProtectUtil.java
new file mode 100755
index 0000000..af5c45f
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/util/SecloreProtectUtil.java
@@ -0,0 +1,280 @@
+package com.seclore.sample.dms.util;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import com.seclore.fs.helper.core.ProtectedFile;
+import com.seclore.fs.helper.enums.ProtectionType;
+import com.seclore.fs.helper.exception.FSHelperException;
+import com.seclore.fs.helper.library.FSHelper;
+import com.seclore.fs.ws.client.core.RequestType;
+import com.seclore.fs.ws.client.pscp.PSConnection;
+import com.seclore.fs.ws.client.pscp.exception.PSCPException;
+import com.seclore.sample.dms.core.Classification;
+import com.seclore.sample.dms.core.FileHtmlWrapInfo;
+import com.seclore.sample.dms.util.xml.XMLDBService;
+
+public class SecloreProtectUtil
+{
+
+ public static final String TEMP_FOLDER_PATH = Global.getAppRealPath() + File.separator + "SECLORE_TEMP_FOLDER";
+
+ /**
+ * @param pTempFilePath - Absolute File path of file to be protected
+ * @param displayFileName - Display name of the file which will be goes in activity log.
+ * @param protectionDetailsXml - Protection details
+ * @return InputStream of Protected file
+ * @throws IOException
+ * @throws PSCPException
+ */
+ public static InputStream protectFile(String tempFilePath, String displayFileName,
+ String protectionDetailsXml, FileHtmlWrapInfo fileHtmlWrapInfo) throws Exception
+ {
+ String strMethodName = SecloreProtectUtil.class.getName() + " : protectFile : ";
+ LoggerUtil.logInfo(strMethodName + "STARTS.");
+ String deleteFilePath = null;
+
+
+ try
+ {
+ FSHelper tenant = Global.getFSTenant();
+
+ if(displayFileName == null || displayFileName.trim().isEmpty())
+ {
+ displayFileName = tempFilePath;
+ }
+
+ //check if file is already protected
+ if(tenant.isProtectedFile(tempFilePath) == true || tenant.isHTMLWrapped(tempFilePath))
+ { //protected: yes
+
+ // if already protected and wrapped , return the file as it is
+ if(tenant.isHTMLWrapped(tempFilePath) == true)
+ {
+ fileHtmlWrapInfo.setHtmlWrapStatus(true);
+ LoggerUtil.logDebug( strMethodName+"skipping file "+tempFilePath
+ +"as it is already protected and wrapped");
+ return getByteArrayInputStream(tempFilePath);
+ }
+
+ // if file is protected but not wrapped return the wrapped file
+ if(fileHtmlWrapInfo.isHtmlWrapEnabled() == true && tenant.isHTMLWrapSupported(tempFilePath) == true)
+ {
+ ProtectedFile wrappedFile = tenant.wrap(null, tempFilePath, displayFileName);
+ fileHtmlWrapInfo.setHtmlWrapStatus(true);
+ // wrap creates a copy of protected file and wraps it in HTML,
+ ///it does not replace the original file so delete the temp file after use
+ deleteFilePath = tempFilePath;
+ LoggerUtil.logDebug( strMethodName+"wrapping file "+displayFileName);
+ return getByteArrayInputStream(wrappedFile.getFilePath());
+ }
+
+ /*
+ * either the HtmlWrapEnable option is off in PS or the file only supports Advance protection
+ * return the file as it is
+ */
+
+ fileHtmlWrapInfo.setHtmlWrapStatus(false);
+ LoggerUtil.logDebug( strMethodName+"skipping file "+tempFilePath
+ +"as either the HtmlWrapEnable option is off in PS or the"
+ + " file only supports Advance protection");
+ return getByteArrayInputStream(tempFilePath);
+
+ }else
+ { //protected: no
+ PSConnection psConnection = null;
+ String protectorDetails = null;
+ String comments = null;
+
+ // basic file always protected and wrapped
+ if( tenant.isBasicProtectionSupported(tempFilePath))
+ {
+ ProtectedFile protectedFile = tenant.protectAndWrap(psConnection, tempFilePath,
+ displayFileName, ProtectionType.PROTECT_WITH_HF_EXT_REF,
+ protectionDetailsXml, protectorDetails, comments);
+ fileHtmlWrapInfo.setHtmlWrapStatus(true);
+ LoggerUtil.logInfo("File protected with File Id: " + protectedFile.getFileId());
+ return getByteArrayInputStream(protectedFile.getFilePath());
+ }
+
+ // protect with advance protection
+ if(tenant.isSupportedFile(tempFilePath))
+ {
+
+ if(tenant.isHTMLWrapSupported(tempFilePath) && fileHtmlWrapInfo.isHtmlWrapEnabled() )
+ {
+ ProtectedFile protectedFile = tenant.protectAndWrap(psConnection, tempFilePath,
+ displayFileName, ProtectionType.PROTECT_WITH_HF_EXT_REF, protectionDetailsXml,
+ protectorDetails, comments);
+ fileHtmlWrapInfo.setHtmlWrapStatus(true);
+ LoggerUtil.logInfo("File protected with File Id: " + protectedFile.getFileId());
+
+ deleteFilePath = protectedFile.getFilePath();
+ return getByteArrayInputStream(protectedFile.getFilePath());
+
+ }
+ else
+ {
+ String lstrFileId = tenant.protectX(psConnection, tempFilePath, displayFileName,
+ ProtectionType.PROTECT_WITH_HF_EXT_REF, protectionDetailsXml, protectorDetails,
+ comments);
+ fileHtmlWrapInfo.setHtmlWrapStatus(false);
+ LoggerUtil.logInfo("File protected with File Id: " + lstrFileId);
+ return getByteArrayInputStream(displayFileName);
+ }
+ }
+
+ //file not supported for protection returning file as it is
+ return getByteArrayInputStream(tempFilePath);
+ }
+ }finally
+ {
+ try
+ {
+ new File(deleteFilePath).delete();
+
+ }catch(Exception e)
+ {}
+ }
+
+ }
+
+ private static ByteArrayInputStream getByteArrayInputStream(String filepath) throws IOException
+ {
+ byte filebytes[] = Files.readAllBytes(Paths.get(filepath));
+ return new ByteArrayInputStream(filebytes);
+ }
+
+
+ /**
+ * Write a temporary file to be protected
+ * @param pSourcePath - content of the file
+ * @param pDestinationPath - Temporary file path
+ * @throws IOException
+ */
+ public static void copyAndReplaceFile(String pSourcePath, String pDestinationPath) throws IOException
+ {
+ File lSource = new File(pSourcePath);
+ File lDest = new File(pDestinationPath);
+ Files.copy(lSource.toPath(), lDest.toPath(), StandardCopyOption.REPLACE_EXISTING);
+ }
+
+ public static void deleteFile(String pFilePath)
+ {
+ if(CommonUtil.isStringEmpty(pFilePath))
+ {
+ return;
+ }
+ File lFile = new File(pFilePath);
+ lFile.delete();
+ }
+
+ public static void moveAndReplace(String pSourcePath, String pDestinationPath)
+ {
+ File lSourceFile = new File(pSourcePath);
+ lSourceFile.renameTo(new File(pDestinationPath));
+ }
+
+
+ public static String getExtentionFromFileName(String pFileName) throws Exception
+ {
+ if(pFileName == null || pFileName.trim().isEmpty() )
+ {
+ throw new Exception("The file has no name.");
+ }
+
+ int extIndex = pFileName.lastIndexOf(".");
+ if(extIndex < 0)
+ {
+ throw new Exception("The file has no extension.");
+ }
+ return pFileName.substring(extIndex+1);
+ }
+
+ /** Get classifications from Policy server.
+ * This method also save classifications locally.
+ * @return
+ * @throws Exception
+ */
+ public static Set getClassifications() throws Exception
+ {
+ String xmlRequest =
+ "2 ";
+
+ FSHelper lTenant = Global.getFSTenant();
+
+ try
+ {
+ String responseXML = lTenant.sendRequest(null, RequestType.RT_GET_CLASSIFICATIONS, xmlRequest);
+ LoggerUtil.logDebug("Get Classificatios Response XML: "+ responseXML);
+
+ Node rootNode = ParserUtil.getRootNode(responseXML);
+ Node requestStatusNode = ParserUtil.parseNode("request-status", rootNode);
+ String returnValue = ParserUtil.parseString("return-value", requestStatusNode);
+
+ if( !"1".equals(returnValue) )
+ {
+ LoggerUtil.logError( "Get Classificatios Response XML: "+ responseXML );
+ String errorMsg = ParserUtil.parseString("error-message", requestStatusNode);
+ String dispMsg = ParserUtil.parseString("display-message", requestStatusNode);
+ if ( dispMsg == null || dispMsg.trim().isEmpty() )
+ {
+ dispMsg = errorMsg;
+ }
+ throw new Exception(dispMsg);
+ }
+
+ NodeList lNodeList = ParserUtil.parseNodeList("classifications/classification", rootNode);
+ if( lNodeList != null && lNodeList.getLength() > 0)
+ {
+ Set lClassifications = new LinkedHashSet();
+ for (int i = 0; i < lNodeList.getLength(); i++)
+ {
+ Node lNode = lNodeList.item(i);
+ String lstrClassId = ParserUtil.parseString("id", lNode );
+ String lstrClassName = ParserUtil.parseString("name", lNode );
+ String lstrClassDesc = ParserUtil.parseString("description", lNode );
+ String lstrStatus = ParserUtil.parseString("status", lNode );
+ // Take only active classification
+ if( "1".equals( lstrStatus ) )
+ {
+ Classification lClassification = new Classification();
+ lClassification.setId( lstrClassId );
+ lClassification.setName( lstrClassName );
+ lClassification.setDescription( lstrClassDesc );
+ lClassifications.add( lClassification );
+ }
+ }
+ XMLDBService.updateClassifications( lClassifications );
+ return lClassifications;
+ }
+ }
+ catch (FSHelperException e)
+ {
+ throw e;
+ }
+ return null;
+ }
+
+ public static String unwrapFile(String pFileLocation) throws FSHelperException
+ {
+ ProtectedFile lProtectedFile = Global.getFSTenant().unwrap(pFileLocation);
+ return lProtectedFile.getFilePath();
+ }
+
+ public static void unprotectFile(String pFileLocation, String pDispFileName) throws FSHelperException
+ {
+ Global.getFSTenant().unprotectX(null, pFileLocation, pDispFileName, "" );
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/util/xml/XMLDBService.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/util/xml/XMLDBService.java
new file mode 100755
index 0000000..d903020
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/util/xml/XMLDBService.java
@@ -0,0 +1,667 @@
+package com.seclore.sample.dms.util.xml;
+
+import java.io.File;
+import java.util.Collection;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+
+import com.seclore.sample.dms.config.SampleAppConfig;
+import com.seclore.sample.dms.constant.Constants;
+import com.seclore.sample.dms.core.AppData;
+import com.seclore.sample.dms.core.AppFile;
+import com.seclore.sample.dms.core.AppFolder;
+import com.seclore.sample.dms.core.Classification;
+import com.seclore.sample.dms.core.ClassificationData;
+import com.seclore.sample.dms.core.Owner;
+import com.seclore.sample.dms.core.UserRight;
+import com.seclore.sample.dms.core.master.AppRights;
+import com.seclore.sample.dms.core.master.AppUsers;
+import com.seclore.sample.dms.core.master.Rights;
+import com.seclore.sample.dms.core.master.User;
+import com.seclore.sample.dms.util.CommonUtil;
+import com.seclore.sample.dms.util.Global;
+import com.seclore.sample.dms.util.LoggerUtil;
+import com.seclore.sample.exceptions.DMSSampleException;
+public class XMLDBService
+{
+ private static AppData sAppData = null;
+ private static AppUsers sAppUsers = null;
+ private static AppRights sAppRights = null;
+ private static ClassificationData sClassificationData = null;
+
+ /**
+ * Initialize application data.
+ * @param pAppData
+ * @param pAppUsers
+ * @param pAppRights
+ */
+ public static void initializeAppData(AppData pAppData, AppUsers pAppUsers, AppRights pAppRights,
+ ClassificationData pClassificationData)
+ {
+ sAppData = pAppData;
+ sAppUsers = pAppUsers;
+ sAppRights = pAppRights;
+ sClassificationData = pClassificationData;
+ }
+
+ /**
+ * Return Map of rights,right id as key and Rights holds right id and name.
+ * @return Map
+ */
+ public static Map getAppRights()
+ {
+ return sAppRights.getRightsMap();
+ }
+
+ /**
+ * Return Map of users,user id as key and User holds user id and name.
+ * @return
+ */
+ public static Map getAppUsers()
+ {
+ return sAppUsers.getUserMap();
+ }
+
+ /**
+ * Get user by given user id (email id).
+ * @return
+ */
+ public static User getAppUserById(String userId)
+ {
+ return sAppUsers.getUserMap().get(userId);
+ }
+
+ /**
+ * Save new user
+ * @return
+ */
+ public static boolean addNewAppUser(String pUserId, String pName)
+ {
+ if( pUserId == null || pUserId.trim().isEmpty() )
+ {
+ return false;
+ }
+ if( pName == null || pName.trim().isEmpty())
+ {
+ return false;
+ }
+
+ User lUser = new User();
+ lUser.setId(pUserId);
+ lUser.setName(pName);
+ synchronized (sAppUsers)
+ {
+ sAppUsers.getUserMap().put(pUserId, lUser);
+ boolean isSaved = XMLDataUtil.updateAppUsers(sAppUsers);
+ if( isSaved == false )
+ {
+ sAppUsers.getUserMap().remove(pUserId);
+ }
+ return isSaved;
+ }
+
+ }
+
+ public static boolean updateAppUser(String pUserId, String pName)
+ {
+ if( pUserId == null || pUserId.trim().isEmpty() )
+ {
+ return false;
+ }
+ if( pName == null || pName.trim().isEmpty())
+ {
+ return false;
+ }
+
+ User lUser = getAppUserById(pUserId);
+ String lstrOldName = lUser.getName();
+ lUser.setName(pName);
+ synchronized (sAppUsers)
+ {
+ sAppUsers.getUserMap().put(pUserId, lUser);
+ boolean isSaved = XMLDataUtil.updateAppUsers(sAppUsers);
+ if( isSaved == false )
+ {
+ lUser.setName(lstrOldName);
+ sAppUsers.getUserMap().remove(pUserId);
+ }
+ return isSaved;
+ }
+
+ }
+
+ public static boolean deleteAppUser(String pUserId)
+ {
+ if( pUserId == null || pUserId.trim().isEmpty() )
+ {
+ return false;
+ }
+
+ User lUser = getAppUserById(pUserId);
+
+ synchronized (sAppUsers)
+ {
+ sAppUsers.getUserMap().remove(pUserId);
+ boolean isSaved = XMLDataUtil.updateAppUsers(sAppUsers);
+ if( isSaved == false )
+ {
+ sAppUsers.getUserMap().put(pUserId, lUser);
+ }
+ return isSaved;
+ }
+
+ }
+
+ /**
+ * @return
+ */
+ public static Collection getFolderList()
+ {
+ return sAppData.getFolderMap().values();
+ }
+
+
+ /**
+ * Get folder instance of given folder Id.
+ * @param folderId
+ * @return AppFolder
+ */
+ public static AppFolder getFolder(String folderId)
+ {
+ AppFolder appFolder = sAppData.getFolderMap().get( folderId );
+ return appFolder;
+
+ }
+
+ /**
+ * Get all files of given folder Id.
+ * @param folderId
+ * @return Collection
+ */
+ public static Collection getFileList(String folderId)
+ {
+ AppFolder appFolder = getFolder(folderId);
+ if(appFolder == null)
+ {
+ return null;
+ }
+ return appFolder.getFileMap().values();
+ }
+
+ /**
+ * Get file for given Id.
+ * @param folderId
+ * @param fileId
+ * @return Boolean
+ */
+ public static AppFile getFile(String folderId, String fileId)
+ {
+ AppFolder appFolder = getFolder(folderId);
+ if( appFolder == null )
+ {
+ return null;
+ }
+
+ return appFolder.getFileMap().get( fileId );
+ }
+
+
+ /**
+ * Create new folder.
+ * @param pAppFolder
+ * @return Boolean
+ */
+ public static boolean createNewFolder(AppFolder pAppFolder)
+ {
+ if( pAppFolder == null )
+ {
+ return false;
+ }
+
+ String folderId = UUID.randomUUID().toString();
+ String folderPath = Global.getAppDataDir()+ File.separator + folderId;
+
+ File lfile = new File(folderPath);
+ if ( !lfile.mkdirs() )
+ {
+ return false;
+ }
+
+ pAppFolder.setId( folderId );
+
+ synchronized (sAppData)
+ {
+ sAppData.getFolderMap().put( pAppFolder.getId(), pAppFolder ) ;
+ boolean isSaved = XMLDataUtil.updateAppData(sAppData);
+ if( isSaved == false )
+ {
+ sAppData.getFolderMap().remove(pAppFolder.getId());
+ lfile.delete();
+ pAppFolder.setId(null);
+
+ // Delete created folder
+ if ( lfile.exists() )
+ {
+ try
+ {
+ lfile.delete();
+ }
+ catch(SecurityException se )
+ {
+ // Ignore
+ }
+ }
+
+ }
+ return isSaved;
+ }
+
+ }
+
+ /**
+ * Update the folder.
+ * @param pFolder
+ * @return Boolean
+ */
+ public static boolean updateFolder(AppFolder pFolder)
+ {
+ if( pFolder == null )
+ {
+ return false;
+ }
+ synchronized (sAppData)
+ {
+ AppFolder existingFolder = XMLDBService.getFolder( pFolder.getId() );
+ String oldName = existingFolder.getName();
+ Boolean isIrmEnabled = existingFolder.getIrmEnabled();
+
+ existingFolder.setName( pFolder.getName() );
+ existingFolder.setIrmEnabled( pFolder.getIrmEnabled() );
+ String folderPath = Global.getAppDataDir()+ File.separator + pFolder.getId();
+
+ File lfile = new File(folderPath);
+ if ( !lfile.exists() )
+ {
+ lfile.mkdirs();
+ }
+
+
+ boolean isSaved = XMLDataUtil.updateAppData(sAppData);
+ if( isSaved == false )
+ {
+ existingFolder.setName( oldName );
+ existingFolder.setIrmEnabled( isIrmEnabled );
+ }
+ return isSaved;
+ }
+
+ }
+
+ /**
+ * Delete the folder.
+ * @param pFolder
+ * @return Boolean
+ */
+ public static boolean deleteFolder(AppFolder pFolder)
+ {
+ if( pFolder == null )
+ {
+ return false;
+ }
+
+ String folderPath = Global.getAppDataDir() + File.separator + pFolder.getId();
+
+ synchronized (sAppData)
+ {
+ sAppData.getFolderMap().remove(pFolder.getId());
+ boolean isSaved = XMLDataUtil.updateAppData(sAppData);
+ if( isSaved == false )
+ {
+ sAppData.getFolderMap().put(pFolder.getId(), pFolder);
+ }
+ else
+ {
+ File lfile = new File(folderPath);
+ deleteFolder(lfile);
+ }
+ return isSaved;
+ }
+ }
+
+ /**
+ * Add new file in given folder.
+ * @param folderId - Folder Id in which new file will be created.
+ * @param pNewFile - New AppFile instance
+ * @return Boolean
+ */
+ public static boolean addNewFile(String folderId, AppFile pNewFile )
+ {
+ AppFolder folder = XMLDBService.getFolder(folderId);
+ if( folder == null )
+ {
+ return false;
+ }
+
+ synchronized (sAppData)
+ {
+ folder.getFileMap().put( pNewFile.getId(), pNewFile );
+ boolean isSaved = XMLDataUtil.updateAppData(sAppData);
+ if( isSaved == false)
+ {
+ folder.getFileMap().remove( pNewFile.getId() );
+ pNewFile.setId(null);
+ String filePath = Global.getAppDataDir() + File.separator + folderId
+ + File.separator + pNewFile.getName();
+
+ File lFile = new File(filePath);
+ if( lFile.exists() )
+ {
+ lFile.delete();
+ }
+ }
+ return isSaved;
+ }
+ }
+
+ /**
+ * Update file. Not implemented yet.
+ * @param folderId Folder Id in which file will be stored.
+ * @param pUpdatedFile
+ * @return Boolean
+ */
+ public static boolean updateFile(String folderId, AppFile pUpdatedFile)
+ {
+ AppFile lExistingFile = XMLDBService.getFile(folderId, pUpdatedFile.getId() );
+ if( lExistingFile == null )
+ {
+ return false;
+ }
+
+ synchronized (sAppData)
+ {
+ Set oldUserRightList = lExistingFile.getUserRightList();
+ Set oldBlacklistedCountries = lExistingFile.getBlacklistedCountries();
+ Owner oldOwner = lExistingFile.getOwner();
+ Classification oldClassification = lExistingFile.getClassification();
+
+ lExistingFile.setUserRightList( pUpdatedFile.getUserRightList() );
+ lExistingFile.setBlacklistedCountries(pUpdatedFile.getBlacklistedCountries() );
+ lExistingFile.setOwner( pUpdatedFile.getOwner() );
+ lExistingFile.setClassification( pUpdatedFile.getClassification() );
+ boolean isSaved = XMLDataUtil.updateAppData(sAppData);
+ if( isSaved == false)
+ {
+ lExistingFile.setUserRightList( oldUserRightList );
+ lExistingFile.setBlacklistedCountries( oldBlacklistedCountries );
+ lExistingFile.setOwner( oldOwner );
+ lExistingFile.setClassification( oldClassification );
+ }
+ return isSaved;
+ }
+ }
+
+ /**
+ * Update users and their rights for given file.
+ * @param folderId Folder Id from which file belongs.
+ * @param pFile File id for which users and right will be changed.
+ * @return Boolean
+ */
+ public static boolean updateUsersRightsOnFile(String folderId, String fileId, Set newUserRights)
+ {
+ AppFile lFile = XMLDBService.getFile(folderId,fileId);
+
+ if( lFile == null )
+ {
+ return false;
+ }
+
+ synchronized (sAppData)
+ {
+ Set oldUserRightList = lFile.getUserRightList();
+ lFile.setUserRightList( newUserRights );
+ boolean isSaved = XMLDataUtil.updateAppData(sAppData);
+ if( isSaved == false)
+ {
+ lFile.setUserRightList(oldUserRightList);
+ }
+ return isSaved;
+ }
+ }
+
+
+
+
+ /**
+ * Delete the file.
+ * @param folderId
+ * @param pFile
+ * @return
+ */
+ public static boolean deleteFile(String folderId, AppFile pFile)
+ {
+ AppFolder folder = XMLDBService.getFolder(folderId);
+ if( folder == null )
+ {
+ return false;
+ }
+
+ synchronized (sAppData)
+ {
+ folder.getFileMap().remove( pFile.getId() );
+ boolean isSaved = XMLDataUtil.updateAppData(sAppData);
+ if( isSaved == false)
+ {
+ folder.getFileMap().put( pFile.getId(), pFile );
+ }
+ else
+ {
+ String filePath = Global.getAppDataDir() + File.separator + folderId + File.separator + pFile.getName();
+
+ File lFile = new File(filePath);
+ if( lFile.exists() )
+ {
+ lFile.delete();
+ }
+ }
+ return isSaved;
+ }
+ }
+
+ /**
+ * Get usages rights for given file and user.
+ * @param userId
+ * @param emailId
+ * @param folderId
+ * @param fileId
+ * @return Integer usage rights value.
+ */
+ public static Integer getUserRights(String userId, String emailId, String folderId, String fileId)
+ {
+
+ AppFile lFile = XMLDBService.getFile(folderId, fileId);
+ if( lFile == null )
+ {
+ // File does not exist
+ return Constants.FILE_NOT_EXIST;
+ }
+
+ Set usersRights = lFile.getUserRightList();
+ if(usersRights == null)
+ {
+ // No user has rights to the file
+ return Constants.NO_RIGHTS;
+ }
+
+ for( UserRight userRight : usersRights )
+ {
+ // Check both userId and email, because in this Sample application we can put email id or other value for user identifier.
+ // It depends on Client's Application.
+ // Policy Server will pass user's ext id and email id.
+
+ if( userRight.getUserId().equals(userId) || userRight.getUserId().equals(emailId) )
+ {
+ Integer right = userRight.getUsageRights();
+ if( right == null)
+ {
+ return Constants.NO_RIGHTS;
+ }
+ return right;
+ }
+ }
+
+ return Constants.NO_RIGHTS;
+ }
+
+
+ public static boolean isCountryBlackListed(String pCountryCode, String folderId, String fileId)
+ {
+
+ if(SampleAppConfig.isLocationBasedFeatureEnabled() == false)
+ {
+ return false;
+ }
+ if( pCountryCode == null || pCountryCode.trim().isEmpty())
+ {
+ return false;
+ }
+ AppFile lFile = XMLDBService.getFile(folderId, fileId);
+ if( lFile == null )
+ {
+ // File does not exist
+ return false;
+ }
+ if(lFile.getBlacklistedCountries() == null)
+ {
+ return false;
+ }
+ return lFile.getBlacklistedCountries().contains(pCountryCode);
+ }
+
+ public static void deleteFolder(File pFolder)
+ {
+ if(pFolder == null)
+ {
+ return;
+ }
+
+ // Delete folder
+ if ( pFolder.exists() )
+ {
+ File[] files = pFolder.listFiles();
+ if( files != null & files.length > 0)
+ {
+ for( File f: files )
+ {
+ if( f.isDirectory() )
+ {
+ deleteFolder(f);
+ }
+ else
+ {
+ try{
+ f.delete();
+ }
+ catch(SecurityException se ){ }
+ }
+ }
+ }
+
+ try
+ {
+ pFolder.delete();
+ }
+ catch(SecurityException se )
+ {
+ // Ignore
+ }
+ }
+ }
+
+ public static Set getClassifications()
+ {
+ return sClassificationData.getClassifications();
+ }
+
+ public static boolean updateClassifications( Set pClassifications)
+ {
+ synchronized (sClassificationData)
+ {
+ sClassificationData.setClassifications(pClassifications);
+ return XMLDataUtil.updateClassificationData( sClassificationData );
+ }
+ }
+
+ public static Classification getClassification(String liClasifn)
+ {
+ Set lsetClasifn = sClassificationData.getClassifications();
+ for ( Classification classification : lsetClasifn )
+ {
+ if( classification.getId().equals(liClasifn) )
+ {
+ return classification;
+ }
+ }
+ return null;
+ }
+
+ public static AppFile getAppFileFromFileToken(String pFileToken) throws DMSSampleException
+ {
+ if(pFileToken == null || pFileToken.trim().isEmpty())
+ {
+ return null;
+ }
+ // FileToken = FolderID:FileID:ViewsAtTheTimeOfUpload
+ String[] lTokens = pFileToken.split(":");
+ if(lTokens.length != 3)
+ {
+ throw new DMSSampleException("Invalid File Token");
+ }
+ return getFile(lTokens[0], lTokens[1]);
+ }
+
+ public static AppFolder getAppFolderFromFileToken(String pFileToken)
+ throws DMSSampleException
+ {
+ if(pFileToken == null || pFileToken.trim().isEmpty())
+ {
+ return null;
+ }
+ // FileToken = FolderID:FileID:ViewsAtTheTimeOfUpload
+ String[] lTokens = pFileToken.split(":");
+ if(lTokens.length != 3)
+ {
+ throw new DMSSampleException("Invalid File Token");
+ }
+ return getFolder(lTokens[0]);
+ }
+
+ public static boolean whetherFileTokenExists(String pFileToken)
+ {
+ if(CommonUtil.isEmptyString(pFileToken)) return false;
+
+ String[] lTokens = pFileToken.split(":");
+ if(lTokens.length != 3)
+ {
+ return false;
+ }
+
+ if( getFile(lTokens[0], lTokens[1]) == null ) return false;
+
+ return true;
+ }
+
+ public static String getPhysicalFileLocation(AppFolder pAppFolder, AppFile pAppFile) throws DMSSampleException
+ {
+ if(pAppFolder == null || pAppFile == null)
+ {
+ LoggerUtil.logError("AppFolder or Appfile is found null in getPhysicalFileLocation()");
+ throw new DMSSampleException("AppFolder or Appfile is found null in getPhysicalFileLocation()");
+ }
+
+ String lFilePath = Global.getAppDataDir() + File.separator + pAppFolder.getId()
+ + File.separator + pAppFile.getName();
+
+ return lFilePath;
+ }
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/util/xml/XMLDataUtil.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/util/xml/XMLDataUtil.java
new file mode 100755
index 0000000..bd4ada7
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/util/xml/XMLDataUtil.java
@@ -0,0 +1,369 @@
+package com.seclore.sample.dms.util.xml;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+
+import com.seclore.sample.dms.core.AppData;
+import com.seclore.sample.dms.core.AppFile;
+import com.seclore.sample.dms.core.ClassificationData;
+import com.seclore.sample.dms.core.master.AppRights;
+import com.seclore.sample.dms.core.master.AppUsers;
+import com.seclore.sample.dms.util.Global;
+import com.seclore.sample.dms.util.LoggerUtil;
+
+public class XMLDataUtil
+{
+
+ private static final String APP_DATA_PATH = "data"+File.separator+"AppDataDB.xml";
+ private static final String APP_USERS_PATH = "data"+File.separator+"UserMaster.xml";
+ private static final String APP_RIGHTS_PATH = "data"+File.separator+"RightsMaster.xml";
+ private static final String APP_CLASSIFICATION_PATH = "data"+File.separator+"Classification.xml";
+
+ private static Marshaller sAppDataMarshaller = null;
+ private static Marshaller sAppUsersMarshaller = null;
+ private static Marshaller sClassificationDataMarshaller = null;
+
+ public static void initializeAppData(String appPath)
+ {
+ // Initialize sample application data
+ AppData lAppData = loadAppData(appPath);
+
+ // Initialize sample application users
+ AppUsers lAppUsers = loadAppUsers(appPath);
+
+ //Initialize sample application rights
+ AppRights lAppRights = loadAppRights(appPath);
+
+ //Initialize classifications
+ ClassificationData lClassificationData = loadClassificationData( appPath );
+
+ XMLDBService.initializeAppData( lAppData, lAppUsers, lAppRights, lClassificationData );
+ }
+
+ /**
+ * Initialize sample application rights
+ * @param appPath
+ * @return
+ */
+ private static AppRights loadAppRights(String appPath)
+ {
+ AppRights lAppRights = null;
+ FileInputStream inputStream = null;
+ try
+ {
+ JAXBContext jaxbContext = JAXBContext.newInstance(AppRights.class);
+ Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
+ inputStream = new FileInputStream(appPath + File.separator + APP_RIGHTS_PATH);
+ lAppRights = (AppRights) jaxbUnmarshaller.unmarshal(inputStream);
+ }
+ catch(JAXBException jaxbException)
+ {
+ jaxbException.printStackTrace();
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace();
+ }
+ finally
+ {
+ if( lAppRights == null)
+ {
+ lAppRights = new AppRights();
+ }
+
+ if(inputStream != null)
+ {
+ try {
+ inputStream.close();
+ } catch (IOException e) {
+ // Ignore
+ }
+ }
+ }
+
+ return lAppRights;
+ }
+
+ /**
+ * Initialize sample application users
+ * @param appPath
+ * @return
+ */
+ private static AppUsers loadAppUsers(String appPath)
+ {
+ AppUsers lAppUsers = null;
+ FileInputStream inputStream = null;
+ try
+ {
+ JAXBContext jaxbContext = JAXBContext.newInstance(AppUsers.class);
+ Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
+ inputStream = new FileInputStream(appPath + File.separator + APP_USERS_PATH);
+ lAppUsers = (AppUsers) jaxbUnmarshaller.unmarshal(inputStream);
+ }
+ catch(JAXBException jaxbException)
+ {
+ jaxbException.printStackTrace();
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace();
+ }
+ finally
+ {
+ if( lAppUsers == null)
+ {
+ lAppUsers = new AppUsers();
+ }
+
+ if(inputStream != null)
+ {
+ try {
+ inputStream.close();
+ } catch (IOException e) {
+ // Ignore
+ }
+ }
+ }
+ return lAppUsers;
+ }
+
+
+ /**
+ * Initialize sample application data
+ * @param appPath
+ * @return
+ */
+ private static AppData loadAppData(String appPath)
+ {
+ AppData lAppData = null;
+ InputStream inputStream = null;
+ try
+ {
+ JAXBContext jaxbContext = JAXBContext.newInstance(AppData.class);
+ Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
+ inputStream = new FileInputStream(appPath + File.separator + APP_DATA_PATH);
+ lAppData = (AppData) jaxbUnmarshaller.unmarshal(inputStream);
+ }
+ catch(FileNotFoundException lFileNotFoundException)
+ {
+ // lFileNotFoundException.printStackTrace();
+ }
+ catch(JAXBException jaxbException)
+ {
+ jaxbException.printStackTrace();
+ LoggerUtil.logError("Error while loading AppData", jaxbException);
+ }
+ finally
+ {
+ if( lAppData == null)
+ {
+ lAppData = new AppData();
+ }
+
+ if(inputStream != null)
+ {
+ try {
+ inputStream.close();
+ } catch (IOException e) {
+ // Ignore
+ }
+ }
+ }
+ return lAppData;
+ }
+
+
+ /**
+ * Update AppDataDB.xml
+ * @param pAppData
+ * @return
+ */
+ public static boolean updateAppData(AppData pAppData)
+ {
+ OutputStream outputStream = null;
+ try
+ {
+ if ( sAppDataMarshaller == null )
+ {
+ JAXBContext jaxbContext = JAXBContext.newInstance(AppData.class);
+ sAppDataMarshaller = jaxbContext.createMarshaller();
+ }
+ outputStream = new FileOutputStream(Global.getAppRealPath() + File.separator + APP_DATA_PATH);
+ sAppDataMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
+ sAppDataMarshaller.marshal(pAppData, outputStream);
+ return true;
+ }
+ catch(JAXBException jaxbException)
+ {
+ LoggerUtil.logError("Error while updating AppData", jaxbException);
+ jaxbException.printStackTrace();
+ }
+ catch (IOException e)
+ {
+ LoggerUtil.logError("Error while updating AppData", e);
+ e.printStackTrace();
+ }
+ finally
+ {
+ if(outputStream != null)
+ {
+ try {
+ outputStream.flush();
+ } catch (IOException e1) {
+ // Ignore
+ }
+
+ try {
+ outputStream.close();
+ } catch (IOException e) {
+ // Ignore
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Update UserMaster.xml
+ * @param pAppUsers
+ * @return
+ */
+ public static boolean updateAppUsers(AppUsers pAppUsers)
+ {
+ OutputStream outputStream = null;
+ try
+ {
+ if ( sAppUsersMarshaller == null )
+ {
+ JAXBContext jaxbContext = JAXBContext.newInstance(AppUsers.class);
+ sAppUsersMarshaller = jaxbContext.createMarshaller();
+ }
+ outputStream = new FileOutputStream(Global.getAppRealPath() + File.separator + APP_USERS_PATH);
+ sAppUsersMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
+ sAppUsersMarshaller.marshal(pAppUsers, outputStream);
+ return true;
+ }
+ catch(JAXBException jaxbException)
+ {
+ LoggerUtil.logError("Error while updating AppUsers", jaxbException);
+ jaxbException.printStackTrace();
+ }
+ catch (IOException e)
+ {
+ LoggerUtil.logError("Error while updating AppUsers", e);
+ e.printStackTrace();
+ }
+ finally
+ {
+ if(outputStream != null)
+ {
+ try {
+ outputStream.flush();
+ } catch (IOException e1) {
+ // Ignore
+ }
+
+ try {
+ outputStream.close();
+ } catch (IOException e) {
+ // Ignore
+ }
+ }
+ }
+ return false;
+ }
+
+ private static ClassificationData loadClassificationData(String appPath)
+ {
+ ClassificationData lClassificationData = null;
+ InputStream inputStream = null;
+ try
+ {
+ JAXBContext jaxbContext = JAXBContext.newInstance(ClassificationData.class);
+ Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
+ inputStream = new FileInputStream(appPath + File.separator + APP_CLASSIFICATION_PATH);
+ lClassificationData = (ClassificationData) jaxbUnmarshaller.unmarshal(inputStream);
+ }
+ catch(FileNotFoundException lFileNotFoundException)
+ {
+ // lFileNotFoundException.printStackTrace();
+ }
+ catch(JAXBException jaxbException)
+ {
+ jaxbException.printStackTrace();
+ LoggerUtil.logError("Error while loading AppData", jaxbException);
+ }
+ finally
+ {
+ if( lClassificationData == null)
+ {
+ lClassificationData = new ClassificationData();
+ }
+
+ if(inputStream != null)
+ {
+ try {
+ inputStream.close();
+ } catch (IOException e) {
+ // Ignore
+ }
+ }
+ }
+ return lClassificationData;
+ }
+
+ public static boolean updateClassificationData( ClassificationData pClassificationData )
+ {
+ OutputStream outputStream = null;
+ try
+ {
+ if ( sClassificationDataMarshaller == null )
+ {
+ JAXBContext jaxbContext = JAXBContext.newInstance(ClassificationData.class);
+ sClassificationDataMarshaller = jaxbContext.createMarshaller();
+ }
+ outputStream = new FileOutputStream(Global.getAppRealPath() + File.separator + APP_CLASSIFICATION_PATH);
+ sClassificationDataMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
+ sClassificationDataMarshaller.marshal(pClassificationData, outputStream);
+ return true;
+ }
+ catch(JAXBException jaxbException)
+ {
+ LoggerUtil.logError("Error while updating ClassificationData", jaxbException);
+ jaxbException.printStackTrace();
+ }
+ catch (IOException e)
+ {
+ LoggerUtil.logError("Error while updating ClassificationData", e);
+ e.printStackTrace();
+ }
+ finally
+ {
+ if(outputStream != null)
+ {
+ try {
+ outputStream.flush();
+ } catch (IOException e1) {
+ // Ignore
+ }
+
+ try {
+ outputStream.close();
+ } catch (IOException e) {
+ // Ignore
+ }
+ }
+ }
+ return false;
+ }
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/version/Version.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/version/Version.java
new file mode 100755
index 0000000..261e2df
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/dms/version/Version.java
@@ -0,0 +1,16 @@
+package com.seclore.sample.dms.version;
+
+public class Version
+{
+ private static String SAMPLE_APP_VERSION = "3.0.0.0";
+
+ public static String getSampleAppVersion()
+ {
+ return SAMPLE_APP_VERSION;
+ }
+
+ public static void main(String[] args)
+ {
+ System.out.println("DMS Sample App Version: "+SAMPLE_APP_VERSION);
+ }
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/exceptions/AppFileNotFoundException.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/exceptions/AppFileNotFoundException.java
new file mode 100755
index 0000000..4202cce
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/exceptions/AppFileNotFoundException.java
@@ -0,0 +1,19 @@
+package com.seclore.sample.exceptions;
+
+/**
+ * This exception is used whenever a App File not found.
+ *
+ */
+public class AppFileNotFoundException extends DMSSampleException
+{
+
+ private static final long serialVersionUID = 1L;
+
+
+ public AppFileNotFoundException(String pMessage)
+ {
+ super(pMessage);
+ }
+
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/exceptions/AppFolderNotFoundException.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/exceptions/AppFolderNotFoundException.java
new file mode 100755
index 0000000..24b529c
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/exceptions/AppFolderNotFoundException.java
@@ -0,0 +1,17 @@
+package com.seclore.sample.exceptions;
+
+/**
+ *This exception is used whenever a App Folder not found.
+ */
+public class AppFolderNotFoundException extends DMSSampleException
+{
+
+ private static final long serialVersionUID = 1L;
+
+ public AppFolderNotFoundException(String pMessage)
+ {
+ super(pMessage);
+ }
+
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/exceptions/DMSSampleException.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/exceptions/DMSSampleException.java
new file mode 100755
index 0000000..a7fead9
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/exceptions/DMSSampleException.java
@@ -0,0 +1,42 @@
+package com.seclore.sample.exceptions;
+
+/**
+ * Main Exception class for the App.
+ *
+ */
+public class DMSSampleException extends Exception
+{
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * If this URL is set, the catch can forward the request to this URL.
+ */
+ private String mstrErrorURL;
+
+ public DMSSampleException(String pMessage)
+ {
+ super(pMessage);
+ }
+
+ public DMSSampleException(String pMessage, String pURL)
+ {
+ super(pMessage);
+ this.mstrErrorURL = pURL;
+ }
+
+ public DMSSampleException(String pDisplayMessage, Throwable pCause)
+ {
+ super(pDisplayMessage, pCause);
+ }
+
+ public String getRedirectURL()
+ {
+ return mstrErrorURL;
+ }
+
+ public void setRedirectURL(String redirectURL)
+ {
+ mstrErrorURL = redirectURL;
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/exceptions/FileDetailsNotFoundException.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/exceptions/FileDetailsNotFoundException.java
new file mode 100755
index 0000000..be4065e
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/exceptions/FileDetailsNotFoundException.java
@@ -0,0 +1,15 @@
+package com.seclore.sample.exceptions;
+
+/**
+ *This exception is used whenever a token is not found in repository.
+ */
+public class FileDetailsNotFoundException extends DMSSampleException
+{
+ private static final long serialVersionUID = 1L;
+
+ public FileDetailsNotFoundException(String pMessage)
+ {
+ super(pMessage);
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/ps/db/DBConnection.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/ps/db/DBConnection.java
new file mode 100755
index 0000000..fc8c69f
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/ps/db/DBConnection.java
@@ -0,0 +1,370 @@
+package com.seclore.sample.ps.db;
+
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Timestamp;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+import javax.sql.DataSource;
+
+import com.seclore.sample.dms.core.FileActivityLog;
+import com.seclore.sample.dms.core.FileOpenTimeLog;
+import com.seclore.sample.dms.util.CommonUtil;
+import com.seclore.sample.dms.util.LoggerUtil;
+
+public class DBConnection
+{
+
+ private static final String mstrDATASOURCE_CONTEXT_NAME = "java:comp/env/jdbc/filesecure";
+
+ private static Connection getDBConnection() throws NamingException
+ {
+ String mstrDataSourceContext = mstrDATASOURCE_CONTEXT_NAME;
+
+ Connection conn = null;
+ try
+ {
+ Context initialContext = new InitialContext();
+ DataSource datasource = (DataSource)initialContext.lookup(mstrDataSourceContext);
+ if(datasource != null)
+ {
+ conn = datasource.getConnection();
+ }
+ else
+ {
+ LoggerUtil.logError("Data base source not found");
+ }
+ }
+ catch(NamingException ex)
+ {
+ throw ex;
+ }
+ catch (SQLException e)
+ {
+ LoggerUtil.logError("DBConnection :: getDBConnection :: error while getting db connection.", e);
+ }
+
+ return conn;
+ }
+
+ public static List getFileLogsByFileId(String pFileId, boolean pGetOnlyOpenActivities)
+ {
+ Connection conn = null;
+ PreparedStatement st = null;
+ ResultSet rs = null;
+ List lliFileActivityLog = null;
+ try
+ {
+ conn = getDBConnection();
+ DatabaseMetaData lMetaData = conn.getMetaData();
+ String lstrDBUrl = lMetaData.getURL();
+
+ String mstrQuery;
+
+ if( lstrDBUrl.contains("jdbc:sqlserver:") )
+ {
+ //For MSSQL
+ mstrQuery = "SELECT TOP 20 FILE_EXT_REF_ID, ID, USER_QID, ACTIVITY_DATE, ACTIVITY, AUTHORIZED, ONLINE_MODE, CLID_DESCRIPTION, CURRENT_FILE_NAME, REQUEST_IP_ADDRESS FROM EXTFILEUSERACTIVITYVIEW "
+ + " WHERE FILE_EXT_REF_ID =? " + (pGetOnlyOpenActivities==true?"AND ACTIVITY IN (2,8,9,13)":"")
+ + " ORDER BY ID DESC";
+ }
+ else
+ {
+ //For ORACLE
+ mstrQuery = "SELECT * FROM ( SELECT FILE_EXT_REF_ID, ID, USER_QID, ACTIVITY_DATE, ACTIVITY, AUTHORIZED, ONLINE_MODE, CLID_DESCRIPTION, CURRENT_FILE_NAME, REQUEST_IP_ADDRESS FROM EXTFILEUSERACTIVITYVIEW WHERE FILE_EXT_REF_ID =? "+ (pGetOnlyOpenActivities==true?"AND ACTIVITY IN (2,8,9,13)":"") +" ORDER BY ID DESC) WHERE rownum <= 20";
+ }
+ //String mstrQuery = "SELECT FILE_EXT_REF_ID, ID, USER_QID, ACTIVITY_DATE, ACTIVITY, AUTHORIZED, ONLINE_MODE, CLID_DESCRIPTION, CURRENT_FILE_NAME FROM EXTFILEUSERACTIVITYVIEW WHERE FILE_EXT_REF_ID =? AND ROWNUM <= 20 ORDER BY ID DESC";
+ st = conn.prepareStatement(mstrQuery);
+
+ st.setString(1,pFileId);
+
+ rs = st.executeQuery();
+
+ lliFileActivityLog = new ArrayList();
+ FileActivityLog mFileActivityLog;
+ while(rs.next())
+ {
+ mFileActivityLog = new FileActivityLog();
+
+ long activityId = rs.getLong("ID");
+ mFileActivityLog.setActivityId(activityId);
+
+ String userQid = rs.getString("USER_QID");
+ mFileActivityLog.setUserQID(userQid);
+ String userName = getUserNameByUserQid(userQid);
+ mFileActivityLog.setUser(userName);
+
+ Timestamp timestamp = rs.getTimestamp("ACTIVITY_DATE");
+ String accessTime = new SimpleDateFormat("dd MMM yyyy, HH:mm:ss").format(timestamp);
+ mFileActivityLog.setTimestamp(accessTime);
+
+ int activity = rs.getInt("ACTIVITY");
+ mFileActivityLog.setActivity(activity);
+
+ int authorized = rs.getInt("AUTHORIZED");
+ mFileActivityLog.setAuthorized(authorized);
+
+ int mode = rs.getInt("ONLINE_MODE");
+ mFileActivityLog.setMode(mode);
+
+ String client = rs.getString("CLID_DESCRIPTION");
+ mFileActivityLog.setClient(client);
+
+ String currentFileName = rs.getString("CURRENT_FILE_NAME");
+
+ //Removing the 'html' extension if present.
+ //This is to provide consistency in file name display everywhere.
+ mFileActivityLog.setCurrentFileName( removeHTMLExtension(currentFileName));
+
+ String requestIPAddress = rs.getString("REQUEST_IP_ADDRESS");
+ mFileActivityLog.setRequestIPAddress(requestIPAddress);
+
+ lliFileActivityLog.add(mFileActivityLog);
+ }
+ }
+ catch (SQLException e)
+ {
+ LoggerUtil.logError("Error while fetching File Logs", e);
+ }
+ catch (NamingException e)
+ {
+ LoggerUtil.logError("Error while loading db resource", e);
+ }
+ finally
+ {
+ try
+ {
+ if(rs != null)
+ {
+ rs.close();
+ }
+ if(st != null)
+ {
+ st.close();
+ }
+ if(conn != null)
+ {
+ conn.close();
+ }
+ }
+ catch(SQLException e)
+ {
+ e.printStackTrace();
+ }
+ }
+ return lliFileActivityLog;
+
+ }
+
+
+ public static HashMap getFileOpenTime(String pFileId, List lliFileActivityLog)
+ {
+ Connection conn = null;
+ PreparedStatement st = null;
+ ResultSet rs = null;
+ HashMap lmapFileActivityLog = new HashMap();
+ HashSet lsetUniqueUserQids = new HashSet();
+ try
+ {
+ if(lliFileActivityLog == null)
+ {
+ return lmapFileActivityLog;
+ }
+ for(FileActivityLog lfal : lliFileActivityLog)
+ {
+ lsetUniqueUserQids.add(lfal.getUserQID());
+ }
+ conn = getDBConnection();
+ DatabaseMetaData lMetaData = conn.getMetaData();
+ String lstrDBUrl = lMetaData.getURL();
+ String mstrQuery;
+
+ if( lstrDBUrl.contains("jdbc:sqlserver:") )
+ {
+ //For MSSQL
+ mstrQuery = "WITH t AS ( SELECT * FROM EXTFILEUSERACTIVITYVIEW WHERE ACTIVITY IN (2,13,16) AND AUTHORIZED = 1 AND FILE_EXT_REF_ID = ?)\r\n" +
+ "SELECT a.FILE_ID, a.ID as OPEN_ACTIVITY_ID, a.ACTIVITY_DATE AS OPEN_TIMESTAMP,"
+ + " b.ID as CLOSE_ACTIVITY_ID, b.ACTIVITY_DATE AS CLOSE_TIMESTAMP,"
+ + " DATEDIFF ( minute , a.ACTIVITY_DATE, b.ACTIVITY_DATE ) AS OPEN_TIME "
+ + "FROM ( SELECT * FROM t WHERE ACTIVITY IN (2,13) AND ACTIVITY_DATE >= ( SELECT MAX(ACTIVITY_DATE) FROM t WHERE ACTIVITY IN (2,13) AND ACTIVITY_DATE < (SELECT MIN(ACTIVITY_DATE) FROM t WHERE ACTIVITY = 16))) a, "
+ + "( SELECT * FROM t WHERE ACTIVITY = 16 ) b "
+ + "WHERE b.ACTIVITY_DATE = (select MIN(ACTIVITY_DATE) from t where ACTIVITY = 16 AND ACTIVITY_DATE > a.ACTIVITY_DATE) "
+ + "AND a.USER_QID = b.USER_QID AND a.CLID_DESCRIPTION = b.CLID_DESCRIPTION AND a.CURRENT_FILE_NAME = b.CURRENT_FILE_NAME";
+ }
+ else
+ {
+ //For ORACLE
+ mstrQuery = "WITH t AS ( SELECT * FROM EXTFILEUSERACTIVITYVIEW WHERE ACTIVITY IN (2,13,16) AND AUTHORIZED = 1 AND FILE_EXT_REF_ID = ?)\r\n" +
+ "SELECT a.FILE_ID, a.ID as OPEN_ACTIVITY_ID, a.ACTIVITY_DATE AS OPEN_TIMESTAMP, "
+ + "b.ID as CLOSE_ACTIVITY_ID, b.ACTIVITY_DATE AS CLOSE_TIMESTAMP, "
+ + "ROUND((CAST(b.ACTIVITY_DATE AS DATE)- CAST(a.ACTIVITY_DATE AS DATE))*24*60) AS OPEN_TIME "
+ + "FROM ( SELECT * FROM t WHERE ACTIVITY IN (2,13) AND ACTIVITY_DATE >= ( SELECT MAX(ACTIVITY_DATE) FROM t WHERE ACTIVITY IN (2,13) AND ACTIVITY_DATE < ( SELECT MIN(ACTIVITY_DATE) FROM t WHERE ACTIVITY = 16) )) a,"
+ + " (SELECT * FROM t WHERE ACTIVITY = 16 ) b "
+ + "WHERE b.ACTIVITY_DATE = (select MIN(ACTIVITY_DATE) from t where ACTIVITY = 16 AND ACTIVITY_DATE > a.ACTIVITY_DATE)"
+ + " AND a.USER_QID = b.USER_QID AND a.CLID_DESCRIPTION = b.CLID_DESCRIPTION AND a.CURRENT_FILE_NAME = b.CURRENT_FILE_NAME";
+ }
+ LoggerUtil.logDebug("getFileOpenTime :: Query for file id '" +pFileId+"'");
+ //String mstrQuery = "SELECT FILE_EXT_REF_ID, ID, USER_QID, ACTIVITY_DATE, ACTIVITY, AUTHORIZED, ONLINE_MODE, CLID_DESCRIPTION, CURRENT_FILE_NAME FROM EXTFILEUSERACTIVITYVIEW WHERE FILE_EXT_REF_ID =? AND ROWNUM <= 20 ORDER BY ID DESC";
+ st = conn.prepareStatement(mstrQuery);
+
+ st.setString(1,pFileId);
+
+ rs = st.executeQuery();
+
+ FileOpenTimeLog lFileOpenTimeLog;
+ while(rs.next())
+ {
+ lFileOpenTimeLog = new FileOpenTimeLog();
+
+ long openActivityId = rs.getLong("OPEN_ACTIVITY_ID");
+ long closeActivityId = rs.getLong("CLOSE_ACTIVITY_ID");
+ Timestamp opentimestamp = rs.getTimestamp("OPEN_TIMESTAMP");
+ Timestamp closetimestamp = rs.getTimestamp("CLOSE_TIMESTAMP");
+ long openTime = rs.getLong("OPEN_TIME");
+
+ lFileOpenTimeLog.setOpenActivityID(openActivityId);
+ lFileOpenTimeLog.setCloseActivityID(closeActivityId);
+ lFileOpenTimeLog.setOpenTimeStamp(opentimestamp.toString());
+ lFileOpenTimeLog.setCloseTimeStamp(closetimestamp.toString());
+ lFileOpenTimeLog.setOpenTime(openTime);
+ lFileOpenTimeLog.setDisplayOpenTime(getDisplayTime(openTime));
+
+ lmapFileActivityLog.put(openActivityId+"", lFileOpenTimeLog);
+ }
+ }
+ catch (SQLException e)
+ {
+ LoggerUtil.logError("Error while fetching File Logs", e);
+ }
+ catch (NamingException e)
+ {
+ LoggerUtil.logError("Error while loading db resource", e);
+ }
+ finally
+ {
+ try
+ {
+ if(rs != null)
+ {
+ rs.close();
+ }
+ if(st != null)
+ {
+ st.close();
+ }
+ if(conn != null)
+ {
+ conn.close();
+ }
+ }
+ catch(SQLException e)
+ {
+ e.printStackTrace();
+ }
+ }
+ return lmapFileActivityLog;
+
+ }
+
+ private static String getDisplayTime(long pTime)
+ {
+ StringBuilder sb = new StringBuilder();
+ long hours = TimeUnit.MINUTES.toHours(pTime);
+ long mins = TimeUnit.MINUTES.toMinutes(pTime) - TimeUnit.HOURS.toMinutes(TimeUnit.MINUTES.toHours(pTime)) ;
+ if( TimeUnit.MINUTES.toMinutes(pTime) > 0)
+ {
+ if(hours != 0)
+ {
+ sb.append(hours + "hr ");
+ }
+ sb.append(mins + "min");
+ }
+ return sb.toString();
+ }
+
+ public static String getUserNameByUserQid(String pstrUserQid)
+ {
+ Connection conn = null;
+ PreparedStatement st = null;
+ ResultSet rs = null;
+ String lstrUserName = null;
+ try
+ {
+ conn = getDBConnection();
+
+
+ String mstrQuery = "SELECT NAME, OBJECT_QID FROM PSREPOSITORYOBJECTS WHERE OBJECT_QID = ?";
+
+ st = conn.prepareStatement(mstrQuery);
+
+ st.setString(1, pstrUserQid);
+
+ rs = st.executeQuery();
+
+ if(rs.next())
+ {
+ lstrUserName = rs.getString(1);
+ }
+ }
+ catch (SQLException e)
+ {
+ LoggerUtil.logError("Error while fetching User's Name", e);
+ }
+ catch (NamingException e)
+ {
+ LoggerUtil.logError("Error while loading db resource", e);
+ }
+ finally
+ {
+ try
+ {
+ if(rs != null)
+ {
+ rs.close();
+ }
+ if(st != null)
+ {
+ st.close();
+ }
+ if(conn != null)
+ {
+ conn.close();
+ }
+ }
+ catch(SQLException e)
+ {
+ e.printStackTrace();
+ }
+ }
+ return lstrUserName;
+ }
+
+ /**
+ * Removes .html extension if present.
+ * @param pFileName
+ * @return
+ */
+ private static String removeHTMLExtension(String pFileName)
+ {
+ if(CommonUtil.isEmptyString(pFileName)) return pFileName;
+
+ String lstrFileExtension = CommonUtil.getFileExtension(pFileName);
+
+ if(lstrFileExtension.equalsIgnoreCase("html"))
+ {
+ return pFileName.substring(0,pFileName.length()-5);
+ }
+ return pFileName;
+ }
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/webconnect/servlet/OpenFileServlet.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/webconnect/servlet/OpenFileServlet.java
new file mode 100755
index 0000000..57d2d85
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/webconnect/servlet/OpenFileServlet.java
@@ -0,0 +1,48 @@
+package com.seclore.sample.webconnect.servlet;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import com.seclore.sample.dms.util.CommonUtil;
+
+/**
+ * This servlet handle request to view the file using Seclore WebConnect
+ * Integration.
+ *
+ */
+@WebServlet(name = "openFileServlet", urlPatterns = { "/openFile.do" })
+public class OpenFileServlet extends HttpServlet {
+ private static final long serialVersionUID = 1L;
+ public static final String PS_FILE_OPEN_ACTION = "openfile";
+
+ public OpenFileServlet() {
+ super();
+ }
+
+ protected void doGet(HttpServletRequest request, HttpServletResponse response)
+ throws ServletException, IOException {
+ doPost(request, response);
+ }
+
+ /**
+ * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
+ * response)
+ */
+ protected void doPost(HttpServletRequest request, HttpServletResponse response)
+ throws ServletException, IOException {
+ HttpSession lSession = request.getSession();
+ String lstrEST = (String) lSession.getAttribute("est");
+ Boolean lstrHasLock = (Boolean) lSession.getAttribute("has_lock");
+ if (CommonUtil.isStringEmpty(lstrEST) || lstrHasLock == null) {
+ // TODO log
+ response.sendRedirect("");
+ }
+ request.getRequestDispatcher("/portal/pages/openFile.jsp").forward(request, response);
+ }
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/webconnect/servlet/PostChangeUserServlet.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/webconnect/servlet/PostChangeUserServlet.java
new file mode 100755
index 0000000..d384c43
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/webconnect/servlet/PostChangeUserServlet.java
@@ -0,0 +1,49 @@
+package com.seclore.sample.webconnect.servlet;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.seclore.sample.dms.config.SampleAppConfig;
+import com.seclore.sample.dms.util.CommonUtil;
+
+/**
+ * This servlet handle request to view the file using Seclore WebConnect
+ * Integration.
+ *
+ */
+@WebServlet(name = "postChangeUserContextServlet", urlPatterns = { "/updateuser.do" })
+public class PostChangeUserServlet extends HttpServlet {
+ private static final long serialVersionUID = 1L;
+ public static final String PS_FILE_OPEN_ACTION = "openfile";
+
+ public PostChangeUserServlet() {
+ super();
+ }
+
+ protected void doGet(HttpServletRequest request, HttpServletResponse response)
+ throws ServletException, IOException {
+ doPost(request, response);
+ }
+
+ /**
+ * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
+ * response)
+ */
+ protected void doPost(HttpServletRequest request, HttpServletResponse response)
+ throws ServletException, IOException {
+ String lNewUser = (String) request.getParameter("newUser");
+ if (CommonUtil.isStringEmpty(lNewUser)) {
+ request.getSession().setAttribute("ERROR_MESSAGE", "New user name cannot be empty.");
+ } else {
+ request.getSession().setAttribute("name", lNewUser);
+ SampleAppConfig.setDummyUserName(lNewUser);
+ }
+ response.sendRedirect("folderList.do");
+
+ }
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/webconnect/servlet/PreChangeUserServlet.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/webconnect/servlet/PreChangeUserServlet.java
new file mode 100755
index 0000000..1bdf9dc
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/webconnect/servlet/PreChangeUserServlet.java
@@ -0,0 +1,38 @@
+package com.seclore.sample.webconnect.servlet;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * This servlet handle request to view the file using Seclore WebConnect
+ * Integration.
+ *
+ */
+@WebServlet(name = "preChangeUserContextServlet", urlPatterns = { "/changeuser.do" })
+public class PreChangeUserServlet extends HttpServlet {
+ private static final long serialVersionUID = 1L;
+ public static final String PS_FILE_OPEN_ACTION = "openfile";
+
+ public PreChangeUserServlet() {
+ super();
+ }
+
+ protected void doGet(HttpServletRequest request, HttpServletResponse response)
+ throws ServletException, IOException {
+ doPost(request, response);
+ }
+
+ /**
+ * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
+ * response)
+ */
+ protected void doPost(HttpServletRequest request, HttpServletResponse response)
+ throws ServletException, IOException {
+ request.getRequestDispatcher("/portal/pages/changeUser.jsp").forward(request, response);
+ }
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/webconnect/servlet/ViewFileOnlineServlet.java b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/webconnect/servlet/ViewFileOnlineServlet.java
new file mode 100755
index 0000000..e68faf6
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/com/seclore/sample/webconnect/servlet/ViewFileOnlineServlet.java
@@ -0,0 +1,210 @@
+package com.seclore.sample.webconnect.servlet;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import com.seclore.sample.dms.config.SampleAppConfig;
+import com.seclore.sample.dms.core.AppFile;
+import com.seclore.sample.dms.core.AppFolder;
+import com.seclore.sample.dms.security.service.SecurityService;
+import com.seclore.sample.dms.so.integration.core.OpenRequestDetails;
+import com.seclore.sample.dms.so.integration.service.FileOpenService;
+import com.seclore.sample.dms.util.CommonUtil;
+import com.seclore.sample.dms.util.LoggerUtil;
+import com.seclore.sample.dms.util.xml.XMLDBService;
+import com.seclore.sample.exceptions.AppFileNotFoundException;
+import com.seclore.sample.exceptions.AppFolderNotFoundException;
+import com.seclore.sample.exceptions.DMSSampleException;
+
+/**
+ * This servlet handle request to view the file using Seclore WebConnect Integration.
+ *
+ */
+@WebServlet(name = "viewFileOnlineServlet", urlPatterns = { "/viewFileOnline.do" })
+public class ViewFileOnlineServlet extends HttpServlet
+{
+ private static final long serialVersionUID = 1L;
+ private static final String SECLORE_ONLINE_OPEN_ENDPOINT = "/seclore/1.0/files/open";
+
+ private AppFile mAppFile ;
+ private AppFolder mAppFolder ;
+
+ /** Default constructor */
+ public ViewFileOnlineServlet()
+ {
+ super();
+ }
+
+ /**
+ * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doGet(HttpServletRequest request, HttpServletResponse response)
+ throws ServletException, IOException
+ {
+ doPost(request, response);
+ }
+
+ /**
+ * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doPost(HttpServletRequest pRequest, HttpServletResponse pResponse)
+ throws ServletException, IOException
+ {
+ String lstrMethodName = getClass().getName() + "doPost";
+ LoggerUtil.logInfo(lstrMethodName + " :: START");
+
+ String fileId = pRequest.getParameter("fileId");
+ String folderId = pRequest.getParameter("folderId");
+ String lstrNextPageUrl = "folderList.do";
+ String lstrFileToken = null;
+
+ HttpSession lSession = pRequest.getSession();
+ String lstrUserName = (String)lSession.getAttribute("name");
+ lstrUserName = CommonUtil.isStringEmpty(lstrUserName) ?
+ SampleAppConfig.getDummyUserName() : lstrUserName;
+
+ // ======== File and Folder Validations - START ======== //
+ try
+ {
+ mAppFolder = validateAndGetFolder(folderId);
+ mAppFile = validateAndGetFile(fileId, folderId);
+
+ int liViewsOfFile = mAppFile.getViews();
+ liViewsOfFile++;
+ mAppFile.setViews(liViewsOfFile);
+
+ // If request has mode,(it must be cfad, use it)
+ String lstrMode = pRequest.getParameter("mode");
+
+ // If null, then use from config.
+ if(CommonUtil.isEmptyString(lstrMode))
+ {
+ lstrMode = SampleAppConfig.getOpenOnlineMode();
+ }
+
+ lstrFileToken = mAppFolder.getId() +":" + mAppFile.getId() +":" + liViewsOfFile;
+
+
+ XMLDBService.updateFile(mAppFolder.getId(), mAppFile);
+
+ OpenRequestDetails lOpenRequestDetails;
+
+ switch (lstrMode)
+ {
+ case "view":
+ lOpenRequestDetails = FileOpenService.openViewMode(lstrFileToken,
+ mAppFile,mAppFolder,lstrUserName);
+ break;
+
+ case "edit":
+ lOpenRequestDetails = FileOpenService.openEditMode(lstrFileToken,
+ mAppFile,mAppFolder, null,lstrUserName);
+ break;
+
+ case "cfad":
+ lOpenRequestDetails = FileOpenService.openCFAD(lstrFileToken,
+ mAppFile,mAppFolder,lstrUserName);
+ break;
+
+ default:
+ throw new DMSSampleException("Mode not found in request. Invalid Request.");
+ }
+
+ // Forward the request to open.jsp to send POST request for file open
+
+ pRequest.setAttribute("accessToken", lOpenRequestDetails.getAccessToken());
+ pRequest.setAttribute("accessTokenExpiry", lOpenRequestDetails.getAccessTokenTTL());
+ pRequest.setAttribute("fileToken", lOpenRequestDetails.getFileToken());
+ pRequest.setAttribute("serviceUrl", lOpenRequestDetails.getServiceURL());
+ pRequest.setAttribute("agentless", lOpenRequestDetails.getAgentless());
+ pRequest.setAttribute("policyServerURL", lOpenRequestDetails.getPolicyServerURL());
+ pRequest.setAttribute("sessionContext", lOpenRequestDetails.getSessionContext());
+ pRequest.setAttribute("redirectUrl",
+ SampleAppConfig.getSecloreOnlineURL() + SECLORE_ONLINE_OPEN_ENDPOINT);
+
+ pRequest.getRequestDispatcher("/portal/pages/open.jsp").forward(pRequest, pResponse);
+ return;
+ }
+ catch (DMSSampleException e)
+ {
+ LoggerUtil.logError("Error in OpenFileServlet(). " + e.getMessage(), e);
+
+ // In case of Error, check whether an Error URL is mentioned in
+ // exception. If present, forward to error page.
+ if (e.getRedirectURL() != null)
+ {
+ try
+ {
+ pRequest.setAttribute("accessToken",
+ SecurityService.generateAccessToken(lstrFileToken,lstrUserName));
+ pRequest.setAttribute("fileToken",lstrFileToken);
+ pRequest.setAttribute("serviceUrl",SampleAppConfig.getEnterpriseAppURL());
+ pRequest.setAttribute("redirectUrl",e.getRedirectURL());
+
+ pRequest.getRequestDispatcher("/portal/pages/SOError.jsp").forward(pRequest, pResponse);
+ return;
+ }
+ catch (DMSSampleException | ServletException | IOException e1)
+ { }
+ }
+
+ lSession.setAttribute("ERROR_MESSAGE", e.getMessage());
+ pResponse.sendRedirect(lstrNextPageUrl);
+ return;
+
+ }
+ catch (IOException ioException)
+ {
+ LoggerUtil.logError("IOException while Opening File in OpenFileServlet.", ioException);
+
+ lSession.setAttribute("ERROR_MESSAGE", "IOException while Opening File in OpenFileServlet.");
+ pResponse.sendRedirect(lstrNextPageUrl);
+ return;
+ }
+ catch (Exception lException)
+ {
+ LoggerUtil.logError( lstrMethodName + " :: " + lException.getMessage(), lException);
+ lSession.setAttribute("ERROR_MESSAGE", lException.getMessage() );
+ pResponse.sendRedirect(lstrNextPageUrl);
+ return;
+ }
+ }
+
+ private AppFile validateAndGetFile(String fileId, String folderId) throws AppFileNotFoundException
+ {
+ if(CommonUtil.isStringEmpty(fileId))
+ {
+ throw new AppFileNotFoundException("File-id is null or empty.");
+ }
+
+ AppFile lAppFile = XMLDBService.getFile(folderId,fileId);
+ if( lAppFile == null )
+ {
+ throw new AppFileNotFoundException("File-id not found in folder.");
+ }
+ return lAppFile;
+ }
+
+ private AppFolder validateAndGetFolder(String folderId)
+ throws AppFolderNotFoundException
+ {
+ if(CommonUtil.isStringEmpty(folderId))
+ {
+ throw new AppFolderNotFoundException("Folder-id is null or empty.");
+ }
+
+ AppFolder lAppFolder = XMLDBService.getFolder(folderId);
+ if( lAppFolder == null )
+ {
+ throw new AppFolderNotFoundException("Folder-id not found in db.");
+ }
+ return lAppFolder;
+ }
+
+}
diff --git a/examples/Sample App/DMS Sample App/src/source/log4j.properties b/examples/Sample App/DMS Sample App/src/source/log4j.properties
new file mode 100755
index 0000000..172074e
--- /dev/null
+++ b/examples/Sample App/DMS Sample App/src/source/log4j.properties
@@ -0,0 +1,21 @@
+log4j.logger.SampleAppLogger=debug, SampleAppLogger
+log4j.appender.SampleAppLogger=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.SampleAppLogger.File=logs/SecloreSampleApp.log
+log4j.appender.SampleAppLogger.DatePattern='_'yyyy-MMM'.log'
+log4j.appender.SampleAppLogger.layout=org.apache.log4j.PatternLayout
+log4j.appender.SampleAppLogger.layout.ConversionPattern=%d{MMM dd, yyyy HH:mm:ss.SSS} %-5p: %m%n
+
+
+log4j.logger.AccessOnlineLogger=debug, AccessOnlineLogger
+log4j.appender.AccessOnlineLogger=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.AccessOnlineLogger.File=data/Access Online/AccessOnline.log
+log4j.appender.AccessOnlineLogger.DatePattern='_'yyyy-MMM'.log'
+log4j.appender.AccessOnlineLogger.layout=org.apache.log4j.PatternLayout
+log4j.appender.AccessOnlineLogger.layout.ConversionPattern=%d{MMM dd, yyyy HH:mm:ss.SSS} %-5p: %m%n
+
+# Root logger option
+#log4j.rootLogger=INFO, stdout
+#log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+#log4j.appender.stdout.Target=System.out
+#log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+#log4j.appender.stdout.layout.ConversionPattern=%d{dd-MM-yyyy HH:mm:ss} %-5p: %m%n
diff --git a/examples/Sample App/Readme.docx b/examples/Sample App/Readme.docx
new file mode 100755
index 0000000..77a905e
Binary files /dev/null and b/examples/Sample App/Readme.docx differ
diff --git a/examples/Sample App/SSO Login Patch for DMS Sample App/Web App/WEB-INF/classes/com/seclore/sample/dms/auth/servlet/AuthFilter.class b/examples/Sample App/SSO Login Patch for DMS Sample App/Web App/WEB-INF/classes/com/seclore/sample/dms/auth/servlet/AuthFilter.class
new file mode 100755
index 0000000..bc3be7d
Binary files /dev/null and b/examples/Sample App/SSO Login Patch for DMS Sample App/Web App/WEB-INF/classes/com/seclore/sample/dms/auth/servlet/AuthFilter.class differ
diff --git a/examples/Sample App/SSO Login Patch for DMS Sample App/Web App/WEB-INF/classes/com/seclore/sample/dms/auth/servlet/LogoutServlet.class b/examples/Sample App/SSO Login Patch for DMS Sample App/Web App/WEB-INF/classes/com/seclore/sample/dms/auth/servlet/LogoutServlet.class
new file mode 100755
index 0000000..6faaaef
Binary files /dev/null and b/examples/Sample App/SSO Login Patch for DMS Sample App/Web App/WEB-INF/classes/com/seclore/sample/dms/auth/servlet/LogoutServlet.class differ
diff --git a/examples/Sample App/SSO Login Patch for DMS Sample App/Web App/WEB-INF/classes/com/seclore/sample/dms/auth/servlet/PostPSLoginServlet.class b/examples/Sample App/SSO Login Patch for DMS Sample App/Web App/WEB-INF/classes/com/seclore/sample/dms/auth/servlet/PostPSLoginServlet.class
new file mode 100755
index 0000000..383753c
Binary files /dev/null and b/examples/Sample App/SSO Login Patch for DMS Sample App/Web App/WEB-INF/classes/com/seclore/sample/dms/auth/servlet/PostPSLoginServlet.class differ
diff --git a/examples/Sample App/SSO Login Patch for DMS Sample App/Web App/WEB-INF/classes/com/seclore/sample/dms/auth/servlet/RedirectToPSServlet.class b/examples/Sample App/SSO Login Patch for DMS Sample App/Web App/WEB-INF/classes/com/seclore/sample/dms/auth/servlet/RedirectToPSServlet.class
new file mode 100755
index 0000000..09c8ff0
Binary files /dev/null and b/examples/Sample App/SSO Login Patch for DMS Sample App/Web App/WEB-INF/classes/com/seclore/sample/dms/auth/servlet/RedirectToPSServlet.class differ
diff --git a/examples/Sample App/SSO Login Patch for DMS Sample App/Web App/WEB-INF/classes/com/seclore/sample/dms/home/servlet/HomeServlet.class b/examples/Sample App/SSO Login Patch for DMS Sample App/Web App/WEB-INF/classes/com/seclore/sample/dms/home/servlet/HomeServlet.class
new file mode 100755
index 0000000..bb86944
Binary files /dev/null and b/examples/Sample App/SSO Login Patch for DMS Sample App/Web App/WEB-INF/classes/com/seclore/sample/dms/home/servlet/HomeServlet.class differ
diff --git a/examples/Sample App/SSO Login Patch for DMS Sample App/doc/1- Applying SSO Patch to Sample App.txt b/examples/Sample App/SSO Login Patch for DMS Sample App/doc/1- Applying SSO Patch to Sample App.txt
new file mode 100755
index 0000000..fcdb3d1
--- /dev/null
+++ b/examples/Sample App/SSO Login Patch for DMS Sample App/doc/1- Applying SSO Patch to Sample App.txt
@@ -0,0 +1,16 @@
+--------------------------------------
+-- Applying SSO Patch to DMS Sample App --
+--------------------------------------
+
+Pre-requisites :
+ 1. PS SSO Authenticator:
+ - PS SSO Authenticator is a component by which Policy Server will work as SSO authentication system for other application.
+ - PS SSO Authenticator must be deployed in the Policy Server which will be configured for Sample Application.
+ - Package for the PS SSO Authenticator is available at the Distribution Location.
+ 2. DMS Sample App must be deployed completely to apply the patch.
+
+Steps to apply patch :
+ 1. Stop Tomcat on which Sample App is running.
+ 2. Copy the WEB-INF folder inside the '/Web App' folder and paste it inside the Sample App directory, eg. D:/Seclore/SampleApp.
+ 3. Restart Tomcat.
+ 4. Do Sanity testing to verify the installation. Refer document "Sanity cases for post deployment check.txt" inside doc folder.
\ No newline at end of file
diff --git a/examples/Sample App/SSO Login Patch for DMS Sample App/doc/PS SSO Authenticator/Deployment Steps/Deployment Steps.txt b/examples/Sample App/SSO Login Patch for DMS Sample App/doc/PS SSO Authenticator/Deployment Steps/Deployment Steps.txt
new file mode 100755
index 0000000..9857f68
--- /dev/null
+++ b/examples/Sample App/SSO Login Patch for DMS Sample App/doc/PS SSO Authenticator/Deployment Steps/Deployment Steps.txt
@@ -0,0 +1,20 @@
+Deployment Steps For PS SSO Authenticator
+-----------------------------------------
+1. Stop the Policy Server application
+2. Copy the Lib\ps-sso-authenticator.jar file in to "PS_LOCATION\WEB-INF\lib\" folder
+3. Copy the below text into "PS_LOCATION\WEB-INF\psportal_custom_struts_config.xml" within tag.
+
+
+
+
+
+
+
+
+
+
+
+ Note: If tag will already be exist then put only tags inside existing .
+4. Start the policy Server application
diff --git a/examples/Sample App/SSO Login Patch for DMS Sample App/doc/PS SSO Authenticator/Lib/ps-sso-authenticator.jar b/examples/Sample App/SSO Login Patch for DMS Sample App/doc/PS SSO Authenticator/Lib/ps-sso-authenticator.jar
new file mode 100755
index 0000000..290ac52
Binary files /dev/null and b/examples/Sample App/SSO Login Patch for DMS Sample App/doc/PS SSO Authenticator/Lib/ps-sso-authenticator.jar differ
diff --git a/examples/Sample App/SSO Login Patch for DMS Sample App/doc/Sanity cases for post deployment check.txt b/examples/Sample App/SSO Login Patch for DMS Sample App/doc/Sanity cases for post deployment check.txt
new file mode 100755
index 0000000..bbb4276
--- /dev/null
+++ b/examples/Sample App/SSO Login Patch for DMS Sample App/doc/Sanity cases for post deployment check.txt
@@ -0,0 +1,30 @@
+Sanity testing to verify the installation of Sample App .
+
+A. Adding a folder and uploading files.
+
+1. Visit Seclore Sample App - "https://[SERVER_NAME]/[SAMPLE_APP_NAME]", Click the button that says, "Click here to login". This will redirect you to your Policy Server's login page. Login with a valid user to proceed.
+
+2. Click on the "+ Create New Folder" link on the menu bar.
+
+3. On the next page name your folder, check the 'IRM Enabled' check-box and click on Save.
+
+4. Click on the new folder that you just created from the list of folders that you see on the Folder List page.
+
+5. Click on the "+ Add New File" link on the menu bar.
+
+6. Choose a file you wish to upload, Select an Owner, a Classification and add Users (Search users by their email id, These users should be present in the Policy Server.) with User Rights from the respective dropdown boxes.
+
+7. Save this file. All these action should be completed without any errors.
+
+B. Download, View Online, View on Desktop and check for logs on and uploaded file.
+
+1. Click on any one of the folders listed on the folder list page.
+
+2. On the next page, appears a list of all files uploaded in that folder.
+
+3. Perform the actions that say "Online Access", "Access on Desktop", "Download" and "View Logs" to check if all these work as expected.
+
+4. You may also try and edit certain rights on the file by clicking the "Edit" action.
+
+5. Try an open operation on the downloaded file using DC or Lite Client with an authorized and an unauthorized user to confirm expected behaviour.
+
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/Readme.txt b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/Readme.txt
new file mode 100755
index 0000000..c48caf0
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/Readme.txt
@@ -0,0 +1,57 @@
+=======================================
+Get Advanced EA Helper
+=======================================
+
+---------------------------
+Pre-requisites/Assumptions
+---------------------------
+1) Seclore Policy Server is up and running.
+3) An Elevated Enterprise Application (EA) is configured on the Seclore Policy Server.
+4) This utility is configured to run with Seclore Server SDK (4.4.7.0)
+
+
+
+------
+Notes
+------
+1) To use current working directory as the Application Path in '/config/config.xml' file, use "."
+ e.g .
+
+ Otherwise, enter the complete absolute path
+ e.g C:\Seclore\Elevated EA Utility\Source
+
+2) Sample public and private key xml files used to set up an Elevated EA have also been provided at :
+ 'Elevated EA Utility/Docs/samples/publicKey.xml'
+ 'Elevated EA Utility/Docs/samples/privateKey.xml'
+
+------------------
+Configuration Steps:
+------------------
+1. Put the JCE jar files (specific to JRE version) from 'Elevated EA Utility/Docs/JCE Files/' into 'JRE/lib/security/' folder of the system. This utility requires JDK version 1.8 or higher to run. The utility displays the JDK version it uses when you execute the 'run.bat' file.
+
+2. Configure the 'config.xml' file located in 'Elevated EA Utility/Source/config/'.
+ a. app-path : This is the absolute path of the application
+ - place a dot "." or put the absolute application path
+ - example: C:\Seclore\Seclore SDK Sample Code\Source
+ b. initalize-logger : This can be true/false depending upon the logging implementation.
+
+3. Configure the 'tenant config.xml' located in 'Elevated EA Utility/Source/config/'
+ a. Policy Server Details:
+ server : Server name on which Policy Server is running
+ port : Server Port on which Policy Server is running
+ app-name : Policy Server application name
+
+ b. Login details:
+ When using Hot Folder cabinet (EA) context i.e (1 ) :
+ id : ID of the Elevated Enterprise Application (EA) on the Seclore Policy Server.
+ passphrase : Passphrase of the Elevated Enterprise Application.
+ allow-advanced-privileges : 'false' by default. To enable advanced privileges for this EA, set this to 'true'
+
+3. Populate the 'config.properties' in 'Elevated EA Utility/Source/config/'. Some values are pre-populated which must not be changed.
+ ea.active.key.id : Elevated EA active key id which is displayed on EA config details page on Policy Server portal under the "Advanced Security" section titled 'Active Key ID'.
+
+ ea.private.key.xml.path : The absolute path of the private key xml file whose public key was used to configure the Elevated EA.
+ eg. ea.private.key.xml.path=C:\\Users\\Desktop\\EA Advanced Security Keys\\privateKeyXML.xml
+
+
+
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/Readme.txt b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/Readme.txt
new file mode 100755
index 0000000..893cdc6
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/Readme.txt
@@ -0,0 +1,60 @@
+=======================================
+Get Advanced EA Helper
+=======================================
+
+---------------------------
+Pre-requisites/Assumptions
+---------------------------
+1) Seclore Policy Server is up and running.
+3) An Elevated Enterprise Application (EA) is configured on the Seclore Policy Server.
+4) This utility is configured to run with Seclore Server SDK (4.4.7.0)
+
+
+
+------
+Notes
+------
+1) To use current working directory as the Application Path in '/config/config.xml' file, use "."
+ e.g .
+
+ Otherwise, enter the complete absolute path
+ e.g C:\Seclore\Elevated EA Utility\Source
+
+2) Sample public and private key xml files used to set up an Elevated EA have also been provided at :
+ 'Elevated EA Utility/Docs/samples/publicKey.xml'
+ 'Elevated EA Utility/Docs/samples/privateKey.xml'
+
+------------------
+Configuration Steps:
+------------------
+1. Put the JCE jar files (specific to JRE version) from 'Elevated EA Utility/Docs/JCE Files/' into 'JRE/lib/security/' folder of the system. This utility requires JDK version 1.8 or higher to run. The utility displays the JDK version it uses when you execute the 'run.bat' file.
+
+2. Configure the 'config.xml' file located in 'Elevated EA Utility/Source/config/'.
+ a. app-path : This is the absolute path of the application
+ - place a dot "." or put the absolute application path
+ - example: C:\Seclore\Seclore SDK Sample Code\Source
+ b. initalize-logger : This can be true/false depending upon the logging implementation.
+
+3. Configure the 'tenant config.xml' located in 'Elevated EA Utility/Source/config/'
+ a. Policy Server Details:
+ server : Server name on which Policy Server is running
+ port : Server Port on which Policy Server is running
+ app-name : Policy Server application name
+
+ b. Login details:
+ When using Hot Folder cabinet (EA) context i.e (1 ) :
+ id : ID of the Elevated Enterprise Application (EA) on the Seclore Policy Server.
+ passphrase : Passphrase of the Elevated Enterprise Application.
+ allow-advanced-privileges : 'false' by default. To enable advanced privileges for this EA, set this to 'true'
+
+3. Populate the 'config.properties' in 'Elevated EA Utility/Source/config/'. Some values are pre-populated which must not be changed.
+ ea.active.key.id : Elevated EA active key id which is displayed on EA config details page on Policy Server portal under the "Advanced Security" section titled 'Active Key ID'.
+
+ ea.private.key.xml.path : The absolute path of the private key xml file whose public key was used to configure the Elevated EA.
+ eg. ea.private.key.xml.path=C:\\Users\\Desktop\\EA Advanced Security Keys\\privateKeyXML.xml
+
+4. Execute "run.bat" to get the utility running.
+
+
+
+
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/config/config.properties b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/config/config.properties
new file mode 100755
index 0000000..e9e5022
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/config/config.properties
@@ -0,0 +1,6 @@
+#config details of logged in EA (visible in PS Portal)
+ea.active.key.id=
+ea.private.key.xml.path=
+ea.key.chaining.mode=ECB
+ea.key.padding.scheme=PKCS1Padding
+ea.key.length=256
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/config/config.xml b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/config/config.xml
new file mode 100755
index 0000000..9cc30b9
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/config/config.xml differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/config/log4j.properties b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/config/log4j.properties
new file mode 100755
index 0000000..8293be6
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/config/log4j.properties
@@ -0,0 +1,15 @@
+
+log4j.category.WSCLIENT=debug, WSCLIENT
+
+# If we want to change the Appender, we have to change
+# UtilFunction.initializeLoggers() too, because it assumes that the appender
+# is 'org.apache.log4j.RollingFileAppender' and changes path of the file by
+# getting appender from this logger.
+log4j.appender.WSCLIENT=com.seclore.fs.ws.client.logger.DailyZippedRollingFileAppender
+# Path of the file should be relative to application ROOT
+log4j.appender.WSCLIENT.File=logs/WSClient.log
+log4j.appender.WSCLIENT.MaxFileSize=10MB
+#log4j.appender.REQUEST_LOGGER.MaxBackupIndex=10
+log4j.appender.WSCLIENT.DatePattern='_'yyyy-MM-dd
+log4j.appender.WSCLIENT.layout=org.apache.log4j.PatternLayout
+log4j.appender.WSCLIENT.layout.ConversionPattern=%d{MMM dd, yyyy HH:mm:ss.SSS} %F:%L%n%p: %m%n
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/config/log4j2.xml b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/config/log4j2.xml
new file mode 100755
index 0000000..6902efe
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/config/log4j2.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+ ${ctx:applicationPath}/logs
+
+
+
+
+
+
+
+
+
+
+
+
+ UTF-8
+ %d{MMM dd, yyyy HH:mm:ss.SSS} :%t %n%p: %m%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/config/tenant config.xml b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/config/tenant config.xml
new file mode 100755
index 0000000..a88ffcc
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/config/tenant config.xml differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/bc-fips-1.0.0.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/bc-fips-1.0.0.jar
new file mode 100755
index 0000000..321e563
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/bc-fips-1.0.0.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/commons-codec-1.6.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/commons-codec-1.6.jar
new file mode 100755
index 0000000..ee1bc49
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/commons-codec-1.6.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/disruptor-3.3.7.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/disruptor-3.3.7.jar
new file mode 100755
index 0000000..1777a37
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/disruptor-3.3.7.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/fs-smaillibrary.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/fs-smaillibrary.jar
new file mode 100755
index 0000000..aa95e22
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/fs-smaillibrary.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/fs-ws-client-4.4.7.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/fs-ws-client-4.4.7.jar
new file mode 100755
index 0000000..bf2adcf
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/fs-ws-client-4.4.7.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/juniversalchardet-1.0.3.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/juniversalchardet-1.0.3.jar
new file mode 100755
index 0000000..1af703f
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/juniversalchardet-1.0.3.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/log4j-1.2.14.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/log4j-1.2.14.jar
new file mode 100755
index 0000000..6251307
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/log4j-1.2.14.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/log4j-api-2.10.0.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/log4j-api-2.10.0.jar
new file mode 100755
index 0000000..9603b1b
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/log4j-api-2.10.0.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/log4j-core-2.10.0.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/log4j-core-2.10.0.jar
new file mode 100755
index 0000000..1be9e67
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/log4j-core-2.10.0.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/sample-app.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/sample-app.jar
new file mode 100755
index 0000000..90af6de
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/sample-app.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/xercesImpl-X.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/xercesImpl-X.jar
new file mode 100755
index 0000000..38fca83
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/xercesImpl-X.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/run.bat b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/run.bat
new file mode 100755
index 0000000..98082e8
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/run.bat
@@ -0,0 +1,14 @@
+@echo off
+set "CURRENT_DIR=%cd%"
+echo -------------------------------------------------------
+echo Seclore 'Get Advanced EA Helper' Utility
+echo -------------------------------------------------------
+echo.
+java -version
+echo.
+
+REM uncomment below line to see the version of sample app i.e( remove REM mentioned below)
+REM java -cp "./lib/sample-app.jar"; com.seclore.fs.ea.advanced.example.Version
+ java -cp "./lib/*"; com.seclore.fs.ea.advanced.example.main.SecloreMain
+pause
+
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/doc/Developer_s Reference.txt b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/doc/Developer_s Reference.txt
new file mode 100755
index 0000000..7bf2ed5
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/doc/Developer_s Reference.txt
@@ -0,0 +1,23 @@
+==========================================================
+FileSecure Interfaces integration source code reference
+==========================================================
+
+------------------------
+FS Helper Initialization
+------------------------
+ - At application startup, loading 'config.properties' file located in 'Seclore SDK Sample Code/Source/config'
+ - Then initializing FSHelperlibrary and FSHelper
+ - Below classes are used for the same
+ - SecloreMain
+ - static block :-
+ initializeHelperLibrary( FSHELPERLIBRARY_CONFIG_XML_PATH );
+ initializeHelper( HELPER_INSTANCE_KEY, FSHELPER_RESOURCE_PATH, FSHELPER_CONFIG_XML_PATH );
+ - Note that here since we are using an Elevated EA, we will also need to create an instance of 'DefaultCryptoHandler' to initilalize FSHelper.
+ eg. FSHelperLibrary.initializeHelper(TENANT_ID, FSHELPER_RESOURCE_PATH, FSHELPER_CONFIG_XML_CONTENT, DefaultCryptoHandler);
+
+
+------------
+Main Class
+------------
+ - com.seclore.fs.ea.advanced.example.main
+ - SecloreMain.java
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/doc/JCE Files/Java8/US_export_policy.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/doc/JCE Files/Java8/US_export_policy.jar
new file mode 100755
index 0000000..251b102
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/doc/JCE Files/Java8/US_export_policy.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/doc/JCE Files/Java8/local_policy.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/doc/JCE Files/Java8/local_policy.jar
new file mode 100755
index 0000000..1c58939
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/doc/JCE Files/Java8/local_policy.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/doc/samples/privateKey.xml b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/doc/samples/privateKey.xml
new file mode 100755
index 0000000..3c25134
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/doc/samples/privateKey.xml differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/doc/samples/publicKey.xml b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/doc/samples/publicKey.xml
new file mode 100755
index 0000000..517b12f
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/doc/samples/publicKey.xml differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/.classpath b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/.classpath
new file mode 100755
index 0000000..4e3bf4d
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/.classpath
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/.project b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/.project
new file mode 100755
index 0000000..753a2b5
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/.project
@@ -0,0 +1,17 @@
+
+
+ Get Advanced EA Helper
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+
+ org.eclipse.jdt.core.javanature
+
+
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/.settings/org.eclipse.jdt.core.prefs b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/.settings/org.eclipse.jdt.core.prefs
new file mode 100755
index 0000000..3a21537
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,11 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/bin/com/seclore/fs/ea/advanced/example/Version.class b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/bin/com/seclore/fs/ea/advanced/example/Version.class
new file mode 100755
index 0000000..c569e52
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/bin/com/seclore/fs/ea/advanced/example/Version.class differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/bin/com/seclore/fs/ea/advanced/example/core/Config.class b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/bin/com/seclore/fs/ea/advanced/example/core/Config.class
new file mode 100755
index 0000000..eed4049
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/bin/com/seclore/fs/ea/advanced/example/core/Config.class differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/bin/com/seclore/fs/ea/advanced/example/main/SecloreMain.class b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/bin/com/seclore/fs/ea/advanced/example/main/SecloreMain.class
new file mode 100755
index 0000000..defee53
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/bin/com/seclore/fs/ea/advanced/example/main/SecloreMain.class differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/config/config.properties b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/config/config.properties
new file mode 100755
index 0000000..e9e5022
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/config/config.properties
@@ -0,0 +1,6 @@
+#config details of logged in EA (visible in PS Portal)
+ea.active.key.id=
+ea.private.key.xml.path=
+ea.key.chaining.mode=ECB
+ea.key.padding.scheme=PKCS1Padding
+ea.key.length=256
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/config/config.xml b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/config/config.xml
new file mode 100755
index 0000000..9cc30b9
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/config/config.xml differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/config/log4j.properties b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/config/log4j.properties
new file mode 100755
index 0000000..8293be6
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/config/log4j.properties
@@ -0,0 +1,15 @@
+
+log4j.category.WSCLIENT=debug, WSCLIENT
+
+# If we want to change the Appender, we have to change
+# UtilFunction.initializeLoggers() too, because it assumes that the appender
+# is 'org.apache.log4j.RollingFileAppender' and changes path of the file by
+# getting appender from this logger.
+log4j.appender.WSCLIENT=com.seclore.fs.ws.client.logger.DailyZippedRollingFileAppender
+# Path of the file should be relative to application ROOT
+log4j.appender.WSCLIENT.File=logs/WSClient.log
+log4j.appender.WSCLIENT.MaxFileSize=10MB
+#log4j.appender.REQUEST_LOGGER.MaxBackupIndex=10
+log4j.appender.WSCLIENT.DatePattern='_'yyyy-MM-dd
+log4j.appender.WSCLIENT.layout=org.apache.log4j.PatternLayout
+log4j.appender.WSCLIENT.layout.ConversionPattern=%d{MMM dd, yyyy HH:mm:ss.SSS} %F:%L%n%p: %m%n
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/config/log4j2.xml b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/config/log4j2.xml
new file mode 100755
index 0000000..6902efe
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/config/log4j2.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+ ${ctx:applicationPath}/logs
+
+
+
+
+
+
+
+
+
+
+
+
+ UTF-8
+ %d{MMM dd, yyyy HH:mm:ss.SSS} :%t %n%p: %m%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/config/tenant config.xml b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/config/tenant config.xml
new file mode 100755
index 0000000..a88ffcc
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/config/tenant config.xml differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/bc-fips-1.0.0.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/bc-fips-1.0.0.jar
new file mode 100755
index 0000000..321e563
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/bc-fips-1.0.0.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/commons-codec-1.6.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/commons-codec-1.6.jar
new file mode 100755
index 0000000..ee1bc49
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/commons-codec-1.6.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/disruptor-3.3.7.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/disruptor-3.3.7.jar
new file mode 100755
index 0000000..1777a37
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/disruptor-3.3.7.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/fs-get-elevated-session.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/fs-get-elevated-session.jar
new file mode 100755
index 0000000..f475f9d
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/fs-get-elevated-session.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/fs-smaillibrary.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/fs-smaillibrary.jar
new file mode 100755
index 0000000..aa95e22
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/fs-smaillibrary.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/fs-ws-client-4.4.7.0.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/fs-ws-client-4.4.7.0.jar
new file mode 100755
index 0000000..bf2adcf
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/fs-ws-client-4.4.7.0.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/juniversalchardet-1.0.3.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/juniversalchardet-1.0.3.jar
new file mode 100755
index 0000000..1af703f
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/juniversalchardet-1.0.3.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/log4j-1.2.14.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/log4j-1.2.14.jar
new file mode 100755
index 0000000..6251307
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/log4j-1.2.14.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/log4j-api-2.10.0.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/log4j-api-2.10.0.jar
new file mode 100755
index 0000000..9603b1b
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/log4j-api-2.10.0.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/log4j-core-2.10.0.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/log4j-core-2.10.0.jar
new file mode 100755
index 0000000..1be9e67
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/log4j-core-2.10.0.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/xercesImpl-X.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/xercesImpl-X.jar
new file mode 100755
index 0000000..38fca83
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/xercesImpl-X.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/src/com/seclore/fs/ea/advanced/example/Version.java b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/src/com/seclore/fs/ea/advanced/example/Version.java
new file mode 100755
index 0000000..b4cd66b
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/src/com/seclore/fs/ea/advanced/example/Version.java
@@ -0,0 +1,23 @@
+package com.seclore.fs.ea.advanced.example;
+
+/**
+ * Represents the Sample App version.
+ */
+public class Version
+{
+ /**
+ * The version of the Sample App.
+ */
+ public static final String Version = "3.0.0.0";
+
+ /**
+ * Displays the version of the Sample App
+ *
+ * @param args
+ */
+ public static void main(String[] args)
+ {
+ System.out.println("Sample App version : " + Version);
+ System.out.println("Copyright (c) 2008 Seclore Technology Pvt. Ltd.");
+ }
+}
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/src/com/seclore/fs/ea/advanced/example/core/Config.java b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/src/com/seclore/fs/ea/advanced/example/core/Config.java
new file mode 100755
index 0000000..f292bb9
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/src/com/seclore/fs/ea/advanced/example/core/Config.java
@@ -0,0 +1,65 @@
+package com.seclore.fs.ea.advanced.example.core;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
+
+public class Config
+{
+ private static Properties props = null;
+
+ /**
+ * Load and initialize the '/config.properties' file
+ * @param configPath
+ * @throws Exception
+ */
+ public static void initConfig(String configPath) throws Exception
+ {
+ InputStream lInputStream = null;
+ try
+ {
+ Properties properties = new Properties();
+ lInputStream = new FileInputStream(configPath);
+ properties.load(lInputStream);
+ props = properties;
+ }
+ catch(Exception lEx)
+ {
+ throw new Exception(lEx);
+ }
+ finally
+ {
+ if( lInputStream != null)
+ {
+ try
+ {
+ lInputStream.close();
+ }
+ catch(IOException ioException)
+ {
+ // Ignore
+ }
+ }
+ }
+ }
+
+ /**
+ * This method reads the value against the specified 'key' and returns it.
+ * In case the value is blank or null, it returns the 'defaultValue' which was passed to this method.
+ * @param key
+ * @param defaultValue
+ * @return
+ * @throws Exception
+ */
+ public static String getProperty(String key, String defaultValue) throws Exception
+ {
+ String propertyValue = props.getProperty(key, defaultValue);
+ if( propertyValue.trim().isEmpty() )
+ {
+ propertyValue = defaultValue;
+ }
+
+ return propertyValue;
+ }
+}
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/src/com/seclore/fs/ea/advanced/example/main/SecloreMain.java b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/src/com/seclore/fs/ea/advanced/example/main/SecloreMain.java
new file mode 100755
index 0000000..7820549
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/src/com/seclore/fs/ea/advanced/example/main/SecloreMain.java
@@ -0,0 +1,320 @@
+package com.seclore.fs.ea.advanced.example.main;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringWriter;
+import java.util.Scanner;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.mozilla.universalchardet.UniversalDetector;
+import org.w3c.dom.Document;
+import org.xml.sax.InputSource;
+
+import com.seclore.fs.ea.advanced.example.core.Config;
+import com.seclore.fs.helper.crypto.DefaultCryptoHandler;
+import com.seclore.fs.helper.exception.FSHelperException;
+import com.seclore.fs.helper.library.FSHelper;
+import com.seclore.fs.helper.library.FSHelperLibrary;
+
+public class SecloreMain {
+
+ private static final String tenantID = "Tenant-1";
+
+ // # This file contains information about the Application into which this code
+ // snippet is to be integrated.
+ private static final String appConfigXMLFilePath = "config/config.xml";
+
+ // # This file contains info for creating session with Seclore Policy Server and
+ // initializing Server SDK library
+ private static final String tenantConfigXMLFilePath = "config/cabinet config.xml";
+
+ // # Used to take user input
+ private static Scanner scanner = null;
+
+ /**
+ *
+ * This block initializes the Server SDK library and creates a session with
+ * Seclore Policy Server
+ *
+ *
+ * @exception Code snippet won't run if any exception is thrown in this block.
+ */
+ static {
+ try {
+ // load config.properties file and then validate the entries in it
+ Config.initConfig("config/config.properties");
+
+ // validate if entries in this file have pre-filled values
+ validateConfigEntries();
+
+ // initialize the FSHelper Library
+ initializeHelperLibrary(appConfigXMLFilePath);
+ initializeHelper(tenantID, "", tenantConfigXMLFilePath);
+
+ scanner = new Scanner(System.in);
+ } catch (Exception e) {
+ e.printStackTrace();
+ System.exit(0);
+ }
+ }
+
+ /**
+ * Main method
+ *
+ * @param args
+ * Takes input from user
+ */
+ public static void main(String[] args) {
+ try {
+ boolean isRequestSuccessful = initializeElevatedHelper();
+ if (isRequestSuccessful) {
+ System.out.println("***** Operation successful. *****");
+ } else {
+ System.out.println("***** Operation failed! *****");
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ if (scanner != null) {
+ scanner.close();
+ }
+ }
+ }
+
+ /**
+ * Validate if properties in this file have pre-filled values
+ *
+ * @throws Exception
+ */
+ private static void validateConfigEntries() throws Exception {
+ String eaActiveKeyId = Config.getProperty("ea.active.key.id", "");
+ if (null == eaActiveKeyId || eaActiveKeyId.trim().isEmpty()) {
+ throw new Exception("Value for property 'ea.active.key.id' missing in config.properties file.");
+ }
+
+ String eaPrivateKeyXMLPath = Config.getProperty("ea.private.key.xml.path", "");
+ if (null == eaPrivateKeyXMLPath || eaPrivateKeyXMLPath.trim().isEmpty()) {
+ throw new Exception("Value for property 'ea.private.key.xml.path' missing in config.properties file.");
+ }
+ }
+
+ /**
+ * This method calls the Server SDK API to process the request for getting file
+ * protection details, which also contains the file classification details
+ * and display the success or error message.
+ *
+ * @return Flag to indicate if operation was successful or not
+ * @throws Exception
+ */
+ private static boolean initializeElevatedHelper() throws Exception {
+ boolean isRequestSuccessful = false;
+ try {
+ // # This object is specific to a tenant. It contains the methods to call Server
+ // SDK API to process any request.
+ FSHelper fsHelper = FSHelperLibrary.getHelper(tenantID);
+ isRequestSuccessful = true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ terminateWSClient();
+ }
+
+ return isRequestSuccessful;
+ }
+
+ /**
+ * @param configPath
+ * Takes the application config file path ( /config.xml ) as
+ * input
+ * @throws Exception
+ */
+ private static void initializeHelperLibrary(String configPath) throws Exception {
+ String appConfigXMLContent = getConfigFileContent(configPath);
+ // Initialize method takes config file content, not the config file path.
+ FSHelperLibrary.initialize(appConfigXMLContent);
+ }
+
+ /**
+ * @param pHelperId
+ * Tenant Id
+ * @param pHelperResourcePath
+ * Resource Path for files of Seclore Policy Server.
+ * To be left empty here.
+ * @param pHelperConfigPath
+ * File path for 'tenant config.xml' file
+ * @throws Exception
+ * Code snippet won't run if any exception is thrown in this
+ * block
+ */
+ private static void initializeHelper(String pHelperId, String pHelperResourcePath, String pHelperConfigPath)
+ throws Exception {
+ // # Reads the content of the private key XML file related to the EA using which
+ // session was created
+ String lEAPrivateKeyXMLContent = getConfigFileContent(Config.getProperty("ea.private.key.xml.path", ""));
+
+ // # This object is used for advanced security. Only those EA with 'Advanced
+ // Security' option enabled on Policy Server portal can create another EA.
+ DefaultCryptoHandler defaultCryptoHandler = getDefaultCryptoHandler(lEAPrivateKeyXMLContent);
+
+ // # Reads the content of the 'tenant config.xml' file
+ String tenantConfigXMLContent = getConfigFileContent(pHelperConfigPath);
+
+ // Initialize method takes WSClient config content not the config file path.
+ FSHelperLibrary.initializeHelper(pHelperId, pHelperResourcePath, tenantConfigXMLContent, defaultCryptoHandler);
+ }
+
+ /**
+ *
+ * Uses the private key xml file to create an instance of DefaultCryptoHandler.
+ *
+ *
+ * @param pEAPrivateKeyXMLContent
+ * @return DefaultCryptoHandler instance
+ * @throws Exception
+ */
+ private static DefaultCryptoHandler getDefaultCryptoHandler(String pEAPrivateKeyXMLContent) throws Exception {
+ DefaultCryptoHandler defaultCryptoHandler = new DefaultCryptoHandler(
+ pEAPrivateKeyXMLContent,
+ Integer.parseInt(Config.getProperty("ea.key.length", "256")),
+ Config.getProperty("ea.active.key.id", ""),
+ Config.getProperty("ea.key.chaining.mode", "ECB"),
+ Config.getProperty("ea.key.padding.scheme", "PKCS1Padding"));
+ return defaultCryptoHandler;
+ }
+
+ /**
+ * This method reads an XML file and returns the content of the XML file in
+ * string format
+ *
+ * @param pAppPath
+ * XML file path
+ * @return File content in string format
+ * @throws Exception
+ */
+ private static String getConfigFileContent(String pAppPath) throws Exception {
+ validateConfigFile(pAppPath);
+
+ InputStream inputStream = null;
+ try {
+ String lstrEncoding = detectEncoding(pAppPath);
+ if (lstrEncoding == null || lstrEncoding.trim().isEmpty()) {
+ lstrEncoding = "UTF-8";
+ }
+
+ DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
+ builderFactory.setNamespaceAware(false);
+ builderFactory.setValidating(false);
+ DocumentBuilder builder = builderFactory.newDocumentBuilder();
+ inputStream = new FileInputStream(pAppPath);
+ InputSource lInputSource = new InputSource(inputStream);
+ lInputSource.setEncoding(lstrEncoding);
+ Document document = builder.parse(lInputSource);
+
+ TransformerFactory lTransFactory = TransformerFactory.newInstance();
+ Transformer lTrans = lTransFactory.newTransformer();
+ DOMSource lSource = new DOMSource(document);
+ StringWriter lStringWriter = new StringWriter();
+ lTrans.transform(lSource, new StreamResult(lStringWriter));
+ return lStringWriter.toString();
+ } catch (Exception e) {
+ System.out.println("*** Config file should be in UTF-8 encoding ***");
+ e.printStackTrace();
+ System.exit(0);
+ } finally {
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (IOException ioException) {
+ // ignore
+ }
+ }
+ }
+ return "";
+ }
+
+ /**
+ * @param configFilePath
+ * @throws Exception
+ */
+ private static File validateConfigFile(String configFilePath) throws Exception {
+
+ if (configFilePath == null || configFilePath.trim().isEmpty()) {
+ throw new Exception("Configuration File path is not provided.");
+ }
+
+ File file = new File(configFilePath);
+ if (!file.exists()) {
+ throw new Exception("Configuration File does not exist at '" + file.getAbsolutePath() + "'");
+ }
+
+ if (!file.isFile()) {
+ throw new Exception("'" + file.getAbsolutePath() + "' is not a file.");
+ }
+
+ // Length 3 is checked to make sure that enough bytes are available for
+ // BOM reading.
+ if (file.length() < 3) {
+ throw new Exception("'" + file.getAbsolutePath() + "' is not a valid configuration file.");
+ }
+ return file;
+ }
+
+ /**
+ * Detect encoding format of file
+ *
+ * @param pConfigXmlPath
+ * File path whose encoding type is to be detected
+ * @return encoding format (eg: utf-8, utf-16)
+ */
+ public static String detectEncoding(String pConfigXmlPath) {
+ FileInputStream lFis = null;
+ try {
+ lFis = new FileInputStream(pConfigXmlPath);
+ UniversalDetector lDetector = new UniversalDetector(null);
+ byte[] lBuff = new byte[512];
+ int liread;
+ while ((liread = lFis.read(lBuff)) > 0 && !lDetector.isDone()) {
+ lDetector.handleData(lBuff, 0, liread);
+ }
+ lDetector.dataEnd();
+ String lstrEncoding = lDetector.getDetectedCharset();
+ lDetector.reset();
+ return lstrEncoding;
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ if (lFis != null) {
+ try {
+ lFis.close();
+ } catch (IOException e) {
+ // Ignore
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Terminate the created session and reset the initialized Server SDK library.
+ */
+ public static void terminateWSClient() {
+ try {
+ FSHelperLibrary.logInfo("Terminating FSHelper Library");
+ if (FSHelperLibrary.isTerminated() == false) {
+ System.out.println("FSHelperLibrary.isTerminated(): " + FSHelperLibrary.isTerminated());
+ FSHelperLibrary.terminate();
+ }
+ } catch (FSHelperException e) {
+ FSHelperLibrary.logError(e.getMessage(), e);
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/RSA Key Pair Generation Sample Tool.zip b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/RSA Key Pair Generation Sample Tool.zip
new file mode 100755
index 0000000..edb199e
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/RSA Key Pair Generation Sample Tool.zip differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Unprotect Any File using Elevated EA.pptx b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Unprotect Any File using Elevated EA.pptx
new file mode 100755
index 0000000..91cfc94
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Unprotect Any File using Elevated EA.pptx differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Use Elevated Enterprise Application to Unprotect Any File - Technical Document.docx b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Use Elevated Enterprise Application to Unprotect Any File - Technical Document.docx
new file mode 100755
index 0000000..816acf0
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Appendix - Unprotect Any File using Elevated EA/Use Elevated Enterprise Application to Unprotect Any File - Technical Document.docx differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/Readme.txt b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/Readme.txt
new file mode 100755
index 0000000..4c4f2b3
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/Readme.txt
@@ -0,0 +1,22 @@
+
+Unprotect & Unwrap in EA context Sample App
+===========================================
+
+Deployment Steps:
+------------------
+1. make sure your policy server is running . This app requires java 8 or above to run so make
+ sure java 8 or above is installed.
+
+2. go inside 'bin/Unprotect & Unwrap in EA context Sample App'
+
+3. Configure the 'tenant config.xml' in 'config/'
+ a. Policy Server Details:
+ server : Server name on which Policy Server is running
+ port : Server Port on which Policy Server is running
+ app-name : Policy Server application name
+
+ b. fill hot folder details i.e id and passphrase
+
+4. If you are using java 8 , put libs present inside 'doc/JCE Files/java8' into 'bin/Unprotect & Unwrap in EA context Sample App/lib'
+
+5. click on run.bat to start sample app , follow instruction on terminal
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/config/cabinet config.xml b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/config/cabinet config.xml
new file mode 100644
index 0000000..1d6eba7
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/config/cabinet config.xml
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+ false
+
+
+
+
+
+ false
+
+
+ en
+
+
+
+
+ 50
+
+ 900
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/config/config.xml b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/config/config.xml
new file mode 100644
index 0000000..11362a7
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/config/config.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+ true
+
+ false
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/config/log4j.properties b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/config/log4j.properties
new file mode 100755
index 0000000..8293be6
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/config/log4j.properties
@@ -0,0 +1,15 @@
+
+log4j.category.WSCLIENT=debug, WSCLIENT
+
+# If we want to change the Appender, we have to change
+# UtilFunction.initializeLoggers() too, because it assumes that the appender
+# is 'org.apache.log4j.RollingFileAppender' and changes path of the file by
+# getting appender from this logger.
+log4j.appender.WSCLIENT=com.seclore.fs.ws.client.logger.DailyZippedRollingFileAppender
+# Path of the file should be relative to application ROOT
+log4j.appender.WSCLIENT.File=logs/WSClient.log
+log4j.appender.WSCLIENT.MaxFileSize=10MB
+#log4j.appender.REQUEST_LOGGER.MaxBackupIndex=10
+log4j.appender.WSCLIENT.DatePattern='_'yyyy-MM-dd
+log4j.appender.WSCLIENT.layout=org.apache.log4j.PatternLayout
+log4j.appender.WSCLIENT.layout.ConversionPattern=%d{MMM dd, yyyy HH:mm:ss.SSS} %F:%L%n%p: %m%n
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/config/log4j2.xml b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/config/log4j2.xml
new file mode 100644
index 0000000..0756304
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/config/log4j2.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+ ${ctx:applicationPath}/logs
+
+
+
+
+
+
+
+
+
+
+
+
+ UTF-8
+ %d{MMM dd, yyyy HH:mm:ss.SSS}: %t: %p: %m%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/bc-fips-1.0.2.4.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/bc-fips-1.0.2.4.jar
new file mode 100644
index 0000000..a38f9d0
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/bc-fips-1.0.2.4.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/commons-codec-1.6.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/commons-codec-1.6.jar
new file mode 100644
index 0000000..ee1bc49
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/commons-codec-1.6.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/disruptor-3.3.7.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/disruptor-3.3.7.jar
new file mode 100644
index 0000000..1777a37
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/disruptor-3.3.7.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/fs-smaillibrary-1.2.7.0.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/fs-smaillibrary-1.2.7.0.jar
new file mode 100644
index 0000000..c01ec4a
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/fs-smaillibrary-1.2.7.0.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/fs-ws-client-4.4.18.0.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/fs-ws-client-4.4.18.0.jar
new file mode 100644
index 0000000..d0a949c
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/fs-ws-client-4.4.18.0.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/juniversalchardet-1.0.3.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/juniversalchardet-1.0.3.jar
new file mode 100755
index 0000000..1af703f
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/juniversalchardet-1.0.3.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/log4j-api-2.17.1.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/log4j-api-2.17.1.jar
new file mode 100644
index 0000000..1aae243
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/log4j-api-2.17.1.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/log4j-core-2.17.1.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/log4j-core-2.17.1.jar
new file mode 100644
index 0000000..4682527
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/log4j-core-2.17.1.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/sample-app.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/sample-app.jar
new file mode 100644
index 0000000..bcc2a03
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/sample-app.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/seclore-io-1.0.0.0.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/seclore-io-1.0.0.0.jar
new file mode 100644
index 0000000..365237b
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/seclore-io-1.0.0.0.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/xercesImpl-2.12.2.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/xercesImpl-2.12.2.jar
new file mode 100644
index 0000000..ccbae9f
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/xercesImpl-2.12.2.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/run.bat b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/run.bat
new file mode 100755
index 0000000..2bf9ca8
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/run.bat
@@ -0,0 +1,16 @@
+@echo off
+set "CURRENT_DIR=%cd%"
+echo ---------------------------------------------------------------
+echo Seclore 'Unprotect and Unwrap in EA context Sample App' Utility
+echo ---------------------------------------------------------------
+echo.
+
+rem if your want to run on a different jdk or java path is not configured uncomment below line
+rem for example ,
+rem set path="C:\Program Files\Java\jdk-11.0.1\bin";
+java -version
+echo.
+REM uncomment below line to see the version of sample app i.e( remove REM mentioned below)
+REM java -cp "./lib/sample-app.jar"; com.seclore.fs.protect.example.Version
+ java -cp "./lib/*"; com.seclore.fs.protect.example.main.SecloreMain
+pause
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/doc/Developer_s Reference.txt b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/doc/Developer_s Reference.txt
new file mode 100755
index 0000000..d49ade4
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/doc/Developer_s Reference.txt
@@ -0,0 +1,37 @@
+FileSecure Interfaces integration source code reference.
+
+FS Helper Initialization
+------------------------
+ - At application startup initializing FSHelperlibrary and FSHelper
+ - Below classes are used for the same
+ - SecloreMain
+ - static block :-
+ InitializeWSClient.initializeHelperLibrary((FSHELPERLIBRARY_CONFIG_XML_PATH, ););
+ InitializeWSClient.initializeHelper(HELPER_INSTANCE_KEY, FSHELPER_RESOURCE_PATH, FSHELPER_CONFIG_XML_PATH, );
+ - InitializeWSClient
+ - initializeHelperLibrary( ... )
+ - initializeHelper( ... )
+
+
+
+Main Class
+------------
+ - com.seclore.fs.protect.example.main
+ - SecloreMain class
+
+Note:
+=====
+while preparing xml string for request or response. please escape below spacial character for the string which will be written within xml tag.
+ "&" -> "&"
+ "<" -> "<"
+ ">", -> ">"
+ "\"" -> """
+ "'" -> "'";
+
+ Refer: com.seclore.fs.protect.example.util.XMLUtil class and
+ - escapeForXML () method
+
+Example: sample xml is "Sample Sales & purchase report.pdf "
+ here "Sample Sales and purchase report" should be escaped.
+ Use: String fileName = XMLHelper.escapeForXML( "Sample Sales & purchase report" );
+ ""+fileName+" "
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/doc/JCE Files/Java7/US_export_policy.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/doc/JCE Files/Java7/US_export_policy.jar
new file mode 100755
index 0000000..7173213
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/doc/JCE Files/Java7/US_export_policy.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/doc/JCE Files/Java7/local_policy.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/doc/JCE Files/Java7/local_policy.jar
new file mode 100755
index 0000000..c34d036
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/doc/JCE Files/Java7/local_policy.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/doc/JCE Files/Java8/US_export_policy.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/doc/JCE Files/Java8/US_export_policy.jar
new file mode 100755
index 0000000..251b102
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/doc/JCE Files/Java8/US_export_policy.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/doc/JCE Files/Java8/local_policy.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/doc/JCE Files/Java8/local_policy.jar
new file mode 100755
index 0000000..1c58939
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/doc/JCE Files/Java8/local_policy.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/.classpath b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/.classpath
new file mode 100755
index 0000000..4e3bf4d
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/.classpath
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/.project b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/.project
new file mode 100755
index 0000000..adbd983
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/.project
@@ -0,0 +1,17 @@
+
+
+ Unprotect & Unwrap in EA context Sample App Code
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+
+ org.eclipse.jdt.core.javanature
+
+
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/.settings/org.eclipse.jdt.core.prefs b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/.settings/org.eclipse.jdt.core.prefs
new file mode 100755
index 0000000..3a21537
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,11 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/bin/com/seclore/fs/protect/example/Version.class b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/bin/com/seclore/fs/protect/example/Version.class
new file mode 100644
index 0000000..a202905
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/bin/com/seclore/fs/protect/example/Version.class differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/bin/com/seclore/fs/protect/example/core/InitializeWSClient.class b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/bin/com/seclore/fs/protect/example/core/InitializeWSClient.class
new file mode 100644
index 0000000..0326058
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/bin/com/seclore/fs/protect/example/core/InitializeWSClient.class differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/bin/com/seclore/fs/protect/example/main/SecloreMain.class b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/bin/com/seclore/fs/protect/example/main/SecloreMain.class
new file mode 100644
index 0000000..1ccaea7
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/bin/com/seclore/fs/protect/example/main/SecloreMain.class differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/config/cabinet config.xml b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/config/cabinet config.xml
new file mode 100644
index 0000000..1d6eba7
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/config/cabinet config.xml
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+ false
+
+
+
+
+
+ false
+
+
+ en
+
+
+
+
+ 50
+
+ 900
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/config/config.xml b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/config/config.xml
new file mode 100644
index 0000000..11362a7
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/config/config.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+ true
+
+ false
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/config/log4j.properties b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/config/log4j.properties
new file mode 100755
index 0000000..8293be6
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/config/log4j.properties
@@ -0,0 +1,15 @@
+
+log4j.category.WSCLIENT=debug, WSCLIENT
+
+# If we want to change the Appender, we have to change
+# UtilFunction.initializeLoggers() too, because it assumes that the appender
+# is 'org.apache.log4j.RollingFileAppender' and changes path of the file by
+# getting appender from this logger.
+log4j.appender.WSCLIENT=com.seclore.fs.ws.client.logger.DailyZippedRollingFileAppender
+# Path of the file should be relative to application ROOT
+log4j.appender.WSCLIENT.File=logs/WSClient.log
+log4j.appender.WSCLIENT.MaxFileSize=10MB
+#log4j.appender.REQUEST_LOGGER.MaxBackupIndex=10
+log4j.appender.WSCLIENT.DatePattern='_'yyyy-MM-dd
+log4j.appender.WSCLIENT.layout=org.apache.log4j.PatternLayout
+log4j.appender.WSCLIENT.layout.ConversionPattern=%d{MMM dd, yyyy HH:mm:ss.SSS} %F:%L%n%p: %m%n
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/config/log4j2.xml b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/config/log4j2.xml
new file mode 100644
index 0000000..0756304
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/config/log4j2.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+ ${ctx:applicationPath}/logs
+
+
+
+
+
+
+
+
+
+
+
+
+ UTF-8
+ %d{MMM dd, yyyy HH:mm:ss.SSS}: %t: %p: %m%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/bc-fips-1.0.2.4.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/bc-fips-1.0.2.4.jar
new file mode 100644
index 0000000..a38f9d0
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/bc-fips-1.0.2.4.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/commons-codec-1.6.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/commons-codec-1.6.jar
new file mode 100644
index 0000000..ee1bc49
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/commons-codec-1.6.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/disruptor-3.3.7.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/disruptor-3.3.7.jar
new file mode 100644
index 0000000..1777a37
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/disruptor-3.3.7.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/fs-smaillibrary-1.2.7.0.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/fs-smaillibrary-1.2.7.0.jar
new file mode 100644
index 0000000..c01ec4a
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/fs-smaillibrary-1.2.7.0.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/fs-ws-client-4.4.18.0.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/fs-ws-client-4.4.18.0.jar
new file mode 100644
index 0000000..d0a949c
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/fs-ws-client-4.4.18.0.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/juniversalchardet-1.0.3.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/juniversalchardet-1.0.3.jar
new file mode 100755
index 0000000..1af703f
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/juniversalchardet-1.0.3.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/log4j-api-2.17.1.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/log4j-api-2.17.1.jar
new file mode 100644
index 0000000..1aae243
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/log4j-api-2.17.1.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/log4j-core-2.17.1.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/log4j-core-2.17.1.jar
new file mode 100644
index 0000000..4682527
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/log4j-core-2.17.1.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/seclore-io-1.0.0.0.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/seclore-io-1.0.0.0.jar
new file mode 100644
index 0000000..365237b
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/seclore-io-1.0.0.0.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/xercesImpl-2.12.2.jar b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/xercesImpl-2.12.2.jar
new file mode 100644
index 0000000..ccbae9f
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/xercesImpl-2.12.2.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/src/com/seclore/fs/protect/example/Version.java b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/src/com/seclore/fs/protect/example/Version.java
new file mode 100755
index 0000000..df17df2
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/src/com/seclore/fs/protect/example/Version.java
@@ -0,0 +1,23 @@
+package com.seclore.fs.protect.example;
+
+/**
+ * Represents the Sample App version.
+ */
+public class Version
+{
+ /**
+ * The version of the Sample App.
+ */
+ public static final String Version = "3.0.0.0";
+
+ /**
+ * Displays the version of the Sample App
+ *
+ * @param args
+ */
+ public static void main(String[] args)
+ {
+ System.out.println("Sample App version : " + Version);
+ System.out.println("Copyright (c) 2008 Seclore Technology Pvt. Ltd.");
+ }
+}
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/src/com/seclore/fs/protect/example/core/InitializeWSClient.java b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/src/com/seclore/fs/protect/example/core/InitializeWSClient.java
new file mode 100755
index 0000000..6b3cd08
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/src/com/seclore/fs/protect/example/core/InitializeWSClient.java
@@ -0,0 +1,193 @@
+package com.seclore.fs.protect.example.core;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringWriter;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.mozilla.universalchardet.UniversalDetector;
+import org.w3c.dom.Document;
+import org.xml.sax.InputSource;
+
+import com.seclore.fs.helper.exception.FSHelperException;
+import com.seclore.fs.helper.library.FSHelperLibrary;
+
+public class InitializeWSClient {
+ /**
+ * @param configPath
+ * Takes the application config file path as input
+ * @throws Exception
+ */
+ public static void initializeHelperLibrary(String configPath) throws Exception {
+ try {
+ String configContentXMLString = getConfigFileContent(configPath);
+ // Initialize method takes WSClient config content not the config file path.
+ FSHelperLibrary.initialize(configContentXMLString);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * @param helperId
+ * Tenant Id
+ * @param helperResourcePath
+ * Resource Path for files of Seclore Policy Server.
+ * To be left empty here.
+ * @param helperConfigPath
+ * File path for 'tenant config.xml' file
+ * @throws Exception
+ * Code snippet won't run if any exception is thrown in this
+ * block
+ */
+ public static void initializeHelper(String pHelperId, String pHelperResourcePath, String pHelperConfigPath)
+ throws Exception {
+ try {
+ String configContentXMLString = getConfigFileContent(pHelperConfigPath);
+ // Initialize method takes WSClient config content not the config file path.
+ FSHelperLibrary.initializeHelper(pHelperId, pHelperResourcePath, configContentXMLString);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * This method reads an XML file and returns the content of the XML file in
+ * string format
+ *
+ * @param appPath
+ * XML file path
+ * @return File content in string format
+ * @throws Exception
+ */
+ private static String getConfigFileContent(String pAppPath) throws Exception {
+ validateConfigFile(pAppPath);
+
+ InputStream inputStream = null;
+ try {
+ String lstrEncoding = detectEncoding(pAppPath);
+ if (lstrEncoding == null || lstrEncoding.trim().isEmpty()) {
+ lstrEncoding = "UTF-8";
+ }
+
+ DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
+ builderFactory.setNamespaceAware(false);
+ builderFactory.setValidating(false);
+ DocumentBuilder builder = builderFactory.newDocumentBuilder();
+ inputStream = new FileInputStream(pAppPath);
+ InputSource lInputSource = new InputSource(inputStream);
+ lInputSource.setEncoding(lstrEncoding);
+ Document document = builder.parse(lInputSource);
+
+ TransformerFactory lTransFactory = TransformerFactory.newInstance();
+ Transformer lTrans = lTransFactory.newTransformer();
+ DOMSource lSource = new DOMSource(document);
+ StringWriter lStringWriter = new StringWriter();
+ lTrans.transform(lSource, new StreamResult(lStringWriter));
+ return lStringWriter.toString();
+ } catch (Exception e) {
+ System.out.println("*** Config file should be in UTF-8 encoding ***");
+ e.printStackTrace();
+ System.exit(0);
+ } finally {
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (IOException ioException) {
+ // ignore
+ }
+ }
+ }
+ return "";
+ }
+
+ /**
+ * Validates whether the file exists at the given location & has valid BOM
+ * format
+ *
+ * @param configFilePath
+ * @throws Exception
+ * @return The file object representing the configFilePath
+ */
+ private static File validateConfigFile(String configFilePath) throws Exception {
+
+ if (configFilePath == null || configFilePath.trim().isEmpty()) {
+ throw new Exception("Configuration File path is not provided.");
+ }
+
+ File file = new File(configFilePath);
+ if (!file.exists()) {
+ throw new Exception("Configuration File does not exist at '" + file.getAbsolutePath() + "'");
+ }
+
+ if (!file.isFile()) {
+ throw new Exception("'" + file.getAbsolutePath() + "' is not a file.");
+ }
+
+ // Length 3 is checked to make sure that enough bytes are available for
+ // BOM reading.
+ if (file.length() < 3) {
+ throw new Exception("'" + file.getAbsolutePath() + "' is not a valid configuration file.");
+ }
+ return file;
+ }
+
+ /**
+ * Detect encoding format of file
+ *
+ * @param pConfigXmlPath
+ * File path whose encoding type is to be detected
+ * @return encoding format (eg: utf-8, utf-16)
+ */
+ public static String detectEncoding(String pConfigXmlPath) {
+ FileInputStream lFis = null;
+ try {
+ lFis = new FileInputStream(pConfigXmlPath);
+ UniversalDetector lDetector = new UniversalDetector(null);
+ byte[] lBuff = new byte[512];
+ int liread;
+ while ((liread = lFis.read(lBuff)) > 0 && !lDetector.isDone()) {
+ lDetector.handleData(lBuff, 0, liread);
+ }
+ lDetector.dataEnd();
+ String lstrEncoding = lDetector.getDetectedCharset();
+ lDetector.reset();
+ return lstrEncoding;
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ if (lFis != null) {
+ try {
+ lFis.close();
+ } catch (IOException e) {
+ // Igniore
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Terminate the created session and reset the initialized Server SDK library.
+ */
+ public static void terminateWSClient() {
+ try {
+ FSHelperLibrary.logInfo("Terminating FSHelper Library");
+ if (FSHelperLibrary.isTerminated() == false) {
+ System.out.println("FSHelperLibrary.isTerminated(): " + FSHelperLibrary.isTerminated());
+ FSHelperLibrary.terminate();
+ }
+ } catch (FSHelperException e) {
+ FSHelperLibrary.logError(e.getMessage(), e);
+ }
+ }
+
+}
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/src/com/seclore/fs/protect/example/main/SecloreMain.java b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/src/com/seclore/fs/protect/example/main/SecloreMain.java
new file mode 100755
index 0000000..f5e5dae
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/src/com/seclore/fs/protect/example/main/SecloreMain.java
@@ -0,0 +1,102 @@
+package com.seclore.fs.protect.example.main;
+
+import java.util.Scanner;
+
+import com.seclore.fs.helper.core.UnprotectedFile;
+import com.seclore.fs.helper.library.FSHelper;
+import com.seclore.fs.helper.library.FSHelperLibrary;
+import com.seclore.fs.protect.example.core.InitializeWSClient;
+
+public class SecloreMain {
+ // # FS Helper library is multi-tenant. Use unique tenant identifier for each
+ // tenant
+ private static String tenantID = "Tenant-1";
+
+ // # This file contains information about the Application into which this code
+ // snippet is to be integrated.
+ private static final String appConfigXMLFilePath = "config/config.xml";
+
+ // # This file contains info for creating session with Seclore Policy Server and
+ // initializing Server SDK library
+ private static final String tenantConfigXMLFilePath = "config/cabinet config.xml";
+
+ // # Used to take user input
+ private static Scanner scanner = null;
+
+ /**
+ *
+ * This block initializes the Server SDK library and creates a session with
+ * Seclore Policy Server
+ *
+ *
+ * @exception Code snippet won't run if any exception is thrown in this block.
+ */
+ static {
+ try {
+ InitializeWSClient.initializeHelperLibrary(appConfigXMLFilePath);
+ InitializeWSClient.initializeHelper(tenantID, "", tenantConfigXMLFilePath);
+ scanner = new Scanner(System.in);
+ } catch (Exception e) {
+ e.printStackTrace();
+ System.exit(0);
+ }
+ }
+
+ // # Entry point to run this application
+ public static void main(String[] args) {
+ try {
+ String outputFilePath = UnwrapAndunprotectFile();
+
+ if (outputFilePath != null && !outputFilePath.trim().isEmpty()) {
+ System.out.println("File '" + outputFilePath + "' is unwrapped and unprotected successfully");
+ } else {
+ throw new Exception("Unexpected error");
+ }
+
+ } catch (Exception exp) {
+ exp.printStackTrace();
+ } finally {
+ if (scanner != null) {
+ scanner.close();
+ }
+
+ InitializeWSClient.terminateWSClient();
+ }
+
+ }
+
+ /**
+ * unprotect and unWrap a file using Seclore SDK
+ *
+ * @return the absolute file path of unprotected file
+ * @throws Exception
+ */
+ public static String UnwrapAndunprotectFile() throws Exception {
+ System.out.println("Enter absolute path of the file to be unwrapped & unprotected:");
+ String wrappedAndProtectedFilePath = scanner.nextLine();
+
+ // # get the FSHelper object by specifying the tenantId.
+ // note: This tenant id should be same which was used during initialization of
+ // Seclore SDK
+ FSHelper tenantObj = FSHelperLibrary.getHelper(tenantID);
+
+ // throw error if the file is not HTML wrapped
+ if (tenantObj.isHTMLWrapped(wrappedAndProtectedFilePath) == false) {
+ throw new Exception("File '" + wrappedAndProtectedFilePath + "' is not HTML wrapped");
+ }
+
+ // # this display file name goes in activity log
+ // for more details see javadoc of FSHelper.unwrapAndUnprotect()
+ String displayFilePath = wrappedAndProtectedFilePath;
+ // # activity comments to be shown
+ String actvityComments = "Unprotected by using FS Helper Library's unwrapAndUnprotect method";
+
+ // # calling Seclore SDK's unwrapAndUnprotect api
+ UnprotectedFile unprotectedFile = tenantObj.unwrapAndUnprotect(null,
+ wrappedAndProtectedFilePath,
+ displayFilePath,
+ actvityComments);
+ return unprotectedFile.getFilePath();
+ }
+
+}
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Unwrap & Unprotect Sample Code Walkthrough.mp4 b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Unwrap & Unprotect Sample Code Walkthrough.mp4
new file mode 100755
index 0000000..6a32104
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Unwrap & Unprotect Sample Code Walkthrough.mp4 differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Unwrap and Unprotect in EA context - Enterprise Policy Server.pptx b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Unwrap and Unprotect in EA context - Enterprise Policy Server.pptx
new file mode 100755
index 0000000..b21e371
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/Unwrap and Unprotect in EA context - Enterprise Policy Server.pptx differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/scripts/build.sh b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/scripts/build.sh
new file mode 100755
index 0000000..50c5566
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Enterprise Policy Server/scripts/build.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+set -e
+
+# Set the project root directory
+PROJECT_ROOT=$(dirname "$0")/..
+
+# Clean all bin folders
+rm -rf "$PROJECT_ROOT/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/config"/*
+rm -rf "$PROJECT_ROOT/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib"/*
+
+# Clear the src/bin dir containing compiled class files
+rm -rf "$PROJECT_ROOT/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/bin"/*
+
+#find and compile all java files
+find "$PROJECT_ROOT/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/src" -name "*.java" -exec javac -d "$PROJECT_ROOT/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/bin" -cp "$PROJECT_ROOT/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/*" {} +
+
+# Package the compiled classes into a JAR file
+jar cvf "$PROJECT_ROOT/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/sample-app.jar" -C "$PROJECT_ROOT/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/bin" .
+
+# Copy all libs and config files to bin
+cp -r "$PROJECT_ROOT/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib"/* "$PROJECT_ROOT/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib"
+cp -r "$PROJECT_ROOT/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/config"/* "$PROJECT_ROOT/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/config"
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/Readme.txt b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/Readme.txt
new file mode 100755
index 0000000..c48caf0
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/Readme.txt
@@ -0,0 +1,57 @@
+=======================================
+Get Advanced EA Helper
+=======================================
+
+---------------------------
+Pre-requisites/Assumptions
+---------------------------
+1) Seclore Policy Server is up and running.
+3) An Elevated Enterprise Application (EA) is configured on the Seclore Policy Server.
+4) This utility is configured to run with Seclore Server SDK (4.4.7.0)
+
+
+
+------
+Notes
+------
+1) To use current working directory as the Application Path in '/config/config.xml' file, use "."
+ e.g .
+
+ Otherwise, enter the complete absolute path
+ e.g C:\Seclore\Elevated EA Utility\Source
+
+2) Sample public and private key xml files used to set up an Elevated EA have also been provided at :
+ 'Elevated EA Utility/Docs/samples/publicKey.xml'
+ 'Elevated EA Utility/Docs/samples/privateKey.xml'
+
+------------------
+Configuration Steps:
+------------------
+1. Put the JCE jar files (specific to JRE version) from 'Elevated EA Utility/Docs/JCE Files/' into 'JRE/lib/security/' folder of the system. This utility requires JDK version 1.8 or higher to run. The utility displays the JDK version it uses when you execute the 'run.bat' file.
+
+2. Configure the 'config.xml' file located in 'Elevated EA Utility/Source/config/'.
+ a. app-path : This is the absolute path of the application
+ - place a dot "." or put the absolute application path
+ - example: C:\Seclore\Seclore SDK Sample Code\Source
+ b. initalize-logger : This can be true/false depending upon the logging implementation.
+
+3. Configure the 'tenant config.xml' located in 'Elevated EA Utility/Source/config/'
+ a. Policy Server Details:
+ server : Server name on which Policy Server is running
+ port : Server Port on which Policy Server is running
+ app-name : Policy Server application name
+
+ b. Login details:
+ When using Hot Folder cabinet (EA) context i.e (1 ) :
+ id : ID of the Elevated Enterprise Application (EA) on the Seclore Policy Server.
+ passphrase : Passphrase of the Elevated Enterprise Application.
+ allow-advanced-privileges : 'false' by default. To enable advanced privileges for this EA, set this to 'true'
+
+3. Populate the 'config.properties' in 'Elevated EA Utility/Source/config/'. Some values are pre-populated which must not be changed.
+ ea.active.key.id : Elevated EA active key id which is displayed on EA config details page on Policy Server portal under the "Advanced Security" section titled 'Active Key ID'.
+
+ ea.private.key.xml.path : The absolute path of the private key xml file whose public key was used to configure the Elevated EA.
+ eg. ea.private.key.xml.path=C:\\Users\\Desktop\\EA Advanced Security Keys\\privateKeyXML.xml
+
+
+
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/Readme.txt b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/Readme.txt
new file mode 100755
index 0000000..893cdc6
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/Readme.txt
@@ -0,0 +1,60 @@
+=======================================
+Get Advanced EA Helper
+=======================================
+
+---------------------------
+Pre-requisites/Assumptions
+---------------------------
+1) Seclore Policy Server is up and running.
+3) An Elevated Enterprise Application (EA) is configured on the Seclore Policy Server.
+4) This utility is configured to run with Seclore Server SDK (4.4.7.0)
+
+
+
+------
+Notes
+------
+1) To use current working directory as the Application Path in '/config/config.xml' file, use "."
+ e.g .
+
+ Otherwise, enter the complete absolute path
+ e.g C:\Seclore\Elevated EA Utility\Source
+
+2) Sample public and private key xml files used to set up an Elevated EA have also been provided at :
+ 'Elevated EA Utility/Docs/samples/publicKey.xml'
+ 'Elevated EA Utility/Docs/samples/privateKey.xml'
+
+------------------
+Configuration Steps:
+------------------
+1. Put the JCE jar files (specific to JRE version) from 'Elevated EA Utility/Docs/JCE Files/' into 'JRE/lib/security/' folder of the system. This utility requires JDK version 1.8 or higher to run. The utility displays the JDK version it uses when you execute the 'run.bat' file.
+
+2. Configure the 'config.xml' file located in 'Elevated EA Utility/Source/config/'.
+ a. app-path : This is the absolute path of the application
+ - place a dot "." or put the absolute application path
+ - example: C:\Seclore\Seclore SDK Sample Code\Source
+ b. initalize-logger : This can be true/false depending upon the logging implementation.
+
+3. Configure the 'tenant config.xml' located in 'Elevated EA Utility/Source/config/'
+ a. Policy Server Details:
+ server : Server name on which Policy Server is running
+ port : Server Port on which Policy Server is running
+ app-name : Policy Server application name
+
+ b. Login details:
+ When using Hot Folder cabinet (EA) context i.e (1 ) :
+ id : ID of the Elevated Enterprise Application (EA) on the Seclore Policy Server.
+ passphrase : Passphrase of the Elevated Enterprise Application.
+ allow-advanced-privileges : 'false' by default. To enable advanced privileges for this EA, set this to 'true'
+
+3. Populate the 'config.properties' in 'Elevated EA Utility/Source/config/'. Some values are pre-populated which must not be changed.
+ ea.active.key.id : Elevated EA active key id which is displayed on EA config details page on Policy Server portal under the "Advanced Security" section titled 'Active Key ID'.
+
+ ea.private.key.xml.path : The absolute path of the private key xml file whose public key was used to configure the Elevated EA.
+ eg. ea.private.key.xml.path=C:\\Users\\Desktop\\EA Advanced Security Keys\\privateKeyXML.xml
+
+4. Execute "run.bat" to get the utility running.
+
+
+
+
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/config/config.properties b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/config/config.properties
new file mode 100755
index 0000000..e9e5022
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/config/config.properties
@@ -0,0 +1,6 @@
+#config details of logged in EA (visible in PS Portal)
+ea.active.key.id=
+ea.private.key.xml.path=
+ea.key.chaining.mode=ECB
+ea.key.padding.scheme=PKCS1Padding
+ea.key.length=256
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/config/config.xml b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/config/config.xml
new file mode 100755
index 0000000..9cc30b9
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/config/config.xml differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/config/log4j.properties b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/config/log4j.properties
new file mode 100755
index 0000000..8293be6
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/config/log4j.properties
@@ -0,0 +1,15 @@
+
+log4j.category.WSCLIENT=debug, WSCLIENT
+
+# If we want to change the Appender, we have to change
+# UtilFunction.initializeLoggers() too, because it assumes that the appender
+# is 'org.apache.log4j.RollingFileAppender' and changes path of the file by
+# getting appender from this logger.
+log4j.appender.WSCLIENT=com.seclore.fs.ws.client.logger.DailyZippedRollingFileAppender
+# Path of the file should be relative to application ROOT
+log4j.appender.WSCLIENT.File=logs/WSClient.log
+log4j.appender.WSCLIENT.MaxFileSize=10MB
+#log4j.appender.REQUEST_LOGGER.MaxBackupIndex=10
+log4j.appender.WSCLIENT.DatePattern='_'yyyy-MM-dd
+log4j.appender.WSCLIENT.layout=org.apache.log4j.PatternLayout
+log4j.appender.WSCLIENT.layout.ConversionPattern=%d{MMM dd, yyyy HH:mm:ss.SSS} %F:%L%n%p: %m%n
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/config/log4j2.xml b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/config/log4j2.xml
new file mode 100755
index 0000000..6902efe
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/config/log4j2.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+ ${ctx:applicationPath}/logs
+
+
+
+
+
+
+
+
+
+
+
+
+ UTF-8
+ %d{MMM dd, yyyy HH:mm:ss.SSS} :%t %n%p: %m%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/config/tenant config.xml b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/config/tenant config.xml
new file mode 100755
index 0000000..a88ffcc
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/config/tenant config.xml differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/bc-fips-1.0.0.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/bc-fips-1.0.0.jar
new file mode 100755
index 0000000..321e563
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/bc-fips-1.0.0.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/commons-codec-1.6.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/commons-codec-1.6.jar
new file mode 100755
index 0000000..ee1bc49
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/commons-codec-1.6.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/disruptor-3.3.7.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/disruptor-3.3.7.jar
new file mode 100755
index 0000000..1777a37
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/disruptor-3.3.7.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/fs-smaillibrary.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/fs-smaillibrary.jar
new file mode 100755
index 0000000..aa95e22
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/fs-smaillibrary.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/fs-ws-client-4.4.7.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/fs-ws-client-4.4.7.jar
new file mode 100755
index 0000000..bf2adcf
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/fs-ws-client-4.4.7.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/juniversalchardet-1.0.3.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/juniversalchardet-1.0.3.jar
new file mode 100755
index 0000000..1af703f
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/juniversalchardet-1.0.3.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/log4j-1.2.14.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/log4j-1.2.14.jar
new file mode 100755
index 0000000..6251307
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/log4j-1.2.14.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/log4j-api-2.10.0.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/log4j-api-2.10.0.jar
new file mode 100755
index 0000000..9603b1b
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/log4j-api-2.10.0.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/log4j-core-2.10.0.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/log4j-core-2.10.0.jar
new file mode 100755
index 0000000..1be9e67
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/log4j-core-2.10.0.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/sample-app.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/sample-app.jar
new file mode 100755
index 0000000..90af6de
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/sample-app.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/xercesImpl-X.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/xercesImpl-X.jar
new file mode 100755
index 0000000..38fca83
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/lib/xercesImpl-X.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/run.bat b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/run.bat
new file mode 100755
index 0000000..98082e8
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/bin/run.bat
@@ -0,0 +1,14 @@
+@echo off
+set "CURRENT_DIR=%cd%"
+echo -------------------------------------------------------
+echo Seclore 'Get Advanced EA Helper' Utility
+echo -------------------------------------------------------
+echo.
+java -version
+echo.
+
+REM uncomment below line to see the version of sample app i.e( remove REM mentioned below)
+REM java -cp "./lib/sample-app.jar"; com.seclore.fs.ea.advanced.example.Version
+ java -cp "./lib/*"; com.seclore.fs.ea.advanced.example.main.SecloreMain
+pause
+
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/doc/Developer_s Reference.txt b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/doc/Developer_s Reference.txt
new file mode 100755
index 0000000..7bf2ed5
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/doc/Developer_s Reference.txt
@@ -0,0 +1,23 @@
+==========================================================
+FileSecure Interfaces integration source code reference
+==========================================================
+
+------------------------
+FS Helper Initialization
+------------------------
+ - At application startup, loading 'config.properties' file located in 'Seclore SDK Sample Code/Source/config'
+ - Then initializing FSHelperlibrary and FSHelper
+ - Below classes are used for the same
+ - SecloreMain
+ - static block :-
+ initializeHelperLibrary( FSHELPERLIBRARY_CONFIG_XML_PATH );
+ initializeHelper( HELPER_INSTANCE_KEY, FSHELPER_RESOURCE_PATH, FSHELPER_CONFIG_XML_PATH );
+ - Note that here since we are using an Elevated EA, we will also need to create an instance of 'DefaultCryptoHandler' to initilalize FSHelper.
+ eg. FSHelperLibrary.initializeHelper(TENANT_ID, FSHELPER_RESOURCE_PATH, FSHELPER_CONFIG_XML_CONTENT, DefaultCryptoHandler);
+
+
+------------
+Main Class
+------------
+ - com.seclore.fs.ea.advanced.example.main
+ - SecloreMain.java
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/doc/JCE Files/Java8/US_export_policy.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/doc/JCE Files/Java8/US_export_policy.jar
new file mode 100755
index 0000000..251b102
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/doc/JCE Files/Java8/US_export_policy.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/doc/JCE Files/Java8/local_policy.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/doc/JCE Files/Java8/local_policy.jar
new file mode 100755
index 0000000..1c58939
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/doc/JCE Files/Java8/local_policy.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/doc/samples/privateKey.xml b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/doc/samples/privateKey.xml
new file mode 100755
index 0000000..3c25134
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/doc/samples/privateKey.xml differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/doc/samples/publicKey.xml b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/doc/samples/publicKey.xml
new file mode 100755
index 0000000..517b12f
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/doc/samples/publicKey.xml differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/.classpath b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/.classpath
new file mode 100755
index 0000000..4e3bf4d
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/.classpath
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/.project b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/.project
new file mode 100755
index 0000000..753a2b5
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/.project
@@ -0,0 +1,17 @@
+
+
+ Get Advanced EA Helper
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+
+ org.eclipse.jdt.core.javanature
+
+
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/.settings/org.eclipse.jdt.core.prefs b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/.settings/org.eclipse.jdt.core.prefs
new file mode 100755
index 0000000..3a21537
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,11 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/bin/com/seclore/fs/ea/advanced/example/Version.class b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/bin/com/seclore/fs/ea/advanced/example/Version.class
new file mode 100755
index 0000000..c569e52
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/bin/com/seclore/fs/ea/advanced/example/Version.class differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/bin/com/seclore/fs/ea/advanced/example/core/Config.class b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/bin/com/seclore/fs/ea/advanced/example/core/Config.class
new file mode 100755
index 0000000..eed4049
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/bin/com/seclore/fs/ea/advanced/example/core/Config.class differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/bin/com/seclore/fs/ea/advanced/example/main/SecloreMain.class b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/bin/com/seclore/fs/ea/advanced/example/main/SecloreMain.class
new file mode 100755
index 0000000..defee53
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/bin/com/seclore/fs/ea/advanced/example/main/SecloreMain.class differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/config/config.properties b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/config/config.properties
new file mode 100755
index 0000000..e9e5022
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/config/config.properties
@@ -0,0 +1,6 @@
+#config details of logged in EA (visible in PS Portal)
+ea.active.key.id=
+ea.private.key.xml.path=
+ea.key.chaining.mode=ECB
+ea.key.padding.scheme=PKCS1Padding
+ea.key.length=256
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/config/config.xml b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/config/config.xml
new file mode 100755
index 0000000..9cc30b9
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/config/config.xml differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/config/log4j.properties b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/config/log4j.properties
new file mode 100755
index 0000000..8293be6
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/config/log4j.properties
@@ -0,0 +1,15 @@
+
+log4j.category.WSCLIENT=debug, WSCLIENT
+
+# If we want to change the Appender, we have to change
+# UtilFunction.initializeLoggers() too, because it assumes that the appender
+# is 'org.apache.log4j.RollingFileAppender' and changes path of the file by
+# getting appender from this logger.
+log4j.appender.WSCLIENT=com.seclore.fs.ws.client.logger.DailyZippedRollingFileAppender
+# Path of the file should be relative to application ROOT
+log4j.appender.WSCLIENT.File=logs/WSClient.log
+log4j.appender.WSCLIENT.MaxFileSize=10MB
+#log4j.appender.REQUEST_LOGGER.MaxBackupIndex=10
+log4j.appender.WSCLIENT.DatePattern='_'yyyy-MM-dd
+log4j.appender.WSCLIENT.layout=org.apache.log4j.PatternLayout
+log4j.appender.WSCLIENT.layout.ConversionPattern=%d{MMM dd, yyyy HH:mm:ss.SSS} %F:%L%n%p: %m%n
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/config/log4j2.xml b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/config/log4j2.xml
new file mode 100755
index 0000000..6902efe
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/config/log4j2.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+ ${ctx:applicationPath}/logs
+
+
+
+
+
+
+
+
+
+
+
+
+ UTF-8
+ %d{MMM dd, yyyy HH:mm:ss.SSS} :%t %n%p: %m%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/config/tenant config.xml b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/config/tenant config.xml
new file mode 100755
index 0000000..a88ffcc
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/config/tenant config.xml differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/bc-fips-1.0.0.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/bc-fips-1.0.0.jar
new file mode 100755
index 0000000..321e563
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/bc-fips-1.0.0.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/commons-codec-1.6.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/commons-codec-1.6.jar
new file mode 100755
index 0000000..ee1bc49
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/commons-codec-1.6.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/disruptor-3.3.7.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/disruptor-3.3.7.jar
new file mode 100755
index 0000000..1777a37
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/disruptor-3.3.7.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/fs-get-elevated-session.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/fs-get-elevated-session.jar
new file mode 100755
index 0000000..f475f9d
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/fs-get-elevated-session.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/fs-smaillibrary.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/fs-smaillibrary.jar
new file mode 100755
index 0000000..aa95e22
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/fs-smaillibrary.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/fs-ws-client-4.4.7.0.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/fs-ws-client-4.4.7.0.jar
new file mode 100755
index 0000000..bf2adcf
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/fs-ws-client-4.4.7.0.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/juniversalchardet-1.0.3.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/juniversalchardet-1.0.3.jar
new file mode 100755
index 0000000..1af703f
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/juniversalchardet-1.0.3.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/log4j-1.2.14.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/log4j-1.2.14.jar
new file mode 100755
index 0000000..6251307
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/log4j-1.2.14.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/log4j-api-2.10.0.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/log4j-api-2.10.0.jar
new file mode 100755
index 0000000..9603b1b
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/log4j-api-2.10.0.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/log4j-core-2.10.0.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/log4j-core-2.10.0.jar
new file mode 100755
index 0000000..1be9e67
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/log4j-core-2.10.0.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/xercesImpl-X.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/xercesImpl-X.jar
new file mode 100755
index 0000000..38fca83
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/lib/xercesImpl-X.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/src/com/seclore/fs/ea/advanced/example/Version.java b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/src/com/seclore/fs/ea/advanced/example/Version.java
new file mode 100755
index 0000000..b4cd66b
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/src/com/seclore/fs/ea/advanced/example/Version.java
@@ -0,0 +1,23 @@
+package com.seclore.fs.ea.advanced.example;
+
+/**
+ * Represents the Sample App version.
+ */
+public class Version
+{
+ /**
+ * The version of the Sample App.
+ */
+ public static final String Version = "3.0.0.0";
+
+ /**
+ * Displays the version of the Sample App
+ *
+ * @param args
+ */
+ public static void main(String[] args)
+ {
+ System.out.println("Sample App version : " + Version);
+ System.out.println("Copyright (c) 2008 Seclore Technology Pvt. Ltd.");
+ }
+}
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/src/com/seclore/fs/ea/advanced/example/core/Config.java b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/src/com/seclore/fs/ea/advanced/example/core/Config.java
new file mode 100755
index 0000000..f292bb9
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/src/com/seclore/fs/ea/advanced/example/core/Config.java
@@ -0,0 +1,65 @@
+package com.seclore.fs.ea.advanced.example.core;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
+
+public class Config
+{
+ private static Properties props = null;
+
+ /**
+ * Load and initialize the '/config.properties' file
+ * @param configPath
+ * @throws Exception
+ */
+ public static void initConfig(String configPath) throws Exception
+ {
+ InputStream lInputStream = null;
+ try
+ {
+ Properties properties = new Properties();
+ lInputStream = new FileInputStream(configPath);
+ properties.load(lInputStream);
+ props = properties;
+ }
+ catch(Exception lEx)
+ {
+ throw new Exception(lEx);
+ }
+ finally
+ {
+ if( lInputStream != null)
+ {
+ try
+ {
+ lInputStream.close();
+ }
+ catch(IOException ioException)
+ {
+ // Ignore
+ }
+ }
+ }
+ }
+
+ /**
+ * This method reads the value against the specified 'key' and returns it.
+ * In case the value is blank or null, it returns the 'defaultValue' which was passed to this method.
+ * @param key
+ * @param defaultValue
+ * @return
+ * @throws Exception
+ */
+ public static String getProperty(String key, String defaultValue) throws Exception
+ {
+ String propertyValue = props.getProperty(key, defaultValue);
+ if( propertyValue.trim().isEmpty() )
+ {
+ propertyValue = defaultValue;
+ }
+
+ return propertyValue;
+ }
+}
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/src/com/seclore/fs/ea/advanced/example/main/SecloreMain.java b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/src/com/seclore/fs/ea/advanced/example/main/SecloreMain.java
new file mode 100755
index 0000000..7820549
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Get Advance EA Helper/src/src/com/seclore/fs/ea/advanced/example/main/SecloreMain.java
@@ -0,0 +1,320 @@
+package com.seclore.fs.ea.advanced.example.main;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringWriter;
+import java.util.Scanner;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.mozilla.universalchardet.UniversalDetector;
+import org.w3c.dom.Document;
+import org.xml.sax.InputSource;
+
+import com.seclore.fs.ea.advanced.example.core.Config;
+import com.seclore.fs.helper.crypto.DefaultCryptoHandler;
+import com.seclore.fs.helper.exception.FSHelperException;
+import com.seclore.fs.helper.library.FSHelper;
+import com.seclore.fs.helper.library.FSHelperLibrary;
+
+public class SecloreMain {
+
+ private static final String tenantID = "Tenant-1";
+
+ // # This file contains information about the Application into which this code
+ // snippet is to be integrated.
+ private static final String appConfigXMLFilePath = "config/config.xml";
+
+ // # This file contains info for creating session with Seclore Policy Server and
+ // initializing Server SDK library
+ private static final String tenantConfigXMLFilePath = "config/cabinet config.xml";
+
+ // # Used to take user input
+ private static Scanner scanner = null;
+
+ /**
+ *
+ * This block initializes the Server SDK library and creates a session with
+ * Seclore Policy Server
+ *
+ *
+ * @exception Code snippet won't run if any exception is thrown in this block.
+ */
+ static {
+ try {
+ // load config.properties file and then validate the entries in it
+ Config.initConfig("config/config.properties");
+
+ // validate if entries in this file have pre-filled values
+ validateConfigEntries();
+
+ // initialize the FSHelper Library
+ initializeHelperLibrary(appConfigXMLFilePath);
+ initializeHelper(tenantID, "", tenantConfigXMLFilePath);
+
+ scanner = new Scanner(System.in);
+ } catch (Exception e) {
+ e.printStackTrace();
+ System.exit(0);
+ }
+ }
+
+ /**
+ * Main method
+ *
+ * @param args
+ * Takes input from user
+ */
+ public static void main(String[] args) {
+ try {
+ boolean isRequestSuccessful = initializeElevatedHelper();
+ if (isRequestSuccessful) {
+ System.out.println("***** Operation successful. *****");
+ } else {
+ System.out.println("***** Operation failed! *****");
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ if (scanner != null) {
+ scanner.close();
+ }
+ }
+ }
+
+ /**
+ * Validate if properties in this file have pre-filled values
+ *
+ * @throws Exception
+ */
+ private static void validateConfigEntries() throws Exception {
+ String eaActiveKeyId = Config.getProperty("ea.active.key.id", "");
+ if (null == eaActiveKeyId || eaActiveKeyId.trim().isEmpty()) {
+ throw new Exception("Value for property 'ea.active.key.id' missing in config.properties file.");
+ }
+
+ String eaPrivateKeyXMLPath = Config.getProperty("ea.private.key.xml.path", "");
+ if (null == eaPrivateKeyXMLPath || eaPrivateKeyXMLPath.trim().isEmpty()) {
+ throw new Exception("Value for property 'ea.private.key.xml.path' missing in config.properties file.");
+ }
+ }
+
+ /**
+ * This method calls the Server SDK API to process the request for getting file
+ * protection details, which also contains the file classification details
+ * and display the success or error message.
+ *
+ * @return Flag to indicate if operation was successful or not
+ * @throws Exception
+ */
+ private static boolean initializeElevatedHelper() throws Exception {
+ boolean isRequestSuccessful = false;
+ try {
+ // # This object is specific to a tenant. It contains the methods to call Server
+ // SDK API to process any request.
+ FSHelper fsHelper = FSHelperLibrary.getHelper(tenantID);
+ isRequestSuccessful = true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ terminateWSClient();
+ }
+
+ return isRequestSuccessful;
+ }
+
+ /**
+ * @param configPath
+ * Takes the application config file path ( /config.xml ) as
+ * input
+ * @throws Exception
+ */
+ private static void initializeHelperLibrary(String configPath) throws Exception {
+ String appConfigXMLContent = getConfigFileContent(configPath);
+ // Initialize method takes config file content, not the config file path.
+ FSHelperLibrary.initialize(appConfigXMLContent);
+ }
+
+ /**
+ * @param pHelperId
+ * Tenant Id
+ * @param pHelperResourcePath
+ * Resource Path for files of Seclore Policy Server.
+ * To be left empty here.
+ * @param pHelperConfigPath
+ * File path for 'tenant config.xml' file
+ * @throws Exception
+ * Code snippet won't run if any exception is thrown in this
+ * block
+ */
+ private static void initializeHelper(String pHelperId, String pHelperResourcePath, String pHelperConfigPath)
+ throws Exception {
+ // # Reads the content of the private key XML file related to the EA using which
+ // session was created
+ String lEAPrivateKeyXMLContent = getConfigFileContent(Config.getProperty("ea.private.key.xml.path", ""));
+
+ // # This object is used for advanced security. Only those EA with 'Advanced
+ // Security' option enabled on Policy Server portal can create another EA.
+ DefaultCryptoHandler defaultCryptoHandler = getDefaultCryptoHandler(lEAPrivateKeyXMLContent);
+
+ // # Reads the content of the 'tenant config.xml' file
+ String tenantConfigXMLContent = getConfigFileContent(pHelperConfigPath);
+
+ // Initialize method takes WSClient config content not the config file path.
+ FSHelperLibrary.initializeHelper(pHelperId, pHelperResourcePath, tenantConfigXMLContent, defaultCryptoHandler);
+ }
+
+ /**
+ *
+ * Uses the private key xml file to create an instance of DefaultCryptoHandler.
+ *
+ *
+ * @param pEAPrivateKeyXMLContent
+ * @return DefaultCryptoHandler instance
+ * @throws Exception
+ */
+ private static DefaultCryptoHandler getDefaultCryptoHandler(String pEAPrivateKeyXMLContent) throws Exception {
+ DefaultCryptoHandler defaultCryptoHandler = new DefaultCryptoHandler(
+ pEAPrivateKeyXMLContent,
+ Integer.parseInt(Config.getProperty("ea.key.length", "256")),
+ Config.getProperty("ea.active.key.id", ""),
+ Config.getProperty("ea.key.chaining.mode", "ECB"),
+ Config.getProperty("ea.key.padding.scheme", "PKCS1Padding"));
+ return defaultCryptoHandler;
+ }
+
+ /**
+ * This method reads an XML file and returns the content of the XML file in
+ * string format
+ *
+ * @param pAppPath
+ * XML file path
+ * @return File content in string format
+ * @throws Exception
+ */
+ private static String getConfigFileContent(String pAppPath) throws Exception {
+ validateConfigFile(pAppPath);
+
+ InputStream inputStream = null;
+ try {
+ String lstrEncoding = detectEncoding(pAppPath);
+ if (lstrEncoding == null || lstrEncoding.trim().isEmpty()) {
+ lstrEncoding = "UTF-8";
+ }
+
+ DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
+ builderFactory.setNamespaceAware(false);
+ builderFactory.setValidating(false);
+ DocumentBuilder builder = builderFactory.newDocumentBuilder();
+ inputStream = new FileInputStream(pAppPath);
+ InputSource lInputSource = new InputSource(inputStream);
+ lInputSource.setEncoding(lstrEncoding);
+ Document document = builder.parse(lInputSource);
+
+ TransformerFactory lTransFactory = TransformerFactory.newInstance();
+ Transformer lTrans = lTransFactory.newTransformer();
+ DOMSource lSource = new DOMSource(document);
+ StringWriter lStringWriter = new StringWriter();
+ lTrans.transform(lSource, new StreamResult(lStringWriter));
+ return lStringWriter.toString();
+ } catch (Exception e) {
+ System.out.println("*** Config file should be in UTF-8 encoding ***");
+ e.printStackTrace();
+ System.exit(0);
+ } finally {
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (IOException ioException) {
+ // ignore
+ }
+ }
+ }
+ return "";
+ }
+
+ /**
+ * @param configFilePath
+ * @throws Exception
+ */
+ private static File validateConfigFile(String configFilePath) throws Exception {
+
+ if (configFilePath == null || configFilePath.trim().isEmpty()) {
+ throw new Exception("Configuration File path is not provided.");
+ }
+
+ File file = new File(configFilePath);
+ if (!file.exists()) {
+ throw new Exception("Configuration File does not exist at '" + file.getAbsolutePath() + "'");
+ }
+
+ if (!file.isFile()) {
+ throw new Exception("'" + file.getAbsolutePath() + "' is not a file.");
+ }
+
+ // Length 3 is checked to make sure that enough bytes are available for
+ // BOM reading.
+ if (file.length() < 3) {
+ throw new Exception("'" + file.getAbsolutePath() + "' is not a valid configuration file.");
+ }
+ return file;
+ }
+
+ /**
+ * Detect encoding format of file
+ *
+ * @param pConfigXmlPath
+ * File path whose encoding type is to be detected
+ * @return encoding format (eg: utf-8, utf-16)
+ */
+ public static String detectEncoding(String pConfigXmlPath) {
+ FileInputStream lFis = null;
+ try {
+ lFis = new FileInputStream(pConfigXmlPath);
+ UniversalDetector lDetector = new UniversalDetector(null);
+ byte[] lBuff = new byte[512];
+ int liread;
+ while ((liread = lFis.read(lBuff)) > 0 && !lDetector.isDone()) {
+ lDetector.handleData(lBuff, 0, liread);
+ }
+ lDetector.dataEnd();
+ String lstrEncoding = lDetector.getDetectedCharset();
+ lDetector.reset();
+ return lstrEncoding;
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ if (lFis != null) {
+ try {
+ lFis.close();
+ } catch (IOException e) {
+ // Ignore
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Terminate the created session and reset the initialized Server SDK library.
+ */
+ public static void terminateWSClient() {
+ try {
+ FSHelperLibrary.logInfo("Terminating FSHelper Library");
+ if (FSHelperLibrary.isTerminated() == false) {
+ System.out.println("FSHelperLibrary.isTerminated(): " + FSHelperLibrary.isTerminated());
+ FSHelperLibrary.terminate();
+ }
+ } catch (FSHelperException e) {
+ FSHelperLibrary.logError(e.getMessage(), e);
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/RSA Key Pair Generation Sample Tool.zip b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/RSA Key Pair Generation Sample Tool.zip
new file mode 100755
index 0000000..edb199e
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/RSA Key Pair Generation Sample Tool.zip differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Unprotect Any File using Elevated EA.pptx b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Unprotect Any File using Elevated EA.pptx
new file mode 100755
index 0000000..e20a266
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Unprotect Any File using Elevated EA.pptx differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Use Elevated Enterprise Application to Unprotect Any File - Technical Document.docx b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Use Elevated Enterprise Application to Unprotect Any File - Technical Document.docx
new file mode 100755
index 0000000..d85750b
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Appendix - Unprotect Any File using Elevated EA/Use Elevated Enterprise Application to Unprotect Any File - Technical Document.docx differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code Configuration Details.xlsx b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code Configuration Details.xlsx
new file mode 100755
index 0000000..b1364f7
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code Configuration Details.xlsx differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/Readme.txt b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/Readme.txt
new file mode 100755
index 0000000..4c4f2b3
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/Readme.txt
@@ -0,0 +1,22 @@
+
+Unprotect & Unwrap in EA context Sample App
+===========================================
+
+Deployment Steps:
+------------------
+1. make sure your policy server is running . This app requires java 8 or above to run so make
+ sure java 8 or above is installed.
+
+2. go inside 'bin/Unprotect & Unwrap in EA context Sample App'
+
+3. Configure the 'tenant config.xml' in 'config/'
+ a. Policy Server Details:
+ server : Server name on which Policy Server is running
+ port : Server Port on which Policy Server is running
+ app-name : Policy Server application name
+
+ b. fill hot folder details i.e id and passphrase
+
+4. If you are using java 8 , put libs present inside 'doc/JCE Files/java8' into 'bin/Unprotect & Unwrap in EA context Sample App/lib'
+
+5. click on run.bat to start sample app , follow instruction on terminal
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/config/cabinet config.xml b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/config/cabinet config.xml
new file mode 100644
index 0000000..1d6eba7
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/config/cabinet config.xml
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+ false
+
+
+
+
+
+ false
+
+
+ en
+
+
+
+
+ 50
+
+ 900
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/config/config.xml b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/config/config.xml
new file mode 100644
index 0000000..11362a7
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/config/config.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+ true
+
+ false
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/config/log4j.properties b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/config/log4j.properties
new file mode 100755
index 0000000..8293be6
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/config/log4j.properties
@@ -0,0 +1,15 @@
+
+log4j.category.WSCLIENT=debug, WSCLIENT
+
+# If we want to change the Appender, we have to change
+# UtilFunction.initializeLoggers() too, because it assumes that the appender
+# is 'org.apache.log4j.RollingFileAppender' and changes path of the file by
+# getting appender from this logger.
+log4j.appender.WSCLIENT=com.seclore.fs.ws.client.logger.DailyZippedRollingFileAppender
+# Path of the file should be relative to application ROOT
+log4j.appender.WSCLIENT.File=logs/WSClient.log
+log4j.appender.WSCLIENT.MaxFileSize=10MB
+#log4j.appender.REQUEST_LOGGER.MaxBackupIndex=10
+log4j.appender.WSCLIENT.DatePattern='_'yyyy-MM-dd
+log4j.appender.WSCLIENT.layout=org.apache.log4j.PatternLayout
+log4j.appender.WSCLIENT.layout.ConversionPattern=%d{MMM dd, yyyy HH:mm:ss.SSS} %F:%L%n%p: %m%n
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/config/log4j2.xml b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/config/log4j2.xml
new file mode 100644
index 0000000..0756304
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/config/log4j2.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+ ${ctx:applicationPath}/logs
+
+
+
+
+
+
+
+
+
+
+
+
+ UTF-8
+ %d{MMM dd, yyyy HH:mm:ss.SSS}: %t: %p: %m%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/bc-fips-1.0.2.4.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/bc-fips-1.0.2.4.jar
new file mode 100644
index 0000000..a38f9d0
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/bc-fips-1.0.2.4.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/commons-codec-1.6.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/commons-codec-1.6.jar
new file mode 100644
index 0000000..ee1bc49
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/commons-codec-1.6.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/disruptor-3.3.7.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/disruptor-3.3.7.jar
new file mode 100644
index 0000000..1777a37
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/disruptor-3.3.7.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/fs-smaillibrary-1.2.7.0.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/fs-smaillibrary-1.2.7.0.jar
new file mode 100644
index 0000000..c01ec4a
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/fs-smaillibrary-1.2.7.0.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/fs-ws-client-4.4.18.0.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/fs-ws-client-4.4.18.0.jar
new file mode 100644
index 0000000..d0a949c
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/fs-ws-client-4.4.18.0.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/juniversalchardet-1.0.3.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/juniversalchardet-1.0.3.jar
new file mode 100755
index 0000000..1af703f
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/juniversalchardet-1.0.3.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/log4j-api-2.17.1.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/log4j-api-2.17.1.jar
new file mode 100644
index 0000000..1aae243
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/log4j-api-2.17.1.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/log4j-core-2.17.1.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/log4j-core-2.17.1.jar
new file mode 100644
index 0000000..4682527
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/log4j-core-2.17.1.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/sample-app.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/sample-app.jar
new file mode 100644
index 0000000..caf1f79
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/sample-app.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/seclore-io-1.0.0.0.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/seclore-io-1.0.0.0.jar
new file mode 100644
index 0000000..365237b
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/seclore-io-1.0.0.0.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/xercesImpl-2.12.2.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/xercesImpl-2.12.2.jar
new file mode 100644
index 0000000..ccbae9f
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/xercesImpl-2.12.2.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/run.bat b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/run.bat
new file mode 100755
index 0000000..2bf9ca8
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/run.bat
@@ -0,0 +1,16 @@
+@echo off
+set "CURRENT_DIR=%cd%"
+echo ---------------------------------------------------------------
+echo Seclore 'Unprotect and Unwrap in EA context Sample App' Utility
+echo ---------------------------------------------------------------
+echo.
+
+rem if your want to run on a different jdk or java path is not configured uncomment below line
+rem for example ,
+rem set path="C:\Program Files\Java\jdk-11.0.1\bin";
+java -version
+echo.
+REM uncomment below line to see the version of sample app i.e( remove REM mentioned below)
+REM java -cp "./lib/sample-app.jar"; com.seclore.fs.protect.example.Version
+ java -cp "./lib/*"; com.seclore.fs.protect.example.main.SecloreMain
+pause
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/doc/Developer_s Reference.txt b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/doc/Developer_s Reference.txt
new file mode 100755
index 0000000..d49ade4
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/doc/Developer_s Reference.txt
@@ -0,0 +1,37 @@
+FileSecure Interfaces integration source code reference.
+
+FS Helper Initialization
+------------------------
+ - At application startup initializing FSHelperlibrary and FSHelper
+ - Below classes are used for the same
+ - SecloreMain
+ - static block :-
+ InitializeWSClient.initializeHelperLibrary((FSHELPERLIBRARY_CONFIG_XML_PATH, ););
+ InitializeWSClient.initializeHelper(HELPER_INSTANCE_KEY, FSHELPER_RESOURCE_PATH, FSHELPER_CONFIG_XML_PATH, );
+ - InitializeWSClient
+ - initializeHelperLibrary( ... )
+ - initializeHelper( ... )
+
+
+
+Main Class
+------------
+ - com.seclore.fs.protect.example.main
+ - SecloreMain class
+
+Note:
+=====
+while preparing xml string for request or response. please escape below spacial character for the string which will be written within xml tag.
+ "&" -> "&"
+ "<" -> "<"
+ ">", -> ">"
+ "\"" -> """
+ "'" -> "'";
+
+ Refer: com.seclore.fs.protect.example.util.XMLUtil class and
+ - escapeForXML () method
+
+Example: sample xml is "Sample Sales & purchase report.pdf "
+ here "Sample Sales and purchase report" should be escaped.
+ Use: String fileName = XMLHelper.escapeForXML( "Sample Sales & purchase report" );
+ ""+fileName+" "
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/doc/JCE Files/Java7/US_export_policy.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/doc/JCE Files/Java7/US_export_policy.jar
new file mode 100755
index 0000000..7173213
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/doc/JCE Files/Java7/US_export_policy.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/doc/JCE Files/Java7/local_policy.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/doc/JCE Files/Java7/local_policy.jar
new file mode 100755
index 0000000..c34d036
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/doc/JCE Files/Java7/local_policy.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/doc/JCE Files/Java8/US_export_policy.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/doc/JCE Files/Java8/US_export_policy.jar
new file mode 100755
index 0000000..251b102
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/doc/JCE Files/Java8/US_export_policy.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/doc/JCE Files/Java8/local_policy.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/doc/JCE Files/Java8/local_policy.jar
new file mode 100755
index 0000000..1c58939
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/doc/JCE Files/Java8/local_policy.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/.classpath b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/.classpath
new file mode 100755
index 0000000..4e3bf4d
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/.classpath
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/.project b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/.project
new file mode 100755
index 0000000..adbd983
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/.project
@@ -0,0 +1,17 @@
+
+
+ Unprotect & Unwrap in EA context Sample App Code
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+
+ org.eclipse.jdt.core.javanature
+
+
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/.settings/org.eclipse.jdt.core.prefs b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/.settings/org.eclipse.jdt.core.prefs
new file mode 100755
index 0000000..3a21537
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,11 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/bin/com/seclore/fs/protect/example/Version.class b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/bin/com/seclore/fs/protect/example/Version.class
new file mode 100644
index 0000000..a202905
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/bin/com/seclore/fs/protect/example/Version.class differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/bin/com/seclore/fs/protect/example/core/InitializeWSClient.class b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/bin/com/seclore/fs/protect/example/core/InitializeWSClient.class
new file mode 100644
index 0000000..0326058
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/bin/com/seclore/fs/protect/example/core/InitializeWSClient.class differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/bin/com/seclore/fs/protect/example/main/SecloreMain.class b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/bin/com/seclore/fs/protect/example/main/SecloreMain.class
new file mode 100644
index 0000000..1ccaea7
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/bin/com/seclore/fs/protect/example/main/SecloreMain.class differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/config/cabinet config.xml b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/config/cabinet config.xml
new file mode 100644
index 0000000..1d6eba7
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/config/cabinet config.xml
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+ false
+
+
+
+
+
+ false
+
+
+ en
+
+
+
+
+ 50
+
+ 900
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/config/config.xml b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/config/config.xml
new file mode 100644
index 0000000..11362a7
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/config/config.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+ true
+
+ false
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/config/log4j.properties b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/config/log4j.properties
new file mode 100755
index 0000000..8293be6
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/config/log4j.properties
@@ -0,0 +1,15 @@
+
+log4j.category.WSCLIENT=debug, WSCLIENT
+
+# If we want to change the Appender, we have to change
+# UtilFunction.initializeLoggers() too, because it assumes that the appender
+# is 'org.apache.log4j.RollingFileAppender' and changes path of the file by
+# getting appender from this logger.
+log4j.appender.WSCLIENT=com.seclore.fs.ws.client.logger.DailyZippedRollingFileAppender
+# Path of the file should be relative to application ROOT
+log4j.appender.WSCLIENT.File=logs/WSClient.log
+log4j.appender.WSCLIENT.MaxFileSize=10MB
+#log4j.appender.REQUEST_LOGGER.MaxBackupIndex=10
+log4j.appender.WSCLIENT.DatePattern='_'yyyy-MM-dd
+log4j.appender.WSCLIENT.layout=org.apache.log4j.PatternLayout
+log4j.appender.WSCLIENT.layout.ConversionPattern=%d{MMM dd, yyyy HH:mm:ss.SSS} %F:%L%n%p: %m%n
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/config/log4j2.xml b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/config/log4j2.xml
new file mode 100644
index 0000000..0756304
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/config/log4j2.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+ ${ctx:applicationPath}/logs
+
+
+
+
+
+
+
+
+
+
+
+
+ UTF-8
+ %d{MMM dd, yyyy HH:mm:ss.SSS}: %t: %p: %m%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/bc-fips-1.0.2.4.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/bc-fips-1.0.2.4.jar
new file mode 100644
index 0000000..a38f9d0
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/bc-fips-1.0.2.4.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/commons-codec-1.6.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/commons-codec-1.6.jar
new file mode 100644
index 0000000..ee1bc49
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/commons-codec-1.6.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/disruptor-3.3.7.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/disruptor-3.3.7.jar
new file mode 100644
index 0000000..1777a37
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/disruptor-3.3.7.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/fs-smaillibrary-1.2.7.0.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/fs-smaillibrary-1.2.7.0.jar
new file mode 100644
index 0000000..c01ec4a
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/fs-smaillibrary-1.2.7.0.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/fs-ws-client-4.4.18.0.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/fs-ws-client-4.4.18.0.jar
new file mode 100644
index 0000000..d0a949c
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/fs-ws-client-4.4.18.0.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/juniversalchardet-1.0.3.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/juniversalchardet-1.0.3.jar
new file mode 100755
index 0000000..1af703f
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/juniversalchardet-1.0.3.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/log4j-api-2.17.1.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/log4j-api-2.17.1.jar
new file mode 100644
index 0000000..1aae243
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/log4j-api-2.17.1.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/log4j-core-2.17.1.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/log4j-core-2.17.1.jar
new file mode 100644
index 0000000..4682527
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/log4j-core-2.17.1.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/seclore-io-1.0.0.0.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/seclore-io-1.0.0.0.jar
new file mode 100644
index 0000000..365237b
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/seclore-io-1.0.0.0.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/xercesImpl-2.12.2.jar b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/xercesImpl-2.12.2.jar
new file mode 100644
index 0000000..ccbae9f
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/xercesImpl-2.12.2.jar differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/src/com/seclore/fs/protect/example/Version.java b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/src/com/seclore/fs/protect/example/Version.java
new file mode 100755
index 0000000..df17df2
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/src/com/seclore/fs/protect/example/Version.java
@@ -0,0 +1,23 @@
+package com.seclore.fs.protect.example;
+
+/**
+ * Represents the Sample App version.
+ */
+public class Version
+{
+ /**
+ * The version of the Sample App.
+ */
+ public static final String Version = "3.0.0.0";
+
+ /**
+ * Displays the version of the Sample App
+ *
+ * @param args
+ */
+ public static void main(String[] args)
+ {
+ System.out.println("Sample App version : " + Version);
+ System.out.println("Copyright (c) 2008 Seclore Technology Pvt. Ltd.");
+ }
+}
\ No newline at end of file
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/src/com/seclore/fs/protect/example/core/InitializeWSClient.java b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/src/com/seclore/fs/protect/example/core/InitializeWSClient.java
new file mode 100755
index 0000000..6b3cd08
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/src/com/seclore/fs/protect/example/core/InitializeWSClient.java
@@ -0,0 +1,193 @@
+package com.seclore.fs.protect.example.core;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringWriter;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.mozilla.universalchardet.UniversalDetector;
+import org.w3c.dom.Document;
+import org.xml.sax.InputSource;
+
+import com.seclore.fs.helper.exception.FSHelperException;
+import com.seclore.fs.helper.library.FSHelperLibrary;
+
+public class InitializeWSClient {
+ /**
+ * @param configPath
+ * Takes the application config file path as input
+ * @throws Exception
+ */
+ public static void initializeHelperLibrary(String configPath) throws Exception {
+ try {
+ String configContentXMLString = getConfigFileContent(configPath);
+ // Initialize method takes WSClient config content not the config file path.
+ FSHelperLibrary.initialize(configContentXMLString);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * @param helperId
+ * Tenant Id
+ * @param helperResourcePath
+ * Resource Path for files of Seclore Policy Server.
+ * To be left empty here.
+ * @param helperConfigPath
+ * File path for 'tenant config.xml' file
+ * @throws Exception
+ * Code snippet won't run if any exception is thrown in this
+ * block
+ */
+ public static void initializeHelper(String pHelperId, String pHelperResourcePath, String pHelperConfigPath)
+ throws Exception {
+ try {
+ String configContentXMLString = getConfigFileContent(pHelperConfigPath);
+ // Initialize method takes WSClient config content not the config file path.
+ FSHelperLibrary.initializeHelper(pHelperId, pHelperResourcePath, configContentXMLString);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * This method reads an XML file and returns the content of the XML file in
+ * string format
+ *
+ * @param appPath
+ * XML file path
+ * @return File content in string format
+ * @throws Exception
+ */
+ private static String getConfigFileContent(String pAppPath) throws Exception {
+ validateConfigFile(pAppPath);
+
+ InputStream inputStream = null;
+ try {
+ String lstrEncoding = detectEncoding(pAppPath);
+ if (lstrEncoding == null || lstrEncoding.trim().isEmpty()) {
+ lstrEncoding = "UTF-8";
+ }
+
+ DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
+ builderFactory.setNamespaceAware(false);
+ builderFactory.setValidating(false);
+ DocumentBuilder builder = builderFactory.newDocumentBuilder();
+ inputStream = new FileInputStream(pAppPath);
+ InputSource lInputSource = new InputSource(inputStream);
+ lInputSource.setEncoding(lstrEncoding);
+ Document document = builder.parse(lInputSource);
+
+ TransformerFactory lTransFactory = TransformerFactory.newInstance();
+ Transformer lTrans = lTransFactory.newTransformer();
+ DOMSource lSource = new DOMSource(document);
+ StringWriter lStringWriter = new StringWriter();
+ lTrans.transform(lSource, new StreamResult(lStringWriter));
+ return lStringWriter.toString();
+ } catch (Exception e) {
+ System.out.println("*** Config file should be in UTF-8 encoding ***");
+ e.printStackTrace();
+ System.exit(0);
+ } finally {
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (IOException ioException) {
+ // ignore
+ }
+ }
+ }
+ return "";
+ }
+
+ /**
+ * Validates whether the file exists at the given location & has valid BOM
+ * format
+ *
+ * @param configFilePath
+ * @throws Exception
+ * @return The file object representing the configFilePath
+ */
+ private static File validateConfigFile(String configFilePath) throws Exception {
+
+ if (configFilePath == null || configFilePath.trim().isEmpty()) {
+ throw new Exception("Configuration File path is not provided.");
+ }
+
+ File file = new File(configFilePath);
+ if (!file.exists()) {
+ throw new Exception("Configuration File does not exist at '" + file.getAbsolutePath() + "'");
+ }
+
+ if (!file.isFile()) {
+ throw new Exception("'" + file.getAbsolutePath() + "' is not a file.");
+ }
+
+ // Length 3 is checked to make sure that enough bytes are available for
+ // BOM reading.
+ if (file.length() < 3) {
+ throw new Exception("'" + file.getAbsolutePath() + "' is not a valid configuration file.");
+ }
+ return file;
+ }
+
+ /**
+ * Detect encoding format of file
+ *
+ * @param pConfigXmlPath
+ * File path whose encoding type is to be detected
+ * @return encoding format (eg: utf-8, utf-16)
+ */
+ public static String detectEncoding(String pConfigXmlPath) {
+ FileInputStream lFis = null;
+ try {
+ lFis = new FileInputStream(pConfigXmlPath);
+ UniversalDetector lDetector = new UniversalDetector(null);
+ byte[] lBuff = new byte[512];
+ int liread;
+ while ((liread = lFis.read(lBuff)) > 0 && !lDetector.isDone()) {
+ lDetector.handleData(lBuff, 0, liread);
+ }
+ lDetector.dataEnd();
+ String lstrEncoding = lDetector.getDetectedCharset();
+ lDetector.reset();
+ return lstrEncoding;
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ if (lFis != null) {
+ try {
+ lFis.close();
+ } catch (IOException e) {
+ // Igniore
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Terminate the created session and reset the initialized Server SDK library.
+ */
+ public static void terminateWSClient() {
+ try {
+ FSHelperLibrary.logInfo("Terminating FSHelper Library");
+ if (FSHelperLibrary.isTerminated() == false) {
+ System.out.println("FSHelperLibrary.isTerminated(): " + FSHelperLibrary.isTerminated());
+ FSHelperLibrary.terminate();
+ }
+ } catch (FSHelperException e) {
+ FSHelperLibrary.logError(e.getMessage(), e);
+ }
+ }
+
+}
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/src/com/seclore/fs/protect/example/main/SecloreMain.java b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/src/com/seclore/fs/protect/example/main/SecloreMain.java
new file mode 100755
index 0000000..f5e5dae
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/src/com/seclore/fs/protect/example/main/SecloreMain.java
@@ -0,0 +1,102 @@
+package com.seclore.fs.protect.example.main;
+
+import java.util.Scanner;
+
+import com.seclore.fs.helper.core.UnprotectedFile;
+import com.seclore.fs.helper.library.FSHelper;
+import com.seclore.fs.helper.library.FSHelperLibrary;
+import com.seclore.fs.protect.example.core.InitializeWSClient;
+
+public class SecloreMain {
+ // # FS Helper library is multi-tenant. Use unique tenant identifier for each
+ // tenant
+ private static String tenantID = "Tenant-1";
+
+ // # This file contains information about the Application into which this code
+ // snippet is to be integrated.
+ private static final String appConfigXMLFilePath = "config/config.xml";
+
+ // # This file contains info for creating session with Seclore Policy Server and
+ // initializing Server SDK library
+ private static final String tenantConfigXMLFilePath = "config/cabinet config.xml";
+
+ // # Used to take user input
+ private static Scanner scanner = null;
+
+ /**
+ *
+ * This block initializes the Server SDK library and creates a session with
+ * Seclore Policy Server
+ *
+ *
+ * @exception Code snippet won't run if any exception is thrown in this block.
+ */
+ static {
+ try {
+ InitializeWSClient.initializeHelperLibrary(appConfigXMLFilePath);
+ InitializeWSClient.initializeHelper(tenantID, "", tenantConfigXMLFilePath);
+ scanner = new Scanner(System.in);
+ } catch (Exception e) {
+ e.printStackTrace();
+ System.exit(0);
+ }
+ }
+
+ // # Entry point to run this application
+ public static void main(String[] args) {
+ try {
+ String outputFilePath = UnwrapAndunprotectFile();
+
+ if (outputFilePath != null && !outputFilePath.trim().isEmpty()) {
+ System.out.println("File '" + outputFilePath + "' is unwrapped and unprotected successfully");
+ } else {
+ throw new Exception("Unexpected error");
+ }
+
+ } catch (Exception exp) {
+ exp.printStackTrace();
+ } finally {
+ if (scanner != null) {
+ scanner.close();
+ }
+
+ InitializeWSClient.terminateWSClient();
+ }
+
+ }
+
+ /**
+ * unprotect and unWrap a file using Seclore SDK
+ *
+ * @return the absolute file path of unprotected file
+ * @throws Exception
+ */
+ public static String UnwrapAndunprotectFile() throws Exception {
+ System.out.println("Enter absolute path of the file to be unwrapped & unprotected:");
+ String wrappedAndProtectedFilePath = scanner.nextLine();
+
+ // # get the FSHelper object by specifying the tenantId.
+ // note: This tenant id should be same which was used during initialization of
+ // Seclore SDK
+ FSHelper tenantObj = FSHelperLibrary.getHelper(tenantID);
+
+ // throw error if the file is not HTML wrapped
+ if (tenantObj.isHTMLWrapped(wrappedAndProtectedFilePath) == false) {
+ throw new Exception("File '" + wrappedAndProtectedFilePath + "' is not HTML wrapped");
+ }
+
+ // # this display file name goes in activity log
+ // for more details see javadoc of FSHelper.unwrapAndUnprotect()
+ String displayFilePath = wrappedAndProtectedFilePath;
+ // # activity comments to be shown
+ String actvityComments = "Unprotected by using FS Helper Library's unwrapAndUnprotect method";
+
+ // # calling Seclore SDK's unwrapAndUnprotect api
+ UnprotectedFile unprotectedFile = tenantObj.unwrapAndUnprotect(null,
+ wrappedAndProtectedFilePath,
+ displayFilePath,
+ actvityComments);
+ return unprotectedFile.getFilePath();
+ }
+
+}
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Unwrap & Unprotect Sample Code Walkthrough.mp4 b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Unwrap & Unprotect Sample Code Walkthrough.mp4
new file mode 100755
index 0000000..6a32104
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Unwrap & Unprotect Sample Code Walkthrough.mp4 differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Unwrap and Unprotect in EA Context - Seclore Cloud Policy Server.pptx b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Unwrap and Unprotect in EA Context - Seclore Cloud Policy Server.pptx
new file mode 100755
index 0000000..1f618cd
Binary files /dev/null and b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/Unwrap and Unprotect in EA Context - Seclore Cloud Policy Server.pptx differ
diff --git a/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/scripts/build.sh b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/scripts/build.sh
new file mode 100755
index 0000000..50c5566
--- /dev/null
+++ b/examples/Unwrap & Unprotect in EA context/Using Seclore PoC Policy Server/scripts/build.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+set -e
+
+# Set the project root directory
+PROJECT_ROOT=$(dirname "$0")/..
+
+# Clean all bin folders
+rm -rf "$PROJECT_ROOT/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/config"/*
+rm -rf "$PROJECT_ROOT/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib"/*
+
+# Clear the src/bin dir containing compiled class files
+rm -rf "$PROJECT_ROOT/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/bin"/*
+
+#find and compile all java files
+find "$PROJECT_ROOT/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/src" -name "*.java" -exec javac -d "$PROJECT_ROOT/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/bin" -cp "$PROJECT_ROOT/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib/*" {} +
+
+# Package the compiled classes into a JAR file
+jar cvf "$PROJECT_ROOT/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib/sample-app.jar" -C "$PROJECT_ROOT/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/bin" .
+
+# Copy all libs and config files to bin
+cp -r "$PROJECT_ROOT/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/lib"/* "$PROJECT_ROOT/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/lib"
+cp -r "$PROJECT_ROOT/Sample Code/src/Unprotect & Unwrap in EA context Sample App Code/config"/* "$PROJECT_ROOT/Sample Code/bin/Unprotect & Unwrap in EA context Sample App/config"
\ No newline at end of file
diff --git a/resources/seclore-logo-banner.jpg b/resources/seclore-logo-banner.jpg
new file mode 100644
index 0000000..2182bdc
Binary files /dev/null and b/resources/seclore-logo-banner.jpg differ