From b3c0e6f695e697cab355cfd38549faa3831d6eca Mon Sep 17 00:00:00 2001 From: gismofx Date: Mon, 2 May 2022 20:36:35 -0400 Subject: [PATCH] Fix Webpack for release and debug builds. --- .../NpmJS/webpack.config.js | 4 +- .../toast_ui.blazor_calendar.csproj | 6 +- .../wwwroot/TUI.blazorCalendar.css | 2 +- .../wwwroot/TUI.blazorCalendar.css.map | 1 + .../wwwroot/TUI.blazor_calendar.min.js | 45315 +--------------- .../TUI.blazor_calendar.min.js.LICENSE.txt | 795 + .../wwwroot/TUI.blazor_calendar.min.js.map | 1 + 7 files changed, 806 insertions(+), 45318 deletions(-) create mode 100644 toast_ui.blazor_calendar/wwwroot/TUI.blazorCalendar.css.map create mode 100644 toast_ui.blazor_calendar/wwwroot/TUI.blazor_calendar.min.js.LICENSE.txt create mode 100644 toast_ui.blazor_calendar/wwwroot/TUI.blazor_calendar.min.js.map diff --git a/toast_ui.blazor_calendar/NpmJS/webpack.config.js b/toast_ui.blazor_calendar/NpmJS/webpack.config.js index d1041ca..9240a02 100644 --- a/toast_ui.blazor_calendar/NpmJS/webpack.config.js +++ b/toast_ui.blazor_calendar/NpmJS/webpack.config.js @@ -3,13 +3,13 @@ const MiniCssExtractPlugin = require('mini-css-extract-plugin'); module.exports = { - mode: 'production' + mode: 'production', devtool: 'source-map', entry: './src/index.js', output: { path: path.resolve(__dirname, '../wwwroot/'), filename: 'TUI.blazor_calendar.min.js', - sourceMapFilename: 'TUI.blazor_calendar.js.map', + sourceMapFilename: "[file].map", }, plugins: [ new MiniCssExtractPlugin( diff --git a/toast_ui.blazor_calendar/toast_ui.blazor_calendar.csproj b/toast_ui.blazor_calendar/toast_ui.blazor_calendar.csproj index 5f19512..2a3d089 100644 --- a/toast_ui.blazor_calendar/toast_ui.blazor_calendar.csproj +++ b/toast_ui.blazor_calendar/toast_ui.blazor_calendar.csproj @@ -8,7 +8,7 @@ MIT Toast UI Calandar Wrapper For Blazor in Net6. A fully featured calendar component for blazor projects. Comes bundled with ToastUI Calendar JS and CSS files. visit github repo for examples on how to implement. - 1.0.0-beta2.2 + 1.0.0-beta3.0 toast_ui.blazor_calendar https://github.com/gismofx/toast_ui.blazor_calendar https://github.com/gismofx/toast_ui.blazor_calendar @@ -41,12 +41,12 @@ - + diff --git a/toast_ui.blazor_calendar/wwwroot/TUI.blazorCalendar.css b/toast_ui.blazor_calendar/wwwroot/TUI.blazorCalendar.css index 4b7b76a..50bd25a 100644 --- a/toast_ui.blazor_calendar/wwwroot/TUI.blazorCalendar.css +++ b/toast_ui.blazor_calendar/wwwroot/TUI.blazorCalendar.css @@ -1998,4 +1998,4 @@ input[type='checkbox'].tui-full-calendar-checkbox-round + span { -/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9OcG1KUy8uL25vZGVfbW9kdWxlcy90dWktY2FsZW5kYXIvZGlzdC90dWktY2FsZW5kYXIuY3NzIiwid2VicGFjazovL05wbUpTL3R1aS5DYWxlbmRhci9zcmMvY3NzL2NvbW1vbi5zdHlsIiwid2VicGFjazovL05wbUpTL3R1aS5DYWxlbmRhci9tYWluLnN0eWwiLCJ3ZWJwYWNrOi8vTnBtSlMvdHVpLkNhbGVuZGFyL3NyYy9jc3MvdmFyaWFibGVzLnN0eWwiLCJ3ZWJwYWNrOi8vTnBtSlMvdHVpLkNhbGVuZGFyL3NyYy9jc3Mvd2Vla2RheS5zdHlsIiwid2VicGFjazovL05wbUpTL3R1aS5DYWxlbmRhci9zcmMvY3NzL3dlZWsvbGF5b3V0LnN0eWwiLCJ3ZWJwYWNrOi8vTnBtSlMvdHVpLkNhbGVuZGFyL3NyYy9jc3Mvd2Vlay9kYXluYW1lLnN0eWwiLCJ3ZWJwYWNrOi8vTnBtSlMvdHVpLkNhbGVuZGFyL3NyYy9jc3Mvd2Vlay9kYXlncmlkLnN0eWwiLCJ3ZWJwYWNrOi8vTnBtSlMvdHVpLkNhbGVuZGFyL3NyYy9jc3Mvd2Vlay90aW1lLnN0eWwiLCJ3ZWJwYWNrOi8vTnBtSlMvdHVpLkNhbGVuZGFyL3NyYy9jc3MvbW9udGguc3R5bCIsIndlYnBhY2s6Ly9OcG1KUy90dWkuQ2FsZW5kYXIvc3JjL2Nzcy92bGF5b3V0LnN0eWwiLCJ3ZWJwYWNrOi8vTnBtSlMvdHVpLkNhbGVuZGFyL3NyYy9jc3MvcG9wdXAuc3R5bCIsIndlYnBhY2s6Ly9OcG1KUy90dWkuQ2FsZW5kYXIvc3JjL2Nzcy9pY29ucy5zdHlsIiwid2VicGFjazovL05wbUpTLy4vbm9kZV9tb2R1bGVzL3R1aS1kYXRlLXBpY2tlci9kaXN0L3R1aS1kYXRlLXBpY2tlci5jc3MiLCJ3ZWJwYWNrOi8vTnBtSlMvLi9ub2RlX21vZHVsZXMvdHVpLXRpbWUtcGlja2VyL2Rpc3QvdHVpLXRpbWUtcGlja2VyLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7RUFL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VTtJQUNWLFdBQVc7QUFDZjs7QUFFQTtJQUNJLHFCQUFxQjtJQUNyQixrQkFBa0I7SUFDbEIsZUFBZTtJQUNmLGlCQUFpQjtJQUNqQixtQkFBbUI7SUFDbkIsV0FBVztJQUNYO0FBQ0o7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsY0FBYztJQUNkLE1BQU07SUFDTixPQUFPO0lBQ1AsV0FBVztJQUNYLFlBQVk7SUFDWixzQkFBc0I7SUFDdEIsNEJBQTRCO0FBQ2hDOztBQUVBO0lBQ0ksZ0NBQWdDO0FBQ3BDOztBQUVBO0lBQ0ksZ0NBQWdDO0FBQ3BDOztBQUVBO0lBQ0ksV0FBVztJQUNYLFlBQVk7SUFDWjtBQUNKOztBQUVBO0lBQ0k7QUFDSjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixxQkFBcUI7SUFDckIsWUFBWTtJQUNaLFlBQVk7SUFDWjtBQUNKOztBQUVBO0lBQ0ksV0FBVztJQUNYLFlBQVk7SUFDWixzQkFBc0I7SUFDdEIsZUFBZTtJQUNmLFNBQVM7SUFDVCxXQUFXO0lBQ1g7QUFDSjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixRQUFRO0lBQ1IsVUFBVTtJQUNWO0FBQ0o7O0FBRUE7SUFDSTtBQUNKOztBQUVBO0lBQ0k7QUFDSjs7QUFFQTtJQUNJO0FBQ0o7O0FBRUE7SUFDSSxrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSxjQUFjO0lBQ2QsV0FBVztJQUNYLFdBQVc7QUFDZjs7QUFFQTtJQUNJLFdBQVc7SUFDWCxrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsZ0JBQWdCO0lBQ2hCLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLGFBQWE7QUFDakIiLCJmaWxlIjoiVFVJLmJsYXpvckNhbGVuZGFyLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogVE9BU1QgVUkgQ2FsZW5kYXJcbiAqIEB2ZXJzaW9uIDEuMTUuMyB8IFRodSBGZWIgMTcgMjAyMlxuICogQGF1dGhvciBOSE4gRkUgRGV2ZWxvcG1lbnQgTGFiIDxkbF9qYXZhc2NyaXB0QG5obi5jb20+XG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuLnR1aS1mdWxsLWNhbGVuZGFyLWxheW91dCB7XG4gIGhlaWdodDogMTAwJTtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWxheW91dCAqIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1kcmFnZ2luZyB7XG4gIGN1cnNvcjogbW92ZTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1yZXNpemluZyB7XG4gIGN1cnNvcjogcm93LXJlc2l6ZTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1yZXNpemluZy14IHtcbiAgY3Vyc29yOiBjb2wtcmVzaXplO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWhpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1pbnZpc2libGUgc3BhbiB7XG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1jbGVhcjphZnRlciB7XG4gIGNvbnRlbnQ6ICcnO1xuICBkaXNwbGF5OiBibG9jaztcbiAgY2xlYXI6IGJvdGg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItc2Nyb2xsLXkge1xuICBvdmVyZmxvdy15OiBzY3JvbGw7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItZG90IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRvcDogLTFweDtcbiAgY29udGVudDogJyc7XG4gIHdpZHRoOiA3cHg7XG4gIGhlaWdodDogN3B4O1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItaG9saWRheSB7XG4gIGNvbG9yOiAjZjAwO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXRvZGF5IHtcbiAgYmFja2dyb3VuZDogcmdiYSgyMTgsMjI5LDI0OSwwLjMpO1xufVxuLmhhbmRsZS14IHtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGNlbnRlcjtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQWdBQUFBRUNBTUFBQUNFRTQ3Q0FBQUFDVkJNVkVYLy8vLy8vLy8vLy8rT1N1WCtBQUFBQTNSU1RsTXJRSkc1SDRFSUFBQUFFVWxFUVZSNEFXTmdZb1JBQmhqRUZBRUFBclFBSWNIUWNQc0FBQUFBU1VWT1JLNUNZSUk9KTtcbn1cbi5oYW5kbGUteSB7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7XG4gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFRQUFBQUlDQU1BQUFEcDdhNDNBQUFBQ1ZCTVZFWC8vLy8vLy8vLy8vK09TdVgrQUFBQUEzUlNUbE1yUUpHNUg0RUlBQUFBRVVsRVFWUjRBV05nWW1SaVpBQkIvQ3dBQXRnQUlVVFVOa01BQUFBQVNVVk9SSzVDWUlJPSk7XG59XG5AbWVkaWEgb25seSBzY3JlZW4gYW5kICgtbW96LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDEuNSksIG9ubHkgc2NyZWVuIGFuZCAoLW8tbWluLWRldmljZS1waXhlbC1yYXRpbzogMy8yKSwgb25seSBzY3JlZW4gYW5kICgtd2Via2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDEuNSksIG9ubHkgc2NyZWVuIGFuZCAobWluLWRldmljZXBpeGVsLXJhdGlvOiAxLjUpLCBvbmx5IHNjcmVlbiBhbmQgKG1pbi1yZXNvbHV0aW9uOiAxLjVkcHB4KSB7XG4gIC5oYW5kbGUteCB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBSUNBTUFBQURIcUkrbEFBQUFDVkJNVkVYLy8vLy8vLy8vLy8rT1N1WCtBQUFBQTNSU1RsTVpLNUVZK1FLYUFBQUFHVWxFUVZSNEFXTmdZbUpBd2VnQ0lNRElpSXd4QktoaEJnQWNTQUJoOGdONDJnQUFBQUJKUlU1RXJrSmdnZz09KTtcbiAgICBiYWNrZ3JvdW5kLXNpemU6IDhweCA0cHg7XG4gIH1cbiAgLmhhbmRsZS15IHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBZ0FBQUFRQ0FNQUFBQWNWTTVQQUFBQUNWQk1WRVgvLy8vLy8vLy8vLytPU3VYK0FBQUFBM1JTVGxNRUs1RU1Ceks1QUFBQUdFbEVRVlI0QVdOZ1ltSUFZeGdEQkJnWlFSak9vS2NhQUJ6UUFHR2pzSU0vQUFBQUFFbEZUa1N1UW1DQyk7XG4gICAgYmFja2dyb3VuZC1zaXplOiA0cHggOHB4O1xuICB9XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItbW9udGgtd2Vlay1pdGVtIC50dWktZnVsbC1jYWxlbmRhci13ZWVrZGF5LWdyaWQge1xuICBvdmVyZmxvdy15OiBoaWRkZW47XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItbW9udGgtd2Vlay1pdGVtIC50dWktZnVsbC1jYWxlbmRhci13ZWVrZGF5LXNjaGVkdWxlcyB7XG4gIG92ZXJmbG93LXk6IHZpc2libGU7XG4gIGhlaWdodDogMDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1tb250aC13ZWVrLWl0ZW0gLnR1aS1mdWxsLWNhbGVuZGFyLXdlZWtkYXktc2NoZWR1bGUge1xuICBtYXJnaW46IDAgMTBweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1tb250aC13ZWVrLWl0ZW0gLnR1aS1mdWxsLWNhbGVuZGFyLXRvZGF5IHtcbiAgYmFja2dyb3VuZDogbm9uZTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1tb250aC13ZWVrLWl0ZW0gLnR1aS1mdWxsLWNhbGVuZGFyLXRvZGF5IC50dWktZnVsbC1jYWxlbmRhci13ZWVrZGF5LWdyaWQtZGF0ZS1kZWNvcmF0b3Ige1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHdpZHRoOiAyN3B4O1xuICBoZWlnaHQ6IDI3cHg7XG4gIGxpbmUtaGVpZ2h0OiAyN3B4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGJhY2tncm91bmQ6ICMxMzVkZTY7XG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgY29sb3I6ICNmZmY7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBtYXJnaW4tbGVmdDogMnB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXdlZWtkYXktZ3JpZCxcbi50dWktZnVsbC1jYWxlbmRhci13ZWVrZGF5LWdyaWQtbGluZSB7XG4gIGhlaWdodDogMTAwJTtcbiAgbWluLWhlaWdodDogaW5oZXJpdDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci13ZWVrZGF5LWdyaWQge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHdpZHRoOiAxMDAlO1xuICBvdmVyZmxvdy15OiBzY3JvbGw7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItd2Vla2RheS1ib3JkZXIge1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci13ZWVrZGF5LWdyaWQtbGluZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgcGFkZGluZzogM3B4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXdlZWtkYXktZ3JpZC1saW5lIC50dWktZnVsbC1jYWxlbmRhci13ZWVrZGF5LWdyaWQtZm9vdGVyIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206IDRweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci13ZWVrZGF5LWdyaWQtbGluZSAudHVpLWZ1bGwtY2FsZW5kYXItd2Vla2RheS1ncmlkLWRhdGUge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHdpZHRoOiAyN3B4O1xuICBoZWlnaHQ6IDI3cHg7XG4gIGxpbmUtaGVpZ2h0OiAyN3B4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItd2Vla2RheS1ncmlkLWxpbmUgLnR1aS1mdWxsLWNhbGVuZGFyLXdlZWtkYXktZ3JpZC1tb3JlLXNjaGVkdWxlcyB7XG4gIGZsb2F0OiByaWdodDtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBoZWlnaHQ6IDI3cHg7XG4gIGxpbmUtaGVpZ2h0OiAyN3B4O1xuICBwYWRkaW5nOiAwIDVweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBmb250LXNpemU6IDExcHg7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBjb2xvcjogI2FhYTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci13ZWVrZGF5LWNyZWF0aW9uIHtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIG92ZXJmbG93LXk6IHNjcm9sbDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci13ZWVrZGF5LXNjaGVkdWxlcyB7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBmb250LXNpemU6IDEycHg7XG4gIG92ZXJmbG93LXk6IHNjcm9sbDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci13ZWVrZGF5LXNjaGVkdWxlLWJsb2NrIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXdlZWtkYXktc2NoZWR1bGUtYmxvY2stZHJhZ2dpbmctZGltIHtcbiAgb3BhY2l0eTogMC4zO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXdlZWtkYXktc2NoZWR1bGUge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG1hcmdpbjogMCAxMHB4IDAgMXB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGJvcmRlci1sZWZ0LXN0eWxlOiBzb2xpZDtcbiAgYm9yZGVyLWxlZnQtd2lkdGg6IDNweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci13ZWVrZGF5LXNjaGVkdWxlLnR1aS1mdWxsLWNhbGVuZGFyLXdlZWtkYXktc2NoZWR1bGUtdGltZSB7XG4gIGJvcmRlci1sZWZ0LXdpZHRoOiAwO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXdlZWtkYXktc2NoZWR1bGUudHVpLWZ1bGwtY2FsZW5kYXItd2Vla2RheS1zY2hlZHVsZS10aW1lIC50dWktZnVsbC1jYWxlbmRhci13ZWVrZGF5LXNjaGVkdWxlLXRpdGxlIHtcbiAgcGFkZGluZy1sZWZ0OiA5cHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItd2Vla2RheS1zY2hlZHVsZS1idWxsZXQge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHBhZGRpbmc6IDA7XG4gIHdpZHRoOiA2cHg7XG4gIGhlaWdodDogNnB4O1xuICB0b3A6IDZweDtcbiAgbGVmdDogMDtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXdlZWtkYXktc2NoZWR1bGUtYnVsbGV0LWZvY3VzZWQge1xuICBsZWZ0OiAxMHB4O1xuICBiYWNrZ3JvdW5kOiAjZmZmO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXdlZWtkYXktc2NoZWR1bGUtdGl0bGUge1xuICBkaXNwbGF5OiBibG9jaztcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIHBhZGRpbmctbGVmdDogM3B4O1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci13ZWVrZGF5LXNjaGVkdWxlLXRpdGxlLWZvY3VzZWQge1xuICBwYWRkaW5nLWxlZnQ6IDE2cHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItd2Vla2RheS1zY2hlZHVsZS1jb3ZlciB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsMCwwLDAuMik7XG4gIGJveC1zaGFkb3c6IDAgMnB4IDZweCAwIHJnYmEoMCwwLDAsMC4xKTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci13ZWVrZGF5LWV4Y2VlZC1sZWZ0IC50dWktZnVsbC1jYWxlbmRhci13ZWVrZGF5LXNjaGVkdWxlIHtcbiAgbWFyZ2luLWxlZnQ6IDA7XG4gIGJvcmRlci1sZWZ0LXdpZHRoOiAwO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXdlZWtkYXktZXhjZWVkLXJpZ2h0IC50dWktZnVsbC1jYWxlbmRhci13ZWVrZGF5LXNjaGVkdWxlIHtcbiAgbWFyZ2luLXJpZ2h0OiAwO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXdlZWtkYXktZXhjZWVkLXJpZ2h0IC50dWktZnVsbC1jYWxlbmRhci13ZWVrZGF5LXJlc2l6ZS1oYW5kbGUge1xuICBkaXNwbGF5OiBub25lO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXdlZWtkYXktZXhjZWVkLWluLW1vbnRoIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXdlZWtkYXktZXhjZWVkLWluLW1vbnRoOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjFmNTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci13ZWVrZGF5LWV4Y2VlZC1pbi13ZWVrLFxuLnR1aS1mdWxsLWNhbGVuZGFyLXdlZWtkYXktY29sbGFwc2UtYnRuIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206IDVweDtcbiAgbWFyZ2luLXJpZ2h0OiA1cHg7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgbGluZS1oZWlnaHQ6IDE0cHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgcGFkZGluZzogMXB4IDVweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgYm9yZGVyOiAxcHggc29saWQgI2RkZDtcbiAgY29sb3I6ICMwMDA7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItd2Vla2RheS1yZXNpemUtaGFuZGxlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIHJpZ2h0OiAwO1xuICB3aWR0aDogNnB4O1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAzcHggY2VudGVyO1xuICBjdXJzb3I6IGNvbC1yZXNpemU7XG4gIGxpbmUtaGVpZ2h0OiAxOHB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXdlZWtkYXktZmlsbGVkIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2U4ZThlOCAhaW1wb3J0YW50O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWxlZnQge1xuICBoZWlnaHQ6IDEwMCU7XG4gIGZsb2F0OiBsZWZ0O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBkaXNwbGF5OiB0YWJsZTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1sZWZ0LWNvbnRlbnQge1xuICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICB0ZXh0LWFsaWduOiByaWdodDtcbiAgZm9udC1zaXplOiAxMXB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXJpZ2h0IHtcbiAgaGVpZ2h0OiAxMDAlO1xuICBvdmVyZmxvdy15OiBzY3JvbGw7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci13ZWVrLWNvbnRhaW5lciB7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IGluaGVyaXQ7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgZm9udC1zaXplOiAxMHB4O1xuICBtaW4taGVpZ2h0OiA2MDBweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci13ZWVrLWNvbnRhaW5lciAudHVpLWZ1bGwtY2FsZW5kYXItdG9kYXkge1xuICBiYWNrZ3JvdW5kOiBub25lO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWRheW5hbWUge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIG1hcmdpbi1sZWZ0OiAtMXB4O1xuICBoZWlnaHQ6IDEwMCU7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItZGF5bmFtZS50dWktZnVsbC1jYWxlbmRhci10b2RheSB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWRheW5hbWUtY29udGFpbmVyIHtcbiAgb3ZlcmZsb3cteTogc2Nyb2xsO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWRheW5hbWUtbGVmdG1hcmdpbiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgaGVpZ2h0OiAxMDAlO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWRheW5hbWUtZGF0ZSB7XG4gIGZvbnQtc2l6ZTogMjZweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1kYXluYW1lLW5hbWUge1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgZm9udC1zaXplOiAxMnB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWRheWdyaWQtbGF5b3V0IHtcbiAgaGVpZ2h0OiAxMDAlO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWRheWdyaWQtbGF5b3V0IC50dWktZnVsbC1jYWxlbmRhci1yaWdodCB7XG4gIG92ZXJmbG93LXk6IGhpZGRlbjtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1kYXlncmlkLWd1aWRlLWNyZWF0aW9uLWJsb2NrIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGJvdHRvbTogMDtcbiAgei1pbmRleDogMTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci10aW1lZ3JpZC1jb250YWluZXIge1xuICBoZWlnaHQ6IDEwMCU7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgb3ZlcmZsb3cteTogc2Nyb2xsO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXRpbWVncmlkLWNvbnRhaW5lci1zcGxpdCB7XG4gIGhlaWdodDogMTAwJTtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXRpbWVncmlkLWxlZnQge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItdGltZWdyaWQtaG91ciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgY29sb3I6ICM1NTU7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItdGltZWdyaWQtaG91cjpmaXJzdC1jaGlsZCBzcGFuIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci10aW1lZ3JpZC1ob3VyOmxhc3QtY2hpbGQge1xuICBib3JkZXItYm90dG9tOiBub25lO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXRpbWVncmlkLWhvdXIgc3BhbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAtMTFweDtcbiAgbGVmdDogMDtcbiAgcmlnaHQ6IDVweDtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIGxpbmUtaGVpZ2h0OiAyNXB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXRpbWVncmlkLXJpZ2h0IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXRpbWVncmlkLWdyaWRsaW5lIHtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlZWU7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItdGltZWdyaWQtZ3JpZGxpbmU6bGFzdC1jaGlsZCB7XG4gIGJvcmRlci1ib3R0b206IG5vbmU7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItdGltZWdyaWQtc2NoZWR1bGVzIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cbi50dWktZnVsbC1jYWxlbmRhci10aW1lZ3JpZC1ob3VybWFya2VyIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB3aWR0aDogMTAwJTtcbiAgZGlzcGxheTogdGFibGU7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItdGltZWdyaWQtaG91cm1hcmtlci1saW5lLWxlZnQge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIG1pbi1oZWlnaHQ6IDFweDtcbiAgbGVmdDogMDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci10aW1lZ3JpZC1ob3VybWFya2VyLWxpbmUtdG9kYXkge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIG1pbi1oZWlnaHQ6IDFweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci10aW1lZ3JpZC1ob3VybWFya2VyLWxpbmUtcmlnaHQge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIG1pbi1oZWlnaHQ6IDFweDtcbiAgcmlnaHQ6IDA7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItdGltZWdyaWQtaG91cm1hcmtlci10aW1lIHtcbiAgcGFkZGluZy1yaWdodDogNXB4O1xuICBsaW5lLWhlaWdodDogMTJweDtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIGRpc3BsYXk6IHRhYmxlLWNlbGw7XG4gIHZlcnRpY2FsLWFsaWduOiBib3R0b207XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItdGltZWdyaWQtdG9kYXltYXJrZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRleHQtaW5kZW50OiAtOTk5OXB4O1xuICB3aWR0aDogOXB4O1xuICBoZWlnaHQ6IDlweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzEzNWRlNjtcbiAgbWFyZ2luOiAtNHB4IDAgMCAtNXB4O1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItdGltZWdyaWQtc3RpY2t5LWNvbnRhaW5lciB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXRpbWVncmlkLXRpbWV6b25lLWxhYmVsLWNvbnRhaW5lciB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci10aW1lZ3JpZC10aW1lem9uZS1sYWJlbC1jZWxsIHtcbiAgZGlzcGxheTogdGFibGU7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItdGltZWdyaWQtdGltZXpvbmUtbGFiZWwge1xuICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICBwYWRkaW5nLXJpZ2h0OiA1cHg7XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXRpbWVncmlkLXRpbWV6b25lLWNsb3NlLWJ0biB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItdGltZWdyaWQtdGltZXpvbmUtY2xvc2UtYnRuIC50dWktZnVsbC1jYWxlbmRhci1pY29uIHtcbiAgd2lkdGg6IDVweDtcbiAgaGVpZ2h0OiAxMHB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXRpbWUtZGF0ZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBtYXJnaW4tbGVmdDogLTFweDtcbiAgYm94LXNpemluZzogY29udGVudC1ib3g7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItdGltZS1kYXRlOmxhc3QtY2hpbGQge1xuICBib3JkZXItcmlnaHQ6IG5vbmU7XG4gIG1hcmdpbjogMDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci10aW1lLWRhdGU6bGFzdC1jaGlsZCAudHVpLWZ1bGwtY2FsZW5kYXItdGltZS1zY2hlZHVsZSxcbi50dWktZnVsbC1jYWxlbmRhci10aW1lLWRhdGU6bGFzdC1jaGlsZCAudHVpLWZ1bGwtY2FsZW5kYXItdGltZS1ndWlkZS1jcmVhdGlvbiB7XG4gIGxlZnQ6IDBweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci10aW1lLWRhdGUtc2NoZWR1bGUtYmxvY2std3JhcCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgaGVpZ2h0OiAxMDAlO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXRpbWUtZGF0ZS1zY2hlZHVsZS1ibG9jayB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgcmlnaHQ6IDBweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci10aW1lLWRhdGUtc2NoZWR1bGUtYmxvY2stcGVuZGluZyB7XG4gIG9wYWNpdHk6IDAuNztcbn1cbi50dWktZnVsbC1jYWxlbmRhci10aW1lLWRhdGUtc2NoZWR1bGUtYmxvY2stZHJhZ2dpbmctZGltIHtcbiAgb3BhY2l0eTogMC4zO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXRpbWUtZGF0ZS1zY2hlZHVsZS1ibG9jay1mb2N1c2VkIHtcbiAgYm94LXNoYWRvdzogMCAwIDhweCAwIHJnYmEoMCwwLDAsMC4yKTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci10aW1lLWRhdGUtc2NoZWR1bGUtYmxvY2stY292ZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLDAsMCwwLjIpO1xuICBib3gtc2hhZG93OiAwIDJweCA2cHggMCByZ2JhKDAsMCwwLDAuMSk7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItdGltZS1zY2hlZHVsZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgbGVmdDogMXB4O1xuICBoZWlnaHQ6IDEwMCU7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItdGltZS1zY2hlZHVsZS1jb250ZW50IHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgYm9yZGVyLWxlZnQtd2lkdGg6IDNweDtcbiAgYm9yZGVyLWxlZnQtc3R5bGU6IHNvbGlkO1xuICBwYWRkaW5nOiAxcHggMCAwIDNweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci10aW1lLXNjaGVkdWxlLWNvbnRlbnQtdHJhdmVsLXRpbWUge1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBmb250LXNpemU6IDExcHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItdGltZS1yZXNpemUtaGFuZGxlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICByaWdodDogMHB4O1xuICBib3R0b206IDBweDtcbiAgbGVmdDogMHB4O1xuICBoZWlnaHQ6IDVweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBjb2xvcjogI2ZmZjtcbiAgY3Vyc29yOiByb3ctcmVzaXplO1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgdG9wO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXRpbWUtZ3VpZGUtY3JlYXRpb24ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHJpZ2h0OiAxMHB4O1xuICBsZWZ0OiAxcHg7XG4gIHBhZGRpbmc6IDNweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci10aW1lLWd1aWRlLW1vdmUgLnR1aS1mdWxsLWNhbGVuZGFyLXRpbWUtc2NoZWR1bGUsXG4udHVpLWZ1bGwtY2FsZW5kYXItdGltZS1ndWlkZS1yZXNpemUgLnR1aS1mdWxsLWNhbGVuZGFyLXRpbWUtc2NoZWR1bGUsXG4udHVpLWZ1bGwtY2FsZW5kYXItdGltZS1ndWlkZS1tb3ZlIC50dWktZnVsbC1jYWxlbmRhci10aW1lLXJlc2l6ZS1oYW5kbGUsXG4udHVpLWZ1bGwtY2FsZW5kYXItdGltZS1ndWlkZS1yZXNpemUgLnR1aS1mdWxsLWNhbGVuZGFyLXRpbWUtcmVzaXplLWhhbmRsZSB7XG4gIG9wYWNpdHk6IDAuODtcbiAgei1pbmRleDogOTc7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItdGltZS1ndWlkZS1jcmVhdGlvbi1sYWJlbCB7XG4gIGN1cnNvcjogZGVmYXVsdDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci10aW1lLWd1aWRlLWJvdHRvbSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgYm90dG9tOiAzcHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItbW9udGgge1xuICBoZWlnaHQ6IDEwMCU7XG4gIG1pbi1oZWlnaHQ6IDYwMHB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLW1vbnRoLWRheW5hbWUge1xuICB3aWR0aDogMTAwJTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBmb250LXNpemU6IDEzcHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItbW9udGgtZGF5bmFtZS1pdGVtIHtcbiAgaGVpZ2h0OiAxMDAlO1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1tb250aC13ZWVrLWl0ZW0ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItbW9udGgtd2Vlay1pdGVtPmRpdiB7XG4gIGhlaWdodDogMTAwJTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1tb250aC1tb3JlIHtcbiAgaGVpZ2h0OiBpbmhlcml0O1xuICBtaW4td2lkdGg6IDI4MHB4O1xuICBtaW4taGVpZ2h0OiAxNTBweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1tb250aC1tb3JlLXRpdGxlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLW1vbnRoLW1vcmUtdGl0bGUtZGF5IHtcbiAgZm9udC1zaXplOiAyM3B4O1xuICBjb2xvcjogIzMzMztcbn1cbi50dWktZnVsbC1jYWxlbmRhci1tb250aC1tb3JlLXRpdGxlLWRheS1sYWJlbCB7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY29sb3I6ICMzMzM7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItbW9udGgtbW9yZS1jbG9zZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgcmlnaHQ6IDA7XG4gIG91dGxpbmU6IDA7XG4gIGJhY2tncm91bmQ6IG5vbmU7XG4gIGJvcmRlcjogMDtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBsaW5lLWhlaWdodDogMjhweDtcbiAgcGFkZGluZzogMCA3cHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1tb250aC1tb3JlLWxpc3Qge1xuICBvdmVyZmxvdy15OiBhdXRvO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLW1vbnRoLW1vcmUtc2NoZWR1bGUge1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgZm9udC1zaXplOiAxMnB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLW1vbnRoLWd1aWRlLWJsb2NrIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLW1vbnRoLXdlZWtkYXktc2NoZWR1bGUge1xuICBtYXJnaW4tdG9wOiAycHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItbW9udGgtY3JlYXRpb24tZ3VpZGUge1xuICB0b3A6IDA7XG4gIGJvdHRvbTogLTFweDtcbiAgbGVmdDogLTFweDtcbiAgcmlnaHQ6IDA7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjA7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItbW9udGgtZ3VpZGUtZm9jdXNlZCB7XG4gIGJveC1zaGFkb3c6IDAgMCA4cHggMCByZ2JhKDAsMCwwLDAuMik7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItbW9udGgtZ3VpZGUge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHBhZGRpbmctbGVmdDogM3B4O1xuICBsaW5lLWhlaWdodDogMThweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItbW9udGgtZ3VpZGUtY292ZXIge1xuICB3aWR0aDogMTAwJTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IC01MCU7XG4gIGxlZnQ6IC01MCU7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwwLDAsMC4yKTtcbiAgYm94LXNoYWRvdzogMCAycHggNnB4IDAgcmdiYSgwLDAsMCwwLjEpO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLW1vbnRoLWV4Y2VlZC1sZWZ0IC50dWktZnVsbC1jYWxlbmRhci1tb250aC1ndWlkZSB7XG4gIG1hcmdpbi1sZWZ0OiAwcHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItbW9udGgtZXhjZWVkLXJpZ2h0IC50dWktZnVsbC1jYWxlbmRhci1tb250aC1ndWlkZSB7XG4gIG1hcmdpbi1yaWdodDogMHB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLW1vbnRoLWV4Y2VlZC1yaWdodCAudHVpLWZ1bGwtY2FsZW5kYXItbW9udGgtZ3VpZGUtaGFuZGxlIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1tb250aC1ndWlkZS1oYW5kbGUge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgcmlnaHQ6IDNweDtcbiAgd2lkdGg6IDZweDtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogM3B4IGNlbnRlcjtcbiAgY3Vyc29yOiBjb2wtcmVzaXplO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXZsYXlvdXQtY29udGFpbmVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXNwbGl0dGVyIHtcbiAgY2xlYXI6IGxlZnQ7XG4gIGN1cnNvcjogcm93LXJlc2l6ZTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1zcGxpdHRlcjpob3ZlciB7XG4gIGJvcmRlci1jb2xvcjogIzk5OTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1zcGxpdHRlci1mb2N1c2VkIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDtcbiAgYm9yZGVyOiBub25lO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXNwbGl0dGVyLWd1aWRlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAzcHg7XG4gIGJvcmRlcjogbm9uZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2U4ZThlODtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1wb3B1cCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgZm9udC13ZWlnaHQ6IDIuNTtcbiAgYm94LXNoYWRvdzogMCAycHggNnB4IDAgcmdiYSgwLDAsMCwwLjEpO1xuICBjbGVhcjogYm90aDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1jb250YWluZXIge1xuICBtaW4td2lkdGg6IDQ3NHB4O1xuICBib3gtc2hhZG93OiAwIDJweCA2cHggMCByZ2JhKDAsMCwwLDAuMSk7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGJvcmRlcjogc29saWQgMXB4ICNkNWQ1ZDU7XG4gIHBhZGRpbmc6IDE3cHg7XG4gIGJvcmRlci1yYWRpdXM6IDJweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1zZWN0aW9uIHtcbiAgZm9udC1zaXplOiAwO1xuICBtaW4taGVpZ2h0OiA0MHB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXNlY3Rpb24tY2FsZW5kYXIge1xuICB3aWR0aDogMTc2cHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItc2VjdGlvbi1jYWxlbmRhci50dWktZnVsbC1jYWxlbmRhci1oaWRlIHtcbiAgaGVpZ2h0OiAyMXB4O1xuICB2aXNpYmlsaXR5OiBoaWRkZW47XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItc2VjdGlvbi10aXRsZSB7XG4gIHdpZHRoOiBjYWxjKDEwMCUgLSAzNnB4KTtcbiAgcGFkZGluZy1yaWdodDogNHB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXNlY3Rpb24tdGl0bGUgaW5wdXQge1xuICB3aWR0aDogMzY1cHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItYnV0dG9uLnR1aS1mdWxsLWNhbGVuZGFyLXNlY3Rpb24tcHJpdmF0ZSB7XG4gIGhlaWdodDogMzJweDtcbiAgcGFkZGluZzogOHB4O1xuICBmb250LXNpemU6IDA7XG4gIG1hcmdpbi1sZWZ0OiA0cHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItc2VjdGlvbi1wcml2YXRlLnR1aS1mdWxsLWNhbGVuZGFyLXB1YmxpYyAudHVpLWZ1bGwtY2FsZW5kYXItaWMtcHJpdmF0ZSB7XG4gIGJhY2tncm91bmQ6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUE0QUFBQU9DQVlBQUFBZlNDM1JBQUFBQVhOU1IwSUFyczRjNlFBQUFLZEpSRUZVS0JWallDQVRNS0xyaTQ2T2x2bjkrM2ZYLy8vL0hVQnlqSXlNQjFoWldjdVdMbDM2QkZrdGlrYVFwbCsvZmwwRUtoQkNWZ1JrdjJOalk5Tkgxc3lFckFCa0UxVFRkcUJDV1JBRzhyZUR4S0J5Y09Vb0dtSE9BMnBJQTVrT3dpQTJTRFZNRHE0VG1SRWFHdm9maEpIRmNMSGhmZ3dMQzlzS05OVUxsMEtRT0RDZ3RxMWF0Y29ieElZN2xaQW1rR0prTlhDTklBbFN3SWpTQ0FwcUlnSm5LMHdOQUxvT1B3U3BPY3EwQUFBQUFFbEZUa1N1UW1DQykgbm8tcmVwZWF0O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXNlY3Rpb24tc3RhcnQtZGF0ZSxcbi50dWktZnVsbC1jYWxlbmRhci1zZWN0aW9uLWVuZC1kYXRlIHtcbiAgd2lkdGg6IDE3NnB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXNlY3Rpb24tc3RhcnQtZGF0ZSBpbnB1dCxcbi50dWktZnVsbC1jYWxlbmRhci1zZWN0aW9uLWVuZC1kYXRlIGlucHV0IHtcbiAgd2lkdGg6IDEzOXB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXNlY3Rpb24tc3RhcnQtZGF0ZTpob3ZlciAudHVpLWZ1bGwtY2FsZW5kYXItcG9wdXAtc2VjdGlvbi1pdGVtLFxuLnR1aS1mdWxsLWNhbGVuZGFyLXNlY3Rpb24tZW5kLWRhdGU6aG92ZXIgLnR1aS1mdWxsLWNhbGVuZGFyLXBvcHVwLXNlY3Rpb24taXRlbSxcbi50dWktZnVsbC1jYWxlbmRhci1zZWN0aW9uLXN0YXJ0LWRhdGU6Zm9jdXMgLnR1aS1mdWxsLWNhbGVuZGFyLXBvcHVwLXNlY3Rpb24taXRlbSxcbi50dWktZnVsbC1jYWxlbmRhci1zZWN0aW9uLWVuZC1kYXRlOmZvY3VzIC50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1zZWN0aW9uLWl0ZW0sXG4udHVpLWZ1bGwtY2FsZW5kYXItc2VjdGlvbi1zdGFydC1kYXRlOmhvdmVyIC50dWktZGF0ZXBpY2tlcixcbi50dWktZnVsbC1jYWxlbmRhci1zZWN0aW9uLWVuZC1kYXRlOmhvdmVyIC50dWktZGF0ZXBpY2tlcixcbi50dWktZnVsbC1jYWxlbmRhci1zZWN0aW9uLXN0YXJ0LWRhdGU6Zm9jdXMgLnR1aS1kYXRlcGlja2VyLFxuLnR1aS1mdWxsLWNhbGVuZGFyLXNlY3Rpb24tZW5kLWRhdGU6Zm9jdXMgLnR1aS1kYXRlcGlja2VyIHtcbiAgYm9yZGVyLWNvbG9yOiAjYmJiO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXBvcHVwLXNlY3Rpb24taXRlbTpmb2N1cyB7XG4gIGJvcmRlci1jb2xvcjogI2JiYjtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1zZWN0aW9uLWRhdGUtZGFzaCB7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY29sb3I6ICNkNWQ1ZDU7XG4gIGhlaWdodDogMzJweDtcbiAgcGFkZGluZzogMCA0cHg7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItcG9wdXAtc2VjdGlvbi1pdGVtLnR1aS1mdWxsLWNhbGVuZGFyLXNlY3Rpb24tYWxsZGF5IHtcbiAgYm9yZGVyOiBub25lO1xuICBwYWRkaW5nOiAwIDAgMCA4cHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1zZWN0aW9uLWl0ZW0udHVpLWZ1bGwtY2FsZW5kYXItc2VjdGlvbi1sb2NhdGlvbiB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXBvcHVwLXNlY3Rpb24taXRlbS50dWktZnVsbC1jYWxlbmRhci1zZWN0aW9uLWxvY2F0aW9uIGlucHV0IHtcbiAgd2lkdGg6IDQwMHB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXNlY3Rpb24tYWxsZGF5IC50dWktZnVsbC1jYWxlbmRhci1pY29uLnR1aS1mdWxsLWNhbGVuZGFyLWljLWNoZWNrYm94IHtcbiAgbWFyZ2luOiAwO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXBvcHVwLXNlY3Rpb24taXRlbS50dWktZnVsbC1jYWxlbmRhci1zZWN0aW9uLWFsbGRheSAudHVpLWZ1bGwtY2FsZW5kYXItY29udGVudCB7XG4gIHBhZGRpbmctbGVmdDogNHB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXNlY3Rpb24tc3RhdGUge1xuICB3aWR0aDogMTA5cHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItc2VjdGlvbi1zdGF0ZSAudHVpLWZ1bGwtY2FsZW5kYXItY29udGVudCB7XG4gIHdpZHRoOiA1OHB4O1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1zZWN0aW9uLWl0ZW0ge1xuICBoZWlnaHQ6IDMycHg7XG4gIHBhZGRpbmc6IDAgOXB4IDAgMTJweDtcbiAgYm9yZGVyOiAxcHggc29saWQgI2Q1ZDVkNTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBmb250LXNpemU6IDA7XG4gIGJvcmRlci1yYWRpdXM6IDJweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1zZWN0aW9uLWl0ZW06aG92ZXIge1xuICBib3JkZXItY29sb3I6ICNiYmI7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItcG9wdXAtc2VjdGlvbi1pdGVtOmZvY3VzIHtcbiAgYm9yZGVyLWNvbG9yOiAjYmJiO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXBvcHVwLXNlY3Rpb24taXRlbSAudHVpLWZ1bGwtY2FsZW5kYXItaWNvbiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1zZWN0aW9uLWl0ZW0gLnR1aS1mdWxsLWNhbGVuZGFyLWNvbnRlbnQge1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBwYWRkaW5nLWxlZnQ6IDhweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1zZWN0aW9uLWNhbGVuZGFyIC50dWktZnVsbC1jYWxlbmRhci1kcm9wZG93bi1idXR0b24gLnR1aS1mdWxsLWNhbGVuZGFyLWNvbnRlbnQge1xuICB3aWR0aDogMTI1cHg7XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB0b3A6IC0xcHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItcG9wdXAtc2VjdGlvbi1pdGVtIGlucHV0IHtcbiAgYm9yZGVyOiBub25lO1xuICBoZWlnaHQ6IDMwcHg7XG4gIG91dGxpbmU6IG5vbmU7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cbi50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1zZWN0aW9uLWl0ZW0gaW5wdXQ6OnBsYWNlaG9sZGVyIHtcbiAgY29sb3I6ICNiYmI7XG4gIGZvbnQtd2VpZ2h0OiAzMDA7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItZHJvcGRvd24ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItZHJvcGRvd246aG92ZXIgLnR1aS1mdWxsLWNhbGVuZGFyLWRyb3Bkb3duLWJ1dHRvbiB7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNiYmI7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItZHJvcGRvd24tYnV0dG9uLnR1aS1mdWxsLWNhbGVuZGFyLXBvcHVwLXNlY3Rpb24taXRlbSB7XG4gIGhlaWdodDogMzJweDtcbiAgZm9udC1zaXplOiAwO1xuICB0b3A6IC0xcHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItZHJvcGRvd24tYXJyb3cge1xuICBiYWNrZ3JvdW5kOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBNEFBQUFPQ0FZQUFBQWZTQzNSQUFBQUFYTlNSMElBcnM0YzZRQUFBSGxKUkVGVUtCVmpZQmdGT0VPQUVWa21QRHhjODkrL2Y2ZUFZanpJNGtEMkZ5WW1Kck9WSzFkZWg0a3p3UmdnR2lRQlZKQ0VMQVppZzhTUU5ZSEVtRUVFTXJoNjllbzFIUjBkZnFDWUpVaWNrWkd4ZjlXcVZmM0lha0JzRkJ0aGtscGFXbVZBOW1FUWhySmhVb1RwME5CUUNSQW1ySEw0cWdBQXV1NGNXWk9aSUdzQUFBQUFTVVZPUks1Q1lJST0pIG5vLXJlcGVhdDtcbn1cbi5kcm9wZG93bi5vcGVuIC50dWktZnVsbC1jYWxlbmRhci1kcm9wZG93bi1hcnJvdyxcbi50dWktZnVsbC1jYWxlbmRhci1vcGVuIC50dWktZnVsbC1jYWxlbmRhci1kcm9wZG93bi1hcnJvdyB7XG4gIGJhY2tncm91bmQ6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUE0QUFBQU9DQVlBQUFBZlNDM1JBQUFBQVhOU1IwSUFyczRjNlFBQUFJRkpSRUZVS0JWallCaitnQm1YRjJOaVlpVFYxZFY1cmwyNzlnV2JHaVpzZ2cwTkRTdy9mLzVjQ1pSYkJXSmpVNFBWUmpFeHNSNmc0bkFnbG4vejVnM3YxYXRYZDZKcnh0QVlIaDRlK3YvLy96NGtoWmE2dXJyWGdKcXZJWWt4TUNKemdKbzAvLzM3ZHdvb3hvTXNEbVIvWVdKaU1sdTVjdVYxTlBGUkxyWVFBQURNVkNhVXRiRzdYd0FBQUFCSlJVNUVya0pnZ2c9PSkgbm8tcmVwZWF0O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWRyb3Bkb3duLW1lbnUge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMzFweDtcbiAgcGFkZGluZzogNHB4IDA7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkNWQ1ZDU7XG4gIGJvcmRlci10b3A6IG5vbmU7XG4gIGJvcmRlci1yYWRpdXM6IDAgMCAycHggMnB4O1xuICB3aWR0aDogMTAwJTtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1kcm9wZG93bjpob3ZlciAudHVpLWZ1bGwtY2FsZW5kYXItZHJvcGRvd24tbWVudSB7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNiYmI7XG4gIGJvcmRlci10b3A6IG5vbmU7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItb3BlbiAudHVpLWZ1bGwtY2FsZW5kYXItZHJvcGRvd24tbWVudSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWRyb3Bkb3duLW1lbnUtaXRlbSB7XG4gIGhlaWdodDogMzBweDtcbiAgYm9yZGVyOiBub25lO1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItc2VjdGlvbi1jYWxlbmRhciAudHVpLWZ1bGwtY2FsZW5kYXItZHJvcGRvd24tbWVudS1pdGVtIHtcbiAgd2lkdGg6IDEwMCU7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItc2VjdGlvbi1zdGF0ZSAudHVpLWZ1bGwtY2FsZW5kYXItZHJvcGRvd24tbWVudS1pdGVtIHtcbiAgd2lkdGg6IDEwMCU7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItZHJvcGRvd24tbWVudS1pdGVtOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSg4MSw5MiwyMzAsMC4wNSk7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItZHJvcGRvd24tbWVudS1pdGVtIC50dWktZnVsbC1jYWxlbmRhci1jb250ZW50IHtcbiAgbGluZS1oZWlnaHQ6IDMwcHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItYnV0dG9uLnR1aS1mdWxsLWNhbGVuZGFyLXBvcHVwLWNsb3NlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDEwcHg7XG4gIHJpZ2h0OiAxMHB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBwYWRkaW5nOiAycHg7XG4gIGJvcmRlcjogbm9uZTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1zZWN0aW9uLWJ1dHRvbi1zYXZlIHtcbiAgaGVpZ2h0OiAzNnB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXBvcHVwLXNhdmUge1xuICBmbG9hdDogcmlnaHQ7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItcG9wdXAtYXJyb3ctYm9yZGVyLFxuLnR1aS1mdWxsLWNhbGVuZGFyLXBvcHVwLWFycm93LWZpbGwge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItYXJyb3ctdG9wIC50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1hcnJvdy1ib3JkZXIge1xuICBib3JkZXItdG9wOiBub25lO1xuICBib3JkZXItcmlnaHQ6IDhweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLWJvdHRvbTogOHB4IHNvbGlkICNkNWQ1ZDU7XG4gIGJvcmRlci1sZWZ0OiA4cHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGxlZnQ6IGNhbGMoNTAlIC0gOHB4KTtcbiAgdG9wOiAtN3B4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWFycm93LXJpZ2h0IC50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1hcnJvdy1ib3JkZXIge1xuICBib3JkZXItdG9wOiA4cHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1yaWdodDogbm9uZTtcbiAgYm9yZGVyLWJvdHRvbTogOHB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBib3JkZXItbGVmdDogOHB4IHNvbGlkICNkNWQ1ZDU7XG4gIHRvcDogY2FsYyg1MCUgLSA4cHgpO1xuICByaWdodDogLTdweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1hcnJvdy1ib3R0b20gLnR1aS1mdWxsLWNhbGVuZGFyLXBvcHVwLWFycm93LWJvcmRlciB7XG4gIGJvcmRlci10b3A6IDhweCBzb2xpZCAjZDVkNWQ1O1xuICBib3JkZXItcmlnaHQ6IDhweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLWJvdHRvbTogbm9uZTtcbiAgYm9yZGVyLWxlZnQ6IDhweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgbGVmdDogY2FsYyg1MCUgLSA4cHgpO1xuICBib3R0b206IC03cHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItYXJyb3ctbGVmdCAudHVpLWZ1bGwtY2FsZW5kYXItcG9wdXAtYXJyb3ctYm9yZGVyIHtcbiAgYm9yZGVyLXRvcDogOHB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBib3JkZXItcmlnaHQ6IDhweCBzb2xpZCAjZDVkNWQ1O1xuICBib3JkZXItYm90dG9tOiA4cHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1sZWZ0OiBub25lO1xuICB0b3A6IGNhbGMoNTAlIC0gOHB4KTtcbiAgbGVmdDogLTdweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1hcnJvdy10b3AgLnR1aS1mdWxsLWNhbGVuZGFyLXBvcHVwLWFycm93LWZpbGwge1xuICBib3JkZXItdG9wOiBub25lO1xuICBib3JkZXItcmlnaHQ6IDdweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLWJvdHRvbTogN3B4IHNvbGlkICNmZmY7XG4gIGJvcmRlci1sZWZ0OiA3cHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGxlZnQ6IC03cHg7XG4gIHRvcDogMXB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWFycm93LXJpZ2h0IC50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1hcnJvdy1maWxsIHtcbiAgYm9yZGVyLXRvcDogN3B4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBib3JkZXItcmlnaHQ6IG5vbmU7XG4gIGJvcmRlci1ib3R0b206IDdweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLWxlZnQ6IDdweCBzb2xpZCAjZmZmO1xuICB0b3A6IC03cHg7XG4gIHJpZ2h0OiAxcHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItYXJyb3ctYm90dG9tIC50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1hcnJvdy1maWxsIHtcbiAgYm9yZGVyLXRvcDogN3B4IHNvbGlkICNmZmY7XG4gIGJvcmRlci1yaWdodDogN3B4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBib3JkZXItYm90dG9tOiBub25lO1xuICBib3JkZXItbGVmdDogN3B4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBsZWZ0OiAtN3B4O1xuICBib3R0b206IDFweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1hcnJvdy1sZWZ0IC50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1hcnJvdy1maWxsIHtcbiAgYm9yZGVyLXRvcDogN3B4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBib3JkZXItcmlnaHQ6IDdweCBzb2xpZCAjZmZmO1xuICBib3JkZXItYm90dG9tOiA3cHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1sZWZ0OiBub25lO1xuICB0b3A6IC03cHg7XG4gIGxlZnQ6IDFweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1idXR0b24ge1xuICBiYWNrZ3JvdW5kOiAjZmZmO1xuICBib3JkZXI6IDFweCBzb2xpZCAjZDVkNWQ1O1xuICBib3JkZXItcmFkaXVzOiAycHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgb3V0bGluZTogbm9uZTtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGNvbG9yOiAjMzMzO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWJ1dHRvbjpob3ZlciB7XG4gIGJvcmRlci1jb2xvcjogI2JiYjtcbiAgY29sb3I6ICMzMzM7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItYnV0dG9uOmFjdGl2ZSB7XG4gIGJhY2tncm91bmQ6ICNmOWY5Zjk7XG4gIGNvbG9yOiAjMzMzO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWJ1dHRvbiAucm91bmQge1xuICBib3JkZXItcmFkaXVzOiAyNXB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWNvbmZpcm0ge1xuICB3aWR0aDogOTZweDtcbiAgaGVpZ2h0OiAzNnB4O1xuICBib3JkZXItcmFkaXVzOiA0MHB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY2NjE4O1xuICBmb250LXNpemU6IDEycHg7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBjb2xvcjogI2ZmZjtcbiAgYm9yZGVyOiBub25lO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWNvbmZpcm06aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTU1YjE1O1xuICBjb2xvcjogI2ZmZjtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1jb25maXJtOmFjdGl2ZSB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNkOTU2MTQ7XG4gIGNvbG9yOiAjZmZmO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWljb24udHVpLWZ1bGwtY2FsZW5kYXItcmlnaHQge1xuICBmbG9hdDogcmlnaHQ7XG4gIHRvcDogMXB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWljb24gLnR1aS1mdWxsLWNhbGVuZGFyLW5vbmUge1xuICBkaXNwbGF5OiBub25lO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWljb24udHVpLWZ1bGwtY2FsZW5kYXItY2FsZW5kYXItZG90IHtcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xuICB3aWR0aDogMTJweDtcbiAgaGVpZ2h0OiAxMnB4O1xuICBtYXJnaW46IDFweDtcbn1cbmlucHV0W3R5cGU9J2NoZWNrYm94J10udHVpLWZ1bGwtY2FsZW5kYXItY2hlY2tib3gtc3F1YXJlIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbmlucHV0W3R5cGU9J2NoZWNrYm94J10udHVpLWZ1bGwtY2FsZW5kYXItY2hlY2tib3gtc3F1YXJlICsgc3BhbiB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBsaW5lLWhlaWdodDogMTRweDtcbiAgbWFyZ2luLXJpZ2h0OiA4cHg7XG4gIHdpZHRoOiAxNHB4O1xuICBoZWlnaHQ6IDE0cHg7XG4gIGJhY2tncm91bmQ6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUE0QUFBQU9DQVlBQUFBZlNDM1JBQUFBQVhOU1IwSUFyczRjNlFBQUFEcEpSRUZVS0JWalBIZnUzTzUvLy82NU1KQUFtSmlZOWpDY09YUG1QNmtBcEllSkJJdFFsSTVxUkFrT1ZNNW80S0NHQndxUGtjeEV2aHNBYnpSRStKaGI5SXdBQUFBQVNVVk9SSzVDWUlJPSkgbm8tcmVwZWF0O1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xufVxuaW5wdXRbdHlwZT0nY2hlY2tib3gnXS50dWktZnVsbC1jYWxlbmRhci1jaGVja2JveC1zcXVhcmU6Y2hlY2tlZCArIHNwYW4ge1xuICBiYWNrZ3JvdW5kOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBNEFBQUFPQ0FZQUFBQWZTQzNSQUFBQUFYTlNSMElBcnM0YzZRQUFBTUJKUkVGVUtCV1ZrakVPd2pBTVJlMldnWlc3SUlIRURkaGdoaHV3Y1E0MnJsSnVnQVFTNTRDeGE1Y3ExUU01VFVwQnlaZlMyajkrZGxKVnQvdFg1WnhiUzRaVTlWTGtRdlNIS1RJR1JhVkpZRm1LckJiVENKeEUyVWdDZER6TVpEa0hyT1Y2Yjk1VjBVUzZVbWdLb2R1akVaYkpnMEIwWmdFTW9kTzVsclkxVE1RZjFUcHlKR0JFakQrRTJOUE43dWtJVURpRi9CZkVYZ1JpR0V3OE5na2ZmWUdZd0NpODA4ZnBuLzZPdmZVZnNEci9WYzFJZlJmOHNLbkZWcWVpVlFmRHUwdGYvbldIOWdBQUFBQkpSVTVFcmtKZ2dnPT0pIG5vLXJlcGVhdDtcbn1cbmlucHV0W3R5cGU9J2NoZWNrYm94J10udHVpLWZ1bGwtY2FsZW5kYXItY2hlY2tib3gtcm91bmQge1xuICBkaXNwbGF5OiBub25lO1xufVxuaW5wdXRbdHlwZT0nY2hlY2tib3gnXS50dWktZnVsbC1jYWxlbmRhci1jaGVja2JveC1yb3VuZCArIHNwYW4ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgd2lkdGg6IDE0cHg7XG4gIGhlaWdodDogMTRweDtcbiAgbGluZS1oZWlnaHQ6IDE0cHg7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIG1hcmdpbi1yaWdodDogOHB4O1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIGJvcmRlcjogc29saWQgMnB4O1xuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1wb3B1cC10b3AtbGluZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgYm9yZGVyLXJhZGl1czogMnB4IDJweCAwIDA7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDRweDtcbiAgYm9yZGVyOiBub25lO1xuICB0b3A6IDA7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItcG9wdXAtZGV0YWlsIC50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1jb250YWluZXIge1xuICB3aWR0aDogMzAxcHg7XG4gIG1pbi13aWR0aDogMzAxcHg7XG4gIHBhZGRpbmctYm90dG9tOiAwO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXBvcHVwLWRldGFpbCAudHVpLWZ1bGwtY2FsZW5kYXItaWNvbiB7XG4gIHdpZHRoOiAxMnB4O1xuICBoZWlnaHQ6IDEycHg7XG4gIGJhY2tncm91bmQtc2l6ZTogMTJweDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBtYXJnaW4tcmlnaHQ6IDhweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1kZXRhaWwgLnR1aS1mdWxsLWNhbGVuZGFyLWljb24udHVpLWZ1bGwtY2FsZW5kYXItaWMtbG9jYXRpb24tYiB7XG4gIHRvcDogLTJweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1kZXRhaWwgLnR1aS1mdWxsLWNhbGVuZGFyLWljb24udHVpLWZ1bGwtY2FsZW5kYXItaWMtdXNlci1iIHtcbiAgdG9wOiAtMnB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXBvcHVwLWRldGFpbCAudHVpLWZ1bGwtY2FsZW5kYXItaWNvbi50dWktZnVsbC1jYWxlbmRhci1pYy1zdGF0ZS1iIHtcbiAgdG9wOiAtMXB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXBvcHVwLWRldGFpbCAudHVpLWZ1bGwtY2FsZW5kYXItaWNvbi50dWktZnVsbC1jYWxlbmRhci1jYWxlbmRhci1kb3Qge1xuICB3aWR0aDogMTBweDtcbiAgaGVpZ2h0OiAxMHB4O1xuICBtYXJnaW4tcmlnaHQ6IDhweDtcbiAgdG9wOiAtMXB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXBvcHVwLWRldGFpbCAudHVpLWZ1bGwtY2FsZW5kYXItY29udGVudCB7XG4gIGxpbmUtaGVpZ2h0OiAyNHB4O1xuICBoZWlnaHQ6IDI0cHg7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgbGluZS1oZWlnaHQ6IDI7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItcG9wdXAtZGV0YWlsIC50dWktZnVsbC1jYWxlbmRhci1zZWN0aW9uLWhlYWRlciB7XG4gIG1hcmdpbi1ib3R0b206IDZweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1kZXRhaWwgLnR1aS1mdWxsLWNhbGVuZGFyLXBvcHVwLWRldGFpbC1pdGVtLXNlcGFyYXRlIHtcbiAgbWFyZ2luLXRvcDogNHB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXBvcHVwLWRldGFpbCAudHVpLWZ1bGwtY2FsZW5kYXItcG9wdXAtZGV0YWlsLWl0ZW0taW5kZW50IHtcbiAgdGV4dC1pbmRlbnQ6IC0yMHB4O1xuICBwYWRkaW5nLWxlZnQ6IDIwcHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItcG9wdXAtZGV0YWlsIC50dWktZnVsbC1jYWxlbmRhci1zY2hlZHVsZS10aXRsZSB7XG4gIGZvbnQtc2l6ZTogMTVweDtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGxpbmUtaGVpZ2h0OiAxLjY7XG4gIHdvcmQtYnJlYWs6IGJyZWFrLWFsbDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1kZXRhaWwgLnR1aS1mdWxsLWNhbGVuZGFyLXNjaGVkdWxlLXByaXZhdGUge1xuICBkaXNwbGF5OiBub25lO1xuICB3aWR0aDogMTZweDtcbiAgaGVpZ2h0OiAxNnB4O1xuICBiYWNrZ3JvdW5kOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBNEFBQUFPQ0FZQUFBQWZTQzNSQUFBQUFYTlNSMElBcnM0YzZRQUFBS3BKUkVGVUtCVmpZQ0FUTUtMcmk0Nk9sdm45KzNmWC8vLy9IVUJ5akl5TUIxaFpXY3VXTGwzNkJGa3Rpa2FRcGwrL2ZsMEVLaEJDVmdSa3YyTmpZOU5IMXN5RXJBQmtFMVRUZHFCQ1dSQUc4cmVEeEtCeWNPVW9HbUhPQTJwSUE1a093aUEyU0RWTURxWVRSU05RVUJJa2dld2tKRFpZRHFZUjdzZXdzTEN0UUZPOVlCTFlhR0JBYlZ1MWFwVTNTQTV1SXlGTklNWElhdUFhUVJLa2dCR2xFUlRVUkFUT1ZwZ2FBQlJRUU9LNDZ3RUFBQUFBQUVsRlRrU3VRbUNDKSBuby1yZXBlYXQgMTZweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1kZXRhaWwgLnR1aS1mdWxsLWNhbGVuZGFyLXNjaGVkdWxlLXByaXZhdGUgLnR1aS1mdWxsLWNhbGVuZGFyLWljLXByaXZhdGUge1xuICBkaXNwbGF5OiBibG9jaztcbn1cbi50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1kZXRhaWwgLnR1aS1mdWxsLWNhbGVuZGFyLXNlY3Rpb24tZGV0YWlsIHtcbiAgbWFyZ2luLWJvdHRvbTogMTZweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1kZXRhaWwgLnR1aS1mdWxsLWNhbGVuZGFyLXNlY3Rpb24tYnV0dG9uIHtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlNWU1ZTU7XG4gIGZvbnQtc2l6ZTogMDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1zZWN0aW9uLWJ1dHRvbiAudHVpLWZ1bGwtY2FsZW5kYXItaWNvbiB7XG4gIG1hcmdpbi1yaWdodDogNHB4O1xuICB0b3A6IC0zcHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItc2VjdGlvbi1idXR0b24gLnR1aS1mdWxsLWNhbGVuZGFyLWNvbnRlbnQge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRvcDogMnB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXBvcHVwLWVkaXQsXG4udHVpLWZ1bGwtY2FsZW5kYXItcG9wdXAtZGVsZXRlIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwYWRkaW5nOiA3cHggOXB4IDExcHggOXB4O1xuICB3aWR0aDogY2FsYyg1MCUgLSAxcHgpO1xuICBvdXRsaW5lOiBub25lO1xuICBiYWNrZ3JvdW5kOiBub25lO1xuICBib3JkZXI6IG5vbmU7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1wb3B1cC12ZXJ0aWNhbC1saW5lIHtcbiAgYmFja2dyb3VuZDogI2U1ZTVlNTtcbiAgd2lkdGg6IDFweDtcbiAgaGVpZ2h0OiAxNHB4O1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1hcmdpbi10b3A6IC03cHg7XG59XG4udHVpLWRhdGVwaWNrZXIge1xuICBsZWZ0OiAtMTJweDtcbiAgei1pbmRleDogMTtcbiAgYm9yZGVyLWNvbG9yOiAjZDVkNWQ1O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWljb24ge1xuICB3aWR0aDogMTRweDtcbiAgaGVpZ2h0OiAxNHB4O1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItaWNvbi50dWktZnVsbC1jYWxlbmRhci1pYy10aXRsZSB7XG4gIGJhY2tncm91bmQ6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUE0QUFBQU9DQVlBQUFBZlNDM1JBQUFBQVhOU1IwSUFyczRjNlFBQUFPNUpSRUZVS0JWallDQVRNT0xTRnhrWnFmSG56NSsxUUhrdE5EVmJWNjllN2NPQ0pnam1Ralh0QjNJa3NNaDdnOFNZMENYUU5URXlNbFlEMWZCQ2FiaHlGSTNvbWtDcS92Ly9Qd25vdEM4Z0dxNEx5SUJyeEtZSnBCQm9VMTVvYUNnUGlFYldDUFlqVUVJRkdCQlkvUVMwcVJXb29SVklnL1VCRFhnTVlvQnRCSEpTZ1d4c0FRRldqRVQ4QkJxUUJ1TEROTTRDYW42R3BBQWI4eWRRTUFEbzN4MGdTYkRHbFN0WDNnVnFkTVNqR1VVVFNDTktBZ2dQRDFjRE9tVS9FRXVCSktFQVF4TklIRVVqU0FCTk0xWk5JSFhNSUFJWlhMMTY5YTIrdnY1bW9LMThRS2VYQXYyMEIxbWVZallBcjd4cmxqcE96YzBBQUFBQVNVVk9SSzVDWUlJPSkgbm8tcmVwZWF0O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWljb24udHVpLWZ1bGwtY2FsZW5kYXItaWMtbG9jYXRpb24ge1xuICBiYWNrZ3JvdW5kOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBNEFBQUFPQ0FZQUFBQWZTQzNSQUFBQUFYTlNSMElBcnM0YzZRQUFBUjFKUkVGVUtCV2RVVHRQZzFBVUJpVDhDeWRISnR2LzBNVEpSV0FnY1RLMWJxMC9wTzNrNEU0SVlMbzJNZTQ2dFM0d3VtalNwVjA3a0FiNkhYTFB6YUdQUlpMTCtjNzN1RS9EK09kbkh1YUNJT2hWVlRVRWY2MjBwV1ZaMHlSSjNxVzNGZlI5ZjF6WDlVZ2FHSnVtT1VuVDlGbjNERHpQdXdQT3VEOVR2U3pMM2tpemhPRko0TG5qT0pjMHdNMEZQMkFzZ3gwbUVlaEhVZlJIZ3pEenFGM0dPb2d6YkpnOFY2WEhGcVl2NEN2cXk3SjhEY093V1ltdzhId3kxa0hNUmpjYUt1RUdnVjgyY2FXYlpheTNpbmRhZ0p5eGNLTE9sS2VSZEpBNjI3WWZVVmFOMHY2dGxLYlpWakNPNHpXMmN3OTFweDNBeEpFbU9PTkNOb1R6UFA5eFhaZk9kNnUwQnp6NjBSR09nbVF1aXVJYjRTM2dCMEl2YW9KVzJRTURzMWJCb0gxQ0FRQUFBQUJKUlU1RXJrSmdnZz09KSBuby1yZXBlYXQ7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItaWNvbi50dWktZnVsbC1jYWxlbmRhci1pYy1kYXRlIHtcbiAgYmFja2dyb3VuZDogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQTRBQUFBT0NBWUFBQUFmU0MzUkFBQUFBWE5TUjBJQXJzNGM2UUFBQUdwSlJFRlVLQlZqWUtBR0NBME4vUS9DNkdaaEUyY0VLUW9MQzl2Ni8vOS9MM1FOMlBpTWpJemJWcTFhNWMwRWtpUldFN0phc0Vac0poTVNJMXNqQzdMSnExZXZCdnNaV1F5WmpSeHdaTnM0aERTaUJBNnk1NUVEQlJzYjdFZFFhc0FtaVVOc0t3NXg0b1FCa1VBZURQSjUzS3NBQUFBQVNVVk9SSzVDWUlJPSkgbm8tcmVwZWF0O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWljb24udHVpLWZ1bGwtY2FsZW5kYXItaWMtc3RhdGUge1xuICBiYWNrZ3JvdW5kOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBNEFBQUFPQ0FZQUFBQWZTQzNSQUFBQUFYTlNSMElBcnM0YzZRQUFBSXhKUkVGVUtCVmpZQ0FUTUtMckN3OFA5L3ozNzk4c29MZ01WTzRKRXhOVDJzcVZLN2NqcTJWQzVvRFlNRTJNakl5TklBd1Vrb0dLb1NobFFlRkJPR0NiVnExYTFRRGlob2FHMWdNcG1PMGdJVEFBT3pVc0xHenIvLy8vdldDQytHaWdLN1lCRGZVR081VllUU0FEWVdveC9JalBObVM1VVkzSW9ZSEdCZ2NPS0c3UXhQRnh0K0tUSkNnSEFHY1pKYkdMUnVKMkFBQUFBRWxGVGtTdVFtQ0MpIG5vLXJlcGVhdDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1pY29uLnR1aS1mdWxsLWNhbGVuZGFyLWljLXByaXZhdGUge1xuICBiYWNrZ3JvdW5kOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBNEFBQUFPQ0FZQUFBQWZTQzNSQUFBQUFYTlNSMElBcnM0YzZRQUFBS3BKUkVGVUtCVmpZQ0FUTUtMcmk0Nk9sdm45KzNmWC8vLy9IVUJ5akl5TUIxaFpXY3VXTGwzNkJGa3Rpa2FRcGwrL2ZsMEVLaEJDVmdSa3YyTmpZOU5IMXN5RXJBQmtFMVRUZHFCQ1dSQUc4cmVEeEtCeWNPVW9HbUhPQTJwSUE1a093aUEyU0RWTURxWVRSU05RVUJJa2dld2tKRFpZRHFZUjdzZXdzTEN0UUZPOVlCTFlhR0JBYlZ1MWFwVTNTQTV1SXlGTklNWElhdUFhUVJLa2dCR2xFUlRVUkFUT1ZwZ2FBQlJRUU9LNDZ3RUFBQUFBQUVsRlRrU3VRbUNDKSBuby1yZXBlYXQ7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItaWNvbi50dWktZnVsbC1jYWxlbmRhci1pYy1jbG9zZSB7XG4gIGJhY2tncm91bmQ6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUE0QUFBQU9DQVlBQUFBZlNDM1JBQUFBQVhOU1IwSUFyczRjNlFBQUFKUkpSRUZVS0JYRmtORVJoQ0FNUkVVYnVFS29oenEwRXEyRERxNkRhNEI2MEtlekRPUmt4aitad2NobVgwSVlodGRXQ0dGbDl5NWc4Mk50ekRuUGR6QWF1ZG83NlpCUytucnZQeGlJbk1rSmNzNXRNY1pGZnFjZnhkcUlSaUVMb2YrQmlJSlBnK21FeG1wbXZLUm4zektqN09yRzlZNzlzelBMMTRBMXhFUDBIZ3k0Z0JaUzVSN2N6SGozZWhTZ096a1ZleWZ1R3JCdy9XTG0waHNBQUFBQVNVVk9SSzVDWUlJPSkgbm8tcmVwZWF0O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWljLWxvY2F0aW9uLWIge1xuICBiYWNrZ3JvdW5kOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBd0FBQUFNQ0FZQUFBQldkVnpuQUFBQUFYTlNSMElBcnM0YzZRQUFBT1pKUkVGVUtCV1ZVVDBLd2pBVWJrekdUdUpXUFlORHBWMGNYRDJFVHVJUkJLK2dzNHVicDNCd2NYQnA2ZUlOQktXRGd5ZG9pZDlYOG9LQ2dnWWVlZS83UzlJR3daOUx2ZXJUTk8zV2RiMnkxbzZJSzZXT1d1dEZsbVUzMFhtREU1OGhiZ3ZwVEErWSttSnFDZW1TMjBqZEcyTjZMUFlNSUNjNmI1QnJJRzNPTkJaN0NvVmo3dzBjZmxsR1JEaitnS1FwanQvaVBVMHllL0xrUk9jTkFOYW9DVXpqcXFxdUlzQnVIZGRBV29peUxPOVJGSFV3SjRKeFIvcW1LSXFkWUc5dkNNTndDZUlpSkh1SGVjai9CMEdTSkJuZzdpZk8rRXJEUE04TDRiN3VjUnpQV0o4RVQxRTdZQzd0bWk5cUFBQUFBRWxGVGtTdVFtQ0MpO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWljLXN0YXRlLWIge1xuICBiYWNrZ3JvdW5kOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBd0FBQUFNQ0FZQUFBQldkVnpuQUFBQUFYTlNSMElBcnM0YzZRQUFBSGxKUkVGVUtCVmpZQ0FSTUNLck56RXg4UVR5Wi8zLy8xOEdKTTdJeVBnRVNLV2RPWE5tTzRnUEFrd1FDazZDRlFNVk5vSXdWT01zdUN3Nnc5alkrRDhJdzhUUitTQnhzSk9BVHRrS05NMExwaEFiRGJSeEc5QnAzbUFuRVZJTU1nQ21CdDBQMkF4SEVSdXNHa0FoZ09KUTdKeXQySVVKaUFJQXd3SW4yNEZnbWhrQUFBQUFTVVZPUks1Q1lJST0pO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWljb24udHVpLWZ1bGwtY2FsZW5kYXItaWMtdXNlci1iIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQXdBQUFBTUNBWUFBQUJXZFZ6bkFBQUFBWE5TUjBJQXJzNGM2UUFBQUpwSlJFRlVLQlZqWUtBMVlFUzN3TVRFeEJNb05nc3FubmJtekpudHlHcVlrRGxROXF6Ly8vL0xnRENRRDlNSVY0Wk5BMXdTR3dPYmhqUkdSc1luSUF6VWtJWk5FMGxpY0UrYm01dHIvZm56Sngxb3NqUFFCRm1vS1krQmZ0bkx3c0l5OCtUSms5ZEFZbUFOeHNiR29VRDJZaUJtQndsaUFUK0JZckZuejU1ZERmTkRPMUFBbDJLUWZwQWNTQTBEVElNeWlFTUFFS01HMHdnQW9sSWpjTTdUam04QUFBQUFTVVZPUks1Q1lJST0pO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWljb24udHVpLWZ1bGwtY2FsZW5kYXItaWMtZWRpdCB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUF3QUFBQU1DQVlBQUFCV2RWem5BQUFBQVhOU1IwSUFyczRjNlFBQUFNZEpSRUZVS0JWallDQVJNT0pUYjJ4c0xNZkl5QmpMeXNxNjRQang0MDlCYXBud2FRREt6ZjcvLzMvTDc5Ky9EMXRiVzB1QjFMSmcwMkJtWnFZSVZQZ2RLQmYvNzkrLy9VQzJ4cytmUDhPQi9INE1HMENLLy83OWV3Q2tFR1FZRXhPVEk1RGF3TW5KdVFURVIvRURUREZRWEE0a0NRUTNRQnBPbno3OUFzSkY4Z01XeFRBMUtEVFlCaHlLTVV3SDZXU3lzcktTQjdrWnlJWTVBeVNPVlRGSWdnbm8rNVZBbWlqRllBMUF3aHpFZ0FLY0pzTVV3SU1WR0tQSDJOblo3WkZEQktZSW1RWUF1TzVZSU1nazM5Z0FBQUFBU1VWT1JLNUNZSUk9KTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1pY29uLnR1aS1mdWxsLWNhbGVuZGFyLWljLWRlbGV0ZSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUF3QUFBQU1DQVlBQUFCV2RWem5BQUFBQVhOU1IwSUFyczRjNlFBQUFGaEpSRUZVS0JWallDQVJNS0tyTnpFeDJmci8vMzh2a0RnakkrTzJNMmZPZUNPckFXdEFWb1FzaWN5R2FXWkNGc1RIQnRyNkg1ODhUam00SDR5TmpmR2FjUGJzV2JCYW9wMEVzM0pZYVFCRkRNeGpXT2l0TURFQTNFRVpmRkVJU3dVQUFBQUFTVVZPUks1Q1lJST0pO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWljb24udHVpLWZ1bGwtY2FsZW5kYXItaWMtYXJyb3ctc29saWQtdG9wIHtcbiAgYmFja2dyb3VuZDogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQTRBQUFBT0NBWUFBQUFmU0MzUkFBQUFBWE5TUjBJQXJzNGM2UUFBQUlGSlJFRlVLQlZqWUJqK2dCbVhGMk5pWWlUVjFkVjVybDI3OWdXYkdpWnNnZzBORFN3L2YvNWNDWlJiQldKalU0UFZSakV4c1I2ZzRuQWdsbi96NWczdjFhdFhkNkpyeHRBWUhoNGUrdi8vL3o0a2haYTZ1cnJYZ0pxdklZa3hNQ0p6Z0pvMC8vMzdkd29veG9Nc0RtUi9ZV0ppTWx1NWN1VjFOUEZSTHJZUUFBRE1WQ2FVdGJHN1h3QUFBQUJKUlU1RXJrSmdnZz09KSBuby1yZXBlYXQ7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItaWNvbi50dWktZnVsbC1jYWxlbmRhci1pYy1taWxlc3RvbmUge1xuICBiYWNrZ3JvdW5kOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBd0FBQUFNQ0FZQUFBQldkVnpuQUFBQUFYTlNSMElBcnM0YzZRQUFBR0ZKUkVGVUtCVmpZQ0FSTUlMVS8zZHcrSStoajVGeEcrUCsvZDdvNHJnMUlLdEUwc3lFTEk2VC9mKy9GMHlPT0EwdzFVQ2E5aHBZa0d4allEeHdBQndJSUxIL2pvNWJHV0J1WjJUY0NsT0hvZ0VtQ0tLeEJTbEluUForQU5sQ0VnQUEzN0VVNEFIYkJRVUFBQUFBU1VWT1JLNUNZSUk9KSBuby1yZXBlYXQ7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItaWNvbi50dWktZnVsbC1jYWxlbmRhci1pYy1hcnJvdy1sZWZ0IHtcbiAgYmFja2dyb3VuZDogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQVFBQUFBSENBWUFBQUF2WmV6UUFBQUFBWE5TUjBJQXJzNGM2UUFBQUZaSlJFRlVDQjFqWklDQ3lzcEs4My8vL2hVeGd2aFZWVlY2Zi8vKzNjM0V4SlRNVkZOVG93cVUyY0hNekp6ZjN0NitoZW4zNzkvemdJcDJ0N1cxclFDcFptSmxaVTBDMHE1QWJSRWdBUXd6d0FJZ0daZ3RBRE1DSnFIL1F5dmhBQUFBQUVsRlRrU3VRbUNDKSBuby1yZXBlYXQ7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItaWNvbi50dWktZnVsbC1jYWxlbmRhci1pYy1hcnJvdy1yaWdodCB7XG4gIGJhY2tncm91bmQ6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFRQUFBQUhDQVlBQUFBdlplelFBQUFBQVhOU1IwSUFyczRjNlFBQUFGeEpSRUZVQ0IxaktDOHZYMWxaV1duT0FBVk1RTEQ0Mzc5L202cXFxdlJBWW93Z0FzaUpBQXIyc2JDdzJJTUZRSUlWRlJVTC8vLy9yOFNDcE1LVmxaWFZuaEZvb0E5UStWeG1abWJYdHJhMlMweEFUaXpRWUQ4UUI2UWFBSk1MSjlCcUU5eVRBQUFBQUVsRlRrU3VRbUNDKSBuby1yZXBlYXQ7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItaWMtcmVwZWF0LWIge1xuICBiYWNrZ3JvdW5kOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBd0FBQUFNQ0FZQUFBQldkVnpuQUFBQUFYTlNSMElBcnM0YzZRQUFBUXBKUkVGVUtCVmpZQ0FSTUNLck56VTF0Zi8zNzE4bFVNd1FpUDh5TWpLZVlXSmk2ajUxNnRSaEV4T1Roak5uempUQU5RQUZxdi8vLzk4Q1ZIUVBTTzhBMGl4QVRhNUF0anlRUGdERVRtZlBuZ1VMTXBpWm1ibi8vZnUzQlNnNEI2Z2dDeWp4RzhobThQVDBaSC85K3ZVSm9KZ1RpQThDVENBQ3FEZ1hhT0o5WGw3ZVRKaGlrRGhRY1NWUXNRR0lUVDhBOXJTeHNmRi9tSlZBcHpXQ1FnUEdkM0J3WVBueTVjc3RvTk91QVozckF3b0pPQUFxdmlBcUt0b09Fd0FheFByNTgrZHBRTDRpRUdlQXhKRnQyQWZrT3dBMVBRVFN1NEVtL2dHeVBZQzBFcEN1QWRyYUN0SUFEaVdnUUNQUU9tZG1abVlIb05nVm9DSmZJQjBDcEc4REk4NEJwaGdvUmpvQUFBemdkRUxJOTFFNUFBQUFBRWxGVGtTdVFtQ0MpO1xufVxuLyojIHNvdXJjZU1hcHBpbmdVUkw9c3JjL2Nzcy9tYWluLmNzcy5tYXAgKi9cblxuLyojIHNvdXJjZU1hcHBpbmdVUkw9dHVpLWNhbGVuZGFyLmNzcy5tYXAqLyIsIitwcmVmaXgtY2xhc3Nlcyhjc3MtcHJlZml4KVxuICAgIC5sYXlvdXRcbiAgICAgICAgaGVpZ2h0OiAxMDAlXG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZVxuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94XG5cbiAgICAgICAgKlxuICAgICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveFxuXG4gICAgLy8gUmVsYXRlZCB3aXRoIHVzZXIgaW50ZXJhY3Rpb25cbiAgICAuZHJhZ2dpbmdcbiAgICAgICAgY3Vyc29yOiBtb3ZlXG5cbiAgICAucmVzaXppbmdcbiAgICAgICAgY3Vyc29yOiByb3ctcmVzaXplXG5cbiAgICAucmVzaXppbmcteFxuICAgICAgICBjdXJzb3I6IGNvbC1yZXNpemVcblxuICAgIC5oaWRkZW5cbiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50XG5cbiAgICAuaW52aXNpYmxlIHNwYW5cbiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuXG5cbiAgICAuY2xlYXJcbiAgICAgICAgY2xlYXJmaXgoKVxuXG4gICAgLnNjcm9sbC15XG4gICAgICAgIG92ZXJmbG93LXk6IHNjcm9sbFxuXG4gICAgLmRvdFxuICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2tcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlXG4gICAgICAgIHRvcDogLTFweFxuICAgICAgICBjb250ZW50OiAnJ1xuICAgICAgICB3aWR0aDogN3B4XG4gICAgICAgIGhlaWdodDogN3B4XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJVxuXG4ue2Nzcy1wcmVmaXh9aG9saWRheVxuICAgIGNvbG9yOiByZWRcblxuLntjc3MtcHJlZml4fXRvZGF5XG4gICAgYmFja2dyb3VuZDogcmdiYSgyMTgsIDIyOSwgMjQ5LCAuMylcblxuLy8gRHJhZyBoYW5kbGVcbi5oYW5kbGUteFxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXJcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKC4vaW1hZ2UvaGFuZGxlLXgucG5nKVxuXG4uaGFuZGxlLXlcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgY2VudGVyXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdFxuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCguL2ltYWdlL2hhbmRsZS15LnBuZylcblxuLy8gRm9yIFJldGluYSBkaXNwbGF5XG5AbWVkaWEgb25seSBzY3JlZW4gYW5kICgtbW96LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDEuNSksIG9ubHkgc2NyZWVuIGFuZCAoLW8tbWluLWRldmljZS1waXhlbC1yYXRpbzogMy8yKSwgb25seSBzY3JlZW4gYW5kICgtd2Via2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDEuNSksIG9ubHkgc2NyZWVuIGFuZCAobWluLWRldmljZXBpeGVsLXJhdGlvOiAxLjUpLCBvbmx5IHNjcmVlbiBhbmQgKG1pbi1yZXNvbHV0aW9uOiAxLjVkcHB4KVxuICAgIC5oYW5kbGUteFxuICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoLi9pbWFnZS9oYW5kbGUteEAyeC5wbmcpXG4gICAgICAgIGJhY2tncm91bmQtc2l6ZTogOHB4IDRweFxuXG4gICAgLmhhbmRsZS15XG4gICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCguL2ltYWdlL2hhbmRsZS15QDJ4LnBuZylcbiAgICAgICAgYmFja2dyb3VuZC1zaXplOiA0cHggOHB4XG4iLCIudHVpLWZ1bGwtY2FsZW5kYXItbGF5b3V0IHtcbiAgaGVpZ2h0OiAxMDAlO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItbGF5b3V0ICoge1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWRyYWdnaW5nIHtcbiAgY3Vyc29yOiBtb3ZlO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXJlc2l6aW5nIHtcbiAgY3Vyc29yOiByb3ctcmVzaXplO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXJlc2l6aW5nLXgge1xuICBjdXJzb3I6IGNvbC1yZXNpemU7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItaGlkZGVuIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWludmlzaWJsZSBzcGFuIHtcbiAgdmlzaWJpbGl0eTogaGlkZGVuO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWNsZWFyOmFmdGVyIHtcbiAgY29udGVudDogJyc7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBjbGVhcjogYm90aDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1zY3JvbGwteSB7XG4gIG92ZXJmbG93LXk6IHNjcm9sbDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1kb3Qge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdG9wOiAtMXB4O1xuICBjb250ZW50OiAnJztcbiAgd2lkdGg6IDdweDtcbiAgaGVpZ2h0OiA3cHg7XG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1ob2xpZGF5IHtcbiAgY29sb3I6ICNmMDA7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItdG9kYXkge1xuICBiYWNrZ3JvdW5kOiByZ2JhKDIxOCwyMjksMjQ5LDAuMyk7XG59XG4uaGFuZGxlLXgge1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgY2VudGVyO1xuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCIuL2ltYWdlL2hhbmRsZS14LnBuZ1wiKTtcbn1cbi5oYW5kbGUteSB7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7XG4gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChcIi4vaW1hZ2UvaGFuZGxlLXkucG5nXCIpO1xufVxuQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAoLW1vei1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAxLjUpLCBvbmx5IHNjcmVlbiBhbmQgKC1vLW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDMvMiksIG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAxLjUpLCBvbmx5IHNjcmVlbiBhbmQgKG1pbi1kZXZpY2VwaXhlbC1yYXRpbzogMS41KSwgb25seSBzY3JlZW4gYW5kIChtaW4tcmVzb2x1dGlvbjogMS41ZHBweCkge1xuICAuaGFuZGxlLXgge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChcIi4vaW1hZ2UvaGFuZGxlLXhAMngucG5nXCIpO1xuICAgIGJhY2tncm91bmQtc2l6ZTogOHB4IDRweDtcbiAgfVxuICAuaGFuZGxlLXkge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChcIi4vaW1hZ2UvaGFuZGxlLXlAMngucG5nXCIpO1xuICAgIGJhY2tncm91bmQtc2l6ZTogNHB4IDhweDtcbiAgfVxufVxuLnR1aS1mdWxsLWNhbGVuZGFyLW1vbnRoLXdlZWstaXRlbSAudHVpLWZ1bGwtY2FsZW5kYXItd2Vla2RheS1ncmlkIHtcbiAgb3ZlcmZsb3cteTogaGlkZGVuO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLW1vbnRoLXdlZWstaXRlbSAudHVpLWZ1bGwtY2FsZW5kYXItd2Vla2RheS1zY2hlZHVsZXMge1xuICBvdmVyZmxvdy15OiB2aXNpYmxlO1xuICBoZWlnaHQ6IDA7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItbW9udGgtd2Vlay1pdGVtIC50dWktZnVsbC1jYWxlbmRhci13ZWVrZGF5LXNjaGVkdWxlIHtcbiAgbWFyZ2luOiAwIDEwcHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItbW9udGgtd2Vlay1pdGVtIC50dWktZnVsbC1jYWxlbmRhci10b2RheSB7XG4gIGJhY2tncm91bmQ6IG5vbmU7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItbW9udGgtd2Vlay1pdGVtIC50dWktZnVsbC1jYWxlbmRhci10b2RheSAudHVpLWZ1bGwtY2FsZW5kYXItd2Vla2RheS1ncmlkLWRhdGUtZGVjb3JhdG9yIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB3aWR0aDogMjdweDtcbiAgaGVpZ2h0OiAyN3B4O1xuICBsaW5lLWhlaWdodDogMjdweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBiYWNrZ3JvdW5kOiAjMTM1ZGU2O1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIGNvbG9yOiAjZmZmO1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgbWFyZ2luLWxlZnQ6IDJweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci13ZWVrZGF5LWdyaWQsXG4udHVpLWZ1bGwtY2FsZW5kYXItd2Vla2RheS1ncmlkLWxpbmUge1xuICBoZWlnaHQ6IDEwMCU7XG4gIG1pbi1oZWlnaHQ6IGluaGVyaXQ7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItd2Vla2RheS1ncmlkIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB3aWR0aDogMTAwJTtcbiAgb3ZlcmZsb3cteTogc2Nyb2xsO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXdlZWtkYXktYm9yZGVyIHtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItd2Vla2RheS1ncmlkLWxpbmUge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHBhZGRpbmc6IDNweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci13ZWVrZGF5LWdyaWQtbGluZSAudHVpLWZ1bGwtY2FsZW5kYXItd2Vla2RheS1ncmlkLWZvb3RlciB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgYm90dG9tOiA0cHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItd2Vla2RheS1ncmlkLWxpbmUgLnR1aS1mdWxsLWNhbGVuZGFyLXdlZWtkYXktZ3JpZC1kYXRlIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB3aWR0aDogMjdweDtcbiAgaGVpZ2h0OiAyN3B4O1xuICBsaW5lLWhlaWdodDogMjdweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXdlZWtkYXktZ3JpZC1saW5lIC50dWktZnVsbC1jYWxlbmRhci13ZWVrZGF5LWdyaWQtbW9yZS1zY2hlZHVsZXMge1xuICBmbG9hdDogcmlnaHQ7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgaGVpZ2h0OiAyN3B4O1xuICBsaW5lLWhlaWdodDogMjdweDtcbiAgcGFkZGluZzogMCA1cHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgZm9udC1zaXplOiAxMXB4O1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgY29sb3I6ICNhYWE7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItd2Vla2RheS1jcmVhdGlvbiB7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBvdmVyZmxvdy15OiBzY3JvbGw7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItd2Vla2RheS1zY2hlZHVsZXMge1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBvdmVyZmxvdy15OiBzY3JvbGw7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItd2Vla2RheS1zY2hlZHVsZS1ibG9jayB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci13ZWVrZGF5LXNjaGVkdWxlLWJsb2NrLWRyYWdnaW5nLWRpbSB7XG4gIG9wYWNpdHk6IDAuMztcbn1cbi50dWktZnVsbC1jYWxlbmRhci13ZWVrZGF5LXNjaGVkdWxlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBtYXJnaW46IDAgMTBweCAwIDFweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBib3JkZXItbGVmdC1zdHlsZTogc29saWQ7XG4gIGJvcmRlci1sZWZ0LXdpZHRoOiAzcHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItd2Vla2RheS1zY2hlZHVsZS50dWktZnVsbC1jYWxlbmRhci13ZWVrZGF5LXNjaGVkdWxlLXRpbWUge1xuICBib3JkZXItbGVmdC13aWR0aDogMDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci13ZWVrZGF5LXNjaGVkdWxlLnR1aS1mdWxsLWNhbGVuZGFyLXdlZWtkYXktc2NoZWR1bGUtdGltZSAudHVpLWZ1bGwtY2FsZW5kYXItd2Vla2RheS1zY2hlZHVsZS10aXRsZSB7XG4gIHBhZGRpbmctbGVmdDogOXB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXdlZWtkYXktc2NoZWR1bGUtYnVsbGV0IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBwYWRkaW5nOiAwO1xuICB3aWR0aDogNnB4O1xuICBoZWlnaHQ6IDZweDtcbiAgdG9wOiA2cHg7XG4gIGxlZnQ6IDA7XG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci13ZWVrZGF5LXNjaGVkdWxlLWJ1bGxldC1mb2N1c2VkIHtcbiAgbGVmdDogMTBweDtcbiAgYmFja2dyb3VuZDogI2ZmZjtcbn1cbi50dWktZnVsbC1jYWxlbmRhci13ZWVrZGF5LXNjaGVkdWxlLXRpdGxlIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICBwYWRkaW5nLWxlZnQ6IDNweDtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItd2Vla2RheS1zY2hlZHVsZS10aXRsZS1mb2N1c2VkIHtcbiAgcGFkZGluZy1sZWZ0OiAxNnB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXdlZWtkYXktc2NoZWR1bGUtY292ZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLDAsMCwwLjIpO1xuICBib3gtc2hhZG93OiAwIDJweCA2cHggMCByZ2JhKDAsMCwwLDAuMSk7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItd2Vla2RheS1leGNlZWQtbGVmdCAudHVpLWZ1bGwtY2FsZW5kYXItd2Vla2RheS1zY2hlZHVsZSB7XG4gIG1hcmdpbi1sZWZ0OiAwO1xuICBib3JkZXItbGVmdC13aWR0aDogMDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci13ZWVrZGF5LWV4Y2VlZC1yaWdodCAudHVpLWZ1bGwtY2FsZW5kYXItd2Vla2RheS1zY2hlZHVsZSB7XG4gIG1hcmdpbi1yaWdodDogMDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci13ZWVrZGF5LWV4Y2VlZC1yaWdodCAudHVpLWZ1bGwtY2FsZW5kYXItd2Vla2RheS1yZXNpemUtaGFuZGxlIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci13ZWVrZGF5LWV4Y2VlZC1pbi1tb250aCB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cbi50dWktZnVsbC1jYWxlbmRhci13ZWVrZGF5LWV4Y2VlZC1pbi1tb250aDpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmMGYxZjU7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItd2Vla2RheS1leGNlZWQtaW4td2Vlayxcbi50dWktZnVsbC1jYWxlbmRhci13ZWVrZGF5LWNvbGxhcHNlLWJ0biB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgYm90dG9tOiA1cHg7XG4gIG1hcmdpbi1yaWdodDogNXB4O1xuICBmb250LXNpemU6IDEycHg7XG4gIGxpbmUtaGVpZ2h0OiAxNHB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHBhZGRpbmc6IDFweCA1cHg7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG4gIGNvbG9yOiAjMDAwO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXdlZWtkYXktcmVzaXplLWhhbmRsZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICByaWdodDogMDtcbiAgd2lkdGg6IDZweDtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogM3B4IGNlbnRlcjtcbiAgY3Vyc29yOiBjb2wtcmVzaXplO1xuICBsaW5lLWhlaWdodDogMThweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci13ZWVrZGF5LWZpbGxlZCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNlOGU4ZTggIWltcG9ydGFudDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1sZWZ0IHtcbiAgaGVpZ2h0OiAxMDAlO1xuICBmbG9hdDogbGVmdDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgZGlzcGxheTogdGFibGU7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItbGVmdC1jb250ZW50IHtcbiAgZGlzcGxheTogdGFibGUtY2VsbDtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIGZvbnQtc2l6ZTogMTFweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1yaWdodCB7XG4gIGhlaWdodDogMTAwJTtcbiAgb3ZlcmZsb3cteTogc2Nyb2xsO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItd2Vlay1jb250YWluZXIge1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiBpbmhlcml0O1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGZvbnQtc2l6ZTogMTBweDtcbiAgbWluLWhlaWdodDogNjAwcHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItd2Vlay1jb250YWluZXIgLnR1aS1mdWxsLWNhbGVuZGFyLXRvZGF5IHtcbiAgYmFja2dyb3VuZDogbm9uZTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1kYXluYW1lIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBtYXJnaW4tbGVmdDogLTFweDtcbiAgaGVpZ2h0OiAxMDAlO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWRheW5hbWUudHVpLWZ1bGwtY2FsZW5kYXItdG9kYXkge1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1kYXluYW1lLWNvbnRhaW5lciB7XG4gIG92ZXJmbG93LXk6IHNjcm9sbDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1kYXluYW1lLWxlZnRtYXJnaW4ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGhlaWdodDogMTAwJTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1kYXluYW1lLWRhdGUge1xuICBmb250LXNpemU6IDI2cHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItZGF5bmFtZS1uYW1lIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGZvbnQtc2l6ZTogMTJweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1kYXlncmlkLWxheW91dCB7XG4gIGhlaWdodDogMTAwJTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1kYXlncmlkLWxheW91dCAudHVpLWZ1bGwtY2FsZW5kYXItcmlnaHQge1xuICBvdmVyZmxvdy15OiBoaWRkZW47XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItZGF5Z3JpZC1ndWlkZS1jcmVhdGlvbi1ibG9jayB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICBib3R0b206IDA7XG4gIHotaW5kZXg6IDE7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItdGltZWdyaWQtY29udGFpbmVyIHtcbiAgaGVpZ2h0OiAxMDAlO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIG92ZXJmbG93LXk6IHNjcm9sbDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci10aW1lZ3JpZC1jb250YWluZXItc3BsaXQge1xuICBoZWlnaHQ6IDEwMCU7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi50dWktZnVsbC1jYWxlbmRhci10aW1lZ3JpZC1sZWZ0IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXRpbWVncmlkLWhvdXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGNvbG9yOiAjNTU1O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXRpbWVncmlkLWhvdXI6Zmlyc3QtY2hpbGQgc3BhbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItdGltZWdyaWQtaG91cjpsYXN0LWNoaWxkIHtcbiAgYm9yZGVyLWJvdHRvbTogbm9uZTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci10aW1lZ3JpZC1ob3VyIHNwYW4ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogLTExcHg7XG4gIGxlZnQ6IDA7XG4gIHJpZ2h0OiA1cHg7XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xuICBsaW5lLWhlaWdodDogMjVweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci10aW1lZ3JpZC1yaWdodCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci10aW1lZ3JpZC1ncmlkbGluZSB7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZWVlO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXRpbWVncmlkLWdyaWRsaW5lOmxhc3QtY2hpbGQge1xuICBib3JkZXItYm90dG9tOiBub25lO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXRpbWVncmlkLXNjaGVkdWxlcyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItdGltZWdyaWQtaG91cm1hcmtlciB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgd2lkdGg6IDEwMCU7XG4gIGRpc3BsYXk6IHRhYmxlO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXRpbWVncmlkLWhvdXJtYXJrZXItbGluZS1sZWZ0IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBtaW4taGVpZ2h0OiAxcHg7XG4gIGxlZnQ6IDA7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItdGltZWdyaWQtaG91cm1hcmtlci1saW5lLXRvZGF5IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBtaW4taGVpZ2h0OiAxcHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItdGltZWdyaWQtaG91cm1hcmtlci1saW5lLXJpZ2h0IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBtaW4taGVpZ2h0OiAxcHg7XG4gIHJpZ2h0OiAwO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXRpbWVncmlkLWhvdXJtYXJrZXItdGltZSB7XG4gIHBhZGRpbmctcmlnaHQ6IDVweDtcbiAgbGluZS1oZWlnaHQ6IDEycHg7XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xuICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xuICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXRpbWVncmlkLXRvZGF5bWFya2VyIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0ZXh0LWluZGVudDogLTk5OTlweDtcbiAgd2lkdGg6IDlweDtcbiAgaGVpZ2h0OiA5cHg7XG4gIGJhY2tncm91bmQtY29sb3I6ICMxMzVkZTY7XG4gIG1hcmdpbjogLTRweCAwIDAgLTVweDtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXRpbWVncmlkLXN0aWNreS1jb250YWluZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci10aW1lZ3JpZC10aW1lem9uZS1sYWJlbC1jb250YWluZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItdGltZWdyaWQtdGltZXpvbmUtbGFiZWwtY2VsbCB7XG4gIGRpc3BsYXk6IHRhYmxlO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXRpbWVncmlkLXRpbWV6b25lLWxhYmVsIHtcbiAgZGlzcGxheTogdGFibGUtY2VsbDtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgcGFkZGluZy1yaWdodDogNXB4O1xuICB0ZXh0LWFsaWduOiByaWdodDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci10aW1lZ3JpZC10aW1lem9uZS1jbG9zZS1idG4ge1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXRpbWVncmlkLXRpbWV6b25lLWNsb3NlLWJ0biAudHVpLWZ1bGwtY2FsZW5kYXItaWNvbiB7XG4gIHdpZHRoOiA1cHg7XG4gIGhlaWdodDogMTBweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci10aW1lLWRhdGUge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGhlaWdodDogMTAwJTtcbiAgbWFyZ2luLWxlZnQ6IC0xcHg7XG4gIGJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXRpbWUtZGF0ZTpsYXN0LWNoaWxkIHtcbiAgYm9yZGVyLXJpZ2h0OiBub25lO1xuICBtYXJnaW46IDA7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItdGltZS1kYXRlOmxhc3QtY2hpbGQgLnR1aS1mdWxsLWNhbGVuZGFyLXRpbWUtc2NoZWR1bGUsXG4udHVpLWZ1bGwtY2FsZW5kYXItdGltZS1kYXRlOmxhc3QtY2hpbGQgLnR1aS1mdWxsLWNhbGVuZGFyLXRpbWUtZ3VpZGUtY3JlYXRpb24ge1xuICBsZWZ0OiAwcHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItdGltZS1kYXRlLXNjaGVkdWxlLWJsb2NrLXdyYXAge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGhlaWdodDogMTAwJTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci10aW1lLWRhdGUtc2NoZWR1bGUtYmxvY2sge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHJpZ2h0OiAwcHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItdGltZS1kYXRlLXNjaGVkdWxlLWJsb2NrLXBlbmRpbmcge1xuICBvcGFjaXR5OiAwLjc7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItdGltZS1kYXRlLXNjaGVkdWxlLWJsb2NrLWRyYWdnaW5nLWRpbSB7XG4gIG9wYWNpdHk6IDAuMztcbn1cbi50dWktZnVsbC1jYWxlbmRhci10aW1lLWRhdGUtc2NoZWR1bGUtYmxvY2stZm9jdXNlZCB7XG4gIGJveC1zaGFkb3c6IDAgMCA4cHggMCByZ2JhKDAsMCwwLDAuMik7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItdGltZS1kYXRlLXNjaGVkdWxlLWJsb2NrLWNvdmVyIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwwLDAsMC4yKTtcbiAgYm94LXNoYWRvdzogMCAycHggNnB4IDAgcmdiYSgwLDAsMCwwLjEpO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXRpbWUtc2NoZWR1bGUge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGxlZnQ6IDFweDtcbiAgaGVpZ2h0OiAxMDAlO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBmb250LXNpemU6IDEycHg7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXRpbWUtc2NoZWR1bGUtY29udGVudCB7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGJvcmRlci1sZWZ0LXdpZHRoOiAzcHg7XG4gIGJvcmRlci1sZWZ0LXN0eWxlOiBzb2xpZDtcbiAgcGFkZGluZzogMXB4IDAgMCAzcHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItdGltZS1zY2hlZHVsZS1jb250ZW50LXRyYXZlbC10aW1lIHtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgZm9udC1zaXplOiAxMXB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXRpbWUtcmVzaXplLWhhbmRsZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgcmlnaHQ6IDBweDtcbiAgYm90dG9tOiAwcHg7XG4gIGxlZnQ6IDBweDtcbiAgaGVpZ2h0OiA1cHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgY29sb3I6ICNmZmY7XG4gIGN1cnNvcjogcm93LXJlc2l6ZTtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIHRvcDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci10aW1lLWd1aWRlLWNyZWF0aW9uIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICByaWdodDogMTBweDtcbiAgbGVmdDogMXB4O1xuICBwYWRkaW5nOiAzcHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItdGltZS1ndWlkZS1tb3ZlIC50dWktZnVsbC1jYWxlbmRhci10aW1lLXNjaGVkdWxlLFxuLnR1aS1mdWxsLWNhbGVuZGFyLXRpbWUtZ3VpZGUtcmVzaXplIC50dWktZnVsbC1jYWxlbmRhci10aW1lLXNjaGVkdWxlLFxuLnR1aS1mdWxsLWNhbGVuZGFyLXRpbWUtZ3VpZGUtbW92ZSAudHVpLWZ1bGwtY2FsZW5kYXItdGltZS1yZXNpemUtaGFuZGxlLFxuLnR1aS1mdWxsLWNhbGVuZGFyLXRpbWUtZ3VpZGUtcmVzaXplIC50dWktZnVsbC1jYWxlbmRhci10aW1lLXJlc2l6ZS1oYW5kbGUge1xuICBvcGFjaXR5OiAwLjg7XG4gIHotaW5kZXg6IDk3O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXRpbWUtZ3VpZGUtY3JlYXRpb24tbGFiZWwge1xuICBjdXJzb3I6IGRlZmF1bHQ7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItdGltZS1ndWlkZS1ib3R0b20ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGJvdHRvbTogM3B4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLW1vbnRoIHtcbiAgaGVpZ2h0OiAxMDAlO1xuICBtaW4taGVpZ2h0OiA2MDBweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1tb250aC1kYXluYW1lIHtcbiAgd2lkdGg6IDEwMCU7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgZm9udC1zaXplOiAxM3B4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLW1vbnRoLWRheW5hbWUtaXRlbSB7XG4gIGhlaWdodDogMTAwJTtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItbW9udGgtd2Vlay1pdGVtIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLW1vbnRoLXdlZWstaXRlbT5kaXYge1xuICBoZWlnaHQ6IDEwMCU7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItbW9udGgtbW9yZSB7XG4gIGhlaWdodDogaW5oZXJpdDtcbiAgbWluLXdpZHRoOiAyODBweDtcbiAgbWluLWhlaWdodDogMTUwcHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItbW9udGgtbW9yZS10aXRsZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1tb250aC1tb3JlLXRpdGxlLWRheSB7XG4gIGZvbnQtc2l6ZTogMjNweDtcbiAgY29sb3I6ICMzMzM7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItbW9udGgtbW9yZS10aXRsZS1kYXktbGFiZWwge1xuICBmb250LXNpemU6IDEycHg7XG4gIGNvbG9yOiAjMzMzO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLW1vbnRoLW1vcmUtY2xvc2Uge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHJpZ2h0OiAwO1xuICBvdXRsaW5lOiAwO1xuICBiYWNrZ3JvdW5kOiBub25lO1xuICBib3JkZXI6IDA7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgbGluZS1oZWlnaHQ6IDI4cHg7XG4gIHBhZGRpbmc6IDAgN3B4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItbW9udGgtbW9yZS1saXN0IHtcbiAgb3ZlcmZsb3cteTogYXV0bztcbn1cbi50dWktZnVsbC1jYWxlbmRhci1tb250aC1tb3JlLXNjaGVkdWxlIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBkaXNwbGF5OiBibG9jaztcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIGZvbnQtc2l6ZTogMTJweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1tb250aC1ndWlkZS1ibG9jayB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1tb250aC13ZWVrZGF5LXNjaGVkdWxlIHtcbiAgbWFyZ2luLXRvcDogMnB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLW1vbnRoLWNyZWF0aW9uLWd1aWRlIHtcbiAgdG9wOiAwO1xuICBib3R0b206IC0xcHg7XG4gIGxlZnQ6IC0xcHg7XG4gIHJpZ2h0OiAwO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDIwO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLW1vbnRoLWd1aWRlLWZvY3VzZWQge1xuICBib3gtc2hhZG93OiAwIDAgOHB4IDAgcmdiYSgwLDAsMCwwLjIpO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLW1vbnRoLWd1aWRlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBwYWRkaW5nLWxlZnQ6IDNweDtcbiAgbGluZS1oZWlnaHQ6IDE4cHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLW1vbnRoLWd1aWRlLWNvdmVyIHtcbiAgd2lkdGg6IDEwMCU7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAtNTAlO1xuICBsZWZ0OiAtNTAlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsMCwwLDAuMik7XG4gIGJveC1zaGFkb3c6IDAgMnB4IDZweCAwIHJnYmEoMCwwLDAsMC4xKTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1tb250aC1leGNlZWQtbGVmdCAudHVpLWZ1bGwtY2FsZW5kYXItbW9udGgtZ3VpZGUge1xuICBtYXJnaW4tbGVmdDogMHB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLW1vbnRoLWV4Y2VlZC1yaWdodCAudHVpLWZ1bGwtY2FsZW5kYXItbW9udGgtZ3VpZGUge1xuICBtYXJnaW4tcmlnaHQ6IDBweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1tb250aC1leGNlZWQtcmlnaHQgLnR1aS1mdWxsLWNhbGVuZGFyLW1vbnRoLWd1aWRlLWhhbmRsZSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItbW9udGgtZ3VpZGUtaGFuZGxlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIHJpZ2h0OiAzcHg7XG4gIHdpZHRoOiA2cHg7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IDNweCBjZW50ZXI7XG4gIGN1cnNvcjogY29sLXJlc2l6ZTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci12bGF5b3V0LWNvbnRhaW5lciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1zcGxpdHRlciB7XG4gIGNsZWFyOiBsZWZ0O1xuICBjdXJzb3I6IHJvdy1yZXNpemU7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItc3BsaXR0ZXI6aG92ZXIge1xuICBib3JkZXItY29sb3I6ICM5OTk7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItc3BsaXR0ZXItZm9jdXNlZCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7XG4gIGJvcmRlcjogbm9uZTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1zcGxpdHRlci1ndWlkZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogM3B4O1xuICBib3JkZXI6IG5vbmU7XG4gIGJhY2tncm91bmQtY29sb3I6ICNlOGU4ZTg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItcG9wdXAge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGZvbnQtd2VpZ2h0OiAyLjU7XG4gIGJveC1zaGFkb3c6IDAgMnB4IDZweCAwIHJnYmEoMCwwLDAsMC4xKTtcbiAgY2xlYXI6IGJvdGg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItcG9wdXAtY29udGFpbmVyIHtcbiAgbWluLXdpZHRoOiA0NzRweDtcbiAgYm94LXNoYWRvdzogMCAycHggNnB4IDAgcmdiYSgwLDAsMCwwLjEpO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBib3JkZXI6IHNvbGlkIDFweCAjZDVkNWQ1O1xuICBwYWRkaW5nOiAxN3B4O1xuICBib3JkZXItcmFkaXVzOiAycHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItcG9wdXAtc2VjdGlvbiB7XG4gIGZvbnQtc2l6ZTogMDtcbiAgbWluLWhlaWdodDogNDBweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1zZWN0aW9uLWNhbGVuZGFyIHtcbiAgd2lkdGg6IDE3NnB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXNlY3Rpb24tY2FsZW5kYXIudHVpLWZ1bGwtY2FsZW5kYXItaGlkZSB7XG4gIGhlaWdodDogMjFweDtcbiAgdmlzaWJpbGl0eTogaGlkZGVuO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXNlY3Rpb24tdGl0bGUge1xuICB3aWR0aDogY2FsYygxMDAlIC0gMzZweCk7XG4gIHBhZGRpbmctcmlnaHQ6IDRweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1zZWN0aW9uLXRpdGxlIGlucHV0IHtcbiAgd2lkdGg6IDM2NXB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWJ1dHRvbi50dWktZnVsbC1jYWxlbmRhci1zZWN0aW9uLXByaXZhdGUge1xuICBoZWlnaHQ6IDMycHg7XG4gIHBhZGRpbmc6IDhweDtcbiAgZm9udC1zaXplOiAwO1xuICBtYXJnaW4tbGVmdDogNHB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXNlY3Rpb24tcHJpdmF0ZS50dWktZnVsbC1jYWxlbmRhci1wdWJsaWMgLnR1aS1mdWxsLWNhbGVuZGFyLWljLXByaXZhdGUge1xuICBiYWNrZ3JvdW5kOiB1cmwoXCJpbWFnZS9pYy11bmxvY2sucG5nXCIpIG5vLXJlcGVhdDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1zZWN0aW9uLXN0YXJ0LWRhdGUsXG4udHVpLWZ1bGwtY2FsZW5kYXItc2VjdGlvbi1lbmQtZGF0ZSB7XG4gIHdpZHRoOiAxNzZweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1zZWN0aW9uLXN0YXJ0LWRhdGUgaW5wdXQsXG4udHVpLWZ1bGwtY2FsZW5kYXItc2VjdGlvbi1lbmQtZGF0ZSBpbnB1dCB7XG4gIHdpZHRoOiAxMzlweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1zZWN0aW9uLXN0YXJ0LWRhdGU6aG92ZXIgLnR1aS1mdWxsLWNhbGVuZGFyLXBvcHVwLXNlY3Rpb24taXRlbSxcbi50dWktZnVsbC1jYWxlbmRhci1zZWN0aW9uLWVuZC1kYXRlOmhvdmVyIC50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1zZWN0aW9uLWl0ZW0sXG4udHVpLWZ1bGwtY2FsZW5kYXItc2VjdGlvbi1zdGFydC1kYXRlOmZvY3VzIC50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1zZWN0aW9uLWl0ZW0sXG4udHVpLWZ1bGwtY2FsZW5kYXItc2VjdGlvbi1lbmQtZGF0ZTpmb2N1cyAudHVpLWZ1bGwtY2FsZW5kYXItcG9wdXAtc2VjdGlvbi1pdGVtLFxuLnR1aS1mdWxsLWNhbGVuZGFyLXNlY3Rpb24tc3RhcnQtZGF0ZTpob3ZlciAudHVpLWRhdGVwaWNrZXIsXG4udHVpLWZ1bGwtY2FsZW5kYXItc2VjdGlvbi1lbmQtZGF0ZTpob3ZlciAudHVpLWRhdGVwaWNrZXIsXG4udHVpLWZ1bGwtY2FsZW5kYXItc2VjdGlvbi1zdGFydC1kYXRlOmZvY3VzIC50dWktZGF0ZXBpY2tlcixcbi50dWktZnVsbC1jYWxlbmRhci1zZWN0aW9uLWVuZC1kYXRlOmZvY3VzIC50dWktZGF0ZXBpY2tlciB7XG4gIGJvcmRlci1jb2xvcjogI2JiYjtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1zZWN0aW9uLWl0ZW06Zm9jdXMge1xuICBib3JkZXItY29sb3I6ICNiYmI7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItc2VjdGlvbi1kYXRlLWRhc2gge1xuICBmb250LXNpemU6IDEycHg7XG4gIGNvbG9yOiAjZDVkNWQ1O1xuICBoZWlnaHQ6IDMycHg7XG4gIHBhZGRpbmc6IDAgNHB4O1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXBvcHVwLXNlY3Rpb24taXRlbS50dWktZnVsbC1jYWxlbmRhci1zZWN0aW9uLWFsbGRheSB7XG4gIGJvcmRlcjogbm9uZTtcbiAgcGFkZGluZzogMCAwIDAgOHB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItcG9wdXAtc2VjdGlvbi1pdGVtLnR1aS1mdWxsLWNhbGVuZGFyLXNlY3Rpb24tbG9jYXRpb24ge1xuICBkaXNwbGF5OiBibG9jaztcbn1cbi50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1zZWN0aW9uLWl0ZW0udHVpLWZ1bGwtY2FsZW5kYXItc2VjdGlvbi1sb2NhdGlvbiBpbnB1dCB7XG4gIHdpZHRoOiA0MDBweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1zZWN0aW9uLWFsbGRheSAudHVpLWZ1bGwtY2FsZW5kYXItaWNvbi50dWktZnVsbC1jYWxlbmRhci1pYy1jaGVja2JveCB7XG4gIG1hcmdpbjogMDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1zZWN0aW9uLWl0ZW0udHVpLWZ1bGwtY2FsZW5kYXItc2VjdGlvbi1hbGxkYXkgLnR1aS1mdWxsLWNhbGVuZGFyLWNvbnRlbnQge1xuICBwYWRkaW5nLWxlZnQ6IDRweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1zZWN0aW9uLXN0YXRlIHtcbiAgd2lkdGg6IDEwOXB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXNlY3Rpb24tc3RhdGUgLnR1aS1mdWxsLWNhbGVuZGFyLWNvbnRlbnQge1xuICB3aWR0aDogNThweDtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItcG9wdXAtc2VjdGlvbi1pdGVtIHtcbiAgaGVpZ2h0OiAzMnB4O1xuICBwYWRkaW5nOiAwIDlweCAwIDEycHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkNWQ1ZDU7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgZm9udC1zaXplOiAwO1xuICBib3JkZXItcmFkaXVzOiAycHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItcG9wdXAtc2VjdGlvbi1pdGVtOmhvdmVyIHtcbiAgYm9yZGVyLWNvbG9yOiAjYmJiO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXBvcHVwLXNlY3Rpb24taXRlbTpmb2N1cyB7XG4gIGJvcmRlci1jb2xvcjogI2JiYjtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1zZWN0aW9uLWl0ZW0gLnR1aS1mdWxsLWNhbGVuZGFyLWljb24ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItcG9wdXAtc2VjdGlvbi1pdGVtIC50dWktZnVsbC1jYWxlbmRhci1jb250ZW50IHtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBmb250LXNpemU6IDEycHg7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgcGFkZGluZy1sZWZ0OiA4cHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItc2VjdGlvbi1jYWxlbmRhciAudHVpLWZ1bGwtY2FsZW5kYXItZHJvcGRvd24tYnV0dG9uIC50dWktZnVsbC1jYWxlbmRhci1jb250ZW50IHtcbiAgd2lkdGg6IDEyNXB4O1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgdG9wOiAtMXB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXBvcHVwLXNlY3Rpb24taXRlbSBpbnB1dCB7XG4gIGJvcmRlcjogbm9uZTtcbiAgaGVpZ2h0OiAzMHB4O1xuICBvdXRsaW5lOiBub25lO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItcG9wdXAtc2VjdGlvbi1pdGVtIGlucHV0OjpwbGFjZWhvbGRlciB7XG4gIGNvbG9yOiAjYmJiO1xuICBmb250LXdlaWdodDogMzAwO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWRyb3Bkb3duIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWRyb3Bkb3duOmhvdmVyIC50dWktZnVsbC1jYWxlbmRhci1kcm9wZG93bi1idXR0b24ge1xuICBib3JkZXI6IDFweCBzb2xpZCAjYmJiO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWRyb3Bkb3duLWJ1dHRvbi50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1zZWN0aW9uLWl0ZW0ge1xuICBoZWlnaHQ6IDMycHg7XG4gIGZvbnQtc2l6ZTogMDtcbiAgdG9wOiAtMXB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWRyb3Bkb3duLWFycm93IHtcbiAgYmFja2dyb3VuZDogdXJsKFwiaW1hZ2UvaWMtYXJyb3ctc29saWQtYm90dG9tLnBuZ1wiKSBuby1yZXBlYXQ7XG59XG4uZHJvcGRvd24ub3BlbiAudHVpLWZ1bGwtY2FsZW5kYXItZHJvcGRvd24tYXJyb3csXG4udHVpLWZ1bGwtY2FsZW5kYXItb3BlbiAudHVpLWZ1bGwtY2FsZW5kYXItZHJvcGRvd24tYXJyb3cge1xuICBiYWNrZ3JvdW5kOiB1cmwoXCJpbWFnZS9pYy1hcnJvdy1zb2xpZC10b3AucG5nXCIpIG5vLXJlcGVhdDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1kcm9wZG93bi1tZW51IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDMxcHg7XG4gIHBhZGRpbmc6IDRweCAwO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBib3JkZXI6IDFweCBzb2xpZCAjZDVkNWQ1O1xuICBib3JkZXItdG9wOiBub25lO1xuICBib3JkZXItcmFkaXVzOiAwIDAgMnB4IDJweDtcbiAgd2lkdGg6IDEwMCU7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItZHJvcGRvd246aG92ZXIgLnR1aS1mdWxsLWNhbGVuZGFyLWRyb3Bkb3duLW1lbnUge1xuICBib3JkZXI6IDFweCBzb2xpZCAjYmJiO1xuICBib3JkZXItdG9wOiBub25lO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLW9wZW4gLnR1aS1mdWxsLWNhbGVuZGFyLWRyb3Bkb3duLW1lbnUge1xuICBkaXNwbGF5OiBibG9jaztcbn1cbi50dWktZnVsbC1jYWxlbmRhci1kcm9wZG93bi1tZW51LWl0ZW0ge1xuICBoZWlnaHQ6IDMwcHg7XG4gIGJvcmRlcjogbm9uZTtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXNlY3Rpb24tY2FsZW5kYXIgLnR1aS1mdWxsLWNhbGVuZGFyLWRyb3Bkb3duLW1lbnUtaXRlbSB7XG4gIHdpZHRoOiAxMDAlO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXNlY3Rpb24tc3RhdGUgLnR1aS1mdWxsLWNhbGVuZGFyLWRyb3Bkb3duLW1lbnUtaXRlbSB7XG4gIHdpZHRoOiAxMDAlO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWRyb3Bkb3duLW1lbnUtaXRlbTpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoODEsOTIsMjMwLDAuMDUpO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWRyb3Bkb3duLW1lbnUtaXRlbSAudHVpLWZ1bGwtY2FsZW5kYXItY29udGVudCB7XG4gIGxpbmUtaGVpZ2h0OiAzMHB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWJ1dHRvbi50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1jbG9zZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAxMHB4O1xuICByaWdodDogMTBweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgcGFkZGluZzogMnB4O1xuICBib3JkZXI6IG5vbmU7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItc2VjdGlvbi1idXR0b24tc2F2ZSB7XG4gIGhlaWdodDogMzZweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1zYXZlIHtcbiAgZmxvYXQ6IHJpZ2h0O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXBvcHVwLWFycm93LWJvcmRlcixcbi50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1hcnJvdy1maWxsIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWFycm93LXRvcCAudHVpLWZ1bGwtY2FsZW5kYXItcG9wdXAtYXJyb3ctYm9yZGVyIHtcbiAgYm9yZGVyLXRvcDogbm9uZTtcbiAgYm9yZGVyLXJpZ2h0OiA4cHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1ib3R0b206IDhweCBzb2xpZCAjZDVkNWQ1O1xuICBib3JkZXItbGVmdDogOHB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBsZWZ0OiBjYWxjKDUwJSAtIDhweCk7XG4gIHRvcDogLTdweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1hcnJvdy1yaWdodCAudHVpLWZ1bGwtY2FsZW5kYXItcG9wdXAtYXJyb3ctYm9yZGVyIHtcbiAgYm9yZGVyLXRvcDogOHB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBib3JkZXItcmlnaHQ6IG5vbmU7XG4gIGJvcmRlci1ib3R0b206IDhweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLWxlZnQ6IDhweCBzb2xpZCAjZDVkNWQ1O1xuICB0b3A6IGNhbGMoNTAlIC0gOHB4KTtcbiAgcmlnaHQ6IC03cHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItYXJyb3ctYm90dG9tIC50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1hcnJvdy1ib3JkZXIge1xuICBib3JkZXItdG9wOiA4cHggc29saWQgI2Q1ZDVkNTtcbiAgYm9yZGVyLXJpZ2h0OiA4cHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1ib3R0b206IG5vbmU7XG4gIGJvcmRlci1sZWZ0OiA4cHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGxlZnQ6IGNhbGMoNTAlIC0gOHB4KTtcbiAgYm90dG9tOiAtN3B4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWFycm93LWxlZnQgLnR1aS1mdWxsLWNhbGVuZGFyLXBvcHVwLWFycm93LWJvcmRlciB7XG4gIGJvcmRlci10b3A6IDhweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLXJpZ2h0OiA4cHggc29saWQgI2Q1ZDVkNTtcbiAgYm9yZGVyLWJvdHRvbTogOHB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBib3JkZXItbGVmdDogbm9uZTtcbiAgdG9wOiBjYWxjKDUwJSAtIDhweCk7XG4gIGxlZnQ6IC03cHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItYXJyb3ctdG9wIC50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1hcnJvdy1maWxsIHtcbiAgYm9yZGVyLXRvcDogbm9uZTtcbiAgYm9yZGVyLXJpZ2h0OiA3cHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1ib3R0b206IDdweCBzb2xpZCAjZmZmO1xuICBib3JkZXItbGVmdDogN3B4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBsZWZ0OiAtN3B4O1xuICB0b3A6IDFweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1hcnJvdy1yaWdodCAudHVpLWZ1bGwtY2FsZW5kYXItcG9wdXAtYXJyb3ctZmlsbCB7XG4gIGJvcmRlci10b3A6IDdweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLXJpZ2h0OiBub25lO1xuICBib3JkZXItYm90dG9tOiA3cHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1sZWZ0OiA3cHggc29saWQgI2ZmZjtcbiAgdG9wOiAtN3B4O1xuICByaWdodDogMXB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWFycm93LWJvdHRvbSAudHVpLWZ1bGwtY2FsZW5kYXItcG9wdXAtYXJyb3ctZmlsbCB7XG4gIGJvcmRlci10b3A6IDdweCBzb2xpZCAjZmZmO1xuICBib3JkZXItcmlnaHQ6IDdweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLWJvdHRvbTogbm9uZTtcbiAgYm9yZGVyLWxlZnQ6IDdweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgbGVmdDogLTdweDtcbiAgYm90dG9tOiAxcHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItYXJyb3ctbGVmdCAudHVpLWZ1bGwtY2FsZW5kYXItcG9wdXAtYXJyb3ctZmlsbCB7XG4gIGJvcmRlci10b3A6IDdweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLXJpZ2h0OiA3cHggc29saWQgI2ZmZjtcbiAgYm9yZGVyLWJvdHRvbTogN3B4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBib3JkZXItbGVmdDogbm9uZTtcbiAgdG9wOiAtN3B4O1xuICBsZWZ0OiAxcHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItYnV0dG9uIHtcbiAgYmFja2dyb3VuZDogI2ZmZjtcbiAgYm9yZGVyOiAxcHggc29saWQgI2Q1ZDVkNTtcbiAgYm9yZGVyLXJhZGl1czogMnB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIG91dGxpbmU6IG5vbmU7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBjb2xvcjogIzMzMztcbn1cbi50dWktZnVsbC1jYWxlbmRhci1idXR0b246aG92ZXIge1xuICBib3JkZXItY29sb3I6ICNiYmI7XG4gIGNvbG9yOiAjMzMzO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWJ1dHRvbjphY3RpdmUge1xuICBiYWNrZ3JvdW5kOiAjZjlmOWY5O1xuICBjb2xvcjogIzMzMztcbn1cbi50dWktZnVsbC1jYWxlbmRhci1idXR0b24gLnJvdW5kIHtcbiAgYm9yZGVyLXJhZGl1czogMjVweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1jb25maXJtIHtcbiAgd2lkdGg6IDk2cHg7XG4gIGhlaWdodDogMzZweDtcbiAgYm9yZGVyLXJhZGl1czogNDBweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmNjYxODtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgY29sb3I6ICNmZmY7XG4gIGJvcmRlcjogbm9uZTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1jb25maXJtOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2U1NWIxNTtcbiAgY29sb3I6ICNmZmY7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItY29uZmlybTphY3RpdmUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDk1NjE0O1xuICBjb2xvcjogI2ZmZjtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1pY29uLnR1aS1mdWxsLWNhbGVuZGFyLXJpZ2h0IHtcbiAgZmxvYXQ6IHJpZ2h0O1xuICB0b3A6IDFweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1pY29uIC50dWktZnVsbC1jYWxlbmRhci1ub25lIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1pY29uLnR1aS1mdWxsLWNhbGVuZGFyLWNhbGVuZGFyLWRvdCB7XG4gIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgd2lkdGg6IDEycHg7XG4gIGhlaWdodDogMTJweDtcbiAgbWFyZ2luOiAxcHg7XG59XG5pbnB1dFt0eXBlPSdjaGVja2JveCddLnR1aS1mdWxsLWNhbGVuZGFyLWNoZWNrYm94LXNxdWFyZSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5pbnB1dFt0eXBlPSdjaGVja2JveCddLnR1aS1mdWxsLWNhbGVuZGFyLWNoZWNrYm94LXNxdWFyZSArIHNwYW4ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgbGluZS1oZWlnaHQ6IDE0cHg7XG4gIG1hcmdpbi1yaWdodDogOHB4O1xuICB3aWR0aDogMTRweDtcbiAgaGVpZ2h0OiAxNHB4O1xuICBiYWNrZ3JvdW5kOiB1cmwoXCJpbWFnZS9pYy1jaGVja2JveC1ub3JtYWwucG5nXCIpIG5vLXJlcGVhdDtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cbmlucHV0W3R5cGU9J2NoZWNrYm94J10udHVpLWZ1bGwtY2FsZW5kYXItY2hlY2tib3gtc3F1YXJlOmNoZWNrZWQgKyBzcGFuIHtcbiAgYmFja2dyb3VuZDogdXJsKFwiaW1hZ2UvaWMtY2hlY2tib3gtY2hlY2tlZC5wbmdcIikgbm8tcmVwZWF0O1xufVxuaW5wdXRbdHlwZT0nY2hlY2tib3gnXS50dWktZnVsbC1jYWxlbmRhci1jaGVja2JveC1yb3VuZCB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5pbnB1dFt0eXBlPSdjaGVja2JveCddLnR1aS1mdWxsLWNhbGVuZGFyLWNoZWNrYm94LXJvdW5kICsgc3BhbiB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgY3Vyc29yOiBwb2ludGVyO1xuICB3aWR0aDogMTRweDtcbiAgaGVpZ2h0OiAxNHB4O1xuICBsaW5lLWhlaWdodDogMTRweDtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgbWFyZ2luLXJpZ2h0OiA4cHg7XG4gIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgYm9yZGVyOiBzb2xpZCAycHg7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXBvcHVwLXRvcC1saW5lIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3JkZXItcmFkaXVzOiAycHggMnB4IDAgMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogNHB4O1xuICBib3JkZXI6IG5vbmU7XG4gIHRvcDogMDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1kZXRhaWwgLnR1aS1mdWxsLWNhbGVuZGFyLXBvcHVwLWNvbnRhaW5lciB7XG4gIHdpZHRoOiAzMDFweDtcbiAgbWluLXdpZHRoOiAzMDFweDtcbiAgcGFkZGluZy1ib3R0b206IDA7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItcG9wdXAtZGV0YWlsIC50dWktZnVsbC1jYWxlbmRhci1pY29uIHtcbiAgd2lkdGg6IDEycHg7XG4gIGhlaWdodDogMTJweDtcbiAgYmFja2dyb3VuZC1zaXplOiAxMnB4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG1hcmdpbi1yaWdodDogOHB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXBvcHVwLWRldGFpbCAudHVpLWZ1bGwtY2FsZW5kYXItaWNvbi50dWktZnVsbC1jYWxlbmRhci1pYy1sb2NhdGlvbi1iIHtcbiAgdG9wOiAtMnB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXBvcHVwLWRldGFpbCAudHVpLWZ1bGwtY2FsZW5kYXItaWNvbi50dWktZnVsbC1jYWxlbmRhci1pYy11c2VyLWIge1xuICB0b3A6IC0ycHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItcG9wdXAtZGV0YWlsIC50dWktZnVsbC1jYWxlbmRhci1pY29uLnR1aS1mdWxsLWNhbGVuZGFyLWljLXN0YXRlLWIge1xuICB0b3A6IC0xcHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItcG9wdXAtZGV0YWlsIC50dWktZnVsbC1jYWxlbmRhci1pY29uLnR1aS1mdWxsLWNhbGVuZGFyLWNhbGVuZGFyLWRvdCB7XG4gIHdpZHRoOiAxMHB4O1xuICBoZWlnaHQ6IDEwcHg7XG4gIG1hcmdpbi1yaWdodDogOHB4O1xuICB0b3A6IC0xcHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItcG9wdXAtZGV0YWlsIC50dWktZnVsbC1jYWxlbmRhci1jb250ZW50IHtcbiAgbGluZS1oZWlnaHQ6IDI0cHg7XG4gIGhlaWdodDogMjRweDtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBsaW5lLWhlaWdodDogMjtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1kZXRhaWwgLnR1aS1mdWxsLWNhbGVuZGFyLXNlY3Rpb24taGVhZGVyIHtcbiAgbWFyZ2luLWJvdHRvbTogNnB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXBvcHVwLWRldGFpbCAudHVpLWZ1bGwtY2FsZW5kYXItcG9wdXAtZGV0YWlsLWl0ZW0tc2VwYXJhdGUge1xuICBtYXJnaW4tdG9wOiA0cHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItcG9wdXAtZGV0YWlsIC50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1kZXRhaWwtaXRlbS1pbmRlbnQge1xuICB0ZXh0LWluZGVudDogLTIwcHg7XG4gIHBhZGRpbmctbGVmdDogMjBweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1kZXRhaWwgLnR1aS1mdWxsLWNhbGVuZGFyLXNjaGVkdWxlLXRpdGxlIHtcbiAgZm9udC1zaXplOiAxNXB4O1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgbGluZS1oZWlnaHQ6IDEuNjtcbiAgd29yZC1icmVhazogYnJlYWstYWxsO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXBvcHVwLWRldGFpbCAudHVpLWZ1bGwtY2FsZW5kYXItc2NoZWR1bGUtcHJpdmF0ZSB7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIHdpZHRoOiAxNnB4O1xuICBoZWlnaHQ6IDE2cHg7XG4gIGJhY2tncm91bmQ6IHVybChcImltYWdlL2ljLWxvY2sucG5nXCIpIG5vLXJlcGVhdCAxNnB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXBvcHVwLWRldGFpbCAudHVpLWZ1bGwtY2FsZW5kYXItc2NoZWR1bGUtcHJpdmF0ZSAudHVpLWZ1bGwtY2FsZW5kYXItaWMtcHJpdmF0ZSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXBvcHVwLWRldGFpbCAudHVpLWZ1bGwtY2FsZW5kYXItc2VjdGlvbi1kZXRhaWwge1xuICBtYXJnaW4tYm90dG9tOiAxNnB4O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXBvcHVwLWRldGFpbCAudHVpLWZ1bGwtY2FsZW5kYXItc2VjdGlvbi1idXR0b24ge1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2U1ZTVlNTtcbiAgZm9udC1zaXplOiAwO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXNlY3Rpb24tYnV0dG9uIC50dWktZnVsbC1jYWxlbmRhci1pY29uIHtcbiAgbWFyZ2luLXJpZ2h0OiA0cHg7XG4gIHRvcDogLTNweDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1zZWN0aW9uLWJ1dHRvbiAudHVpLWZ1bGwtY2FsZW5kYXItY29udGVudCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdG9wOiAycHg7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItcG9wdXAtZWRpdCxcbi50dWktZnVsbC1jYWxlbmRhci1wb3B1cC1kZWxldGUge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHBhZGRpbmc6IDdweCA5cHggMTFweCA5cHg7XG4gIHdpZHRoOiBjYWxjKDUwJSAtIDFweCk7XG4gIG91dGxpbmU6IG5vbmU7XG4gIGJhY2tncm91bmQ6IG5vbmU7XG4gIGJvcmRlcjogbm9uZTtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLXBvcHVwLXZlcnRpY2FsLWxpbmUge1xuICBiYWNrZ3JvdW5kOiAjZTVlNWU1O1xuICB3aWR0aDogMXB4O1xuICBoZWlnaHQ6IDE0cHg7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWFyZ2luLXRvcDogLTdweDtcbn1cbi50dWktZGF0ZXBpY2tlciB7XG4gIGxlZnQ6IC0xMnB4O1xuICB6LWluZGV4OiAxO1xuICBib3JkZXItY29sb3I6ICNkNWQ1ZDU7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItaWNvbiB7XG4gIHdpZHRoOiAxNHB4O1xuICBoZWlnaHQ6IDE0cHg7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1pY29uLnR1aS1mdWxsLWNhbGVuZGFyLWljLXRpdGxlIHtcbiAgYmFja2dyb3VuZDogdXJsKFwiaW1hZ2UvaWMtc3ViamVjdC5wbmdcIikgbm8tcmVwZWF0O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWljb24udHVpLWZ1bGwtY2FsZW5kYXItaWMtbG9jYXRpb24ge1xuICBiYWNrZ3JvdW5kOiB1cmwoXCJpbWFnZS9pYy1sb2NhdGlvbi5wbmdcIikgbm8tcmVwZWF0O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWljb24udHVpLWZ1bGwtY2FsZW5kYXItaWMtZGF0ZSB7XG4gIGJhY2tncm91bmQ6IHVybChcImltYWdlL2ljLWRhdGUucG5nXCIpIG5vLXJlcGVhdDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1pY29uLnR1aS1mdWxsLWNhbGVuZGFyLWljLXN0YXRlIHtcbiAgYmFja2dyb3VuZDogdXJsKFwiaW1hZ2UvaWMtc3RhdGUucG5nXCIpIG5vLXJlcGVhdDtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1pY29uLnR1aS1mdWxsLWNhbGVuZGFyLWljLXByaXZhdGUge1xuICBiYWNrZ3JvdW5kOiB1cmwoXCJpbWFnZS9pYy1sb2NrLnBuZ1wiKSBuby1yZXBlYXQ7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItaWNvbi50dWktZnVsbC1jYWxlbmRhci1pYy1jbG9zZSB7XG4gIGJhY2tncm91bmQ6IHVybChcImltYWdlL2ljLWNsb3NlLnBuZ1wiKSBuby1yZXBlYXQ7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItaWMtbG9jYXRpb24tYiB7XG4gIGJhY2tncm91bmQ6IHVybChcIi4vaW1hZ2UvaWMtbG9jYXRpb24tYi5wbmdcIik7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItaWMtc3RhdGUtYiB7XG4gIGJhY2tncm91bmQ6IHVybChcIi4vaW1hZ2UvaWMtc3RhdGUtYi5wbmdcIik7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItaWNvbi50dWktZnVsbC1jYWxlbmRhci1pYy11c2VyLWIge1xuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCIuL2ltYWdlL2ljLXVzZXItYi5wbmdcIik7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItaWNvbi50dWktZnVsbC1jYWxlbmRhci1pYy1lZGl0IHtcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiLi9pbWFnZS9pYy1lZGl0LnBuZ1wiKTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1pY29uLnR1aS1mdWxsLWNhbGVuZGFyLWljLWRlbGV0ZSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChcIi4vaW1hZ2UvaWMtZGVsZXRlLnBuZ1wiKTtcbn1cbi50dWktZnVsbC1jYWxlbmRhci1pY29uLnR1aS1mdWxsLWNhbGVuZGFyLWljLWFycm93LXNvbGlkLXRvcCB7XG4gIGJhY2tncm91bmQ6IHVybChcImltYWdlL2ljLWFycm93LXNvbGlkLXRvcC5wbmdcIikgbm8tcmVwZWF0O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWljb24udHVpLWZ1bGwtY2FsZW5kYXItaWMtbWlsZXN0b25lIHtcbiAgYmFja2dyb3VuZDogdXJsKFwiaW1hZ2UvaWMtbWlsZXN0b25lLnBuZ1wiKSBuby1yZXBlYXQ7XG59XG4udHVpLWZ1bGwtY2FsZW5kYXItaWNvbi50dWktZnVsbC1jYWxlbmRhci1pYy1hcnJvdy1sZWZ0IHtcbiAgYmFja2dyb3VuZDogdXJsKFwiaW1hZ2UvaWMtYXJyb3ctbGVmdC5wbmdcIikgbm8tcmVwZWF0O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWljb24udHVpLWZ1bGwtY2FsZW5kYXItaWMtYXJyb3ctcmlnaHQge1xuICBiYWNrZ3JvdW5kOiB1cmwoXCJpbWFnZS9pYy1hcnJvdy1yaWdodC5wbmdcIikgbm8tcmVwZWF0O1xufVxuLnR1aS1mdWxsLWNhbGVuZGFyLWljLXJlcGVhdC1iIHtcbiAgYmFja2dyb3VuZDogdXJsKFwiLi9pbWFnZS9pYy1yZXBlYXQtYi5wbmdcIik7XG59XG4vKiMgc291cmNlTWFwcGluZ1VSTD1zcmMvY3NzL21haW4uY3NzLm1hcCAqLyIsIi8vIFZhcmlhYmxlc1xuLy8gZGVmYXVsdCBwcmVmaXhcbmNzcy1wcmVmaXggPSAndHVpLWZ1bGwtY2FsZW5kYXItJ1xuLy8gRGF5bmFtZVxuZGF5bmFtZSA9IGNzcy1wcmVmaXggKyAnZGF5bmFtZS0nXG5cbndlZWtkYXkgPSBjc3MtcHJlZml4ICsgJ3dlZWtkYXktJ1xuLy8gRGF5R3JpZFxuZGF5Z3JpZCA9IGNzcy1wcmVmaXggKyAnZGF5Z3JpZC0nXG4vLyBUaW1lXG50aW1lZ3JpZCA9IGNzcy1wcmVmaXggKyAndGltZWdyaWQtJ1xudGltZSA9IGNzcy1wcmVmaXggKyAndGltZS0nXG4vLyBNb250aFxubW9udGggPSBjc3MtcHJlZml4ICsgJ21vbnRoLSdcblxuLy8gRnVuY3Rpb25zXG53aCh3LCBoKVxuICAgIHdpZHRoOiB3XG4gICAgaGVpZ2h0OiBoXG5cbnBvcyh0b3AsIGxlZnQpXG4gICAgdG9wOiB0b3BcbiAgICBsZWZ0OiBsZWZ0XG5cbmNsZWFyZml4KClcbiAgICAmOmFmdGVyXG4gICAgICAgIGNvbnRlbnQ6ICcnO1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgY2xlYXI6IGJvdGg7XG4gICAgXG4iLCIue2Nzcy1wcmVmaXh9bW9udGgtd2Vlay1pdGVtXG4gICAgLntjc3MtcHJlZml4fXdlZWtkYXktZ3JpZFxuICAgICAgICBvdmVyZmxvdy15OiBoaWRkZW5cblxuICAgIC57Y3NzLXByZWZpeH13ZWVrZGF5LXNjaGVkdWxlc1xuICAgICAgICBvdmVyZmxvdy15OiB2aXNpYmxlXG4gICAgICAgIGhlaWdodDogMFxuXG4gICAgLntjc3MtcHJlZml4fXdlZWtkYXktc2NoZWR1bGVcbiAgICAgICAgbWFyZ2luOiAwIDEwcHhcblxuICAgIC57Y3NzLXByZWZpeH10b2RheVxuICAgICAgICBiYWNrZ3JvdW5kOiBub25lXG5cbiAgICAgICAgLntjc3MtcHJlZml4fXdlZWtkYXktZ3JpZC1kYXRlLWRlY29yYXRvclxuICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrXG4gICAgICAgICAgICB3aCgyN3B4LCAyN3B4KVxuICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDI3cHhcbiAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlclxuICAgICAgICAgICAgYmFja2dyb3VuZDogIzEzNWRlNlxuICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlXG4gICAgICAgICAgICBjb2xvcjogI2ZmZlxuICAgICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGRcbiAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiAycHhcblxuK3ByZWZpeC1jbGFzc2VzKHdlZWtkYXkpXG4gICAgLmdyaWQsXG4gICAgLmdyaWQtbGluZVxuICAgICAgICBoZWlnaHQ6IDEwMCVcbiAgICAgICAgbWluLWhlaWdodDogaW5oZXJpdFxuXG4gICAgLmdyaWRcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlXG4gICAgICAgIHdpZHRoOiAxMDAlXG4gICAgICAgIG92ZXJmbG93LXk6IHNjcm9sbFxuXG4gICAgLmJvcmRlclxuICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZFxuXG4gICAgLmdyaWQtbGluZVxuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGVcbiAgICAgICAgcGFkZGluZzogM3B4XG5cbiAgICAgICAgLmdyaWQtZm9vdGVyXG4gICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGVcbiAgICAgICAgICAgIGJvdHRvbTogNHB4XG5cbiAgICAgICAgLmdyaWQtZGF0ZVxuICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrXG4gICAgICAgICAgICB3aCgyN3B4LCAyN3B4KVxuICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDI3cHhcbiAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlclxuXG4gICAgICAgIC5ncmlkLW1vcmUtc2NoZWR1bGVzXG4gICAgICAgICAgICBmbG9hdDogcmlnaHRcbiAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9ja1xuICAgICAgICAgICAgaGVpZ2h0OiAyN3B4XG4gICAgICAgICAgICBsaW5lLWhlaWdodDogMjdweFxuICAgICAgICAgICAgcGFkZGluZzogMCA1cHhcbiAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlclxuICAgICAgICAgICAgZm9udC1zaXplOiAxMXB4XG4gICAgICAgICAgICBmb250LXdlaWdodDogYm9sZFxuICAgICAgICAgICAgY29sb3I6ICNhYWFhYWFcblxuICAgIC5jcmVhdGlvblxuICAgICAgICBwb3MoMCwgMClcbiAgICAgICAgd2goMTAwJSwgMTAwJSlcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlXG4gICAgICAgIG92ZXJmbG93LXk6IHNjcm9sbFxuXG4gICAgLnNjaGVkdWxlc1xuICAgICAgICBwb3MoMCwgMClcbiAgICAgICAgd2goMTAwJSwgMTAwJSlcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlXG4gICAgICAgIGZvbnQtc2l6ZTogMTJweFxuICAgICAgICBvdmVyZmxvdy15OiBzY3JvbGxcblxuICAgIC5zY2hlZHVsZS1ibG9ja1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGVcblxuICAgIC5zY2hlZHVsZS1ibG9jay1kcmFnZ2luZy1kaW1cbiAgICAgICAgb3BhY2l0eTogMC4zXG5cbiAgICAuc2NoZWR1bGVcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlXG4gICAgICAgIG1hcmdpbjogMCAxMHB4IDAgMXB4XG4gICAgICAgIGN1cnNvcjogcG9pbnRlclxuICAgICAgICBib3JkZXItbGVmdC1zdHlsZTogc29saWRcbiAgICAgICAgYm9yZGVyLWxlZnQtd2lkdGg6IDNweFxuXG4gICAgICAgICYuc2NoZWR1bGUtdGltZVxuICAgICAgICAgICAgYm9yZGVyLWxlZnQtd2lkdGg6IDBcblxuICAgICAgICAgICAgLnNjaGVkdWxlLXRpdGxlXG4gICAgICAgICAgICAgICAgcGFkZGluZy1sZWZ0OiA5cHhcblxuICAgIC5zY2hlZHVsZS1idWxsZXRcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlXG4gICAgICAgIHBhZGRpbmc6IDBcbiAgICAgICAgd2goNnB4LCA2cHgpXG4gICAgICAgIHRvcDogNnB4XG4gICAgICAgIGxlZnQ6IDBcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlXG5cbiAgICAuc2NoZWR1bGUtYnVsbGV0LWZvY3VzZWRcbiAgICAgICAgbGVmdDogMTBweFxuICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmXG5cbiAgICAuc2NoZWR1bGUtdGl0bGVcbiAgICAgICAgZGlzcGxheTogYmxvY2tcbiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcFxuICAgICAgICBvdmVyZmxvdzogaGlkZGVuXG4gICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzXG4gICAgICAgIHBhZGRpbmctbGVmdDogM3B4O1xuICAgICAgICBmb250LXdlaWdodDogYm9sZDtcblxuICAgIC5zY2hlZHVsZS10aXRsZS1mb2N1c2VkXG4gICAgICAgIHBhZGRpbmctbGVmdDogMTZweFxuXG4gICAgLnNjaGVkdWxlLWNvdmVyXG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZVxuICAgICAgICB0b3A6IDBcbiAgICAgICAgd2lkdGg6IDEwMCVcbiAgICAgICAgaGVpZ2h0OiAxMDAlXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yKVxuICAgICAgICBib3gtc2hhZG93OiAwIDJweCA2cHggMCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cbiAgICAuZXhjZWVkLWxlZnQgLnNjaGVkdWxlXG4gICAgICAgIG1hcmdpbi1sZWZ0OiAwXG4gICAgICAgIGJvcmRlci1sZWZ0LXdpZHRoOiAwXG5cbiAgICAuZXhjZWVkLXJpZ2h0IC5zY2hlZHVsZVxuICAgICAgICBtYXJnaW4tcmlnaHQ6IDBcblxuICAgIC5leGNlZWQtcmlnaHQgLnJlc2l6ZS1oYW5kbGVcbiAgICAgICAgZGlzcGxheTogbm9uZVxuXG4gICAgLmV4Y2VlZC1pbi1tb250aFxuICAgICAgICBjdXJzb3I6IHBvaW50ZXJcbiAgICAgICAgJjpob3ZlclxuICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjFmNVxuXG4gICAgLmV4Y2VlZC1pbi13ZWVrLCAuY29sbGFwc2UtYnRuXG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZVxuICAgICAgICBib3R0b206IDVweFxuICAgICAgICBtYXJnaW4tcmlnaHQ6IDVweFxuICAgICAgICBmb250LXNpemU6IDEycHhcbiAgICAgICAgbGluZS1oZWlnaHQ6IDE0cHhcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyXG4gICAgICAgIHBhZGRpbmc6IDFweCA1cHhcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZlxuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZGRkZGRkXG4gICAgICAgIGNvbG9yOiAjMDAwMDAwXG5cbiAgICAucmVzaXplLWhhbmRsZVxuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGVcbiAgICAgICAgdG9wOiAwXG4gICAgICAgIHJpZ2h0OiAwXG4gICAgICAgIHdpZHRoOiA2cHhcbiAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogM3B4IGNlbnRlclxuICAgICAgICBjdXJzb3I6IGNvbC1yZXNpemVcbiAgICAgICAgbGluZS1oZWlnaHQ6IDE4cHhcblxuICAgIC5maWxsZWRcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2U4ZThlOCAhaW1wb3J0YW50XG5cbitwcmVmaXgtY2xhc3Nlcyhjc3MtcHJlZml4KVxuICAgIC5sZWZ0XG4gICAgICAgIGhlaWdodDogMTAwJVxuICAgICAgICBmbG9hdDogbGVmdFxuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94XG4gICAgICAgIGRpc3BsYXk6IHRhYmxlXG5cbiAgICAubGVmdC1jb250ZW50XG4gICAgICAgIGRpc3BsYXk6IHRhYmxlLWNlbGxcbiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZVxuICAgICAgICB0ZXh0LWFsaWduOiByaWdodFxuICAgICAgICBmb250LXNpemU6IDExcHhcblxuXG4gICAgLnJpZ2h0XG4gICAgICAgIGhlaWdodDogMTAwJVxuICAgICAgICBvdmVyZmxvdy15OiBzY3JvbGxcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlXG4iLCIue2Nzcy1wcmVmaXh9d2Vlay1jb250YWluZXJcbiAgICB3aWR0aDogMTAwJVxuICAgIGhlaWdodDogaW5oZXJpdFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9ja1xuICAgIGZvbnQtc2l6ZTogMTBweFxuICAgIG1pbi1oZWlnaHQ6IDYwMHB4XG5cbiAgICAue2Nzcy1wcmVmaXh9dG9kYXlcbiAgICAgICAgYmFja2dyb3VuZDogbm9uZVxuIiwiLntjc3MtcHJlZml4fWRheW5hbWVcbiAgICBwb3NpdGlvbjogYWJzb2x1dGVcbiAgICBtYXJnaW4tbGVmdDogLTFweFxuICAgIGhlaWdodDogMTAwJVxuICAgIG92ZXJmbG93OiBoaWRkZW5cblxuICAgICYue2Nzcy1wcmVmaXh9dG9kYXlcbiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGRcblxuK3ByZWZpeC1jbGFzc2VzKGRheW5hbWUpXG4gICAgLmNvbnRhaW5lclxuICAgICAgICBvdmVyZmxvdy15OiBzY3JvbGxcblxuICAgIC5sZWZ0bWFyZ2luXG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZVxuICAgICAgICBoZWlnaHQ6IDEwMCVcbiAgICBcbiAgICAuZGF0ZVxuICAgICAgICBmb250LXNpemU6IDI2cHhcbiAgICBcbiAgICAubmFtZVxuICAgICAgICBmb250LXdlaWdodDogYm9sZFxuICAgICAgICBmb250LXNpemU6IDEycHhcbiIsIi8vIERheUdyaWQgdmlld1xuK3ByZWZpeC1jbGFzc2VzKGRheWdyaWQpXG4gICAgLmxheW91dFxuICAgICAgICBoZWlnaHQ6IDEwMCU7XG5cbi57Y3NzLXByZWZpeH1kYXlncmlkLWxheW91dFxuICAgIC57Y3NzLXByZWZpeH1yaWdodFxuICAgICAgICBvdmVyZmxvdy15OiBoaWRkZW5cblxuLy8gR3VpZGUgZWxlbWVudFxuK3ByZWZpeC1jbGFzc2VzKGRheWdyaWQgKyBndWlkZS0pXG4gICAgLmNyZWF0aW9uLWJsb2NrXG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZVxuICAgICAgICB0b3A6IDBcbiAgICAgICAgYm90dG9tOiAwXG4gICAgICAgIHotaW5kZXg6IDFcbiIsIitwcmVmaXgtY2xhc3Nlcyh0aW1lZ3JpZClcbiAgICAuY29udGFpbmVyXG4gICAgICAgIGhlaWdodDogMTAwJVxuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmVcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlblxuICAgICAgICBvdmVyZmxvdy15OiBzY3JvbGxcblxuICAgIC5jb250YWluZXItc3BsaXRcbiAgICAgICAgaGVpZ2h0OiAxMDAlXG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZVxuICAgICAgICBvdmVyZmxvdzogaGlkZGVuXG5cbiAgICAubGVmdFxuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGVcblxuICAgIC5ob3VyXG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZVxuICAgICAgICBjb2xvcjogIzU1NVxuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94XG4gICAgICAgICY6Zmlyc3QtY2hpbGQgc3BhblxuICAgICAgICAgICAgZGlzcGxheTogbm9uZVxuICAgICAgICAmOmxhc3QtY2hpbGRcbiAgICAgICAgICAgIGJvcmRlci1ib3R0b206IG5vbmVcblxuICAgIC5ob3VyIHNwYW5cbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlXG4gICAgICAgIHRvcDogLTExcHhcbiAgICAgICAgbGVmdDogMFxuICAgICAgICByaWdodDogNXB4XG4gICAgICAgIHRleHQtYWxpZ246IHJpZ2h0XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAyNXB4XG5cbiAgICAucmlnaHRcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlXG5cbiAgICAuZ3JpZGxpbmVcbiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlZWVcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveFxuICAgICAgICAmOmxhc3QtY2hpbGRcbiAgICAgICAgICAgIGJvcmRlci1ib3R0b206IG5vbmVcblxuICAgIC5zY2hlZHVsZXNcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlXG4gICAgICAgIHdoKDEwMCUsIDEwMCUpXG4gICAgICAgIHBvcygwLCAwKVxuICAgICAgICBjdXJzb3I6IHBvaW50ZXJcblxuICAgIC8vIEhvdXJtYXJrZXJcbiAgICAuaG91cm1hcmtlclxuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGVcbiAgICAgICAgd2lkdGg6IDEwMCVcbiAgICAgICAgZGlzcGxheTogdGFibGVcblxuICAgIC5ob3VybWFya2VyLWxpbmUtbGVmdFxuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGVcbiAgICAgICAgbWluLWhlaWdodDogMXB4XG4gICAgICAgIGxlZnQ6IDBcblxuICAgIC5ob3VybWFya2VyLWxpbmUtdG9kYXlcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlXG4gICAgICAgIG1pbi1oZWlnaHQ6IDFweFxuXG4gICAgLmhvdXJtYXJrZXItbGluZS1yaWdodFxuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGVcbiAgICAgICAgbWluLWhlaWdodDogMXB4XG4gICAgICAgIHJpZ2h0OiAwXG5cbiAgICAuaG91cm1hcmtlci10aW1lXG4gICAgICAgIHBhZGRpbmctcmlnaHQ6IDVweFxuICAgICAgICBsaW5lLWhlaWdodDogMTJweFxuICAgICAgICB0ZXh0LWFsaWduOiByaWdodFxuICAgICAgICBkaXNwbGF5OiB0YWJsZS1jZWxsXG4gICAgICAgIHZlcnRpY2FsLWFsaWduOiBib3R0b21cblxuICAgIC8vIFRvZGF5bWFya2VyXG4gICAgLnRvZGF5bWFya2VyXG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZVxuICAgICAgICB0ZXh0LWluZGVudDogLTk5OTlweFxuICAgICAgICB3aCg5cHgsIDlweClcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzEzNWRlNlxuICAgICAgICBtYXJnaW46IC00cHggMCAwIC01cHhcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlXG5cbiAgICAuc3RpY2t5LWNvbnRhaW5lclxuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGVcbiAgICAgICAgdG9wOiAwXG4gICAgXG4gICAgLnRpbWV6b25lLWxhYmVsLWNvbnRhaW5lclxuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGVcbiAgICBcbiAgICAudGltZXpvbmUtbGFiZWwtY2VsbFxuICAgICAgICBkaXNwbGF5OiB0YWJsZVxuICAgIFxuICAgIC50aW1lem9uZS1sYWJlbFxuICAgICAgICBkaXNwbGF5OiB0YWJsZS1jZWxsXG4gICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGVcbiAgICAgICAgcGFkZGluZy1yaWdodDogNXB4XG4gICAgICAgIHRleHQtYWxpZ246IHJpZ2h0XG4gICAgXG4gICAgLnRpbWV6b25lLWNsb3NlLWJ0blxuICAgICAgICBjdXJzb3I6IHBvaW50ZXJcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlXG4gICAgICAgIHRleHQtYWxpZ246IGNlbnRlclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmXG5cbi57Y3NzLXByZWZpeH10aW1lZ3JpZC10aW1lem9uZS1jbG9zZS1idG5cbiAgICAue2Nzcy1wcmVmaXh9aWNvblxuICAgICAgICB3aWR0aDogNXB4XG4gICAgICAgIGhlaWdodDogMTBweFxuXG4rcHJlZml4LWNsYXNzZXModGltZSlcbiAgICAuZGF0ZVxuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGVcbiAgICAgICAgaGVpZ2h0OiAxMDAlXG4gICAgICAgIG1hcmdpbi1sZWZ0OiAtMXB4XG4gICAgICAgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94XG4gICAgICAgICY6bGFzdC1jaGlsZFxuICAgICAgICAgICAgYm9yZGVyLXJpZ2h0OiBub25lXG4gICAgICAgICAgICBtYXJnaW46IDBcbiAgICAgICAgICAgIC8vIGxhc3QgY3JlYXRpb24gZ3VpZGUgZWxlbWVudFxuICAgICAgICAgICAgLnNjaGVkdWxlLFxuICAgICAgICAgICAgLmd1aWRlLWNyZWF0aW9uXG4gICAgICAgICAgICAgICAgbGVmdDogMHB4XG5cbiAgICAuZGF0ZS1zY2hlZHVsZS1ibG9jay13cmFwXG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZVxuICAgICAgICBoZWlnaHQ6IDEwMCVcblxuICAgIC5kYXRlLXNjaGVkdWxlLWJsb2NrXG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZVxuICAgICAgICByaWdodDogMHB4XG5cbiAgICAuZGF0ZS1zY2hlZHVsZS1ibG9jay1wZW5kaW5nXG4gICAgICAgIG9wYWNpdHk6IDAuN1xuXG4gICAgLmRhdGUtc2NoZWR1bGUtYmxvY2stZHJhZ2dpbmctZGltXG4gICAgICAgIG9wYWNpdHk6IDAuM1xuXG4gICAgLmRhdGUtc2NoZWR1bGUtYmxvY2stZm9jdXNlZFxuICAgICAgICBib3gtc2hhZG93OiAwIDAgOHB4IDAgcmdiYSgwLCAwLCAwLCAwLjIpXG5cbiAgICAuZGF0ZS1zY2hlZHVsZS1ibG9jay1jb3ZlclxuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGVcbiAgICAgICAgdG9wOiAwXG4gICAgICAgIHdpZHRoOiAxMDAlXG4gICAgICAgIGhlaWdodDogMTAwJVxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMilcbiAgICAgICAgYm94LXNoYWRvdzogMCAycHggNnB4IDAgcmdiYSgwLCAwLCAwLCAwLjEpO1xuXG4gICAgLnNjaGVkdWxlXG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZVxuICAgICAgICBsZWZ0OiAxcHhcbiAgICAgICAgaGVpZ2h0OiAxMDAlXG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW5cbiAgICAgICAgZm9udC1zaXplOiAxMnB4XG4gICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkXG5cbiAgICAuc2NoZWR1bGUtY29udGVudFxuICAgICAgICBvdmVyZmxvdzogaGlkZGVuXG4gICAgICAgIGJvcmRlci1sZWZ0LXdpZHRoOiAzcHhcbiAgICAgICAgYm9yZGVyLWxlZnQtc3R5bGU6IHNvbGlkXG4gICAgICAgIHBhZGRpbmc6IDFweCAwIDAgM3B4XG5cbiAgICAuc2NoZWR1bGUtY29udGVudC10cmF2ZWwtdGltZVxuICAgICAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgICAgICBmb250LXNpemU6IDExcHg7XG5cbiAgICAucmVzaXplLWhhbmRsZVxuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGVcbiAgICAgICAgcmlnaHQ6IDBweFxuICAgICAgICBib3R0b206IDBweFxuICAgICAgICBsZWZ0OiAwcHhcbiAgICAgICAgaGVpZ2h0OiA1cHhcbiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyXG4gICAgICAgIGNvbG9yOiAjZmZmXG4gICAgICAgIGN1cnNvcjogcm93LXJlc2l6ZVxuICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgdG9wXG5cbiAgICAvLyBHdWlkZSBlbGVtZW50XG4gICAgLmd1aWRlLWNyZWF0aW9uXG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZVxuICAgICAgICByaWdodDogMTBweFxuICAgICAgICBsZWZ0OiAxcHhcbiAgICAgICAgcGFkZGluZzogM3B4XG5cbiAgICAuZ3VpZGUtbW92ZSxcbiAgICAuZ3VpZGUtcmVzaXplXG4gICAgICAgIC5zY2hlZHVsZSxcbiAgICAgICAgLnJlc2l6ZS1oYW5kbGVcbiAgICAgICAgICAgIG9wYWNpdHk6IDAuOFxuICAgICAgICAgICAgei1pbmRleDogOTdcblxuICAgIC5ndWlkZS1jcmVhdGlvbi1sYWJlbFxuICAgICAgICBjdXJzb3I6IGRlZmF1bHRcblxuICAgIC5ndWlkZS1ib3R0b21cbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlXG4gICAgICAgIGJvdHRvbTogM3B4XG4iLCIue2Nzcy1wcmVmaXh9bW9udGhcbiAgICBoZWlnaHQ6IDEwMCVcbiAgICBtaW4taGVpZ2h0OiA2MDBweFxuXG4rcHJlZml4LWNsYXNzZXMobW9udGgpXG4gICAgLmRheW5hbWVcbiAgICAgICAgd2lkdGg6IDEwMCVcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlXG4gICAgICAgIGZvbnQtc2l6ZTogMTNweFxuXG4gICAgLmRheW5hbWUtaXRlbVxuICAgICAgICBoZWlnaHQ6IDEwMCVcbiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGRcblxuICAgIC53ZWVrLWl0ZW1cbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlXG4gICAgICAgICY+ZGl2XG4gICAgICAgICAgICBoZWlnaHQ6IDEwMCVcblxuICAgIC5tb3JlXG4gICAgICAgIGhlaWdodDogaW5oZXJpdFxuICAgICAgICBtaW4td2lkdGg6IDI4MHB4XG4gICAgICAgIG1pbi1oZWlnaHQ6IDE1MHB4XG5cbiAgICAubW9yZS10aXRsZVxuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmVcbiAgICBcbiAgICAubW9yZS10aXRsZS1kYXlcbiAgICAgICAgZm9udC1zaXplOiAyM3B4XG4gICAgICAgIGNvbG9yICMzMzNcbiAgICBcbiAgICAubW9yZS10aXRsZS1kYXktbGFiZWxcbiAgICAgICAgZm9udC1zaXplOiAxMnB4XG4gICAgICAgIGNvbG9yOiAjMzMzXG5cbiAgICAubW9yZS1jbG9zZVxuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGVcbiAgICAgICAgcmlnaHQ6IDBcbiAgICAgICAgb3V0bGluZTogMFxuICAgICAgICBiYWNrZ3JvdW5kIG5vbmVcbiAgICAgICAgYm9yZGVyOiAwXG4gICAgICAgIGZvbnQtc2l6ZTogMTRweFxuICAgICAgICBsaW5lLWhlaWdodDogMjhweFxuICAgICAgICBwYWRkaW5nOiAwIDdweFxuICAgICAgICBjdXJzb3I6IHBvaW50ZXJcblxuICAgIC5tb3JlLWxpc3RcbiAgICAgICAgb3ZlcmZsb3cteTogYXV0b1xuXG4gICAgLm1vcmUtc2NoZWR1bGVcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyXG4gICAgICAgIGRpc3BsYXk6IGJsb2NrXG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW5cbiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcFxuICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpc1xuICAgICAgICBmb250LXNpemU6IDEycHhcblxuICAgIC5ndWlkZS1ibG9ja1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGVcblxuICAgIC53ZWVrZGF5LXNjaGVkdWxlXG4gICAgICAgIG1hcmdpbi10b3A6IDJweFxuXG4gICAgLmNyZWF0aW9uLWd1aWRlXG4gICAgICAgIHRvcDogMFxuICAgICAgICBib3R0b206IC0xcHhcbiAgICAgICAgbGVmdDogLTFweFxuICAgICAgICByaWdodDogMFxuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGVcbiAgICAgICAgei1pbmRleDogMjBcblxuICAgIC5ndWlkZS1mb2N1c2VkXG4gICAgICAgIGJveC1zaGFkb3c6IDAgMCA4cHggMCByZ2JhKDAsIDAsIDAsIDAuMilcblxuICAgIC5ndWlkZVxuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmVcbiAgICAgICAgcGFkZGluZy1sZWZ0OiAzcHhcbiAgICAgICAgbGluZS1oZWlnaHQ6IDE4cHhcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlblxuICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwXG4gICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzXG5cbiAgICAuZ3VpZGUtY292ZXJcbiAgICAgICAgd2lkdGg6IDEwMCVcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlXG4gICAgICAgIHRvcDogLTUwJVxuICAgICAgICBsZWZ0OiAtNTAlXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yKVxuICAgICAgICBib3gtc2hhZG93OiAwIDJweCA2cHggMCByZ2JhKDAsIDAsIDAsIDAuMSlcblxuICAgIC5leGNlZWQtbGVmdCAuZ3VpZGVcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDBweFxuXG4gICAgLmV4Y2VlZC1yaWdodCAuZ3VpZGVcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiAwcHhcblxuICAgIC5leGNlZWQtcmlnaHQgLmd1aWRlLWhhbmRsZVxuICAgICAgICBkaXNwbGF5OiBub25lXG5cbiAgICAuZ3VpZGUtaGFuZGxlXG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZVxuICAgICAgICB0b3A6IDBcbiAgICAgICAgcmlnaHQ6IDNweFxuICAgICAgICB3aWR0aDogNnB4XG4gICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IDNweCBjZW50ZXJcbiAgICAgICAgY3Vyc29yOiBjb2wtcmVzaXplXG4iLCIrcHJlZml4LWNsYXNzZXMoY3NzLXByZWZpeClcbiAgICAudmxheW91dC1jb250YWluZXJcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlXG5cbiAgICAuc3BsaXR0ZXJcbiAgICAgICAgY2xlYXI6IGxlZnRcbiAgICAgICAgY3Vyc29yOiByb3ctcmVzaXplXG5cbiAgICAgICAgJjpob3ZlclxuICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiAjOTk5XG5cbiAgICAuc3BsaXR0ZXItZm9jdXNlZFxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkXG4gICAgICAgIGJvcmRlcjogbm9uZVxuXG4gICAgLnNwbGl0dGVyLWd1aWRlXG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZVxuICAgICAgICB3aCgxMDAlLCAzcHgpXG4gICAgICAgIGJvcmRlcjogbm9uZVxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZThlOGU4XG4iLCIue2Nzcy1wcmVmaXh9cG9wdXBcbiAgICBwb3NpdGlvbjogYWJzb2x1dGVcbiAgICBmb250LXdlaWdodDogMi41XG4gICAgYm94LXNoYWRvdzogMCAycHggNnB4IDAgcmdiYSgwLCAwLCAwLCAwLjEpXG4gICAgY2xlYXI6IGJvdGhcblxuLntjc3MtcHJlZml4fXBvcHVwLWNvbnRhaW5lclxuICAgIG1pbi13aWR0aDogNDc0cHhcbiAgICBib3gtc2hhZG93OiAwIDJweCA2cHggMCByZ2JhKDAsIDAsIDAsIDAuMSlcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmXG4gICAgYm9yZGVyOiBzb2xpZCAxcHggI2Q1ZDVkNVxuICAgIHBhZGRpbmc6IDE3cHhcbiAgICBib3JkZXItcmFkaXVzOiAycHhcblxuLntjc3MtcHJlZml4fXBvcHVwLXNlY3Rpb25cbiAgICBmb250LXNpemU6IDBcbiAgICBtaW4taGVpZ2h0OiA0MHB4XG5cbi57Y3NzLXByZWZpeH1zZWN0aW9uLWNhbGVuZGFyXG4gICAgd2lkdGg6IDE3NnB4XG5cbi57Y3NzLXByZWZpeH1zZWN0aW9uLWNhbGVuZGFyLntjc3MtcHJlZml4fWhpZGVcbiAgICBoZWlnaHQ6IDIxcHhcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW5cblxuLntjc3MtcHJlZml4fXNlY3Rpb24tdGl0bGVcbiAgICB3aWR0aDogY2FsYygxMDAlIC0gMzZweClcbiAgICBwYWRkaW5nLXJpZ2h0OiA0cHhcblxuLntjc3MtcHJlZml4fXNlY3Rpb24tdGl0bGUgaW5wdXRcbiAgICB3aWR0aDogMzY1cHhcblxuLntjc3MtcHJlZml4fWJ1dHRvbi57Y3NzLXByZWZpeH1zZWN0aW9uLXByaXZhdGVcbiAgICBoZWlnaHQ6IDMycHhcbiAgICBwYWRkaW5nOiA4cHhcbiAgICBmb250LXNpemU6IDBcbiAgICBtYXJnaW4tbGVmdDogNHB4XG5cbi57Y3NzLXByZWZpeH1zZWN0aW9uLXByaXZhdGUue2Nzcy1wcmVmaXh9cHVibGljIC57Y3NzLXByZWZpeH1pYy1wcml2YXRlXG4gICAgYmFja2dyb3VuZDogdXJsKCdpbWFnZS9pYy11bmxvY2sucG5nJykgbm8tcmVwZWF0XG5cbi57Y3NzLXByZWZpeH1zZWN0aW9uLXN0YXJ0LWRhdGVcbi57Y3NzLXByZWZpeH1zZWN0aW9uLWVuZC1kYXRlXG4gICAgd2lkdGg6IDE3NnB4XG5cbiAgICBpbnB1dFxuICAgICAgICB3aWR0aDogMTM5cHhcblxuICAgICY6aG92ZXJcbiAgICAmOmZvY3VzXG4gICAgICAgIC57Y3NzLXByZWZpeH1wb3B1cC1zZWN0aW9uLWl0ZW1cbiAgICAgICAgLnR1aS1kYXRlcGlja2VyXG4gICAgICAgICAgICBib3JkZXItY29sb3I6ICNiYmJiYmJcblxuXG4ue2Nzcy1wcmVmaXh9cG9wdXAtc2VjdGlvbi1pdGVtOmZvY3VzXG4gICAgYm9yZGVyLWNvbG9yOiAjYmJiYmJiXG5cbi57Y3NzLXByZWZpeH1zZWN0aW9uLWRhdGUtZGFzaFxuICAgIGZvbnQtc2l6ZTogMTJweFxuICAgIGNvbG9yOiAjZDVkNWQ1XG4gICAgaGVpZ2h0OiAzMnB4XG4gICAgcGFkZGluZzogMCA0cHhcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlXG5cbi57Y3NzLXByZWZpeH1wb3B1cC1zZWN0aW9uLWl0ZW1cbiAgICAmLntjc3MtcHJlZml4fXNlY3Rpb24tYWxsZGF5XG4gICAgICAgIGJvcmRlcjogbm9uZVxuICAgICAgICBwYWRkaW5nOiAwIDAgMCA4cHhcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyXG4gICAgJi57Y3NzLXByZWZpeH1zZWN0aW9uLWxvY2F0aW9uXG4gICAgICAgIGRpc3BsYXk6IGJsb2NrXG5cbiAgICAgICAgaW5wdXRcbiAgICAgICAgICAgIHdpZHRoOiA0MDBweFxuXG4ue2Nzcy1wcmVmaXh9c2VjdGlvbi1hbGxkYXkgLntjc3MtcHJlZml4fWljb24ue2Nzcy1wcmVmaXh9aWMtY2hlY2tib3hcbiAgICBtYXJnaW46IDBcblxuLntjc3MtcHJlZml4fXBvcHVwLXNlY3Rpb24taXRlbS57Y3NzLXByZWZpeH1zZWN0aW9uLWFsbGRheSAue2Nzcy1wcmVmaXh9Y29udGVudFxuICAgIHBhZGRpbmctbGVmdDogNHB4XG5cbi57Y3NzLXByZWZpeH1zZWN0aW9uLXN0YXRlXG4gICAgd2lkdGg6IDEwOXB4XG5cbi57Y3NzLXByZWZpeH1zZWN0aW9uLXN0YXRlIC57Y3NzLXByZWZpeH1jb250ZW50XG4gICAgd2lkdGg6IDU4cHhcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpc1xuICAgIG92ZXJmbG93OiBoaWRkZW5cblxuLntjc3MtcHJlZml4fXBvcHVwLXNlY3Rpb24taXRlbVxuICAgIGhlaWdodDogMzJweFxuICAgIHBhZGRpbmc6IDAgOXB4IDAgMTJweFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkNWQ1ZDVcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2tcbiAgICBmb250LXNpemU6IDBcbiAgICBib3JkZXItcmFkaXVzOiAycHhcblxuLntjc3MtcHJlZml4fXBvcHVwLXNlY3Rpb24taXRlbTpob3ZlclxuICAgIGJvcmRlci1jb2xvcjogI2JiYmJiYlxuXG4ue2Nzcy1wcmVmaXh9cG9wdXAtc2VjdGlvbi1pdGVtOmZvY3VzXG4gICAgYm9yZGVyLWNvbG9yOiAjYmJiYmJiXG5cbi57Y3NzLXByZWZpeH1wb3B1cC1zZWN0aW9uLWl0ZW0gLntjc3MtcHJlZml4fWljb25cbiAgICBwb3NpdGlvbjogcmVsYXRpdmVcblxuLntjc3MtcHJlZml4fXBvcHVwLXNlY3Rpb24taXRlbSAue2Nzcy1wcmVmaXh9Y29udGVudFxuICAgIHRleHQtYWxpZ246IGxlZnRcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2tcbiAgICBmb250LXNpemU6IDEycHhcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlXG4gICAgcG9zaXRpb246IHJlbGF0aXZlXG4gICAgcGFkZGluZy1sZWZ0OiA4cHhcblxuLntjc3MtcHJlZml4fXNlY3Rpb24tY2FsZW5kYXIgLntjc3MtcHJlZml4fWRyb3Bkb3duLWJ1dHRvbiAue2Nzcy1wcmVmaXh9Y29udGVudFxuICAgIHdpZHRoOiAxMjVweFxuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzXG4gICAgb3ZlcmZsb3c6IGhpZGRlblxuICAgIHRvcDogLTFweFxuXG4ue2Nzcy1wcmVmaXh9cG9wdXAtc2VjdGlvbi1pdGVtIGlucHV0XG4gICAgYm9yZGVyOiBub25lXG4gICAgaGVpZ2h0OiAzMHB4XG4gICAgb3V0bGluZTogbm9uZVxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9ja1xuXG4ue2Nzcy1wcmVmaXh9cG9wdXAtc2VjdGlvbi1pdGVtIGlucHV0OjpwbGFjZWhvbGRlclxuICAgIGNvbG9yOiAjYmJiYmJiXG4gICAgZm9udC13ZWlnaHQ6IDMwMFxuXG4ue2Nzcy1wcmVmaXh9ZHJvcGRvd25cbiAgICBwb3NpdGlvbjogcmVsYXRpdmVcblxuLntjc3MtcHJlZml4fWRyb3Bkb3duOmhvdmVyIC57Y3NzLXByZWZpeH1kcm9wZG93bi1idXR0b25cbiAgICBib3JkZXI6IDFweCBzb2xpZCAjYmJiYmJiXG5cbi57Y3NzLXByZWZpeH1kcm9wZG93bi1idXR0b24ue2Nzcy1wcmVmaXh9cG9wdXAtc2VjdGlvbi1pdGVtXG4gICAgaGVpZ2h0OiAzMnB4XG4gICAgZm9udC1zaXplOiAwXG4gICAgdG9wOiAtMXB4XG5cbi57Y3NzLXByZWZpeH1kcm9wZG93bi1hcnJvd1xuICAgIGJhY2tncm91bmQ6IHVybCgnaW1hZ2UvaWMtYXJyb3ctc29saWQtYm90dG9tLnBuZycpIG5vLXJlcGVhdFxuXG5cbi5kcm9wZG93bi5vcGVuXG4ue2Nzcy1wcmVmaXh9b3BlblxuICAgIC57Y3NzLXByZWZpeH1kcm9wZG93bi1hcnJvd1xuICAgICAgICBiYWNrZ3JvdW5kOiB1cmwoJ2ltYWdlL2ljLWFycm93LXNvbGlkLXRvcC5wbmcnKSBuby1yZXBlYXRcblxuLntjc3MtcHJlZml4fWRyb3Bkb3duLW1lbnVcbiAgICBwb3NpdGlvbjogYWJzb2x1dGVcbiAgICB0b3A6IDMxcHhcbiAgICBwYWRkaW5nOiA0cHggMFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmZcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZDVkNWQ1XG4gICAgYm9yZGVyLXRvcDogbm9uZVxuICAgIGJvcmRlci1yYWRpdXM6IDAgMCAycHggMnB4XG4gICAgd2lkdGg6IDEwMCVcbiAgICBkaXNwbGF5OiBub25lXG5cbi57Y3NzLXByZWZpeH1kcm9wZG93bjpob3ZlciAue2Nzcy1wcmVmaXh9ZHJvcGRvd24tbWVudVxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNiYmJiYmJcbiAgICBib3JkZXItdG9wOiBub25lXG5cbi57Y3NzLXByZWZpeH1vcGVuIC57Y3NzLXByZWZpeH1kcm9wZG93bi1tZW51XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrXG5cbi57Y3NzLXByZWZpeH1kcm9wZG93bi1tZW51LWl0ZW1cbiAgICBoZWlnaHQ6IDMwcHhcbiAgICBib3JkZXI6IG5vbmVcbiAgICBjdXJzb3I6IHBvaW50ZXJcblxuLntjc3MtcHJlZml4fXNlY3Rpb24tY2FsZW5kYXIgLntjc3MtcHJlZml4fWRyb3Bkb3duLW1lbnUtaXRlbVxuICAgIHdpZHRoOiAxMDAlO1xuXG4ue2Nzcy1wcmVmaXh9c2VjdGlvbi1zdGF0ZSAue2Nzcy1wcmVmaXh9ZHJvcGRvd24tbWVudS1pdGVtXG4gICAgd2lkdGg6IDEwMCU7XG5cbi57Y3NzLXByZWZpeH1kcm9wZG93bi1tZW51LWl0ZW06aG92ZXJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDgxLCA5MiwgMjMwLCAwLjA1KVxuXG4ue2Nzcy1wcmVmaXh9ZHJvcGRvd24tbWVudS1pdGVtIC57Y3NzLXByZWZpeH1jb250ZW50XG4gICAgbGluZS1oZWlnaHQ6IDMwcHhcblxuLntjc3MtcHJlZml4fWJ1dHRvbi57Y3NzLXByZWZpeH1wb3B1cC1jbG9zZVxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZVxuICAgIHRvcDogMTBweFxuICAgIHJpZ2h0OiAxMHB4XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZlxuICAgIHBhZGRpbmc6IDJweFxuICAgIGJvcmRlcjogbm9uZVxuXG4ue2Nzcy1wcmVmaXh9c2VjdGlvbi1idXR0b24tc2F2ZVxuICAgIGhlaWdodDogMzZweFxuXG4ue2Nzcy1wcmVmaXh9cG9wdXAtc2F2ZVxuICAgIGZsb2F0OiByaWdodFxuXG4ue2Nzcy1wcmVmaXh9cG9wdXAtYXJyb3ctYm9yZGVyLCAue2Nzcy1wcmVmaXh9cG9wdXAtYXJyb3ctZmlsbFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZVxuXG4ue2Nzcy1wcmVmaXh9YXJyb3ctdG9wIC57Y3NzLXByZWZpeH1wb3B1cC1hcnJvdy1ib3JkZXJcbiAgICBib3JkZXItdG9wOiBub25lXG4gICAgYm9yZGVyLXJpZ2h0OiA4cHggc29saWQgdHJhbnNwYXJlbnRcbiAgICBib3JkZXItYm90dG9tOiA4cHggc29saWQgI2Q1ZDVkNVxuICAgIGJvcmRlci1sZWZ0OiA4cHggc29saWQgdHJhbnNwYXJlbnRcbiAgICBsZWZ0OiBjYWxjKDUwJSAtIDhweClcbiAgICB0b3A6IC03cHhcblxuLntjc3MtcHJlZml4fWFycm93LXJpZ2h0IC57Y3NzLXByZWZpeH1wb3B1cC1hcnJvdy1ib3JkZXJcbiAgICBib3JkZXItdG9wOiA4cHggc29saWQgdHJhbnNwYXJlbnRcbiAgICBib3JkZXItcmlnaHQ6IG5vbmVcbiAgICBib3JkZXItYm90dG9tOiA4cHggc29saWQgdHJhbnNwYXJlbnRcbiAgICBib3JkZXItbGVmdDogOHB4IHNvbGlkICNkNWQ1ZDVcbiAgICB0b3A6IGNhbGMoNTAlIC0gOHB4KVxuICAgIHJpZ2h0OiAtN3B4XG5cbi57Y3NzLXByZWZpeH1hcnJvdy1ib3R0b20gLntjc3MtcHJlZml4fXBvcHVwLWFycm93LWJvcmRlclxuICAgIGJvcmRlci10b3A6IDhweCBzb2xpZCAjZDVkNWQ1XG4gICAgYm9yZGVyLXJpZ2h0OiA4cHggc29saWQgdHJhbnNwYXJlbnRcbiAgICBib3JkZXItYm90dG9tOiBub25lXG4gICAgYm9yZGVyLWxlZnQ6IDhweCBzb2xpZCB0cmFuc3BhcmVudFxuICAgIGxlZnQ6IGNhbGMoNTAlIC0gOHB4KVxuICAgIGJvdHRvbTogLTdweFxuXG4ue2Nzcy1wcmVmaXh9YXJyb3ctbGVmdCAue2Nzcy1wcmVmaXh9cG9wdXAtYXJyb3ctYm9yZGVyXG4gICAgYm9yZGVyLXRvcDogOHB4IHNvbGlkIHRyYW5zcGFyZW50XG4gICAgYm9yZGVyLXJpZ2h0OiA4cHggc29saWQgI2Q1ZDVkNVxuICAgIGJvcmRlci1ib3R0b206IDhweCBzb2xpZCB0cmFuc3BhcmVudFxuICAgIGJvcmRlci1sZWZ0OiBub25lXG4gICAgdG9wOiBjYWxjKDUwJSAtIDhweClcbiAgICBsZWZ0OiAtN3B4XG5cbi57Y3NzLXByZWZpeH1hcnJvdy10b3AgLntjc3MtcHJlZml4fXBvcHVwLWFycm93LWZpbGxcbiAgICBib3JkZXItdG9wOiBub25lXG4gICAgYm9yZGVyLXJpZ2h0OiA3cHggc29saWQgdHJhbnNwYXJlbnRcbiAgICBib3JkZXItYm90dG9tOiA3cHggc29saWQgI2ZmZmZmZlxuICAgIGJvcmRlci1sZWZ0OiA3cHggc29saWQgdHJhbnNwYXJlbnRcbiAgICBsZWZ0OiAtN3B4XG4gICAgdG9wOiAxcHhcblxuLntjc3MtcHJlZml4fWFycm93LXJpZ2h0IC57Y3NzLXByZWZpeH1wb3B1cC1hcnJvdy1maWxsXG4gICAgYm9yZGVyLXRvcDogN3B4IHNvbGlkIHRyYW5zcGFyZW50XG4gICAgYm9yZGVyLXJpZ2h0OiBub25lXG4gICAgYm9yZGVyLWJvdHRvbTogN3B4IHNvbGlkIHRyYW5zcGFyZW50XG4gICAgYm9yZGVyLWxlZnQ6IDdweCBzb2xpZCAjZmZmZmZmXG4gICAgdG9wOiAtN3B4XG4gICAgcmlnaHQ6IDFweFxuXG4ue2Nzcy1wcmVmaXh9YXJyb3ctYm90dG9tIC57Y3NzLXByZWZpeH1wb3B1cC1hcnJvdy1maWxsXG4gICAgYm9yZGVyLXRvcDogN3B4IHNvbGlkICNmZmZmZmZcbiAgICBib3JkZXItcmlnaHQ6IDdweCBzb2xpZCB0cmFuc3BhcmVudFxuICAgIGJvcmRlci1ib3R0b206IG5vbmVcbiAgICBib3JkZXItbGVmdDogN3B4IHNvbGlkIHRyYW5zcGFyZW50XG4gICAgbGVmdDogLTdweFxuICAgIGJvdHRvbTogMXB4XG5cbi57Y3NzLXByZWZpeH1hcnJvdy1sZWZ0IC57Y3NzLXByZWZpeH1wb3B1cC1hcnJvdy1maWxsXG4gICAgYm9yZGVyLXRvcDogN3B4IHNvbGlkIHRyYW5zcGFyZW50XG4gICAgYm9yZGVyLXJpZ2h0OiA3cHggc29saWQgI2ZmZmZmZlxuICAgIGJvcmRlci1ib3R0b206IDdweCBzb2xpZCB0cmFuc3BhcmVudFxuICAgIGJvcmRlci1sZWZ0OiBub25lXG4gICAgdG9wOiAtN3B4XG4gICAgbGVmdDogMXB4XG5cbi57Y3NzLXByZWZpeH1idXR0b25cbiAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2Q1ZDVkNVxuICAgIGJvcmRlci1yYWRpdXM6IDJweFxuICAgIHRleHQtYWxpZ246IGNlbnRlclxuICAgIG91dGxpbmU6IG5vbmVcbiAgICBmb250LXNpemU6IDEycHhcbiAgICBjdXJzb3I6IHBvaW50ZXJcbiAgICBjb2xvcjogIzMzM1xuXG4gICAgJjpob3ZlclxuICAgICAgICBib3JkZXItY29sb3I6ICNiYmJiYmJcbiAgICAgICAgY29sb3I6ICMzMzMzMzNcblxuXG4ue2Nzcy1wcmVmaXh9YnV0dG9uOmFjdGl2ZVxuICAgIGJhY2tncm91bmQ6ICNmOWY5ZjlcbiAgICBjb2xvcjogIzMzMzMzM1xuXG5cbi57Y3NzLXByZWZpeH1idXR0b24gLnJvdW5kXG4gIGJvcmRlci1yYWRpdXM6IDI1cHhcblxuLntjc3MtcHJlZml4fWNvbmZpcm1cbiAgd2lkdGg6IDk2cHhcbiAgaGVpZ2h0OiAzNnB4XG4gIGJvcmRlci1yYWRpdXM6IDQwcHhcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmNjYxOFxuICBmb250LXNpemU6IDEycHhcbiAgZm9udC13ZWlnaHQ6IGJvbGRcbiAgY29sb3I6ICNmZmZmZmZcbiAgYm9yZGVyOiBub25lXG5cbi57Y3NzLXByZWZpeH1jb25maXJtOmhvdmVyXG4gIGJhY2tncm91bmQtY29sb3I6ICNlNTViMTVcbiAgY29sb3I6ICNmZmZmZmZcblxuLntjc3MtcHJlZml4fWNvbmZpcm06YWN0aXZlXG4gIGJhY2tncm91bmQtY29sb3I6ICNkOTU2MTRcbiAgY29sb3I6ICNmZmZmZmZcblxuLyogaWNvbiBzdHlsZXMgKi9cbi57Y3NzLXByZWZpeH1pY29uLntjc3MtcHJlZml4fXJpZ2h0XG4gIGZsb2F0OiByaWdodFxuICB0b3A6IDFweFxuXG4ue2Nzcy1wcmVmaXh9aWNvbiAue2Nzcy1wcmVmaXh9bm9uZVxuICBkaXNwbGF5OiBub25lXG5cbi57Y3NzLXByZWZpeH1pY29uLntjc3MtcHJlZml4fWNhbGVuZGFyLWRvdFxuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIHdpZHRoOiAxMnB4O1xuICBoZWlnaHQ6IDEycHg7XG4gIG1hcmdpbjogMXB4O1xuXG5pbnB1dFt0eXBlPSdjaGVja2JveCddLntjc3MtcHJlZml4fWNoZWNrYm94LXNxdWFyZVxuICBkaXNwbGF5OiBub25lXG5cbmlucHV0W3R5cGU9J2NoZWNrYm94J10ue2Nzcy1wcmVmaXh9Y2hlY2tib3gtc3F1YXJlICsgc3BhblxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2tcbiAgY3Vyc29yOiBwb2ludGVyXG4gIGxpbmUtaGVpZ2h0OiAxNHB4XG4gIG1hcmdpbi1yaWdodDogOHB4XG4gIHdpZHRoOiAxNHB4XG4gIGhlaWdodDogMTRweFxuICBiYWNrZ3JvdW5kOiB1cmwoJ2ltYWdlL2ljLWNoZWNrYm94LW5vcm1hbC5wbmcnKSBuby1yZXBlYXRcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZVxuXG5pbnB1dFt0eXBlPSdjaGVja2JveCddLntjc3MtcHJlZml4fWNoZWNrYm94LXNxdWFyZTpjaGVja2VkICsgc3BhbiB7XG4gIGJhY2tncm91bmQ6IHVybCgnaW1hZ2UvaWMtY2hlY2tib3gtY2hlY2tlZC5wbmcnKSBuby1yZXBlYXQ7XG59XG5cbmlucHV0W3R5cGU9J2NoZWNrYm94J10ue2Nzcy1wcmVmaXh9Y2hlY2tib3gtcm91bmRcbiAgZGlzcGxheTogbm9uZVxuXG5pbnB1dFt0eXBlPSdjaGVja2JveCddLntjc3MtcHJlZml4fWNoZWNrYm94LXJvdW5kICsgc3BhblxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2tcbiAgY3Vyc29yOiBwb2ludGVyXG4gIHdpZHRoOiAxNHB4XG4gIGhlaWdodDogMTRweFxuICBsaW5lLWhlaWdodDogMTRweFxuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlXG4gIG1hcmdpbi1yaWdodDogOHB4XG4gIGJvcmRlci1yYWRpdXM6IDhweFxuICBib3JkZXI6IHNvbGlkIDJweFxuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudFxuXG4ue2Nzcy1wcmVmaXh9cG9wdXAtdG9wLWxpbmVcbiAgcG9zaXRpb246IGFic29sdXRlXG4gIGJvcmRlci1yYWRpdXM6IDJweCAycHggMCAwXG4gIHdpZHRoOiAxMDAlXG4gIGhlaWdodDogNHB4XG4gIGJvcmRlcjogbm9uZVxuICB0b3A6IDBcblxuLntjc3MtcHJlZml4fXBvcHVwLWRldGFpbCAue2Nzcy1wcmVmaXh9cG9wdXAtY29udGFpbmVyXG4gIHdpZHRoOiAzMDFweFxuICBtaW4td2lkdGg6IDMwMXB4XG4gIHBhZGRpbmctYm90dG9tOiAwXG5cbi57Y3NzLXByZWZpeH1wb3B1cC1kZXRhaWwgLntjc3MtcHJlZml4fWljb25cbiAgd2lkdGg6IDEycHhcbiAgaGVpZ2h0OiAxMnB4XG4gIGJhY2tncm91bmQtc2l6ZTogMTJweFxuICBwb3NpdGlvbjogcmVsYXRpdmVcbiAgbWFyZ2luLXJpZ2h0OiA4cHhcblxuLntjc3MtcHJlZml4fXBvcHVwLWRldGFpbCAue2Nzcy1wcmVmaXh9aWNvbi57Y3NzLXByZWZpeH1pYy1sb2NhdGlvbi1iXG4gIHRvcDogLTJweFxuXG4ue2Nzcy1wcmVmaXh9cG9wdXAtZGV0YWlsIC57Y3NzLXByZWZpeH1pY29uLntjc3MtcHJlZml4fWljLXVzZXItYlxuICB0b3A6IC0ycHhcblxuLntjc3MtcHJlZml4fXBvcHVwLWRldGFpbCAue2Nzcy1wcmVmaXh9aWNvbi57Y3NzLXByZWZpeH1pYy1zdGF0ZS1iXG4gIHRvcDogLTFweFxuXG4ue2Nzcy1wcmVmaXh9cG9wdXAtZGV0YWlsIC57Y3NzLXByZWZpeH1pY29uLntjc3MtcHJlZml4fWNhbGVuZGFyLWRvdFxuICB3aWR0aDogMTBweFxuICBoZWlnaHQ6IDEwcHhcbiAgbWFyZ2luLXJpZ2h0OiA4cHhcbiAgdG9wOiAtMXB4XG5cbi57Y3NzLXByZWZpeH1wb3B1cC1kZXRhaWwgLntjc3MtcHJlZml4fWNvbnRlbnRcbiAgbGluZS1oZWlnaHQ6IDI0cHhcbiAgaGVpZ2h0OiAyNHB4XG4gIGZvbnQtc2l6ZTogMTJweFxuICBsaW5lLWhlaWdodDogMlxuXG4ue2Nzcy1wcmVmaXh9cG9wdXAtZGV0YWlsIC57Y3NzLXByZWZpeH1zZWN0aW9uLWhlYWRlclxuICBtYXJnaW4tYm90dG9tOiA2cHhcblxuLntjc3MtcHJlZml4fXBvcHVwLWRldGFpbCAue2Nzcy1wcmVmaXh9cG9wdXAtZGV0YWlsLWl0ZW0tc2VwYXJhdGVcbiAgbWFyZ2luLXRvcDogNHB4XG5cbi57Y3NzLXByZWZpeH1wb3B1cC1kZXRhaWwgLntjc3MtcHJlZml4fXBvcHVwLWRldGFpbC1pdGVtLWluZGVudFxuICB0ZXh0LWluZGVudDogLTIwcHhcbiAgcGFkZGluZy1sZWZ0OiAyMHB4XG5cbi57Y3NzLXByZWZpeH1wb3B1cC1kZXRhaWwgLntjc3MtcHJlZml4fXNjaGVkdWxlLXRpdGxlXG4gIGZvbnQtc2l6ZTogMTVweFxuICBmb250LXdlaWdodDogYm9sZFxuICBsaW5lLWhlaWdodDogMS42XG4gIHdvcmQtYnJlYWs6IGJyZWFrLWFsbFxuXG4ue2Nzcy1wcmVmaXh9cG9wdXAtZGV0YWlsIC57Y3NzLXByZWZpeH1zY2hlZHVsZS1wcml2YXRlXG4gIGRpc3BsYXk6IG5vbmVcbiAgd2lkdGg6IDE2cHhcbiAgaGVpZ2h0OiAxNnB4XG4gIGJhY2tncm91bmQ6IHVybCgnaW1hZ2UvaWMtbG9jay5wbmcnKSBuby1yZXBlYXQgMTZweFxuXG4ue2Nzcy1wcmVmaXh9cG9wdXAtZGV0YWlsIC57Y3NzLXByZWZpeH1zY2hlZHVsZS1wcml2YXRlIC57Y3NzLXByZWZpeH1pYy1wcml2YXRlXG4gIGRpc3BsYXk6IGJsb2NrXG5cbi57Y3NzLXByZWZpeH1wb3B1cC1kZXRhaWwgLntjc3MtcHJlZml4fXNlY3Rpb24tZGV0YWlsXG4gIG1hcmdpbi1ib3R0b206IDE2cHhcblxuLntjc3MtcHJlZml4fXBvcHVwLWRldGFpbCAue2Nzcy1wcmVmaXh9c2VjdGlvbi1idXR0b25cbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlNWU1ZTVcbiAgZm9udC1zaXplOiAwXG5cbi57Y3NzLXByZWZpeH1zZWN0aW9uLWJ1dHRvbiAue2Nzcy1wcmVmaXh9aWNvblxuICBtYXJnaW4tcmlnaHQ6IDRweFxuICB0b3A6IC0zcHhcblxuLntjc3MtcHJlZml4fXNlY3Rpb24tYnV0dG9uIC57Y3NzLXByZWZpeH1jb250ZW50XG4gIHBvc2l0aW9uOiByZWxhdGl2ZVxuICB0b3A6IDJweFxuXG4ue2Nzcy1wcmVmaXh9cG9wdXAtZWRpdCwgLntjc3MtcHJlZml4fXBvcHVwLWRlbGV0ZVxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2tcbiAgcGFkZGluZzogN3B4IDlweCAxMXB4IDlweFxuICB3aWR0aDogY2FsYyg1MCUgLSAxcHgpXG4gIG91dGxpbmU6IG5vbmVcbiAgYmFja2dyb3VuZDogbm9uZVxuICBib3JkZXI6IG5vbmVcbiAgY3Vyc29yOiBwb2ludGVyXG5cbi57Y3NzLXByZWZpeH1wb3B1cC12ZXJ0aWNhbC1saW5lXG4gIGJhY2tncm91bmQ6ICNlNWU1ZTVcbiAgd2lkdGg6IDFweFxuICBoZWlnaHQ6IDE0cHhcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZVxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2tcbiAgbWFyZ2luLXRvcDogLTdweFxuXG4vKiBvdmVycmlkZSB0dWktZGF0ZS1waWNrZXIgKi9cbi50dWktZGF0ZXBpY2tlclxuICAgIGxlZnQ6IC0xMnB4XG4gICAgei1pbmRleDogMVxuICAgIGJvcmRlci1jb2xvcjogI2Q1ZDVkNVxuIiwiLyogaWNvbiBzdHlsZXMgKi9cbi57Y3NzLXByZWZpeH1pY29uIHtcbiAgd2lkdGg6IDE0cHg7XG4gIGhlaWdodDogMTRweDtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xufVxuXG4ue2Nzcy1wcmVmaXh9aWNvbi57Y3NzLXByZWZpeH1pYy10aXRsZVxuICAgIGJhY2tncm91bmQ6IHVybCgnaW1hZ2UvaWMtc3ViamVjdC5wbmcnKSBuby1yZXBlYXRcblxuLntjc3MtcHJlZml4fWljb24ue2Nzcy1wcmVmaXh9aWMtbG9jYXRpb25cbiAgICBiYWNrZ3JvdW5kOiB1cmwoJ2ltYWdlL2ljLWxvY2F0aW9uLnBuZycpIG5vLXJlcGVhdFxuXG4ue2Nzcy1wcmVmaXh9aWNvbi57Y3NzLXByZWZpeH1pYy1kYXRlXG4gICAgYmFja2dyb3VuZDogdXJsKCdpbWFnZS9pYy1kYXRlLnBuZycpIG5vLXJlcGVhdFxuXG4ue2Nzcy1wcmVmaXh9aWNvbi57Y3NzLXByZWZpeH1pYy1zdGF0ZVxuICAgIGJhY2tncm91bmQ6IHVybCgnaW1hZ2UvaWMtc3RhdGUucG5nJykgbm8tcmVwZWF0XG5cbi57Y3NzLXByZWZpeH1pY29uLntjc3MtcHJlZml4fWljLXByaXZhdGVcbiAgICBiYWNrZ3JvdW5kOiB1cmwoJ2ltYWdlL2ljLWxvY2sucG5nJykgbm8tcmVwZWF0XG5cbi57Y3NzLXByZWZpeH1pY29uLntjc3MtcHJlZml4fWljLWNsb3NlXG4gICAgYmFja2dyb3VuZDogdXJsKCdpbWFnZS9pYy1jbG9zZS5wbmcnKSBuby1yZXBlYXRcblxuXG4ue2Nzcy1wcmVmaXh9aWMtbG9jYXRpb24tYlxuICAgIGJhY2tncm91bmQ6IHVybCgnLi9pbWFnZS9pYy1sb2NhdGlvbi1iLnBuZycpXG5cbi57Y3NzLXByZWZpeH1pYy1zdGF0ZS1iXG4gICAgYmFja2dyb3VuZDogdXJsKCcuL2ltYWdlL2ljLXN0YXRlLWIucG5nJylcblxuLntjc3MtcHJlZml4fWljb24ue2Nzcy1wcmVmaXh9aWMtdXNlci1iXG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCcuL2ltYWdlL2ljLXVzZXItYi5wbmcnKVxuXG4ue2Nzcy1wcmVmaXh9aWNvbi57Y3NzLXByZWZpeH1pYy1lZGl0XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCcuL2ltYWdlL2ljLWVkaXQucG5nJylcblxuLntjc3MtcHJlZml4fWljb24ue2Nzcy1wcmVmaXh9aWMtZGVsZXRlXG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCcuL2ltYWdlL2ljLWRlbGV0ZS5wbmcnKVxuXG4ue2Nzcy1wcmVmaXh9aWNvbi57Y3NzLXByZWZpeH1pYy1hcnJvdy1zb2xpZC10b3BcbiAgICBiYWNrZ3JvdW5kOiB1cmwoJ2ltYWdlL2ljLWFycm93LXNvbGlkLXRvcC5wbmcnKSBuby1yZXBlYXRcblxuLntjc3MtcHJlZml4fWljb24ue2Nzcy1wcmVmaXh9aWMtbWlsZXN0b25lXG4gICAgYmFja2dyb3VuZDogdXJsKCdpbWFnZS9pYy1taWxlc3RvbmUucG5nJykgbm8tcmVwZWF0XG5cbi57Y3NzLXByZWZpeH1pY29uLntjc3MtcHJlZml4fWljLWFycm93LWxlZnRcbiAgICBiYWNrZ3JvdW5kOiB1cmwoJ2ltYWdlL2ljLWFycm93LWxlZnQucG5nJykgbm8tcmVwZWF0XG5cbi57Y3NzLXByZWZpeH1pY29uLntjc3MtcHJlZml4fWljLWFycm93LXJpZ2h0XG4gICAgYmFja2dyb3VuZDogdXJsKCdpbWFnZS9pYy1hcnJvdy1yaWdodC5wbmcnKSBuby1yZXBlYXRcblxuLntjc3MtcHJlZml4fWljLXJlcGVhdC1iXG4gICAgYmFja2dyb3VuZDogdXJsKCcuL2ltYWdlL2ljLXJlcGVhdC1iLnBuZycpXG4iLCIvKiFcbiAqIFRPQVNUIFVJIERhdGUgUGlja2VyXG4gKiBAdmVyc2lvbiA0LjMuMVxuICogQGF1dGhvciBOSE4uIEZFIERldmVsb3BtZW50IExhYiA8ZGxfamF2YXNjcmlwdEBuaG4uY29tPlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cbkBjaGFyc2V0IFwidXRmLThcIjtcbi50dWktY2FsZW5kYXIge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNhYWE7XG4gICAgd2lkdGg6IDI3NHB4O1xufVxuXG4udHVpLWNhbGVuZGFyICoge1xuICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cblxuLnR1aS1jYWxlbmRhciBkaXYge1xuICAgIHRleHQtYWxpZ246IGNlbnRlclxufVxuXG4udHVpLWNhbGVuZGFyIGNhcHRpb24ge1xuICAgIHBhZGRpbmc6IDBcbn1cblxuLnR1aS1jYWxlbmRhciBjYXB0aW9uIHNwYW4ge1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGNsaXA6IHJlY3QoMCAwIDAgMCk7XG4gICAgd2lkdGg6IDFweDtcbiAgICBoZWlnaHQ6IDFweDtcbiAgICBtYXJnaW46IC0xcHg7XG4gICAgcGFkZGluZzogMFxufVxuXG4udHVpLWNhbGVuZGFyIGJ1dHRvbiwgLnR1aS1kYXRlcGlja2VyLWRyb3Bkb3duIGJ1dHRvbiwgLnR1aS1kYXRlcGlja2VyLXNlbGVjdG9yIGJ1dHRvbiB7XG4gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAgIC1tb3otYXBwZWFyYW5jZTogbm9uZTtcbiAgICBhcHBlYXJhbmNlOiBub25lXG59XG5cbi50dWktaWNvLWRhdGUsIC50dWktaWNvLXRpbWUsIC50dWktZGF0ZXBpY2tlci1kcm9wZG93biAudHVpLWljby1jaGVjaywgLnR1aS1pY28tY2FyZXQge1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdpZHRoOiAxcHg7XG4gICAgaGVpZ2h0OiAxcHg7XG4gICAgbGluZS1oZWlnaHQ6IDMwMHB4O1xuICAgIGJhY2tncm91bmQ6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUM4QUFBQStDQVlBQUFDN3JVS1NBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTJacFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1TXkxak1ERXhJRFkyTGpFME5UWTJNU3dnTWpBeE1pOHdNaTh3TmkweE5EbzFOam95TnlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRVJqZEdNemt6T0RWRVFrUkZOakV4UWtWQ01qbERPVUZETnpaRE0wRTVOQ0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG8xT0RWQ1JUYzROa00yUWtReE1VVTJPVGd6TXpoR1FqWkZNamN5TVRRMVJTSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzFPRFZDUlRjNE5VTTJRa1F4TVVVMk9UZ3pNemhHUWpaRk1qY3lNVFExUlNJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTFNMklDaFhhVzVrYjNkektTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPakZFUkVORE1UYzBRamxETmtVMk1URTVPVGMwUWpJd09UWTNRa1F6TmpaQklpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rUkdOMFl6T1RNNE5VUkNSRVUyTVRGQ1JVSXlPVU01UVVNM05rTXpRVGswSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0NsYVlmd0FBQ2NGSlJFRlVlTnJFV2d0d1ZPVVZQbnQzNys0bW15VWhrU1FMR0VpZ1E0dVJRaUVJVGUwVTBEamlvNjFBck5xcFFndVdkdHJLdE5xS005VzJZNnNPSGFXZFVhRXZtVlp0UWFZamc4WkhVNnpGQXBYNEdBR2RpWWFIUW1JU2tzMXIyVWV5dCtmY1BYZHo5KzY5ZC8rNzJkUXo4ODNlK3o5MnYvKy81ei8vOTUrN3JzV0xGNFBCMWpCdTV2dHZJbjZJV0lYb05EYmV0R2tUZlNqZ3pGeG0vUlJGZ1hBNERORm9GT0x4dUZybTlYckI1L1BCMUtsVHdlVnlaWHlKeDRUNG54RE51ckkvSWhZaFh1VUJuSUZKc09IaFllanA2WUh5OG5Jb0xTMVZTWlBSSUJLSkJKdzhlUklxS3l1aHBLVEVsUHdOVFB4R3hBdjZDVUY4RC9FZzRsODhnSTVDRWg4YUdvS1JrUkdvcmEzTnF2TjRVaFJwUUoyZG5lclRDUWFEYXBta0k3NkxpYmVZZkQ4TjRDN0VuL2tKekROekJVRmtFWTlFSWxCZFhaMXprS0ZRU0Iwa1BTV04vR1ltM214QlhHOC81UUVjUk15ZTZJd25rMG5vN2UyRnFxb3E0VDQweU83dWJ2VUpFUG5MRVJjUTV3VDZYb3o0S21JUDRuU090b3B1UVNwbWk1b1dKeTFFcDBicm9yKy9YeVZQVWVWZVJDdWl3YVpQTGZ2OGM0anY1aEZoc2l3V2k2VVhwaE9qUHRSWFc3Q1BJU0tJRnhIWHMxdm9qWHo4WlhhWmUwVERvY1YxMmlpUzVFdWUra3E2c2wzcy8vc1JWK2pLNXlOZVFld1FJQjdtSjFLcXU3WjBtNG1hTWM3L2pmMy9Oc1EvTkJkRC9BcnhtMEwvdURhRFdqZ1VOZTJKbWZYYXg5RHNvSWtiV1ZtWnhiV3AyOURPU1VTS2k0c2RrNmUrVXI2emR2VG9VUlVtMFNVWDBrYVJwcSt2ei9GdlV4L3FhMFYrQStKTnhIUUhpOU1KVXAxUXE5Q1czOVhWSlV5Y2RsbnFRMzBsQytLMG0vNlZ3K2QwbUFSYnNtU0ora2xhSlJBSUNBMkEybEI3VGQ5NExJaXY1RTJyRi9GUDNYMlc3ZHk1TXk5VnFiOGhyVUl6MmRIUkFSVVZGU0RMY29Zd0k1Q3IyQWt6STNHeVAvQ243UUFLWWRxTTBzNDVNRENRSVluOWZyOHEycXdrc1JseCtEOE1JQ3NLT1pFTEhpWitadzVpSWdOd0NmNW13VFlyRDJ1YlZRSXpxZzJBamtEM0ZlTEhyMzJzMHpoNE9neDlSM0pCWTFteFczWDZjR1FzbmxUZ05ieDhGTEZYUDNpUFFRcUE0QUNjekxETGNHMHFGQkZQejUwbU42MVpHSUNHV1g3d3k2bW0wWVRpZmYxMGRNWGV0MFpXdk4rVG9DZC9FNkpiSlY5WFZ3ZWZzRlVnWGtQUzgyNWROZ1Vrdy9Cb0VKZlBMWUxHT1VXdzYvRGdTaHdFSFlZYUVlY2wxakFod1IvYXdQTFp5Y1lGVnFjb3RoM1hYUnFZdDM1NUp2R2hXRktGWmxSSGJhZ3RxMkRWYlo3V0xjVE9ITVR2NHZYaDFGV3MzR1paWmRDOVp2M3lZTHJnUkZjY2Rod2NoQTk2RXVyOW5Ha3kzUDZGS1RDL09oWDNOMkRiSTZlaTY3cUh4cFpKN01mYmVBRFRCWWlmTGFETDNIWnRmUUM4N3RTWWlQRFdaL3ZTeE0zS1pHejdsUVVCdWx3djZSYmlOZ3M1NElTNGxhdFl1YzBWUzJmNzBqZFBIQm1DMFdSMkpLV3lYVmluMmFLTDFUNWY4cGhFa2xaZDZIUkNQSi80WFZNOVpaekNpYzY0WmNQanVycXFvRnM5VDNzc1FtRXI1M0EyNU5wVk9lT1dNYXR0YlcyaTVNZVNTVVhXVmlxNVJHelVmQTVrdDh1NEhVcVNSU3duRjdwbHN2VU1XdnZwL3RGeHBWbmpzMWFodXJvUFUzM2FKWnZONkxNT2lOdWRVYlV6YmRaaGh2SkVoMDlHMDJYZnVDd0laVVhabEtpTTZqVGpQaTJlZlBJbWVleXlZVDRXRGhqcWY3Ly9XR1FMUmc4NTZKY0F3eVk4c3ZZaStNdnJRL0QyUjNHMTg4S1pYdmg2UXhBdUtuR240bjgwQ2Z2ZWlWRG8rWjNlNXltUWZwdTMzM291TzhiN3dPTWtyWjJvUTVNbkVUYTIyNzg1MUk3Nlp2dTIxdkNQN2wxZHJybytrYnhqUlpsNWhnMi84ZGV0WVJpSkpiZnIzV1lHNGdqcm5LMjg0NGI0K2txdW01SEhqSXVVLzZUdFRPeTVuei9mQjRQUnBPVVhVaDIxT1lwdHFZKzJ3M281Vi9NTTRuNURud09NZXpoVGRoa2x1dkxSNlhZUkIvRmxKUFhBeHFkNmZyRDZrbUo1Mld3L1ZFMUp1Y25IZzJOdytGUVVuajhlU2ZDTTM4MTlWUEszSXo0eUlhNjMrNWs0eWVIZjVwQUYrUmlSdVJQSlBiN25qZUZ2SVpyd2ZpYlhFYmVYYUgzUWhtdW01N2Vha0RFU2VSanhTd3Z5WnBGRXlORHY5YmNmOE16ZUxYb1krUno5bmtpcUJsSnZTQ2JxSnBPVzdyTnpCYnBQR05NWEp1KzAwbWtOcDA4R3haZnl6cms0ZEEyT2drOU94WkpZSWdra0lTNmQ3aVdGNlRLU2Y0TitqeGVtM1V3MmNPaUVIRkpnSmErakczT1VwUTFQUzhwTDcwWWdpdEpnMFV3ZlhGTmZuSllEaVRFRlRwMGZoYllQWTRBRFU2NmFYd3hGY2lxTklIRWMzeUx3bExad1d6dGJ5ZWZNSjNLVVpSQi81czFoTmI2dlcxUUNuNnFVTTNRTVhWTVoxZEVtdGhmYlVoK05QS1d1YTNLa3I2bHVGcmUxc2xVY2Jpa0F0TmlVWmJqbWdmWUxVRk11dytmci9LQlB5OUJUaU9wRUd0VlJHMnI3U3ZzRnRhK0g0L1kxSE91WEloNUIvSmY3TE9VWnA4R3R0b254UkhJUGk3a1dtN0xNOUIzR2NEd1J3UzBOUmVPNVNQVDNWOStQUXMrUUdzcGhHczcyRitmNkljVFN1YkhPaC9KaFdPMnI3YkJuT1k3VGFlb2gyaHNZRDdFOFhtcWo1NjgySVhsMUx1Sms3MzBjaHdXNEVEMHNpWW53MzkrS3BJbWJsYm14N2NJWlhuaTNLL1BOQ0dtWDdid3dTeGdOWEJZWFNac0xsbVZJMjlrVmN2citQNmdXazRwaW9ta1VPS1JUbitRNlo4T2o0S0hjNEFTdGhXZVlacnFac3hGbVpWbEdDckZVSjRFN0I4WXNmK1Njcmk3b2Q4RndMSmt4ODZSeHZvODRSTi9MT01SbFhvRUIwS0xjclV0aW1aVmxHSG1MZnFiZE5xODZqSFVLakw4Qkw0U3FmRUZIOWtxYnNyU1ZGcm1oYjJSY1NjNHF0OTR6OVhYOWthVGFWektveXV0NXN4cG0wUFYxWEVlcTBpYzRnTTA1eXRLRU9zNlBiOXJMYS8xUUxHZnZqMVJHZFpwMTlDYlV2cElEVlhtR1ZXVXVDVUJrYnhBb2cva2hMeHhIT1lDYkR2dXlCTTJMUytBejFUSUVmUktVSU9pYXlxaU9OelU0aG4wdUNYa25SMVdLR3A1TlhaK3U5aW92dnhjQlNqN1JSa1NFVjgwemZ6dEl5NFBhWWgrMXIxUUFWVWtScFVtZ3pGU1VOZGI1MVJjZSs0K05wSitBaFl4UTIxQmI2Z082QlN1U0VjaFNsZG9obWpWUFU0NHk2eng5ZmNCVkhuRERrM2p3cG5oT3A2Y0lraVhRTlpWUkhiV2h0Z1ZUbFpENnY4TE5UUFltUHZXWWxka2F6V1o5eUt0UW9wVzB5ekJuaU1tTmFuQnhya1ZoaG50Q2xpVFdWT1dCQ2FoS3h3Tm9ibTUyZktqWnZYdDM1ajVSUUZYNUlwUFV1NHRaV2NGTTBxbkt0WWhuRVNzUUFRWmQwLzhRMXVWUWxjYTE0aGNvRThsQTBLQVAycEdmcUtyVWpHYjJLWGFWZlRabG9rWnUralc3bEtQSFJGVnV6K01KTnBuNGRwT1RCV3V3QmJ5bm5PVXNuamw1ZW1XZVR5cER0OE5PaFBoYUprZC9QTlgrczBidTlTVExsbHNSZlhadUkvVDNFaHZiYUVKeW8rQ016K0VURi8xM1RYc3QrUURuU2g5bWw3Vk5mYmdzaUlybVl0WUpscGtaL2RHVTB0US9SdndiVXYrb0lnbit0b2xrc1Z5d1paOWdFb21TcHZkQjZsMFk2YVlvTC9DY2tVMWJzQU04Z0xBb2NTY3BQUUg3R1I5K2ZvRzRBM0ZDcE5QL0JCZ0FkWjNCMnlaZzB2VUFBQUFBU1VWT1JLNUNZSUk9KSBuby1yZXBlYXRcbn1cblxuLnR1aS1pY28tZGF0ZSB7XG4gICAgd2lkdGg6IDEycHg7XG4gICAgaGVpZ2h0OiAxMnB4O1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xN3B4IDBcbn1cblxuLnR1aS1pY28tdGltZSB7XG4gICAgd2lkdGg6IDEycHg7XG4gICAgaGVpZ2h0OiAxMnB4O1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IDAgLTMwcHhcbn1cblxuLnR1aS1pY28tY2FyZXQge1xuICAgIHdpZHRoOiA3cHg7XG4gICAgaGVpZ2h0OiA0cHg7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtNThweFxufVxuXG4udHVpLWNhbGVuZGFyLW1vbnRoLCAudHVpLWNhbGVuZGFyLXllYXIge1xuICAgIHdpZHRoOiAyMDJweDtcbn1cblxuLnR1aS1jYWxlbmRhci1tb250aCAudHVpLWNhbGVuZGFyLWJvZHksIC50dWktY2FsZW5kYXIteWVhciAudHVpLWNhbGVuZGFyLWJvZHkge1xuICAgIHdpZHRoOiAyMDJweDtcbiAgICBtYXJnaW46IDAgYXV0bztcbn1cblxuLnR1aS1jYWxlbmRhciAudHVpLWNhbGVuZGFyLWhlYWRlciB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZWZlZmVmXG59XG5cbi50dWktY2FsZW5kYXIgLnR1aS1jYWxlbmRhci1oZWFkZXItaW5uZXIge1xuICAgIHBhZGRpbmc6IDE3cHggNTBweCAxNXB4O1xuICAgIGhlaWdodDogNTBweFxufVxuXG4udHVpLWNhbGVuZGFyIC50dWktY2FsZW5kYXItdGl0bGUtdG9kYXkge1xuICAgIGhlaWdodDogMzBweDtcbiAgICBtYXJnaW46IDA7XG4gICAgZm9udC1zaXplOiAxMnB4O1xuICAgIGxpbmUtaGVpZ2h0OiAzNHB4O1xuICAgIGNvbG9yOiAjNzc3O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmNGY0ZjRcbn1cblxuLnR1aS1jYWxlbmRhciAudHVpLWNhbGVuZGFyLXRpdGxlLXRvZGF5OmhvdmVyIHtcbiAgICBjb2xvcjogIzMzMztcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWRmNGZjO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLnR1aS1jYWxlbmRhciAudHVpLWNhbGVuZGFyLXRpdGxlIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgZm9udC1zaXplOiAxOHB4O1xuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gICAgZm9udC1zdHlsZTogbm9ybWFsO1xuICAgIGxpbmUtaGVpZ2h0OiAxO1xuICAgIGNvbG9yOiAjMzMzO1xuICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wXG59XG5cbi50dWktY2FsZW5kYXItYnRuIHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDA7XG4gICAgd2lkdGg6IDMycHg7XG4gICAgaGVpZ2h0OiA1MHB4O1xuICAgIGxpbmUtaGVpZ2h0OiA0MDBweDtcbiAgICB6LWluZGV4OiAxMDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG59XG5cbi50dWktY2FsZW5kYXIgLnR1aS1jYWxlbmRhci1idG4tcHJldi1tb250aCB7XG4gICAgbGVmdDogMFxufVxuXG4udHVpLWNhbGVuZGFyIC50dWktY2FsZW5kYXItYnRuLW5leHQtbW9udGgge1xuICAgIHJpZ2h0OiAwXG59XG5cbi50dWktY2FsZW5kYXIgLnR1aS1jYWxlbmRhci1idG4tcHJldi15ZWFyIHtcbiAgICBsZWZ0OiAwXG59XG5cbi50dWktY2FsZW5kYXIgLnR1aS1jYWxlbmRhci1idG4tbmV4dC15ZWFyIHtcbiAgICByaWdodDogMFxufVxuXG4udHVpLWNhbGVuZGFyIC50dWktY2FsZW5kYXItYnRuLXByZXYtbW9udGg6YWZ0ZXIsIC50dWktY2FsZW5kYXIgLnR1aS1jYWxlbmRhci1idG4tbmV4dC1tb250aDphZnRlciwgLnR1aS1jYWxlbmRhciAudHVpLWNhbGVuZGFyLWJ0bi1wcmV2LXllYXI6YWZ0ZXIsIC50dWktY2FsZW5kYXIgLnR1aS1jYWxlbmRhci1idG4tbmV4dC15ZWFyOmFmdGVyIHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDUwJTtcbiAgICBtYXJnaW4tdG9wOiAtNXB4O1xuICAgIGxpbmUtaGVpZ2h0OiA0MDBweDtcbiAgICBiYWNrZ3JvdW5kOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDOEFBQUErQ0FZQUFBQzdyVUtTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEyWnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU15MWpNREV4SURZMkxqRTBOVFkyTVN3Z01qQXhNaTh3TWk4d05pMHhORG8xTmpveU55QWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEVSamRHTXprek9EVkVRa1JGTmpFeFFrVkNNamxET1VGRE56WkRNMEU1TkNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvMU9EVkNSVGM0TmtNMlFrUXhNVVUyT1Rnek16aEdRalpGTWpjeU1UUTFSU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG8xT0RWQ1JUYzROVU0yUWtReE1VVTJPVGd6TXpoR1FqWkZNamN5TVRRMVJTSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1ExTTJJQ2hYYVc1a2IzZHpLU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT2pGRVJFTkRNVGMwUWpsRE5rVTJNVEU1T1RjMFFqSXdPVFkzUWtRek5qWkJJaUJ6ZEZKbFpqcGtiMk4xYldWdWRFbEVQU0o0YlhBdVpHbGtPa1JHTjBZek9UTTROVVJDUkVVMk1URkNSVUl5T1VNNVFVTTNOa016UVRrMElpOCtJRHd2Y21SbU9rUmxjMk55YVhCMGFXOXVQaUE4TDNKa1pqcFNSRVkrSUR3dmVEcDRiWEJ0WlhSaFBpQThQM2h3WVdOclpYUWdaVzVrUFNKeUlqOCtDbGFZZndBQUNjRkpSRUZVZU5yRVdndHdWT1VWUG50MzcrNG1teVVoa1NRTEdFaWdRNHVSUWlFSVRlMFUwRGppbzYxQXJOcXBRZ3VXZHRyS3ROcUtNOVcyWTZzT0hhV2RVYUV2bVZadFFhWWpnOFpIVTZ6RkFwWDRHQUdkaVlhSFFtSVNrczFyMlVleXQrZmNQWGR6OSs2OWQvKzcyZFF6ODgzZSt6OTJ2LysvNXovLzk1Kzdyc1dMRjRQQjFqQnU1dnR2SW42SVdJWG9ORGJldEdrVGZTamd6RnhtL1JSRmdYQTRETkZvRk9MeHVGcm05WHJCNS9QQjFLbFR3ZVZ5Wlh5Sng0VDRueEROdXJJL0loWWhYdVVCbklGSnNPSGhZZWpwNllIeThuSW9MUzFWU1pQUklCS0pCSnc4ZVJJcUt5dWhwS1RFbFB3TlRQeEd4QXY2Q1VGOEQvRWc0bDg4Z0k1Q0VoOGFHb0tSa1JHb3JhM05xdk40VWhScFFKMmRuZXJUQ1FhRGFwbWtJNzZMaWJlWWZEOE40QzdFbi9rSnpETnpCVUZrRVk5RUlsQmRYWjF6a0tGUVNCMGtQU1dOL0dZbTNteEJYRzgvNVFFY1JNeWU2SXduazBubzdlMkZxcW9xNFQ0MHlPN3VidlVKRVBuTEVSY1E1d1Q2WG96NEttSVA0blNPdG9wdVFTcG1pNW9XSnkxRXAwYnJvcisvWHlWUFVlVmVSQ3Vpd2FaUExmdjhjNGp2NWhGaHNpd1dpNlVYcGhPalB0UlhXN0NQSVNLSUZ4SFhzMXZvalh6OFpYYVplMFREb2NWMTJpaVM1RXVlK2txNnNsM3MvL3NSVitqSzV5TmVRZXdRSUI3bUoxS3F1N1owbTRtYU1jNy9qZjMvTnNRL05CZEQvQXJ4bTBML3VEYURXamdVTmUySm1mWGF4OURzb0lrYldWbVp4YldwMjlET1NVU0tpNHNkazZlK1VyNnpkdlRvVVJVbTBTVVgwa2FScHErdnovRnZVeC9xYTBWK0ErSk54SFFIaTlNSlVwMVFxOUNXMzlYVkpVeWNkbG5xUTMwbEMrSzBtLzZWdytkMG1BUmJzbVNKK2tsYUpSQUlDQTJBMmxCN1RkOTRMSWl2NUUyckYvRlAzWDJXN2R5NU15OVZxYjhoclVJejJkSFJBUlVWRlNETGNvWXdJNUNyMkFrekkzR3lQL0NuN1FBS1lkcU0wczQ1TURDUUlZbjlmcjhxMnF3a3NSbHgrRDhNSUNzS09aRUxIaVorWnc1aUlnTndDZjVtd1RZckQydWJWUUl6cWcyQWprRDNGZUxIcjMyczB6aDRPZ3g5UjNKQlkxbXhXM1g2Y0dRc25sVGdOYng4RkxGWFAzaVBRUXFBNEFDY3pMRExjRzBxRkJGUHo1MG1ONjFaR0lDR1dYN3d5Nm1tMFlUaWZmMTBkTVhldDBaV3ZOK1RvQ2QvRTZKYkpWOVhWd2Vmc0ZVZ1hrUFM4MjVkTmdVa3cvQm9FSmZQTFlMR09VV3c2L0RnU2h3RUhZWWFFZWNsMWpBaHdSL2F3UExaeWNZRlZxY290aDNYWFJxWXQzNTVKdkdoV0ZLRlpsUkhiYWd0cTJEVmJaN1dMY1RPSE1UdjR2WGgxRldzM0daWlpkQzladjN5WUxyZ1JGY2NkaHdjaEE5NkV1cjluR2t5M1A2RktUQy9PaFgzTjJEYkk2ZWk2N3FIeHBaSjdNZmJlQURUQllpZkxhREwzSFp0ZlFDODd0U1lpUERXWi92U3hNM0taR3o3bFFVQnVsd3Y2UmJpTmdzNTRJUzRsYXRZdWMwVlMyZjcwamRQSEJtQzBXUjJKS1d5WFZpbjJhS0wxVDVmOHBoRWtsWmQ2SFJDUEovNFhWTTlaWnpDaWM2NFpjUGp1cnFxb0ZzOVQzc3NRbUVyNTNBMjVOcFZPZU9XTWF0dGJXMmk1TWVTU1VYV1ZpcTVSR3pVZkE1a3Q4dTRIVXFTUlN3bkY3cGxzdlVNV3Z2cC90RnhwVm5qczFhaHVyb1BVMzNhSlp2TjZMTU9pTnVkVWJVemJkWmhodkpFaDA5RzAyWGZ1Q3dJWlVYWmxLaU02alRqUGkyZWZQSW1lZXl5WVQ0V0RoanFmNy8vV0dRTFJnODU2SmNBd3lZOHN2WWkrTXZyUS9EMlIzRzE4OEtaWHZoNlF4QXVLbkduNG44MENmdmVpVkRvK1ozZTV5bVFmcHUzMzNvdU84Yjd3T01rcloyb1E1TW5FVGEyMjc4NTFJNzZadnUyMXZDUDdsMWRycm8ra2J4alJabDVoZzIvOGRldFlSaUpKYmZyM1dZRzRnanJuSzI4NDRiNCtrcXVtNUhIakl1VS82VHRUT3k1bnovZkI0UFJwT1VYVWgyMU9ZcHRxWSsydzNvNVYvTU00bjVEbndPTWV6aFRkaGtsdXZMUjZYWVJCL0ZsSlBYQXhxZDZmckQ2a21KNTJXdy9WRTFKdWNuSGcyTncrRlFVbmo4ZVNmQ00zODE5VlBLM0l6NHlJYTYzKzVrNHllSGY1cEFGK1JpUnVSUEpQYjduamVGdklacndmaWJYRWJlWGFIM1FobXVtNTdlYWtERVNlUmp4U3d2eVpwRkV5TkR2OWJjZjhNemVMWG9ZK1J6OW5raXFCbEp2U0NicUpwT1c3ck56QmJwUEdOTVhKdSswMG1rTnAwOEd4WmZ5enJrNGRBMk9nazlPeFpKWUlna2tJUzZkN2lXRjZUS1NmNE4ranhlbTNVdzJjT2lFSEZKZ0phK2pHM09VcFExUFM4cEw3MFlnaXRKZzBVd2ZYRk5mbkpZRGlURUZUcDBmaGJZUFk0QURVNjZhWHd4RmNpcU5JSEVjM3lMd2xMWndXenRieWVmTUozS1VaUkIvNXMxaE5iNnZXMVFDbjZxVU0zUU1YVk1aMWRFbXRoZmJVaCtOUEtXdWEzS2tyNmx1RnJlMXNsVWNiaWtBdE5pVVpiam1nZllMVUZNdXcrZnIvS0JQeTlCVGlPcEVHdFZSRzJyN1N2c0Z0YStINC9ZMUhPdVhJaDVCL0pmN0xPVVpwOEd0dG9ueFJISVBpN2tXbTdMTTlCM0djRHdSd1MwTlJlTzVTUFQzVjkrUFFzK1FHc3BoR3M3MkYrZjZJY1RTdWJIT2gvSmhXTzJyN2JCbk9ZN1RhZW9oMmhzWUQ3RThYbXFqNTY4MklYbDFMdUprNzMwY2h3VzRFRDBzaVludzM5K0twSW1ibGJteDdjSVpYbmkzSy9QTkNHbVg3Ynd3U3hnTlhCWVhTWnNMbG1WSTI5a1ZjdnIrUDZnV2s0cGlvbWtVT0tSVG4rUTZaOE9qNEtIYzRBU3RoV2VZWnJxWnN4Rm1aVmxHQ3JGVUo0RTdCOFlzZitTY3JpN29kOEZ3TEpreDg2Unh2bzg0Uk4vTE9NUmxYb0VCMEtMY3JVdGltWlZsR0htTGZxYmROcTg2akhVS2pMOEJMNFNxZkVGSDlrcWJzclNWRnJtaGIyUmNTYzRxdDk0ejlYWDlrYVRhVnpLb3l1dDVzeHBtMFBWMVhFZXEwaWM0Z00wNXl0S0VPczZQYjlyTGEvMVFMR2Z2ajFSR2RacDE5Q2JVdnBJRFZYbUdWV1V1Q1VCa2J4QW9nL2toTHh4SE9ZQ2JEdnV5Qk0yTFMrQXoxVElFZlJLVUlPaWF5cWlPTnpVNGhuMHVDWGtuUjFXS0dwNU5YWit1OWlvdnZ4Y0JTajdSUmtTRVY4MHpmenRJeTRQYVloKzFyMVFBVlVrUnBVbWd6RlNVTmRiNTFSY2UrNCtOcEorQWhZeFEyMUJiNmdPNkJTdVNFY2hTbGRvaG1qVlBVNDR5Nnp4OWZjQlZIbkREazNqd3BuaE9wNmNJa2lYUU5aVlJIYldodGdWVGxaRDZ2OExOVFBZbVB2V1lsZGtheldaOXlLdFFvcFcweXpCbmlNbU5hbkJ4cmtWaGhudENsaVRXVk9XQkNhaEt4d05vYm01MmZLalp2WHQzNWo1UlFGWDVJcFBVdTR0WldjRk0wcW5LdFlobkVTc1FBUVpkMC84UTF1VlFsY2ExNGhjb0U4bEEwS0FQMnBHZnFLclVqR2IyS1hhVmZUWmxva1p1K2pXN2xLUEhSRlZ1eitNSk5wbjRkcE9UQld1d0JieW5uT1VzbmpsNWVtV2VUeXBEdDhOT2hQaGFKa2QvUE5YK3MwYnU5U1RMbGxzUmZYWnVJL1QzRWh2YmFFSnlvK0NNeitFVEYvMTNUWHN0K1FEblNoOW1sN1ZOZmJnc2lJcm1ZdFlKbHBrWi9kR1UwdFEvUnZ3YlV2K29JZ24rdG9sa3NWeXdaWjlnRW9tU3B2ZEI2bDBZNmFZb0wvQ2NrVTFic0FNOGdMQW9jU2NwUFFIN0dSOStmb0c0QTNGQ3BOUC9CQmdBZFozQjJ5WmcwdlVBQUFBQVNVVk9SSzVDWUlJPSkgbm8tcmVwZWF0O1xuICAgIGNvbnRlbnQ6ICcnXG59XG5cbi50dWktY2FsZW5kYXIgLnR1aS1jYWxlbmRhci1idG4tcHJldi1tb250aDphZnRlciwgLnR1aS1jYWxlbmRhci50dWktY2FsZW5kYXItbW9udGggLnR1aS1jYWxlbmRhci1idG4tcHJldi15ZWFyOmFmdGVyIHtcbiAgICB3aWR0aDogNnB4O1xuICAgIGhlaWdodDogMTFweDtcbiAgICBsZWZ0OiA1MCU7XG4gICAgbWFyZ2luLWxlZnQ6IC0zcHg7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAwXG59XG5cbi50dWktY2FsZW5kYXIgLnR1aS1jYWxlbmRhci1idG4tbmV4dC1tb250aDphZnRlciwgLnR1aS1jYWxlbmRhci50dWktY2FsZW5kYXItbW9udGggLnR1aS1jYWxlbmRhci1idG4tbmV4dC15ZWFyOmFmdGVyIHtcbiAgICB3aWR0aDogNnB4O1xuICAgIGhlaWdodDogMTFweDtcbiAgICByaWdodDogNTAlO1xuICAgIG1hcmdpbi1yaWdodDogLTNweDtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOHB4IDBcbn1cblxuLnR1aS1jYWxlbmRhciAudHVpLWNhbGVuZGFyLWJ0bi1wcmV2LXllYXI6YWZ0ZXIge1xuICAgIHdpZHRoOiAxMXB4O1xuICAgIGhlaWdodDogMTBweDtcbiAgICBsZWZ0OiA1MCU7XG4gICAgbWFyZ2luLWxlZnQ6IC02cHg7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTM2cHhcbn1cblxuLnR1aS1jYWxlbmRhciAudHVpLWNhbGVuZGFyLWJ0bi1uZXh0LXllYXI6YWZ0ZXIge1xuICAgIHdpZHRoOiAxMXB4O1xuICAgIGhlaWdodDogMTBweDtcbiAgICByaWdodDogNTAlO1xuICAgIG1hcmdpbi1yaWdodDogLTZweDtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtNDlweFxufVxuXG4udHVpLWNhbGVuZGFyLnR1aS1jYWxlbmRhci1tb250aCAudHVpLWNhbGVuZGFyLWJ0bi1wcmV2LXllYXIsIC50dWktY2FsZW5kYXIudHVpLWNhbGVuZGFyLW1vbnRoIC50dWktY2FsZW5kYXItYnRuLW5leHQteWVhciB7XG4gICAgd2lkdGg6IDUwcHhcbn1cblxuLnR1aS1jYWxlbmRhciAudHVpLWNhbGVuZGFyLWhhcy1idG5zIC50dWktY2FsZW5kYXItYnRuLXByZXYteWVhciB7XG4gICAgbGVmdDogMTBweFxufVxuXG4udHVpLWNhbGVuZGFyIC50dWktY2FsZW5kYXItaGFzLWJ0bnMgLnR1aS1jYWxlbmRhci1idG4tbmV4dC15ZWFyIHtcbiAgICByaWdodDogMTBweFxufVxuXG4udHVpLWNhbGVuZGFyIC50dWktY2FsZW5kYXItaGFzLWJ0bnMgLnR1aS1jYWxlbmRhci1idG4tcHJldi1tb250aCB7XG4gICAgbGVmdDogNDRweFxufVxuXG4udHVpLWNhbGVuZGFyIC50dWktY2FsZW5kYXItaGFzLWJ0bnMgLnR1aS1jYWxlbmRhci1idG4tbmV4dC1tb250aCB7XG4gICAgcmlnaHQ6IDQ0cHhcbn1cblxuLnR1aS1jYWxlbmRhciAudHVpLWNhbGVuZGFyLWJvZHktaGVhZGVyIHRoIHtcbiAgICBjb2xvcjogIzc3N1xufVxuXG4udHVpLWNhbGVuZGFyIC50dWktY2FsZW5kYXItYm9keS1pbm5lciB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgbWFyZ2luOiAwIGF1dG87XG4gICAgdGFibGUtbGF5b3V0OiBmaXhlZDtcbiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBmb250LXNpemU6IDEycHhcbn1cblxuLnR1aS1jYWxlbmRhciB0aCB7XG4gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgICBjdXJzb3I6IGRlZmF1bHRcbn1cblxuLnR1aS1jYWxlbmRhciB0aCwgLnR1aS1jYWxlbmRhciB0ZCB7XG4gICAgaGVpZ2h0OiAzOXB4O1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBjb2xvcjogIzk5OVxufVxuXG4udHVpLWNhbGVuZGFyIC50dWktaXMtYmxvY2tlZDpob3ZlciB7XG4gICAgY3Vyc29yOiBkZWZhdWx0XG59XG5cbi50dWktY2FsZW5kYXIgLnR1aS1jYWxlbmRhci1tb250aCB7XG4gICAgd2lkdGg6IDI1JTtcbiAgICBoZWlnaHQ6IDUwcHhcbn1cblxuLnR1aS1jYWxlbmRhciAudHVpLWNhbGVuZGFyLXRvZGF5IHtcbiAgICBjb2xvcjogIzRiOTZlNlxufVxuXG4udHVpLWNhbGVuZGFyIC50dWktY2FsZW5kYXItcHJldi1tb250aCwgLnR1aS1jYWxlbmRhciAudHVpLWNhbGVuZGFyLW5leHQtbW9udGgge1xuICAgIGNvbG9yOiAjY2NjXG59XG5cbi50dWktY2FsZW5kYXIgLnR1aS1jYWxlbmRhci1wcmV2LW1vbnRoLnR1aS1jYWxlbmRhci1kYXRlLCAudHVpLWNhbGVuZGFyIC50dWktY2FsZW5kYXItbmV4dC1tb250aC50dWktY2FsZW5kYXItZGF0ZSB7XG4gICAgdmlzaWJpbGl0eTogaGlkZGVuXG59XG5cbi50dWktY2FsZW5kYXIgLnR1aS1jYWxlbmRhci1idG4tY2hvaWNlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNGI5NmU2XG59XG5cbi50dWktY2FsZW5kYXIgLnR1aS1jYWxlbmRhci1idG4tY2xvc2Uge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICM3Nzdcbn1cblxuLnR1aS1jYWxlbmRhciAudHVpLWNhbGVuZGFyLXllYXIge1xuICAgIHdpZHRoOiAyNSU7XG4gICAgaGVpZ2h0OiA1MHB4XG59XG5cbi50dWktY2FsZW5kYXIudHVpLWNhbGVuZGFyLXllYXIgLnR1aS1jYWxlbmRhci1idG4tcHJldi15ZWFyOmFmdGVyIHtcbiAgICB3aWR0aDogNnB4O1xuICAgIGhlaWdodDogMTFweDtcbiAgICBsZWZ0OiA1MCU7XG4gICAgbWFyZ2luLWxlZnQ6IC0zcHg7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAwXG59XG5cbi50dWktY2FsZW5kYXIudHVpLWNhbGVuZGFyLXllYXIgLnR1aS1jYWxlbmRhci1idG4tbmV4dC15ZWFyOmFmdGVyIHtcbiAgICB3aWR0aDogNnB4O1xuICAgIGhlaWdodDogMTFweDtcbiAgICByaWdodDogNTAlO1xuICAgIG1hcmdpbi1yaWdodDogLTNweDtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOHB4IDBcbn1cblxuLnR1aS1jYWxlbmRhci50dWktY2FsZW5kYXIteWVhciAudHVpLWNhbGVuZGFyLWJ0bi1wcmV2LXllYXIsIC50dWktY2FsZW5kYXIudHVpLWNhbGVuZGFyLXllYXIgLnR1aS1jYWxlbmRhci1idG4tbmV4dC15ZWFyIHtcbiAgICB3aWR0aDogNTBweFxufVxuXG4udHVpLWRhdGVwaWNrZXIge1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNhYWE7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xufVxuXG4udHVpLWRhdGVwaWNrZXIgKiB7XG4gICAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuXG4udHVpLWRhdGVwaWNrZXItdHlwZS1kYXRlIHtcbiAgICB3aWR0aDogMjc0cHg7XG59XG5cbi50dWktZGF0ZXBpY2tlci1ib2R5IC50dWktY2FsZW5kYXItbW9udGgsIC50dWktZGF0ZXBpY2tlci1ib2R5IC50dWktY2FsZW5kYXIteWVhciB7XG4gICAgd2lkdGg6IGF1dG87XG59XG5cbi50dWktZGF0ZXBpY2tlciAudHVpLWNhbGVuZGFyIHtcbiAgICBib3JkZXI6IDA7XG59XG5cbi50dWktZGF0ZXBpY2tlciAudHVpLWNhbGVuZGFyLXRpdGxlIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi50dWktZGF0ZXBpY2tlciAudHVpLWNhbGVuZGFyLXRpdGxlLnR1aS1jYWxlbmRhci10aXRsZS15ZWFyLXRvLXllYXIge1xuICAgIGN1cnNvcjogYXV0bztcbn1cblxuLnR1aS1kYXRlcGlja2VyLWJvZHkgLnR1aS10aW1lcGlja2VyLCAudHVpLWRhdGVwaWNrZXItZm9vdGVyIC50dWktdGltZXBpY2tlciB7XG4gICAgd2lkdGg6IDI3NHB4O1xuICAgIHBvc2l0aW9uOiBzdGF0aWM7XG4gICAgcGFkZGluZzogMjBweCA0NnB4IDIwcHggNDdweDtcbiAgICBib3JkZXI6IDBcbn1cblxuLnR1aS1kYXRlcGlja2VyLWZvb3RlciAudHVpLXRpbWVwaWNrZXIge1xuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZWVlXG59XG5cbi50dWktZGF0ZXBpY2tlci1zZWxlY3RvciB7XG4gICAgcGFkZGluZzogMTBweDtcbiAgICBmb250LXNpemU6IDA7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZWVlXG59XG5cbi50dWktZGF0ZXBpY2tlci1zZWxlY3Rvci1idXR0b24ge1xuICAgIHdpZHRoOiA1MCU7XG4gICAgaGVpZ2h0OiAyNnB4O1xuICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICBsaW5lLWhlaWdodDogMjNweDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgY29sb3I6ICM3Nzc7XG4gICAgb3V0bGluZTogbm9uZTtcbiAgICBjdXJzb3I6IHBvaW50ZXJcbn1cblxuLnR1aS1kYXRlcGlja2VyLXNlbGVjdG9yLWJ1dHRvbi50dWktaXMtY2hlY2tlZCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTtcbiAgICBjb2xvcjogIzMzM1xufVxuXG4udHVpLWRhdGVwaWNrZXItc2VsZWN0b3ItYnV0dG9uKy50dWktZGF0ZXBpY2tlci1zZWxlY3Rvci1idXR0b24ge1xuICAgIG1hcmdpbi1sZWZ0OiAtMXB4XG59XG5cbi50dWktZGF0ZXBpY2tlci1zZWxlY3Rvci1idXR0b24gW2NsYXNzXj10dWktaWNvLV0ge1xuICAgIG1hcmdpbjogNXB4IDlweCAwIDA7XG4gICAgdmVydGljYWwtYWxpZ246IHRvcDtcbn1cblxuLnR1aS1kYXRlcGlja2VyLXNlbGVjdG9yLWJ1dHRvbi50dWktaXMtY2hlY2tlZCAudHVpLWljby1kYXRlLCAudHVpLWRhdGVwaWNrZXItaW5wdXQudHVpLWhhcy1mb2N1cyAudHVpLWljby1kYXRlIHtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTdweCAtMTRweFxufVxuXG4udHVpLWRhdGVwaWNrZXItc2VsZWN0b3ItYnV0dG9uLnR1aS1pcy1jaGVja2VkIC50dWktaWNvLXRpbWUge1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IDAgLTQ0cHhcbn1cblxuLnR1aS1kYXRlcGlja2VyLWFyZWEge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZVxufVxuXG4udHVpLWRhdGVwaWNrZXItaW5wdXQge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgd2lkdGg6IDEyMHB4O1xuICAgIGhlaWdodDogMjhweDtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkZGRcbn1cblxuLnR1aS1kYXRlcGlja2VyLWlucHV0ICoge1xuICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cblxuLnR1aS1kYXRlcGlja2VyLWlucHV0ID4gaW5wdXQge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBwYWRkaW5nOiA2cHggMjdweCA2cHggMTBweDtcbiAgICBmb250LXNpemU6IDEycHg7XG4gICAgbGluZS1oZWlnaHQ6IDE0cHg7XG4gICAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgICBib3JkZXI6IDA7XG4gICAgY29sb3I6ICMzMzNcbn1cblxuLnR1aS1kYXRlcGlja2VyLWlucHV0ID4gLnR1aS1pY28tZGF0ZSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogNTAlO1xuICAgIHJpZ2h0OiA4cHg7XG4gICAgbWFyZ2luOiAtNnB4IDAgMCAwXG59XG5cbi50dWktZGF0ZXBpY2tlci1pbnB1dC50dWktaGFzLWZvY3VzIHtcbiAgICBib3JkZXItY29sb3I6ICNhYWFcbn1cblxuLnR1aS1kYXRldGltZS1pbnB1dCB7XG4gICAgd2lkdGg6IDE3MHB4XG59XG5cbi50dWktZGF0ZXBpY2tlciAudHVpLWlzLWJsb2NrZWQge1xuICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICBjb2xvcjogI2RkZFxufVxuXG4udHVpLWRhdGVwaWNrZXIgLnR1aS1pcy12YWxpZCB7XG4gICAgY29sb3I6ICM5OTlcbn1cblxuLnR1aS1kYXRlcGlja2VyIC50dWktaXMtc2VsZWN0YWJsZTpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2VkZjRmYztcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi50dWktZGF0ZXBpY2tlciAudHVpLWlzLXNlbGVjdGFibGUudHVpLWlzLXNlbGVjdGVkLCAudHVpLWRhdGVwaWNrZXIudHVpLXJhbmdlcGlja2VyIC50dWktaXMtc2VsZWN0YWJsZS50dWktaXMtc2VsZWN0ZWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICM0Yjk2ZTY7XG4gICAgY29sb3I6ICNmZmZcbn1cblxuLnR1aS1kYXRlcGlja2VyLnR1aS1yYW5nZXBpY2tlciAudHVpLWlzLXNlbGVjdGVkLXJhbmdlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWRmNGZjO1xufVxuXG4udHVpLWRhdGVwaWNrZXItZHJvcGRvd24ge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB3aWR0aDogMTIwcHhcbn1cblxuLnR1aS1kYXRlcGlja2VyLWRyb3Bkb3duIC50dWktZHJvcGRvd24tYnV0dG9uIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDI4cHg7XG4gICAgcGFkZGluZzogMCAxMHB4O1xuICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICBsaW5lLWhlaWdodDogMjBweDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xuICAgIHBhZGRpbmc6IDAgMzBweCAwIDEwcHg7XG4gICAgdGV4dC1hbGlnbjogbGVmdDtcbiAgICBiYWNrZ3JvdW5kOiAjZmZmO1xuICAgIGN1cnNvcjogcG9pbnRlclxufVxuXG4udHVpLWRhdGVwaWNrZXItZHJvcGRvd24ge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZVxufVxuXG4udHVpLWRhdGVwaWNrZXItZHJvcGRvd24gLnR1aS1pY28tY2FyZXQge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDEycHg7XG4gICAgcmlnaHQ6IDEwcHhcbn1cblxuLnR1aS1kYXRlcGlja2VyLWRyb3Bkb3duIC50dWktZHJvcGRvd24tbWVudSB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAyN3B4O1xuICAgIGxlZnQ6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgcGFkZGluZzogNXB4IDA7XG4gICAgbWFyZ2luOiAwO1xuICAgIG92ZXJmbG93LXk6IGF1dG87XG4gICAgbWluLXdpZHRoOiAwO1xuICAgIG1heC1oZWlnaHQ6IDE5OHB4O1xuICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xuICAgIGJvcmRlci10b3AtY29sb3I6ICNmZmY7XG4gICAgei1pbmRleDogMTA7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBib3gtc2hhZG93OiBub25lO1xuICAgIGJvcmRlci1yYWRpdXM6IDBcbn1cblxuLnR1aS1kYXRlcGlja2VyLWRyb3Bkb3duLnR1aS1pcy1vcGVuIC50dWktZHJvcGRvd24tYnV0dG9uIHtcbiAgICBkaXNwbGF5OiBibG9ja1xufVxuXG4udHVpLWRhdGVwaWNrZXItZHJvcGRvd24udHVpLWlzLW9wZW4gLnR1aS1kcm9wZG93bi1tZW51LCAudHVpLWRhdGVwaWNrZXItZHJvcGRvd24udHVpLWlzLW9wZW4gLnR1aS1kcm9wZG93bi1idXR0b24ge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJvcmRlci1jb2xvcjogI2FhYVxufVxuXG4udHVpLWRhdGVwaWNrZXItZHJvcGRvd24udHVpLWlzLW9wZW4gLnR1aS1pY28tY2FyZXQge1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0yMXB4IC0yOHB4XG59XG5cbi50dWktZGF0ZXBpY2tlci1kcm9wZG93biAudHVpLW1lbnUtaXRlbSB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGhlaWdodDogMjhweDtcbiAgICBsaW5lLWhlaWdodDogMjhweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgIHotaW5kZXg6IDEwXG59XG5cbi50dWktZGF0ZXBpY2tlci1kcm9wZG93biAudHVpLW1lbnUtaXRlbS1idG4ge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBmb250LXNpemU6IDEycHg7XG4gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgICBsaW5lLWhlaWdodDogMjhweDtcbiAgICBwYWRkaW5nOiAwIDEwcHggMCAzMHB4O1xuICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgY29sb3I6ICMzMzM7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICBib3JkZXI6IDA7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIHotaW5kZXg6IDlcbn1cblxuLnR1aS1kYXRlcGlja2VyLWRyb3Bkb3duIC50dWktbWVudS1pdGVtLWJ0bjpob3ZlciwgLnR1aS1tZW51LWl0ZW0tYnRuOmZvY3VzLCAudHVpLW1lbnUtaXRlbS1idG46YWN0aXZlIHtcbiAgICBjb2xvcjogIzMzMztcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjRmNGY0XG59XG5cbi50dWktZGF0ZXBpY2tlci1kcm9wZG93biAudHVpLW1lbnUtaXRlbSAudHVpLWljby1jaGVjayB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB3aWR0aDogMTBweDtcbiAgICBoZWlnaHQ6IDhweDtcbiAgICB0b3A6IDEwcHg7XG4gICAgbGVmdDogMTBweDtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzFweCAtNTRweDtcbiAgICB6LWluZGV4OiAxMDtcbiAgICBjb250ZW50OiAnYWFhJ1xufVxuXG4udHVpLWRhdGVwaWNrZXItZHJvcGRvd24gLnR1aS1tZW51LWl0ZW0udHVpLWlzLXNlbGVjdGVkIC50dWktaWNvLWNoZWNrIHtcbiAgICBkaXNwbGF5OiBibG9ja1xufVxuXG4udHVpLWRhdGVwaWNrZXItZHJvcGRvd24gLnR1aS1tZW51LWl0ZW0udHVpLWlzLXNlbGVjdGVkIC50dWktbWVudS1pdGVtLWJ0biB7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGRcbn1cblxuLnR1aS1kcm9wZG93bi1hcmVhIHtcbiAgICBmb250LXNpemU6IDBcbn1cblxuLnR1aS1kcm9wZG93bi1hcmVhIC50dWktZGF0ZXBpY2tlci1kcm9wZG93bisudHVpLWRhdGVwaWNrZXItZHJvcGRvd24ge1xuICAgIG1hcmdpbi1sZWZ0OiA1cHhcbn1cblxuLnR1aS1oaWRkZW4ge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbiIsIi8qIVxuICogVE9BU1QgVUkgVGltZSBQaWNrZXJcbiAqIEB2ZXJzaW9uIDIuMS40XG4gKiBAYXV0aG9yIE5ITiBGRSBEZXZlbG9wbWVudCBMYWIgPGRsX2phdmFzY3JpcHRAbmhuLmNvbT5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5AY2hhcnNldCAndXRmLTgnO1xuLnR1aS10aW1lcGlja2VyICoge1xuICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cblxuLnR1aS10aW1lcGlja2VyIGJ1dHRvbiB7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbn1cblxuLnR1aS10aW1lcGlja2VyIGlucHV0LCAudHVpLXRpbWVwaWNrZXIgc2VsZWN0IHtcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xufVxuXG4udHVpLWljby10LWJ0biwgLnR1aS10aW1lcGlja2VyLWlucHV0LXJhZGlvLCAudHVpLWljby1jb2xvbiwgLnR1aS1pY28tdGltZSB7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgd2lkdGg6IDFweDtcbiAgICBoZWlnaHQ6IDFweDtcbiAgICBsaW5lLWhlaWdodDogMzAwcHg7XG4gICAgYmFja2dyb3VuZDogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQzhBQUFBK0NBWUFBQUM3clVLU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBMlpwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVNeTFqTURFeElEWTJMakUwTlRZMk1Td2dNakF4TWk4d01pOHdOaTB4TkRvMU5qb3lOeUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBFUmpkR016a3pPRFZFUWtSRk5qRXhRa1ZDTWpsRE9VRkROelpETTBFNU5DSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzFPRFZDUlRjNE5rTTJRa1F4TVVVMk9UZ3pNemhHUWpaRk1qY3lNVFExUlNJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvMU9EVkNSVGM0TlVNMlFrUXhNVVUyT1Rnek16aEdRalpGTWpjeU1UUTFSU0lnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRMU0ySUNoWGFXNWtiM2R6S1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09qRkVSRU5ETVRjMFFqbEROa1UyTVRFNU9UYzBRakl3T1RZM1FrUXpOalpCSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tSR04wWXpPVE00TlVSQ1JFVTJNVEZDUlVJeU9VTTVRVU0zTmtNelFUazBJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQ2xhWWZ3QUFDY0ZKUkVGVWVOckVXZ3R3Vk9VVlBudDM3KzRtbXlVaGtTUUxHRWlnUTR1UlFpRUlUZTBVMERqaW82MUFyTnFwUWd1V2R0ckt0TnFLTTlXMlk2c09IYVdkVWFFdm1WWnRRYVlqZzhaSFU2ekZBcFg0R0FHZGlZYUhRbUlTa3MxcjJVZXl0K2ZjUFhkejkrNjlkLys3MmRRejg4M2Urejkydi8rLzV6Ly85NSs3cnNXTEY0UEIxakJ1NXZ0dkluNklXSVhvTkRiZXRHa1RmU2pnekZ4bS9SUkZnWEE0RE5Gb0ZPTHh1RnJtOVhyQjUvUEIxS2xUd2VWeVpYeUp4NFQ0bnhETnVySS9JaFloWHVVQm5JRkpzT0hoWWVqcDZZSHk4bklvTFMxVlNaUFJJQktKQkp3OGVSSXFLeXVocEtURWxQd05UUHhHeEF2NkNVRjhEL0VnNGw4OGdJNUNFaDhhR29LUmtSR29yYTNOcXZONFVoUnBRSjJkbmVyVENRYURhcG1rSTc2TGliZVlmRDhONEM3RW4va0p6RE56QlVGa0VZOUVJbEJkWFoxemtLRlFTQjBrUFNXTi9HWW0zbXhCWEc4LzVRRWNSTXllNkl3bmswbm83ZTJGcXFvcTRUNDB5Tzd1YnZVSkVQbkxFUmNRNXdUNlhvejRLbUlQNG5TT3RvcHVRU3BtaTVvV0p5MUVwMGJyb3IrL1h5VlBVZVZlUkN1aXdhWlBMZnY4YzRqdjVoRmhzaXdXaTZVWHBoT2pQdFJYVzdDUElTS0lGeEhYczF2b2pYejhaWGFaZTBURG9jVjEyaWlTNUV1ZStrcTZzbDNzLy9zUlYraks1eU5lUWV3UUlCN21KMUtxdTdaMG00bWFNYzcvamYzL05zUS9OQmREL0FyeG0wTC91RGFEV2pnVU5lMkptZlhheDlEc29Ja2JXVm1aeGJXcDI5RE9TVVNLaTRzZGs2ZStVcjZ6ZHZUb1VSVW0wU1VYMGthUnBxK3Z6L0Z2VXgvcWEwVitBK0pOeEhRSGk5TUpVcDFRcTlDVzM5WFZKVXljZGxucVEzMGxDK0swbS82VncrZDBtQVJic21TSitrbGFKUkFJQ0EyQTJsQjdUZDk0TElpdjVFMnJGL0ZQM1gyVzdkeTVNeTlWcWI4aHJVSXoyZEhSQVJVVkZTRExjb1l3STVDcjJBa3pJM0d5UC9DbjdRQUtZZHFNMHM0NU1EQ1FJWW45ZnI4cTJxd2tzUmx4K0Q4TUlDc0tPWkVMSGlaK1p3NWlJZ053Q2Y1bXdUWXJEMnViVlFJenFnMkFqa0QzRmVMSHIzMnMwemg0T2d4OVIzSkJZMW14VzNYNmNHUXNubFRnTmJ4OEZMRlhQM2lQUVFxQTRBQ2N6TERMY0cwcUZCRlB6NTBtTjYxWkdJQ0dXWDd3eTZtbTBZVGlmZjEwZE1YZXQwWld2TitUb0NkL0U2SmJKVjlYVndlZnNGVWdYa1BTODI1ZE5nVWt3L0JvRUpmUExZTEdPVVd3Ni9EZ1Nod0VIWVlhRWVjbDFqQWh3Ui9hd1BMWnljWUZWcWNvdGgzWFhScVl0MzU1SnZHaFdGS0ZabFJIYmFndHEyRFZiWjdXTGNUT0hNVHY0dlhoMUZXczNHWlpaZEM5WnYzeVlMcmdSRmNjZGh3Y2hBOTZFdXI5bkdreTNQNkZLVEMvT2hYM04yRGJJNmVpNjdxSHhwWko3TWZiZUFEVEJZaWZMYURMM0hadGZRQzg3dFNZaVBEV1ovdlN4TTNLWkd6N2xRVUJ1bHd2NlJiaU5nczU0SVM0bGF0WXVjMFZTMmY3MGpkUEhCbUMwV1IySktXeVhWaW4yYUtMMVQ1ZjhwaEVrbFpkNkhSQ1BKLzRYVk05Wlp6Q2ljNjRaY1BqdXJxcW9GczlUM3NzUW1FcjUzQTI1TnBWT2VPV01hdHRiVzJpNU1lU1NVWFdWaXE1Ukd6VWZBNWt0OHU0SFVxU1JTd25GN3Bsc3ZVTVd2dnAvdEZ4cFZuanMxYWh1cm9QVTMzYUpadk42TE1PaU51ZFViVXpiZFpoaHZKRWgwOUcwMlhmdUN3SVpVWFpsS2lNNmpUalBpMmVmUEltZWV5eVlUNFdEaGpxZjcvL1dHUUxSZzg1NkpjQXd5WThzdllpK012clEvRDJSM0cxODhLWlh2aDZReEF1S25HbjRuODBDZnZlaVZEbytaM2U1eW1RZnB1MzMzb3VPOGI3d09Na3JaMm9RNU1uRVRhMjI3ODUxSTc2WnZ1MjF2Q1A3bDFkcnJvK2tieGpSWmw1aGcyLzhkZXRZUmlKSmJmcjNXWUc0Z2pybksyODQ0YjQra3F1bTVISGpJdVUvNlR0VE95NW56L2ZCNFBScE9VWFVoMjFPWXB0cVkrMnczbzVWL01NNG41RG53T01lemhUZGhrbHV2TFI2WFlSQi9GbEpQWEF4cWQ2ZnJENmttSjUyV3cvVkUxSnVjbkhnMk53K0ZRVW5qOGVTZkNNMzgxOVZQSzNJejR5SWE2Mys1azR5ZUhmNXBBRitSaVJ1UlBKUGI3bmplRnZJWnJ3ZmliWEViZVhhSDNRaG11bTU3ZWFrREVTZVJqeFN3dnlacEZFeU5EdjliY2Y4TXplTFhvWStSejlua2lxQmxKdlNDYnFKcE9XN3JOekJicFBHTk1YSnUrMDBta05wMDhHeFpmeXpyazRkQTJPZ2s5T3haSllJZ2trSVM2ZDdpV0Y2VEtTZjROK2p4ZW0zVXcyY09pRUhGSmdKYStqRzNPVXBRMVBTOHBMNzBZZ2l0SmcwVXdmWEZOZm5KWURpVEVGVHAwZmhiWVBZNEFEVTY2YVh3eEZjaXFOSUhFYzN5THdsTFp3V3p0YnllZk1KM0tVWlJCLzVzMWhOYjZ2VzFRQ242cVVNM1FNWFZNWjFkRW10aGZiVWgrTlBLV3VhM0trcjZsdUZyZTFzbFVjYmlrQXROaVVaYmptZ2ZZTFVGTXV3K2ZyL0tCUHk5QlRpT3BFR3RWUkcycjdTdnNGdGErSDQvWTFIT3VYSWg1Qi9KZjdMT1VacDhHdHRvbnhSSElQaTdrV203TE05QjNHY0R3UndTME5SZU81U1BUM1Y5K1BRcytRR3NwaEdzNzJGK2Y2SWNUU3ViSE9oL0poV08ycjdiQm5PWTdUYWVvaDJoc1lEN0U4WG1xajU2ODJJWGwxTHVKazczMGNod1c0RUQwc2lZbnczOStLcEltYmxibXg3Y0laWG5pM0svUE5DR21YN2J3d1N4Z05YQllYU1pzTGxtVkkyOWtWY3ZyK1A2Z1drNHBpb21rVU9LUlRuK1E2WjhPajRLSGM0QVN0aFdlWVpycVpzeEZtWlZsR0NyRlVKNEU3QjhZc2YrU2NyaTdvZDhGd0xKa3g4NlJ4dm84NFJOL0xPTVJsWG9FQjBLTGNyVXRpbVpWbEdIbUxmcWJkTnE4NmpIVUtqTDhCTDRTcWZFRkg5a3Fic3JTVkZybWhiMlJjU2M0cXQ5NHo5WFg5a2FUYVZ6S295dXQ1c3hwbTBQVjFYRWVxMGljNGdNMDV5dEtFT3M2UGI5ckxhLzFRTEdmdmoxUkdkWnAxOUNiVXZwSURWWG1HVldVdUNVQmtieEFvZy9raEx4eEhPWUNiRHZ1eUJNMkxTK0F6MVRJRWZSS1VJT2lheXFpT056VTRobjB1Q1hrblIxV0tHcDVOWFordTlpb3Z2eGNCU2o3UlJrU0VWODB6Znp0SXk0UGFZaCsxcjFRQVZVa1JwVW1nekZTVU5kYjUxUmNlKzQrTnBKK0FoWXhRMjFCYjZnTzZCU3VTRWNoU2xkb2htalZQVTQ0eTZ6eDlmY0JWSG5ERGszandwbmhPcDZjSWtpWFFOWlZSSGJXaHRnVlRsWkQ2djhMTlRQWW1QdldZbGRrYXpXWjl5S3RRb3BXMHl6Qm5pTW1OYW5CeHJrVmhobnRDbGlUV1ZPV0JDYWhLeHdOb2JtNTJmS2padlh0MzVqNVJRRlg1SXBQVXU0dFpXY0ZNMHFuS3RZaG5FU3NRQVFaZDAvOFExdVZRbGNhMTRoY29FOGxBMEtBUDJwR2ZxS3JVakdiMktYYVZmVFpsb2tadStqVzdsS1BIUkZWdXorTUpOcG40ZHBPVEJXdXdCYnlubk9Vc25qbDVlbVdlVHlwRHQ4Tk9oUGhhSmtkL1BOWCtzMGJ1OVNUTGxsc1JmWFp1SS9UM0VodmJhRUp5bytDTXorRVRGLzEzVFhzdCtRRG5TaDltbDdWTmZiZ3NpSXJtWXRZSmxwa1ovZEdVMHRRL1J2d2JVditvSWduK3RvbGtzVnl3Wlo5Z0VvbVNwdmRCNmwwWTZhWW9ML0Nja1UxYnNBTThnTEFvY1NjcFBRSDdHUjkrZm9HNEEzRkNwTlAvQkJnQWRaM0IyeVpnMHZVQUFBQUFTVVZPUks1Q1lJST0pIG5vLXJlcGVhdDtcbn1cblxuLnR1aS10aW1lcGlja2VyIC50dWktdGltZXBpY2tlci1zZWxlY3Qge1xuICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgLW8tYXBwZWFyYW5jZTogbm9uZTtcbiAgICBhcHBlYXJhbmNlOiBub25lO1xuICAgIGJvcmRlci1yYWRpdXM6IDA7XG59XG5cbi50dWktdGltZXBpY2tlciAudHVpLXRpbWVwaWNrZXItc2VsZWN0OjotbXMtZXhwYW5kIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG4udHVpLWNhbGVuZGFyLXNlbGVjdC1jb250ZW50IC50dWktdGltZXBpY2tlciB7XG4gICAgYm9yZGVyOiAwO1xuICAgIG1hcmdpbjogMCBhdXRvO1xufVxuXG4udHVpLXRpbWVwaWNrZXIgaW5wdXQge1xuICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbn1cblxuLnR1aS10aW1lcGlja2VyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgdG9wOiAtMXB4O1xuICAgIHBhZGRpbmc6IDMwcHggMjBweDtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjYWFhO1xuICAgIGJhY2tncm91bmQ6IHdoaXRlO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cblxuLnR1aS10aW1lcGlja2VyLXJvdyB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgZm9udC1zaXplOiAwO1xufVxuXG4udHVpLXRpbWVwaWNrZXItY29sdW1uIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cblxuLnR1aS10aW1lcGlja2VyLWJ0bi1hcmVhIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgaGVpZ2h0OiA4OHB4O1xuICAgIHBhZGRpbmc6IDE5cHggMFxufVxuXG4udHVpLXRpbWVwaWNrZXItc3BpbmJveCB7XG4gICAgd2lkdGg6IDUycHg7XG59XG5cbi50dWktdGltZXBpY2tlci1zZWxlY3Rib3grLnR1aS10aW1lcGlja2VyLXNlbGVjdGJveCB7XG4gICAgcGFkZGluZy1sZWZ0OiA1cHg7XG59XG5cbi50dWktdGltZXBpY2tlci1idG4tYXJlYSAudHVpLXRpbWVwaWNrZXItc3BpbmJveC1pbnB1dCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIGxpbmUtaGVpZ2h0OiA0NnB4O1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG59XG5cbi50dWktdGltZXBpY2tlci1idG4ge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAwO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMjBweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLnR1aS10aW1lcGlja2VyLWJ0bjpob3ZlciwgLnR1aS10aW1lcGlja2VyLWJ0bjpmb2N1cywgLnR1aS10aW1lcGlja2VyLWJ0bjphY3RpdmUge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmNGY0ZjQ7XG59XG5cbi50dWktdGltZXBpY2tlci1idG4tdXAge1xuICAgIHRvcDogMDtcbn1cblxuLnR1aS10aW1lcGlja2VyLWJ0bi1kb3duIHtcbiAgICBib3R0b206IDBcbn1cblxuLnR1aS10aW1lcGlja2VyLWJ0biAudHVpLWljby10LWJ0biB7XG4gICAgd2lkdGg6IDEzcHg7XG4gICAgaGVpZ2h0OiA3cHg7XG59XG5cbi50dWktdGltZXBpY2tlci1idG4tdXAgLnR1aS1pY28tdC1idG4ge1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IDAgLTEycHg7XG59XG5cbi50dWktdGltZXBpY2tlci1idG4tZG93biAudHVpLWljby10LWJ0biB7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMjFweDtcbn1cblxuLnR1aS10aW1lcGlja2VyLWNvbG9uIHtcbiAgICB3aWR0aDogMjJweDtcbn1cblxuLnR1aS10aW1lcGlja2VyLWJvZHkgLnR1aS10aW1lcGlja2VyLWNvbG9uLCAudHVpLXRpbWVwaWNrZXItZm9vdGVyIC50dWktdGltZXBpY2tlci1jb2xvbiB7XG4gICAgd2lkdGg6IDE4cHg7XG59XG5cbi50dWktaWNvLWNvbG9uIHtcbiAgICB3aWR0aDogMnB4O1xuICAgIGhlaWdodDogN3B4O1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xN3B4IC0yOHB4O1xufVxuXG4udHVpLXRpbWVwaWNrZXItc2VsZWN0IHtcbiAgICB3aWR0aDogNTJweDtcbiAgICBoZWlnaHQ6IDI4cHg7XG4gICAgcGFkZGluZzogNXB4IDAgNXB4IDlweDtcbiAgICBmb250LXNpemU6IDEycHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2RkZDtcbiAgICBiYWNrZ3JvdW5kOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFFQ0FZQUFBQ0h0TC9zQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5SnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU15MWpNREV4SURZMkxqRTBOVFkyTVN3Z01qQXhNaTh3TWk4d05pMHhORG8xTmpveU55QWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTlROaUFvVjJsdVpHOTNjeWtpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2TXprMU5EQTJSVFZDUkVJeE1URkZOamhFTlRKRk1qZERORFEzUkRKQ01URWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZNemsxTkRBMlJUWkNSRUl4TVRGRk5qaEVOVEpGTWpkRE5EUTNSREpDTVRFaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEb3pPVFUwTURaRk0wSkVRakV4TVVVMk9FUTFNa1V5TjBNME5EZEVNa0l4TVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvek9UVTBNRFpGTkVKRVFqRXhNVVUyT0VRMU1rVXlOME0wTkRkRU1rSXhNU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHBaNUhQZ0FBQUF4U1VSQlZIamFZalEyTnY3UGdCc3dnb2d6Wjg3Z1ZNQUVVNFJMTXlIQUJLVUZ5TkdNYk1CSEpFT0kxZ3dDQUFFR0FQU2xCUnJOY01BcEFBQUFBRWxGVGtTdVFtQ0MpIG5vLXJlcGVhdDtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAxMDAlIDUwJTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi50dWktdGltZXBpY2tlci1jaGVjay1sc3Qge1xuICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgcGFkZGluZzogMDtcbiAgICBtYXJnaW46IDA7XG59XG5cbi50dWktdGltZXBpY2tlci1jaGVjayB7XG4gICAgbWFyZ2luLXRvcDogMTFweDtcbn1cblxuLnR1aS10aW1lcGlja2VyLWNoZWNrOmZpcnN0LWNoaWxkIHtcbiAgICBtYXJnaW4tdG9wOiAwO1xufVxuXG4udHVpLXRpbWVwaWNrZXItY2hlY2tib3gge1xuICAgIHBhZGRpbmctbGVmdDogMTZweDtcbn1cblxuLnR1aS10aW1lcGlja2VyLXJhZGlvIHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xufVxuXG4udHVpLXRpbWVwaWNrZXItcmFkaW8gaW5wdXQge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAtOTk5OXB4O1xuICAgIHdpZHRoOiAxcHg7XG4gICAgaGVpZ2h0OiAxcHg7XG59XG5cbi50dWktdGltZXBpY2tlci1yYWRpby1sYWJlbCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHBhZGRpbmctbGVmdDogMjBweDtcbiAgICBmb250LXNpemU6IDEycHg7XG4gICAgbGluZS1oZWlnaHQ6IDE2cHg7XG4gICAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgICBjb2xvcjogIzc3NztcbiAgICBjdXJzb3I6IHBvaW50ZXJcbn1cblxuLnR1aS10aW1lcGlja2VyLWlucHV0LXJhZGlvIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgd2lkdGg6IDE2cHg7XG4gICAgaGVpZ2h0OiAxNnB4O1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMxcHggMDtcbn1cblxuLnR1aS10aW1lcGlja2VyLXJhZGlvIC50dWktdGltZXBpY2tlci1tZXJpZGllbS1jaGVja2VkKy50dWktdGltZXBpY2tlci1yYWRpby1sYWJlbCAudHVpLXRpbWVwaWNrZXItaW5wdXQtcmFkaW8ge1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0zMXB4IC0xOHB4O1xufVxuXG4udHVpLXRpbWVwaWNrZXItcmFkaW8gaW5wdXQ6ZGlzYWJsZWQrLnR1aS10aW1lcGlja2VyLXJhZGlvLWxhYmVsIC50dWktdGltZXBpY2tlci1pbnB1dC1yYWRpbyB7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMxcHggLTM2cHg7XG59XG5cbi50dWktaWNvLXRpbWUge1xuICAgIHdpZHRoOiAxMnB4O1xuICAgIGhlaWdodDogMTJweDtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0zMHB4XG59XG5cbi50dWktdGltZXBpY2tlci1hcmVhIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmVcbn1cblxuLnR1aS10aW1lLWlucHV0IHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdpZHRoOiAxMjBweDtcbiAgICBoZWlnaHQ6IDI4cHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2RkZFxufVxuXG4udHVpLXRpbWUtaW5wdXQgaW5wdXQge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBwYWRkaW5nOiAwIDI3cHggMCAxMHB4O1xuICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICBib3JkZXI6IDA7XG4gICAgY29sb3I6ICMzMzM7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveFxufVxuXG4udHVpLXRpbWUtaW5wdXQgLnR1aS1pY28tdGltZSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogNTAlO1xuICAgIHJpZ2h0OiA4cHg7XG4gICAgbWFyZ2luOiAtNnB4IDAgMCAwXG59XG5cbi50dWktdGltZS1pbnB1dC50dWktaGFzLWZvY3VzIHtcbiAgICBib3JkZXItY29sb3I6ICNhYWFcbn1cblxuLnR1aS10aW1lLWlucHV0IC50dWktaWNvLXRpbWUge1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IDAgLTMwcHhcbn1cblxuLnR1aS10aW1lLWlucHV0LnR1aS1oYXMtZm9jdXMgLnR1aS1pY28tdGltZSB7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtNDRweFxufVxuXG4udHVpLWhhcy1sZWZ0LnR1aS10aW1lcGlja2VyLWJvZHksIC50dWktaGFzLWxlZnQgLnR1aS10aW1lcGlja2VyLXJvdyB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4udHVpLWhhcy1sZWZ0IC50dWktdGltZXBpY2tlci1yb3c6YWZ0ZXIge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGNsZWFyOiBib3RoO1xuICAgIGNvbnRlbnQ6ICcnO1xufVxuXG4udHVpLWhhcy1sZWZ0IC50dWktaXMtYWRkLXBpY2tlciB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gICAgcGFkZGluZzogMCA1cHggMCAwO1xufVxuXG4udHVpLWhhcy1sZWZ0IC50dWktdGltZXBpY2tlci1jaGVja2JveCB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gICAgbWFyZ2luLXRvcDogMjNweDtcbiAgICBwYWRkaW5nOiAwIDE2cHggMCAwO1xufVxuXG4udHVpLWhpZGRlbiB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuIl0sInNvdXJjZVJvb3QiOiIifQ==*/ \ No newline at end of file +/*# sourceMappingURL=TUI.blazorCalendar.css.map*/ \ No newline at end of file diff --git a/toast_ui.blazor_calendar/wwwroot/TUI.blazorCalendar.css.map b/toast_ui.blazor_calendar/wwwroot/TUI.blazorCalendar.css.map new file mode 100644 index 0000000..de763b0 --- /dev/null +++ b/toast_ui.blazor_calendar/wwwroot/TUI.blazorCalendar.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack://NpmJS/./node_modules/tui-calendar/dist/tui-calendar.css","webpack://NpmJS/tui.Calendar/src/css/common.styl","webpack://NpmJS/tui.Calendar/main.styl","webpack://NpmJS/tui.Calendar/src/css/variables.styl","webpack://NpmJS/tui.Calendar/src/css/weekday.styl","webpack://NpmJS/tui.Calendar/src/css/week/layout.styl","webpack://NpmJS/tui.Calendar/src/css/week/dayname.styl","webpack://NpmJS/tui.Calendar/src/css/week/daygrid.styl","webpack://NpmJS/tui.Calendar/src/css/week/time.styl","webpack://NpmJS/tui.Calendar/src/css/month.styl","webpack://NpmJS/tui.Calendar/src/css/vlayout.styl","webpack://NpmJS/tui.Calendar/src/css/popup.styl","webpack://NpmJS/tui.Calendar/src/css/icons.styl","webpack://NpmJS/./node_modules/tui-date-picker/dist/tui-date-picker.css","webpack://NpmJS/./node_modules/tui-time-picker/dist/tui-time-picker.css"],"names":[],"mappings":"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","file":"TUI.blazorCalendar.css","sourcesContent":["/*!\n * TOAST UI Calendar\n * @version 1.15.3 | Thu Feb 17 2022\n * @author NHN FE Development Lab \n * @license MIT\n */\n.tui-full-calendar-layout {\n height: 100%;\n position: relative;\n box-sizing: border-box;\n}\n.tui-full-calendar-layout * {\n box-sizing: border-box;\n}\n.tui-full-calendar-dragging {\n cursor: move;\n}\n.tui-full-calendar-resizing {\n cursor: row-resize;\n}\n.tui-full-calendar-resizing-x {\n cursor: col-resize;\n}\n.tui-full-calendar-hidden {\n display: none !important;\n}\n.tui-full-calendar-invisible span {\n visibility: hidden;\n}\n.tui-full-calendar-clear:after {\n content: '';\n display: block;\n clear: both;\n}\n.tui-full-calendar-scroll-y {\n overflow-y: scroll;\n}\n.tui-full-calendar-dot {\n display: inline-block;\n position: relative;\n top: -1px;\n content: '';\n width: 7px;\n height: 7px;\n border-radius: 50%;\n}\n.tui-full-calendar-holiday {\n color: #f00;\n}\n.tui-full-calendar-today {\n background: rgba(218,229,249,0.3);\n}\n.handle-x {\n background-position: center center;\n background-repeat: no-repeat;\n background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAECAMAAACEE47CAAAACVBMVEX///////////+OSuX+AAAAA3RSTlMrQJG5H4EIAAAAEUlEQVR4AWNgYoRABhjEFAEAArQAIcHQcPsAAAAASUVORK5CYII=);\n}\n.handle-y {\n background-position: center center;\n background-repeat: no-repeat;\n background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAICAMAAADp7a43AAAACVBMVEX///////////+OSuX+AAAAA3RSTlMrQJG5H4EIAAAAEUlEQVR4AWNgYmRiZABB/CwAAtgAIUTUNkMAAAAASUVORK5CYII=);\n}\n@media only screen and (-moz-min-device-pixel-ratio: 1.5), only screen and (-o-min-device-pixel-ratio: 3/2), only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-devicepixel-ratio: 1.5), only screen and (min-resolution: 1.5dppx) {\n .handle-x {\n background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAMAAADHqI+lAAAACVBMVEX///////////+OSuX+AAAAA3RSTlMZK5EY+QKaAAAAGUlEQVR4AWNgYmJAwegCIMDIiIwxBKhhBgAcSABh8gN42gAAAABJRU5ErkJggg==);\n background-size: 8px 4px;\n }\n .handle-y {\n background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAQCAMAAAAcVM5PAAAACVBMVEX///////////+OSuX+AAAAA3RSTlMEK5EMBzK5AAAAGElEQVR4AWNgYmIAYxgDBBgZQRjOoKcaABzQAGGjsIM/AAAAAElFTkSuQmCC);\n background-size: 4px 8px;\n }\n}\n.tui-full-calendar-month-week-item .tui-full-calendar-weekday-grid {\n overflow-y: hidden;\n}\n.tui-full-calendar-month-week-item .tui-full-calendar-weekday-schedules {\n overflow-y: visible;\n height: 0;\n}\n.tui-full-calendar-month-week-item .tui-full-calendar-weekday-schedule {\n margin: 0 10px;\n}\n.tui-full-calendar-month-week-item .tui-full-calendar-today {\n background: none;\n}\n.tui-full-calendar-month-week-item .tui-full-calendar-today .tui-full-calendar-weekday-grid-date-decorator {\n display: inline-block;\n width: 27px;\n height: 27px;\n line-height: 27px;\n text-align: center;\n background: #135de6;\n border-radius: 50%;\n color: #fff;\n font-weight: bold;\n margin-left: 2px;\n}\n.tui-full-calendar-weekday-grid,\n.tui-full-calendar-weekday-grid-line {\n height: 100%;\n min-height: inherit;\n}\n.tui-full-calendar-weekday-grid {\n position: absolute;\n width: 100%;\n overflow-y: scroll;\n}\n.tui-full-calendar-weekday-border {\n border-top: 1px solid #ddd;\n}\n.tui-full-calendar-weekday-grid-line {\n position: absolute;\n padding: 3px;\n}\n.tui-full-calendar-weekday-grid-line .tui-full-calendar-weekday-grid-footer {\n position: absolute;\n bottom: 4px;\n}\n.tui-full-calendar-weekday-grid-line .tui-full-calendar-weekday-grid-date {\n display: inline-block;\n width: 27px;\n height: 27px;\n line-height: 27px;\n text-align: center;\n}\n.tui-full-calendar-weekday-grid-line .tui-full-calendar-weekday-grid-more-schedules {\n float: right;\n display: inline-block;\n height: 27px;\n line-height: 27px;\n padding: 0 5px;\n text-align: center;\n font-size: 11px;\n font-weight: bold;\n color: #aaa;\n}\n.tui-full-calendar-weekday-creation {\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n position: absolute;\n overflow-y: scroll;\n}\n.tui-full-calendar-weekday-schedules {\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n position: absolute;\n font-size: 12px;\n overflow-y: scroll;\n}\n.tui-full-calendar-weekday-schedule-block {\n position: absolute;\n}\n.tui-full-calendar-weekday-schedule-block-dragging-dim {\n opacity: 0.3;\n}\n.tui-full-calendar-weekday-schedule {\n position: relative;\n margin: 0 10px 0 1px;\n cursor: pointer;\n border-left-style: solid;\n border-left-width: 3px;\n}\n.tui-full-calendar-weekday-schedule.tui-full-calendar-weekday-schedule-time {\n border-left-width: 0;\n}\n.tui-full-calendar-weekday-schedule.tui-full-calendar-weekday-schedule-time .tui-full-calendar-weekday-schedule-title {\n padding-left: 9px;\n}\n.tui-full-calendar-weekday-schedule-bullet {\n position: absolute;\n padding: 0;\n width: 6px;\n height: 6px;\n top: 6px;\n left: 0;\n border-radius: 50%;\n}\n.tui-full-calendar-weekday-schedule-bullet-focused {\n left: 10px;\n background: #fff;\n}\n.tui-full-calendar-weekday-schedule-title {\n display: block;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n padding-left: 3px;\n font-weight: bold;\n}\n.tui-full-calendar-weekday-schedule-title-focused {\n padding-left: 16px;\n}\n.tui-full-calendar-weekday-schedule-cover {\n position: absolute;\n top: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(0,0,0,0.2);\n box-shadow: 0 2px 6px 0 rgba(0,0,0,0.1);\n}\n.tui-full-calendar-weekday-exceed-left .tui-full-calendar-weekday-schedule {\n margin-left: 0;\n border-left-width: 0;\n}\n.tui-full-calendar-weekday-exceed-right .tui-full-calendar-weekday-schedule {\n margin-right: 0;\n}\n.tui-full-calendar-weekday-exceed-right .tui-full-calendar-weekday-resize-handle {\n display: none;\n}\n.tui-full-calendar-weekday-exceed-in-month {\n cursor: pointer;\n}\n.tui-full-calendar-weekday-exceed-in-month:hover {\n background-color: #f0f1f5;\n}\n.tui-full-calendar-weekday-exceed-in-week,\n.tui-full-calendar-weekday-collapse-btn {\n position: absolute;\n bottom: 5px;\n margin-right: 5px;\n font-size: 12px;\n line-height: 14px;\n cursor: pointer;\n padding: 1px 5px;\n background-color: #fff;\n border: 1px solid #ddd;\n color: #000;\n}\n.tui-full-calendar-weekday-resize-handle {\n position: absolute;\n top: 0;\n right: 0;\n width: 6px;\n background-position: 3px center;\n cursor: col-resize;\n line-height: 18px;\n}\n.tui-full-calendar-weekday-filled {\n background-color: #e8e8e8 !important;\n}\n.tui-full-calendar-left {\n height: 100%;\n float: left;\n box-sizing: border-box;\n display: table;\n}\n.tui-full-calendar-left-content {\n display: table-cell;\n vertical-align: middle;\n text-align: right;\n font-size: 11px;\n}\n.tui-full-calendar-right {\n height: 100%;\n overflow-y: scroll;\n position: relative;\n}\n.tui-full-calendar-week-container {\n width: 100%;\n height: inherit;\n display: inline-block;\n font-size: 10px;\n min-height: 600px;\n}\n.tui-full-calendar-week-container .tui-full-calendar-today {\n background: none;\n}\n.tui-full-calendar-dayname {\n position: absolute;\n margin-left: -1px;\n height: 100%;\n overflow: hidden;\n}\n.tui-full-calendar-dayname.tui-full-calendar-today {\n font-weight: bold;\n}\n.tui-full-calendar-dayname-container {\n overflow-y: scroll;\n}\n.tui-full-calendar-dayname-leftmargin {\n position: relative;\n height: 100%;\n}\n.tui-full-calendar-dayname-date {\n font-size: 26px;\n}\n.tui-full-calendar-dayname-name {\n font-weight: bold;\n font-size: 12px;\n}\n.tui-full-calendar-daygrid-layout {\n height: 100%;\n}\n.tui-full-calendar-daygrid-layout .tui-full-calendar-right {\n overflow-y: hidden;\n}\n.tui-full-calendar-daygrid-guide-creation-block {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n}\n.tui-full-calendar-timegrid-container {\n height: 100%;\n position: relative;\n overflow: hidden;\n overflow-y: scroll;\n}\n.tui-full-calendar-timegrid-container-split {\n height: 100%;\n position: relative;\n overflow: hidden;\n}\n.tui-full-calendar-timegrid-left {\n position: absolute;\n}\n.tui-full-calendar-timegrid-hour {\n position: relative;\n color: #555;\n box-sizing: border-box;\n}\n.tui-full-calendar-timegrid-hour:first-child span {\n display: none;\n}\n.tui-full-calendar-timegrid-hour:last-child {\n border-bottom: none;\n}\n.tui-full-calendar-timegrid-hour span {\n position: absolute;\n top: -11px;\n left: 0;\n right: 5px;\n text-align: right;\n line-height: 25px;\n}\n.tui-full-calendar-timegrid-right {\n position: relative;\n}\n.tui-full-calendar-timegrid-gridline {\n border-bottom: 1px solid #eee;\n box-sizing: border-box;\n}\n.tui-full-calendar-timegrid-gridline:last-child {\n border-bottom: none;\n}\n.tui-full-calendar-timegrid-schedules {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n cursor: pointer;\n}\n.tui-full-calendar-timegrid-hourmarker {\n position: absolute;\n width: 100%;\n display: table;\n}\n.tui-full-calendar-timegrid-hourmarker-line-left {\n position: absolute;\n min-height: 1px;\n left: 0;\n}\n.tui-full-calendar-timegrid-hourmarker-line-today {\n position: absolute;\n min-height: 1px;\n}\n.tui-full-calendar-timegrid-hourmarker-line-right {\n position: absolute;\n min-height: 1px;\n right: 0;\n}\n.tui-full-calendar-timegrid-hourmarker-time {\n padding-right: 5px;\n line-height: 12px;\n text-align: right;\n display: table-cell;\n vertical-align: bottom;\n}\n.tui-full-calendar-timegrid-todaymarker {\n position: absolute;\n text-indent: -9999px;\n width: 9px;\n height: 9px;\n background-color: #135de6;\n margin: -4px 0 0 -5px;\n border-radius: 50%;\n}\n.tui-full-calendar-timegrid-sticky-container {\n position: absolute;\n top: 0;\n}\n.tui-full-calendar-timegrid-timezone-label-container {\n position: absolute;\n}\n.tui-full-calendar-timegrid-timezone-label-cell {\n display: table;\n}\n.tui-full-calendar-timegrid-timezone-label {\n display: table-cell;\n vertical-align: middle;\n padding-right: 5px;\n text-align: right;\n}\n.tui-full-calendar-timegrid-timezone-close-btn {\n cursor: pointer;\n position: absolute;\n text-align: center;\n background-color: #fff;\n}\n.tui-full-calendar-timegrid-timezone-close-btn .tui-full-calendar-icon {\n width: 5px;\n height: 10px;\n}\n.tui-full-calendar-time-date {\n position: absolute;\n height: 100%;\n margin-left: -1px;\n box-sizing: content-box;\n}\n.tui-full-calendar-time-date:last-child {\n border-right: none;\n margin: 0;\n}\n.tui-full-calendar-time-date:last-child .tui-full-calendar-time-schedule,\n.tui-full-calendar-time-date:last-child .tui-full-calendar-time-guide-creation {\n left: 0px;\n}\n.tui-full-calendar-time-date-schedule-block-wrap {\n position: relative;\n height: 100%;\n}\n.tui-full-calendar-time-date-schedule-block {\n position: absolute;\n right: 0px;\n}\n.tui-full-calendar-time-date-schedule-block-pending {\n opacity: 0.7;\n}\n.tui-full-calendar-time-date-schedule-block-dragging-dim {\n opacity: 0.3;\n}\n.tui-full-calendar-time-date-schedule-block-focused {\n box-shadow: 0 0 8px 0 rgba(0,0,0,0.2);\n}\n.tui-full-calendar-time-date-schedule-block-cover {\n position: absolute;\n top: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(0,0,0,0.2);\n box-shadow: 0 2px 6px 0 rgba(0,0,0,0.1);\n}\n.tui-full-calendar-time-schedule {\n position: relative;\n left: 1px;\n height: 100%;\n overflow: hidden;\n font-size: 12px;\n font-weight: bold;\n}\n.tui-full-calendar-time-schedule-content {\n overflow: hidden;\n border-left-width: 3px;\n border-left-style: solid;\n padding: 1px 0 0 3px;\n}\n.tui-full-calendar-time-schedule-content-travel-time {\n font-weight: normal;\n font-size: 11px;\n}\n.tui-full-calendar-time-resize-handle {\n position: absolute;\n right: 0px;\n bottom: 0px;\n left: 0px;\n height: 5px;\n text-align: center;\n color: #fff;\n cursor: row-resize;\n background-position: center top;\n}\n.tui-full-calendar-time-guide-creation {\n position: absolute;\n right: 10px;\n left: 1px;\n padding: 3px;\n}\n.tui-full-calendar-time-guide-move .tui-full-calendar-time-schedule,\n.tui-full-calendar-time-guide-resize .tui-full-calendar-time-schedule,\n.tui-full-calendar-time-guide-move .tui-full-calendar-time-resize-handle,\n.tui-full-calendar-time-guide-resize .tui-full-calendar-time-resize-handle {\n opacity: 0.8;\n z-index: 97;\n}\n.tui-full-calendar-time-guide-creation-label {\n cursor: default;\n}\n.tui-full-calendar-time-guide-bottom {\n position: absolute;\n bottom: 3px;\n}\n.tui-full-calendar-month {\n height: 100%;\n min-height: 600px;\n}\n.tui-full-calendar-month-dayname {\n width: 100%;\n position: absolute;\n font-size: 13px;\n}\n.tui-full-calendar-month-dayname-item {\n height: 100%;\n font-weight: bold;\n}\n.tui-full-calendar-month-week-item {\n position: relative;\n}\n.tui-full-calendar-month-week-item>div {\n height: 100%;\n}\n.tui-full-calendar-month-more {\n height: inherit;\n min-width: 280px;\n min-height: 150px;\n}\n.tui-full-calendar-month-more-title {\n position: relative;\n}\n.tui-full-calendar-month-more-title-day {\n font-size: 23px;\n color: #333;\n}\n.tui-full-calendar-month-more-title-day-label {\n font-size: 12px;\n color: #333;\n}\n.tui-full-calendar-month-more-close {\n position: absolute;\n right: 0;\n outline: 0;\n background: none;\n border: 0;\n font-size: 14px;\n line-height: 28px;\n padding: 0 7px;\n cursor: pointer;\n}\n.tui-full-calendar-month-more-list {\n overflow-y: auto;\n}\n.tui-full-calendar-month-more-schedule {\n cursor: pointer;\n display: block;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 12px;\n}\n.tui-full-calendar-month-guide-block {\n position: absolute;\n}\n.tui-full-calendar-month-weekday-schedule {\n margin-top: 2px;\n}\n.tui-full-calendar-month-creation-guide {\n top: 0;\n bottom: -1px;\n left: -1px;\n right: 0;\n position: absolute;\n z-index: 20;\n}\n.tui-full-calendar-month-guide-focused {\n box-shadow: 0 0 8px 0 rgba(0,0,0,0.2);\n}\n.tui-full-calendar-month-guide {\n position: relative;\n padding-left: 3px;\n line-height: 18px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n.tui-full-calendar-month-guide-cover {\n width: 100%;\n position: absolute;\n top: -50%;\n left: -50%;\n background-color: rgba(0,0,0,0.2);\n box-shadow: 0 2px 6px 0 rgba(0,0,0,0.1);\n}\n.tui-full-calendar-month-exceed-left .tui-full-calendar-month-guide {\n margin-left: 0px;\n}\n.tui-full-calendar-month-exceed-right .tui-full-calendar-month-guide {\n margin-right: 0px;\n}\n.tui-full-calendar-month-exceed-right .tui-full-calendar-month-guide-handle {\n display: none;\n}\n.tui-full-calendar-month-guide-handle {\n position: absolute;\n top: 0;\n right: 3px;\n width: 6px;\n background-position: 3px center;\n cursor: col-resize;\n}\n.tui-full-calendar-vlayout-container {\n position: relative;\n}\n.tui-full-calendar-splitter {\n clear: left;\n cursor: row-resize;\n}\n.tui-full-calendar-splitter:hover {\n border-color: #999;\n}\n.tui-full-calendar-splitter-focused {\n background-color: #ddd;\n border: none;\n}\n.tui-full-calendar-splitter-guide {\n position: absolute;\n width: 100%;\n height: 3px;\n border: none;\n background-color: #e8e8e8;\n}\n.tui-full-calendar-popup {\n position: absolute;\n font-weight: 2.5;\n box-shadow: 0 2px 6px 0 rgba(0,0,0,0.1);\n clear: both;\n}\n.tui-full-calendar-popup-container {\n min-width: 474px;\n box-shadow: 0 2px 6px 0 rgba(0,0,0,0.1);\n background-color: #fff;\n border: solid 1px #d5d5d5;\n padding: 17px;\n border-radius: 2px;\n}\n.tui-full-calendar-popup-section {\n font-size: 0;\n min-height: 40px;\n}\n.tui-full-calendar-section-calendar {\n width: 176px;\n}\n.tui-full-calendar-section-calendar.tui-full-calendar-hide {\n height: 21px;\n visibility: hidden;\n}\n.tui-full-calendar-section-title {\n width: calc(100% - 36px);\n padding-right: 4px;\n}\n.tui-full-calendar-section-title input {\n width: 365px;\n}\n.tui-full-calendar-button.tui-full-calendar-section-private {\n height: 32px;\n padding: 8px;\n font-size: 0;\n margin-left: 4px;\n}\n.tui-full-calendar-section-private.tui-full-calendar-public .tui-full-calendar-ic-private {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAKdJREFUKBVjYCATMKLri46Olvn9+3fX////HUByjIyMB1hZWcuWLl36BFktikaQpl+/fl0EKhBCVgRkv2NjY9NH1syErABkE1TTdqBCWRAG8reDxKBycOUoGmHOA2pIA5kOwiA2SDVMDq4TmREaGvofhJHFcLHhfgwLC9sKNNULl0KQODCgtq1atcobxIY7lZAmkGJkNXCNIAlSwIjSCApqIgJnK0wNALoOPwSpOcq0AAAAAElFTkSuQmCC) no-repeat;\n}\n.tui-full-calendar-section-start-date,\n.tui-full-calendar-section-end-date {\n width: 176px;\n}\n.tui-full-calendar-section-start-date input,\n.tui-full-calendar-section-end-date input {\n width: 139px;\n}\n.tui-full-calendar-section-start-date:hover .tui-full-calendar-popup-section-item,\n.tui-full-calendar-section-end-date:hover .tui-full-calendar-popup-section-item,\n.tui-full-calendar-section-start-date:focus .tui-full-calendar-popup-section-item,\n.tui-full-calendar-section-end-date:focus .tui-full-calendar-popup-section-item,\n.tui-full-calendar-section-start-date:hover .tui-datepicker,\n.tui-full-calendar-section-end-date:hover .tui-datepicker,\n.tui-full-calendar-section-start-date:focus .tui-datepicker,\n.tui-full-calendar-section-end-date:focus .tui-datepicker {\n border-color: #bbb;\n}\n.tui-full-calendar-popup-section-item:focus {\n border-color: #bbb;\n}\n.tui-full-calendar-section-date-dash {\n font-size: 12px;\n color: #d5d5d5;\n height: 32px;\n padding: 0 4px;\n vertical-align: middle;\n}\n.tui-full-calendar-popup-section-item.tui-full-calendar-section-allday {\n border: none;\n padding: 0 0 0 8px;\n cursor: pointer;\n}\n.tui-full-calendar-popup-section-item.tui-full-calendar-section-location {\n display: block;\n}\n.tui-full-calendar-popup-section-item.tui-full-calendar-section-location input {\n width: 400px;\n}\n.tui-full-calendar-section-allday .tui-full-calendar-icon.tui-full-calendar-ic-checkbox {\n margin: 0;\n}\n.tui-full-calendar-popup-section-item.tui-full-calendar-section-allday .tui-full-calendar-content {\n padding-left: 4px;\n}\n.tui-full-calendar-section-state {\n width: 109px;\n}\n.tui-full-calendar-section-state .tui-full-calendar-content {\n width: 58px;\n text-overflow: ellipsis;\n overflow: hidden;\n}\n.tui-full-calendar-popup-section-item {\n height: 32px;\n padding: 0 9px 0 12px;\n border: 1px solid #d5d5d5;\n display: inline-block;\n font-size: 0;\n border-radius: 2px;\n}\n.tui-full-calendar-popup-section-item:hover {\n border-color: #bbb;\n}\n.tui-full-calendar-popup-section-item:focus {\n border-color: #bbb;\n}\n.tui-full-calendar-popup-section-item .tui-full-calendar-icon {\n position: relative;\n}\n.tui-full-calendar-popup-section-item .tui-full-calendar-content {\n text-align: left;\n display: inline-block;\n font-size: 12px;\n vertical-align: middle;\n position: relative;\n padding-left: 8px;\n}\n.tui-full-calendar-section-calendar .tui-full-calendar-dropdown-button .tui-full-calendar-content {\n width: 125px;\n text-overflow: ellipsis;\n overflow: hidden;\n top: -1px;\n}\n.tui-full-calendar-popup-section-item input {\n border: none;\n height: 30px;\n outline: none;\n display: inline-block;\n}\n.tui-full-calendar-popup-section-item input::placeholder {\n color: #bbb;\n font-weight: 300;\n}\n.tui-full-calendar-dropdown {\n position: relative;\n}\n.tui-full-calendar-dropdown:hover .tui-full-calendar-dropdown-button {\n border: 1px solid #bbb;\n}\n.tui-full-calendar-dropdown-button.tui-full-calendar-popup-section-item {\n height: 32px;\n font-size: 0;\n top: -1px;\n}\n.tui-full-calendar-dropdown-arrow {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAHlJREFUKBVjYBgFOEOAEVkmPDxc89+/f6eAYjzI4kD2FyYmJrOVK1deh4kzwRggGiQBVJCELAZig8SQNYHEmEEEMrh69eo1HR0dfqCYJUickZGxf9WqVf3IakBsFBthklpaWmVA9mEQhrJhUoTp0NBQCRAmrHL4qgAAuu4cWZOZIGsAAAAASUVORK5CYII=) no-repeat;\n}\n.dropdown.open .tui-full-calendar-dropdown-arrow,\n.tui-full-calendar-open .tui-full-calendar-dropdown-arrow {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAIFJREFUKBVjYBj+gBmXF2NiYiTV1dV5rl279gWbGiZsgg0NDSw/f/5cCZRbBWJjU4PVRjExsR6g4nAgln/z5g3v1atXd6JrxtAYHh4e+v///z4khZa6urrXgJqvIYkxMCJzgJo0//37dwooxoMsDmR/YWJiMlu5cuV1NPFRLrYQAADMVCaUtbG7XwAAAABJRU5ErkJggg==) no-repeat;\n}\n.tui-full-calendar-dropdown-menu {\n position: absolute;\n top: 31px;\n padding: 4px 0;\n background-color: #fff;\n border: 1px solid #d5d5d5;\n border-top: none;\n border-radius: 0 0 2px 2px;\n width: 100%;\n display: none;\n}\n.tui-full-calendar-dropdown:hover .tui-full-calendar-dropdown-menu {\n border: 1px solid #bbb;\n border-top: none;\n}\n.tui-full-calendar-open .tui-full-calendar-dropdown-menu {\n display: block;\n}\n.tui-full-calendar-dropdown-menu-item {\n height: 30px;\n border: none;\n cursor: pointer;\n}\n.tui-full-calendar-section-calendar .tui-full-calendar-dropdown-menu-item {\n width: 100%;\n}\n.tui-full-calendar-section-state .tui-full-calendar-dropdown-menu-item {\n width: 100%;\n}\n.tui-full-calendar-dropdown-menu-item:hover {\n background-color: rgba(81,92,230,0.05);\n}\n.tui-full-calendar-dropdown-menu-item .tui-full-calendar-content {\n line-height: 30px;\n}\n.tui-full-calendar-button.tui-full-calendar-popup-close {\n position: absolute;\n top: 10px;\n right: 10px;\n background-color: #fff;\n padding: 2px;\n border: none;\n}\n.tui-full-calendar-section-button-save {\n height: 36px;\n}\n.tui-full-calendar-popup-save {\n float: right;\n}\n.tui-full-calendar-popup-arrow-border,\n.tui-full-calendar-popup-arrow-fill {\n position: absolute;\n}\n.tui-full-calendar-arrow-top .tui-full-calendar-popup-arrow-border {\n border-top: none;\n border-right: 8px solid transparent;\n border-bottom: 8px solid #d5d5d5;\n border-left: 8px solid transparent;\n left: calc(50% - 8px);\n top: -7px;\n}\n.tui-full-calendar-arrow-right .tui-full-calendar-popup-arrow-border {\n border-top: 8px solid transparent;\n border-right: none;\n border-bottom: 8px solid transparent;\n border-left: 8px solid #d5d5d5;\n top: calc(50% - 8px);\n right: -7px;\n}\n.tui-full-calendar-arrow-bottom .tui-full-calendar-popup-arrow-border {\n border-top: 8px solid #d5d5d5;\n border-right: 8px solid transparent;\n border-bottom: none;\n border-left: 8px solid transparent;\n left: calc(50% - 8px);\n bottom: -7px;\n}\n.tui-full-calendar-arrow-left .tui-full-calendar-popup-arrow-border {\n border-top: 8px solid transparent;\n border-right: 8px solid #d5d5d5;\n border-bottom: 8px solid transparent;\n border-left: none;\n top: calc(50% - 8px);\n left: -7px;\n}\n.tui-full-calendar-arrow-top .tui-full-calendar-popup-arrow-fill {\n border-top: none;\n border-right: 7px solid transparent;\n border-bottom: 7px solid #fff;\n border-left: 7px solid transparent;\n left: -7px;\n top: 1px;\n}\n.tui-full-calendar-arrow-right .tui-full-calendar-popup-arrow-fill {\n border-top: 7px solid transparent;\n border-right: none;\n border-bottom: 7px solid transparent;\n border-left: 7px solid #fff;\n top: -7px;\n right: 1px;\n}\n.tui-full-calendar-arrow-bottom .tui-full-calendar-popup-arrow-fill {\n border-top: 7px solid #fff;\n border-right: 7px solid transparent;\n border-bottom: none;\n border-left: 7px solid transparent;\n left: -7px;\n bottom: 1px;\n}\n.tui-full-calendar-arrow-left .tui-full-calendar-popup-arrow-fill {\n border-top: 7px solid transparent;\n border-right: 7px solid #fff;\n border-bottom: 7px solid transparent;\n border-left: none;\n top: -7px;\n left: 1px;\n}\n.tui-full-calendar-button {\n background: #fff;\n border: 1px solid #d5d5d5;\n border-radius: 2px;\n text-align: center;\n outline: none;\n font-size: 12px;\n cursor: pointer;\n color: #333;\n}\n.tui-full-calendar-button:hover {\n border-color: #bbb;\n color: #333;\n}\n.tui-full-calendar-button:active {\n background: #f9f9f9;\n color: #333;\n}\n.tui-full-calendar-button .round {\n border-radius: 25px;\n}\n.tui-full-calendar-confirm {\n width: 96px;\n height: 36px;\n border-radius: 40px;\n background-color: #ff6618;\n font-size: 12px;\n font-weight: bold;\n color: #fff;\n border: none;\n}\n.tui-full-calendar-confirm:hover {\n background-color: #e55b15;\n color: #fff;\n}\n.tui-full-calendar-confirm:active {\n background-color: #d95614;\n color: #fff;\n}\n.tui-full-calendar-icon.tui-full-calendar-right {\n float: right;\n top: 1px;\n}\n.tui-full-calendar-icon .tui-full-calendar-none {\n display: none;\n}\n.tui-full-calendar-icon.tui-full-calendar-calendar-dot {\n border-radius: 8px;\n width: 12px;\n height: 12px;\n margin: 1px;\n}\ninput[type='checkbox'].tui-full-calendar-checkbox-square {\n display: none;\n}\ninput[type='checkbox'].tui-full-calendar-checkbox-square + span {\n display: inline-block;\n cursor: pointer;\n line-height: 14px;\n margin-right: 8px;\n width: 14px;\n height: 14px;\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAADpJREFUKBVjPHfu3O5///65MJAAmJiY9jCcOXPmP6kApIeJBItQlI5qRAkOVM5o4KCGBwqPkcxEvhsAbzRE+Jhb9IwAAAAASUVORK5CYII=) no-repeat;\n vertical-align: middle;\n}\ninput[type='checkbox'].tui-full-calendar-checkbox-square:checked + span {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAMBJREFUKBWVkjEOwjAMRe2WgZW7IIHEDdhghhuwcQ42rlJugAQS54Cxa5cq1QM5TUpByZfS2j9+dlJVt/tX5ZxbS4ZU9VLkQvSHKTIGRaVJYFmKrBbTCJxE2UgCdDzMZDkHrOV6b95V0US6UmgKodujEZbJg0B0ZgEModO5lrY1TMQf1TpyJGBEjD+E2NPN7ukIUDiF/BfEXgRiGEw8NgkffYGYwCi808fpn/6OvfUfsDr/Vc1IfRf8sKnFVqeiVQfDu0tf/nWH9gAAAABJRU5ErkJggg==) no-repeat;\n}\ninput[type='checkbox'].tui-full-calendar-checkbox-round {\n display: none;\n}\ninput[type='checkbox'].tui-full-calendar-checkbox-round + span {\n display: inline-block;\n cursor: pointer;\n width: 14px;\n height: 14px;\n line-height: 14px;\n vertical-align: middle;\n margin-right: 8px;\n border-radius: 8px;\n border: solid 2px;\n background: transparent;\n}\n.tui-full-calendar-popup-top-line {\n position: absolute;\n border-radius: 2px 2px 0 0;\n width: 100%;\n height: 4px;\n border: none;\n top: 0;\n}\n.tui-full-calendar-popup-detail .tui-full-calendar-popup-container {\n width: 301px;\n min-width: 301px;\n padding-bottom: 0;\n}\n.tui-full-calendar-popup-detail .tui-full-calendar-icon {\n width: 12px;\n height: 12px;\n background-size: 12px;\n position: relative;\n margin-right: 8px;\n}\n.tui-full-calendar-popup-detail .tui-full-calendar-icon.tui-full-calendar-ic-location-b {\n top: -2px;\n}\n.tui-full-calendar-popup-detail .tui-full-calendar-icon.tui-full-calendar-ic-user-b {\n top: -2px;\n}\n.tui-full-calendar-popup-detail .tui-full-calendar-icon.tui-full-calendar-ic-state-b {\n top: -1px;\n}\n.tui-full-calendar-popup-detail .tui-full-calendar-icon.tui-full-calendar-calendar-dot {\n width: 10px;\n height: 10px;\n margin-right: 8px;\n top: -1px;\n}\n.tui-full-calendar-popup-detail .tui-full-calendar-content {\n line-height: 24px;\n height: 24px;\n font-size: 12px;\n line-height: 2;\n}\n.tui-full-calendar-popup-detail .tui-full-calendar-section-header {\n margin-bottom: 6px;\n}\n.tui-full-calendar-popup-detail .tui-full-calendar-popup-detail-item-separate {\n margin-top: 4px;\n}\n.tui-full-calendar-popup-detail .tui-full-calendar-popup-detail-item-indent {\n text-indent: -20px;\n padding-left: 20px;\n}\n.tui-full-calendar-popup-detail .tui-full-calendar-schedule-title {\n font-size: 15px;\n font-weight: bold;\n line-height: 1.6;\n word-break: break-all;\n}\n.tui-full-calendar-popup-detail .tui-full-calendar-schedule-private {\n display: none;\n width: 16px;\n height: 16px;\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAKpJREFUKBVjYCATMKLri46Olvn9+3fX////HUByjIyMB1hZWcuWLl36BFktikaQpl+/fl0EKhBCVgRkv2NjY9NH1syErABkE1TTdqBCWRAG8reDxKBycOUoGmHOA2pIA5kOwiA2SDVMDqYTRSNQUBIkgewkJDZYDqYR7sewsLCtQFO9YBLYaGBAbVu1apU3SA5uIyFNIMXIauAaQRKkgBGlERTURATOVpgaABRQQOK46wEAAAAAAElFTkSuQmCC) no-repeat 16px;\n}\n.tui-full-calendar-popup-detail .tui-full-calendar-schedule-private .tui-full-calendar-ic-private {\n display: block;\n}\n.tui-full-calendar-popup-detail .tui-full-calendar-section-detail {\n margin-bottom: 16px;\n}\n.tui-full-calendar-popup-detail .tui-full-calendar-section-button {\n border-top: 1px solid #e5e5e5;\n font-size: 0;\n}\n.tui-full-calendar-section-button .tui-full-calendar-icon {\n margin-right: 4px;\n top: -3px;\n}\n.tui-full-calendar-section-button .tui-full-calendar-content {\n position: relative;\n top: 2px;\n}\n.tui-full-calendar-popup-edit,\n.tui-full-calendar-popup-delete {\n display: inline-block;\n padding: 7px 9px 11px 9px;\n width: calc(50% - 1px);\n outline: none;\n background: none;\n border: none;\n cursor: pointer;\n}\n.tui-full-calendar-popup-vertical-line {\n background: #e5e5e5;\n width: 1px;\n height: 14px;\n vertical-align: middle;\n display: inline-block;\n margin-top: -7px;\n}\n.tui-datepicker {\n left: -12px;\n z-index: 1;\n border-color: #d5d5d5;\n}\n.tui-full-calendar-icon {\n width: 14px;\n height: 14px;\n display: inline-block;\n vertical-align: middle;\n}\n.tui-full-calendar-icon.tui-full-calendar-ic-title {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAO5JREFUKBVjYCATMOLSFxkZqfHnz5+1QHktNDVbV69e7cOCJgjmQjXtB3IksMh7g8SY0CXQNTEyMlYD1fBCabhyFI3omkCq/v//PwnotC8gGq4LyIBrxKYJpBBoU15oaCgPiEbWCPYjUEIFGBBY/QS0qRWooRVIg/UBDXgMYoBtBHJSgWxsAQFWjET8BBqQBuLDNM4Can6GpAAb8ydQMADo3x0gSbDGlStX3gVqdMSjGUUTSCNKAggPD1cDOmU/EEuBJKEAQxNIHEUjSABNM1ZNIHXMIAIZXL169a2+vv5moK18QKeXAv20B1meYjYAr7xrljpOzc0AAAAASUVORK5CYII=) no-repeat;\n}\n.tui-full-calendar-icon.tui-full-calendar-ic-location {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAR1JREFUKBWdUTtPg1AUBiT8CydHJtv/0MTJRWAgcTK1bq0/pO3k4E4IYLo2Me46tS4wumjSpV07kAb6HXLPzaGPRZLL+c73uE/D+OdnHuaCIOhVVTUEf620pWVZ0yRJ3qW3FfR9f1zX9UgaGJumOUnT9Fn3DDzPuwPOuD9TvSzL3kizhOFJ4LnjOJc0wM0FP2Asgx0mEehHUfRHgzDzqF3GOogzbJg8V6XHFqYv4Cvqy7J8DcOwWYmw8Hwy1kHMRjcaKuEGgV82caWbZay3indagJyxcKLOlKeRdJA627YfUVaN0v6tlKbZVjCO4zW2cw91px3AxJEmOONCNoTzPP9xXZfOd6u0Bzz60RGOgmQuiuIb4S3gB0IvaoJW2QMDs1bBoH1CAQAAAABJRU5ErkJggg==) no-repeat;\n}\n.tui-full-calendar-icon.tui-full-calendar-ic-date {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAGpJREFUKBVjYKAGCA0N/Q/C6GZhE2cEKQoLC9v6//9/L3QN2PiMjIzbVq1a5c0EkiRWE7JasEZsJhMSI1sjC7LJq1evBvsZWQyZjRxwZNs4hDSiBA6y55EDBRsb7EdQasAmiUNsKw5x4oQBkUAeDPJ53KsAAAAASUVORK5CYII=) no-repeat;\n}\n.tui-full-calendar-icon.tui-full-calendar-ic-state {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAIxJREFUKBVjYCATMKLrCw8P9/z3798soLgMVO4JExNT2sqVK7cjq2VC5oDYME2MjIyNIAwUkoGKoShlQeFBOGCbVq1a1QDihoaG1gMpmO0gITAAOzUsLGzr////vWCC+GigK7YBDfUGO5VYTSADYWox/IjPNmS5UY3IoYHGBgcOKG7QxPFxt+KTJCgHAGcZJbGLRuJ2AAAAAElFTkSuQmCC) no-repeat;\n}\n.tui-full-calendar-icon.tui-full-calendar-ic-private {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAKpJREFUKBVjYCATMKLri46Olvn9+3fX////HUByjIyMB1hZWcuWLl36BFktikaQpl+/fl0EKhBCVgRkv2NjY9NH1syErABkE1TTdqBCWRAG8reDxKBycOUoGmHOA2pIA5kOwiA2SDVMDqYTRSNQUBIkgewkJDZYDqYR7sewsLCtQFO9YBLYaGBAbVu1apU3SA5uIyFNIMXIauAaQRKkgBGlERTURATOVpgaABRQQOK46wEAAAAAAElFTkSuQmCC) no-repeat;\n}\n.tui-full-calendar-icon.tui-full-calendar-ic-close {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAJRJREFUKBXFkNERhCAMREUbuEKohzq0Eq2DDq6Da4B60KezDORkxj+ZwchmX0IYhtdWCGFl9y5g82NtzDnPdzAaudo76ZBS+nrvPxiInMkJcs5tMcZFfqcfxdqIRiELof+BiIJPg+mExmpmvKRn3zKj7OrG9Y79szPL14A1xEP0Hgy4gBZS5R7czHj3ehSgOzkVeyfuGrBw/WLm0hsAAAAASUVORK5CYII=) no-repeat;\n}\n.tui-full-calendar-ic-location-b {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAAAXNSR0IArs4c6QAAAOZJREFUKBWVUT0KwjAUbkzGTuJWPYNDpV0cXD2ETuIRBK+gs4ubp3BwcXBp6eINBKWDgydoid9X8oKCggYeee/7S9IGwZ9LverTNO3Wdb2y1o6IK6WOWutFlmU30XmDE58hbgvpTA+Y+mJqCemS20jdG2N6LPYMICc6b5BrIG3ONBZ7CoVj7w0cfllGRDj+gKQpjt/iPU0ye/LkROcNANaoCUzjqqquIsBuHddAWoiyLO9RFHUwJ4JxR/qmKIqdYG9vCMNwCeIiJHuHecj/B0GSJBng7ifO+ErDPM8L4b7ucRzPWJ8ET1E7YC7tmi9qAAAAAElFTkSuQmCC);\n}\n.tui-full-calendar-ic-state-b {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAAAXNSR0IArs4c6QAAAHlJREFUKBVjYCARMCKrNzEx8QTyZ/3//18GJM7IyPgESKWdOXNmO4gPAkwQCk6CFQMVNoIwVOMsuCw6w9jY+D8Iw8TR+SBxsJOATtkKNM0LphAbDbRxG9Bp3mAnEVIMMgCmBt0P2AxHERusGkAhgOJQ7Jyt2IUJiAIAwwIn24FgmhkAAAAASUVORK5CYII=);\n}\n.tui-full-calendar-icon.tui-full-calendar-ic-user-b {\n background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAAAXNSR0IArs4c6QAAAJpJREFUKBVjYKA1YES3wMTExBMoNgsqnnbmzJntyGqYkDlQ9qz////LgDCQD9MIV4ZNA1wSGwObhjRGRsYnIAzUkIZNE0licE+bm5tr/fnzJx1osjPQBFmoKY+BftnLwsIy8+TJk9dAYmANxsbGoUD2YiBmBwliAT+BYrFnz55dDfNDO1AAl2KQfpAcSA0DTIMyiEMAEKMG0wgAolIjcM7Tjm8AAAAASUVORK5CYII=);\n}\n.tui-full-calendar-icon.tui-full-calendar-ic-edit {\n background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAAAXNSR0IArs4c6QAAAMdJREFUKBVjYCARMOJTb2xsLMfIyBjLysq64Pjx409BapnwaQDKzf7//3/L79+/D1tbW0uB1LJg02BmZqYIVPgdKBf/79+//UC2xs+fP8OB/H4MG0CK//79ewCkEGQYExOTI5DawMnJuQTER/EDTDFQXA4kCQQ3QBpOnz79AsJF8gMWxTA1KDTYBhyKMUwH6WSysrKSB7kZyIY5AySOVTFIggno+5VAmijFYA1AwhzEgAKcJsMUwIMVGKPH2NnZ7ZFDBKYImQYAuO5YIMgk39gAAAAASUVORK5CYII=);\n}\n.tui-full-calendar-icon.tui-full-calendar-ic-delete {\n background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAAAXNSR0IArs4c6QAAAFhJREFUKBVjYCARMKKrNzEx2fr//38vkDgjI+O2M2fOeCOrAWtAVoQsicyGaWZCFsTHBtr6H588Tjm4H4yNjfGacPbsWbBaop0Es3JYaQBFDMxjWOitMDEA3EEZfFEISwUAAAAASUVORK5CYII=);\n}\n.tui-full-calendar-icon.tui-full-calendar-ic-arrow-solid-top {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAIFJREFUKBVjYBj+gBmXF2NiYiTV1dV5rl279gWbGiZsgg0NDSw/f/5cCZRbBWJjU4PVRjExsR6g4nAgln/z5g3v1atXd6JrxtAYHh4e+v///z4khZa6urrXgJqvIYkxMCJzgJo0//37dwooxoMsDmR/YWJiMlu5cuV1NPFRLrYQAADMVCaUtbG7XwAAAABJRU5ErkJggg==) no-repeat;\n}\n.tui-full-calendar-icon.tui-full-calendar-ic-milestone {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAAAXNSR0IArs4c6QAAAGFJREFUKBVjYCARMILU/3dw+I+hj5FxG+P+/d7o4rg1IKtE0syELI6T/f+/F0yOOA0w1UCa9hpYkGxjYDxwABwIILH/jo5bGWBuZ2TcClOHogEmCKKxBSlInPZ+ANlCEgAA37EU4AHbBQUAAAAASUVORK5CYII=) no-repeat;\n}\n.tui-full-calendar-icon.tui-full-calendar-ic-arrow-left {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAHCAYAAAAvZezQAAAAAXNSR0IArs4c6QAAAFZJREFUCB1jZICCyspK83///hUxgvhVVVV6f//+3c3ExJTMVFNTowqU2cHMzJzf3t6+hen379/zgIp2t7W1rQCpZmJlZU0C0q5AbREgAQwzwAIgGZgtADMCJqH/QyvhAAAAAElFTkSuQmCC) no-repeat;\n}\n.tui-full-calendar-icon.tui-full-calendar-ic-arrow-right {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAHCAYAAAAvZezQAAAAAXNSR0IArs4c6QAAAFxJREFUCB1jKC8vX1lZWWnOAAVMQLD4379/m6qqqvRAYowgAsiJAAr2sbCw2IMFQIIVFRUL////r8SCpMKVlZXVnhFooA9Q+VxmZmbXtra2S0xATizQYD8QB6QaAJMLJ9BqE9yTAAAAAElFTkSuQmCC) no-repeat;\n}\n.tui-full-calendar-ic-repeat-b {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAAAXNSR0IArs4c6QAAAQpJREFUKBVjYCARMCKrNzU1tf/3718lUMwQiP8yMjKeYWJi6j516tRhExOThjNnzjTANQAFqv///98CVHQPSO8A0ixATa5AtjyQPgDETmfPngULMpiZmbn//fu3BSg4B6ggCyjxG8hm8PT0ZH/9+vUJoJgTiA8CTCACqDgXaOJ9Xl7eTJhikDhQcSVQsQGITT8A9rSxsfF/mJVApzWCQgPGd3BwYPny5cstoNOuAZ3rAwoJOAAqviAqKtoOEwAaxPr58+dpQL4iEGeAxJFt2AfkOwA1PQTSu4Em/gGyPYC0EpCuAdraCtIADiWgQCPQOmdmZmYHoNgVoCJfIB0CpG8DI84BphgoRjoAAAzgdELI91E5AAAAAElFTkSuQmCC);\n}\n/*# sourceMappingURL=src/css/main.css.map */\n\n/*# sourceMappingURL=tui-calendar.css.map*/","+prefix-classes(css-prefix)\n .layout\n height: 100%\n position: relative\n box-sizing: border-box\n\n *\n box-sizing: border-box\n\n // Related with user interaction\n .dragging\n cursor: move\n\n .resizing\n cursor: row-resize\n\n .resizing-x\n cursor: col-resize\n\n .hidden\n display: none !important\n\n .invisible span\n visibility: hidden\n\n .clear\n clearfix()\n\n .scroll-y\n overflow-y: scroll\n\n .dot\n display: inline-block\n position: relative\n top: -1px\n content: ''\n width: 7px\n height: 7px\n border-radius: 50%\n\n.{css-prefix}holiday\n color: red\n\n.{css-prefix}today\n background: rgba(218, 229, 249, .3)\n\n// Drag handle\n.handle-x\n background-position: center center\n background-repeat: no-repeat\n background-image: url(./image/handle-x.png)\n\n.handle-y\n background-position: center center\n background-repeat: no-repeat\n background-image: url(./image/handle-y.png)\n\n// For Retina display\n@media only screen and (-moz-min-device-pixel-ratio: 1.5), only screen and (-o-min-device-pixel-ratio: 3/2), only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-devicepixel-ratio: 1.5), only screen and (min-resolution: 1.5dppx)\n .handle-x\n background-image: url(./image/handle-x@2x.png)\n background-size: 8px 4px\n\n .handle-y\n background-image: url(./image/handle-y@2x.png)\n background-size: 4px 8px\n",".tui-full-calendar-layout {\n height: 100%;\n position: relative;\n box-sizing: border-box;\n}\n.tui-full-calendar-layout * {\n box-sizing: border-box;\n}\n.tui-full-calendar-dragging {\n cursor: move;\n}\n.tui-full-calendar-resizing {\n cursor: row-resize;\n}\n.tui-full-calendar-resizing-x {\n cursor: col-resize;\n}\n.tui-full-calendar-hidden {\n display: none !important;\n}\n.tui-full-calendar-invisible span {\n visibility: hidden;\n}\n.tui-full-calendar-clear:after {\n content: '';\n display: block;\n clear: both;\n}\n.tui-full-calendar-scroll-y {\n overflow-y: scroll;\n}\n.tui-full-calendar-dot {\n display: inline-block;\n position: relative;\n top: -1px;\n content: '';\n width: 7px;\n height: 7px;\n border-radius: 50%;\n}\n.tui-full-calendar-holiday {\n color: #f00;\n}\n.tui-full-calendar-today {\n background: rgba(218,229,249,0.3);\n}\n.handle-x {\n background-position: center center;\n background-repeat: no-repeat;\n background-image: url(\"./image/handle-x.png\");\n}\n.handle-y {\n background-position: center center;\n background-repeat: no-repeat;\n background-image: url(\"./image/handle-y.png\");\n}\n@media only screen and (-moz-min-device-pixel-ratio: 1.5), only screen and (-o-min-device-pixel-ratio: 3/2), only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-devicepixel-ratio: 1.5), only screen and (min-resolution: 1.5dppx) {\n .handle-x {\n background-image: url(\"./image/handle-x@2x.png\");\n background-size: 8px 4px;\n }\n .handle-y {\n background-image: url(\"./image/handle-y@2x.png\");\n background-size: 4px 8px;\n }\n}\n.tui-full-calendar-month-week-item .tui-full-calendar-weekday-grid {\n overflow-y: hidden;\n}\n.tui-full-calendar-month-week-item .tui-full-calendar-weekday-schedules {\n overflow-y: visible;\n height: 0;\n}\n.tui-full-calendar-month-week-item .tui-full-calendar-weekday-schedule {\n margin: 0 10px;\n}\n.tui-full-calendar-month-week-item .tui-full-calendar-today {\n background: none;\n}\n.tui-full-calendar-month-week-item .tui-full-calendar-today .tui-full-calendar-weekday-grid-date-decorator {\n display: inline-block;\n width: 27px;\n height: 27px;\n line-height: 27px;\n text-align: center;\n background: #135de6;\n border-radius: 50%;\n color: #fff;\n font-weight: bold;\n margin-left: 2px;\n}\n.tui-full-calendar-weekday-grid,\n.tui-full-calendar-weekday-grid-line {\n height: 100%;\n min-height: inherit;\n}\n.tui-full-calendar-weekday-grid {\n position: absolute;\n width: 100%;\n overflow-y: scroll;\n}\n.tui-full-calendar-weekday-border {\n border-top: 1px solid #ddd;\n}\n.tui-full-calendar-weekday-grid-line {\n position: absolute;\n padding: 3px;\n}\n.tui-full-calendar-weekday-grid-line .tui-full-calendar-weekday-grid-footer {\n position: absolute;\n bottom: 4px;\n}\n.tui-full-calendar-weekday-grid-line .tui-full-calendar-weekday-grid-date {\n display: inline-block;\n width: 27px;\n height: 27px;\n line-height: 27px;\n text-align: center;\n}\n.tui-full-calendar-weekday-grid-line .tui-full-calendar-weekday-grid-more-schedules {\n float: right;\n display: inline-block;\n height: 27px;\n line-height: 27px;\n padding: 0 5px;\n text-align: center;\n font-size: 11px;\n font-weight: bold;\n color: #aaa;\n}\n.tui-full-calendar-weekday-creation {\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n position: absolute;\n overflow-y: scroll;\n}\n.tui-full-calendar-weekday-schedules {\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n position: absolute;\n font-size: 12px;\n overflow-y: scroll;\n}\n.tui-full-calendar-weekday-schedule-block {\n position: absolute;\n}\n.tui-full-calendar-weekday-schedule-block-dragging-dim {\n opacity: 0.3;\n}\n.tui-full-calendar-weekday-schedule {\n position: relative;\n margin: 0 10px 0 1px;\n cursor: pointer;\n border-left-style: solid;\n border-left-width: 3px;\n}\n.tui-full-calendar-weekday-schedule.tui-full-calendar-weekday-schedule-time {\n border-left-width: 0;\n}\n.tui-full-calendar-weekday-schedule.tui-full-calendar-weekday-schedule-time .tui-full-calendar-weekday-schedule-title {\n padding-left: 9px;\n}\n.tui-full-calendar-weekday-schedule-bullet {\n position: absolute;\n padding: 0;\n width: 6px;\n height: 6px;\n top: 6px;\n left: 0;\n border-radius: 50%;\n}\n.tui-full-calendar-weekday-schedule-bullet-focused {\n left: 10px;\n background: #fff;\n}\n.tui-full-calendar-weekday-schedule-title {\n display: block;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n padding-left: 3px;\n font-weight: bold;\n}\n.tui-full-calendar-weekday-schedule-title-focused {\n padding-left: 16px;\n}\n.tui-full-calendar-weekday-schedule-cover {\n position: absolute;\n top: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(0,0,0,0.2);\n box-shadow: 0 2px 6px 0 rgba(0,0,0,0.1);\n}\n.tui-full-calendar-weekday-exceed-left .tui-full-calendar-weekday-schedule {\n margin-left: 0;\n border-left-width: 0;\n}\n.tui-full-calendar-weekday-exceed-right .tui-full-calendar-weekday-schedule {\n margin-right: 0;\n}\n.tui-full-calendar-weekday-exceed-right .tui-full-calendar-weekday-resize-handle {\n display: none;\n}\n.tui-full-calendar-weekday-exceed-in-month {\n cursor: pointer;\n}\n.tui-full-calendar-weekday-exceed-in-month:hover {\n background-color: #f0f1f5;\n}\n.tui-full-calendar-weekday-exceed-in-week,\n.tui-full-calendar-weekday-collapse-btn {\n position: absolute;\n bottom: 5px;\n margin-right: 5px;\n font-size: 12px;\n line-height: 14px;\n cursor: pointer;\n padding: 1px 5px;\n background-color: #fff;\n border: 1px solid #ddd;\n color: #000;\n}\n.tui-full-calendar-weekday-resize-handle {\n position: absolute;\n top: 0;\n right: 0;\n width: 6px;\n background-position: 3px center;\n cursor: col-resize;\n line-height: 18px;\n}\n.tui-full-calendar-weekday-filled {\n background-color: #e8e8e8 !important;\n}\n.tui-full-calendar-left {\n height: 100%;\n float: left;\n box-sizing: border-box;\n display: table;\n}\n.tui-full-calendar-left-content {\n display: table-cell;\n vertical-align: middle;\n text-align: right;\n font-size: 11px;\n}\n.tui-full-calendar-right {\n height: 100%;\n overflow-y: scroll;\n position: relative;\n}\n.tui-full-calendar-week-container {\n width: 100%;\n height: inherit;\n display: inline-block;\n font-size: 10px;\n min-height: 600px;\n}\n.tui-full-calendar-week-container .tui-full-calendar-today {\n background: none;\n}\n.tui-full-calendar-dayname {\n position: absolute;\n margin-left: -1px;\n height: 100%;\n overflow: hidden;\n}\n.tui-full-calendar-dayname.tui-full-calendar-today {\n font-weight: bold;\n}\n.tui-full-calendar-dayname-container {\n overflow-y: scroll;\n}\n.tui-full-calendar-dayname-leftmargin {\n position: relative;\n height: 100%;\n}\n.tui-full-calendar-dayname-date {\n font-size: 26px;\n}\n.tui-full-calendar-dayname-name {\n font-weight: bold;\n font-size: 12px;\n}\n.tui-full-calendar-daygrid-layout {\n height: 100%;\n}\n.tui-full-calendar-daygrid-layout .tui-full-calendar-right {\n overflow-y: hidden;\n}\n.tui-full-calendar-daygrid-guide-creation-block {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n}\n.tui-full-calendar-timegrid-container {\n height: 100%;\n position: relative;\n overflow: hidden;\n overflow-y: scroll;\n}\n.tui-full-calendar-timegrid-container-split {\n height: 100%;\n position: relative;\n overflow: hidden;\n}\n.tui-full-calendar-timegrid-left {\n position: absolute;\n}\n.tui-full-calendar-timegrid-hour {\n position: relative;\n color: #555;\n box-sizing: border-box;\n}\n.tui-full-calendar-timegrid-hour:first-child span {\n display: none;\n}\n.tui-full-calendar-timegrid-hour:last-child {\n border-bottom: none;\n}\n.tui-full-calendar-timegrid-hour span {\n position: absolute;\n top: -11px;\n left: 0;\n right: 5px;\n text-align: right;\n line-height: 25px;\n}\n.tui-full-calendar-timegrid-right {\n position: relative;\n}\n.tui-full-calendar-timegrid-gridline {\n border-bottom: 1px solid #eee;\n box-sizing: border-box;\n}\n.tui-full-calendar-timegrid-gridline:last-child {\n border-bottom: none;\n}\n.tui-full-calendar-timegrid-schedules {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n cursor: pointer;\n}\n.tui-full-calendar-timegrid-hourmarker {\n position: absolute;\n width: 100%;\n display: table;\n}\n.tui-full-calendar-timegrid-hourmarker-line-left {\n position: absolute;\n min-height: 1px;\n left: 0;\n}\n.tui-full-calendar-timegrid-hourmarker-line-today {\n position: absolute;\n min-height: 1px;\n}\n.tui-full-calendar-timegrid-hourmarker-line-right {\n position: absolute;\n min-height: 1px;\n right: 0;\n}\n.tui-full-calendar-timegrid-hourmarker-time {\n padding-right: 5px;\n line-height: 12px;\n text-align: right;\n display: table-cell;\n vertical-align: bottom;\n}\n.tui-full-calendar-timegrid-todaymarker {\n position: absolute;\n text-indent: -9999px;\n width: 9px;\n height: 9px;\n background-color: #135de6;\n margin: -4px 0 0 -5px;\n border-radius: 50%;\n}\n.tui-full-calendar-timegrid-sticky-container {\n position: absolute;\n top: 0;\n}\n.tui-full-calendar-timegrid-timezone-label-container {\n position: absolute;\n}\n.tui-full-calendar-timegrid-timezone-label-cell {\n display: table;\n}\n.tui-full-calendar-timegrid-timezone-label {\n display: table-cell;\n vertical-align: middle;\n padding-right: 5px;\n text-align: right;\n}\n.tui-full-calendar-timegrid-timezone-close-btn {\n cursor: pointer;\n position: absolute;\n text-align: center;\n background-color: #fff;\n}\n.tui-full-calendar-timegrid-timezone-close-btn .tui-full-calendar-icon {\n width: 5px;\n height: 10px;\n}\n.tui-full-calendar-time-date {\n position: absolute;\n height: 100%;\n margin-left: -1px;\n box-sizing: content-box;\n}\n.tui-full-calendar-time-date:last-child {\n border-right: none;\n margin: 0;\n}\n.tui-full-calendar-time-date:last-child .tui-full-calendar-time-schedule,\n.tui-full-calendar-time-date:last-child .tui-full-calendar-time-guide-creation {\n left: 0px;\n}\n.tui-full-calendar-time-date-schedule-block-wrap {\n position: relative;\n height: 100%;\n}\n.tui-full-calendar-time-date-schedule-block {\n position: absolute;\n right: 0px;\n}\n.tui-full-calendar-time-date-schedule-block-pending {\n opacity: 0.7;\n}\n.tui-full-calendar-time-date-schedule-block-dragging-dim {\n opacity: 0.3;\n}\n.tui-full-calendar-time-date-schedule-block-focused {\n box-shadow: 0 0 8px 0 rgba(0,0,0,0.2);\n}\n.tui-full-calendar-time-date-schedule-block-cover {\n position: absolute;\n top: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(0,0,0,0.2);\n box-shadow: 0 2px 6px 0 rgba(0,0,0,0.1);\n}\n.tui-full-calendar-time-schedule {\n position: relative;\n left: 1px;\n height: 100%;\n overflow: hidden;\n font-size: 12px;\n font-weight: bold;\n}\n.tui-full-calendar-time-schedule-content {\n overflow: hidden;\n border-left-width: 3px;\n border-left-style: solid;\n padding: 1px 0 0 3px;\n}\n.tui-full-calendar-time-schedule-content-travel-time {\n font-weight: normal;\n font-size: 11px;\n}\n.tui-full-calendar-time-resize-handle {\n position: absolute;\n right: 0px;\n bottom: 0px;\n left: 0px;\n height: 5px;\n text-align: center;\n color: #fff;\n cursor: row-resize;\n background-position: center top;\n}\n.tui-full-calendar-time-guide-creation {\n position: absolute;\n right: 10px;\n left: 1px;\n padding: 3px;\n}\n.tui-full-calendar-time-guide-move .tui-full-calendar-time-schedule,\n.tui-full-calendar-time-guide-resize .tui-full-calendar-time-schedule,\n.tui-full-calendar-time-guide-move .tui-full-calendar-time-resize-handle,\n.tui-full-calendar-time-guide-resize .tui-full-calendar-time-resize-handle {\n opacity: 0.8;\n z-index: 97;\n}\n.tui-full-calendar-time-guide-creation-label {\n cursor: default;\n}\n.tui-full-calendar-time-guide-bottom {\n position: absolute;\n bottom: 3px;\n}\n.tui-full-calendar-month {\n height: 100%;\n min-height: 600px;\n}\n.tui-full-calendar-month-dayname {\n width: 100%;\n position: absolute;\n font-size: 13px;\n}\n.tui-full-calendar-month-dayname-item {\n height: 100%;\n font-weight: bold;\n}\n.tui-full-calendar-month-week-item {\n position: relative;\n}\n.tui-full-calendar-month-week-item>div {\n height: 100%;\n}\n.tui-full-calendar-month-more {\n height: inherit;\n min-width: 280px;\n min-height: 150px;\n}\n.tui-full-calendar-month-more-title {\n position: relative;\n}\n.tui-full-calendar-month-more-title-day {\n font-size: 23px;\n color: #333;\n}\n.tui-full-calendar-month-more-title-day-label {\n font-size: 12px;\n color: #333;\n}\n.tui-full-calendar-month-more-close {\n position: absolute;\n right: 0;\n outline: 0;\n background: none;\n border: 0;\n font-size: 14px;\n line-height: 28px;\n padding: 0 7px;\n cursor: pointer;\n}\n.tui-full-calendar-month-more-list {\n overflow-y: auto;\n}\n.tui-full-calendar-month-more-schedule {\n cursor: pointer;\n display: block;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 12px;\n}\n.tui-full-calendar-month-guide-block {\n position: absolute;\n}\n.tui-full-calendar-month-weekday-schedule {\n margin-top: 2px;\n}\n.tui-full-calendar-month-creation-guide {\n top: 0;\n bottom: -1px;\n left: -1px;\n right: 0;\n position: absolute;\n z-index: 20;\n}\n.tui-full-calendar-month-guide-focused {\n box-shadow: 0 0 8px 0 rgba(0,0,0,0.2);\n}\n.tui-full-calendar-month-guide {\n position: relative;\n padding-left: 3px;\n line-height: 18px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n.tui-full-calendar-month-guide-cover {\n width: 100%;\n position: absolute;\n top: -50%;\n left: -50%;\n background-color: rgba(0,0,0,0.2);\n box-shadow: 0 2px 6px 0 rgba(0,0,0,0.1);\n}\n.tui-full-calendar-month-exceed-left .tui-full-calendar-month-guide {\n margin-left: 0px;\n}\n.tui-full-calendar-month-exceed-right .tui-full-calendar-month-guide {\n margin-right: 0px;\n}\n.tui-full-calendar-month-exceed-right .tui-full-calendar-month-guide-handle {\n display: none;\n}\n.tui-full-calendar-month-guide-handle {\n position: absolute;\n top: 0;\n right: 3px;\n width: 6px;\n background-position: 3px center;\n cursor: col-resize;\n}\n.tui-full-calendar-vlayout-container {\n position: relative;\n}\n.tui-full-calendar-splitter {\n clear: left;\n cursor: row-resize;\n}\n.tui-full-calendar-splitter:hover {\n border-color: #999;\n}\n.tui-full-calendar-splitter-focused {\n background-color: #ddd;\n border: none;\n}\n.tui-full-calendar-splitter-guide {\n position: absolute;\n width: 100%;\n height: 3px;\n border: none;\n background-color: #e8e8e8;\n}\n.tui-full-calendar-popup {\n position: absolute;\n font-weight: 2.5;\n box-shadow: 0 2px 6px 0 rgba(0,0,0,0.1);\n clear: both;\n}\n.tui-full-calendar-popup-container {\n min-width: 474px;\n box-shadow: 0 2px 6px 0 rgba(0,0,0,0.1);\n background-color: #fff;\n border: solid 1px #d5d5d5;\n padding: 17px;\n border-radius: 2px;\n}\n.tui-full-calendar-popup-section {\n font-size: 0;\n min-height: 40px;\n}\n.tui-full-calendar-section-calendar {\n width: 176px;\n}\n.tui-full-calendar-section-calendar.tui-full-calendar-hide {\n height: 21px;\n visibility: hidden;\n}\n.tui-full-calendar-section-title {\n width: calc(100% - 36px);\n padding-right: 4px;\n}\n.tui-full-calendar-section-title input {\n width: 365px;\n}\n.tui-full-calendar-button.tui-full-calendar-section-private {\n height: 32px;\n padding: 8px;\n font-size: 0;\n margin-left: 4px;\n}\n.tui-full-calendar-section-private.tui-full-calendar-public .tui-full-calendar-ic-private {\n background: url(\"image/ic-unlock.png\") no-repeat;\n}\n.tui-full-calendar-section-start-date,\n.tui-full-calendar-section-end-date {\n width: 176px;\n}\n.tui-full-calendar-section-start-date input,\n.tui-full-calendar-section-end-date input {\n width: 139px;\n}\n.tui-full-calendar-section-start-date:hover .tui-full-calendar-popup-section-item,\n.tui-full-calendar-section-end-date:hover .tui-full-calendar-popup-section-item,\n.tui-full-calendar-section-start-date:focus .tui-full-calendar-popup-section-item,\n.tui-full-calendar-section-end-date:focus .tui-full-calendar-popup-section-item,\n.tui-full-calendar-section-start-date:hover .tui-datepicker,\n.tui-full-calendar-section-end-date:hover .tui-datepicker,\n.tui-full-calendar-section-start-date:focus .tui-datepicker,\n.tui-full-calendar-section-end-date:focus .tui-datepicker {\n border-color: #bbb;\n}\n.tui-full-calendar-popup-section-item:focus {\n border-color: #bbb;\n}\n.tui-full-calendar-section-date-dash {\n font-size: 12px;\n color: #d5d5d5;\n height: 32px;\n padding: 0 4px;\n vertical-align: middle;\n}\n.tui-full-calendar-popup-section-item.tui-full-calendar-section-allday {\n border: none;\n padding: 0 0 0 8px;\n cursor: pointer;\n}\n.tui-full-calendar-popup-section-item.tui-full-calendar-section-location {\n display: block;\n}\n.tui-full-calendar-popup-section-item.tui-full-calendar-section-location input {\n width: 400px;\n}\n.tui-full-calendar-section-allday .tui-full-calendar-icon.tui-full-calendar-ic-checkbox {\n margin: 0;\n}\n.tui-full-calendar-popup-section-item.tui-full-calendar-section-allday .tui-full-calendar-content {\n padding-left: 4px;\n}\n.tui-full-calendar-section-state {\n width: 109px;\n}\n.tui-full-calendar-section-state .tui-full-calendar-content {\n width: 58px;\n text-overflow: ellipsis;\n overflow: hidden;\n}\n.tui-full-calendar-popup-section-item {\n height: 32px;\n padding: 0 9px 0 12px;\n border: 1px solid #d5d5d5;\n display: inline-block;\n font-size: 0;\n border-radius: 2px;\n}\n.tui-full-calendar-popup-section-item:hover {\n border-color: #bbb;\n}\n.tui-full-calendar-popup-section-item:focus {\n border-color: #bbb;\n}\n.tui-full-calendar-popup-section-item .tui-full-calendar-icon {\n position: relative;\n}\n.tui-full-calendar-popup-section-item .tui-full-calendar-content {\n text-align: left;\n display: inline-block;\n font-size: 12px;\n vertical-align: middle;\n position: relative;\n padding-left: 8px;\n}\n.tui-full-calendar-section-calendar .tui-full-calendar-dropdown-button .tui-full-calendar-content {\n width: 125px;\n text-overflow: ellipsis;\n overflow: hidden;\n top: -1px;\n}\n.tui-full-calendar-popup-section-item input {\n border: none;\n height: 30px;\n outline: none;\n display: inline-block;\n}\n.tui-full-calendar-popup-section-item input::placeholder {\n color: #bbb;\n font-weight: 300;\n}\n.tui-full-calendar-dropdown {\n position: relative;\n}\n.tui-full-calendar-dropdown:hover .tui-full-calendar-dropdown-button {\n border: 1px solid #bbb;\n}\n.tui-full-calendar-dropdown-button.tui-full-calendar-popup-section-item {\n height: 32px;\n font-size: 0;\n top: -1px;\n}\n.tui-full-calendar-dropdown-arrow {\n background: url(\"image/ic-arrow-solid-bottom.png\") no-repeat;\n}\n.dropdown.open .tui-full-calendar-dropdown-arrow,\n.tui-full-calendar-open .tui-full-calendar-dropdown-arrow {\n background: url(\"image/ic-arrow-solid-top.png\") no-repeat;\n}\n.tui-full-calendar-dropdown-menu {\n position: absolute;\n top: 31px;\n padding: 4px 0;\n background-color: #fff;\n border: 1px solid #d5d5d5;\n border-top: none;\n border-radius: 0 0 2px 2px;\n width: 100%;\n display: none;\n}\n.tui-full-calendar-dropdown:hover .tui-full-calendar-dropdown-menu {\n border: 1px solid #bbb;\n border-top: none;\n}\n.tui-full-calendar-open .tui-full-calendar-dropdown-menu {\n display: block;\n}\n.tui-full-calendar-dropdown-menu-item {\n height: 30px;\n border: none;\n cursor: pointer;\n}\n.tui-full-calendar-section-calendar .tui-full-calendar-dropdown-menu-item {\n width: 100%;\n}\n.tui-full-calendar-section-state .tui-full-calendar-dropdown-menu-item {\n width: 100%;\n}\n.tui-full-calendar-dropdown-menu-item:hover {\n background-color: rgba(81,92,230,0.05);\n}\n.tui-full-calendar-dropdown-menu-item .tui-full-calendar-content {\n line-height: 30px;\n}\n.tui-full-calendar-button.tui-full-calendar-popup-close {\n position: absolute;\n top: 10px;\n right: 10px;\n background-color: #fff;\n padding: 2px;\n border: none;\n}\n.tui-full-calendar-section-button-save {\n height: 36px;\n}\n.tui-full-calendar-popup-save {\n float: right;\n}\n.tui-full-calendar-popup-arrow-border,\n.tui-full-calendar-popup-arrow-fill {\n position: absolute;\n}\n.tui-full-calendar-arrow-top .tui-full-calendar-popup-arrow-border {\n border-top: none;\n border-right: 8px solid transparent;\n border-bottom: 8px solid #d5d5d5;\n border-left: 8px solid transparent;\n left: calc(50% - 8px);\n top: -7px;\n}\n.tui-full-calendar-arrow-right .tui-full-calendar-popup-arrow-border {\n border-top: 8px solid transparent;\n border-right: none;\n border-bottom: 8px solid transparent;\n border-left: 8px solid #d5d5d5;\n top: calc(50% - 8px);\n right: -7px;\n}\n.tui-full-calendar-arrow-bottom .tui-full-calendar-popup-arrow-border {\n border-top: 8px solid #d5d5d5;\n border-right: 8px solid transparent;\n border-bottom: none;\n border-left: 8px solid transparent;\n left: calc(50% - 8px);\n bottom: -7px;\n}\n.tui-full-calendar-arrow-left .tui-full-calendar-popup-arrow-border {\n border-top: 8px solid transparent;\n border-right: 8px solid #d5d5d5;\n border-bottom: 8px solid transparent;\n border-left: none;\n top: calc(50% - 8px);\n left: -7px;\n}\n.tui-full-calendar-arrow-top .tui-full-calendar-popup-arrow-fill {\n border-top: none;\n border-right: 7px solid transparent;\n border-bottom: 7px solid #fff;\n border-left: 7px solid transparent;\n left: -7px;\n top: 1px;\n}\n.tui-full-calendar-arrow-right .tui-full-calendar-popup-arrow-fill {\n border-top: 7px solid transparent;\n border-right: none;\n border-bottom: 7px solid transparent;\n border-left: 7px solid #fff;\n top: -7px;\n right: 1px;\n}\n.tui-full-calendar-arrow-bottom .tui-full-calendar-popup-arrow-fill {\n border-top: 7px solid #fff;\n border-right: 7px solid transparent;\n border-bottom: none;\n border-left: 7px solid transparent;\n left: -7px;\n bottom: 1px;\n}\n.tui-full-calendar-arrow-left .tui-full-calendar-popup-arrow-fill {\n border-top: 7px solid transparent;\n border-right: 7px solid #fff;\n border-bottom: 7px solid transparent;\n border-left: none;\n top: -7px;\n left: 1px;\n}\n.tui-full-calendar-button {\n background: #fff;\n border: 1px solid #d5d5d5;\n border-radius: 2px;\n text-align: center;\n outline: none;\n font-size: 12px;\n cursor: pointer;\n color: #333;\n}\n.tui-full-calendar-button:hover {\n border-color: #bbb;\n color: #333;\n}\n.tui-full-calendar-button:active {\n background: #f9f9f9;\n color: #333;\n}\n.tui-full-calendar-button .round {\n border-radius: 25px;\n}\n.tui-full-calendar-confirm {\n width: 96px;\n height: 36px;\n border-radius: 40px;\n background-color: #ff6618;\n font-size: 12px;\n font-weight: bold;\n color: #fff;\n border: none;\n}\n.tui-full-calendar-confirm:hover {\n background-color: #e55b15;\n color: #fff;\n}\n.tui-full-calendar-confirm:active {\n background-color: #d95614;\n color: #fff;\n}\n.tui-full-calendar-icon.tui-full-calendar-right {\n float: right;\n top: 1px;\n}\n.tui-full-calendar-icon .tui-full-calendar-none {\n display: none;\n}\n.tui-full-calendar-icon.tui-full-calendar-calendar-dot {\n border-radius: 8px;\n width: 12px;\n height: 12px;\n margin: 1px;\n}\ninput[type='checkbox'].tui-full-calendar-checkbox-square {\n display: none;\n}\ninput[type='checkbox'].tui-full-calendar-checkbox-square + span {\n display: inline-block;\n cursor: pointer;\n line-height: 14px;\n margin-right: 8px;\n width: 14px;\n height: 14px;\n background: url(\"image/ic-checkbox-normal.png\") no-repeat;\n vertical-align: middle;\n}\ninput[type='checkbox'].tui-full-calendar-checkbox-square:checked + span {\n background: url(\"image/ic-checkbox-checked.png\") no-repeat;\n}\ninput[type='checkbox'].tui-full-calendar-checkbox-round {\n display: none;\n}\ninput[type='checkbox'].tui-full-calendar-checkbox-round + span {\n display: inline-block;\n cursor: pointer;\n width: 14px;\n height: 14px;\n line-height: 14px;\n vertical-align: middle;\n margin-right: 8px;\n border-radius: 8px;\n border: solid 2px;\n background: transparent;\n}\n.tui-full-calendar-popup-top-line {\n position: absolute;\n border-radius: 2px 2px 0 0;\n width: 100%;\n height: 4px;\n border: none;\n top: 0;\n}\n.tui-full-calendar-popup-detail .tui-full-calendar-popup-container {\n width: 301px;\n min-width: 301px;\n padding-bottom: 0;\n}\n.tui-full-calendar-popup-detail .tui-full-calendar-icon {\n width: 12px;\n height: 12px;\n background-size: 12px;\n position: relative;\n margin-right: 8px;\n}\n.tui-full-calendar-popup-detail .tui-full-calendar-icon.tui-full-calendar-ic-location-b {\n top: -2px;\n}\n.tui-full-calendar-popup-detail .tui-full-calendar-icon.tui-full-calendar-ic-user-b {\n top: -2px;\n}\n.tui-full-calendar-popup-detail .tui-full-calendar-icon.tui-full-calendar-ic-state-b {\n top: -1px;\n}\n.tui-full-calendar-popup-detail .tui-full-calendar-icon.tui-full-calendar-calendar-dot {\n width: 10px;\n height: 10px;\n margin-right: 8px;\n top: -1px;\n}\n.tui-full-calendar-popup-detail .tui-full-calendar-content {\n line-height: 24px;\n height: 24px;\n font-size: 12px;\n line-height: 2;\n}\n.tui-full-calendar-popup-detail .tui-full-calendar-section-header {\n margin-bottom: 6px;\n}\n.tui-full-calendar-popup-detail .tui-full-calendar-popup-detail-item-separate {\n margin-top: 4px;\n}\n.tui-full-calendar-popup-detail .tui-full-calendar-popup-detail-item-indent {\n text-indent: -20px;\n padding-left: 20px;\n}\n.tui-full-calendar-popup-detail .tui-full-calendar-schedule-title {\n font-size: 15px;\n font-weight: bold;\n line-height: 1.6;\n word-break: break-all;\n}\n.tui-full-calendar-popup-detail .tui-full-calendar-schedule-private {\n display: none;\n width: 16px;\n height: 16px;\n background: url(\"image/ic-lock.png\") no-repeat 16px;\n}\n.tui-full-calendar-popup-detail .tui-full-calendar-schedule-private .tui-full-calendar-ic-private {\n display: block;\n}\n.tui-full-calendar-popup-detail .tui-full-calendar-section-detail {\n margin-bottom: 16px;\n}\n.tui-full-calendar-popup-detail .tui-full-calendar-section-button {\n border-top: 1px solid #e5e5e5;\n font-size: 0;\n}\n.tui-full-calendar-section-button .tui-full-calendar-icon {\n margin-right: 4px;\n top: -3px;\n}\n.tui-full-calendar-section-button .tui-full-calendar-content {\n position: relative;\n top: 2px;\n}\n.tui-full-calendar-popup-edit,\n.tui-full-calendar-popup-delete {\n display: inline-block;\n padding: 7px 9px 11px 9px;\n width: calc(50% - 1px);\n outline: none;\n background: none;\n border: none;\n cursor: pointer;\n}\n.tui-full-calendar-popup-vertical-line {\n background: #e5e5e5;\n width: 1px;\n height: 14px;\n vertical-align: middle;\n display: inline-block;\n margin-top: -7px;\n}\n.tui-datepicker {\n left: -12px;\n z-index: 1;\n border-color: #d5d5d5;\n}\n.tui-full-calendar-icon {\n width: 14px;\n height: 14px;\n display: inline-block;\n vertical-align: middle;\n}\n.tui-full-calendar-icon.tui-full-calendar-ic-title {\n background: url(\"image/ic-subject.png\") no-repeat;\n}\n.tui-full-calendar-icon.tui-full-calendar-ic-location {\n background: url(\"image/ic-location.png\") no-repeat;\n}\n.tui-full-calendar-icon.tui-full-calendar-ic-date {\n background: url(\"image/ic-date.png\") no-repeat;\n}\n.tui-full-calendar-icon.tui-full-calendar-ic-state {\n background: url(\"image/ic-state.png\") no-repeat;\n}\n.tui-full-calendar-icon.tui-full-calendar-ic-private {\n background: url(\"image/ic-lock.png\") no-repeat;\n}\n.tui-full-calendar-icon.tui-full-calendar-ic-close {\n background: url(\"image/ic-close.png\") no-repeat;\n}\n.tui-full-calendar-ic-location-b {\n background: url(\"./image/ic-location-b.png\");\n}\n.tui-full-calendar-ic-state-b {\n background: url(\"./image/ic-state-b.png\");\n}\n.tui-full-calendar-icon.tui-full-calendar-ic-user-b {\n background-image: url(\"./image/ic-user-b.png\");\n}\n.tui-full-calendar-icon.tui-full-calendar-ic-edit {\n background-image: url(\"./image/ic-edit.png\");\n}\n.tui-full-calendar-icon.tui-full-calendar-ic-delete {\n background-image: url(\"./image/ic-delete.png\");\n}\n.tui-full-calendar-icon.tui-full-calendar-ic-arrow-solid-top {\n background: url(\"image/ic-arrow-solid-top.png\") no-repeat;\n}\n.tui-full-calendar-icon.tui-full-calendar-ic-milestone {\n background: url(\"image/ic-milestone.png\") no-repeat;\n}\n.tui-full-calendar-icon.tui-full-calendar-ic-arrow-left {\n background: url(\"image/ic-arrow-left.png\") no-repeat;\n}\n.tui-full-calendar-icon.tui-full-calendar-ic-arrow-right {\n background: url(\"image/ic-arrow-right.png\") no-repeat;\n}\n.tui-full-calendar-ic-repeat-b {\n background: url(\"./image/ic-repeat-b.png\");\n}\n/*# sourceMappingURL=src/css/main.css.map */","// Variables\n// default prefix\ncss-prefix = 'tui-full-calendar-'\n// Dayname\ndayname = css-prefix + 'dayname-'\n\nweekday = css-prefix + 'weekday-'\n// DayGrid\ndaygrid = css-prefix + 'daygrid-'\n// Time\ntimegrid = css-prefix + 'timegrid-'\ntime = css-prefix + 'time-'\n// Month\nmonth = css-prefix + 'month-'\n\n// Functions\nwh(w, h)\n width: w\n height: h\n\npos(top, left)\n top: top\n left: left\n\nclearfix()\n &:after\n content: '';\n display: block;\n clear: both;\n \n",".{css-prefix}month-week-item\n .{css-prefix}weekday-grid\n overflow-y: hidden\n\n .{css-prefix}weekday-schedules\n overflow-y: visible\n height: 0\n\n .{css-prefix}weekday-schedule\n margin: 0 10px\n\n .{css-prefix}today\n background: none\n\n .{css-prefix}weekday-grid-date-decorator\n display: inline-block\n wh(27px, 27px)\n line-height: 27px\n text-align: center\n background: #135de6\n border-radius: 50%\n color: #fff\n font-weight: bold\n margin-left: 2px\n\n+prefix-classes(weekday)\n .grid,\n .grid-line\n height: 100%\n min-height: inherit\n\n .grid\n position: absolute\n width: 100%\n overflow-y: scroll\n\n .border\n border-top: 1px solid #ddd\n\n .grid-line\n position: absolute\n padding: 3px\n\n .grid-footer\n position: absolute\n bottom: 4px\n\n .grid-date\n display: inline-block\n wh(27px, 27px)\n line-height: 27px\n text-align: center\n\n .grid-more-schedules\n float: right\n display: inline-block\n height: 27px\n line-height: 27px\n padding: 0 5px\n text-align: center\n font-size: 11px\n font-weight: bold\n color: #aaaaaa\n\n .creation\n pos(0, 0)\n wh(100%, 100%)\n position: absolute\n overflow-y: scroll\n\n .schedules\n pos(0, 0)\n wh(100%, 100%)\n position: absolute\n font-size: 12px\n overflow-y: scroll\n\n .schedule-block\n position: absolute\n\n .schedule-block-dragging-dim\n opacity: 0.3\n\n .schedule\n position: relative\n margin: 0 10px 0 1px\n cursor: pointer\n border-left-style: solid\n border-left-width: 3px\n\n &.schedule-time\n border-left-width: 0\n\n .schedule-title\n padding-left: 9px\n\n .schedule-bullet\n position: absolute\n padding: 0\n wh(6px, 6px)\n top: 6px\n left: 0\n border-radius: 50%\n\n .schedule-bullet-focused\n left: 10px\n background: #ffffff\n\n .schedule-title\n display: block\n white-space: nowrap\n overflow: hidden\n text-overflow: ellipsis\n padding-left: 3px;\n font-weight: bold;\n\n .schedule-title-focused\n padding-left: 16px\n\n .schedule-cover\n position: absolute\n top: 0\n width: 100%\n height: 100%\n background-color: rgba(0, 0, 0, 0.2)\n box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.1);\n\n .exceed-left .schedule\n margin-left: 0\n border-left-width: 0\n\n .exceed-right .schedule\n margin-right: 0\n\n .exceed-right .resize-handle\n display: none\n\n .exceed-in-month\n cursor: pointer\n &:hover\n background-color: #f0f1f5\n\n .exceed-in-week, .collapse-btn\n position: absolute\n bottom: 5px\n margin-right: 5px\n font-size: 12px\n line-height: 14px\n cursor: pointer\n padding: 1px 5px\n background-color: #ffffff\n border: 1px solid #dddddd\n color: #000000\n\n .resize-handle\n position: absolute\n top: 0\n right: 0\n width: 6px\n background-position: 3px center\n cursor: col-resize\n line-height: 18px\n\n .filled\n background-color: #e8e8e8 !important\n\n+prefix-classes(css-prefix)\n .left\n height: 100%\n float: left\n box-sizing: border-box\n display: table\n\n .left-content\n display: table-cell\n vertical-align: middle\n text-align: right\n font-size: 11px\n\n\n .right\n height: 100%\n overflow-y: scroll\n position: relative\n",".{css-prefix}week-container\n width: 100%\n height: inherit\n display: inline-block\n font-size: 10px\n min-height: 600px\n\n .{css-prefix}today\n background: none\n",".{css-prefix}dayname\n position: absolute\n margin-left: -1px\n height: 100%\n overflow: hidden\n\n &.{css-prefix}today\n font-weight: bold\n\n+prefix-classes(dayname)\n .container\n overflow-y: scroll\n\n .leftmargin\n position: relative\n height: 100%\n \n .date\n font-size: 26px\n \n .name\n font-weight: bold\n font-size: 12px\n","// DayGrid view\n+prefix-classes(daygrid)\n .layout\n height: 100%;\n\n.{css-prefix}daygrid-layout\n .{css-prefix}right\n overflow-y: hidden\n\n// Guide element\n+prefix-classes(daygrid + guide-)\n .creation-block\n position: absolute\n top: 0\n bottom: 0\n z-index: 1\n","+prefix-classes(timegrid)\n .container\n height: 100%\n position: relative\n overflow: hidden\n overflow-y: scroll\n\n .container-split\n height: 100%\n position: relative\n overflow: hidden\n\n .left\n position: absolute\n\n .hour\n position: relative\n color: #555\n box-sizing: border-box\n &:first-child span\n display: none\n &:last-child\n border-bottom: none\n\n .hour span\n position: absolute\n top: -11px\n left: 0\n right: 5px\n text-align: right\n line-height: 25px\n\n .right\n position: relative\n\n .gridline\n border-bottom: 1px solid #eee\n box-sizing: border-box\n &:last-child\n border-bottom: none\n\n .schedules\n position: absolute\n wh(100%, 100%)\n pos(0, 0)\n cursor: pointer\n\n // Hourmarker\n .hourmarker\n position: absolute\n width: 100%\n display: table\n\n .hourmarker-line-left\n position: absolute\n min-height: 1px\n left: 0\n\n .hourmarker-line-today\n position: absolute\n min-height: 1px\n\n .hourmarker-line-right\n position: absolute\n min-height: 1px\n right: 0\n\n .hourmarker-time\n padding-right: 5px\n line-height: 12px\n text-align: right\n display: table-cell\n vertical-align: bottom\n\n // Todaymarker\n .todaymarker\n position: absolute\n text-indent: -9999px\n wh(9px, 9px)\n background-color: #135de6\n margin: -4px 0 0 -5px\n border-radius: 50%\n\n .sticky-container\n position: absolute\n top: 0\n \n .timezone-label-container\n position: absolute\n \n .timezone-label-cell\n display: table\n \n .timezone-label\n display: table-cell\n vertical-align: middle\n padding-right: 5px\n text-align: right\n \n .timezone-close-btn\n cursor: pointer\n position: absolute\n text-align: center\n background-color: #ffffff\n\n.{css-prefix}timegrid-timezone-close-btn\n .{css-prefix}icon\n width: 5px\n height: 10px\n\n+prefix-classes(time)\n .date\n position: absolute\n height: 100%\n margin-left: -1px\n box-sizing: content-box\n &:last-child\n border-right: none\n margin: 0\n // last creation guide element\n .schedule,\n .guide-creation\n left: 0px\n\n .date-schedule-block-wrap\n position: relative\n height: 100%\n\n .date-schedule-block\n position: absolute\n right: 0px\n\n .date-schedule-block-pending\n opacity: 0.7\n\n .date-schedule-block-dragging-dim\n opacity: 0.3\n\n .date-schedule-block-focused\n box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.2)\n\n .date-schedule-block-cover\n position: absolute\n top: 0\n width: 100%\n height: 100%\n background-color: rgba(0, 0, 0, 0.2)\n box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.1);\n\n .schedule\n position: relative\n left: 1px\n height: 100%\n overflow: hidden\n font-size: 12px\n font-weight: bold\n\n .schedule-content\n overflow: hidden\n border-left-width: 3px\n border-left-style: solid\n padding: 1px 0 0 3px\n\n .schedule-content-travel-time\n font-weight: normal;\n font-size: 11px;\n\n .resize-handle\n position: absolute\n right: 0px\n bottom: 0px\n left: 0px\n height: 5px\n text-align: center\n color: #fff\n cursor: row-resize\n background-position: center top\n\n // Guide element\n .guide-creation\n position: absolute\n right: 10px\n left: 1px\n padding: 3px\n\n .guide-move,\n .guide-resize\n .schedule,\n .resize-handle\n opacity: 0.8\n z-index: 97\n\n .guide-creation-label\n cursor: default\n\n .guide-bottom\n position: absolute\n bottom: 3px\n",".{css-prefix}month\n height: 100%\n min-height: 600px\n\n+prefix-classes(month)\n .dayname\n width: 100%\n position: absolute\n font-size: 13px\n\n .dayname-item\n height: 100%\n font-weight: bold\n\n .week-item\n position: relative\n &>div\n height: 100%\n\n .more\n height: inherit\n min-width: 280px\n min-height: 150px\n\n .more-title\n position: relative\n \n .more-title-day\n font-size: 23px\n color #333\n \n .more-title-day-label\n font-size: 12px\n color: #333\n\n .more-close\n position: absolute\n right: 0\n outline: 0\n background none\n border: 0\n font-size: 14px\n line-height: 28px\n padding: 0 7px\n cursor: pointer\n\n .more-list\n overflow-y: auto\n\n .more-schedule\n cursor: pointer\n display: block\n overflow: hidden\n white-space: nowrap\n text-overflow: ellipsis\n font-size: 12px\n\n .guide-block\n position: absolute\n\n .weekday-schedule\n margin-top: 2px\n\n .creation-guide\n top: 0\n bottom: -1px\n left: -1px\n right: 0\n position: absolute\n z-index: 20\n\n .guide-focused\n box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.2)\n\n .guide\n position: relative\n padding-left: 3px\n line-height: 18px\n overflow: hidden\n white-space: nowrap\n text-overflow: ellipsis\n\n .guide-cover\n width: 100%\n position: absolute\n top: -50%\n left: -50%\n background-color: rgba(0, 0, 0, 0.2)\n box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.1)\n\n .exceed-left .guide\n margin-left: 0px\n\n .exceed-right .guide\n margin-right: 0px\n\n .exceed-right .guide-handle\n display: none\n\n .guide-handle\n position: absolute\n top: 0\n right: 3px\n width: 6px\n background-position: 3px center\n cursor: col-resize\n","+prefix-classes(css-prefix)\n .vlayout-container\n position: relative\n\n .splitter\n clear: left\n cursor: row-resize\n\n &:hover\n border-color: #999\n\n .splitter-focused\n background-color: #ddd\n border: none\n\n .splitter-guide\n position: absolute\n wh(100%, 3px)\n border: none\n background-color: #e8e8e8\n",".{css-prefix}popup\n position: absolute\n font-weight: 2.5\n box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.1)\n clear: both\n\n.{css-prefix}popup-container\n min-width: 474px\n box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.1)\n background-color: #ffffff\n border: solid 1px #d5d5d5\n padding: 17px\n border-radius: 2px\n\n.{css-prefix}popup-section\n font-size: 0\n min-height: 40px\n\n.{css-prefix}section-calendar\n width: 176px\n\n.{css-prefix}section-calendar.{css-prefix}hide\n height: 21px\n visibility: hidden\n\n.{css-prefix}section-title\n width: calc(100% - 36px)\n padding-right: 4px\n\n.{css-prefix}section-title input\n width: 365px\n\n.{css-prefix}button.{css-prefix}section-private\n height: 32px\n padding: 8px\n font-size: 0\n margin-left: 4px\n\n.{css-prefix}section-private.{css-prefix}public .{css-prefix}ic-private\n background: url('image/ic-unlock.png') no-repeat\n\n.{css-prefix}section-start-date\n.{css-prefix}section-end-date\n width: 176px\n\n input\n width: 139px\n\n &:hover\n &:focus\n .{css-prefix}popup-section-item\n .tui-datepicker\n border-color: #bbbbbb\n\n\n.{css-prefix}popup-section-item:focus\n border-color: #bbbbbb\n\n.{css-prefix}section-date-dash\n font-size: 12px\n color: #d5d5d5\n height: 32px\n padding: 0 4px\n vertical-align: middle\n\n.{css-prefix}popup-section-item\n &.{css-prefix}section-allday\n border: none\n padding: 0 0 0 8px\n cursor: pointer\n &.{css-prefix}section-location\n display: block\n\n input\n width: 400px\n\n.{css-prefix}section-allday .{css-prefix}icon.{css-prefix}ic-checkbox\n margin: 0\n\n.{css-prefix}popup-section-item.{css-prefix}section-allday .{css-prefix}content\n padding-left: 4px\n\n.{css-prefix}section-state\n width: 109px\n\n.{css-prefix}section-state .{css-prefix}content\n width: 58px\n text-overflow: ellipsis\n overflow: hidden\n\n.{css-prefix}popup-section-item\n height: 32px\n padding: 0 9px 0 12px\n border: 1px solid #d5d5d5\n display: inline-block\n font-size: 0\n border-radius: 2px\n\n.{css-prefix}popup-section-item:hover\n border-color: #bbbbbb\n\n.{css-prefix}popup-section-item:focus\n border-color: #bbbbbb\n\n.{css-prefix}popup-section-item .{css-prefix}icon\n position: relative\n\n.{css-prefix}popup-section-item .{css-prefix}content\n text-align: left\n display: inline-block\n font-size: 12px\n vertical-align: middle\n position: relative\n padding-left: 8px\n\n.{css-prefix}section-calendar .{css-prefix}dropdown-button .{css-prefix}content\n width: 125px\n text-overflow: ellipsis\n overflow: hidden\n top: -1px\n\n.{css-prefix}popup-section-item input\n border: none\n height: 30px\n outline: none\n display: inline-block\n\n.{css-prefix}popup-section-item input::placeholder\n color: #bbbbbb\n font-weight: 300\n\n.{css-prefix}dropdown\n position: relative\n\n.{css-prefix}dropdown:hover .{css-prefix}dropdown-button\n border: 1px solid #bbbbbb\n\n.{css-prefix}dropdown-button.{css-prefix}popup-section-item\n height: 32px\n font-size: 0\n top: -1px\n\n.{css-prefix}dropdown-arrow\n background: url('image/ic-arrow-solid-bottom.png') no-repeat\n\n\n.dropdown.open\n.{css-prefix}open\n .{css-prefix}dropdown-arrow\n background: url('image/ic-arrow-solid-top.png') no-repeat\n\n.{css-prefix}dropdown-menu\n position: absolute\n top: 31px\n padding: 4px 0\n background-color: #ffffff\n border: 1px solid #d5d5d5\n border-top: none\n border-radius: 0 0 2px 2px\n width: 100%\n display: none\n\n.{css-prefix}dropdown:hover .{css-prefix}dropdown-menu\n border: 1px solid #bbbbbb\n border-top: none\n\n.{css-prefix}open .{css-prefix}dropdown-menu\n display: block\n\n.{css-prefix}dropdown-menu-item\n height: 30px\n border: none\n cursor: pointer\n\n.{css-prefix}section-calendar .{css-prefix}dropdown-menu-item\n width: 100%;\n\n.{css-prefix}section-state .{css-prefix}dropdown-menu-item\n width: 100%;\n\n.{css-prefix}dropdown-menu-item:hover\n background-color: rgba(81, 92, 230, 0.05)\n\n.{css-prefix}dropdown-menu-item .{css-prefix}content\n line-height: 30px\n\n.{css-prefix}button.{css-prefix}popup-close\n position: absolute\n top: 10px\n right: 10px\n background-color: #ffffff\n padding: 2px\n border: none\n\n.{css-prefix}section-button-save\n height: 36px\n\n.{css-prefix}popup-save\n float: right\n\n.{css-prefix}popup-arrow-border, .{css-prefix}popup-arrow-fill\n position: absolute\n\n.{css-prefix}arrow-top .{css-prefix}popup-arrow-border\n border-top: none\n border-right: 8px solid transparent\n border-bottom: 8px solid #d5d5d5\n border-left: 8px solid transparent\n left: calc(50% - 8px)\n top: -7px\n\n.{css-prefix}arrow-right .{css-prefix}popup-arrow-border\n border-top: 8px solid transparent\n border-right: none\n border-bottom: 8px solid transparent\n border-left: 8px solid #d5d5d5\n top: calc(50% - 8px)\n right: -7px\n\n.{css-prefix}arrow-bottom .{css-prefix}popup-arrow-border\n border-top: 8px solid #d5d5d5\n border-right: 8px solid transparent\n border-bottom: none\n border-left: 8px solid transparent\n left: calc(50% - 8px)\n bottom: -7px\n\n.{css-prefix}arrow-left .{css-prefix}popup-arrow-border\n border-top: 8px solid transparent\n border-right: 8px solid #d5d5d5\n border-bottom: 8px solid transparent\n border-left: none\n top: calc(50% - 8px)\n left: -7px\n\n.{css-prefix}arrow-top .{css-prefix}popup-arrow-fill\n border-top: none\n border-right: 7px solid transparent\n border-bottom: 7px solid #ffffff\n border-left: 7px solid transparent\n left: -7px\n top: 1px\n\n.{css-prefix}arrow-right .{css-prefix}popup-arrow-fill\n border-top: 7px solid transparent\n border-right: none\n border-bottom: 7px solid transparent\n border-left: 7px solid #ffffff\n top: -7px\n right: 1px\n\n.{css-prefix}arrow-bottom .{css-prefix}popup-arrow-fill\n border-top: 7px solid #ffffff\n border-right: 7px solid transparent\n border-bottom: none\n border-left: 7px solid transparent\n left: -7px\n bottom: 1px\n\n.{css-prefix}arrow-left .{css-prefix}popup-arrow-fill\n border-top: 7px solid transparent\n border-right: 7px solid #ffffff\n border-bottom: 7px solid transparent\n border-left: none\n top: -7px\n left: 1px\n\n.{css-prefix}button\n background: #ffffff\n border: 1px solid #d5d5d5\n border-radius: 2px\n text-align: center\n outline: none\n font-size: 12px\n cursor: pointer\n color: #333\n\n &:hover\n border-color: #bbbbbb\n color: #333333\n\n\n.{css-prefix}button:active\n background: #f9f9f9\n color: #333333\n\n\n.{css-prefix}button .round\n border-radius: 25px\n\n.{css-prefix}confirm\n width: 96px\n height: 36px\n border-radius: 40px\n background-color: #ff6618\n font-size: 12px\n font-weight: bold\n color: #ffffff\n border: none\n\n.{css-prefix}confirm:hover\n background-color: #e55b15\n color: #ffffff\n\n.{css-prefix}confirm:active\n background-color: #d95614\n color: #ffffff\n\n/* icon styles */\n.{css-prefix}icon.{css-prefix}right\n float: right\n top: 1px\n\n.{css-prefix}icon .{css-prefix}none\n display: none\n\n.{css-prefix}icon.{css-prefix}calendar-dot\n border-radius: 8px;\n width: 12px;\n height: 12px;\n margin: 1px;\n\ninput[type='checkbox'].{css-prefix}checkbox-square\n display: none\n\ninput[type='checkbox'].{css-prefix}checkbox-square + span\n display: inline-block\n cursor: pointer\n line-height: 14px\n margin-right: 8px\n width: 14px\n height: 14px\n background: url('image/ic-checkbox-normal.png') no-repeat\n vertical-align: middle\n\ninput[type='checkbox'].{css-prefix}checkbox-square:checked + span {\n background: url('image/ic-checkbox-checked.png') no-repeat;\n}\n\ninput[type='checkbox'].{css-prefix}checkbox-round\n display: none\n\ninput[type='checkbox'].{css-prefix}checkbox-round + span\n display: inline-block\n cursor: pointer\n width: 14px\n height: 14px\n line-height: 14px\n vertical-align: middle\n margin-right: 8px\n border-radius: 8px\n border: solid 2px\n background: transparent\n\n.{css-prefix}popup-top-line\n position: absolute\n border-radius: 2px 2px 0 0\n width: 100%\n height: 4px\n border: none\n top: 0\n\n.{css-prefix}popup-detail .{css-prefix}popup-container\n width: 301px\n min-width: 301px\n padding-bottom: 0\n\n.{css-prefix}popup-detail .{css-prefix}icon\n width: 12px\n height: 12px\n background-size: 12px\n position: relative\n margin-right: 8px\n\n.{css-prefix}popup-detail .{css-prefix}icon.{css-prefix}ic-location-b\n top: -2px\n\n.{css-prefix}popup-detail .{css-prefix}icon.{css-prefix}ic-user-b\n top: -2px\n\n.{css-prefix}popup-detail .{css-prefix}icon.{css-prefix}ic-state-b\n top: -1px\n\n.{css-prefix}popup-detail .{css-prefix}icon.{css-prefix}calendar-dot\n width: 10px\n height: 10px\n margin-right: 8px\n top: -1px\n\n.{css-prefix}popup-detail .{css-prefix}content\n line-height: 24px\n height: 24px\n font-size: 12px\n line-height: 2\n\n.{css-prefix}popup-detail .{css-prefix}section-header\n margin-bottom: 6px\n\n.{css-prefix}popup-detail .{css-prefix}popup-detail-item-separate\n margin-top: 4px\n\n.{css-prefix}popup-detail .{css-prefix}popup-detail-item-indent\n text-indent: -20px\n padding-left: 20px\n\n.{css-prefix}popup-detail .{css-prefix}schedule-title\n font-size: 15px\n font-weight: bold\n line-height: 1.6\n word-break: break-all\n\n.{css-prefix}popup-detail .{css-prefix}schedule-private\n display: none\n width: 16px\n height: 16px\n background: url('image/ic-lock.png') no-repeat 16px\n\n.{css-prefix}popup-detail .{css-prefix}schedule-private .{css-prefix}ic-private\n display: block\n\n.{css-prefix}popup-detail .{css-prefix}section-detail\n margin-bottom: 16px\n\n.{css-prefix}popup-detail .{css-prefix}section-button\n border-top: 1px solid #e5e5e5\n font-size: 0\n\n.{css-prefix}section-button .{css-prefix}icon\n margin-right: 4px\n top: -3px\n\n.{css-prefix}section-button .{css-prefix}content\n position: relative\n top: 2px\n\n.{css-prefix}popup-edit, .{css-prefix}popup-delete\n display: inline-block\n padding: 7px 9px 11px 9px\n width: calc(50% - 1px)\n outline: none\n background: none\n border: none\n cursor: pointer\n\n.{css-prefix}popup-vertical-line\n background: #e5e5e5\n width: 1px\n height: 14px\n vertical-align: middle\n display: inline-block\n margin-top: -7px\n\n/* override tui-date-picker */\n.tui-datepicker\n left: -12px\n z-index: 1\n border-color: #d5d5d5\n","/* icon styles */\n.{css-prefix}icon {\n width: 14px;\n height: 14px;\n display: inline-block;\n vertical-align: middle;\n}\n\n.{css-prefix}icon.{css-prefix}ic-title\n background: url('image/ic-subject.png') no-repeat\n\n.{css-prefix}icon.{css-prefix}ic-location\n background: url('image/ic-location.png') no-repeat\n\n.{css-prefix}icon.{css-prefix}ic-date\n background: url('image/ic-date.png') no-repeat\n\n.{css-prefix}icon.{css-prefix}ic-state\n background: url('image/ic-state.png') no-repeat\n\n.{css-prefix}icon.{css-prefix}ic-private\n background: url('image/ic-lock.png') no-repeat\n\n.{css-prefix}icon.{css-prefix}ic-close\n background: url('image/ic-close.png') no-repeat\n\n\n.{css-prefix}ic-location-b\n background: url('./image/ic-location-b.png')\n\n.{css-prefix}ic-state-b\n background: url('./image/ic-state-b.png')\n\n.{css-prefix}icon.{css-prefix}ic-user-b\n background-image: url('./image/ic-user-b.png')\n\n.{css-prefix}icon.{css-prefix}ic-edit\n background-image: url('./image/ic-edit.png')\n\n.{css-prefix}icon.{css-prefix}ic-delete\n background-image: url('./image/ic-delete.png')\n\n.{css-prefix}icon.{css-prefix}ic-arrow-solid-top\n background: url('image/ic-arrow-solid-top.png') no-repeat\n\n.{css-prefix}icon.{css-prefix}ic-milestone\n background: url('image/ic-milestone.png') no-repeat\n\n.{css-prefix}icon.{css-prefix}ic-arrow-left\n background: url('image/ic-arrow-left.png') no-repeat\n\n.{css-prefix}icon.{css-prefix}ic-arrow-right\n background: url('image/ic-arrow-right.png') no-repeat\n\n.{css-prefix}ic-repeat-b\n background: url('./image/ic-repeat-b.png')\n","/*!\n * TOAST UI Date Picker\n * @version 4.3.1\n * @author NHN. FE Development Lab \n * @license MIT\n */\n@charset \"utf-8\";\n.tui-calendar {\n position: relative;\n background-color: #fff;\n border: 1px solid #aaa;\n width: 274px;\n}\n\n.tui-calendar * {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n\n.tui-calendar div {\n text-align: center\n}\n\n.tui-calendar caption {\n padding: 0\n}\n\n.tui-calendar caption span {\n overflow: hidden;\n position: absolute;\n clip: rect(0 0 0 0);\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0\n}\n\n.tui-calendar button, .tui-datepicker-dropdown button, .tui-datepicker-selector button {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none\n}\n\n.tui-ico-date, .tui-ico-time, .tui-datepicker-dropdown .tui-ico-check, .tui-ico-caret {\n overflow: hidden;\n display: inline-block;\n width: 1px;\n height: 1px;\n line-height: 300px;\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC8AAAA+CAYAAAC7rUKSAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpERjdGMzkzODVEQkRFNjExQkVCMjlDOUFDNzZDM0E5NCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1ODVCRTc4NkM2QkQxMUU2OTgzMzhGQjZFMjcyMTQ1RSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1ODVCRTc4NUM2QkQxMUU2OTgzMzhGQjZFMjcyMTQ1RSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjFERENDMTc0QjlDNkU2MTE5OTc0QjIwOTY3QkQzNjZBIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkRGN0YzOTM4NURCREU2MTFCRUIyOUM5QUM3NkMzQTk0Ii8+IDwvcmRmOkRlc2NyaXB0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) no-repeat\n}\n\n.tui-ico-date {\n width: 12px;\n height: 12px;\n background-position: -17px 0\n}\n\n.tui-ico-time {\n width: 12px;\n height: 12px;\n background-position: 0 -30px\n}\n\n.tui-ico-caret {\n width: 7px;\n height: 4px;\n background-position: 0 -58px\n}\n\n.tui-calendar-month, .tui-calendar-year {\n width: 202px;\n}\n\n.tui-calendar-month .tui-calendar-body, .tui-calendar-year .tui-calendar-body {\n width: 202px;\n margin: 0 auto;\n}\n\n.tui-calendar .tui-calendar-header {\n position: relative;\n border-bottom: 1px solid #efefef\n}\n\n.tui-calendar .tui-calendar-header-inner {\n padding: 17px 50px 15px;\n height: 50px\n}\n\n.tui-calendar .tui-calendar-title-today {\n height: 30px;\n margin: 0;\n font-size: 12px;\n line-height: 34px;\n color: #777;\n background-color: #f4f4f4\n}\n\n.tui-calendar .tui-calendar-title-today:hover {\n color: #333;\n background-color: #edf4fc;\n cursor: pointer;\n}\n\n.tui-calendar .tui-calendar-title {\n display: inline-block;\n font-size: 18px;\n font-weight: normal;\n font-style: normal;\n line-height: 1;\n color: #333;\n cursor: default;\n vertical-align: top\n}\n\n.tui-calendar-btn {\n overflow: hidden;\n position: absolute;\n top: 0;\n width: 32px;\n height: 50px;\n line-height: 400px;\n z-index: 10;\n cursor: pointer;\n border: none;\n background-color: #fff;\n}\n\n.tui-calendar .tui-calendar-btn-prev-month {\n left: 0\n}\n\n.tui-calendar .tui-calendar-btn-next-month {\n right: 0\n}\n\n.tui-calendar .tui-calendar-btn-prev-year {\n left: 0\n}\n\n.tui-calendar .tui-calendar-btn-next-year {\n right: 0\n}\n\n.tui-calendar .tui-calendar-btn-prev-month:after, .tui-calendar .tui-calendar-btn-next-month:after, .tui-calendar .tui-calendar-btn-prev-year:after, .tui-calendar .tui-calendar-btn-next-year:after {\n overflow: hidden;\n position: absolute;\n top: 50%;\n margin-top: -5px;\n line-height: 400px;\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC8AAAA+CAYAAAC7rUKSAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpERjdGMzkzODVEQkRFNjExQkVCMjlDOUFDNzZDM0E5NCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1ODVCRTc4NkM2QkQxMUU2OTgzMzhGQjZFMjcyMTQ1RSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1ODVCRTc4NUM2QkQxMUU2OTgzMzhGQjZFMjcyMTQ1RSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjFERENDMTc0QjlDNkU2MTE5OTc0QjIwOTY3QkQzNjZBIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkRGN0YzOTM4NURCREU2MTFCRUIyOUM5QUM3NkMzQTk0Ii8+IDwvcmRmOkRlc2NyaXB0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) no-repeat;\n content: ''\n}\n\n.tui-calendar .tui-calendar-btn-prev-month:after, .tui-calendar.tui-calendar-month .tui-calendar-btn-prev-year:after {\n width: 6px;\n height: 11px;\n left: 50%;\n margin-left: -3px;\n background-position: 0 0\n}\n\n.tui-calendar .tui-calendar-btn-next-month:after, .tui-calendar.tui-calendar-month .tui-calendar-btn-next-year:after {\n width: 6px;\n height: 11px;\n right: 50%;\n margin-right: -3px;\n background-position: -8px 0\n}\n\n.tui-calendar .tui-calendar-btn-prev-year:after {\n width: 11px;\n height: 10px;\n left: 50%;\n margin-left: -6px;\n background-position: -16px -36px\n}\n\n.tui-calendar .tui-calendar-btn-next-year:after {\n width: 11px;\n height: 10px;\n right: 50%;\n margin-right: -6px;\n background-position: -16px -49px\n}\n\n.tui-calendar.tui-calendar-month .tui-calendar-btn-prev-year, .tui-calendar.tui-calendar-month .tui-calendar-btn-next-year {\n width: 50px\n}\n\n.tui-calendar .tui-calendar-has-btns .tui-calendar-btn-prev-year {\n left: 10px\n}\n\n.tui-calendar .tui-calendar-has-btns .tui-calendar-btn-next-year {\n right: 10px\n}\n\n.tui-calendar .tui-calendar-has-btns .tui-calendar-btn-prev-month {\n left: 44px\n}\n\n.tui-calendar .tui-calendar-has-btns .tui-calendar-btn-next-month {\n right: 44px\n}\n\n.tui-calendar .tui-calendar-body-header th {\n color: #777\n}\n\n.tui-calendar .tui-calendar-body-inner {\n width: 100%;\n margin: 0 auto;\n table-layout: fixed;\n border-collapse: collapse;\n text-align: center;\n font-size: 12px\n}\n\n.tui-calendar th {\n font-weight: normal;\n cursor: default\n}\n\n.tui-calendar th, .tui-calendar td {\n height: 39px;\n text-align: center;\n color: #999\n}\n\n.tui-calendar .tui-is-blocked:hover {\n cursor: default\n}\n\n.tui-calendar .tui-calendar-month {\n width: 25%;\n height: 50px\n}\n\n.tui-calendar .tui-calendar-today {\n color: #4b96e6\n}\n\n.tui-calendar .tui-calendar-prev-month, .tui-calendar .tui-calendar-next-month {\n color: #ccc\n}\n\n.tui-calendar .tui-calendar-prev-month.tui-calendar-date, .tui-calendar .tui-calendar-next-month.tui-calendar-date {\n visibility: hidden\n}\n\n.tui-calendar .tui-calendar-btn-choice {\n background-color: #4b96e6\n}\n\n.tui-calendar .tui-calendar-btn-close {\n background-color: #777\n}\n\n.tui-calendar .tui-calendar-year {\n width: 25%;\n height: 50px\n}\n\n.tui-calendar.tui-calendar-year .tui-calendar-btn-prev-year:after {\n width: 6px;\n height: 11px;\n left: 50%;\n margin-left: -3px;\n background-position: 0 0\n}\n\n.tui-calendar.tui-calendar-year .tui-calendar-btn-next-year:after {\n width: 6px;\n height: 11px;\n right: 50%;\n margin-right: -3px;\n background-position: -8px 0\n}\n\n.tui-calendar.tui-calendar-year .tui-calendar-btn-prev-year, .tui-calendar.tui-calendar-year .tui-calendar-btn-next-year {\n width: 50px\n}\n\n.tui-datepicker {\n border: 1px solid #aaa;\n background-color: white;\n position: absolute;\n}\n\n.tui-datepicker * {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n\n.tui-datepicker-type-date {\n width: 274px;\n}\n\n.tui-datepicker-body .tui-calendar-month, .tui-datepicker-body .tui-calendar-year {\n width: auto;\n}\n\n.tui-datepicker .tui-calendar {\n border: 0;\n}\n\n.tui-datepicker .tui-calendar-title {\n cursor: pointer;\n}\n\n.tui-datepicker .tui-calendar-title.tui-calendar-title-year-to-year {\n cursor: auto;\n}\n\n.tui-datepicker-body .tui-timepicker, .tui-datepicker-footer .tui-timepicker {\n width: 274px;\n position: static;\n padding: 20px 46px 20px 47px;\n border: 0\n}\n\n.tui-datepicker-footer .tui-timepicker {\n border-top: 1px solid #eee\n}\n\n.tui-datepicker-selector {\n padding: 10px;\n font-size: 0;\n text-align: center;\n border-bottom: 1px solid #eee\n}\n\n.tui-datepicker-selector-button {\n width: 50%;\n height: 26px;\n font-size: 12px;\n line-height: 23px;\n border: 1px solid #ddd;\n background-color: #fff;\n color: #777;\n outline: none;\n cursor: pointer\n}\n\n.tui-datepicker-selector-button.tui-is-checked {\n background-color: #eee;\n color: #333\n}\n\n.tui-datepicker-selector-button+.tui-datepicker-selector-button {\n margin-left: -1px\n}\n\n.tui-datepicker-selector-button [class^=tui-ico-] {\n margin: 5px 9px 0 0;\n vertical-align: top;\n}\n\n.tui-datepicker-selector-button.tui-is-checked .tui-ico-date, .tui-datepicker-input.tui-has-focus .tui-ico-date {\n background-position: -17px -14px\n}\n\n.tui-datepicker-selector-button.tui-is-checked .tui-ico-time {\n background-position: 0 -44px\n}\n\n.tui-datepicker-area {\n position: relative\n}\n\n.tui-datepicker-input {\n position: relative;\n display: inline-block;\n width: 120px;\n height: 28px;\n vertical-align: top;\n border: 1px solid #ddd\n}\n\n.tui-datepicker-input * {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n\n.tui-datepicker-input > input {\n width: 100%;\n height: 100%;\n padding: 6px 27px 6px 10px;\n font-size: 12px;\n line-height: 14px;\n vertical-align: top;\n border: 0;\n color: #333\n}\n\n.tui-datepicker-input > .tui-ico-date {\n position: absolute;\n top: 50%;\n right: 8px;\n margin: -6px 0 0 0\n}\n\n.tui-datepicker-input.tui-has-focus {\n border-color: #aaa\n}\n\n.tui-datetime-input {\n width: 170px\n}\n\n.tui-datepicker .tui-is-blocked {\n cursor: default;\n color: #ddd\n}\n\n.tui-datepicker .tui-is-valid {\n color: #999\n}\n\n.tui-datepicker .tui-is-selectable:hover {\n background-color: #edf4fc;\n cursor: pointer;\n}\n\n.tui-datepicker .tui-is-selectable.tui-is-selected, .tui-datepicker.tui-rangepicker .tui-is-selectable.tui-is-selected {\n background-color: #4b96e6;\n color: #fff\n}\n\n.tui-datepicker.tui-rangepicker .tui-is-selected-range {\n background-color: #edf4fc;\n}\n\n.tui-datepicker-dropdown {\n display: inline-block;\n width: 120px\n}\n\n.tui-datepicker-dropdown .tui-dropdown-button {\n width: 100%;\n height: 28px;\n padding: 0 10px;\n font-size: 12px;\n line-height: 20px;\n border: 1px solid #ddd;\n padding: 0 30px 0 10px;\n text-align: left;\n background: #fff;\n cursor: pointer\n}\n\n.tui-datepicker-dropdown {\n position: relative\n}\n\n.tui-datepicker-dropdown .tui-ico-caret {\n position: absolute;\n top: 12px;\n right: 10px\n}\n\n.tui-datepicker-dropdown .tui-dropdown-menu {\n display: none;\n position: absolute;\n top: 27px;\n left: 0;\n right: 0;\n width: 100%;\n padding: 5px 0;\n margin: 0;\n overflow-y: auto;\n min-width: 0;\n max-height: 198px;\n font-size: 12px;\n border: 1px solid #ddd;\n border-top-color: #fff;\n z-index: 10;\n box-sizing: border-box;\n box-shadow: none;\n border-radius: 0\n}\n\n.tui-datepicker-dropdown.tui-is-open .tui-dropdown-button {\n display: block\n}\n\n.tui-datepicker-dropdown.tui-is-open .tui-dropdown-menu, .tui-datepicker-dropdown.tui-is-open .tui-dropdown-button {\n display: block;\n border-color: #aaa\n}\n\n.tui-datepicker-dropdown.tui-is-open .tui-ico-caret {\n background-position: -21px -28px\n}\n\n.tui-datepicker-dropdown .tui-menu-item {\n position: relative;\n overflow: hidden;\n position: relative;\n height: 28px;\n line-height: 28px;\n background-color: #fff;\n z-index: 10\n}\n\n.tui-datepicker-dropdown .tui-menu-item-btn {\n position: relative;\n width: 100%;\n font-size: 12px;\n font-weight: normal;\n line-height: 28px;\n padding: 0 10px 0 30px;\n text-align: left;\n color: #333;\n background-color: #fff;\n border: 0;\n cursor: pointer;\n z-index: 9\n}\n\n.tui-datepicker-dropdown .tui-menu-item-btn:hover, .tui-menu-item-btn:focus, .tui-menu-item-btn:active {\n color: #333;\n background-color: #f4f4f4\n}\n\n.tui-datepicker-dropdown .tui-menu-item .tui-ico-check {\n display: none;\n overflow: hidden;\n position: absolute;\n width: 10px;\n height: 8px;\n top: 10px;\n left: 10px;\n background-position: -31px -54px;\n z-index: 10;\n content: 'aaa'\n}\n\n.tui-datepicker-dropdown .tui-menu-item.tui-is-selected .tui-ico-check {\n display: block\n}\n\n.tui-datepicker-dropdown .tui-menu-item.tui-is-selected .tui-menu-item-btn {\n font-weight: bold\n}\n\n.tui-dropdown-area {\n font-size: 0\n}\n\n.tui-dropdown-area .tui-datepicker-dropdown+.tui-datepicker-dropdown {\n margin-left: 5px\n}\n\n.tui-hidden {\n display: none;\n}\n\n","/*!\n * TOAST UI Time Picker\n * @version 2.1.4\n * @author NHN FE Development Lab \n * @license MIT\n */\n@charset 'utf-8';\n.tui-timepicker * {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n\n.tui-timepicker button {\n border-radius: 0;\n}\n\n.tui-timepicker input, .tui-timepicker select {\n font-weight: normal;\n}\n\n.tui-ico-t-btn, .tui-timepicker-input-radio, .tui-ico-colon, .tui-ico-time {\n overflow: hidden;\n display: inline-block;\n width: 1px;\n height: 1px;\n line-height: 300px;\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC8AAAA+CAYAAAC7rUKSAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpERjdGMzkzODVEQkRFNjExQkVCMjlDOUFDNzZDM0E5NCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1ODVCRTc4NkM2QkQxMUU2OTgzMzhGQjZFMjcyMTQ1RSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1ODVCRTc4NUM2QkQxMUU2OTgzMzhGQjZFMjcyMTQ1RSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjFERENDMTc0QjlDNkU2MTE5OTc0QjIwOTY3QkQzNjZBIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkRGN0YzOTM4NURCREU2MTFCRUIyOUM5QUM3NkMzQTk0Ii8+IDwvcmRmOkRlc2NyaXB0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) no-repeat;\n}\n\n.tui-timepicker .tui-timepicker-select {\n -webkit-appearance: none;\n -moz-appearance: none;\n -o-appearance: none;\n appearance: none;\n border-radius: 0;\n}\n\n.tui-timepicker .tui-timepicker-select::-ms-expand {\n display: none;\n}\n\n.tui-calendar-select-content .tui-timepicker {\n border: 0;\n margin: 0 auto;\n}\n\n.tui-timepicker input {\n font-size: 16px;\n text-align: center;\n font-weight: normal;\n}\n\n.tui-timepicker {\n position: relative;\n top: -1px;\n padding: 30px 20px;\n font-weight: bold;\n border: 1px solid #aaa;\n background: white;\n text-align: center;\n}\n\n.tui-timepicker-row {\n width: 100%;\n font-size: 0;\n}\n\n.tui-timepicker-column {\n display: inline-block;\n vertical-align: middle;\n}\n\n.tui-timepicker-btn-area {\n position: relative;\n height: 88px;\n padding: 19px 0\n}\n\n.tui-timepicker-spinbox {\n width: 52px;\n}\n\n.tui-timepicker-selectbox+.tui-timepicker-selectbox {\n padding-left: 5px;\n}\n\n.tui-timepicker-btn-area .tui-timepicker-spinbox-input {\n width: 100%;\n height: 100%;\n line-height: 46px;\n border: 1px solid #ddd;\n}\n\n.tui-timepicker-btn {\n position: absolute;\n left: 0;\n width: 100%;\n height: 20px;\n background-color: transparent;\n border: 1px solid #ddd;\n cursor: pointer;\n}\n\n.tui-timepicker-btn:hover, .tui-timepicker-btn:focus, .tui-timepicker-btn:active {\n background-color: #f4f4f4;\n}\n\n.tui-timepicker-btn-up {\n top: 0;\n}\n\n.tui-timepicker-btn-down {\n bottom: 0\n}\n\n.tui-timepicker-btn .tui-ico-t-btn {\n width: 13px;\n height: 7px;\n}\n\n.tui-timepicker-btn-up .tui-ico-t-btn {\n background-position: 0 -12px;\n}\n\n.tui-timepicker-btn-down .tui-ico-t-btn {\n background-position: 0 -21px;\n}\n\n.tui-timepicker-colon {\n width: 22px;\n}\n\n.tui-timepicker-body .tui-timepicker-colon, .tui-timepicker-footer .tui-timepicker-colon {\n width: 18px;\n}\n\n.tui-ico-colon {\n width: 2px;\n height: 7px;\n background-position: -17px -28px;\n}\n\n.tui-timepicker-select {\n width: 52px;\n height: 28px;\n padding: 5px 0 5px 9px;\n font-size: 12px;\n border: 1px solid #ddd;\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAECAYAAACHtL/sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Mzk1NDA2RTVCREIxMTFFNjhENTJFMjdDNDQ3RDJCMTEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Mzk1NDA2RTZCREIxMTFFNjhENTJFMjdDNDQ3RDJCMTEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDozOTU0MDZFM0JEQjExMUU2OEQ1MkUyN0M0NDdEMkIxMSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDozOTU0MDZFNEJEQjExMUU2OEQ1MkUyN0M0NDdEMkIxMSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PpZ5HPgAAAAxSURBVHjaYjQ2Nv7PgBswgogzZ87gVMAEU4RLMyHABKUFyNGMbMBHJEOI1gwCAAEGAPSlBRrNcMApAAAAAElFTkSuQmCC) no-repeat;\n background-position: 100% 50%;\n cursor: pointer;\n}\n\n.tui-timepicker-check-lst {\n list-style: none;\n padding: 0;\n margin: 0;\n}\n\n.tui-timepicker-check {\n margin-top: 11px;\n}\n\n.tui-timepicker-check:first-child {\n margin-top: 0;\n}\n\n.tui-timepicker-checkbox {\n padding-left: 16px;\n}\n\n.tui-timepicker-radio {\n overflow: hidden;\n position: relative;\n text-align: left;\n}\n\n.tui-timepicker-radio input {\n position: absolute;\n left: -9999px;\n width: 1px;\n height: 1px;\n}\n\n.tui-timepicker-radio-label {\n display: inline-block;\n padding-left: 20px;\n font-size: 12px;\n line-height: 16px;\n vertical-align: top;\n color: #777;\n cursor: pointer\n}\n\n.tui-timepicker-input-radio {\n position: absolute;\n display: block;\n top: 0;\n left: 0;\n width: 16px;\n height: 16px;\n vertical-align: middle;\n background-position: -31px 0;\n}\n\n.tui-timepicker-radio .tui-timepicker-meridiem-checked+.tui-timepicker-radio-label .tui-timepicker-input-radio {\n background-position: -31px -18px;\n}\n\n.tui-timepicker-radio input:disabled+.tui-timepicker-radio-label .tui-timepicker-input-radio {\n background-position: -31px -36px;\n}\n\n.tui-ico-time {\n width: 12px;\n height: 12px;\n background-position: 0 -30px\n}\n\n.tui-timepicker-area {\n position: relative\n}\n\n.tui-time-input {\n position: relative;\n display: inline-block;\n width: 120px;\n height: 28px;\n border: 1px solid #ddd\n}\n\n.tui-time-input input {\n width: 100%;\n height: 100%;\n padding: 0 27px 0 10px;\n font-size: 12px;\n border: 0;\n color: #333;\n box-sizing: border-box\n}\n\n.tui-time-input .tui-ico-time {\n position: absolute;\n top: 50%;\n right: 8px;\n margin: -6px 0 0 0\n}\n\n.tui-time-input.tui-has-focus {\n border-color: #aaa\n}\n\n.tui-time-input .tui-ico-time {\n background-position: 0 -30px\n}\n\n.tui-time-input.tui-has-focus .tui-ico-time {\n background-position: 0 -44px\n}\n\n.tui-has-left.tui-timepicker-body, .tui-has-left .tui-timepicker-row {\n position: relative;\n}\n\n.tui-has-left .tui-timepicker-row:after {\n display: block;\n clear: both;\n content: '';\n}\n\n.tui-has-left .tui-is-add-picker {\n float: left;\n padding: 0 5px 0 0;\n}\n\n.tui-has-left .tui-timepicker-checkbox {\n float: left;\n margin-top: 23px;\n padding: 0 16px 0 0;\n}\n\n.tui-hidden {\n display: none;\n}\n\n"],"sourceRoot":""} \ No newline at end of file diff --git a/toast_ui.blazor_calendar/wwwroot/TUI.blazor_calendar.min.js b/toast_ui.blazor_calendar/wwwroot/TUI.blazor_calendar.min.js index 55e8e04..85d5b24 100644 --- a/toast_ui.blazor_calendar/wwwroot/TUI.blazor_calendar.min.js +++ b/toast_ui.blazor_calendar/wwwroot/TUI.blazor_calendar.min.js @@ -1,45312 +1,3 @@ -/******/ (() => { // webpackBootstrap -/******/ var __webpack_modules__ = ({ - -/***/ "./node_modules/tui-calendar/dist/tui-calendar.css": -/*!*********************************************************!*\ - !*** ./node_modules/tui-calendar/dist/tui-calendar.css ***! - \*********************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -// extracted by mini-css-extract-plugin - - -/***/ }), - -/***/ "./node_modules/tui-date-picker/dist/tui-date-picker.css": -/*!***************************************************************!*\ - !*** ./node_modules/tui-date-picker/dist/tui-date-picker.css ***! - \***************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -// extracted by mini-css-extract-plugin - - -/***/ }), - -/***/ "./node_modules/tui-time-picker/dist/tui-time-picker.css": -/*!***************************************************************!*\ - !*** ./node_modules/tui-time-picker/dist/tui-time-picker.css ***! - \***************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -// extracted by mini-css-extract-plugin - - -/***/ }), - -/***/ "./node_modules/tui-calendar/dist/tui-calendar.js": -/*!********************************************************!*\ - !*** ./node_modules/tui-calendar/dist/tui-calendar.js ***! - \********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -/*! - * TOAST UI Calendar - * @version 1.15.3 | Thu Feb 17 2022 - * @author NHN FE Development Lab - * @license MIT - */ -(function webpackUniversalModuleDefinition(root, factory) { - if(true) - module.exports = factory(__webpack_require__(/*! tui-code-snippet */ "./node_modules/tui-code-snippet/dist/tui-code-snippet.js"), __webpack_require__(/*! tui-date-picker */ "./node_modules/tui-date-picker/dist/tui-date-picker.js")); - else {} -})(window, function(__WEBPACK_EXTERNAL_MODULE_tui_code_snippet__, __WEBPACK_EXTERNAL_MODULE_tui_date_picker__) { -return /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __nested_webpack_require_1037__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __nested_webpack_require_1037__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __nested_webpack_require_1037__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __nested_webpack_require_1037__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __nested_webpack_require_1037__.d = function(exports, name, getter) { -/******/ if(!__nested_webpack_require_1037__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __nested_webpack_require_1037__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __nested_webpack_require_1037__.t = function(value, mode) { -/******/ if(mode & 1) value = __nested_webpack_require_1037__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __nested_webpack_require_1037__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __nested_webpack_require_1037__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __nested_webpack_require_1037__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __nested_webpack_require_1037__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __nested_webpack_require_1037__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __nested_webpack_require_1037__.p = "/dist"; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __nested_webpack_require_1037__(__nested_webpack_require_1037__.s = "./src/index.js"); -/******/ }) -/************************************************************************/ -/******/ ({ - -/***/ "./node_modules/dompurify/dist/purify.js": -/*!***********************************************!*\ - !*** ./node_modules/dompurify/dist/purify.js ***! - \***********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -/*! @license DOMPurify 2.3.1 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/2.3.1/LICENSE */ - -(function (global, factory) { - true ? module.exports = factory() : - 0; -}(this, function () { 'use strict'; - - function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } - - var hasOwnProperty = Object.hasOwnProperty, - setPrototypeOf = Object.setPrototypeOf, - isFrozen = Object.isFrozen, - getPrototypeOf = Object.getPrototypeOf, - getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; - var freeze = Object.freeze, - seal = Object.seal, - create = Object.create; // eslint-disable-line import/no-mutable-exports - - var _ref = typeof Reflect !== 'undefined' && Reflect, - apply = _ref.apply, - construct = _ref.construct; - - if (!apply) { - apply = function apply(fun, thisValue, args) { - return fun.apply(thisValue, args); - }; - } - - if (!freeze) { - freeze = function freeze(x) { - return x; - }; - } - - if (!seal) { - seal = function seal(x) { - return x; - }; - } - - if (!construct) { - construct = function construct(Func, args) { - return new (Function.prototype.bind.apply(Func, [null].concat(_toConsumableArray(args))))(); - }; - } - - var arrayForEach = unapply(Array.prototype.forEach); - var arrayPop = unapply(Array.prototype.pop); - var arrayPush = unapply(Array.prototype.push); - - var stringToLowerCase = unapply(String.prototype.toLowerCase); - var stringMatch = unapply(String.prototype.match); - var stringReplace = unapply(String.prototype.replace); - var stringIndexOf = unapply(String.prototype.indexOf); - var stringTrim = unapply(String.prototype.trim); - - var regExpTest = unapply(RegExp.prototype.test); - - var typeErrorCreate = unconstruct(TypeError); - - function unapply(func) { - return function (thisArg) { - for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - - return apply(func, thisArg, args); - }; - } - - function unconstruct(func) { - return function () { - for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - args[_key2] = arguments[_key2]; - } - - return construct(func, args); - }; - } - - /* Add properties to a lookup table */ - function addToSet(set, array) { - if (setPrototypeOf) { - // Make 'in' and truthy checks like Boolean(set.constructor) - // independent of any properties defined on Object.prototype. - // Prevent prototype setters from intercepting set as a this value. - setPrototypeOf(set, null); - } - - var l = array.length; - while (l--) { - var element = array[l]; - if (typeof element === 'string') { - var lcElement = stringToLowerCase(element); - if (lcElement !== element) { - // Config presets (e.g. tags.js, attrs.js) are immutable. - if (!isFrozen(array)) { - array[l] = lcElement; - } - - element = lcElement; - } - } - - set[element] = true; - } - - return set; - } - - /* Shallow clone an object */ - function clone(object) { - var newObject = create(null); - - var property = void 0; - for (property in object) { - if (apply(hasOwnProperty, object, [property])) { - newObject[property] = object[property]; - } - } - - return newObject; - } - - /* IE10 doesn't support __lookupGetter__ so lets' - * simulate it. It also automatically checks - * if the prop is function or getter and behaves - * accordingly. */ - function lookupGetter(object, prop) { - while (object !== null) { - var desc = getOwnPropertyDescriptor(object, prop); - if (desc) { - if (desc.get) { - return unapply(desc.get); - } - - if (typeof desc.value === 'function') { - return unapply(desc.value); - } - } - - object = getPrototypeOf(object); - } - - function fallbackValue(element) { - console.warn('fallback value for', element); - return null; - } - - return fallbackValue; - } - - var html = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'section', 'select', 'shadow', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']); - - // SVG - var svg = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']); - - var svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']); - - // List of SVG elements that are disallowed by default. - // We still need to know them so that we can do namespace - // checks properly in case one wants to add them to - // allow-list. - var svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'fedropshadow', 'feimage', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'foreignobject', 'hatch', 'hatchpath', 'mesh', 'meshgradient', 'meshpatch', 'meshrow', 'missing-glyph', 'script', 'set', 'solidcolor', 'unknown', 'use']); - - var mathMl = freeze(['math', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mspace', 'msqrt', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover']); - - // Similarly to SVG, we want to know all MathML elements, - // even those that we disallow by default. - var mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']); - - var text = freeze(['#text']); - - var html$1 = freeze(['accept', 'action', 'align', 'alt', 'autocapitalize', 'autocomplete', 'autopictureinpicture', 'autoplay', 'background', 'bgcolor', 'border', 'capture', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'controls', 'controlslist', 'coords', 'crossorigin', 'datetime', 'decoding', 'default', 'dir', 'disabled', 'disablepictureinpicture', 'disableremoteplayback', 'download', 'draggable', 'enctype', 'enterkeyhint', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inputmode', 'integrity', 'ismap', 'kind', 'label', 'lang', 'list', 'loading', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'muted', 'name', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'pattern', 'placeholder', 'playsinline', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'xmlns', 'slot']); - - var svg$1 = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clippathunits', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dur', 'edgemode', 'elevation', 'end', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'specularconstant', 'specularexponent', 'spreadmethod', 'startoffset', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'systemlanguage', 'tabindex', 'targetx', 'targety', 'transform', 'text-anchor', 'text-decoration', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan']); - - var mathMl$1 = freeze(['accent', 'accentunder', 'align', 'bevelled', 'close', 'columnsalign', 'columnlines', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lspace', 'lquote', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'movablelimits', 'notation', 'numalign', 'open', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'rquote', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier', 'selection', 'separator', 'separators', 'stretchy', 'subscriptshift', 'supscriptshift', 'symmetric', 'voffset', 'width', 'xmlns']); - - var xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']); - - // eslint-disable-next-line unicorn/better-regex - var MUSTACHE_EXPR = seal(/\{\{[\s\S]*|[\s\S]*\}\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode - var ERB_EXPR = seal(/<%[\s\S]*|[\s\S]*%>/gm); - var DATA_ATTR = seal(/^data-[\-\w.\u00B7-\uFFFF]/); // eslint-disable-line no-useless-escape - var ARIA_ATTR = seal(/^aria-[\-\w]+$/); // eslint-disable-line no-useless-escape - var IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i // eslint-disable-line no-useless-escape - ); - var IS_SCRIPT_OR_DATA = seal(/^(?:\w+script|data):/i); - var ATTR_WHITESPACE = seal(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g // eslint-disable-line no-control-regex - ); - - var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - - function _toConsumableArray$1(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } - - var getGlobal = function getGlobal() { - return typeof window === 'undefined' ? null : window; - }; - - /** - * Creates a no-op policy for internal use only. - * Don't export this function outside this module! - * @param {?TrustedTypePolicyFactory} trustedTypes The policy factory. - * @param {Document} document The document object (to determine policy name suffix) - * @return {?TrustedTypePolicy} The policy created (or null, if Trusted Types - * are not supported). - */ - var _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, document) { - if ((typeof trustedTypes === 'undefined' ? 'undefined' : _typeof(trustedTypes)) !== 'object' || typeof trustedTypes.createPolicy !== 'function') { - return null; - } - - // Allow the callers to control the unique policy name - // by adding a data-tt-policy-suffix to the script element with the DOMPurify. - // Policy creation with duplicate names throws in Trusted Types. - var suffix = null; - var ATTR_NAME = 'data-tt-policy-suffix'; - if (document.currentScript && document.currentScript.hasAttribute(ATTR_NAME)) { - suffix = document.currentScript.getAttribute(ATTR_NAME); - } - - var policyName = 'dompurify' + (suffix ? '#' + suffix : ''); - - try { - return trustedTypes.createPolicy(policyName, { - createHTML: function createHTML(html$$1) { - return html$$1; - } - }); - } catch (_) { - // Policy creation failed (most likely another DOMPurify script has - // already run). Skip creating the policy, as this will only cause errors - // if TT are enforced. - console.warn('TrustedTypes policy ' + policyName + ' could not be created.'); - return null; - } - }; - - function createDOMPurify() { - var window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal(); - - var DOMPurify = function DOMPurify(root) { - return createDOMPurify(root); - }; - - /** - * Version label, exposed for easier checks - * if DOMPurify is up to date or not - */ - DOMPurify.version = '2.3.1'; - - /** - * Array of elements that DOMPurify removed during sanitation. - * Empty if nothing was removed. - */ - DOMPurify.removed = []; - - if (!window || !window.document || window.document.nodeType !== 9) { - // Not running in a browser, provide a factory function - // so that you can pass your own Window - DOMPurify.isSupported = false; - - return DOMPurify; - } - - var originalDocument = window.document; - - var document = window.document; - var DocumentFragment = window.DocumentFragment, - HTMLTemplateElement = window.HTMLTemplateElement, - Node = window.Node, - Element = window.Element, - NodeFilter = window.NodeFilter, - _window$NamedNodeMap = window.NamedNodeMap, - NamedNodeMap = _window$NamedNodeMap === undefined ? window.NamedNodeMap || window.MozNamedAttrMap : _window$NamedNodeMap, - Text = window.Text, - Comment = window.Comment, - DOMParser = window.DOMParser, - trustedTypes = window.trustedTypes; - - - var ElementPrototype = Element.prototype; - - var cloneNode = lookupGetter(ElementPrototype, 'cloneNode'); - var getNextSibling = lookupGetter(ElementPrototype, 'nextSibling'); - var getChildNodes = lookupGetter(ElementPrototype, 'childNodes'); - var getParentNode = lookupGetter(ElementPrototype, 'parentNode'); - - // As per issue #47, the web-components registry is inherited by a - // new document created via createHTMLDocument. As per the spec - // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries) - // a new empty registry is used when creating a template contents owner - // document, so we use that as our parent document to ensure nothing - // is inherited. - if (typeof HTMLTemplateElement === 'function') { - var template = document.createElement('template'); - if (template.content && template.content.ownerDocument) { - document = template.content.ownerDocument; - } - } - - var trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, originalDocument); - var emptyHTML = trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML('') : ''; - - var _document = document, - implementation = _document.implementation, - createNodeIterator = _document.createNodeIterator, - createDocumentFragment = _document.createDocumentFragment, - getElementsByTagName = _document.getElementsByTagName; - var importNode = originalDocument.importNode; - - - var documentMode = {}; - try { - documentMode = clone(document).documentMode ? document.documentMode : {}; - } catch (_) {} - - var hooks = {}; - - /** - * Expose whether this browser supports running the full DOMPurify. - */ - DOMPurify.isSupported = typeof getParentNode === 'function' && implementation && typeof implementation.createHTMLDocument !== 'undefined' && documentMode !== 9; - - var MUSTACHE_EXPR$$1 = MUSTACHE_EXPR, - ERB_EXPR$$1 = ERB_EXPR, - DATA_ATTR$$1 = DATA_ATTR, - ARIA_ATTR$$1 = ARIA_ATTR, - IS_SCRIPT_OR_DATA$$1 = IS_SCRIPT_OR_DATA, - ATTR_WHITESPACE$$1 = ATTR_WHITESPACE; - var IS_ALLOWED_URI$$1 = IS_ALLOWED_URI; - - /** - * We consider the elements and attributes below to be safe. Ideally - * don't add any new ones but feel free to remove unwanted ones. - */ - - /* allowed element names */ - - var ALLOWED_TAGS = null; - var DEFAULT_ALLOWED_TAGS = addToSet({}, [].concat(_toConsumableArray$1(html), _toConsumableArray$1(svg), _toConsumableArray$1(svgFilters), _toConsumableArray$1(mathMl), _toConsumableArray$1(text))); - - /* Allowed attribute names */ - var ALLOWED_ATTR = null; - var DEFAULT_ALLOWED_ATTR = addToSet({}, [].concat(_toConsumableArray$1(html$1), _toConsumableArray$1(svg$1), _toConsumableArray$1(mathMl$1), _toConsumableArray$1(xml))); - - /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */ - var FORBID_TAGS = null; - - /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */ - var FORBID_ATTR = null; - - /* Decide if ARIA attributes are okay */ - var ALLOW_ARIA_ATTR = true; - - /* Decide if custom data attributes are okay */ - var ALLOW_DATA_ATTR = true; - - /* Decide if unknown protocols are okay */ - var ALLOW_UNKNOWN_PROTOCOLS = false; - - /* Output should be safe for common template engines. - * This means, DOMPurify removes data attributes, mustaches and ERB - */ - var SAFE_FOR_TEMPLATES = false; - - /* Decide if document with ... should be returned */ - var WHOLE_DOCUMENT = false; - - /* Track whether config is already set on this instance of DOMPurify. */ - var SET_CONFIG = false; - - /* Decide if all elements (e.g. style, script) must be children of - * document.body. By default, browsers might move them to document.head */ - var FORCE_BODY = false; - - /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html - * string (or a TrustedHTML object if Trusted Types are supported). - * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead - */ - var RETURN_DOM = false; - - /* Decide if a DOM `DocumentFragment` should be returned, instead of a html - * string (or a TrustedHTML object if Trusted Types are supported) */ - var RETURN_DOM_FRAGMENT = false; - - /* If `RETURN_DOM` or `RETURN_DOM_FRAGMENT` is enabled, decide if the returned DOM - * `Node` is imported into the current `Document`. If this flag is not enabled the - * `Node` will belong (its ownerDocument) to a fresh `HTMLDocument`, created by - * DOMPurify. - * - * This defaults to `true` starting DOMPurify 2.2.0. Note that setting it to `false` - * might cause XSS from attacks hidden in closed shadowroots in case the browser - * supports Declarative Shadow: DOM https://web.dev/declarative-shadow-dom/ - */ - var RETURN_DOM_IMPORT = true; - - /* Try to return a Trusted Type object instead of a string, return a string in - * case Trusted Types are not supported */ - var RETURN_TRUSTED_TYPE = false; - - /* Output should be free from DOM clobbering attacks? */ - var SANITIZE_DOM = true; - - /* Keep element content when removing element? */ - var KEEP_CONTENT = true; - - /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead - * of importing it into a new Document and returning a sanitized copy */ - var IN_PLACE = false; - - /* Allow usage of profiles like html, svg and mathMl */ - var USE_PROFILES = {}; - - /* Tags to ignore content of when KEEP_CONTENT is true */ - var FORBID_CONTENTS = null; - var DEFAULT_FORBID_CONTENTS = addToSet({}, ['annotation-xml', 'audio', 'colgroup', 'desc', 'foreignobject', 'head', 'iframe', 'math', 'mi', 'mn', 'mo', 'ms', 'mtext', 'noembed', 'noframes', 'noscript', 'plaintext', 'script', 'style', 'svg', 'template', 'thead', 'title', 'video', 'xmp']); - - /* Tags that are safe for data: URIs */ - var DATA_URI_TAGS = null; - var DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']); - - /* Attributes safe for values like "javascript:" */ - var URI_SAFE_ATTRIBUTES = null; - var DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']); - - var MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML'; - var SVG_NAMESPACE = 'http://www.w3.org/2000/svg'; - var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml'; - /* Document namespace */ - var NAMESPACE = HTML_NAMESPACE; - var IS_EMPTY_INPUT = false; - - /* Keep a reference to config to pass to hooks */ - var CONFIG = null; - - /* Ideally, do not touch anything below this line */ - /* ______________________________________________ */ - - var formElement = document.createElement('form'); - - /** - * _parseConfig - * - * @param {Object} cfg optional config literal - */ - // eslint-disable-next-line complexity - var _parseConfig = function _parseConfig(cfg) { - if (CONFIG && CONFIG === cfg) { - return; - } - - /* Shield configuration object from tampering */ - if (!cfg || (typeof cfg === 'undefined' ? 'undefined' : _typeof(cfg)) !== 'object') { - cfg = {}; - } - - /* Shield configuration object from prototype pollution */ - cfg = clone(cfg); - - /* Set configuration parameters */ - ALLOWED_TAGS = 'ALLOWED_TAGS' in cfg ? addToSet({}, cfg.ALLOWED_TAGS) : DEFAULT_ALLOWED_TAGS; - ALLOWED_ATTR = 'ALLOWED_ATTR' in cfg ? addToSet({}, cfg.ALLOWED_ATTR) : DEFAULT_ALLOWED_ATTR; - URI_SAFE_ATTRIBUTES = 'ADD_URI_SAFE_ATTR' in cfg ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), cfg.ADD_URI_SAFE_ATTR) : DEFAULT_URI_SAFE_ATTRIBUTES; - DATA_URI_TAGS = 'ADD_DATA_URI_TAGS' in cfg ? addToSet(clone(DEFAULT_DATA_URI_TAGS), cfg.ADD_DATA_URI_TAGS) : DEFAULT_DATA_URI_TAGS; - FORBID_CONTENTS = 'FORBID_CONTENTS' in cfg ? addToSet({}, cfg.FORBID_CONTENTS) : DEFAULT_FORBID_CONTENTS; - FORBID_TAGS = 'FORBID_TAGS' in cfg ? addToSet({}, cfg.FORBID_TAGS) : {}; - FORBID_ATTR = 'FORBID_ATTR' in cfg ? addToSet({}, cfg.FORBID_ATTR) : {}; - USE_PROFILES = 'USE_PROFILES' in cfg ? cfg.USE_PROFILES : false; - ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true - ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true - ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false - SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false - WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false - RETURN_DOM = cfg.RETURN_DOM || false; // Default false - RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false - RETURN_DOM_IMPORT = cfg.RETURN_DOM_IMPORT !== false; // Default true - RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false - FORCE_BODY = cfg.FORCE_BODY || false; // Default false - SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true - KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true - IN_PLACE = cfg.IN_PLACE || false; // Default false - IS_ALLOWED_URI$$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI$$1; - NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE; - if (SAFE_FOR_TEMPLATES) { - ALLOW_DATA_ATTR = false; - } - - if (RETURN_DOM_FRAGMENT) { - RETURN_DOM = true; - } - - /* Parse profile info */ - if (USE_PROFILES) { - ALLOWED_TAGS = addToSet({}, [].concat(_toConsumableArray$1(text))); - ALLOWED_ATTR = []; - if (USE_PROFILES.html === true) { - addToSet(ALLOWED_TAGS, html); - addToSet(ALLOWED_ATTR, html$1); - } - - if (USE_PROFILES.svg === true) { - addToSet(ALLOWED_TAGS, svg); - addToSet(ALLOWED_ATTR, svg$1); - addToSet(ALLOWED_ATTR, xml); - } - - if (USE_PROFILES.svgFilters === true) { - addToSet(ALLOWED_TAGS, svgFilters); - addToSet(ALLOWED_ATTR, svg$1); - addToSet(ALLOWED_ATTR, xml); - } - - if (USE_PROFILES.mathMl === true) { - addToSet(ALLOWED_TAGS, mathMl); - addToSet(ALLOWED_ATTR, mathMl$1); - addToSet(ALLOWED_ATTR, xml); - } - } - - /* Merge configuration parameters */ - if (cfg.ADD_TAGS) { - if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) { - ALLOWED_TAGS = clone(ALLOWED_TAGS); - } - - addToSet(ALLOWED_TAGS, cfg.ADD_TAGS); - } - - if (cfg.ADD_ATTR) { - if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) { - ALLOWED_ATTR = clone(ALLOWED_ATTR); - } - - addToSet(ALLOWED_ATTR, cfg.ADD_ATTR); - } - - if (cfg.ADD_URI_SAFE_ATTR) { - addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR); - } - - if (cfg.FORBID_CONTENTS) { - if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) { - FORBID_CONTENTS = clone(FORBID_CONTENTS); - } - - addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS); - } - - /* Add #text in case KEEP_CONTENT is set to true */ - if (KEEP_CONTENT) { - ALLOWED_TAGS['#text'] = true; - } - - /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */ - if (WHOLE_DOCUMENT) { - addToSet(ALLOWED_TAGS, ['html', 'head', 'body']); - } - - /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */ - if (ALLOWED_TAGS.table) { - addToSet(ALLOWED_TAGS, ['tbody']); - delete FORBID_TAGS.tbody; - } - - // Prevent further manipulation of configuration. - // Not available in IE8, Safari 5, etc. - if (freeze) { - freeze(cfg); - } - - CONFIG = cfg; - }; - - var MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']); - - var HTML_INTEGRATION_POINTS = addToSet({}, ['foreignobject', 'desc', 'title', 'annotation-xml']); - - /* Keep track of all possible SVG and MathML tags - * so that we can perform the namespace checks - * correctly. */ - var ALL_SVG_TAGS = addToSet({}, svg); - addToSet(ALL_SVG_TAGS, svgFilters); - addToSet(ALL_SVG_TAGS, svgDisallowed); - - var ALL_MATHML_TAGS = addToSet({}, mathMl); - addToSet(ALL_MATHML_TAGS, mathMlDisallowed); - - /** - * - * - * @param {Element} element a DOM element whose namespace is being checked - * @returns {boolean} Return false if the element has a - * namespace that a spec-compliant parser would never - * return. Return true otherwise. - */ - var _checkValidNamespace = function _checkValidNamespace(element) { - var parent = getParentNode(element); - - // In JSDOM, if we're inside shadow DOM, then parentNode - // can be null. We just simulate parent in this case. - if (!parent || !parent.tagName) { - parent = { - namespaceURI: HTML_NAMESPACE, - tagName: 'template' - }; - } - - var tagName = stringToLowerCase(element.tagName); - var parentTagName = stringToLowerCase(parent.tagName); - - if (element.namespaceURI === SVG_NAMESPACE) { - // The only way to switch from HTML namespace to SVG - // is via . If it happens via any other tag, then - // it should be killed. - if (parent.namespaceURI === HTML_NAMESPACE) { - return tagName === 'svg'; - } - - // The only way to switch from MathML to SVG is via - // svg if parent is either or MathML - // text integration points. - if (parent.namespaceURI === MATHML_NAMESPACE) { - return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]); - } - - // We only allow elements that are defined in SVG - // spec. All others are disallowed in SVG namespace. - return Boolean(ALL_SVG_TAGS[tagName]); - } - - if (element.namespaceURI === MATHML_NAMESPACE) { - // The only way to switch from HTML namespace to MathML - // is via . If it happens via any other tag, then - // it should be killed. - if (parent.namespaceURI === HTML_NAMESPACE) { - return tagName === 'math'; - } - - // The only way to switch from SVG to MathML is via - // and HTML integration points - if (parent.namespaceURI === SVG_NAMESPACE) { - return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName]; - } - - // We only allow elements that are defined in MathML - // spec. All others are disallowed in MathML namespace. - return Boolean(ALL_MATHML_TAGS[tagName]); - } - - if (element.namespaceURI === HTML_NAMESPACE) { - // The only way to switch from SVG to HTML is via - // HTML integration points, and from MathML to HTML - // is via MathML text integration points - if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) { - return false; - } - - if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) { - return false; - } - - // Certain elements are allowed in both SVG and HTML - // namespace. We need to specify them explicitly - // so that they don't get erronously deleted from - // HTML namespace. - var commonSvgAndHTMLElements = addToSet({}, ['title', 'style', 'font', 'a', 'script']); - - // We disallow tags that are specific for MathML - // or SVG and should never appear in HTML namespace - return !ALL_MATHML_TAGS[tagName] && (commonSvgAndHTMLElements[tagName] || !ALL_SVG_TAGS[tagName]); - } - - // The code should never reach this place (this means - // that the element somehow got namespace that is not - // HTML, SVG or MathML). Return false just in case. - return false; - }; - - /** - * _forceRemove - * - * @param {Node} node a DOM node - */ - var _forceRemove = function _forceRemove(node) { - arrayPush(DOMPurify.removed, { element: node }); - try { - // eslint-disable-next-line unicorn/prefer-dom-node-remove - node.parentNode.removeChild(node); - } catch (_) { - try { - node.outerHTML = emptyHTML; - } catch (_) { - node.remove(); - } - } - }; - - /** - * _removeAttribute - * - * @param {String} name an Attribute name - * @param {Node} node a DOM node - */ - var _removeAttribute = function _removeAttribute(name, node) { - try { - arrayPush(DOMPurify.removed, { - attribute: node.getAttributeNode(name), - from: node - }); - } catch (_) { - arrayPush(DOMPurify.removed, { - attribute: null, - from: node - }); - } - - node.removeAttribute(name); - - // We void attribute values for unremovable "is"" attributes - if (name === 'is' && !ALLOWED_ATTR[name]) { - if (RETURN_DOM || RETURN_DOM_FRAGMENT) { - try { - _forceRemove(node); - } catch (_) {} - } else { - try { - node.setAttribute(name, ''); - } catch (_) {} - } - } - }; - - /** - * _initDocument - * - * @param {String} dirty a string of dirty markup - * @return {Document} a DOM, filled with the dirty markup - */ - var _initDocument = function _initDocument(dirty) { - /* Create a HTML document */ - var doc = void 0; - var leadingWhitespace = void 0; - - if (FORCE_BODY) { - dirty = '' + dirty; - } else { - /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */ - var matches = stringMatch(dirty, /^[\r\n\t ]+/); - leadingWhitespace = matches && matches[0]; - } - - var dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty; - /* - * Use the DOMParser API by default, fallback later if needs be - * DOMParser not work for svg when has multiple root element. - */ - if (NAMESPACE === HTML_NAMESPACE) { - try { - doc = new DOMParser().parseFromString(dirtyPayload, 'text/html'); - } catch (_) {} - } - - /* Use createHTMLDocument in case DOMParser is not available */ - if (!doc || !doc.documentElement) { - doc = implementation.createDocument(NAMESPACE, 'template', null); - try { - doc.documentElement.innerHTML = IS_EMPTY_INPUT ? '' : dirtyPayload; - } catch (_) { - // Syntax error if dirtyPayload is invalid xml - } - } - - var body = doc.body || doc.documentElement; - - if (dirty && leadingWhitespace) { - body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null); - } - - /* Work on whole document or just its body */ - if (NAMESPACE === HTML_NAMESPACE) { - return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0]; - } - - return WHOLE_DOCUMENT ? doc.documentElement : body; - }; - - /** - * _createIterator - * - * @param {Document} root document/fragment to create iterator for - * @return {Iterator} iterator instance - */ - var _createIterator = function _createIterator(root) { - return createNodeIterator.call(root.ownerDocument || root, root, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT, null, false); - }; - - /** - * _isClobbered - * - * @param {Node} elm element to check for clobbering attacks - * @return {Boolean} true if clobbered, false if safe - */ - var _isClobbered = function _isClobbered(elm) { - if (elm instanceof Text || elm instanceof Comment) { - return false; - } - - if (typeof elm.nodeName !== 'string' || typeof elm.textContent !== 'string' || typeof elm.removeChild !== 'function' || !(elm.attributes instanceof NamedNodeMap) || typeof elm.removeAttribute !== 'function' || typeof elm.setAttribute !== 'function' || typeof elm.namespaceURI !== 'string' || typeof elm.insertBefore !== 'function') { - return true; - } - - return false; - }; - - /** - * _isNode - * - * @param {Node} obj object to check whether it's a DOM node - * @return {Boolean} true is object is a DOM node - */ - var _isNode = function _isNode(object) { - return (typeof Node === 'undefined' ? 'undefined' : _typeof(Node)) === 'object' ? object instanceof Node : object && (typeof object === 'undefined' ? 'undefined' : _typeof(object)) === 'object' && typeof object.nodeType === 'number' && typeof object.nodeName === 'string'; - }; - - /** - * _executeHook - * Execute user configurable hooks - * - * @param {String} entryPoint Name of the hook's entry point - * @param {Node} currentNode node to work on with the hook - * @param {Object} data additional hook parameters - */ - var _executeHook = function _executeHook(entryPoint, currentNode, data) { - if (!hooks[entryPoint]) { - return; - } - - arrayForEach(hooks[entryPoint], function (hook) { - hook.call(DOMPurify, currentNode, data, CONFIG); - }); - }; - - /** - * _sanitizeElements - * - * @protect nodeName - * @protect textContent - * @protect removeChild - * - * @param {Node} currentNode to check for permission to exist - * @return {Boolean} true if node was killed, false if left alive - */ - var _sanitizeElements = function _sanitizeElements(currentNode) { - var content = void 0; - - /* Execute a hook if present */ - _executeHook('beforeSanitizeElements', currentNode, null); - - /* Check if element is clobbered or can clobber */ - if (_isClobbered(currentNode)) { - _forceRemove(currentNode); - return true; - } - - /* Check if tagname contains Unicode */ - if (stringMatch(currentNode.nodeName, /[\u0080-\uFFFF]/)) { - _forceRemove(currentNode); - return true; - } - - /* Now let's check the element's type and name */ - var tagName = stringToLowerCase(currentNode.nodeName); - - /* Execute a hook if present */ - _executeHook('uponSanitizeElement', currentNode, { - tagName: tagName, - allowedTags: ALLOWED_TAGS - }); - - /* Detect mXSS attempts abusing namespace confusion */ - if (!_isNode(currentNode.firstElementChild) && (!_isNode(currentNode.content) || !_isNode(currentNode.content.firstElementChild)) && regExpTest(/<[/\w]/g, currentNode.innerHTML) && regExpTest(/<[/\w]/g, currentNode.textContent)) { - _forceRemove(currentNode); - return true; - } - - /* Mitigate a problem with templates inside select */ - if (tagName === 'select' && regExpTest(/ ' + schedule.title + ''; - * }, - * milestoneTitle: function() { - * return 'MILESTONE'; - * }, - * task: function(schedule) { - * return '#' + schedule.title; - * }, - * taskTitle: function() { - * return 'TASK'; - * }, - * allday: function(schedule) { - * return getTimeTemplate(schedule, true); - * }, - * alldayTitle: function() { - * return 'ALL DAY'; - * }, - * time: function(schedule) { - * return '' + moment(schedule.start.getTime()).format('HH:mm') + ' ' + schedule.title; - * }, - * goingDuration: function(schedule) { - * return '' + schedule.goingDuration + 'min.'; - * }, - * comingDuration: function(schedule) { - * return '' + schedule.comingDuration + 'min.'; - * }, - * monthMoreTitleDate: function(date, dayname) { - * var day = date.split('.')[2]; - * - * return '' + day + ' ' + dayname + ''; - * }, - * monthMoreClose: function() { - * return ''; - * }, - * monthGridHeader: function(dayModel) { - * var date = parseInt(dayModel.date.split('-')[2], 10); - * var classNames = ['tui-full-calendar-weekday-grid-date ']; - * - * if (dayModel.isToday) { - * classNames.push('tui-full-calendar-weekday-grid-date-decorator'); - * } - * - * return '' + date + ''; - * }, - * monthGridHeaderExceed: function(hiddenSchedules) { - * return '+' + hiddenSchedules + ''; - * }, - * monthGridFooter: function() { - * return ''; - * }, - * monthGridFooterExceed: function(hiddenSchedules) { - * return ''; - * }, - * monthDayname: function(model) { - * return (model.label).toString().toLocaleUpperCase(); - * }, - * weekDayname: function(model) { - * return '' + model.date + '  ' + model.dayName + ''; - * }, - * weekGridFooterExceed: function(hiddenSchedules) { - * return '+' + hiddenSchedules; - * }, - * dayGridTitle: function(viewName) { - * - * // use another functions instead of 'dayGridTitle' - * // milestoneTitle: function() {...} - * // taskTitle: function() {...} - * // alldayTitle: function() {...} - * - * var title = ''; - * switch(viewName) { - * case 'milestone': - * title = 'MILESTONE'; - * break; - * case 'task': - * title = 'TASK'; - * break; - * case 'allday': - * title = 'ALL DAY'; - * break; - * } - * - * return title; - * }, - * schedule: function(schedule) { - * - * // use another functions instead of 'schedule' - * // milestone: function() {...} - * // task: function() {...} - * // allday: function() {...} - * - * var tpl; - * - * switch(category) { - * case 'milestone': - * tpl = ' ' + schedule.title + ''; - * break; - * case 'task': - * tpl = '#' + schedule.title; - * break; - * case 'allday': - * tpl = getTimeTemplate(schedule, true); - * break; - * } - * - * return tpl; - * }, - * collapseBtnTitle: function() { - * return ''; - * }, - * timezoneDisplayLabel: function(timezoneOffset, displayLabel) { - * var gmt, hour, minutes; - * - * if (!displayLabel) { - * gmt = timezoneOffset < 0 ? '-' : '+'; - * hour = Math.abs(parseInt(timezoneOffset / 60, 10)); - * minutes = Math.abs(timezoneOffset % 60); - * displayLabel = gmt + getPadStart(hour) + ':' + getPadStart(minutes); - * } - * - * return displayLabel; - * }, - * timegridDisplayPrimayTime: function(time) { - * // will be deprecated. use 'timegridDisplayPrimaryTime' - * var meridiem = 'am'; - * var hour = time.hour; - * - * if (time.hour > 12) { - * meridiem = 'pm'; - * hour = time.hour - 12; - * } - * - * return hour + ' ' + meridiem; - * }, - * timegridDisplayPrimaryTime: function(time) { - * var meridiem = 'am'; - * var hour = time.hour; - * - * if (time.hour > 12) { - * meridiem = 'pm'; - * hour = time.hour - 12; - * } - * - * return hour + ' ' + meridiem; - * }, - * timegridDisplayTime: function(time) { - * return getPadStart(time.hour) + ':' + getPadStart(time.hour); - * }, - * timegridCurrentTime: function(timezone) { - * var templates = []; - * - * if (timezone.dateDifference) { - * templates.push('[' + timezone.dateDifferenceSign + timezone.dateDifference + ']
'); - * } - * - * templates.push(moment(timezone.hourmarker).format('HH:mm a')); - * - * return templates.join(''); - * }, - * popupIsAllDay: function() { - * return 'All Day'; - * }, - * popupStateFree: function() { - * return 'Free'; - * }, - * popupStateBusy: function() { - * return 'Busy'; - * }, - * titlePlaceholder: function() { - * return 'Subject'; - * }, - * locationPlaceholder: function() { - * return 'Location'; - * }, - * startDatePlaceholder: function() { - * return 'Start date'; - * }, - * endDatePlaceholder: function() { - * return 'End date'; - * }, - * popupSave: function() { - * return 'Save'; - * }, - * popupUpdate: function() { - * return 'Update'; - * }, - * popupDetailDate: function(isAllDay, start, end) { - * var isSameDate = moment(start).isSame(end); - * var endFormat = (isSameDate ? '' : 'YYYY.MM.DD ') + 'hh:mm a'; - * - * if (isAllDay) { - * return moment(start).format('YYYY.MM.DD') + (isSameDate ? '' : ' - ' + moment(end).format('YYYY.MM.DD')); - * } - * - * return (moment(start).format('YYYY.MM.DD hh:mm a') + ' - ' + moment(end).format(endFormat)); - * }, - * popupDetailLocation: function(schedule) { - * return 'Location : ' + schedule.location; - * }, - * popupDetailUser: function(schedule) { - * return 'User : ' + (schedule.attendees || []).join(', '); - * }, - * popupDetailState: function(schedule) { - * return 'State : ' + schedule.state || 'Busy'; - * }, - * popupDetailRepeat: function(schedule) { - * return 'Repeat : ' + schedule.recurrenceRule; - * }, - * popupDetailBody: function(schedule) { - * return 'Body : ' + schedule.body; - * }, - * popupEdit: function() { - * return 'Edit'; - * }, - * popupDelete: function() { - * return 'Delete'; - * } - * } - * } - */ - -/** - * Options for daily, weekly view. - * @typedef {object} WeekOptions - * @property {number} [startDayOfWeek=0] - The start day of week, - * @property {Array.} [daynames] - The day names in weekly and daily. Default values are ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] - * @property {boolean} [narrowWeekend=false] - Make weekend column narrow(1/2 width) - * @property {boolean} [workweek=false] - Show only 5 days except for weekend - * @property {boolean} [showTimezoneCollapseButton=false] - Show a collapse button to close multiple timezones - * @property {boolean} [timezonesCollapsed=false] - An initial multiple timezones collapsed state - * @property {number} [hourStart=0] - Can limit of render hour start. - * @property {number} [hourEnd=24] - Can limit of render hour end. - */ - -/** - * Options for monthly view. - * @typedef {object} MonthOptions - * @property {Array.} [daynames] - The day names in monthly. Default values are ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] - * @property {number} [startDayOfWeek=0] - The start day of week - * @property {boolean} [narrowWeekend=false] - Make weekend column narrow(1/2 width) - * @property {number} [visibleWeeksCount=6] - The visible week count in monthly(0 or null are same with 6) - * @property {boolean} [isAlways6Week=true] - Always show 6 weeks. If false, show 5 weeks or 6 weeks based on the month. - * @property {boolean} [workweek=false] - Show only 5 days except for weekend - * @property {number} [visibleScheduleCount] - The visible schedule count in monthly grid - * @property {object} [moreLayerSize] - The more layer size - * @property {object} [moreLayerSize.width=null] - The css width value(px, 'auto'). - * The default value 'null' is to fit a grid cell. - * @property {object} [moreLayerSize.height=null] - The css height value(px, 'auto'). - * The default value 'null' is to fit a grid cell. - * @property {object} [grid] - The grid's header and footer information - * @property {object} [grid.header] - The grid's header informatioin - * @property {number} [grid.header.height=34] - The grid's header height - * @property {object} [grid.footer] - The grid's footer informatioin - * @property {number} [grid.footer.height=34] - The grid's footer height - * @property {function} [scheduleFilter=null] - The filter schedules on month view. A parameter is {Schedule} object. - */ - -/** - * @typedef {object} CalendarColor - * @property {string} [color] - The calendar color - * @property {string} [bgColor] - The calendar background color - * @property {string} [borderColor] - The calendar left border color - * @property {string} [dragBgColor] - The Background color displayed when you drag a calendar's schedule - */ - -/** - * @typedef {object} Timezone - * @property {Array.} [zones] - {@link Zone} array. Set the list of time zones. - * The first zone element is primary - * The rest zone elements are shown in left timegrid of weekly/daily view - * @property {function} [offsetCalculator = null] - If you define the 'offsetCalculator' property, the offset calculation is done with this function. - * The offsetCalculator option allows you to set up a function that returns the timezone offset for that time using date libraries like ['js-joda'](https://js-joda.github.io/js-joda/) and ['moment-timezone'](https://momentjs.com/timezone/). - * The 'offsetCalculator' option is useful when your browser does not support 'Intl.DateTimeFormat' and 'formatToPart', or you want to use the date library you are familiar with. - * - * @example - * var cal = new Calendar('#calendar', { - * timezone: { - * zones: [ - * { - * timezoneName: 'Asia/Seoul', - * displayLabel: 'GMT+09:00', - * tooltip: 'Seoul' - * }, - * { - * timezoneName: 'America/New_York', - * displayLabel: 'GMT-05:00', - * tooltip: 'New York', - * } - * ], - * offsetCalculator: function(timezoneName, timestamp){ - * // matches 'getTimezoneOffset()' of Date API - * // e.g. +09:00 => -540, -04:00 => 240 - * return moment.tz.zone(timezoneName).utcOffset(timestamp); - * }, - * } - * }); - */ - -/** - * @typedef {object} Zone - * @property {string} [timezoneName] - timezone name (time zone names of the IANA time zone database, such as 'Asia/Seoul', 'America/New_York'). - * Basically, it will calculate the offset using 'Intl.DateTimeFormat' with the value of the this property entered. - * This property is required. - * @property {string} [displayLabel] - The display label of your timezone at weekly/daily view(e.g. 'GMT+09:00') - * @property {string} [tooltip] - The tooltip(e.g. 'Seoul') - * @property {number} [timezoneOffset] - The minutes for your timezone offset. If null, use the browser's timezone. Refer to Date.prototype.getTimezoneOffset(). - * This property will be deprecated. (since version 1.13) - * - * @example - * var cal = new Calendar('#calendar', { - * timezone: { - * zones: [ - * { - * timezoneName: 'Asia/Seoul', - * displayLabel: 'GMT+09:00', - * tooltip: 'Seoul' - * }, - * { - * timezoneName: 'America/New_York', - * displayLabel: 'GMT-05:00', - * tooltip: 'New York', - * } - * ], - * } - * }); - */ - -/** - * @typedef {object} CalendarProps - * @property {string|number} id - The calendar id - * @property {string} name - The calendar name - * @property {string} color - The text color when schedule is displayed - * @property {string} bgColor - The background color schedule is displayed - * @property {string} borderColor - The color of left border or bullet point when schedule is displayed - * @property {string} dragBgColor - The background color when schedule dragging - * @example - * var cal = new Calendar('#calendar', { - * ... - * calendars: [ - * { - * id: '1', - * name: 'My Calendar', - * color: '#ffffff', - * bgColor: '#9e5fff', - * dragBgColor: '#9e5fff', - * borderColor: '#9e5fff' - * }, - * { - * id: '2', - * name: 'Company', - * color: '#00a9ff', - * bgColor: '#00a9ff', - * dragBgColor: '#00a9ff', - * borderColor: '#00a9ff' - * }, - * ] - * }); - */ - -/** - * @typedef {object} Options - Calendar option object - * @property {string} [defaultView='week'] - Default view of calendar. The default value is 'week'. - * @property {boolean|Array.} [taskView=true] - Show the milestone and task in weekly, daily view. The default value is true. If the value is array, it can be ['milestone', 'task']. - * @property {boolean|Array.} [scheduleView=true] - Show the all day and time grid in weekly, daily view. The default value is false. If the value is array, it can be ['allday', 'time']. - * @property {themeConfig} [theme=themeConfig] - {@link themeConfig} for custom style. - * @property {Template} [template={}] - {@link Template} for further information - * @property {WeekOptions} [week={}] - {@link WeekOptions} for week view - * @property {MonthOptions} [month={}] - {@link MonthOptions} for month view - * @property {Array.} [calendars=[]] - {@link CalendarProps} List that can be used to add new schedule. The default value is []. - * @property {boolean} [useCreationPopup=false] - Whether use default creation popup or not. The default value is false. - * @property {boolean} [useDetailPopup=false] - Whether use default detail popup or not. The default value is false. - * @property {Timezone} [timezone] - {@link Timezone} - Set a custom time zone. You can add secondary timezone in the weekly/daily view. - * @property {boolean} [disableDblClick=false] - Disable double click to create a schedule. The default value is false. - * @property {boolean} [disableClick=false] - Disable click to create a schedule. The default value is false. - * @property {boolean} [isReadOnly=false] - {@link Calendar} is read-only mode and a user can't create and modify any schedule. The default value is false. - * @property {boolean} [usageStatistics=true] - Let us know the hostname. If you don't want to send the hostname, please set to false. - * @property {Array.} [timezones] - This property will be deprecated. (since version 1.13) Please use timezone property. - */ - -/** - * {@link https://nhn.github.io/tui.code-snippet/latest/CustomEvents CustomEvents} document at {@link https://github.com/nhn/tui.code-snippet tui-code-snippet} - * @typedef {class} CustomEvents - */ - -/** - * @typedef {object} TimeCreationGuide - Time creation guide instance to present selected time period - * @property {HTMLElement} guideElement - Guide element - * @property {Object.} guideElements - Map by key. It can be used in monthly view - * @property {function} clearGuideElement - Hide the creation guide - * @example - * calendar.on('beforeCreateSchedule', function(event) { - * var guide = event.guide; - * // Use guideEl$'s left, top to locate your schedule creation popup - * var guideEl$ = guide.guideElement ? - * guide.guideElement : guide.guideElements[Object.keys(guide.guideElements)[0]]; - * - * // After that call this to hide the creation guide - * guide.clearGuideElement(); - * }); - */ - -/** - * Calendar class - * @constructor - * @mixes CustomEvents - * @param {HTMLElement|string} container - The container element or selector id - * @param {Options} options - The calendar {@link Options} object - * @example - * var calendar = new tui.Calendar(document.getElementById('calendar'), { - * defaultView: 'week', - * taskView: true, // Can be also ['milestone', 'task'] - * scheduleView: true, // Can be also ['allday', 'time'] - * template: { - * milestone: function(schedule) { - * return ' ' + schedule.title + ''; - * }, - * milestoneTitle: function() { - * return 'Milestone'; - * }, - * task: function(schedule) { - * return '  #' + schedule.title; - * }, - * taskTitle: function() { - * return ''; - * }, - * allday: function(schedule) { - * return schedule.title + ' '; - * }, - * alldayTitle: function() { - * return 'All Day'; - * }, - * time: function(schedule) { - * return schedule.title + ' ' + schedule.start; - * } - * }, - * month: { - * daynames: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], - * startDayOfWeek: 0, - * narrowWeekend: true - * }, - * week: { - * daynames: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], - * startDayOfWeek: 0, - * narrowWeekend: true - * } - * }); - */ -function Calendar(container, options) { - options = util.extend( - { - usageStatistics: true - }, - options - ); - - if (options.usageStatistics === true && util.sendHostname) { - util.sendHostname('calendar', GA_TRACKING_ID); - } - - if (util.isString(container)) { - container = document.querySelector(container); - } - - /** - * Calendar color map - * @type {object} - * @private - */ - this._calendarColor = {}; - - /** - * Current rendered date - * @type {TZDate} - * @private - */ - this._renderDate = datetime.start(); - - /** - * start and end date of weekly, monthly - * @type {object} - * @private - */ - this._renderRange = { - start: null, - end: null - }; - - /** - * base controller - * @type {Base} - * @private - */ - this._controller = _createController(options); - this._controller.setCalendars(options.calendars); - - /** - * layout view (layout manager) - * @type {Layout} - * @private - */ - this._layout = new Layout(container, this._controller.theme); - - /** - * global drag handler - * @type {Drag} - * @private - */ - this._dragHandler = new Drag({distance: 10}, this._layout.container); - - /** - * current rendered view name. ('day', 'week', 'month') - * @type {string} - * @default 'week' - * @private - */ - this._viewName = options.defaultView || 'week'; - - /** - * Refresh method. it can be ref different functions for each view modes. - * @type {function} - * @private - */ - this._refreshMethod = null; - - /** - * Scroll to now. It can be called for 'week', 'day' view modes. - * @type {function} - * @private - */ - this._scrollToNowMethod = null; - - /** - * It's true if Calendar.prototype.scrollToNow() is called. - * @type {boolean} - * @private - */ - this._requestScrollToNow = false; - - /** - * Open schedule creation popup - * @type {function} - * @private - */ - this._openCreationPopup = null; - - /** - * Hide the more view - * @type {function} - * @private - */ - this._hideMoreView = null; - - /** - * Unique id for requestAnimFrame() - * @type {number} - * @private - */ - this._requestRender = 0; - - /** - * calendar options - * @type {Options} - * @private - */ - this._options = {}; - - this._initialize(options); -} - -/** - * destroy calendar instance. - */ -Calendar.prototype.destroy = function() { - sanitizer.removeAttributeHooks(); - this._dragHandler.destroy(); - this._controller.off(); - this._layout.clear(); - this._layout.destroy(); - - util.forEach(this._options.template, function(func, name) { - if (func) { - Handlebars.unregisterHelper(name + '-tmpl'); - } - }); - - this._options = this._renderDate = this._controller - = this._layout = this._dragHandler = this._viewName = this._refreshMethod - = this._scrollToNowMethod = null; -}; - -/** - * Initialize calendar - * @param {Options} options - calendar options - * @private - */ -// eslint-disable-next-line complexity -Calendar.prototype._initialize = function(options) { - var controller = this._controller, - viewName = this._viewName; - - this._options = util.extend( - { - defaultView: viewName, - taskView: true, - scheduleView: true, - template: util.extend( - { - allday: null, - time: null - }, - util.pick(options, 'template') || {} - ), - week: util.extend({}, util.pick(options, 'week') || {}), - month: util.extend({}, util.pick(options, 'month') || {}), - calendars: [], - useCreationPopup: false, - useDetailPopup: false, - timezones: options.timezone && options.timezone.zones ? options.timezone.zones : [], - disableDblClick: false, - disableClick: false, - isReadOnly: false - }, - options - ); - - this._options.week = util.extend( - { - startDayOfWeek: 0, - workweek: false - }, - util.pick(this._options, 'week') || {} - ); - - this._options.timezone = util.extend({zones: []}, util.pick(options, 'timezone') || {}); - - this._options.month = util.extend( - { - startDayOfWeek: 0, - workweek: false, - scheduleFilter: function(schedule) { - return ( - Boolean(schedule.isVisible) && - (schedule.category === 'allday' || schedule.category === 'time') - ); - } - }, - util.pick(options, 'month') || {} - ); - - if (this._options.isReadOnly) { - this._options.useCreationPopup = false; - } - - this._layout.controller = controller; - - this._setAdditionalInternalOptions(this._options); - - this.changeView(viewName, true); - - sanitizer.addAttributeHooks(); -}; - -/** - * Set additional internal options - * 1. Register to the template handlebar - * 2. Update the calendar list and set the color of the calendar. - * 3. Change the primary timezone offset of the timezones. - * @param {Options} options - calendar options - * @private - */ -Calendar.prototype._setAdditionalInternalOptions = function(options) { - var timezone = options.timezone; - var templateWithSanitizer = function(templateFn) { - return function() { - var template = templateFn.apply(null, arguments); - - return sanitizer.sanitize(template); - }; - }; - var zones, offsetCalculator; - - util.forEach(options.template, function(func, name) { - if (func) { - Handlebars.registerHelper(name + '-tmpl', templateWithSanitizer(func)); - } - }); - - util.forEach( - options.calendars || [], - function(calendar) { - this.setCalendarColor(calendar.id, calendar, true); - }, - this - ); - - if (timezone) { - offsetCalculator = timezone.offsetCalculator; - - if (util.isFunction(offsetCalculator)) { - tz.setOffsetCalculator(offsetCalculator); - } - - zones = timezone.zones; - - if (zones.length) { - tz.setPrimaryTimezoneByOption(zones[0]); - - if (util.isNumber(zones[0].timezoneOffset)) { - // @deprecated timezoneOffset property will be deprecated. use timezone property - tz.setOffsetByTimezoneOption(zones[0].timezoneOffset); - } - } - } -}; - -/********** - * CRUD Methods - **********/ - -/** - * Create schedules and render calendar. - * @param {Array.} schedules - {@link Schedule} data list - * @param {boolean} [silent=false] - no auto render after creation when set true - * @example - * calendar.createSchedules([ - * { - * id: '1', - * calendarId: '1', - * title: 'my schedule', - * category: 'time', - * dueDateClass: '', - * start: '2018-01-18T22:30:00+09:00', - * end: '2018-01-19T02:30:00+09:00' - * }, - * { - * id: '2', - * calendarId: '1', - * title: 'second schedule', - * category: 'time', - * dueDateClass: '', - * start: '2018-01-18T17:30:00+09:00', - * end: '2018-01-19T17:31:00+09:00' - * } - * ]); - */ -Calendar.prototype.createSchedules = function(schedules, silent) { - util.forEach( - schedules, - function(obj) { - this._setScheduleColor(obj.calendarId, obj); - }, - this - ); - - this._controller.createSchedules(schedules, silent); - - if (!silent) { - this.render(); - } -}; - -/** - * Get a {@link Schedule} object by schedule id and calendar id. - * @param {string} scheduleId - ID of schedule - * @param {string} calendarId - calendarId of the schedule - * @returns {Schedule} schedule object - * @example - * var schedule = calendar.getSchedule(scheduleId, calendarId); - * console.log(schedule.title); - */ -Calendar.prototype.getSchedule = function(scheduleId, calendarId) { - return this._controller.schedules.single(function(model) { - return model.id === scheduleId && model.calendarId === calendarId; - }); -}; - -/** - * Update the schedule - * @param {string} scheduleId - ID of the original schedule to update - * @param {string} calendarId - The calendarId of the original schedule to update - * @param {object} changes - The {@link Schedule} properties and values with changes to update - * @param {boolean} [silent=false] - No auto render after creation when set true - * @example - * calendar.updateSchedule(schedule.id, schedule.calendarId, { - * title: 'Changed schedule', - * start: new Date('2019-11-05T09:00:00'), - * end: new Date('2019-11-05T10:00:00'), - * category: 'time' - * }); - */ -Calendar.prototype.updateSchedule = function(scheduleId, calendarId, changes, silent) { - var ctrl = this._controller, - ownSchedules = ctrl.schedules, - schedule = ownSchedules.single(function(model) { - return model.id === scheduleId && model.calendarId === calendarId; - }); - var hasChangedCalendar = false; - - if (!changes || !schedule) { - return; - } - - hasChangedCalendar = this._hasChangedCalendar(schedule, changes); - changes = hasChangedCalendar ? this._setScheduleColor(changes.calendarId, changes) : changes; - - ctrl.updateSchedule(schedule, changes); - - if (!silent) { - this.render(); - } -}; - -Calendar.prototype._hasChangedCalendar = function(schedule, changes) { - return schedule && changes.calendarId && schedule.calendarId !== changes.calendarId; -}; - -Calendar.prototype._setScheduleColor = function(calendarId, schedule) { - var calColor = this._calendarColor; - var color = calColor[calendarId]; - - if (color) { - schedule.color = schedule.color || color.color; - schedule.bgColor = schedule.bgColor || color.bgColor; - schedule.borderColor = schedule.borderColor || color.borderColor; - schedule.dragBgColor = schedule.dragBgColor || color.dragBgColor; - } - - return schedule; -}; - -/** - * Delete a schedule. - * @param {string} scheduleId - ID of schedule to delete - * @param {string} calendarId - The CalendarId of the schedule to delete - * @param {boolean} [silent=false] - No auto render after creation when set true - */ -Calendar.prototype.deleteSchedule = function(scheduleId, calendarId, silent) { - var ctrl = this._controller, - ownSchedules = ctrl.schedules, - schedule = ownSchedules.single(function(model) { - return model.id === scheduleId && model.calendarId === calendarId; - }); - - if (!schedule) { - return; - } - - ctrl.deleteSchedule(schedule); - if (!silent) { - this.render(); - } -}; - -/********** - * Private Methods - **********/ - -/** - * @param {string|Date} date - The Date to show in calendar - * @param {number} [startDayOfWeek=0] - The Start day of week - * @param {boolean} [workweek=false] - The only show work week - * @returns {array} render range - * @private - */ -Calendar.prototype._getWeekDayRange = function(date, startDayOfWeek, workweek) { - var day; - var start; - var end; - var range; - - startDayOfWeek = (startDayOfWeek || 0); // eslint-disable-line - date = util.isDate(date) ? date : new TZDate(date); - day = date.getDay(); - - // calculate default render range first. - start = new TZDate(date).addDate(-day + startDayOfWeek); - - end = new TZDate(start).addDate(6); - - if (day < startDayOfWeek) { - start = new TZDate(start).addDate(-7); - end = new TZDate(end).addDate(-7); - } - - if (workweek) { - range = datetime.range( - datetime.start(start), - datetime.end(end), - datetime.MILLISECONDS_PER_DAY - ); - - range = util.filter(range, function(weekday) { - return !datetime.isWeekend(weekday.getDay()); - }); - - start = range[0]; - end = range[range.length - 1]; - } - - start = datetime.start(start); - end = datetime.start(end); - - return [start, end]; -}; - -/** - * Toggle schedules' visibility by calendar ID - * @param {string} calendarId - The calendar id value - * @param {boolean} toHide - Set true to hide schedules - * @param {boolean} [render=true] - set true then render after change visible property each models - */ -Calendar.prototype.toggleSchedules = function(calendarId, toHide, render) { - var ownSchedules = this._controller.schedules; - - render = util.isExisty(render) ? render : true; - calendarId = util.isArray(calendarId) ? calendarId : [calendarId]; - - ownSchedules.each(function(schedule) { - if (~util.inArray(schedule.calendarId, calendarId)) { - schedule.set('isVisible', !toHide); - } - }); - - if (render) { - this.render(); - } -}; - -/********** - * General Methods - **********/ - -/** - * Render the calendar. The real rendering occurs after requestAnimationFrame. - * If you have to render immediately, use the 'immediately' parameter as true. - * @param {boolean} [immediately=false] - Render it immediately - * @example - * var silent = true; - * calendar.clear(); - * calendar.createSchedules(schedules, silent); - * calendar.render(); - * @example - * // Render a calendar when resizing a window. - * window.addEventListener('resize', function() { - * calendar.render(); - * }); - */ -Calendar.prototype.render = function(immediately) { - if (this._requestRender) { - reqAnimFrame.cancelAnimFrame(this._requestRender); - } - - if (immediately) { - this._renderFunc(); - } else { - this._requestRender = reqAnimFrame.requestAnimFrame(this._renderFunc, this); - } -}; - -/** - * Render and refresh all layout and process requests. - * @private - */ -Calendar.prototype._renderFunc = function() { - if (this._refreshMethod) { - this._refreshMethod(); - } - if (this._layout) { - this._layout.render(); - } - if (this._scrollToNowMethod && this._requestScrollToNow) { - this._scrollToNowMethod(); - } - - this._requestScrollToNow = false; - this._requestRender = null; -}; - -/** - * Delete all schedules and clear view. The real rendering occurs after requestAnimationFrame. - * If you have to render immediately, use the 'immediately' parameter as true. - * @param {boolean} [immediately=false] - Render it immediately - * @example - * calendar.clear(); - * calendar.createSchedules(schedules, true); - * calendar.render(); - */ -Calendar.prototype.clear = function(immediately) { - this._controller.clearSchedules(); - this.render(immediately); -}; - -/** - * Scroll to current time on today in case of daily, weekly view - * @example - * function onNewSchedules(schedules) { - * calendar.createSchedules(schedules); - * if (calendar.getViewName() !== 'month') { - * calendar.scrollToNow(); - * } - * } - */ -Calendar.prototype.scrollToNow = function() { - if (this._scrollToNowMethod) { - this._requestScrollToNow = true; - // this._scrollToNowMethod() will be called at next frame rendering. - } -}; - -/** - * Move to today. - * @example - * function onClickTodayBtn() { - * calendar.today(); - * } - */ -Calendar.prototype.today = function() { - this._renderDate = datetime.start(); - - this._setViewName(this._viewName); - this.move(); - this.render(); -}; - -/** - * Move the calendar amount of offset value - * @param {number} offset - The offset value. - * @private - * @example - * // move previous week when "week" view. - * // move previous month when "month" view. - * calendar.move(-1); - */ -// eslint-disable-next-line complexity -Calendar.prototype.move = function(offset) { - var renderDate = dw(datetime.start(this._renderDate)), - viewName = this._viewName, - view = this._getCurrentView(), - recursiveSet = _setOptionRecurseively, - startDate, - endDate, - tempDate, - startDayOfWeek, - visibleWeeksCount, - workweek, - isAlways6Week, - datetimeOptions; - - offset = util.isExisty(offset) ? offset : 0; - - if (viewName === 'month') { - startDayOfWeek = util.pick(this._options, 'month', 'startDayOfWeek') || 0; - visibleWeeksCount = mmin(util.pick(this._options, 'month', 'visibleWeeksCount') || 0, 6); - workweek = util.pick(this._options, 'month', 'workweek') || false; - isAlways6Week = util.pick(this._options, 'month', 'isAlways6Week'); - - if (visibleWeeksCount) { - datetimeOptions = { - startDayOfWeek: startDayOfWeek, - isAlways6Week: false, - visibleWeeksCount: visibleWeeksCount, - workweek: workweek - }; - - renderDate.addDate(offset * 7 * datetimeOptions.visibleWeeksCount); - tempDate = datetime.arr2dCalendar(renderDate.d, datetimeOptions); - - recursiveSet(view, function(childView, opt) { - opt.renderMonth = new TZDate(renderDate.d); - }); - } else { - datetimeOptions = { - startDayOfWeek: startDayOfWeek, - isAlways6Week: isAlways6Week, - workweek: workweek - }; - - renderDate.addMonth(offset); - tempDate = datetime.arr2dCalendar(renderDate.d, datetimeOptions); - - recursiveSet(view, function(childView, opt) { - opt.renderMonth = new TZDate(renderDate.d); - }); - } - - startDate = tempDate[0][0]; - endDate = tempDate[tempDate.length - 1][tempDate[tempDate.length - 1].length - 1]; - } else if (viewName === 'week') { - renderDate.addDate(offset * 7); - startDayOfWeek = util.pick(this._options, 'week', 'startDayOfWeek') || 0; - workweek = util.pick(this._options, 'week', 'workweek') || false; - tempDate = this._getWeekDayRange(renderDate.d, startDayOfWeek, workweek); - - startDate = tempDate[0]; - endDate = tempDate[1]; - - recursiveSet(view, function(childView, opt) { - opt.renderStartDate = new TZDate(startDate); - opt.renderEndDate = new TZDate(endDate); - - childView.setState({ - collapsed: true - }); - }); - } else if (viewName === 'day') { - renderDate.addDate(offset); - startDate = datetime.start(renderDate.d); - endDate = datetime.end(renderDate.d); - - recursiveSet(view, function(childView, opt) { - opt.renderStartDate = new TZDate(startDate); - opt.renderEndDate = new TZDate(endDate); - - childView.setState({ - collapsed: true - }); - }); - } - - this._renderDate = renderDate.d; - this._renderRange = { - start: startDate, - end: endDate - }; -}; - -/** - * Move to specific date - * @param {(Date|string)} date - The date to move - * @example - * calendar.on('clickDayname', function(event) { - * if (calendar.getViewName() === 'week') { - * calendar.setDate(new Date(event.date)); - * calendar.changeView('day', true); - * } - * }); - */ -Calendar.prototype.setDate = function(date) { - if (util.isString(date)) { - date = datetime.parse(date); - } - - this._renderDate = new TZDate(date); - this._setViewName(this._viewName); - this.move(0); - this.render(); -}; - -/** - * Move the calendar forward a day, a week, a month, 2 weeks, 3 weeks. - * @example - * function moveToNextOrPrevRange(val) { - if (val === -1) { - calendar.prev(); - } else if (val === 1) { - calendar.next(); - } -} - */ -Calendar.prototype.next = function() { - this.move(1); - this.render(); -}; - -/** - * Move the calendar backward a day, a week, a month, 2 weeks, 3 weeks. - * @example - * function moveToNextOrPrevRange(val) { - if (val === -1) { - calendar.prev(); - } else if (val === 1) { - calendar.next(); - } -} - */ -Calendar.prototype.prev = function() { - this.move(-1); - this.render(); -}; - -/** - * Return current rendered view. - * @returns {View} current view instance - * @private - */ -Calendar.prototype._getCurrentView = function() { - var viewName = this._viewName; - - if (viewName === 'day') { - viewName = 'week'; - } - - return util.pick(this._layout.children.items, viewName); -}; - -/** - * Change calendar's schedule color with option - * @param {string} calendarId - The calendar ID - * @param {CalendarColor} option - The {@link CalendarColor} object - * @param {boolean} [silent=false] - No auto render after creation when set true - * @example - * calendar.setCalendarColor('1', { - * color: '#e8e8e8', - * bgColor: '#585858', - * borderColor: '#a1b56c' - * dragBgColor: '#585858', - * }); - * calendar.setCalendarColor('2', { - * color: '#282828', - * bgColor: '#dc9656', - * borderColor: '#a1b56c', - * dragBgColor: '#dc9656', - * }); - * calendar.setCalendarColor('3', { - * color: '#a16946', - * bgColor: '#ab4642', - * borderColor: '#a1b56c', - * dragBgColor: '#ab4642', - * }); - */ -Calendar.prototype.setCalendarColor = function(calendarId, option, silent) { - var calColor = this._calendarColor, - ownSchedules = this._controller.schedules, - ownColor = calColor[calendarId]; - - if (!util.isObject(option)) { - config.throwError( - "Calendar#changeCalendarColor(): color 는 {color: '', bgColor: ''} 형태여야 합니다." - ); - } - - ownColor = calColor[calendarId] = util.extend( - { - color: '#000', - bgColor: '#a1b56c', - borderColor: '#a1b56c', - dragBgColor: '#a1b56c' - }, - option - ); - - ownSchedules.each(function(model) { - if (model.calendarId !== calendarId) { - return; - } - - model.color = ownColor.color; - model.bgColor = ownColor.bgColor; - model.borderColor = ownColor.borderColor; - model.dragBgColor = ownColor.dragBgColor; - }); - - if (!silent) { - this.render(); - } -}; - -/********** - * Custom Events - **********/ - -/** - * A bridge-based event handler for connecting a click handler to a user click event handler for each view - * @fires Calendar#clickSchedule - * @param {object} clickScheduleData - The event data of 'clickSchedule' handler - * @private - */ -Calendar.prototype._onClick = function(clickScheduleData) { - /** - * Fire this event when click a schedule. - * @event Calendar#clickSchedule - * @type {object} - * @property {Schedule} schedule - The {@link Schedule} instance - * @property {MouseEvent} event - MouseEvent - * @example - * calendar.on('clickSchedule', function(event) { - * var schedule = event.schedule; - * - * if (lastClickSchedule) { - * calendar.updateSchedule(lastClickSchedule.id, lastClickSchedule.calendarId, { - * isFocused: false - * }); - * } - * calendar.updateSchedule(schedule.id, schedule.calendarId, { - * isFocused: true - * }); - * - * lastClickSchedule = schedule; - * // open detail view - * }); - */ - this.fire('clickSchedule', clickScheduleData); -}; - -/** - * A bridge-based event handler for connecting a click handler to a user click event handler for each view - * @fires Calendar#clickMore - * @param {object} clickMoreSchedule - The event data of 'clickMore' handler - * @private - */ -Calendar.prototype._onClickMore = function(clickMoreSchedule) { - /** - * Fire this event when click a schedule. - * @event Calendar#clickMore - * @type {object} - * @property {Date} date - The Clicked date - * @property {HTMLElement} target - The more element - * @example - * calendar.on('clickMore', function(event) { - * console.log('clickMore', event.date, event.target); - * }); - */ - this.fire('clickMore', clickMoreSchedule); -}; - -/** - * dayname click event handler - * @fires Calendar#clickDayname - * @param {object} clickScheduleData - The event data of 'clickDayname' handler - * @private - */ -Calendar.prototype._onClickDayname = function(clickScheduleData) { - /** - * Fire this event when click a day name in weekly. - * @event Calendar#clickDayname - * @type {object} - * @property {string} date - The date string by format 'YYYY-MM-DD' - * @example - * calendar.on('clickDayname', function(event) { - * if (calendar.getViewName() === 'week') { - * calendar.setDate(new Date(event.date)); - * calendar.changeView('day', true); - * } - * }); - */ - this.fire('clickDayname', clickScheduleData); -}; - -/** - * @fires {Calendar#n('beforeCreateSchedule', function} - * @param {object} createScheduleData - select schedule data from allday, time - * @private - */ -Calendar.prototype._onBeforeCreate = function(createScheduleData) { - if (this._options.useCreationPopup && !createScheduleData.useCreationPopup) { - if (this._showCreationPopup) { - this._showCreationPopup(createScheduleData); - - return; - } - } - /** - * Fire this event when select time period in daily, weekly, monthly. - * @event Calendar#beforeCreateSchedule - * @type {object} - * @property {boolean} isAllDay - The allday schedule - * @property {Date} start - The selected start time - * @property {Date} end - The selected end time - * @property {TimeCreationGuide} guide - {@link TimeCreationGuide} instance - * @property {string} triggerEventName - The event name like 'click', 'dblclick' - * @example - * calendar.on('beforeCreateSchedule', function(event) { - * var startTime = event.start; - * var endTime = event.end; - * var isAllDay = event.isAllDay; - * var guide = event.guide; - * var triggerEventName = event.triggerEventName; - * var schedule; - * - * if (triggerEventName === 'click') { - * // open writing simple schedule popup - * schedule = {...}; - * } else if (triggerEventName === 'dblclick') { - * // open writing detail schedule popup - * schedule = {...}; - * } - * - * calendar.createSchedules([schedule]); - * }); - */ - this.fire('beforeCreateSchedule', createScheduleData); -}; - -/** - * @fires Calendar#beforeUpdateSchedule - * @param {object} updateScheduleData - update {@link Schedule} data - * @private - */ -Calendar.prototype._onBeforeUpdate = function(updateScheduleData) { - /** - * Fire this event when drag a schedule to change time in daily, weekly, monthly. - * @event Calendar#beforeUpdateSchedule - * @type {object} - * @property {Schedule} schedule - The original {@link Schedule} instance - * @property {object} changes - The {@link Schedule} properties and values with changes to update - * @property {Date} start - Deprecated: start time to update - * @property {Date} end - Deprecated: end time to update - * @example - * calendar.on('beforeUpdateSchedule', function(event) { - * var schedule = event.schedule; - * var changes = event.changes; - * - * calendar.updateSchedule(schedule.id, schedule.calendarId, changes); - * }); - */ - this.fire('beforeUpdateSchedule', updateScheduleData); -}; - -/** - * @fires Calendar#beforeDeleteSchedule - * @param {object} deleteScheduleData - delete schedule data - * @private - */ -Calendar.prototype._onBeforeDelete = function(deleteScheduleData) { - /** - * Fire this event when delete a schedule. - * @event Calendar#beforeDeleteSchedule - * @type {object} - * @property {Schedule} schedule - The {@link Schedule} instance to delete - * @example - * calendar.on('beforeDeleteSchedule', function(event) { - * var schedule = event.schedule; - * alert('The schedule is removed.', schedule); - * }); - */ - this.fire('beforeDeleteSchedule', deleteScheduleData); -}; - -/** - * @fires Calendar#afterRenderSchedule - * @param {Schedule} scheduleData - The schedule data - * @private - */ -Calendar.prototype._onAfterRenderSchedule = function(scheduleData) { - /** - * Fire this event by every single schedule after rendering whole calendar. - * @event Calendar#afterRenderSchedule - * @type {object} - * @property {Schedule} schedule - A rendered {@link Schedule} instance - * @example - * calendar.on('afterRenderSchedule', function(event) { - * var schedule = event.schedule; - * var element = calendar.getElement(schedule.id, schedule.calendarId); - * // use the element - * console.log(element); - * }); - */ - this.fire('afterRenderSchedule', scheduleData); -}; - -/** - * @fires Calendar#clickTimezonesCollapseBtn - * @param {boolean} timezonesCollapsed - timezones collapsed flag - * @private - */ -Calendar.prototype._onClickTimezonesCollapseBtn = function(timezonesCollapsed) { - /** - * Fire this event by clicking timezones collapse button - * @event Calendar#clickTimezonesCollapseBtn - * @type {object} - * @property {boolean} timezonesCollapsed - The timezones collapes flag - * @example - * calendar.on('clickTimezonesCollapseBtn', function(timezonesCollapsed) { - * console.log(timezonesCollapsed); - * }); - */ - this.fire('clickTimezonesCollapseBtn', timezonesCollapsed); -}; - -/** - * Toggle calendar factory class, main view, wallview event connection - * @param {boolean} isAttach - attach events if true. - * @param {Week|Month} view - Weekly view or Monthly view - * @private - */ -Calendar.prototype._toggleViewSchedule = function(isAttach, view) { - var self = this, - handler = view.handler, - method = isAttach ? 'on' : 'off'; - - util.forEach(handler.click, function(clickHandler) { - clickHandler[method]('clickSchedule', self._onClick, self); - }); - - util.forEach(handler.dayname, function(clickHandler) { - clickHandler[method]('clickDayname', self._onClickDayname, self); - }); - - util.forEach(handler.creation, function(creationHandler) { - creationHandler[method]('beforeCreateSchedule', self._onBeforeCreate, self); - creationHandler[method]('beforeDeleteSchedule', self._onBeforeDelete, self); - }); - - util.forEach(handler.move, function(moveHandler) { - moveHandler[method]('beforeUpdateSchedule', self._onBeforeUpdate, self); - }); - - util.forEach(handler.resize, function(resizeHandler) { - resizeHandler[method]('beforeUpdateSchedule', self._onBeforeUpdate, self); - }); - - // bypass events from view - view[method]('afterRenderSchedule', self._onAfterRenderSchedule, self); - view[method]('clickTimezonesCollapseBtn', self._onClickTimezonesCollapseBtn, self); - view[method]('clickMore', self._onClickMore, self); -}; - -/** - * Change current view with view name('day', 'week', 'month') - * @param {string} newViewName - The New view name to render - * @param {boolean} force - Force render despite of current view and new view are equal - * @example - * // daily view - * calendar.changeView('day', true); - * - * // weekly view - * calendar.changeView('week', true); - * - * // monthly view(default 6 weeks view) - * calendar.setOptions({month: {visibleWeeksCount: 6}}, true); // or null - * calendar.changeView('month', true); - * - * // 2 weeks monthly view - * calendar.setOptions({month: {visibleWeeksCount: 2}}, true); - * calendar.changeView('month', true); - * - * // 3 weeks monthly view - * calendar.setOptions({month: {visibleWeeksCount: 3}}, true); - * calendar.changeView('month', true); - * - * // narrow weekend - * calendar.setOptions({month: {narrowWeekend: true}}, true); - * calendar.setOptions({week: {narrowWeekend: true}}, true); - * calendar.changeView(calendar.getViewName(), true); - * - * // change start day of week(from monday) - * calendar.setOptions({week: {startDayOfWeek: 1}}, true); - * calendar.setOptions({month: {startDayOfWeek: 1}}, true); - * calendar.changeView(calendar.getViewName(), true); - * - * // work week - * calendar.setOptions({week: {workweek: true}}, true); - * calendar.setOptions({month: {workweek: true}}, true); - * calendar.changeView(calendar.getViewName(), true); - */ -// eslint-disable-next-line complexity -Calendar.prototype.changeView = function(newViewName, force) { - var self = this, - layout = this._layout, - controller = this._controller, - dragHandler = this._dragHandler, - options = this._options, - viewName = this._viewName, - created; - - if (!force && viewName === newViewName) { - return; - } - - this._setViewName(newViewName); - - // convert day to week - if (viewName === 'day') { - viewName = 'week'; - } - - if (newViewName === 'day') { - newViewName = 'week'; - } - layout.children.doWhenHas(viewName, function(view) { - self._toggleViewSchedule(false, view); - }); - - layout.clear(); - - if (newViewName === 'month') { - created = _createMonthView(controller, layout.container, dragHandler, options); - } else if (newViewName === 'week') { - created = _createWeekView( - controller, - layout.container, - dragHandler, - options, - this.getViewName() - ); - } - - layout.addChild(created.view); - - layout.children.doWhenHas(newViewName, function(view) { - self._toggleViewSchedule(true, view); - }); - - this._refreshMethod = created.refresh; - this._scrollToNowMethod = created.scrollToNow; - this._openCreationPopup = created.openCreationPopup; - this._showCreationPopup = created.showCreationPopup; - this._hideMoreView = created.hideMoreView; - - this.move(); - this.render(); -}; - -/** - * @deprecated - * Toggle task view('Milestone', 'Task') panel - * @param {boolean} enabled - use task view - * @example - * // There is no milestone, task, so hide those view panel - * calendar.toggleTaskView(false); - * - * // There are some milestone, task, so show those view panel. - * calendar.toggleTaskView(true); - */ -Calendar.prototype.toggleTaskView = function(enabled) { - var viewName = this._viewName, - options = this._options; - - options.taskView = enabled; - - this.changeView(viewName, true); -}; - -/** - * @deprecated - * Toggle schedule view('AllDay', TimeGrid') panel - * @param {boolean} enabled - use task view - * @example - * // hide those view panel to show only 'Milestone', 'Task' - * calendar.toggleScheduleView(false); - * - * // show those view panel. - * calendar.toggleScheduleView(true); - */ -Calendar.prototype.toggleScheduleView = function(enabled) { - var viewName = this._viewName, - options = this._options; - - options.scheduleView = enabled; - - this.changeView(viewName, true); -}; - -/** - * Set current view name - * @param {string} viewName - new view name to render - * @private - */ -Calendar.prototype._setViewName = function(viewName) { - this._viewName = viewName; -}; - -/** - * Get a schedule element by schedule id and calendar id. - * @param {string} scheduleId - ID of schedule - * @param {string} calendarId - calendarId of schedule - * @returns {HTMLElement} schedule element if found or null - * @example - * var element = calendar.getElement(scheduleId, calendarId); - * console.log(element); - */ -Calendar.prototype.getElement = function(scheduleId, calendarId) { - var schedule = this.getSchedule(scheduleId, calendarId); - if (schedule) { - return document.querySelector( - '[data-schedule-id="' + scheduleId + '"][data-calendar-id="' + calendarId + '"]' - ); - } - - return null; -}; - -/** - * Set a theme. If some keys are not defined in the preset, will be return. - * @param {object} theme - multiple styles map - * @returns {Array.} keys - error keys not predefined. - * @example - * cal.setTheme({ - 'month.dayname.height': '31px', - 'common.dayname.color': '#333', - 'month.dayname.borderBottom': '1px solid #e5e5e5' // Not valid key will be return. - * }); - */ -Calendar.prototype.setTheme = function(theme) { - var result = this._controller.setTheme(theme); - this.render(true); - - return result; -}; - -/** - * Set options of calendar - * @param {Options} options - set {@link Options} - * @param {boolean} [silent=false] - no auto render after creation when set true - */ -Calendar.prototype.setOptions = function(options, silent) { - util.forEach( - options, - function(value, name) { - if (util.isObject(value) && !util.isArray(value)) { - util.forEach( - value, - function(innerValue, innerName) { - this._options[name][innerName] = innerValue; - }, - this - ); - } else { - this._options[name] = value; - } - }, - this - ); - - this._setAdditionalInternalOptions(options); - - if (util.isObject(options.timezone) && util.isArray(options.timezone.zones)) { - this._options.timezones = options.timezone.zones; - } - - if (!silent) { - this.changeView(this._viewName, true); - } -}; - -/** - * Get current {@link Options}. - * @returns {Options} options - */ -Calendar.prototype.getOptions = function() { - return this._options; -}; - -/** - * Current rendered date ({@link TZDate} for further information) - * @returns {TZDate} - */ -Calendar.prototype.getDate = function() { - return this._renderDate; -}; - -/** - * Start time of rendered date range ({@link TZDate} for further information) - * @returns {TZDate} - */ -Calendar.prototype.getDateRangeStart = function() { - return this._renderRange.start; -}; - -/** - * End time of rendered date range ({@link TZDate} for further information) - * @returns {TZDate} - */ -Calendar.prototype.getDateRangeEnd = function() { - return this._renderRange.end; -}; - -/** - * Get current view name('day', 'week', 'month') - * @returns {string} view name - */ -Calendar.prototype.getViewName = function() { - return this._viewName; -}; - -/** - * Set calendar list - * @param {Array.} calendars - {@link CalendarProps} List - */ -Calendar.prototype.setCalendars = function(calendars) { - util.forEach( - calendars || [], - function(calendar) { - this.setCalendarColor(calendar.id, calendar, true); - }, - this - ); - - this._controller.setCalendars(calendars); - - this.render(); -}; - -/** - * Open schedule creation popup - * @param {Schedule} schedule - The preset {@link Schedule} data - */ -Calendar.prototype.openCreationPopup = function(schedule) { - if (this._openCreationPopup) { - this._openCreationPopup(schedule); - } -}; - -/** - * Hide the more view - */ -Calendar.prototype.hideMoreView = function() { - if (this._hideMoreView) { - this._hideMoreView(); - } -}; - -/** - * Set timezone offset - * @param {number} offset - The offset (min) - * @static - * @deprecated - * @example - * var timezoneName = moment.tz.guess(); - * tui.Calendar.setTimezoneOffset(moment.tz.zone(timezoneName).utcOffset(moment())); - */ -Calendar.setTimezoneOffset = function(offset) { - tz.setOffset(offset); -}; - -/** - * Set a callback function to get timezone offset by timestamp - * @param {function} callback - The callback function - * @static - * @deprecated - * @example - * var timezoneName = moment.tz.guess(); - * tui.Calendar.setTimezoneOffsetCallback(function(timestamp) { - * return moment.tz.zone(timezoneName).utcOffset(timestamp)); - * }); - */ -Calendar.setTimezoneOffsetCallback = function(callback) { - tz.setOffsetCallback(callback); -}; - -/** - * Create controller instance - * @returns {Base} controller instance - * @param {Options} options - calendar options - * @private - */ -function _createController(options) { - return controllerFactory(options); -} - -/** - * Create week view instance by dependent module instances - * @param {Base} controller - controller - * @param {HTMLElement} container - container element - * @param {Drag} dragHandler - global drag handler - * @param {object} options - options for week view - * @param {string} viewName - 'week', 'day' - * @returns {Week} week view instance - * @private - */ -function _createWeekView(controller, container, dragHandler, options, viewName) { - return weekViewFactory(controller, container, dragHandler, options, viewName); -} - -/** - * Create week view instance by dependent module instances - * @param {Base} controller - controller - * @param {HTMLElement} container - container element - * @param {Drag} dragHandler - global drag handler - * @param {object} options - options for week view - * @returns {Month} month view instance - * @private - */ -function _createMonthView(controller, container, dragHandler, options) { - return monthViewFactory(controller, container, dragHandler, options); -} - -/** - * Set child view's options recursively - * @param {View} view - parent view - * @param {function} func - option manipulate function - * @private - */ -function _setOptionRecurseively(view, func) { - view.recursive(function(childView) { - var opt = childView.options; - - if (!opt) { - return; - } - - func(childView, opt); - }); -} - -util.CustomEvents.mixin(Calendar); - -module.exports = Calendar; - - -/***/ }), - -/***/ "./src/js/factory/controller.js": -/*!**************************************!*\ - !*** ./src/js/factory/controller.js ***! - \**************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_468232__) { - -"use strict"; -/** - * @fileoverview Controller factory module. - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_468232__(/*! tui-code-snippet */ "tui-code-snippet"); -var Base = __nested_webpack_require_468232__(/*! ../controller/base */ "./src/js/controller/base.js"), - Core = __nested_webpack_require_468232__(/*! ../controller/viewMixin/core */ "./src/js/controller/viewMixin/core.js"), - Week = __nested_webpack_require_468232__(/*! ../controller/viewMixin/week */ "./src/js/controller/viewMixin/week.js"), - Month = __nested_webpack_require_468232__(/*! ../controller/viewMixin/month */ "./src/js/controller/viewMixin/month.js"); - -/** - * Mixin object. create object property to target and mix to that - * @param {object} from - source object - * @param {object} to - target object - * @param {string} propertyName - property name - */ -function mixin(from, to, propertyName) { - var obj = to[propertyName] = {}; - - util.forEach(from, function(method, methodName) { - obj[methodName] = method.bind(to); - }); -} - -/** - * @param {object} options - options for base controller - * @param {function} [options.groupFunc] - function for group each models {@see Collection#groupBy} - * @returns {Base} The controller instance. - */ -module.exports = function(options) { - var controller = new Base(options); - - mixin(Core, controller, 'Core'); - mixin(Week, controller, 'Week'); - mixin(Month, controller, 'Month'); - - // for Theme - controller.Core.theme = controller.theme; - controller.Week.theme = controller.theme; - controller.Month.theme = controller.theme; - - return controller; -}; - - -/***/ }), - -/***/ "./src/js/factory/monthView.js": -/*!*************************************!*\ - !*** ./src/js/factory/monthView.js ***! - \*************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_470093__) { - -"use strict"; -/** - * @fileoverview Month view factory module - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_470093__(/*! tui-code-snippet */ "tui-code-snippet"); -var config = __nested_webpack_require_470093__(/*! ../config */ "./src/js/config.js"), - array = __nested_webpack_require_470093__(/*! ../common/array */ "./src/js/common/array.js"), - datetime = __nested_webpack_require_470093__(/*! ../common/datetime */ "./src/js/common/datetime.js"), - domutil = __nested_webpack_require_470093__(/*! ../common/domutil */ "./src/js/common/domutil.js"), - common = __nested_webpack_require_470093__(/*! ../common/common */ "./src/js/common/common.js"), - Month = __nested_webpack_require_470093__(/*! ../view/month/month */ "./src/js/view/month/month.js"), - MonthClick = __nested_webpack_require_470093__(/*! ../handler/month/click */ "./src/js/handler/month/click.js"), - MonthCreation = __nested_webpack_require_470093__(/*! ../handler/month/creation */ "./src/js/handler/month/creation.js"), - MonthResize = __nested_webpack_require_470093__(/*! ../handler/month/resize */ "./src/js/handler/month/resize.js"), - MonthMove = __nested_webpack_require_470093__(/*! ../handler/month/move */ "./src/js/handler/month/move.js"), - More = __nested_webpack_require_470093__(/*! ../view/month/more */ "./src/js/view/month/more.js"), - ScheduleCreationPopup = __nested_webpack_require_470093__(/*! ../view/popup/scheduleCreationPopup */ "./src/js/view/popup/scheduleCreationPopup.js"), - ScheduleDetailPopup = __nested_webpack_require_470093__(/*! ../view/popup/scheduleDetailPopup */ "./src/js/view/popup/scheduleDetailPopup.js"), - Schedule = __nested_webpack_require_470093__(/*! ../model/schedule */ "./src/js/model/schedule.js"); - -/** - * Get the view model for more layer - * @param {TZDate} date - date has more schedules - * @param {HTMLElement} target - target element - * @param {Collection} schedules - schedule collection - * @param {string[]} daynames - daynames to use upside of month more view - * @returns {object} view model - */ -function getViewModelForMoreLayer(date, target, schedules, daynames) { - schedules.each(function(schedule) { - var model = schedule.model; - schedule.hasMultiDates = datetime.hasMultiDates(model.start, model.end); - }); - - return { - target: target, - date: datetime.format(date, 'YYYY.MM.DD'), - dayname: daynames[date.getDay()], - schedules: schedules.sort(array.compare.schedule.asc) - }; -} - -/** - * @param {Base} baseController - controller instance - * @param {HTMLElement} layoutContainer - container element for month view - * @param {Drag} dragHandler - drag handler instance - * @param {object} options - options - * @returns {object} view instance and refresh method - */ -function createMonthView(baseController, layoutContainer, dragHandler, options) { - var monthViewContainer, monthView, moreView, createView; - var clickHandler, creationHandler, resizeHandler, moveHandler, clearSchedulesHandler, onUpdateSchedule; - var onShowCreationPopup, onSaveNewSchedule, onShowEditPopup; - var detailView, onShowDetailPopup, onDeleteSchedule, onEditSchedule; - - monthViewContainer = domutil.appendHTMLElement( - 'div', layoutContainer, config.classname('month')); - - monthView = new Month(options, monthViewContainer, baseController.Month); - moreView = new More(options.month, layoutContainer, baseController.theme); - - // handlers - clickHandler = new MonthClick(dragHandler, monthView, baseController); - if (!options.isReadOnly) { - creationHandler = new MonthCreation(dragHandler, monthView, baseController, options); - resizeHandler = new MonthResize(dragHandler, monthView, baseController); - moveHandler = new MonthMove(dragHandler, monthView, baseController); - } - - clearSchedulesHandler = function() { - if (moreView) { - moreView.hide(); - } - }; - - onUpdateSchedule = function() { - if (moreView) { - moreView.refresh(); - } - }; - - // binding +n click schedule - clickHandler.on('clickMore', function(clickMoreSchedule) { - var date = clickMoreSchedule.date, - target = clickMoreSchedule.target, - schedules = util.pick(baseController.findByDateRange( - datetime.start(date), - datetime.end(date) - ), clickMoreSchedule.ymd); - - schedules.items = util.filter(schedules.items, function(item) { - return options.month.scheduleFilter(item.model); - }); - - if (schedules && schedules.length) { - moreView.render(getViewModelForMoreLayer(date, target, schedules, monthView.options.daynames)); - - schedules.each(function(scheduleViewModel) { - if (scheduleViewModel) { - /** - * @event More#afterRenderSchedule - */ - monthView.fire('afterRenderSchedule', {schedule: scheduleViewModel.model}); - } - }); - - monthView.fire('clickMore', { - date: clickMoreSchedule.date, - target: moreView.getMoreViewElement() - }); - } - }); - - // binding popup for schedules creation - if (options.useCreationPopup) { - createView = new ScheduleCreationPopup(layoutContainer, baseController.calendars, options.usageStatistics); - - onSaveNewSchedule = function(scheduleData) { - creationHandler.fire('beforeCreateSchedule', util.extend(scheduleData, { - useCreationPopup: true - })); - }; - createView.on('beforeCreateSchedule', onSaveNewSchedule); - } - - // binding popup for schedule detail - if (options.useDetailPopup) { - detailView = new ScheduleDetailPopup(layoutContainer); - onShowDetailPopup = function(eventData) { - var scheduleId = eventData.schedule.calendarId; - eventData.calendar = common.find(baseController.calendars, function(calendar) { - return calendar.id === scheduleId; - }); - - if (options.isReadOnly) { - eventData.schedule = util.extend({}, eventData.schedule, {isReadOnly: true}); - } - - detailView.render(eventData); - }; - onDeleteSchedule = function(eventData) { - if (creationHandler) { - creationHandler.fire('beforeDeleteSchedule', eventData); - } - }; - onEditSchedule = function(eventData) { - moveHandler.fire('beforeUpdateSchedule', eventData); - }; - - clickHandler.on('clickSchedule', onShowDetailPopup); - - detailView.on('beforeDeleteSchedule', onDeleteSchedule); - - if (options.useCreationPopup) { - onShowEditPopup = function(eventData) { - createView.setCalendars(baseController.calendars); - createView.render(eventData); - }; - createView.on('beforeUpdateSchedule', onEditSchedule); - detailView.on('beforeUpdateSchedule', onShowEditPopup); - } else { - detailView.on('beforeUpdateSchedule', onEditSchedule); - } - } - - // binding clear schedules - baseController.on('clearSchedules', clearSchedulesHandler); - - // bind update schedule event - baseController.on('updateSchedule', onUpdateSchedule); - - if (moveHandler) { - moveHandler.on('monthMoveStart_from_morelayer', function() { - moreView.hide(); - }); - } - - monthView.handler = { - click: { - 'default': clickHandler - } - }; - - if (!options.isReadOnly) { - monthView.handler = util.extend(monthView.handler, { - creation: { - 'default': creationHandler - }, - resize: { - 'default': resizeHandler - }, - move: { - 'default': moveHandler - } - }); - } - - monthView._beforeDestroy = function() { - moreView.destroy(); - baseController.off('clearSchedules', clearSchedulesHandler); - baseController.off('updateSchedule', onUpdateSchedule); - - util.forEach(monthView.handler, function(type) { - util.forEach(type, function(handler) { - handler.off(); - handler.destroy(); - }); - }); - - if (options.useCreationPopup && options.useDetailPopup && createView && detailView) { - createView.off('beforeUpdateSchedule', onUpdateSchedule); - } - - if (options.useCreationPopup && createView) { - if (creationHandler) { - creationHandler.off('beforeCreateSchedule', onShowCreationPopup); - } - createView.off('saveSchedule', onSaveNewSchedule); - createView.destroy(); - } - - if (options.useDetailPopup && detailView) { - clickHandler.off('clickSchedule', onShowDetailPopup); - detailView.off('beforeUpdateSchedule', onUpdateSchedule); - detailView.off('beforeDeleteSchedule', onDeleteSchedule); - detailView.destroy(); - } - }; - - // add controller - monthView.controller = baseController.Month; - - return { - view: monthView, - refresh: function() { - monthView.vLayout.refresh(); - }, - openCreationPopup: function(schedule) { - if (createView && creationHandler) { - creationHandler.invokeCreationClick(Schedule.create(schedule)); - } - }, - showCreationPopup: function(eventData) { - if (createView) { - createView.setCalendars(baseController.calendars); - createView.render(eventData); - } - }, - hideMoreView: function() { - if (moreView) { - moreView.hide(); - } - } - }; -} - -module.exports = createMonthView; - - -/***/ }), - -/***/ "./src/js/factory/weekView.js": -/*!************************************!*\ - !*** ./src/js/factory/weekView.js ***! - \************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_480121__) { - -"use strict"; -/** - * @fileoverview Factory module for WeekView - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_480121__(/*! tui-code-snippet */ "tui-code-snippet"); -var config = __nested_webpack_require_480121__(/*! ../config */ "./src/js/config.js"); -var domutil = __nested_webpack_require_480121__(/*! ../common/domutil */ "./src/js/common/domutil.js"); -var common = __nested_webpack_require_480121__(/*! ../common/common */ "./src/js/common/common.js"); -var VLayout = __nested_webpack_require_480121__(/*! ../common/vlayout */ "./src/js/common/vlayout.js"); -var reqAnimFrame = __nested_webpack_require_480121__(/*! ../common/reqAnimFrame */ "./src/js/common/reqAnimFrame.js"); -var Schedule = __nested_webpack_require_480121__(/*! ../model/schedule */ "./src/js/model/schedule.js"); -// Parent views -var Week = __nested_webpack_require_480121__(/*! ../view/week/week */ "./src/js/view/week/week.js"); - -// Sub views -var DayName = __nested_webpack_require_480121__(/*! ../view/week/dayname */ "./src/js/view/week/dayname.js"); -var DayGrid = __nested_webpack_require_480121__(/*! ../view/week/dayGrid */ "./src/js/view/week/dayGrid.js"); -var TimeGrid = __nested_webpack_require_480121__(/*! ../view/week/timeGrid */ "./src/js/view/week/timeGrid.js"); -var ScheduleCreationPopup = __nested_webpack_require_480121__(/*! ../view/popup/scheduleCreationPopup */ "./src/js/view/popup/scheduleCreationPopup.js"); -var ScheduleDetailPopup = __nested_webpack_require_480121__(/*! ../view/popup/scheduleDetailPopup */ "./src/js/view/popup/scheduleDetailPopup.js"); - -// Handlers -var DayNameClick = __nested_webpack_require_480121__(/*! ../handler/time/clickDayname */ "./src/js/handler/time/clickDayname.js"); -var DayGridClick = __nested_webpack_require_480121__(/*! ../handler/daygrid/click */ "./src/js/handler/daygrid/click.js"); -var DayGridCreation = __nested_webpack_require_480121__(/*! ../handler/daygrid/creation */ "./src/js/handler/daygrid/creation.js"); -var DayGridMove = __nested_webpack_require_480121__(/*! ../handler/daygrid/move */ "./src/js/handler/daygrid/move.js"); -var DayGridResize = __nested_webpack_require_480121__(/*! ../handler/daygrid/resize */ "./src/js/handler/daygrid/resize.js"); -var TimeClick = __nested_webpack_require_480121__(/*! ../handler/time/click */ "./src/js/handler/time/click.js"); -var TimeCreation = __nested_webpack_require_480121__(/*! ../handler/time/creation */ "./src/js/handler/time/creation.js"); -var TimeMove = __nested_webpack_require_480121__(/*! ../handler/time/move */ "./src/js/handler/time/move.js"); -var TimeResize = __nested_webpack_require_480121__(/*! ../handler/time/resize */ "./src/js/handler/time/resize.js"); - -var DAYGRID_HANDLDERS = { - 'click': DayGridClick, - 'creation': DayGridCreation, - 'move': DayGridMove, - 'resize': DayGridResize -}; -var TIMEGRID_HANDLERS = { - 'click': TimeClick, - 'creation': TimeCreation, - 'move': TimeMove, - 'resize': TimeResize -}; -var DEFAULT_PANELS = [ - { - name: 'milestone', - type: 'daygrid', - minHeight: 20, - maxHeight: 80, - showExpandableButton: true, - maxExpandableHeight: 210, - handlers: ['click'], - show: true - }, - { - name: 'task', - type: 'daygrid', - minHeight: 40, - maxHeight: 120, - showExpandableButton: true, - maxExpandableHeight: 210, - handlers: ['click', 'move'], - show: true - }, - { - name: 'allday', - type: 'daygrid', - minHeight: 30, - maxHeight: 80, - showExpandableButton: true, - maxExpandableHeight: 210, - handlers: ['click', 'creation', 'move', 'resize'], - show: true - }, - { - name: 'time', - type: 'timegrid', - autoHeight: true, - handlers: ['click', 'creation', 'move', 'resize'], - show: true - } -]; - -/* eslint-disable complexity*/ -module.exports = function(baseController, layoutContainer, dragHandler, options, viewName) { - var panels = [], - vpanels = []; - var weekView, dayNameContainer, dayNameView, vLayoutContainer, vLayout; - var createView, onSaveNewSchedule, onSetCalendars, lastVPanel; - var detailView, onShowDetailPopup, onDeleteSchedule, onShowEditPopup, onEditSchedule; - var taskView = options.taskView; - var scheduleView = options.scheduleView; - var viewVisibilities = { - 'milestone': util.isArray(taskView) ? util.inArray('milestone', taskView) >= 0 : taskView, - 'task': util.isArray(taskView) ? util.inArray('task', taskView) >= 0 : taskView, - 'allday': util.isArray(scheduleView) ? util.inArray('allday', scheduleView) >= 0 : scheduleView, - 'time': util.isArray(scheduleView) ? util.inArray('time', scheduleView) >= 0 : scheduleView - }; - - // Make panels by view sequence and visibilities - util.forEach(DEFAULT_PANELS, function(panel) { - var name = panel.name; - - panel = util.extend({}, panel); - panels.push(panel); - - // Change visibilities - panel.show = viewVisibilities[name]; - - if (panel.show) { - if (vpanels.length) { - vpanels.push({ - isSplitter: true - }); - } - vpanels.push(util.extend({}, panel)); - } - }); - - if (vpanels.length) { - lastVPanel = vpanels[vpanels.length - 1]; - lastVPanel.autoHeight = true; - lastVPanel.maxHeight = null; - lastVPanel.showExpandableButton = false; - - util.forEach(panels, function(panel) { - if (panel.name === lastVPanel.name) { - panel.showExpandableButton = false; - - return false; - } - - return true; - }); - } - - util.extend(options.week, {panels: panels}); - - weekView = new Week(null, options.week, layoutContainer, panels, viewName); - weekView.handler = { - click: {}, - dayname: {}, - creation: {}, - move: {}, - resize: {} - }; - - dayNameContainer = domutil.appendHTMLElement('div', weekView.container, config.classname('dayname-layout')); - - /********** - * Day name (top row(Mon, Tue, Wed...)) - **********/ - dayNameView = new DayName(options, dayNameContainer, baseController.theme); - weekView.handler.dayname.date = new DayNameClick(dragHandler, dayNameView, baseController); - weekView.addChild(dayNameView); - - /********** - * Initialize vertical layout module - **********/ - vLayoutContainer = domutil.appendHTMLElement('div', weekView.container, config.classname('vlayout-area')); - vLayoutContainer.style.height = (domutil.getSize(weekView.container)[1] - dayNameView.container.offsetHeight) + 'px'; - - vLayout = new VLayout({ - panels: vpanels, - panelHeights: options.week.panelHeights || [] - }, vLayoutContainer, baseController.theme); - - weekView.vLayout = vLayout; - - util.forEach(panels, function(panel) { - var name = panel.name; - var handlers = panel.handlers; - var view; - - if (!panel.show) { - return; - } - - if (panel.type === 'daygrid') { - /********** - * Schedule panel by Grid - **********/ - view = new DayGrid(name, options, vLayout.getPanelByName(panel.name).container, baseController.theme); - view.on('afterRender', function(viewModel) { - vLayout.getPanelByName(name).setHeight(null, viewModel.height); - }); - - weekView.addChild(view); - - util.forEach(handlers, function(type) { - if (!options.isReadOnly || type === 'click') { - weekView.handler[type][name] = - new DAYGRID_HANDLDERS[type](dragHandler, view, baseController, options); - view.addHandler(type, weekView.handler[type][name], vLayout.getPanelByName(name)); - } - }); - } else if (panel.type === 'timegrid') { - /********** - * Schedule panel by TimeGrid - **********/ - view = new TimeGrid(name, options, vLayout.getPanelByName(name).container); - weekView.addChild(view); - util.forEach(handlers, function(type) { - if (!options.isReadOnly || type === 'click') { - weekView.handler[type][name] = - new TIMEGRID_HANDLERS[type](dragHandler, view, baseController, options); - } - }); - - view.on('clickTimezonesCollapsedBtn', function() { - var timezonesCollapsed = !weekView.state.timezonesCollapsed; - - weekView.setState({ - timezonesCollapsed: timezonesCollapsed - }); - reqAnimFrame.requestAnimFrame(function() { - if (!weekView.invoke('clickTimezonesCollapseBtn', timezonesCollapsed)) { - weekView.render(); - } - }); - }); - } - }); - - vLayout.on('resize', function() { - reqAnimFrame.requestAnimFrame(function() { - weekView.render(); - }); - }); - - // binding create schedules event - if (options.useCreationPopup) { - createView = new ScheduleCreationPopup(layoutContainer, baseController.calendars, options.usageStatistics); - - onSaveNewSchedule = function(scheduleData) { - util.extend(scheduleData, { - useCreationPopup: true - }); - if (scheduleData.isAllDay) { - weekView.handler.creation.allday.fire('beforeCreateSchedule', scheduleData); - } else { - weekView.handler.creation.time.fire('beforeCreateSchedule', scheduleData); - } - }; - createView.on('beforeCreateSchedule', onSaveNewSchedule); - } - - onSetCalendars = function(calendars) { - if (createView) { - createView.setCalendars(calendars); - } - }; - - baseController.on('setCalendars', onSetCalendars); - - // binding popup for schedule detail - if (options.useDetailPopup) { - detailView = new ScheduleDetailPopup(layoutContainer); - onShowDetailPopup = function(eventData) { - var scheduleId = eventData.schedule.calendarId; - eventData.calendar = common.find(baseController.calendars, function(calendar) { - return calendar.id === scheduleId; - }); - - if (options.isReadOnly) { - eventData.schedule = util.extend({}, eventData.schedule, {isReadOnly: true}); - } - - detailView.render(eventData); - }; - onDeleteSchedule = function(eventData) { - if (eventData.isAllDay) { - weekView.handler.creation.allday.fire('beforeDeleteSchedule', eventData); - } else { - weekView.handler.creation.time.fire('beforeDeleteSchedule', eventData); - } - }; - onEditSchedule = function(eventData) { - if (eventData.isAllDay) { - weekView.handler.move.allday.fire('beforeUpdateSchedule', eventData); - } else { - weekView.handler.move.time.fire('beforeUpdateSchedule', eventData); - } - }; - - util.forEach(weekView.handler.click, function(panel) { - panel.on('clickSchedule', onShowDetailPopup); - }); - if (options.useCreationPopup) { - onShowEditPopup = function(eventData) { - var calendars = baseController.calendars; - eventData.isEditMode = true; - createView.setCalendars(calendars); - createView.render(eventData); - }; - createView.on('beforeUpdateSchedule', onEditSchedule); - detailView.on('beforeUpdateSchedule', onShowEditPopup); - } else { - detailView.on('beforeUpdateSchedule', onEditSchedule); - } - detailView.on('beforeDeleteSchedule', onDeleteSchedule); - } - - weekView.on('afterRender', function() { - vLayout.refresh(); - }); - - // add controller - weekView.controller = baseController.Week; - - // add destroy - weekView._beforeDestroy = function() { - util.forEach(weekView.handler, function(type) { - util.forEach(type, function(handler) { - handler.off(); - handler.destroy(); - }); - }); - - if (options.useCreationPopup && createView) { - createView.off('beforeCreateSchedule', onSaveNewSchedule); - createView.destroy(); - } - - if (options.useDetailPopup && detailView) { - detailView.off('beforeDeleteSchedule', onDeleteSchedule); - detailView.destroy(); - } - - weekView.off(); - }; - - return { - view: weekView, - refresh: function() { - var weekViewHeight = weekView.getViewBound().height, - daynameViewHeight = domutil.getBCRect( - dayNameView.container - ).height; - - vLayout.container.style.height = - weekViewHeight - daynameViewHeight + 'px'; - vLayout.refresh(); - }, - scrollToNow: function() { - weekView.children.each(function(childView) { - if (childView.scrollToNow) { - childView.scrollToNow(); - } - }); - }, - openCreationPopup: function(schedule) { - if (createView) { - if (schedule.isAllDay) { - weekView.handler.creation.allday.invokeCreationClick(Schedule.create(schedule)); - } else { - weekView.handler.creation.time.invokeCreationClick(Schedule.create(schedule)); - } - } - }, - showCreationPopup: function(eventData) { - if (createView) { - createView.setCalendars(baseController.calendars); - createView.render(eventData); - } - } - }; -}; - - -/***/ }), - -/***/ "./src/js/handler/daygrid/click.js": -/*!*****************************************!*\ - !*** ./src/js/handler/daygrid/click.js ***! - \*****************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_494136__) { - -"use strict"; -/** - * @fileoverview Click handle module for daygrid schedules - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_494136__(/*! tui-code-snippet */ "tui-code-snippet"); -var config = __nested_webpack_require_494136__(/*! ../../config */ "./src/js/config.js"); -var domutil = __nested_webpack_require_494136__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); -var DayGridMove = __nested_webpack_require_494136__(/*! ./move */ "./src/js/handler/daygrid/move.js"); - -/** - * @constructor - * @implements {Handler} - * @mixes CustomEvents - * @param {Drag} [dragHandler] - Drag handler instance. - * @param {DayGrid} [view] - daygrid view instance. - * @param {Base} [controller] - Base controller instance. - */ -function DayGridClick(dragHandler, view, controller) { - /** - * @type {Drag} - */ - this.dragHandler = dragHandler; - - /** - * @type {DayGrid} - */ - this.view = view; - - /** - * @type {Base} - */ - this.controller = controller; - - dragHandler.on({ - 'click': this._onClick - }, this); -} - -/** - * Destroy handler module - */ -DayGridClick.prototype.destroy = function() { - this.dragHandler.off(this); - this.view = this.controller = this.dragHandler = null; -}; - -/** - * Check target element is expected condition for activate this plugins. - * @param {HTMLElement} target - The element to check - * @returns {string} - model id - */ -DayGridClick.prototype.checkExpectCondition = DayGridMove.prototype.checkExpectedCondition; - -/** - * Click event handler - * @param {object} clickEvent - click event data - * @emits DayGridClick#clickSchedule - * @emits DayGridClick#collapse - * @emits DayGridClick#expand - */ -DayGridClick.prototype._onClick = function(clickEvent) { - var self = this, - target = clickEvent.target, - dayGridScheduleView = this.checkExpectCondition(target), - scheduleCollection = this.controller.schedules, - collapseBtnElement = domutil.closest( - target, - config.classname('.weekday-collapse-btn') - ), - expandBtnElement = domutil.closest( - target, - config.classname('.weekday-exceed-in-week') - ), - containsTarget = this.view.container.contains(target); - var blockElement, scheduleElement; - - if (!containsTarget) { - return; - } - - if (collapseBtnElement) { - /** - * click collpase btn event - * @events DayGridClick#collapse - */ - self.fire('collapse'); - - return; - } - - if (expandBtnElement) { - this.view.setState({ - clickedExpandBtnIndex: parseInt(domutil.getData(expandBtnElement, 'index'), 10) - }); - - /** - * click expand btn event - * @events DayGridClick#expand - */ - self.fire('expand'); - - return; - } - - if (!dayGridScheduleView) { - return; - } - - scheduleElement = domutil.closest(target, config.classname('.weekday-schedule')); - if (scheduleElement) { - blockElement = domutil.closest(target, config.classname('.weekday-schedule-block')); - scheduleCollection.doWhenHas(domutil.getData(blockElement, 'id'), function(schedule) { - /** - * @events DayGridClick#clickSchedule - * @type {object} - * @property {Schedule} schedule - schedule instance - * @property {MouseEvent} event - MouseEvent object - */ - self.fire('clickSchedule', { - schedule: schedule, - event: clickEvent.originEvent - }); - }); - } -}; - -util.CustomEvents.mixin(DayGridClick); - -module.exports = DayGridClick; - - -/***/ }), - -/***/ "./src/js/handler/daygrid/core.js": -/*!****************************************!*\ - !*** ./src/js/handler/daygrid/core.js ***! - \****************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_498051__) { - -"use strict"; -/* eslint no-shadow: 0 */ -/** - * @fileoverview Base mixin object for handler/daygrid - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_498051__(/*! tui-code-snippet */ "tui-code-snippet"); -var domutil = __nested_webpack_require_498051__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); -var domevent = __nested_webpack_require_498051__(/*! ../../common/domevent */ "./src/js/common/domevent.js"); -var common = __nested_webpack_require_498051__(/*! ../../common/common */ "./src/js/common/common.js"); -var datetime = __nested_webpack_require_498051__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); - -var mmax = Math.max, - mmin = Math.min; - -/** - * @mixin dayGridCore - */ -var dayGridCore = { - /** - * @param {view} view - view instance. - * @param {MouseEvent} mouseEvent - mouse schedule object. - * @returns {function|boolean} function that return schedule data by mouse events. - */ - _retriveScheduleData: function(view, mouseEvent) { - var weekdayView = view.children.single(), - container, - datesInRange, - containerWidth, - mousePos, - dragStartXIndex, - grids, - range; - - if (!weekdayView) { - return false; - } - - container = weekdayView.container; - range = weekdayView.getRenderDateRange(); - datesInRange = range.length; - grids = weekdayView.getRenderDateGrids(); - - containerWidth = domutil.getSize(container)[0]; - mousePos = domevent.getMousePosition(mouseEvent, container); - dragStartXIndex = getX(grids, common.ratio(containerWidth, 100, mousePos[0])); - - /** - * @param {MouseEvent} mouseEvent - mouse schedule in drag actions. - * @returns {object} schedule data. - */ - return function(mouseEvent) { - var pos = domevent.getMousePosition(mouseEvent, container), - mouseX = pos[0], - xIndex = getX(grids, common.ratio(containerWidth, 100, mouseX)); - - // apply limitation of creation schedule X index. - xIndex = mmax(xIndex, 0); - xIndex = mmin(xIndex, datesInRange - 1); - - return { - relatedView: view, - dragStartXIndex: dragStartXIndex, - datesInRange: datesInRange, - xIndex: xIndex, - triggerEvent: mouseEvent.type, - grids: grids, - range: range - }; - }; - }, - - /** - * @param {view} view - view instance. - * @param {TZDate} startDate - start date - * @returns {object} schedule data by mouse events. - */ - _retriveScheduleDataFromDate: function(view, startDate) { - var weekdayView = view.children.single(), - xIndex = 0, - datesInRange, - dragStartXIndex = 0, - grids, - range; - - if (!weekdayView) { - return false; - } - - range = weekdayView.getRenderDateRange(); - datesInRange = range.length; - grids = weekdayView.getRenderDateGrids(); - - util.forEach(range, function(date, index) { - if (datetime.isSameDate(date, startDate)) { - xIndex = dragStartXIndex = index; - } - }); - - // apply limitation of creation schedule X index. - xIndex = mmax(xIndex, 0); - xIndex = mmin(xIndex, datesInRange - 1); - - return { - relatedView: view, - dragStartXIndex: dragStartXIndex, - datesInRange: datesInRange, - xIndex: xIndex, - triggerEvent: 'manual', - grids: grids, - range: range - }; - } -}; - -/** - * Get the left index - * @param {Array} grids - grid size information - * @param {number} left - left position(percent) - * @returns {number} grid left index - */ -function getX(grids, left) { - var i = 0; - var length = grids.length; - var grid; - if (left < 0) { - left = 0; - } - - for (; i < length; i += 1) { - grid = grids[i]; - if (grid.left <= left && left <= (grid.left + grid.width)) { - return i; - } - } - - return i; -} - -module.exports = dayGridCore; - - -/***/ }), - -/***/ "./src/js/handler/daygrid/creation.js": -/*!********************************************!*\ - !*** ./src/js/handler/daygrid/creation.js ***! - \********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_502546__) { - -"use strict"; -/** - * @fileoverview Handler module for WeekdayInWeek view's creation actions. - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_502546__(/*! tui-code-snippet */ "tui-code-snippet"); -var config = __nested_webpack_require_502546__(/*! ../../config */ "./src/js/config.js"); -var datetime = __nested_webpack_require_502546__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); -var common = __nested_webpack_require_502546__(/*! ../../common/common */ "./src/js/common/common.js"); -var domutil = __nested_webpack_require_502546__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); -var domevent = __nested_webpack_require_502546__(/*! ../../common/domevent */ "./src/js/common/domevent.js"); -var dayGridCore = __nested_webpack_require_502546__(/*! ./core */ "./src/js/handler/daygrid/core.js"); -var DayGridCreationGuide = __nested_webpack_require_502546__(/*! ./creationGuide */ "./src/js/handler/daygrid/creationGuide.js"); -var TZDate = __nested_webpack_require_502546__(/*! ../../common/timezone */ "./src/js/common/timezone.js").Date; - -var CLICK_DELAY = 300; - -/** - * @constructor - * @implements {Handler} - * @mixes dayGridCore - * @mixes CutomEvents - * @param {Drag} [dragHandler] - Drag handler instance. - * @param {DayGrid} [view] - DayGrid view instance. - * @param {Base} [controller] - Base controller instance. - * @param {Options} [options] - calendar Options - */ -function DayGridCreation(dragHandler, view, controller, options) { - /** - * Drag handler instance. - * @type {Drag} - */ - this.dragHandler = dragHandler; - - /** - * view instance. - * @type {DayGrid} - */ - this.view = view; - - /** - * Base controller instance. - * @type {Base} - */ - this.controller = controller; - - /** - * @type {function} - */ - this.getScheduleDataFunc = null; - - /** - * @type {DayGridCreationGuide} - */ - this.guide = new DayGridCreationGuide(this); - - /** - * @type {boolean} - */ - this._requestOnClick = false; - - /** - * @type {boolean} - */ - this._disableDblClick = options.disableDblClick; - - /** - * @type {boolean} - */ - this._disableClick = options.disableClick; - - dragHandler.on('dragStart', this._onDragStart, this); - dragHandler.on('click', this._onClick, this); - - if (this._disableDblClick) { - CLICK_DELAY = 0; - } else { - domevent.on(view.container, 'dblclick', this._onDblClick, this); - } -} - -/** - * Destroy method - */ -DayGridCreation.prototype.destroy = function() { - this.guide.destroy(); - this.dragHandler.off(this); - - if (this.view && this.view.container) { - domevent.off(this.view.container, 'dblclick', this._onDblClick, this); - } - - this.dragHandler = this.view = this.controller = this.getScheduleDataFunc = null; -}; - -/** - * Check dragstart target is expected conditions for this handler. - * @param {HTMLElement} target - dragstart event handler's target element. - * @returns {boolean|WeekdayInWeek} return WeekdayInWeek view instance when satiate condition. - */ -DayGridCreation.prototype.checkExpectedCondition = function(target) { - var cssClass = domutil.getClass(target).trim(); - var excludeTarget = true; - var matches, schedulesElement; - - if (domutil.closest(target, config.classname('.weekday-exceed-in-week')) - || domutil.closest(target, config.classname('.weekday-collapse-btn')) - ) { - return false; - } - - if (domutil.closest(target, config.classname('.weekday-schedule-block'), excludeTarget)) { - return false; - } - - schedulesElement = domutil.closest(target, config.classname('.weekday-schedules')); - if (!schedulesElement && cssClass !== config.classname('weekday-schedules')) { - return false; - } - - target = schedulesElement ? schedulesElement.parentNode : target.parentNode; - cssClass = domutil.getClass(target); - matches = cssClass.match(config.daygrid.getViewIDRegExp); - - if (!matches || matches.length < 2) { - return false; - } - - return util.pick(this.view.children.items, matches[1]); -}; - -/** - * Request schedule model creation to controller by custom schedules. - * @fires {DayGridCreation#beforeCreateSchedule} - * @param {object} scheduleData - schedule data from DayGridCreation module. - */ -DayGridCreation.prototype._createSchedule = function(scheduleData) { - var dateRange = scheduleData.range, - startXIndex = scheduleData.dragStartXIndex, - xIndex = scheduleData.xIndex, - start, end; - - // when inverse start, end then change it. - if (xIndex < startXIndex) { - startXIndex = xIndex + startXIndex; - xIndex = startXIndex - xIndex; - startXIndex = startXIndex - xIndex; - } - - start = new TZDate(dateRange[startXIndex]); - end = datetime.end(dateRange[xIndex]); - - /** - * @event {DayGridCreation#beforeCreateSchedule} - * @type {object} - * @property {string} category - schedule category - * @property {boolean} isAllDay - whether schedule is fired in view area? - * @property {Date} start - select start time - * @property {Date} end - select end time - * @property {DayGridCreationGuide} guide - DayGridCreationGuide instance - * @property {string} triggerEventName - event name - */ - this.fire('beforeCreateSchedule', { - category: this.view.options.viewName, - isAllDay: true, - start: start, - end: end, - guide: this.guide, - triggerEventName: scheduleData.triggerEvent - }); -}; - -/** - * DragStart event handler method. - * @emits DayGridCreation#dragstart - * @param {object} dragStartEventData - Drag#dragStart event handler schedule data. - */ -DayGridCreation.prototype._onDragStart = function(dragStartEventData) { - var target = dragStartEventData.target, - result = this.checkExpectedCondition(target), - getScheduleDataFunc, - scheduleData; - - if (!result) { - return; - } - - this.dragHandler.on({ - drag: this._onDrag, - dragEnd: this._onDragEnd - }, this); - - getScheduleDataFunc = this._retriveScheduleData(this.view, dragStartEventData.originEvent); - this.getScheduleDataFunc = getScheduleDataFunc; - - scheduleData = getScheduleDataFunc(dragStartEventData.originEvent); - - /** - * @event DayGridCreation#dragstart - * @type {object} - * @property {DayGridView} relatedView - view instance. - * @property {number} datesInRange - date count of this view. - * @property {number} dragStartXIndex - index number of dragstart grid index. - * @property {number} xIndex - index number of mouse positions. - */ - this.fire('dragstart', scheduleData); -}; - -/** - * Drag event handler method. - * @emits DayGridCreation#drag - * @param {object} dragEventData - Drag#drag event handler scheduledata. - */ -DayGridCreation.prototype._onDrag = function(dragEventData) { - var getScheduleDataFunc = this.getScheduleDataFunc, - scheduleData; - - if (!getScheduleDataFunc) { - return; - } - - scheduleData = getScheduleDataFunc(dragEventData.originEvent); - - /** - * @event DayGridCreation#drag - * @type {object} - * @property {DayGridView} relatedView - view instance. - * @property {number} datesInRange - date count of this view. - * @property {number} dragStartXIndex - index number of dragstart grid index. - * @property {number} xIndex - index number of mouse positions. - */ - this.fire('drag', scheduleData); -}; - -/** - * DragEnd event hander method. - * @emits DayGridCreation#dragend - * @param {object} dragEndEventData - Drag#dragEnd event handler data. - * @param {string} [overrideEventName] - override emitted event name when supplied. - */ -DayGridCreation.prototype._onDragEnd = function(dragEndEventData, overrideEventName) { - var getScheduleDataFunc = this.getScheduleDataFunc; - var scheduleData; - - if (!getScheduleDataFunc) { - return; - } - - this.dragHandler.off({ - drag: this._onDrag, - dragEnd: this._onDragEnd - }, this); - - scheduleData = getScheduleDataFunc(dragEndEventData.originEvent); - - this._createSchedule(scheduleData); - - /** - * @event DayGridCreation#dragend - * @type {object} - * @property {DayGridView} relatedView - view instance. - * @property {number} datesInRange - date count of this view. - * @property {number} dragStartXIndex - index number of dragstart grid index. - * @property {number} xIndex - index number of mouse positions. - */ - this.fire(overrideEventName || 'dragend', scheduleData); - - this.getScheduleDataFunc = null; -}; - -/** - * Click event handler method. - * @emits DayGridCreation#click - * @param {object} clickEventData - Drag#click event handler data. - */ -DayGridCreation.prototype._onClick = function(clickEventData) { - var self = this; - var getScheduleDataFunc, scheduleData; - - if (!this.checkExpectedCondition(clickEventData.target) || this._disableClick) { - return; - } - - getScheduleDataFunc = this._retriveScheduleData(this.view, clickEventData.originEvent); - scheduleData = getScheduleDataFunc(clickEventData.originEvent); - - this._requestOnClick = true; - setTimeout(function() { - if (self._requestOnClick) { - self.fire('click', scheduleData); - self._createSchedule(scheduleData); - } - self._requestOnClick = false; - }, CLICK_DELAY); -}; - -/** - * Dblclick event handler method. - * @emits DayGridCreation#click - * @param {object} clickEventData - Drag#Click event handler data. - */ -DayGridCreation.prototype._onDblClick = function(clickEventData) { - var getScheduleDataFunc, scheduleData; - - if (!this.checkExpectedCondition(clickEventData.target)) { - return; - } - - getScheduleDataFunc = this._retriveScheduleData(this.view, clickEventData); - scheduleData = getScheduleDataFunc(clickEventData); - - this.fire('click', scheduleData); - - this._createSchedule(scheduleData); - - this._requestOnClick = false; -}; - -/** - * Invoke creation click - * @param {Schedule} schedule - schedule instance - */ -DayGridCreation.prototype.invokeCreationClick = function(schedule) { - var scheduleData = this._retriveScheduleDataFromDate(this.view, schedule.start); - - this.fire('click', scheduleData); - - this._createSchedule(scheduleData); -}; - -common.mixin(dayGridCore, DayGridCreation); -util.CustomEvents.mixin(DayGridCreation); - -module.exports = DayGridCreation; - - -/***/ }), - -/***/ "./src/js/handler/daygrid/creationGuide.js": -/*!*************************************************!*\ - !*** ./src/js/handler/daygrid/creationGuide.js ***! - \*************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_513186__) { - -"use strict"; -/** - * @fileoverview Guide element for DayGrid.Creation - * @author NHN FE Development Lab - */ - - -var config = __nested_webpack_require_513186__(/*! ../../config */ "./src/js/config.js"); -var domutil = __nested_webpack_require_513186__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); -var reqAnimFrame = __nested_webpack_require_513186__(/*! ../../common/reqAnimFrame */ "./src/js/common/reqAnimFrame.js"); - -/** - * Class for DayGrid.Creation dragging effect. - * @constructor - * @param {DayGridCreation} creation - instance of DayGridCreation. - */ -function DayGridCreationGuide(creation) { - /** - * @type {DayGridCreation} - */ - this.creation = creation; - - /** - * @type {HTMLDIVElement} - */ - this.scheduleContainer = null; - - /** - * @type {HTMLDIVElement} - */ - this.guideElement = document.createElement('div'); - - this.initializeGuideElement(); - this.applyTheme(creation.controller.theme); - - creation.on({ - dragstart: this._createGuideElement, - drag: this._onDrag, - click: this._createGuideElement - }, this); -} - -/** - * Destroy method - */ -DayGridCreationGuide.prototype.destroy = function() { - this.clearGuideElement(); - this.creation.off(this); - this.creation = this.scheduleContainer = this.guideElement = null; -}; - -/** - * initialize guide element's default style. - */ -DayGridCreationGuide.prototype.initializeGuideElement = function() { - domutil.addClass(this.guideElement, config.classname('daygrid-guide-creation-block')); -}; - -/** - * Drag event handler - * @param {object} scheduleData - schedule data from DayGrid.Creation handler. - */ -DayGridCreationGuide.prototype._onDrag = function(scheduleData) { - this._refreshGuideElement(scheduleData, true); -}; - -/** - * Get element width based on narrowWeekend - * @param {number} dragStartIndex - grid start index - * @param {number} dragEndIndex - grid end index - * @param {Array} grids - dates information - * @returns {number} element width - */ -DayGridCreationGuide.prototype._getGuideWidth = function(dragStartIndex, dragEndIndex, grids) { - var width = 0; - var i = dragStartIndex; - for (; i <= dragEndIndex; i += 1) { - width += grids[i] ? grids[i].width : 0; - } - - return width; -}; - -/** - * Refresh guide element. - * @param {object} scheduleData - schedule data from DayGrid.Creation handler. - * @param {boolean} defer - If set to true, set style in the next frame - */ -DayGridCreationGuide.prototype._refreshGuideElement = function(scheduleData, defer) { - var guideElement = this.guideElement, - data = scheduleData, - dragStartXIndex = data.dragStartXIndex < data.xIndex ? data.dragStartXIndex : data.xIndex, - dragEndXIndex = data.dragStartXIndex < data.xIndex ? data.xIndex : data.dragStartXIndex, - leftPercent, - widthPercent; - - leftPercent = data.grids[dragStartXIndex] ? data.grids[dragStartXIndex].left : 0; - widthPercent = this._getGuideWidth(dragStartXIndex, dragEndXIndex, data.grids); - - /** eslint-disable require-jsdoc */ - function setStyle() { - guideElement.style.display = 'block'; - guideElement.style.left = leftPercent + '%'; - guideElement.style.width = widthPercent + '%'; - } - - if (defer) { - reqAnimFrame.requestAnimFrame(setStyle); - } else { - setStyle(); - } -}; - -/** - * Clear guide element. - */ -DayGridCreationGuide.prototype.clearGuideElement = function() { - var guideElement = this.guideElement; - - domutil.remove(guideElement); - - guideElement.style.display = 'none'; - guideElement.style.left = ''; - guideElement.style.width = ''; -}; - -/** - * Create guide element - * @param {object} dragStartEventData - schedule data object of DayGrid.Creation. - */ -DayGridCreationGuide.prototype._createGuideElement = function(dragStartEventData) { - var creation = this.creation, - view = creation.view, - container = view.container, - scheduleContainer = domutil.find(config.classname('.weekday-grid'), container); - - scheduleContainer.appendChild(this.guideElement); - this._refreshGuideElement(dragStartEventData); -}; - -/** - * Drag event handler. - * @param {object} dragEventData - event data object of DayGrid.Creation. - */ -DayGridCreationGuide.prototype._onDrag = function(dragEventData) { - this._refreshGuideElement(dragEventData); -}; - -DayGridCreationGuide.prototype.applyTheme = function(theme) { - var style = this.guideElement.style; - - style.backgroundColor = theme.common.creationGuide.backgroundColor; - style.border = theme.common.creationGuide.border; -}; - -module.exports = DayGridCreationGuide; - - -/***/ }), - -/***/ "./src/js/handler/daygrid/move.js": -/*!****************************************!*\ - !*** ./src/js/handler/daygrid/move.js ***! - \****************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_518075__) { - -"use strict"; -/** - * @fileoverview Move handler for DayGrid view. - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_518075__(/*! tui-code-snippet */ "tui-code-snippet"); -var config = __nested_webpack_require_518075__(/*! ../../config */ "./src/js/config.js"); -var common = __nested_webpack_require_518075__(/*! ../../common/common */ "./src/js/common/common.js"); -var domutil = __nested_webpack_require_518075__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); -var dayGridCore = __nested_webpack_require_518075__(/*! ./core */ "./src/js/handler/daygrid/core.js"); -var DayGridMoveGuide = __nested_webpack_require_518075__(/*! ./moveGuide */ "./src/js/handler/daygrid/moveGuide.js"); -var TZDate = __nested_webpack_require_518075__(/*! ../../common/timezone */ "./src/js/common/timezone.js").Date; - -/** - * @constructor - * @implements {Handler} - * @mixes dayGridCore - * @mixes CustomEvents - * @param {Drag} dragHandler - Drag handler instance. - * @param {DayGrid} view - view instance. - * @param {Base} controller - Base controller instance. - */ -function DayGridMove(dragHandler, view, controller) { - /** - * Drag handler instance. - * @type {Drag} - */ - this.dragHandler = dragHandler; - - /** - * view instance. - * @type {DayGrid} - */ - this.view = view; - - /** - * Base controller instance. - * @type {Base} - */ - this.controller = controller; - - /** - * Temporary variable for dragstart event data. - * @type {object} - */ - this._dragStart = null; - - dragHandler.on({ - dragStart: this._onDragStart - }, this); - - /** - * @type {DayGridMoveGuide} - */ - this.guide = new DayGridMoveGuide(this); -} - -DayGridMove.prototype.destroy = function() { - this.guide.destroy(); - this.dragHandler.off(this); - this.dragHandler = this.view = this.controller = - this.guide = this._dragStart = null; -}; - -/** - * Check dragstart target is expected conditions for this handler. - * @param {HTMLElement} target - dragstart event handler's target element. - * @returns {boolean|DayGridSchedule} return DayGridSchedule view instance when satiate condition. - */ -DayGridMove.prototype.checkExpectedCondition = function(target) { - var cssClass = domutil.getClass(target), - parentView, - matches; - - if (~cssClass.indexOf(config.classname('weekday-resize-handle'))) { - return false; - } - - parentView = domutil.closest(target, config.classname('.weekday')); - - if (!parentView) { - return false; - } - - cssClass = domutil.getClass(parentView); - matches = cssClass.match(config.daygrid.getViewIDRegExp); - - if (!matches || matches.length < 2) { - return false; - } - - return util.pick(this.view.children.items, matches[1]); -}; - -/** - * DragStart event handler method. - * @emits DayGridMove#dragstart - * @param {object} dragStartEventData - Drag#dragStart event handler event data. - */ -DayGridMove.prototype._onDragStart = function(dragStartEventData) { - var target = dragStartEventData.target, - result = this.checkExpectedCondition(target), - controller = this.controller, - excludeTarget = true, - scheduleBlockElement, - modelID, - targetModel, - getScheduleDataFunc, - scheduleData; - - if (!result) { - return; - } - - scheduleBlockElement = domutil.closest(target, config.classname('.weekday-schedule-block'), excludeTarget); - if (!scheduleBlockElement) { - return; - } - - modelID = domutil.getData(scheduleBlockElement, 'id'); - targetModel = controller.schedules.items[modelID]; - - if (!targetModel) { - return; - } - - if (targetModel.isReadOnly) { - return; - } - - getScheduleDataFunc = this._retriveScheduleData(this.view, dragStartEventData.originEvent); - this.getScheduleDataFunc = getScheduleDataFunc; - scheduleData = this._dragStart = getScheduleDataFunc(dragStartEventData.originEvent); - - util.extend(scheduleData, { - scheduleBlockElement: scheduleBlockElement, - model: targetModel - }); - - this.dragHandler.on({ - drag: this._onDrag, - dragEnd: this._onDragEnd, - click: this._onClick - }, this); - - /** - * @event DayGridMove#dragstart - * @type {object} - * @property {DayGrid} relatedView - view instance. - * @property {number} datesInRange - date count of this view. - * @property {number} dragStartXIndex - index number of dragstart grid index. - * @property {number} xIndex - index number of mouse positions. - * @property {Schedule} model - data object of model isntance. - * @property {HTMLDivElement} scheduleBlockElement - target schedule block element. - */ - this.fire('dragstart', scheduleData); -}; - -/** - * Drag event handler method. - * @emits DayGridMove#drag - * @param {object} dragEventData - Drag#drag event handler eventdata. - */ -DayGridMove.prototype._onDrag = function(dragEventData) { - var getScheduleDataFunc = this.getScheduleDataFunc; - - if (!getScheduleDataFunc) { - return; - } - - /** - * @schedule DayGridMove#drag - * @type {object} - * @property {DayGrid} relatedView - view instance. - * @property {number} datesInRange - date count of this view. - * @property {number} dragStartXIndex - index number of dragstart grid index. - * @property {number} xIndex - index number of mouse positions. - */ - this.fire('drag', getScheduleDataFunc(dragEventData.originEvent)); -}; - -/** - * Request update schedule model to base controller. - * @fires DayGridMove#beforeUpdateSchedule - * @param {object} scheduleData - schedule data from DayGridMove handler module. - */ -DayGridMove.prototype._updateSchedule = function(scheduleData) { - var schedule = scheduleData.targetModel, - dateOffset = scheduleData.xIndex - scheduleData.dragStartXIndex, - newStarts = new TZDate(schedule.start), - newEnds = new TZDate(schedule.end); - - newStarts = newStarts.addDate(dateOffset); - newEnds = newEnds.addDate(dateOffset); - - /** - * @event DayGridMove#beforeUpdateSchedule - * @type {object} - * @property {Schedule} schedule - The original schedule instance - * @property {Date} start - Deprecated: start time to update - * @property {Date} end - Deprecated: end time to update - * @property {object} changes - start and end time to update - * @property {Date} start - start time to update - * @property {Date} end - end time to update - */ - this.fire('beforeUpdateSchedule', { - schedule: schedule, - changes: { - start: newStarts, - end: newEnds - }, - start: newStarts, - end: newEnds - }); -}; - -/** - * DragEnd event hander method. - * @emits DayGridMove#dragend - * @param {object} dragEndEventData - Drag#DragEnd event handler data. - * @param {string} [overrideEventName] - override emitted event name when supplied. - * @param {?boolean} skipUpdate - true then skip update schedule model. - */ -DayGridMove.prototype._onDragEnd = function(dragEndEventData, overrideEventName, skipUpdate) { - var getScheduleDataFunc = this.getScheduleDataFunc, - dragStart = this._dragStart, - scheduleData; - - if (!getScheduleDataFunc || !dragStart) { - return; - } - - this.dragHandler.off({ - drag: this._onDrag, - dragEnd: this._onDragEnd, - click: this._onClick - }, this); - - scheduleData = getScheduleDataFunc(dragEndEventData.originEvent); - util.extend(scheduleData, { - targetModel: dragStart.model - }); - - if (!skipUpdate) { - this._updateSchedule(scheduleData); - } - - /** - * @event DayGridMove#dragend - * @type {object} - * @property {DayGrid} relatedView - view instance. - * @property {number} datesInRange - date count of this view. - * @property {number} dragStartXIndex - index number of dragstart grid index. - * @property {number} xIndex - index number of mouse positions. - */ - this.fire(overrideEventName || 'dragend', scheduleData); - - this.getScheduleDataFunc = this._dragStart = null; -}; - -/** - * Click event handler method. - * @emits DayGridMove#click - * @param {object} clickEventData - Drag#Click event handler data. - */ -DayGridMove.prototype._onClick = function(clickEventData) { - /** - * @event DayGridMove#click - * @type {object} - * @property {DayGrid} relatedView - view instance. - * @property {number} datesInRange - date count of this view. - * @property {number} dragStartXIndex - index number of dragstart grid index. - * @property {number} xIndex - index number of mouse positions. - */ - this._onDragEnd(clickEventData, 'click', true); -}; - -common.mixin(dayGridCore, DayGridMove); -util.CustomEvents.mixin(DayGridMove); - -module.exports = DayGridMove; - - -/***/ }), - -/***/ "./src/js/handler/daygrid/moveGuide.js": -/*!*********************************************!*\ - !*** ./src/js/handler/daygrid/moveGuide.js ***! - \*********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_527097__) { - -"use strict"; -/* WEBPACK VAR INJECTION */(function(global) {/** - * @fileoverview Effect module for DayGrid.Move - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_527097__(/*! tui-code-snippet */ "tui-code-snippet"); -var config = __nested_webpack_require_527097__(/*! ../../config */ "./src/js/config.js"); -var datetime = __nested_webpack_require_527097__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); -var domutil = __nested_webpack_require_527097__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); -var reqAnimFrame = __nested_webpack_require_527097__(/*! ../../common/reqAnimFrame */ "./src/js/common/reqAnimFrame.js"); - -/** - * Class for DayGrid.Move dragging effect. - * @constructor - * @param {DayGridMove} daygridMove - instance of DayGridMove. - */ -function DayGridMoveGuide(daygridMove) { - /** - * @type {DayGridMove} - */ - this.daygridMove = daygridMove; - - /** - * The element that actually contains the event element - * @type {HTMLDIVElement} - */ - this.scheduleContainer = null; - - /** - * @type {number} - */ - this._dragStartXIndex = null; - - /** - * @type {HTMLDIVElement} - */ - this.guideElement = null; - - /** - * @type {HTMLElement[]} - */ - this.elements = null; - - daygridMove.on({ - 'dragstart': this._onDragStart, - 'drag': this._onDrag, - 'dragend': this._clearGuideElement, - 'click': this._clearGuideElement - }, this); -} - -/** - * Destroy method - */ -DayGridMoveGuide.prototype.destroy = function() { - this._clearGuideElement(); - this.daygridMove.off(this); - this.daygridMove = this.scheduleContainer = this._dragStartXIndex = - this.elements = this.guideElement = null; -}; - -/** - * Clear guide element. - */ -DayGridMoveGuide.prototype._clearGuideElement = function() { - this._showOriginScheduleBlocks(); - - domutil.remove(this.guideElement); - - if (!util.browser.msie) { - domutil.removeClass(global.document.body, config.classname('dragging')); - } - - this._dragStartXIndex = this.getScheduleDataFunc = this.guideElement = null; -}; - -/** - * Dim element blocks - * @param {number} modelID - Schedule model instance ID - */ -DayGridMoveGuide.prototype._hideOriginScheduleBlocks = function(modelID) { - var className = config.classname('weekday-schedule-block-dragging-dim'); - var scheduleBlocks = domutil.find( - config.classname('.weekday-schedule-block'), - this.daygridMove.view.container, - true - ); - - this.elements = util.filter(scheduleBlocks, function(schedule) { - return domutil.getData(schedule, 'id') === modelID; - }); - - util.forEach(this.elements, function(el) { - domutil.addClass(el, className); - }); -}; - -/** - * Show element blocks - */ -DayGridMoveGuide.prototype._showOriginScheduleBlocks = function() { - var className = config.classname('weekday-schedule-block-dragging-dim'); - - util.forEach(this.elements, function(el) { - domutil.removeClass(el, className); - }); -}; - -/** - * Highlight element blocks - * @param {Schedule} model - model - * @param {HTMLElement} parent - parent element - */ -DayGridMoveGuide.prototype._highlightScheduleBlocks = function(model, parent) { - var elements = domutil.find(config.classname('.weekday-schedule'), parent, true); - - util.forEach(elements, function(el) { - el.style.margin = '0'; - - if (!model.isFocused) { - el.style.backgroundColor = model.dragBgColor; - el.style.borderLeftColor = model.borderColor; - el.style.color = '#ffffff'; - } - }); -}; - -/** - * Refresh guide element. - * @param {number} leftPercent - left percent of guide element. - * @param {number} widthPercent - width percent of guide element. - * @param {boolean} isExceededLeft - schedule start is faster then render start date? - * @param {boolean} isExceededRight - schedule end is later then render end date? - */ -DayGridMoveGuide.prototype.refreshGuideElement = function(leftPercent, widthPercent, isExceededLeft, isExceededRight) { - var guideElement = this.guideElement; - - reqAnimFrame.requestAnimFrame(function() { - guideElement.style.left = leftPercent + '%'; - guideElement.style.width = widthPercent + '%'; - - if (isExceededLeft) { - domutil.addClass(guideElement, config.classname('weekday-exceed-left')); - } else { - domutil.removeClass(guideElement, config.classname('weekday-exceed-left')); - } - - if (isExceededRight) { - domutil.addClass(guideElement, config.classname('weekday-exceed-right')); - } else { - domutil.removeClass(guideElement, config.classname('weekday-exceed-right')); - } - }); -}; - -/** - * Get schedule block information from schedule data. - * - * For example, there is single schedule has 10 length. but render range in view is 5 then - * rendered block must be cut out to render properly. in this case, this method return - * how many block are cut before rendering. - * - * @param {object} dragStartEventData - schedule data from DayGrid.Move handler. - * @returns {function} function that return schedule block information. - */ -DayGridMoveGuide.prototype._getScheduleBlockDataFunc = function(dragStartEventData) { - var model = dragStartEventData.model, - datesInRange = dragStartEventData.datesInRange, - range = dragStartEventData.range, - baseWidthPercent = (100 / datesInRange), - originScheduleStarts = datetime.start(model.start), - originScheduleEnds = datetime.end(model.end), - renderStartDate = datetime.start(range[0]), - renderEndDate = datetime.end(range[range.length - 1]), - fromLeft = Math.ceil((originScheduleStarts.getTime() - - renderStartDate.getTime()) / datetime.MILLISECONDS_PER_DAY) || 0, - fromRight = Math.ceil((originScheduleEnds.getTime() - - renderEndDate.getTime()) / datetime.MILLISECONDS_PER_DAY) || 0; - - return function(indexOffset) { - return { - baseWidthPercent: baseWidthPercent, - fromLeft: fromLeft + indexOffset, - fromRight: fromRight + indexOffset - }; - }; -}; - -/** - * DragStart event handler. - * @param {object} dragStartEventData - schedule data. - */ -DayGridMoveGuide.prototype._onDragStart = function(dragStartEventData) { - var container = this.daygridMove.view.container, - guideElement = this.guideElement = dragStartEventData.scheduleBlockElement.cloneNode(true), - scheduleContainer; - - if (!util.browser.msie) { - domutil.addClass(global.document.body, config.classname('dragging')); - } - - this._hideOriginScheduleBlocks(String(dragStartEventData.model.cid())); - - scheduleContainer = domutil.find(config.classname('.weekday-schedules'), container); - domutil.appendHTMLElement('div', guideElement, config.classname('weekday-schedule-cover')); - scheduleContainer.appendChild(guideElement); - - this._dragStartXIndex = dragStartEventData.xIndex; - this.getScheduleDataFunc = this._getScheduleBlockDataFunc(dragStartEventData); - - this._highlightScheduleBlocks(dragStartEventData.model, guideElement); -}; - -/** - * Drag event handler. - * @param {object} dragEventData - schedule data. - */ -DayGridMoveGuide.prototype._onDrag = function(dragEventData) { - var getScheduleDataFunc = this.getScheduleDataFunc, - dragStartXIndex = this._dragStartXIndex, - datesInRange = dragEventData.datesInRange, - grids = dragEventData.grids, - scheduleData, - isExceededLeft, - isExceededRight, - originLength, - leftIndex, - size, - newLeft, - newWidth; - - if (!getScheduleDataFunc) { - return; - } - - scheduleData = getScheduleDataFunc(dragEventData.xIndex - dragStartXIndex); - isExceededLeft = scheduleData.fromLeft < 0; - isExceededRight = scheduleData.fromRight > 0; - - leftIndex = Math.max(0, scheduleData.fromLeft); - originLength = (scheduleData.fromLeft * -1) + (datesInRange + scheduleData.fromRight); - size = isExceededLeft ? (originLength + scheduleData.fromLeft) : originLength; - size = isExceededRight ? (size - scheduleData.fromRight) : size; - - newLeft = grids[leftIndex] ? grids[leftIndex].left : 0; - newWidth = getScheduleBlockWidth(leftIndex, size, grids); - - this.refreshGuideElement(newLeft, newWidth, isExceededLeft, isExceededRight); -}; - -/** - * Get schedule width based on grids - * @param {number} left - left index - * @param {number} size - schedule width - * @param {Array} grids - dates information - * @returns {number} element width - */ -function getScheduleBlockWidth(left, size, grids) { - var width = 0; - var i = 0; - var length = grids.length; - for (; i < size; i += 1) { - left = (left + i) % length; - if (left < length) { - width += grids[left] ? grids[left].width : 0; - } - } - - return width; -} - -module.exports = DayGridMoveGuide; - -/* WEBPACK VAR INJECTION */}.call(this, __nested_webpack_require_527097__(/*! ./../../../../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) - -/***/ }), - -/***/ "./src/js/handler/daygrid/resize.js": -/*!******************************************!*\ - !*** ./src/js/handler/daygrid/resize.js ***! - \******************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_536448__) { - -"use strict"; -/** - * @fileoverview Resize handler module for DayGrid view. - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_536448__(/*! tui-code-snippet */ "tui-code-snippet"); -var config = __nested_webpack_require_536448__(/*! ../../config */ "./src/js/config.js"); -var datetime = __nested_webpack_require_536448__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); -var domutil = __nested_webpack_require_536448__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); -var common = __nested_webpack_require_536448__(/*! ../../common/common */ "./src/js/common/common.js"); -var dayGridCore = __nested_webpack_require_536448__(/*! ./core */ "./src/js/handler/daygrid/core.js"); -var DayGridResizeGuide = __nested_webpack_require_536448__(/*! ./resizeGuide */ "./src/js/handler/daygrid/resizeGuide.js"); -var TZDate = __nested_webpack_require_536448__(/*! ../../common/timezone */ "./src/js/common/timezone.js").Date; - -/** - * @constructor - * @implements {Handler} - * @mixes dayGridCore - * @mixes CustomEvents - * @param {Drag} [dragHandler] - Drag handler instance. - * @param {DayGrid} [view] - view instance. - * @param {Base} [controller] - Base controller instance. - */ -function DayGridResize(dragHandler, view, controller) { - /** - * Drag handler instance. - * @type {Drag} - */ - this.dragHandler = dragHandler; - - /** - * view instance. - * @type {DayGrid} - */ - this.view = view; - - /** - * Base controller instance. - * @type {Base} - */ - this.controller = controller; - - /** - * Temporary variable for dragStart event data. - * @type {object} - */ - this._dragStart = null; - - dragHandler.on({ - dragStart: this._onDragStart - }, this); - - /** - * @type {DayGridResizeGuide} - */ - this.guide = new DayGridResizeGuide(this); -} - -/** - * Destroy method - */ -DayGridResize.prototype.destroy = function() { - this.guide.destroy(); - this.dragHandler.off(this); - this.dragHandler = this.view = this.controller = - this.guide = this._dragStart = null; -}; - -/** - * Check dragstart target is expected conditions for this handler. - * @param {HTMLElement} target - dragstart event handler's target element. - * @returns {boolean|WeekdayInWeek} return WeekdayInWeek view instance when satiate condition. - */ -DayGridResize.prototype.checkExpectedCondition = function(target) { - var cssClass = domutil.getClass(target), - matches; - - if (!~cssClass.indexOf(config.classname('weekday-resize-handle'))) { - return false; - } - - target = domutil.closest(target, config.classname('.weekday')); - - if (!target) { - return false; - } - - cssClass = domutil.getClass(target); - matches = cssClass.match(config.daygrid.getViewIDRegExp); - - if (!matches || matches.length < 2) { - return false; - } - - return util.pick(this.view.children.items, matches[1]); -}; - -/** - * DragStart event handler. - * @emits DayGridResize#dragstart - * @param {object} dragStartEventData - schedule data. - */ -DayGridResize.prototype._onDragStart = function(dragStartEventData) { - var target = dragStartEventData.target, - result = this.checkExpectedCondition(target), - controller = this.controller, - scheduleBlockElement, - modelID, - targetModel, - getScheduleDataFunc, - scheduleData; - - if (!result) { - return; - } - - scheduleBlockElement = domutil.closest(target, config.classname('.weekday-schedule-block')); - modelID = domutil.getData(scheduleBlockElement, 'id'); - targetModel = controller.schedules.items[modelID]; - - if (!targetModel) { - return; - } - - getScheduleDataFunc = this._retriveScheduleData(this.view, dragStartEventData.originEvent); - this.getScheduleDataFunc = getScheduleDataFunc; - scheduleData = this._dragStart = getScheduleDataFunc(dragStartEventData.originEvent); - - util.extend(scheduleData, { - scheduleBlockElement: scheduleBlockElement, - model: targetModel - }); - - this.dragHandler.on({ - drag: this._onDrag, - dragEnd: this._onDragEnd, - click: this._onClick - }, this); - - /** - * @event DayGridResize#dragstart - * @type {object} - * @property {View} relatedView - view instance. - * @property {number} datesInRange - date count of this view. - * @property {number} dragStartXIndex - index number of dragstart grid index. - * @property {number} xIndex - index number of mouse positions. - * @property {Schedule} model - data object of model isntance. - * @property {HTMLDivElement} scheduleBlockElement - target schedule block element. - */ - this.fire('dragstart', scheduleData); -}; - -/** - * Drag event handler method. - * @emits DayGridResize#drag - * @param {object} dragEventData - Drag#drag event handler scheduledata. - */ -DayGridResize.prototype._onDrag = function(dragEventData) { - var getScheduleDataFunc = this.getScheduleDataFunc; - - if (!getScheduleDataFunc) { - return; - } - - /** - * @event DayGridResize#drag - * @type {object} - * @property {View} relatedView - view instance. - * @property {number} datesInRange - date count of this view. - * @property {number} dragStartXIndex - index number of dragstart grid index. - * @property {number} xIndex - index number of mouse positions. - */ - this.fire('drag', getScheduleDataFunc(dragEventData.originEvent)); -}; - -/** - * Request update schedule instance to base controller. - * @fires DayGridResize#beforeUpdateSchedule - * @param {object} scheduleData - schedule data from DayGridResize handler. - */ -DayGridResize.prototype._updateSchedule = function(scheduleData) { - var schedule = scheduleData.targetModel, - dateOffset = scheduleData.xIndex - scheduleData.dragStartXIndex, - newEnds = new TZDate(schedule.end); - var changes; - - newEnds = newEnds.addDate(dateOffset); - newEnds = new TZDate(common.maxDate(datetime.end(schedule.start), newEnds)); - - changes = common.getScheduleChanges( - schedule, - ['end'], - {end: newEnds} - ); - - /** - * @event DayGridResize#beforeUpdateSchedule - * @type {object} - * @property {Schedule} schedule - The original schedule instance - * @property {Date} start - Deprecated: start time to update - * @property {Date} end - Deprecated: end time to update - * @property {object} changes - end time to update - * @property {date} end - end time to update - */ - this.fire('beforeUpdateSchedule', { - schedule: schedule, - changes: changes, - start: schedule.getStarts(), - end: newEnds - }); -}; - -/** - * DragEnd event hander method. - * @emits DayGridResize#dragend - * @param {object} dragEndEventData - Drag#DragEnd event handler data. - * @param {string} [overrideEventName] - override emitted event name when supplied. - * @param {?boolean} skipUpdate - true then skip update schedule model. - */ -DayGridResize.prototype._onDragEnd = function(dragEndEventData, overrideEventName, skipUpdate) { - var getScheduleDataFunc = this.getScheduleDataFunc, - dragStart = this._dragStart, - scheduleData; - - if (!getScheduleDataFunc || !dragStart) { - return; - } - - this.dragHandler.off({ - drag: this._onDrag, - dragEnd: this._onDragEnd, - click: this._onClick - }, this); - - scheduleData = getScheduleDataFunc(dragEndEventData.originEvent); - util.extend(scheduleData, { - targetModel: dragStart.model - }); - - if (!skipUpdate) { - this._updateSchedule(scheduleData); - } - - /** - * @event DayGridResize#dragend - * @type {object} - * @property {View} relatedView - view instance. - * @property {number} datesInRange - date count of this view. - * @property {number} dragStartXIndex - index number of dragstart grid index. - * @property {number} xIndex - index number of mouse positions. - */ - this.fire(overrideEventName || 'dragend', scheduleData); - - this.getScheduleDataFunc = this._dragStart = null; -}; - -/** - * Click event handler method. - * @emits DayGridResize#click - * @param {object} clickEventData - Drag#Click event handler data. - */ -DayGridResize.prototype._onClick = function(clickEventData) { - /** - * @event DayGridResize#click - * @type {object} - * @property {View} relatedView - view instance. - * @property {number} datesInRange - date count of this view. - * @property {number} dragStartXIndex - index number of dragstart grid index. - * @property {number} xIndex - index number of mouse positions. - */ - this._onDragEnd(clickEventData, 'click', true); -}; - -common.mixin(dayGridCore, DayGridResize); -util.CustomEvents.mixin(DayGridResize); - -module.exports = DayGridResize; - - -/***/ }), - -/***/ "./src/js/handler/daygrid/resizeGuide.js": -/*!***********************************************!*\ - !*** ./src/js/handler/daygrid/resizeGuide.js ***! - \***********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_545425__) { - -"use strict"; -/* WEBPACK VAR INJECTION */(function(global) {/** - * @fileoverview Resize Guide module. - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_545425__(/*! tui-code-snippet */ "tui-code-snippet"); -var config = __nested_webpack_require_545425__(/*! ../../config */ "./src/js/config.js"); -var domutil = __nested_webpack_require_545425__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); -var datetime = __nested_webpack_require_545425__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); -var reqAnimFrame = __nested_webpack_require_545425__(/*! ../../common/reqAnimFrame */ "./src/js/common/reqAnimFrame.js"); - -/** - * @constructor - * @param {DayGridResize} resizeHandler - instance of DayGridResize - */ -function DayGridResizeGuide(resizeHandler) { - /** - * @type {DayGridResize} - */ - this.resizeHandler = resizeHandler; - - /** - * The element that actually contains the event element - * @type {HTMLDIVElement} - */ - this.scheduleContainer = null; - - /** - * @type {function} - */ - this.getScheduleDataFunc = null; - - /** - * @type {HTMLDIVElement} - */ - this.guideElement = null; - - /** - * @type {HTMLDIVElement} - */ - this.scheduleBlockElement = null; - - resizeHandler.on({ - 'dragstart': this._onDragStart, - 'drag': this._onDrag, - 'dragend': this._clearGuideElement, - 'click': this._clearGuideElement - }, this); -} - -/** - * Destroy method - */ -DayGridResizeGuide.prototype.destroy = function() { - this._clearGuideElement(); - this.resizeHandler.off(this); - this.resizeHandler = this.scheduleContainer = this.getScheduleDataFunc = - this.guideElement = this.scheduleBlockElement = null; -}; - -/** - * Clear guide element. - */ -DayGridResizeGuide.prototype._clearGuideElement = function() { - domutil.remove(this.guideElement); - - if (!util.browser.msie) { - domutil.removeClass(global.document.body, config.classname('resizing-x')); - } - - if (this.scheduleBlockElement) { - domutil.removeClass(this.scheduleBlockElement, config.classname('weekday-schedule-block-dragging-dim')); - } - - this.getScheduleDataFunc = null; -}; - -/** - * Refresh guide element - * @param {number} newWidth - new width percentage value to resize guide element. - */ -DayGridResizeGuide.prototype.refreshGuideElement = function(newWidth) { - var guideElement = this.guideElement; - - reqAnimFrame.requestAnimFrame(function() { - guideElement.style.width = newWidth + '%'; - }); -}; - -/** - * Return function that calculate guide element's new width percentage value. - * @param {object} dragStartEventData - dragstart schedule data. - * @returns {function} return function that calculate guide element new width percentage. - */ -DayGridResizeGuide.prototype.getGuideElementWidthFunc = function(dragStartEventData) { - var model = dragStartEventData.model, - viewOptions = this.resizeHandler.view.options, - fromLeft = Math.ceil( - (model.start - viewOptions.renderStartDate) / datetime.MILLISECONDS_PER_DAY - ) || 0, - grids = dragStartEventData.grids; - - return function(xIndex) { - var width = 0; - var i = 0; - var length = grids.length; - width += grids[fromLeft] ? grids[fromLeft].width : 0; - - for (; i < length; i += 1) { - if (i > fromLeft && i <= xIndex) { - width += grids[i] ? grids[i].width : 0; - } - } - - return width; - }; -}; - -/** - * DragStart event handler. - * @param {object} dragStartEventData - schedule data. - */ -DayGridResizeGuide.prototype._onDragStart = function(dragStartEventData) { - var container = this.resizeHandler.view.container, - scheduleBlockElement = this.scheduleBlockElement = dragStartEventData.scheduleBlockElement, - guideElement = this.guideElement = scheduleBlockElement.cloneNode(true), - scheduleContainer; - - if (!util.browser.msie) { - domutil.addClass(global.document.body, config.classname('resizing-x')); - } - - scheduleContainer = domutil.find(config.classname('.weekday-schedules'), container); - domutil.addClass(guideElement, config.classname('daygrid-guide-move')); - domutil.addClass(scheduleBlockElement, config.classname('weekday-schedule-block-dragging-dim')); - - scheduleContainer.appendChild(guideElement); - - this.getScheduleDataFunc = this.getGuideElementWidthFunc(dragStartEventData); -}; - -/** - * Drag event handler. - * @param {object} dragEventData - schedule data. - */ -DayGridResizeGuide.prototype._onDrag = function(dragEventData) { - var func = this.getScheduleDataFunc; - - if (!func) { - return; - } - - this.refreshGuideElement(func(dragEventData.xIndex)); -}; - -module.exports = DayGridResizeGuide; - -/* WEBPACK VAR INJECTION */}.call(this, __nested_webpack_require_545425__(/*! ./../../../../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) - -/***/ }), - -/***/ "./src/js/handler/drag.js": -/*!********************************!*\ - !*** ./src/js/handler/drag.js ***! - \********************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_550581__) { - -"use strict"; -/* WEBPACK VAR INJECTION */(function(global) {/** - * @fileoverview Drag handler for calendar. - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_550581__(/*! tui-code-snippet */ "tui-code-snippet"); -var domutil = __nested_webpack_require_550581__(/*! ../common/domutil */ "./src/js/common/domutil.js"); -var domevent = __nested_webpack_require_550581__(/*! ../common/domevent */ "./src/js/common/domevent.js"); -var config = __nested_webpack_require_550581__(/*! ../config */ "./src/js/config.js"); - -/** - * @constructor - * @mixes CustomEvents - * @param {object} options - options for drag handler - * @param {number} [options.distance=10] - distance in pixels after mouse must move before dragging should start - * @param {function} [options.exclude] - filter function for don't fire drag events that specific conditions. - * @param {HTMLElement} container element to watching drag interaction. - */ -function Drag(options, container) { - domevent.on(container, 'mousedown', this._onMouseDown, this); - - this.options = util.extend({ - distance: 10, - exclude: null - }, options); - - /** - * @type {HTMLElement} - */ - this.container = container; - - /** - * Flag for represent current dragging session has been cancelled for exclude option. - * @type {boolean} - */ - this._cancelled = false; - - /** - * @type {boolean} - */ - this._isMoved = false; - - /** - * dragging distance in pixel between mousedown and firing dragStart events - * @type {number} - */ - this._distance = 0; - - /** - * @type {boolean} - */ - this._dragStartFired = false; - - /** - * @type {object} - */ - this._dragStartEventData = null; -} - -/** - * Destroy method. - */ -Drag.prototype.destroy = function() { - domevent.off(this.container, 'mousedown', this._onMouseDown, this); - this._isMoved = null; - this.container = null; -}; - -/** - * Clear cache data for single dragging session. - */ -Drag.prototype._clearData = function() { - this._cancelled = false; - this._distance = 0; - this._isMoved = false; - this._dragStartFired = false; - this._dragStartEventData = null; -}; - -/** - * Toggle events for mouse dragging. - * @param {boolean} toBind - bind events related with dragging when supplied "true" - */ -Drag.prototype._toggleDragEvent = function(toBind) { - var container = this.container, - domMethod, - method; - - if (toBind) { - domMethod = 'on'; - method = 'disable'; - } else { - domMethod = 'off'; - method = 'enable'; - } - - domutil[method + 'TextSelection'](container, preventDefaultWhenNotPopup); - domutil[method + 'ImageDrag'](container, preventDefaultWhenNotPopup); - domevent[domMethod](global.document, { - mousemove: this._onMouseMove, - mouseup: this._onMouseUp - }, this); -}; - -/** - * Normalize mouse event object. - * @param {MouseEvent} mouseEvent - mouse event object. - * @returns {object} normalized mouse event data. - */ -Drag.prototype._getEventData = function(mouseEvent) { - return { - target: domevent.getEventTarget(mouseEvent), - originEvent: mouseEvent - }; -}; - -/** - * MouseDown DOM event handler. - * @param {MouseEvent} mouseDownEvent MouseDown event object. - */ -Drag.prototype._onMouseDown = function(mouseDownEvent) { - var opt = this.options, - target = domevent.getEventTarget(mouseDownEvent); - - // only primary button can start drag. - if (domevent.getMouseButton(mouseDownEvent) !== 0) { - return; - } - - if (opt.exclude && opt.exclude(target)) { - this._cancelled = true; - - return; - } - - this._clearData(); - this._dragStartEventData = this._getEventData(mouseDownEvent); - - this._toggleDragEvent(true); - - /** - * mousedown event for firefox bug. cancelable. - * @event Drag#mouseDown - * @type {object} - * @property {HTMLElement} target - target element in this event. - * @property {MouseEvent} originEvent - original mouse event object. - */ - this.fire('mousedown', this._dragStartEventData); -}; - -/** - * MouseMove DOM event handler. - * @emits Drag#drag - * @emits Drag#dragStart - * @param {MouseEvent} mouseMoveEvent MouseMove event object. - */ -Drag.prototype._onMouseMove = function(mouseMoveEvent) { - var distance; - - if (this._cancelled) { - this._clearData(); - - return; - } - - distance = this.options.distance; - // prevent automatic scrolling. - preventDefaultWhenNotPopup(mouseMoveEvent); - - if (this._distance < distance) { - this._distance += 1; - - return; - } - this._isMoved = true; - - if (!this._dragStartFired) { - this._dragStartFired = true; - - /** - * Drag start events. cancelable. - * @event Drag#dragStart - * @type {object} - * @property {HTMLElement} target - target element in this event. - * @property {MouseEvent} originEvent - original mouse event object. - */ - if (!this.invoke('dragStart', this._dragStartEventData)) { - this._toggleDragEvent(false); - this._clearData(); - - return; - } - } - - /** - * CalEvents while dragging. - * @event Drag#drag - * @type {object} - * @property {HTMLElement} target - target element in this event. - * @property {MouseEvent} originEvent - original mouse event object. - */ - this.fire('drag', this._getEventData(mouseMoveEvent)); -}; - -/** - * MouseUp DOM event handler. - * @param {MouseEvent} mouseUpEvent MouseUp event object. - * @emits Drag#dragEnd - * @emits Drag#click - */ -Drag.prototype._onMouseUp = function(mouseUpEvent) { - if (this._cancelled) { - return; - } - - this._toggleDragEvent(false); - - // emit "click" event when not emitted drag event between mousedown and mouseup. - if (this._isMoved) { - this._isMoved = false; - /** - * Drag end events. - * @event Drag#dragEnd - * @type {MouseEvent} - * @property {HTMLElement} target - target element in this event. - * @property {MouseEvent} originEvent - original mouse event object. - */ - this.fire('dragEnd', this._getEventData(mouseUpEvent)); - } else { - /** - * Click events. - * @event Drag#click - * @type {MouseEvent} - * @property {HTMLElement} target - target element in this event. - * @property {MouseEvent} originEvent - original mouse event object. - */ - this.fire('click', this._getEventData(mouseUpEvent)); - } - - this._clearData(); -}; - -/** - * If the target is not a popup, it prevents the default. - * @method - * @param {MouseEvent} event - Mouse event object - */ -function preventDefaultWhenNotPopup(event) { - var popup = domutil.closest(event.target, config.classname('.popup')); - - if (!popup) { - domevent.preventDefault(event); - } -} - -util.CustomEvents.mixin(Drag); - -module.exports = Drag; - -/* WEBPACK VAR INJECTION */}.call(this, __nested_webpack_require_550581__(/*! ./../../../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) - -/***/ }), - -/***/ "./src/js/handler/month/click.js": -/*!***************************************!*\ - !*** ./src/js/handler/month/click.js ***! - \***************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_557924__) { - -"use strict"; -/** - * @fileoverview Click handler for month view - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_557924__(/*! tui-code-snippet */ "tui-code-snippet"); -var config = __nested_webpack_require_557924__(/*! ../../config */ "./src/js/config.js"), - datetime = __nested_webpack_require_557924__(/*! ../../common/datetime */ "./src/js/common/datetime.js"), - domutil = __nested_webpack_require_557924__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); - -/** - * @constructor - * @implements {Handler} - * @mixes util.CustomEvents - * @param {Drag} [dragHandler] - Drag handler instance. - * @param {Month} [monthView] - Month view instance. - * @param {Base} [baseController] - Base controller instance. - */ -function MonthClick(dragHandler, monthView, baseController) { - /** - * @type {Drag} - */ - this.dragHandler = dragHandler; - - /** - * @type {Month} - */ - this.monthView = monthView; - - /** - * @type {Base} - */ - this.baseController = baseController; - - dragHandler.on({ - 'click': this._onClick - }, this); -} - -/** - * Destructor - */ -MonthClick.prototype.destroy = function() { - this.dragHandler.off(this); - this.monthView = this.baseController = this.dragHandler = null; -}; - -/** - * @fires MonthClick#clickMore - * @param {object} clickEvent - click event object - */ -MonthClick.prototype._onClick = function(clickEvent) { - var self = this, - moreElement, - scheduleCollection = this.baseController.schedules, - blockElement = domutil.closest(clickEvent.target, config.classname('.weekday-schedule-block')) - || domutil.closest(clickEvent.target, config.classname('.month-more-schedule')); - - moreElement = domutil.closest( - clickEvent.target, - config.classname('.weekday-exceed-in-month') - ); - - if (moreElement) { - self.fire('clickMore', { - date: datetime.parse(domutil.getData(moreElement, 'ymd')), - target: moreElement, - ymd: domutil.getData(moreElement, 'ymd') - }); - } - - if (blockElement) { - scheduleCollection.doWhenHas(domutil.getData(blockElement, 'id'), function(schedule) { - /** - * @events AlldayClick#clickSchedule - * @type {object} - * @property {Schedule} schedule - schedule instance - * @property {MouseEvent} event - MouseEvent object - */ - self.fire('clickSchedule', { - schedule: schedule, - event: clickEvent.originEvent - }); - }); - } -}; - -util.CustomEvents.mixin(MonthClick); - -module.exports = MonthClick; - - -/***/ }), - -/***/ "./src/js/handler/month/core.js": -/*!**************************************!*\ - !*** ./src/js/handler/month/core.js ***! - \**************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_560831__) { - -"use strict"; -/* eslint-disable complexity */ -/** - * @fileoverview Module for calculate date by month view and mouse event object - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_560831__(/*! tui-code-snippet */ "tui-code-snippet"); -var common = __nested_webpack_require_560831__(/*! ../../common/common */ "./src/js/common/common.js"), - domutil = __nested_webpack_require_560831__(/*! ../../common/domutil */ "./src/js/common/domutil.js"), - domevent = __nested_webpack_require_560831__(/*! ../../common/domevent */ "./src/js/common/domevent.js"), - datetime = __nested_webpack_require_560831__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); -var mfloor = Math.floor; - -/** - * Get high order function that can calc date in mouse point - * @param {Month} monthView - month view - * @returns {function} function return event data by mouse event object - */ -function getMousePosDate(monthView) { - var weekColl = monthView.children, - weeks = weekColl.sort(function(a, b) { - return util.stamp(a) - util.stamp(b); - }), - weekCount = weekColl.length, - days = weekColl.single().getRenderDateRange(), - dayCount = days.length, - relativeContainer = util.pick(monthView.vLayout.panels[1], 'container'), - size = domutil.getSize(relativeContainer), - grids = monthView.grids; - - /** - * Get the left index - * @param {number} left - left position(percent) - * @returns {number} grid left index - */ - function getX(left) { - var i = 0; - var length = grids.length; - var grid; - for (; i < length; i += 1) { - grid = grids[i]; - if (grid.left <= left && left <= (grid.left + grid.width)) { - return i; - } - } - - return left < 0 ? -1 : i; - } - - /** - * Get date related with mouse event object - * @param {object} mouseEvent - click event data - * @returns {object} data related with mouse event - */ - function getDate(mouseEvent) { - var pos = domevent.getMousePosition(mouseEvent, relativeContainer), - x = getX(common.ratio(size[0], 100, pos[0])), - y = mfloor(common.ratio(size[1], weekCount, pos[1])), - weekdayView, - date, - dateRange; - - if (y < 0) { - y = 0; - } - if (y >= weeks.length) { - y = weeks.length - 1; - } - - weekdayView = util.pick(weeks, y); - - if (!weekdayView) { - return null; - } - - dateRange = weekdayView.getRenderDateRange(); - if (x < 0) { - x = 0; - } - if (x >= dateRange.length) { - x = dateRange.length - 1; - } - - date = util.pick(dateRange, x); - - if (!date) { - return null; - } - - return { - x: x, - y: y, - sizeX: dayCount, - sizeY: weekCount, - date: datetime.end(date), - weekdayView: weekdayView, - triggerEvent: mouseEvent.type - }; - } - - return getDate; -} - -module.exports = getMousePosDate; - - -/***/ }), - -/***/ "./src/js/handler/month/creation.js": -/*!******************************************!*\ - !*** ./src/js/handler/month/creation.js ***! - \******************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_564216__) { - -"use strict"; -/** - * @fileoverview Creation handler for month view - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_564216__(/*! tui-code-snippet */ "tui-code-snippet"); - -var config = __nested_webpack_require_564216__(/*! ../../config */ "./src/js/config.js"); -var datetime = __nested_webpack_require_564216__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); -var array = __nested_webpack_require_564216__(/*! ../../common/array */ "./src/js/common/array.js"); -var domutil = __nested_webpack_require_564216__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); -var domevent = __nested_webpack_require_564216__(/*! ../../common/domevent */ "./src/js/common/domevent.js"); -var getMousePosDate = __nested_webpack_require_564216__(/*! ./core */ "./src/js/handler/month/core.js"); -var Guide = __nested_webpack_require_564216__(/*! ./creationGuide */ "./src/js/handler/month/creationGuide.js"); -var TZDate = __nested_webpack_require_564216__(/*! ../../common/timezone */ "./src/js/common/timezone.js").Date; - -var CLICK_DELAY = 300; - -/** - * @constructor - * @param {Drag} dragHandler - Drag handler instance. - * @param {Month} monthView - Month view instance. - * @param {Base} baseController - Base controller instance. - * @param {Options} [options] - calendar Options - */ -function MonthCreation(dragHandler, monthView, baseController, options) { - /** - * @type {Drag} - */ - this.dragHandler = dragHandler; - - /** - * @type {Month} - */ - this.monthView = monthView; - - /** - * @type {Base} - */ - this.baseController = baseController; - - /** - * @type {function} - */ - this.getScheduleData = null; - - /** - * Cache for dragging session - * @type {object} - */ - this._cache = null; - - /** - * @type {MonthCreationGuide} - */ - this.guide = new Guide(this); - - /** - * @type {boolean} - */ - this._requestOnClick = false; - - /** - * @type {boolean} - */ - this._disableDblClick = options.disableDblClick; - - /** - * @type {boolean} - */ - this._disableClick = options.disableClick; - - dragHandler.on('dragStart', this._onDragStart, this); - dragHandler.on('click', this._onClick, this); - - if (this._disableDblClick) { - CLICK_DELAY = 0; - } else { - domevent.on(monthView.container, 'dblclick', this._onDblClick, this); - } -} - -/** - * Destructor - */ -MonthCreation.prototype.destroy = function() { - this.dragHandler.off(this); - this.guide.destroy(); - - if (this.monthView && this.monthView.container) { - domevent.off(this.monthView.container, 'dblclick', this._onDblClick, this); - } - - this.dragHandler = this.monthView = this.baseController = - this.getScheduleData = this._cache = this.guide = null; -}; - -/** - * Fire before create schedule - * @fires {MonthCreation#beforeCreateSchedule} - * @param {object} eventData - cache data from single dragging session - */ -MonthCreation.prototype._createSchedule = function(eventData) { - /** - * @event {MonthCreation#beforeCreateSchedule} - * @type {object} - * @property {boolean} isAllDay - whether schedule is fired in allday view area? - * @property {Date} start - select start time - * @property {Date} end - select end time - * @property {TimeCreationGuide} guide - TimeCreationGuide instance - * @property {string} triggerEventName - event name - */ - this.fire('beforeCreateSchedule', { - isAllDay: eventData.isAllDay, - start: eventData.start, - end: eventData.end, - guide: this.guide.guide, - triggerEventName: eventData.triggerEvent - }); -}; - -/** - * DragStart event handler - * @fires {MonthCreation#monthCreationDragstart} - * @param {object} dragStartEvent - dragStart event data - */ -MonthCreation.prototype._onDragStart = function(dragStartEvent) { - var eventData; - - if (!isElementWeekdayGrid(dragStartEvent.target)) { - return; - } - - this.dragHandler.on({ - drag: this._onDrag, - dragEnd: this._onDragEnd - }, this); - - this.getScheduleData = getMousePosDate(this.monthView); - - eventData = this.getScheduleData(dragStartEvent.originEvent); - - this._cache = { - start: new TZDate(eventData.date) - }; - - /** - * @event {MonthCreation#monthCreationDragstart} - * @type {object} - * @property {number} x - x index - * @property {number} y - y index - * @property {Date} date - drag date - */ - this.fire('monthCreationDragstart', eventData); -}; - -/** - * Drag event handler - * @fires {MonthCreation#monthCreationDrag} - * @param {object} dragEvent - drag event data - */ -MonthCreation.prototype._onDrag = function(dragEvent) { - var eventData; - - if (!this.getScheduleData) { - return; - } - - eventData = this.getScheduleData(dragEvent.originEvent); - - if (!eventData) { - return; - } - - /** - * @event {MonthCreation#monthCreationDrag} - * @type {object} - * @property {number} x - x index - * @property {number} y - y index - * @property {Date} date - drag date - */ - this.fire('monthCreationDrag', eventData); -}; - -/** - * DragEnd event handler - * @fires {MonthCreation#monthCreationDragend} - * @param {object} dragEndEvent - drag end event data - */ -MonthCreation.prototype._onDragEnd = function(dragEndEvent) { - var cache = this._cache; - var eventData; - var times; - - this.dragHandler.off({ - drag: this._onDrag, - dragEnd: this._onDragEnd - }, this); - - if (!this.getScheduleData) { - return; - } - - eventData = this.getScheduleData(dragEndEvent.originEvent); - - if (eventData) { - cache.end = new TZDate(eventData.date); - cache.isAllDay = true; - - times = [ - cache.start, - cache.end - ].sort(array.compare.num.asc); - - cache.start = new TZDate(times[0]); - cache.end = datetime.end(times[1]); - - this._createSchedule(cache); - } - - /** - * @event {MonthCreation#monthCreationDragend} - * @type {object} - * @property {number} x - x index - * @property {number} y - y index - * @property {Date} date - drag date - */ - this.fire('monthCreationDragend', eventData); - - this.getScheduleData = this._cache = null; -}; - -/** - * Dblclick event handler - * @fires {MonthCreation#monthCreationDragstart} - * @param {MouseEvent} e - Native MouseEvent - */ -MonthCreation.prototype._onDblClick = function(e) { - var eventData, range; - - if (!isElementWeekdayGrid(e.target)) { - return; - } - - eventData = getMousePosDate(this.monthView)(e); - - this.fire('monthCreationClick', eventData); - - range = this._adjustStartAndEndTime(new TZDate(eventData.date), new TZDate(eventData.date)); - - this._createSchedule({ - start: range.start, - end: range.end, - isAllDay: false, - triggerEvent: eventData.triggerEvent - }); - - this._requestOnClick = false; -}; - -/** - * Click event handler - * @fires {MonthCreation#monthCreationDragstart} - * @param {MouseEvent} e - Native MouseEvent - */ -MonthCreation.prototype._onClick = function(e) { - var self = this; - var eventData, range; - - if (!isElementWeekdayGrid(e.target) || this._disableClick) { - return; - } - - eventData = getMousePosDate(this.monthView)(e.originEvent); - - this._requestOnClick = true; - setTimeout(function() { - if (self._requestOnClick) { - self.fire('monthCreationClick', eventData); - - range = self._adjustStartAndEndTime(new TZDate(eventData.date), new TZDate(eventData.date)); - - self._createSchedule({ - start: range.start, - end: range.end, - isAllDay: false, - triggerEvent: eventData.triggerEvent - }); - } - self._requestOnClick = false; - }, CLICK_DELAY); -}; - -/** - * Adjust time to our o'clock - * @param {TZDate} start - start time - * @param {TZDate} end - end time - * @returns {Object} start and end - */ -MonthCreation.prototype._adjustStartAndEndTime = function(start, end) { - var now = new TZDate(); - var hours = now.getHours(); - var minutes = now.getMinutes(); - - // adjust start to less time. Adjusting had been greater time in monthly view when clicking grid - if (minutes <= 30) { - minutes = 0; - } else { - minutes = 30; - } - start.setHours(hours, minutes, 0, 0); - end.setHours(hours + 1, minutes, 0, 0); - - return { - start: start, - end: end - }; -}; - -/** - * Invoke creation click - * @param {Schedule} schedule - schedule instance - */ -MonthCreation.prototype.invokeCreationClick = function(schedule) { - var eventData = { - model: schedule - }; - - this.fire('monthCreationClick', eventData); - - this._createSchedule({ - start: schedule.start, - end: schedule.end, - isAllDay: schedule.isAllDay, - triggerEvent: 'manual' - }); -}; - -/** - * Returns whether the given element is Weekday-Schedule. - * @param {HTMLElement} el - target element - * @returns {boolean} - */ -function isElementWeekdayGrid(el) { - return domutil.closest(el, config.classname('.weekday-grid')) - && !domutil.closest(el, config.classname('.weekday-exceed-in-month')); -} - -util.CustomEvents.mixin(MonthCreation); - -module.exports = MonthCreation; - - -/***/ }), - -/***/ "./src/js/handler/month/creationGuide.js": -/*!***********************************************!*\ - !*** ./src/js/handler/month/creationGuide.js ***! - \***********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_573715__) { - -"use strict"; -/** - * @fileoverview Creation guide module for month view - * @author NHN FE Development Lab - */ - - -var MonthGuide = __nested_webpack_require_573715__(/*! ./guide */ "./src/js/handler/month/guide.js"); - -/** - * @constructor - * @param {MonthCreation} monthCreation - instance of MonthCreation - */ -function MonthCreationGuide(monthCreation) { - /** - * @type {MonthCreation} - */ - this.monthCreation = monthCreation; - - /** - * @type {MonthGuide} - */ - this.guide = null; - - monthCreation.on({ - monthCreationDragstart: this._createGuideElement, - monthCreationDrag: this._onDrag, - monthCreationDragend: this._onDragEnd, - monthCreationClick: this._createGuideElement - }, this); -} - -/** - * Destructor - */ -MonthCreationGuide.prototype.destroy = function() { - this.monthCreation.off(this); - - if (this.guide) { - this.guide.destroy(); - } - - this.guide = this.monthCreation = null; -}; - -/** - * Drag start event handler - * @param {object} dragStartEvent - schedule data from MonthCreation - */ -MonthCreationGuide.prototype._createGuideElement = function(dragStartEvent) { - var options = { - isCreationMode: true, - height: '100%', - top: 0 - }; - - this.guide = new MonthGuide(options, this.monthCreation.monthView); - this.guide.start(dragStartEvent); -}; - -/** - * Drag event handler - * @param {object} dragEvent - schedule data from MonthCreation - */ -MonthCreationGuide.prototype._onDrag = function(dragEvent) { - this.guide.update(dragEvent.x, dragEvent.y); -}; - -/** - * Drag end event handler - */ -MonthCreationGuide.prototype._onDragEnd = function() { - // Do nothing. User calls destroy directly. - this.guide = null; -}; - -module.exports = MonthCreationGuide; - - -/***/ }), - -/***/ "./src/js/handler/month/guide.hbs": -/*!****************************************!*\ - !*** ./src/js/handler/month/guide.hbs ***! - \****************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_575767__) { - -var Handlebars = __nested_webpack_require_575767__(/*! ./node_modules/handlebars/runtime.js */ "./node_modules/handlebars/runtime.js"); -module.exports = (Handlebars['default'] || Handlebars).template({"1":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=container.escapeExpression, alias2=container.lambda, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
\n"; -},"3":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
\n
\n" - + ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"isAllDay") : depth0),{"name":"if","hash":{},"fn":container.program(4, data, 0),"inverse":container.program(6, data, 0),"data":data,"loc":{"start":{"line":9,"column":12},"end":{"line":13,"column":19}}})) != null ? stack1 : "") - + "
\n
 
\n
\n"; -},"4":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " " - + ((stack1 = (lookupProperty(helpers,"allday-tmpl")||(depth0 && lookupProperty(depth0,"allday-tmpl"))||container.hooks.helperMissing).call(depth0 != null ? depth0 : (container.nullContext || {}),depth0,{"name":"allday-tmpl","hash":{},"data":data,"loc":{"start":{"line":10,"column":16},"end":{"line":10,"column":38}}})) != null ? stack1 : "") - + "\n"; -},"6":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " " - + ((stack1 = (lookupProperty(helpers,"time-tmpl")||(depth0 && lookupProperty(depth0,"time-tmpl"))||container.hooks.helperMissing).call(depth0 != null ? depth0 : (container.nullContext || {}),depth0,{"name":"time-tmpl","hash":{},"data":data,"loc":{"start":{"line":12,"column":16},"end":{"line":12,"column":36}}})) != null ? stack1 : "") - + "\n"; -},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
\n" - + ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"isCreationMode") : depth0),{"name":"if","hash":{},"fn":container.program(1, data, 0),"inverse":container.program(3, data, 0),"data":data,"loc":{"start":{"line":2,"column":4},"end":{"line":17,"column":11}}})) != null ? stack1 : "") - + "
\n"; -},"useData":true}); - -/***/ }), - -/***/ "./src/js/handler/month/guide.js": -/*!***************************************!*\ - !*** ./src/js/handler/month/guide.js ***! - \***************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_585250__) { - -"use strict"; -/** - * @fileoverview Guide element controller for creation, resize in month view - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_585250__(/*! tui-code-snippet */ "tui-code-snippet"); -var config = __nested_webpack_require_585250__(/*! ../../config */ "./src/js/config.js"), - domutil = __nested_webpack_require_585250__(/*! ../../common/domutil */ "./src/js/common/domutil.js"), - datetime = __nested_webpack_require_585250__(/*! ../../common/datetime */ "./src/js/common/datetime.js"), - TZDate = __nested_webpack_require_585250__(/*! ../../common/timezone */ "./src/js/common/timezone.js").Date, - tmpl = __nested_webpack_require_585250__(/*! ./guide.hbs */ "./src/js/handler/month/guide.hbs"); -var mmax = Math.max, - mmin = Math.min, - mabs = Math.abs, - mfloor = Math.floor; - -/** - * @constructor - * @param {object} [options] - options - * @param {boolean} [options.useHandle=false] - whether displaying resize handle on - * guide element? - * @param {boolean} [options.isResizeMode=false] - whether resize mode? - * @param {Month} monthView - Month view instance - */ -function MonthGuide(options, monthView) { - /** - * @type {object} - */ - this.options = util.extend({ - top: 0, - height: '20px', - bgColor: '#f7ca88', - label: 'New event', - isResizeMode: false, - isCreationMode: false, - styles: this._getStyles(monthView.controller.theme) - }, options); - - /** - * @type {Month} - */ - this.view = monthView; - - /** - * @type {WeekdayInMonth[]} - */ - this.weeks = monthView.children.sort(function(a, b) { - return util.stamp(a) - util.stamp(b); - }); - - /** - * @type {number} - */ - this.days = monthView.children.single().getRenderDateRange().length; - - /** - * start coordinate of guide effect. (x, y) (days, weeks) effect can't - * start lower than this coordinate. - * @type {number[]} - */ - this.startCoord = [0, 0]; - - /** - * @type {Object.} - */ - this.guideElements = {}; - - /** - * horizontal grid information - * @type {Object} - */ - this.grids = monthView.grids; -} - -/** - * Destructor - */ -MonthGuide.prototype.destroy = function() { - this.clear(); - - this.options = this.view = this.weeks = this.days = - this.startCoord = this.guideElements = null; -}; - -MonthGuide.prototype.clearGuideElement = function() { - this.destroy(); -}; - -/** - * Get ratio value in week. - * @param {number} value - value for calc ratio in week - * @returns {number} percent value - */ -MonthGuide.prototype._getRatioValueInWeek = function(value) { - var grid = this.grids[value] || {left: 100}; - - return grid.left; -}; - -/** - * Create guide element - * @returns {HTMLElement} guide element - */ -MonthGuide.prototype._createGuideElement = function() { - var guide = document.createElement('div'); - - guide.innerHTML = tmpl(this.options); - - return guide.firstChild; -}; - -/** - * Get guide element. if not exist then create one - * @param {number} y - y coordinate - * @returns {?HTMLElement} guide element - */ -MonthGuide.prototype._getGuideElement = function(y) { - var guideElements = this.guideElements, - guide = guideElements[y], - weekdayView = this.weeks[y], - container; - - if (!weekdayView) { - return null; - } - - if (!guide) { - guide = this._createGuideElement(); - container = weekdayView.container; - container.appendChild(guide); - guideElements[y] = guide; - } - - return guide; -}; - -/** - * Get coordinate by supplied date in month - * @param {TZDate} date - date to find coordinate - * @returns {number[]} coordinate (x, y) - */ -MonthGuide.prototype._getCoordByDate = function(date) { - var WEEKEND_DAYS = 2; - var weeks = this.weeks; - var isWorkWeek = util.pick(this.view, 'options', 'workweek'); - var days = isWorkWeek ? this.days + WEEKEND_DAYS : this.days; - - var getIdxFromDiff = function(d1, d2) { - return mfloor(datetime.millisecondsTo('day', mabs(d2 - d1))); - }, - monthStart = datetime.start(weeks[0].options.renderStartDate), - isBefore = date < monthStart, - start = new TZDate(monthStart), - end = new TZDate(monthStart).addDate(isBefore ? -days : days).addDate(-1), - x = getIdxFromDiff(date, start), - y = 0; - - while (!datetime.isBetweenWithDate(date, start, end)) { - start.addDate(isBefore ? -days : days); - end = new TZDate(start).addDate(days - 1); - x = getIdxFromDiff(date, start); - y += (isBefore ? -1 : 1); - } - - return [x, y]; -}; - -/** - * Get limited coordinate by supplied coordinates - * @param {number[]} coord - coordinate need to limit - * @param {number[]} [min] - minimum limitation of coordinate - * @param {number[]} [max] - maximum limitation of coordinate - * @returns {number[]} limited coordiate - */ -MonthGuide.prototype._getLimitedCoord = function(coord, min, max) { - var toIndex = 1, - x = coord[0], - y = coord[1], - result; - - min = min || [0, 0]; - max = max || [this.days - toIndex, this.weeks.length - toIndex]; - - if (y < min[1]) { - result = min.slice(0); - } else if (y > max[1]) { - result = max.slice(0); - } else { - x = mmax(min[0], x); - x = mmin(max[0], x); - result = [x, y]; - } - - return result; -}; - -/** - * Prepare guide element modification - * @param {object} dragStartEvent - dragStart schedule data from *guide - */ -MonthGuide.prototype.start = function(dragStartEvent) { - var opt = this.options, - target = dragStartEvent.target, - model = dragStartEvent.model, - x = dragStartEvent.x, - y = dragStartEvent.y, - renderMonth = new TZDate(this.view.options.renderMonth), - temp; - - if (opt.isCreationMode) { - if (model && !datetime.isSameMonth(renderMonth, model.start)) { - model.start.setMonth(renderMonth.getMonth()); - model.start.setDate(1); - model.end.setMonth(renderMonth.getMonth()); - model.end.setDate(1); - } - } else { - temp = this._getCoordByDate(model.getStarts()); - x = temp[0]; - y = temp[1]; - - util.extend(this.options, { - top: parseInt(target.style.top, 10) + 'px', - height: parseInt(target.style.height, 10) + 'px', - label: model.title - }, model); - } - - if (util.isUndefined(x) || util.isUndefined(y)) { - temp = this._getCoordByDate(model.getStarts()); - x = temp[0]; - y = temp[1]; - } - - this.startCoord = [x, y]; - this.update(x, y); -}; - -/** - * Data for update several guide elements - * @typedef UpdateIndication - * @type {object} - * @property {HTMLElement} guide - guide element - * @property {number} left - left style value - * @property {number} width - width style value - * @property {boolean} [exceedL=false] - whether schedule is exceeded past weeks? - * @property {boolean} [exceedR=false] - whether schedule is exceeded future weeks? - */ - -/** - * Modify HTML element that uses for guide element - * @param {UpdateIndication[]} inds - indication of update severel guide element - */ -MonthGuide.prototype._updateGuides = function(inds) { - util.forEach(inds, function(ind) { - var guide = ind.guide, - exceedLClass = config.classname('month-exceed-left'), - exceedRClass = config.classname('month-exceed-right'); - - guide.style.display = 'block'; - guide.style.left = ind.left + '%'; - guide.style.width = ind.width + '%'; - - if (ind.exceedL) { - domutil.addClass(guide, exceedLClass); - } else { - domutil.removeClass(guide, exceedLClass); - } - - if (ind.exceedR) { - domutil.addClass(guide, exceedRClass); - } else { - domutil.removeClass(guide, exceedRClass); - } - }); -}; - -/** - * Get guide element indicate for origin week - * @param {number[]} startCoord - drag start coordinate - * @param {number[]} mouseCoord - mouse coordinate - * @returns {object} indicate - */ -MonthGuide.prototype._getOriginIndicate = function(startCoord, mouseCoord) { - var left = mmin(startCoord[0], mouseCoord[0]), - right = mmax(startCoord[0], mouseCoord[0]) + 1, - exceedL, exceedR; - - if (mouseCoord[1] > startCoord[1]) { - left = startCoord[0]; - right = this.days; - exceedR = true; - } else if (mouseCoord[1] < startCoord[1]) { - left = 0; - right = startCoord[0] + 1; - exceedL = true; - } - - return { - left: this._getRatioValueInWeek(left), - width: this._getRatioValueInWeek(right) - - this._getRatioValueInWeek(left), - exceedL: exceedL, - exceedR: exceedR - }; -}; - -/** - * Get guide element indicate for week related with mouse position - * @param {number[]} startCoord - drag start coordinate - * @param {number[]} mouseCoord - mouse coordinate - * @returns {object} indicate - */ -MonthGuide.prototype._getMouseIndicate = function(startCoord, mouseCoord) { - var left = mouseCoord[0], - right = mouseCoord[0] + 1, - exceedL, exceedR; - - if (mouseCoord[1] > startCoord[1]) { - left = 0; - exceedL = true; - } else if (mouseCoord[1] < startCoord[1]) { - right = this.days; - exceedR = true; - } - - return { - left: this._getRatioValueInWeek(left), - width: this._getRatioValueInWeek(right) - - this._getRatioValueInWeek(left), - exceedL: exceedL, - exceedR: exceedR - }; -}; - -/** - * Get guide element indicate for contained weeks - * @returns {object} indicate - */ -MonthGuide.prototype._getContainIndicate = function() { - return { - left: 0, - width: 100, - exceedL: true, - exceedR: true - }; -}; - -/** - * Remove several guide element that supplied by parameter - * @param {number[]} yCoords - array of y coordinate to remove guide element - */ -MonthGuide.prototype._removeGuideElements = function(yCoords) { - var guides = this.guideElements; - - util.forEach(yCoords, function(y) { - domutil.remove(guides[y]); - delete guides[y]; - }); -}; - -/** - * Get excluded numbers in range - * @param {number[]} range - the range. value must be sequential. - * @param {number[]} numbers - numbers to check - * @returns {number[]} excluded numbers - */ -MonthGuide.prototype._getExcludesInRange = function(range, numbers) { - var min = mmin.apply(null, range), - max = mmax.apply(null, range), - excludes = []; - - util.forEach(numbers, function(num) { - num = parseInt(num, 10); - if (num < min || num > max) { - excludes.push(num); - } - }); - - return excludes; -}; - -/** - * Update guide elements by coordinate in month grid from mousemove event - * @param {number} x - x coordinate - * @param {number} y - y coordinate - */ -MonthGuide.prototype.update = function(x, y) { - var self = this, - startCoord = this.startCoord, - mouseCoord = [x, y], - limitedCoord = this.options.isResizeMode ? - this._getLimitedCoord(mouseCoord, startCoord) : mouseCoord, - renderedYIndex = util.keys(this.guideElements), - yCoordsToUpdate = util.range( - mmin(startCoord[1], limitedCoord[1]), - mmax(startCoord[1], limitedCoord[1]) + 1 - ), - yCoordsToRemove = this._getExcludesInRange( - yCoordsToUpdate, - renderedYIndex - ), - renderIndication = {}; - - this._removeGuideElements(yCoordsToRemove); - - util.forEach(yCoordsToUpdate, function(guideYCoord) { - var guide = self._getGuideElement(guideYCoord), - indicate; - - if (!guide) { - return; - } - - if (guideYCoord === startCoord[1]) { - indicate = self._getOriginIndicate(startCoord, limitedCoord); - } else if (guideYCoord === mouseCoord[1]) { - indicate = self._getMouseIndicate(startCoord, mouseCoord); - } else { - indicate = self._getContainIndicate(); - } - - renderIndication[guideYCoord] = util.extend({ - guide: guide - }, indicate); - }); - - this._updateGuides(renderIndication); -}; - -/** - * Clear all guide elements - */ -MonthGuide.prototype.clear = function() { - util.forEach(this.guideElements, function(element) { - domutil.remove(element); - }); - - this.guideElements = {}; -}; - -/** - * Get the styles from theme - * @param {Theme} theme - theme instance - * @returns {object} styles - styles object - */ -MonthGuide.prototype._getStyles = function(theme) { - var styles = {}; - - if (theme) { - styles.border = theme.common.creationGuide.border; - styles.backgroundColor = theme.common.creationGuide.backgroundColor; - styles.scheduleHeight = theme.month.schedule.height; - styles.scheduleGutter = theme.month.schedule.marginTop; - styles.marginLeft = theme.month.schedule.marginLeft; - styles.marginRight = theme.month.schedule.marginRight; - styles.borderRadius = theme.month.schedule.borderRadius; - } - - return styles; -}; - -module.exports = MonthGuide; - - -/***/ }), - -/***/ "./src/js/handler/month/move.js": -/*!**************************************!*\ - !*** ./src/js/handler/month/move.js ***! - \**************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_598625__) { - -"use strict"; -/** - * @fileoverview Move handler for month view - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_598625__(/*! tui-code-snippet */ "tui-code-snippet"); - -var config = __nested_webpack_require_598625__(/*! ../../config */ "./src/js/config.js"), - domutil = __nested_webpack_require_598625__(/*! ../../common/domutil */ "./src/js/common/domutil.js"), - datetime = __nested_webpack_require_598625__(/*! ../../common/datetime */ "./src/js/common/datetime.js"), - getMousePosData = __nested_webpack_require_598625__(/*! ./core */ "./src/js/handler/month/core.js"), - MonthMoveGuide = __nested_webpack_require_598625__(/*! ./moveGuide */ "./src/js/handler/month/moveGuide.js"), - TZDate = __nested_webpack_require_598625__(/*! ../../common/timezone */ "./src/js/common/timezone.js").Date; - -/** - * @constructor - * @mixes CustomEvents - * @param {Drag} dragHandler - Drag handler instance. - * @param {Month} monthView - Month view instance. - * @param {Base} baseController - Base controller instance. - */ -function MonthMove(dragHandler, monthView, baseController) { - /** - * @type {Drag} - */ - this.dragHandler = dragHandler; - - /** - * @type {Month} - */ - this.monthView = monthView; - - /** - * @type {Base} - */ - this.baseController = baseController; - - /** - * @type {function} - */ - this.getScheduleData = null; - - /** - * @type {object} - */ - this._cache = null; - - /** - * @type {MonthMoveGuide} - */ - this.guide = new MonthMoveGuide(this); - - dragHandler.on('dragStart', this._onDragStart, this); -} - -/** - * Destructor - */ -MonthMove.prototype.destroy = function() { - this.dragHandler.off(this); - - this.dragHandler = this.monthView = this.baseController = null; -}; - -/** - * Update target schedule - * @fires {MonthMove#beforeUpdateSchedule} - * @param {object} scheduleCache - cache object that result of single dragging - * session. - */ -MonthMove.prototype.updateSchedule = function(scheduleCache) { - var schedule = scheduleCache.model; - var duration = schedule.duration(); - var startDateRaw = datetime.raw(schedule.start); - var dragEndTime = new TZDate(scheduleCache.end); - var newStartDate = new TZDate(dragEndTime); - - newStartDate.setHours(startDateRaw.h, startDateRaw.m, startDateRaw.s, startDateRaw.ms); - - /** - * @event MonthMove#beforeUpdateSchedule - * @type {object} - * @property {Schedule} schedule - The original schedule instance - * @property {Date} start - Deprecated: start time to update - * @property {Date} end - Deprecated: end time to update - * @property {object} changes - start and end time to update - * @property {Date} start - start time to update - * @property {Date} end - end time to update - */ - this.fire('beforeUpdateSchedule', { - schedule: schedule, - changes: { - start: newStartDate, - end: new TZDate(newStartDate).addMilliseconds(duration) - }, - start: newStartDate, - end: new TZDate(newStartDate).addMilliseconds(duration) - }); -}; - -/** - * Get schedule block to clone for month guide effect - * @param {HTMLElement} target - target element that related with drag schedule - * @returns {HTMLElement} element to create guide effect - */ -MonthMove.prototype.getMonthScheduleBlock = function(target) { - var blockSelector = config.classname('.weekday-schedule-block'); - - return domutil.closest(target, blockSelector); -}; - -/** - * Get schedule block from more layer - * @param {HTMLElement} target - element to check - * @returns {HTMLElement} schedule element - */ -MonthMove.prototype.getMoreLayerScheduleBlock = function(target) { - var className = config.classname('.month-more-schedule'); - - return domutil.closest(target, className); -}; - -/** - * Check handler has permission to handle fired schedule - * @fires {MonthMove#monthMoveStart_from_morelayer} - * @param {HTMLElement} target - target element of fired schedule - * @returns {(string|null)} model instance ID related with schedule. if handle - * has not permission to handle the schedule then return null. - */ -MonthMove.prototype.hasPermissionToHandle = function(target) { - var modelID = null; - var blockElement; - - if (domutil.hasClass(target, config.classname('weekday-resize-handle'))) { - return null; - } - - blockElement = this.getMonthScheduleBlock(target); - - if (blockElement) { - modelID = domutil.getData(blockElement, 'id'); - } else { - blockElement = this.getMoreLayerScheduleBlock(target); - - if (blockElement) { - modelID = domutil.getData(blockElement, 'id'); - /** - * Fire for notificate that the drag schedule start at more layer view. - * @event {MonthMove#monthMoveStart_from_morelayer} - */ - this.fire('monthMoveStart_from_morelayer'); - } - } - - return modelID; -}; - -/** - * Event handler for Drag#dragStart - * @fires {MonthMove#monthMoveDragstart} - * @param {object} dragStartEvent - drag start schedule data - */ -MonthMove.prototype._onDragStart = function(dragStartEvent) { - var target = dragStartEvent.target, - modelID = this.hasPermissionToHandle(target), - model = this.baseController.schedules.items[modelID], - scheduleData; - - if (!modelID || !model || model.isReadOnly || model.isPending) { - return; - } - - this.dragHandler.on({ - drag: this._onDrag, - dragEnd: this._onDragEnd - }, this); - - this.getScheduleData = getMousePosData(this.monthView); - - scheduleData = this.getScheduleData(dragStartEvent.originEvent); - scheduleData.originEvent = dragStartEvent.originEvent; - scheduleData.target = this.getMonthScheduleBlock(target); - scheduleData.model = model; - - this._cache = { - model: model, - target: target, - start: new TZDate(Number(scheduleData.date)) - }; - - /** - * @event {MonthMove#monthMoveDragstart} - * @type {object} - * @property {number} x - x index - * @property {number} y - y index - * @property {Date} date - drag date - * @property {HTMLElement} target - schedule block element - * @property {Schedule} model - model instance - */ - this.fire('monthMoveDragstart', scheduleData); -}; - -/** - * @fires {MonthMove#monthMoveDrag} - * @param {object} dragEvent - drag event data - */ -MonthMove.prototype._onDrag = function(dragEvent) { - var scheduleData; - - if (!this.getScheduleData) { - return; - } - - scheduleData = util.extend({ - originEvent: dragEvent.originEvent - }, this.getScheduleData(dragEvent.originEvent)); - - if (!scheduleData) { - return; - } - - /** - * @event {MonthMove#monthMoveDrag} - * @type {object} - * @property {number} x - x index - * @property {number} y - y index - * @property {Date} date - drag date - */ - this.fire('monthMoveDrag', scheduleData); -}; - -/** - * Event handler for Drag#dragEnd - * @fires {MonthMove#monthMoveDragend} - * @param {object} dragEndEvent - dragend event data - */ -MonthMove.prototype._onDragEnd = function(dragEndEvent) { - var cache = this._cache; - var scheduleData; - - this.dragHandler.off({ - drag: this._onDrag, - dragEnd: this._onDragEnd - }, this); - - if (!this.getScheduleData) { - return; - } - - scheduleData = this.getScheduleData(dragEndEvent.originEvent); - - if (scheduleData) { - cache.end = new TZDate(scheduleData.date); - this.updateSchedule(cache); - } - - /** - * @event {MonthResize#monthMoveDragend} - * @type {object} - * @property {number} x - x index - * @property {number} y - y index - * @property {Date} date - drag date - */ - this.fire('monthMoveDragend', scheduleData); - - this.getScheduleData = this._cache = null; -}; - -util.CustomEvents.mixin(MonthMove); - -module.exports = MonthMove; - - -/***/ }), - -/***/ "./src/js/handler/month/moveGuide.hbs": -/*!********************************************!*\ - !*** ./src/js/handler/month/moveGuide.hbs ***! - \********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_606733__) { - -var Handlebars = __nested_webpack_require_606733__(/*! ./node_modules/handlebars/runtime.js */ "./node_modules/handlebars/runtime.js"); -module.exports = (Handlebars['default'] || Handlebars).template({"1":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " border-left:3px solid " - + container.escapeExpression(container.lambda(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"borderColor") : stack1), depth0)) - + ";\n "; -},"3":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " \n"; -},"5":function(container,depth0,helpers,partials,data) { - var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return container.escapeExpression(((helper = (helper = lookupProperty(helpers,"CSS_PREFIX") || (depth0 != null ? lookupProperty(depth0,"CSS_PREFIX") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data,"loc":{"start":{"line":16,"column":110},"end":{"line":16,"column":124}}}) : helper))) - + "weekday-schedule-title-focused"; -},"7":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " " - + ((stack1 = (lookupProperty(helpers,"allday-tmpl")||(depth0 && lookupProperty(depth0,"allday-tmpl"))||container.hooks.helperMissing).call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? lookupProperty(depth0,"model") : depth0),{"name":"allday-tmpl","hash":{},"data":data,"loc":{"start":{"line":18,"column":12},"end":{"line":18,"column":35}}})) != null ? stack1 : "") - + "\n"; -},"9":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " " - + ((stack1 = (lookupProperty(helpers,"time-tmpl")||(depth0 && lookupProperty(depth0,"time-tmpl"))||container.hooks.helperMissing).call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? lookupProperty(depth0,"model") : depth0),{"name":"time-tmpl","hash":{},"data":data,"loc":{"start":{"line":20,"column":12},"end":{"line":20,"column":33}}})) != null ? stack1 : "") - + "\n"; -},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
\n" - + ((stack1 = lookupProperty(helpers,"unless").call(alias1,((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"isAllDay") : stack1),{"name":"unless","hash":{},"fn":container.program(3, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":13,"column":4},"end":{"line":15,"column":15}}})) != null ? stack1 : "") - + "
\n" - + ((stack1 = lookupProperty(helpers,"if").call(alias1,((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"isAllDay") : stack1),{"name":"if","hash":{},"fn":container.program(7, data, 0),"inverse":container.program(9, data, 0),"data":data,"loc":{"start":{"line":17,"column":8},"end":{"line":21,"column":15}}})) != null ? stack1 : "") - + "
\n
\n
\n"; -},"useData":true}); - -/***/ }), - -/***/ "./src/js/handler/month/moveGuide.js": -/*!*******************************************!*\ - !*** ./src/js/handler/month/moveGuide.js ***! - \*******************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_616822__) { - -"use strict"; -/* WEBPACK VAR INJECTION */(function(global) {/** - * @fileoverview Module for modification of guide element for move in month view - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_616822__(/*! tui-code-snippet */ "tui-code-snippet"); - -var config = __nested_webpack_require_616822__(/*! ../../config */ "./src/js/config.js"), - domutil = __nested_webpack_require_616822__(/*! ../../common/domutil */ "./src/js/common/domutil.js"), - domevent = __nested_webpack_require_616822__(/*! ../../common/domevent */ "./src/js/common/domevent.js"), - FloatingLayer = __nested_webpack_require_616822__(/*! ../../common/floatingLayer */ "./src/js/common/floatingLayer.js"), - tmpl = __nested_webpack_require_616822__(/*! ./moveGuide.hbs */ "./src/js/handler/month/moveGuide.hbs"), - Schedule = __nested_webpack_require_616822__(/*! ../../model/schedule */ "./src/js/model/schedule.js"); - -/** - * @constructor - * @param {MonthMove} monthMove - month/move module instance - */ -function MonthMoveGuide(monthMove) { - /** - * @type {MonthMove} - */ - this.monthMove = monthMove; - - /** - * @type {HTMLElement[]} - */ - this.elements = null; - - /** - * @type {FloatingLayer} - */ - this.layer = null; - - monthMove.on({ - monthMoveDragstart: this._onDragStart, - monthMoveDrag: this._onDrag, - monthMoveDragend: this._onDragEnd - }, this); -} - -/** - * Destructor - */ -MonthMoveGuide.prototype.destroy = function() { - this.monthMove.off(this); - this._clearGridBgColor(); - - if (this.layer) { - this.layer.destroy(); - } - - if (this.element) { - domutil.remove(this.element); - } - - this.monthMove = this.elements = this.layer = null; -}; - -/** - * Hide element blocks for resize effect - * @param {number} modelID - Schedule model instance ID - */ -MonthMoveGuide.prototype._hideOriginScheduleBlocks = function(modelID) { - var className = config.classname('weekday-schedule-block-dragging-dim'); - - this.elements = domutil.find( - config.classname('.weekday-schedule-block-' + modelID), - this.monthMove.monthView.container, - true - ); - - util.forEach(this.elements, function(el) { - domutil.addClass(el, className); - }); -}; - -/** - * Show element blocks - */ -MonthMoveGuide.prototype._showOriginScheduleBlocks = function() { - var className = config.classname('weekday-schedule-block-dragging-dim'); - - util.forEach(this.elements, function(el) { - domutil.removeClass(el, className); - }); -}; - -/** - * Clear background color for filled grid element. - */ -MonthMoveGuide.prototype._clearGridBgColor = function() { - var selector = config.classname('.weekday-filled'), - className = config.classname('weekday-filled'), - beforeGridElement = domutil.find(selector, - this.monthMove.monthView.container); - - if (beforeGridElement) { - domutil.removeClass(beforeGridElement, className); - } -}; - -/** - * Fill background color of date grids relatied with model updates. - * @param {object} dragEvent - drag event data from MonthMoveGuide#_onDrag - */ -MonthMoveGuide.prototype._updateGridBgColor = function(dragEvent) { - var gridElements = domutil.find(config.classname('.weekday-grid-line'), this.monthMove.monthView.container, true), - className = config.classname('weekday-filled'), - targetIndex = (dragEvent.x + (dragEvent.sizeX * dragEvent.y)); - - this._clearGridBgColor(); - - if (!gridElements || !gridElements[targetIndex]) { - return; - } - - domutil.addClass(gridElements[targetIndex], className); -}; - -/** - * Handler for MonthMove#dragStart - * @param {object} dragStartEvent - dragStart schedule data object - */ -MonthMoveGuide.prototype._onDragStart = function(dragStartEvent) { - var monthView = this.monthMove.monthView, - firstWeekdayView = monthView.children.single(), - weekdayOptions = firstWeekdayView.options, - widthPercent = 100 / firstWeekdayView.getRenderDateRange().length, - height = weekdayOptions.scheduleGutter + weekdayOptions.scheduleHeight, - container = monthView.container, - mousePos = domevent.getMousePosition(dragStartEvent.originEvent, container), - model = dragStartEvent.model, - layer = new FloatingLayer(null, container); - - this._hideOriginScheduleBlocks(model.cid()); - - this.layer = layer; - layer.setSize(widthPercent + '%', height); - layer.setPosition(mousePos[0], mousePos[1]); - layer.setContent(tmpl({ - model: util.extend( - Schedule.create(model), - model - ), - styles: { - scheduleHeight: weekdayOptions.scheduleHeight, - scheduleBulletTop: weekdayOptions.scheduleHeight / 3, - borderRadius: monthView.controller.theme.month.schedule.borderRadius - } - })); - layer.show(); - - if (!util.browser.msie) { - domutil.addClass(global.document.body, config.classname('dragging')); - } -}; - -/** - * Handler for MonthMove#drag - * @param {object} dragEvent - drag event data object - */ -MonthMoveGuide.prototype._onDrag = function(dragEvent) { - var container = this.monthMove.monthView.container, - mousePos = domevent.getMousePosition( - dragEvent.originEvent, - container - ); - - this._updateGridBgColor(dragEvent); - - if (!this.layer) { - return; - } - - this.layer.setPosition(mousePos[0], mousePos[1]); -}; - -/** - * Handler for MonthMove#dragEnd - */ -MonthMoveGuide.prototype._onDragEnd = function() { - this._showOriginScheduleBlocks(); - - if (!util.browser.msie) { - domutil.removeClass(global.document.body, config.classname('dragging')); - } - - this._clearGridBgColor(); - this.layer.destroy(); - this.layer = null; -}; - -module.exports = MonthMoveGuide; - -/* WEBPACK VAR INJECTION */}.call(this, __nested_webpack_require_616822__(/*! ./../../../../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) - -/***/ }), - -/***/ "./src/js/handler/month/resize.js": -/*!****************************************!*\ - !*** ./src/js/handler/month/resize.js ***! - \****************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_623005__) { - -"use strict"; -/** - * @fileoverview Module for resize schedule in month view - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_623005__(/*! tui-code-snippet */ "tui-code-snippet"); - -var config = __nested_webpack_require_623005__(/*! ../../config */ "./src/js/config.js"), - datetime = __nested_webpack_require_623005__(/*! ../../common/datetime */ "./src/js/common/datetime.js"), - domutil = __nested_webpack_require_623005__(/*! ../../common/domutil */ "./src/js/common/domutil.js"), - getMousePosData = __nested_webpack_require_623005__(/*! ./core */ "./src/js/handler/month/core.js"), - MonthResizeGuide = __nested_webpack_require_623005__(/*! ./resizeGuide */ "./src/js/handler/month/resizeGuide.js"), - TZDate = __nested_webpack_require_623005__(/*! ../../common/timezone */ "./src/js/common/timezone.js").Date; - -var common = __nested_webpack_require_623005__(/*! ../../common/common */ "./src/js/common/common.js"); - -/** - * @constructor - * @param {Drag} dragHandler - Drag handler instance. - * @param {Month} monthView - Month view instance. - * @param {Base} baseController - Base controller instance. - */ -function MonthResize(dragHandler, monthView, baseController) { - /** - * @type {Drag} - */ - this.dragHandler = dragHandler; - - /** - * @type {Month} - */ - this.monthView = monthView; - - /** - * @type {Base} - */ - this.baseController = baseController; - - /** - * @type {function} - */ - this.getScheduleData = null; - - /** - * @type {object} - */ - this._cache = null; - - /** - * @type {MonthResizeGuide} - */ - this.guide = new MonthResizeGuide(this); - - dragHandler.on('dragStart', this._onDragStart, this); -} - -/** - * Destructor - */ -MonthResize.prototype.destroy = function() { - this.dragHandler.off(this); - - this.dragHandler = this.monthView = this.baseController = null; -}; - -/** - * Fire event for update model - * @fires {MonthResize#beforeUpdateSchedule} - * @param {object} scheduleCache - cache object that result of single dragging - * session. - */ -MonthResize.prototype._updateSchedule = function(scheduleCache) { - // You can not change the start date of the event. Only the end time can be changed. - var newEnd = datetime.end(new TZDate(scheduleCache.end)), - schedule = scheduleCache.schedule; - var changes = common.getScheduleChanges( - schedule, - ['end'], - {end: newEnd} - ); - - /** - * @event MonthResize#beforeUpdateSchedule - * @type {object} - * @property {Schedule} schedule - The original schedule instance - * @property {Date} start - Deprecated: start time to update - * @property {Date} end - Deprecated: end time to update - * @property {object} changes - end time to update - * @property {date} end - end time to update - */ - this.fire('beforeUpdateSchedule', { - schedule: schedule, - changes: changes, - start: new TZDate(schedule.getStarts()), - end: newEnd - }); -}; - -/** - * Event handler for Drag#dragStart - * @fires {MonthResize#monthResizeDragstart} - * @param {object} dragStartEvent - drag start event data - */ -MonthResize.prototype._onDragStart = function(dragStartEvent) { - var target = dragStartEvent.target, - modelID, schedule, - scheduleData; - - if (!domutil.hasClass(target, config.classname('weekday-resize-handle'))) { - return; - } - - target = domutil.closest(target, config.classname('.weekday-schedule-block')); - - if (!target) { - return; - } - - modelID = domutil.getData(target, 'id'); - schedule = this.baseController.schedules.items[modelID]; - - this.dragHandler.on({ - drag: this._onDrag, - dragEnd: this._onDragEnd - }, this); - - this.getScheduleData = getMousePosData(this.monthView); - scheduleData = this.getScheduleData(dragStartEvent.originEvent); - scheduleData.target = target; - scheduleData.model = schedule; - - this._cache = { - schedule: schedule, - target: target, - start: new TZDate(scheduleData.date) - }; - - /** - * @event {MonthCreation#monthResizeDragstart} - * @type {object} - * @property {number} x - x index - * @property {number} y - y index - * @property {Date} date - drag date - * @property {HTMLElement} target - schedule block element - * @property {Schedule} model - model instance - */ - this.fire('monthResizeDragstart', scheduleData); -}; - -/** - * @fires {MonthResize#monthResizeDrag} - * @param {object} dragEvent - drag event data - */ -MonthResize.prototype._onDrag = function(dragEvent) { - var scheduleData; - - if (!this.getScheduleData) { - return; - } - - scheduleData = this.getScheduleData(dragEvent.originEvent); - - if (!scheduleData) { - return; - } - - /** - * @event {MonthResize#monthResizeDrag} - * @type {object} - * @property {number} x - x index - * @property {number} y - y index - * @property {Date} date - drag date - */ - this.fire('monthResizeDrag', scheduleData); -}; - -/** - * @fires {MonthResize#monthResizeDragend} - * @param {object} dragEndEvent - drag end event data - */ -MonthResize.prototype._onDragEnd = function(dragEndEvent) { - var cache = this._cache; - var scheduleData; - var start, end; - - this.dragHandler.off({ - drag: this._onDrag, - dragEnd: this._onDragEnd - }, this); - - if (!this.getScheduleData) { - return; - } - - scheduleData = this.getScheduleData(dragEndEvent.originEvent); - - if (scheduleData) { - start = new TZDate(cache.schedule.getStarts()); - end = new TZDate(scheduleData.date); - cache.end = end; - - if (start <= cache.end) { - this._updateSchedule(cache); - } - } - - /** - * @event {MonthResize#monthResizeDragend} - * @type {object} - * @property {number} x - x index - * @property {number} y - y index - * @property {Date} date - drag date - */ - this.fire('monthResizeDragend', scheduleData); - - this.getScheduleData = this._cache = null; -}; - -util.CustomEvents.mixin(MonthResize); - -module.exports = MonthResize; - - -/***/ }), - -/***/ "./src/js/handler/month/resizeGuide.js": -/*!*********************************************!*\ - !*** ./src/js/handler/month/resizeGuide.js ***! - \*********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_629333__) { - -"use strict"; -/* WEBPACK VAR INJECTION */(function(global) {/** - * @fileoverview Module for modification of guide element in schedule resize - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_629333__(/*! tui-code-snippet */ "tui-code-snippet"); - -var config = __nested_webpack_require_629333__(/*! ../../config */ "./src/js/config.js"), - domutil = __nested_webpack_require_629333__(/*! ../../common/domutil */ "./src/js/common/domutil.js"), - MonthGuide = __nested_webpack_require_629333__(/*! ./guide */ "./src/js/handler/month/guide.js"); - -/** - * @constructor - * @param {MonthResize} monthResize - month/resize module instance - */ -function MonthResizeGuide(monthResize) { - /** - * @type {MonthResize} - */ - this.monthResize = monthResize; - - /** - * @type {HTMLElement[]} - */ - this.elements = null; - - /** - * @type {MonthGuide} - */ - this.guide = null; - - monthResize.on({ - monthResizeDragstart: this._onDragStart, - monthResizeDrag: this._onDrag, - monthResizeDragend: this._onDragEnd - }, this); -} - -/** - * Destructor - */ -MonthResizeGuide.prototype.destroy = function() { - this.monthResize.off(this); - this.guide.destroy(); - - this.guide = this.monthResize = null; -}; - -/** - * Hide element blocks for resize effect - * @param {number} modelID - Schedule model instance ID - */ -MonthResizeGuide.prototype._hideScheduleBlocks = function(modelID) { - this.elements = domutil.find( - config.classname('.weekday-schedule-block-' + modelID), - this.monthResize.monthView.container, - true - ); - - util.forEach(this.elements, function(el) { - el.style.display = 'none'; - }); -}; - -/** - * Show element blocks - */ -MonthResizeGuide.prototype._showScheduleBlocks = function() { - util.forEach(this.elements, function(el) { - el.style.display = 'block'; - }); -}; - -/** - * Drag start event handler - * @param {object} dragStartEvent - schedule data from MonthResize - */ -MonthResizeGuide.prototype._onDragStart = function(dragStartEvent) { - this.guide = new MonthGuide({ - isResizeMode: true - }, this.monthResize.monthView); - - this.guide.start(dragStartEvent); - - this._hideScheduleBlocks(dragStartEvent.model.cid()); - - if (!util.browser.msie) { - domutil.addClass(global.document.body, config.classname('resizing-x')); - } -}; - -/** - * Drag event handler - * @param {object} dragEvent - event data from MonthCreation - */ -MonthResizeGuide.prototype._onDrag = function(dragEvent) { - this.guide.update(dragEvent.x, dragEvent.y); -}; - -/** - * Drag end event handler - */ -MonthResizeGuide.prototype._onDragEnd = function() { - this._showScheduleBlocks(); - - this.guide.destroy(); - this.elements = this.guide = null; - - if (!util.browser.msie) { - domutil.removeClass(global.document.body, config.classname('resizing-x')); - } -}; - -module.exports = MonthResizeGuide; - -/* WEBPACK VAR INJECTION */}.call(this, __nested_webpack_require_629333__(/*! ./../../../../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) - -/***/ }), - -/***/ "./src/js/handler/time/click.js": -/*!**************************************!*\ - !*** ./src/js/handler/time/click.js ***! - \**************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_632664__) { - -"use strict"; -/** - * @fileoverview Allday event click event hander module - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_632664__(/*! tui-code-snippet */ "tui-code-snippet"); -var config = __nested_webpack_require_632664__(/*! ../../config */ "./src/js/config.js"); -var domutil = __nested_webpack_require_632664__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); - -/** - * @constructor - * @implements {Handler} - * @mixes util.CustomEvents - * @param {Drag} [dragHandler] - Drag handler instance. - * @param {TimeGrid} [timeGridView] - TimeGrid view instance. - * @param {Base} [baseController] - Base controller instance. - */ -function TimeClick(dragHandler, timeGridView, baseController) { - /** - * @type {Drag} - */ - this.dragHandler = dragHandler; - - /** - * @type {TimeGrid} - */ - this.timeGridView = timeGridView; - - /** - * @type {Base} - */ - this.baseController = baseController; - - dragHandler.on({ - 'click': this._onClick - }, this); -} - -/** - * Destroy method - */ -TimeClick.prototype.destroy = function() { - this.dragHandler.off(this); - this.timeGridView = this.baseController = this.dragHandler = null; -}; - -/** - * Check target element is expected condition for activate this plugins. - * @param {HTMLElement} target - The element to check - * @returns {string} - model id - */ -TimeClick.prototype.checkExpectCondition = function(target) { - var container, - matches; - - container = domutil.closest(target, config.classname('.time-date')); - - if (!container) { - return false; - } - - matches = domutil.getClass(container).match(config.time.getViewIDRegExp); - - if (!matches || matches.length < 2) { - return false; - } - - return util.pick(this.timeGridView.children.items, Number(matches[1])); -}; - -/** - * Click event hander - * @param {object} clickEvent - click event from {@link Drag} - * @emits TimeClick#clickEvent - */ -TimeClick.prototype._onClick = function(clickEvent) { - var self = this, - target = clickEvent.target, - timeView = this.checkExpectCondition(target), - blockElement = domutil.closest(target, config.classname('.time-date-schedule-block')), - schedulesCollection = this.baseController.schedules; - - if (!timeView || !blockElement) { - return; - } - - schedulesCollection.doWhenHas(domutil.getData(blockElement, 'id'), function(schedule) { - /** - * @events TimeClick#clickSchedule - * @type {object} - * @property {Schedule} schedule - schedule instance - * @property {MouseEvent} event - MouseEvent object - */ - self.fire('clickSchedule', { - schedule: schedule, - event: clickEvent.originEvent - }); - }); -}; - -util.CustomEvents.mixin(TimeClick); - -module.exports = TimeClick; - - -/***/ }), - -/***/ "./src/js/handler/time/clickDayname.js": -/*!*********************************************!*\ - !*** ./src/js/handler/time/clickDayname.js ***! - \*********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_635778__) { - -"use strict"; -/** - * @fileoverview Dayname click event hander module - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_635778__(/*! tui-code-snippet */ "tui-code-snippet"); -var config = __nested_webpack_require_635778__(/*! ../../config */ "./src/js/config.js"); -var domutil = __nested_webpack_require_635778__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); - -/** - * @constructor - * @implements {Handler} - * @mixes util.CustomEvents - * @param {Drag} [dragHandler] - Drag handler instance. - * @param {DayName} [dayNameView] - DayName view instance. - * @param {Base} [baseController] - Base controller instance. - */ -function DayNameClick(dragHandler, dayNameView, baseController) { - /** - * @type {Drag} - */ - this.dragHandler = dragHandler; - - /** - * @type {DayName} - */ - this.dayNameView = dayNameView; - - /** - * @type {Base} - */ - this.baseController = baseController; - - dragHandler.on({ - 'click': this._onClick - }, this); -} - -/** - * Destroy method - */ -DayNameClick.prototype.destroy = function() { - this.dragHandler.off(this); - this.dayNameView = this.baseController = this.dragHandler = null; -}; - -/** - * Check target element is expected condition for activate this plugins. - * @param {HTMLElement} target - The element to check - * @returns {string} - model id - */ -DayNameClick.prototype.checkExpectCondition = function(target) { - var container = domutil.closest(target, config.classname('.dayname-date-area')); - - if (!container) { - return false; - } - - return true; -}; - -/** - * Click event hander - * @param {object} clickEvent - click event from {@link Drag} - * @emits DayNameClick#clickDayname - */ -DayNameClick.prototype._onClick = function(clickEvent) { - var self = this, - target = clickEvent.target, - daynameView = this.checkExpectCondition(target), - blockElement = domutil.closest(target, config.classname('.dayname')); - - if (!daynameView || !blockElement) { - return; - } - - /** - * @events DayNameClick#clickDayname - * @type {object} - * @property {string} date - click date - */ - self.fire('clickDayname', { - date: domutil.getData(blockElement, 'date') - }); -}; - -util.CustomEvents.mixin(DayNameClick); - -module.exports = DayNameClick; - - -/***/ }), - -/***/ "./src/js/handler/time/core.js": -/*!*************************************!*\ - !*** ./src/js/handler/time/core.js ***! - \*************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_638342__) { - -"use strict"; -/** - * @fileoverview Core methods for dragging actions - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_638342__(/*! tui-code-snippet */ "tui-code-snippet"); -var common = __nested_webpack_require_638342__(/*! ../../common/common */ "./src/js/common/common.js"); -var datetime = __nested_webpack_require_638342__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); -var domevent = __nested_webpack_require_638342__(/*! ../../common/domevent */ "./src/js/common/domevent.js"); -var Point = __nested_webpack_require_638342__(/*! ../../common/point */ "./src/js/common/point.js"); -var TZDate = __nested_webpack_require_638342__(/*! ../../common/timezone */ "./src/js/common/timezone.js").Date; - -/** - * @mixin Time.Core - */ -var timeCore = { - /** - * Get Y index ratio(hour) in time grids by supplied parameters. - * @param {number} baseMil - base milliseconds number for supplied height. - * @param {number} height - container element height. - * @param {number} y - Y coordinate to calculate hour ratio. - * @returns {number} hour index ratio value. - */ - _calcGridYIndex: function(baseMil, height, y) { - // get ratio from right expression > point.y : x = session.height : baseMil - // and convert milliseconds value to hours. - var result = datetime.millisecondsTo('hour', (y * baseMil) / height), - floored = result | 0, - nearest = common.nearest(result - floored, [0, 1]); - - return floored + (nearest ? 0.5 : 0); - }, - - /** - * Get function to makes event data from Time and mouseEvent - * @param {Time} timeView - Instance of time view. - * @returns {function} - Function that return event data from mouse event. - */ - _retriveScheduleData: function(timeView) { - var self = this, - container = timeView.container, - options = timeView.options, - viewHeight = timeView.getViewBound().height, - viewTime = timeView.getDate(), - hourLength = options.hourEnd - options.hourStart, - baseMil = datetime.millisecondsFrom('hour', hourLength); - - /** - * @param {MouseEvent} mouseEvent - mouse event object to get common event data. - * @param {object} [extend] - object to extend event data before return. - * @returns {object} - common event data for time - */ - return function(mouseEvent, extend) { - var mouseY = Point.n(domevent.getMousePosition(mouseEvent, container)).y, - gridY = common.ratio(viewHeight, hourLength, mouseY), - timeY = new TZDate(viewTime).addMinutes(datetime.minutesFromHours(gridY)), - nearestGridY = self._calcGridYIndex(baseMil, viewHeight, mouseY), - nearestGridTimeY = new TZDate(viewTime).addMinutes( - datetime.minutesFromHours(nearestGridY + options.hourStart) - ); - - return util.extend({ - target: domevent.getEventTarget(mouseEvent), - relatedView: timeView, - originEvent: mouseEvent, - mouseY: mouseY, - gridY: gridY, - timeY: timeY, - nearestGridY: nearestGridY, - nearestGridTimeY: nearestGridTimeY, - triggerEvent: mouseEvent.type - }, extend); - }; - }, - - /** - * Get function to makes event data from Time and mouseEvent - * @param {Time} timeView - Instance of time view. - * @param {TZDate} startDate - start date - * @param {TZDate} endDate - end date - * @param {number} hourStart Can limit of render hour start. - * @returns {object} - common event data for time from mouse event. - */ - _retriveScheduleDataFromDate: function(timeView, startDate, endDate, hourStart) { - var viewTime = timeView.getDate(); - var gridY, timeY, nearestGridY, nearestGridTimeY, nearestGridEndY, nearestGridEndTimeY; - - gridY = startDate.getHours() - hourStart + getNearestHour(startDate.getMinutes()); - timeY = new TZDate(viewTime).addMinutes(datetime.minutesFromHours(gridY)); - nearestGridY = gridY; - nearestGridTimeY = new TZDate(viewTime).addMinutes(datetime.minutesFromHours(nearestGridY)); - nearestGridEndY = endDate.getHours() - hourStart + getNearestHour(endDate.getMinutes()); - nearestGridEndTimeY = new TZDate(viewTime).addMinutes(datetime.minutesFromHours(nearestGridEndY)); - - return { - target: timeView, - relatedView: timeView, - gridY: gridY, - timeY: timeY, - nearestGridY: nearestGridY, - nearestGridTimeY: nearestGridTimeY, - nearestGridEndY: nearestGridEndY, - nearestGridEndTimeY: nearestGridEndTimeY, - triggerEvent: 'manual', - hourStart: hourStart - }; - }, - - /** - * Mixin method. - * @param {(TimeCreation|TimeMove)} obj - Constructor functions - */ - mixin: function(obj) { - var proto = obj.prototype; - util.forEach(timeCore, function(method, methodName) { - if (methodName === 'mixin') { - return; - } - - proto[methodName] = method; - }); - } -}; - -/** - * Get the nearest hour - * @param {number} minutes - minutes - * @returns {number} hour - */ -function getNearestHour(minutes) { - var nearestHour; - if (minutes === 0) { - nearestHour = 0; - } else if (minutes > 30) { - nearestHour = 1; - } else if (minutes <= 30) { - nearestHour = 0.5; - } - - return nearestHour; -} - -module.exports = timeCore; - - -/***/ }), - -/***/ "./src/js/handler/time/creation.js": -/*!*****************************************!*\ - !*** ./src/js/handler/time/creation.js ***! - \*****************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_644209__) { - -"use strict"; -/** - * @fileoverview Handling creation events from drag handler and time grid view - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_644209__(/*! tui-code-snippet */ "tui-code-snippet"); -var config = __nested_webpack_require_644209__(/*! ../../config */ "./src/js/config.js"); -var array = __nested_webpack_require_644209__(/*! ../../common/array */ "./src/js/common/array.js"); -var datetime = __nested_webpack_require_644209__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); -var domutil = __nested_webpack_require_644209__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); -var domevent = __nested_webpack_require_644209__(/*! ../../common/domevent */ "./src/js/common/domevent.js"); -var common = __nested_webpack_require_644209__(/*! ../../common/common */ "./src/js/common/common.js"); -var TimeCreationGuide = __nested_webpack_require_644209__(/*! ./creationGuide */ "./src/js/handler/time/creationGuide.js"); -var TZDate = __nested_webpack_require_644209__(/*! ../../common/timezone */ "./src/js/common/timezone.js").Date; -var timeCore = __nested_webpack_require_644209__(/*! ./core */ "./src/js/handler/time/core.js"); - -var CLICK_DELAY = 300; - -/** - * @constructor - * @implements {Handler} - * @mixes timeCore - * @mixes CustomEvents - * @param {Drag} [dragHandler] - Drag handler instance. - * @param {TimeGrid} [timeGridView] - TimeGrid view instance. - * @param {Base} [baseController] - Base controller instance. - * @param {Options} [options] - calendar Options - */ -function TimeCreation(dragHandler, timeGridView, baseController, options) { - /** - * Drag handler instance. - * @type {Drag} - */ - this.dragHandler = dragHandler; - - /** - * TimeGrid view instance. - * @type {TimeGrid} - */ - this.timeGridView = timeGridView; - - /** - * Base controller instance. - * @type {Base} - */ - this.baseController = baseController; - - /** - * @type {TimeCreationGuide} - */ - this.guide = new TimeCreationGuide(this); - - /** - * Temporary function for single drag session's calc. - * @type {function} - */ - this._getScheduleDataFunc = null; - - /** - * Temporary function for drag start data cache. - * @type {object} - */ - this._dragStart = null; - - /** - * @type {boolean} - */ - this._requestOnClick = false; - - /** - * @type {boolean} - */ - this._disableDblClick = options.disableDblClick; - - /** - * @type {boolean} - */ - this._disableClick = options.disableClick; - - dragHandler.on('dragStart', this._onDragStart, this); - dragHandler.on('click', this._onClick, this); - - if (this._disableDblClick) { - CLICK_DELAY = 0; - } else { - domevent.on(timeGridView.container, 'dblclick', this._onDblClick, this); - } -} - -/** - * Destroy method - */ -TimeCreation.prototype.destroy = function() { - var timeGridView = this.timeGridView; - - this.guide.destroy(); - this.dragHandler.off(this); - - if (timeGridView && timeGridView.container) { - domevent.off(timeGridView.container, 'dblclick', this._onDblClick, this); - } - - this.dragHandler = this.timeGridView = this.baseController = - this._getScheduleDataFunc = this._dragStart = this.guide = null; -}; - -/** - * Check target element is expected condition for activate this plugins. - * @param {HTMLElement} target - The element to check - * @returns {(boolean|Time)} - return Time view instance when satiate condition. - */ -TimeCreation.prototype.checkExpectedCondition = function(target) { - var cssClass = domutil.getClass(target), - matches; - - if (cssClass === config.classname('time-date-schedule-block-wrap')) { - target = target.parentNode; - cssClass = domutil.getClass(target); - } - - matches = cssClass.match(config.time.getViewIDRegExp); - - if (!matches || matches.length < 2) { - return false; - } - - return util.pick(this.timeGridView.children.items, matches[1]); -}; - -/** - * Drag#dragStart event handler. - * @emits TimeCreation#timeCreationDragstart - * @param {object} dragStartEventData - Drag#dragStart event data. - * @param {string} [overrideEventName] - override emitted event name when supplied. - * @param {function} [revise] - supply function for revise event data before emit. - */ -TimeCreation.prototype._onDragStart = function(dragStartEventData, overrideEventName, revise) { - var target = dragStartEventData.target, - result = this.checkExpectedCondition(target), - getScheduleDataFunc, - eventData; - - if (!result) { - return; - } - - getScheduleDataFunc = this._getScheduleDataFunc = this._retriveScheduleData(result); - eventData = this._dragStart = getScheduleDataFunc(dragStartEventData.originEvent); - - if (revise) { - revise(eventData); - } - - this.dragHandler.on({ - drag: this._onDrag, - dragEnd: this._onDragEnd - }, this); - - /** - * @event TimeCreation#timeCreationDragstart - * @type {object} - * @property {Time} relatedView - time view instance related with mouse position. - * @property {MouseEvent} originEvent - mouse event object. - * @property {number} mouseY - mouse Y px mouse event. - * @property {number} gridY - grid Y index value related with mouseY value. - * @property {number} timeY - milliseconds value of mouseY points. - * @property {number} nearestGridY - nearest grid index related with mouseY value. - * @property {number} nearestGridTimeY - time value for nearestGridY. - */ - this.fire(overrideEventName || 'timeCreationDragstart', eventData); -}; - -/** - * Drag#drag event handler - * @emits TimeCreation#timeCreationDrag - * @param {object} dragEventData - event data from Drag#drag. - * @param {string} [overrideEventName] - override emitted event name when supplied. - * @param {function} [revise] - supply function for revise event data before emit. - */ -TimeCreation.prototype._onDrag = function(dragEventData, overrideEventName, revise) { - var getScheduleDataFunc = this._getScheduleDataFunc, - eventData; - - if (!getScheduleDataFunc) { - return; - } - - eventData = getScheduleDataFunc(dragEventData.originEvent); - - if (revise) { - revise(eventData); - } - - /** - * @event TimeCreation#timeCreationDrag - * @type {object} - * @property {Time} relatedView - time view instance related with mouse position. - * @property {MouseEvent} originEvent - mouse event object. - * @property {number} mouseY - mouse Y px mouse event. - * @property {number} gridY - grid Y index value related with mouseY value. - * @property {number} timeY - milliseconds value of mouseY points. - * @property {number} nearestGridY - nearest grid index related with mouseY value. - * @property {number} nearestGridTimeY - time value for nearestGridY. - */ - this.fire(overrideEventName || 'timeCreationDrag', eventData); -}; - -/** - * @fires TimeCreation#beforeCreateSchedule - * @param {object} eventData - event data object from TimeCreation#timeCreationDragend - * or TimeCreation#timeCreationClick - */ -TimeCreation.prototype._createSchedule = function(eventData) { - var relatedView = eventData.relatedView, - createRange = eventData.createRange, - nearestGridTimeY = eventData.nearestGridTimeY, - nearestGridEndTimeY = eventData.nearestGridEndTimeY - ? eventData.nearestGridEndTimeY - : new TZDate(nearestGridTimeY).addMinutes(30), - baseDate, - dateStart, - dateEnd, - start, - end; - - if (!createRange) { - createRange = [ - nearestGridTimeY, - nearestGridEndTimeY - ]; - } - - baseDate = new TZDate(relatedView.getDate()); - dateStart = datetime.start(baseDate); - dateEnd = datetime.getStartOfNextDay(baseDate); - start = common.limitDate(createRange[0], dateStart, dateEnd); - end = common.limitDate(createRange[1], dateStart, dateEnd); - - /** - * @event TimeCreation#beforeCreateSchedule - * @type {object} - * @property {boolean} isAllDay - whether schedule is fired in allday view area? - * @property {Date} start - select start time - * @property {Date} end - select end time - * @property {TimeCreationGuide} guide - TimeCreationGuide instance - * @property {string} triggerEventName - event name - */ - this.fire('beforeCreateSchedule', { - isAllDay: false, - start: new TZDate(start), - end: new TZDate(end), - guide: this.guide, - triggerEventName: eventData.triggerEvent - }); -}; - -/** - * Drag#dragEnd event handler - * @emits TimeCreation#timeCreationDragend - * @param {object} dragEndEventData - event data from Drag#dragend - */ -TimeCreation.prototype._onDragEnd = function(dragEndEventData) { - var self = this, - dragStart = this._dragStart; - - this.dragHandler.off({ - drag: this._onDrag, - dragEnd: this._onDragEnd - }, this); - - /** - * Function for manipulate event data before firing event - * @param {object} eventData - event data - */ - function reviseFunc(eventData) { - var range = [ - dragStart.nearestGridTimeY, - eventData.nearestGridTimeY - ].sort(array.compare.num.asc); - range[1].addMinutes(30); - - eventData.createRange = range; - - self._createSchedule(eventData); - } - - /** - * @event TimeCreation#timeCreationDragend - * @type {object} - * @property {Time} relatedView - time view instance related with mouse position. - * @property {MouseEvent} originEvent - mouse event object. - * @property {number} mouseY - mouse Y px mouse event. - * @property {number} gridY - grid Y index value related with mouseY value. - * @property {number} timeY - milliseconds value of mouseY points. - * @property {number} nearestGridY - nearest grid index related with mouseY value. - * @property {number} nearestGridTimeY - time value for nearestGridY. - * @property {number[]} createRange - milliseconds range between drag start and end to create. - */ - this._onDrag(dragEndEventData, 'timeCreationDragend', reviseFunc); - - this._dragStart = this._getScheduleDataFunc = null; -}; - -/** - * Drag#click event handler - * @emits TimeCreation#timeCreationClick - * @param {object} clickEventData - event data from Drag#click. - */ -TimeCreation.prototype._onClick = function(clickEventData) { - var self = this; - var condResult, getScheduleDataFunc, eventData; - - this.dragHandler.off({ - drag: this._onDrag, - dragEnd: this._onDragEnd - }, this); - - condResult = this.checkExpectedCondition(clickEventData.target); - if (!condResult || this._disableClick) { - return; - } - - getScheduleDataFunc = this._retriveScheduleData(condResult); - eventData = getScheduleDataFunc(clickEventData.originEvent); - - this._requestOnClick = true; - setTimeout(function() { - if (self._requestOnClick) { - self.fire('timeCreationClick', eventData); - self._createSchedule(eventData); - } - self._requestOnClick = false; - }, CLICK_DELAY); - this._dragStart = this._getScheduleDataFunc = null; -}; - -/** - * Dblclick event handler - * @param {MouseEvent} e - Native MouseEvent - */ -TimeCreation.prototype._onDblClick = function(e) { - var condResult, getScheduleDataFunc, eventData; - - condResult = this.checkExpectedCondition(e.target); - if (!condResult) { - return; - } - - getScheduleDataFunc = this._retriveScheduleData(condResult); - eventData = getScheduleDataFunc(e); - - this.fire('timeCreationClick', eventData); - - this._createSchedule(eventData); - - this._requestOnClick = false; -}; - -/** - * Invoke creation click - * @param {Schedule} schedule - schedule instance - */ -TimeCreation.prototype.invokeCreationClick = function(schedule) { - var opt = this.timeGridView.options, - range = datetime.range( - opt.renderStartDate, - opt.renderEndDate, - datetime.MILLISECONDS_PER_DAY), - hourStart = opt.hourStart, - targetDate = schedule.start; - var eventData, timeView; - - util.forEach(range, function(date, index) { - if (datetime.isSameDate(date, targetDate)) { - timeView = this.timeGridView.children.toArray()[index]; - } - }, this); - - // If start date is not in current date, set start date as first date. - if (!timeView) { - timeView = this.timeGridView.children.toArray()[0]; - } - - eventData = this._retriveScheduleDataFromDate(timeView, schedule.start, schedule.end, hourStart); - - this.fire('timeCreationClick', eventData); - - this._createSchedule(eventData); -}; - -timeCore.mixin(TimeCreation); -util.CustomEvents.mixin(TimeCreation); - -module.exports = TimeCreation; - - -/***/ }), - -/***/ "./src/js/handler/time/creationGuide.js": -/*!**********************************************!*\ - !*** ./src/js/handler/time/creationGuide.js ***! - \**********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_657152__) { - -"use strict"; -/* WEBPACK VAR INJECTION */(function(global) {/** - * @fileoverview Module for Time.Creation effect while dragging. - * @author NHN FE Development Lab - */ - - -var common = __nested_webpack_require_657152__(/*! ../../common/common */ "./src/js/common/common.js"); -var datetime = __nested_webpack_require_657152__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); -var config = __nested_webpack_require_657152__(/*! ../../config */ "./src/js/config.js"); -var domutil = __nested_webpack_require_657152__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); -var reqAnimFrame = __nested_webpack_require_657152__(/*! ../../common/reqAnimFrame */ "./src/js/common/reqAnimFrame.js"); -var ratio = __nested_webpack_require_657152__(/*! ../../common/common */ "./src/js/common/common.js").ratio; -var TZDate = __nested_webpack_require_657152__(/*! ../../common/timezone */ "./src/js/common/timezone.js").Date; -var MIN60 = (datetime.MILLISECONDS_PER_MINUTES * 60); - -/** - * Class for Time.Creation dragging effect. - * @constructor - * @param {TimeCreation} timeCreation - instance of TimeCreation. - */ -function TimeCreationGuide(timeCreation) { - /** - * Guide element for creation effect. - * @type {HTMLElement} - */ - this.guideElement = global.document.createElement('div'); - - /** - * @type {HTMLDivElement} - */ - this.guideTimeElement = domutil.appendHTMLElement( - 'span', - this.guideElement, - config.classname('time-guide-creation-label') - ); - - domutil.addClass(this.guideElement, config.classname('time-guide-creation')); - - /** - * @type {TimeCreation} - */ - this.timeCreation = timeCreation; - - /** - * @type {array} - */ - this._styleUnit = null; - - /** - * @type {array} - */ - this._styleStart = null; - - /** - * @type {function} - */ - this._styleFunc = null; - - timeCreation.on({ - timeCreationDragstart: this._createGuideElement, - timeCreationDrag: this._onDrag, - timeCreationClick: this._createGuideElement - }, this); - - this.applyTheme(timeCreation.baseController.theme); -} - -/** - * Destroy method. - */ -TimeCreationGuide.prototype.destroy = function() { - this.clearGuideElement(); - this.timeCreation.off(this); - this.timeCreation = this._styleUnit = this._styleStart = - this._styleFunc = this.guideElement = this.guideTimeElement = null; -}; - -/** - * Clear guide element. - */ -TimeCreationGuide.prototype.clearGuideElement = function() { - var guideElement = this.guideElement, - timeElement = this.guideTimeElement; - - domutil.remove(guideElement); - - reqAnimFrame.requestAnimFrame(function() { - guideElement.style.display = 'none'; - guideElement.style.top = ''; - guideElement.style.height = ''; - timeElement.innerHTML = ''; - }); -}; - -/** - * Refresh guide element - * @param {number} top - The number of guide element's style top - * @param {number} height - The number of guide element's style height - * @param {TZDate} start - start time of schedule to create - * @param {TZDate} end - end time of schedule to create - * @param {boolean} bottomLabel - is label need to render bottom of guide element? - */ -TimeCreationGuide.prototype._refreshGuideElement = function(top, height, start, end, bottomLabel) { - var guideElement = this.guideElement; - var timeElement = this.guideTimeElement; - - guideElement.style.top = top + 'px'; - guideElement.style.height = height + 'px'; - guideElement.style.display = 'block'; - - timeElement.innerHTML = datetime.format(start, 'HH:mm') + - ' - ' + datetime.format(end, 'HH:mm'); - - if (bottomLabel) { - domutil.removeClass(timeElement, config.classname('time-guide-bottom')); - } else { - domutil.addClass(timeElement, config.classname('time-guide-bottom')); - } -}; - -/** - * Get unit data of calculating new style of guide element by user interaction - * @param {Time} relatedView - time view instance related with schedule - * @returns {array} unit data. - */ -TimeCreationGuide.prototype._getUnitData = function(relatedView) { - var viewOpt = relatedView.options, - viewHeight = relatedView.getViewBound().height, - hourLength = viewOpt.hourEnd - viewOpt.hourStart, - todayStart = datetime.parse(viewOpt.ymd), - todayEnd = datetime.getStartOfNextDay(todayStart); - - todayStart.setHours(0, 0, 0, 0); - todayStart.setHours(viewOpt.hourStart); - - // [0] height of view - // [1] hour length of view - // [2] start time of view - // [3] end time of view - // [4] height of view for one hour - return [ - viewHeight, - hourLength, - todayStart, - todayEnd, - viewHeight / hourLength - ]; -}; - -/** - * Applying limitation to supplied data and return it. - * @param {number} top - top pixel of guide element - * @param {number} height - height pixel of guide element - * @param {TZDate} start - relative time value of dragstart point - * @param {TZDate} end - relative time value of dragend point - * @returns {array} limited style data - */ -TimeCreationGuide.prototype._limitStyleData = function(top, height, start, end) { - var unitData = this._styleUnit; - - top = common.limit(top, [0], [unitData[0]]); - height = common.limit(top + height, [0], [unitData[0]]) - top; - start = common.limitDate(start, unitData[2], unitData[3]); - end = common.limitDate(end, unitData[2], unitData[3]); - - return [top, height, start, end]; -}; - -/** - * Get function to calculate guide element UI data from supplied units - * @param {number} viewHeight - total height of view's container element - * @param {number} hourLength - hour length that rendered in time view - * @param {TZDate} todayStart - time for view's start date - * @returns {function} UI data calculator function - */ -TimeCreationGuide.prototype._getStyleDataFunc = function(viewHeight, hourLength, todayStart) { - var todayStartTime = todayStart; - var todayEndTime = datetime.end(todayStart); - - /** - * Get top, time value from schedule data - * @param {object} scheduleData - schedule data object - * @returns {number[]} top, time - */ - function getStyleData(scheduleData) { - var minMinutes = 30; - var gridY = scheduleData.nearestGridY, - gridTimeY = scheduleData.nearestGridTimeY, - gridEndTimeY = scheduleData.nearestGridEndTimeY || new TZDate(gridTimeY).addMinutes(minMinutes), - top, startTime, endTime; - - top = common.limit(ratio(hourLength, viewHeight, gridY), [0], [viewHeight]); - startTime = common.limitDate(gridTimeY, todayStartTime, todayEndTime); - endTime = common.limitDate(gridEndTimeY, todayStartTime, todayEndTime); - - return [top, startTime, endTime]; - } - - return getStyleData; -}; - -/** - * DragStart event handler - * @param {object} dragStartEventData - dragStart schedule data. - */ -TimeCreationGuide.prototype._createGuideElement = function(dragStartEventData) { - var relatedView = dragStartEventData.relatedView, - hourStart = datetime.millisecondsFrom('hour', dragStartEventData.hourStart) || 0, - unitData, styleFunc, styleData, result, top, height, start, end; - - unitData = this._styleUnit = this._getUnitData(relatedView); - styleFunc = this._styleFunc = this._getStyleDataFunc.apply(this, unitData); - styleData = this._styleStart = styleFunc(dragStartEventData); - - start = new TZDate(styleData[1]).addMinutes(datetime.minutesFromHours(hourStart)); - end = new TZDate(styleData[2]).addMinutes(datetime.minutesFromHours(hourStart)); - top = styleData[0]; - height = (unitData[4] * (end - start) / MIN60); - - result = this._limitStyleData( - top, - height, - start, - end - ); - - this._refreshGuideElement.apply(this, result); - - relatedView.container.appendChild(this.guideElement); -}; - -/** - * Drag event handler - * @param {object} dragEventData - drag schedule data. - */ -TimeCreationGuide.prototype._onDrag = function(dragEventData) { - var minutes30 = 30; - var styleFunc = this._styleFunc, - unitData = this._styleUnit, - startStyle = this._styleStart, - refreshGuideElement = this._refreshGuideElement.bind(this), - heightOfHalfHour, - endStyle, - result; - - if (!styleFunc || !unitData || !startStyle) { - return; - } - - heightOfHalfHour = (unitData[4] / 2); - endStyle = styleFunc(dragEventData); - - if (endStyle[0] > startStyle[0]) { - result = this._limitStyleData( - startStyle[0], - (endStyle[0] - startStyle[0]) + heightOfHalfHour, - startStyle[1], - new TZDate(endStyle[1]).addMinutes(minutes30) - ); - } else { - result = this._limitStyleData( - endStyle[0], - (startStyle[0] - endStyle[0]) + heightOfHalfHour, - endStyle[1], - new TZDate(startStyle[1]).addMinutes(minutes30) - ); - result.push(true); - } - - reqAnimFrame.requestAnimFrame(function() { - refreshGuideElement.apply(null, result); - }); -}; - -TimeCreationGuide.prototype.applyTheme = function(theme) { - var style = this.guideElement.style; - var timeStyle = this.guideTimeElement.style; - - // block - style.backgroundColor = theme.common.creationGuide.backgroundColor; - style.border = theme.common.creationGuide.border; - - // label - timeStyle.color = theme.week.creationGuide.color; - timeStyle.fontSize = theme.week.creationGuide.fontSize; - timeStyle.fontWeight = theme.week.creationGuide.fontWeight; -}; - -module.exports = TimeCreationGuide; - -/* WEBPACK VAR INJECTION */}.call(this, __nested_webpack_require_657152__(/*! ./../../../../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) - -/***/ }), - -/***/ "./src/js/handler/time/move.js": -/*!*************************************!*\ - !*** ./src/js/handler/time/move.js ***! - \*************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_667103__) { - -"use strict"; -/** - * @fileoverview Handling move schedules from drag handler and time grid view - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_667103__(/*! tui-code-snippet */ "tui-code-snippet"); -var config = __nested_webpack_require_667103__(/*! ../../config */ "./src/js/config.js"); -var datetime = __nested_webpack_require_667103__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); -var domutil = __nested_webpack_require_667103__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); -var domevent = __nested_webpack_require_667103__(/*! ../../common/domevent */ "./src/js/common/domevent.js"); -var TZDate = __nested_webpack_require_667103__(/*! ../../common/timezone */ "./src/js/common/timezone.js").Date; -var timeCore = __nested_webpack_require_667103__(/*! ./core */ "./src/js/handler/time/core.js"); -var TimeMoveGuide = __nested_webpack_require_667103__(/*! ./moveGuide */ "./src/js/handler/time/moveGuide.js"); - -/** - * @constructor - * @implements {Handler} - * @mixes timeCore - * @mixes util.CustomEvents - * @param {Drag} [dragHandler] - Drag handler instance. - * @param {TimeGrid} [timeGridView] - TimeGrid view instance. - * @param {Base} [baseController] - Base controller instance. - */ -function TimeMove(dragHandler, timeGridView, baseController) { - /** - * @type {Drag} - */ - this.dragHandler = dragHandler; - - /** - * @type {TimeGrid} - */ - this.timeGridView = timeGridView; - - /** - * @type {Base} - */ - this.baseController = baseController; - - /** - * @type {function} - */ - this._getScheduleDataFunc = null; - - /** - * @type {object} - */ - this._dragStart = null; - - /** - * @type {TimeMoveGuide} - */ - this._guide = new TimeMoveGuide(this); - - dragHandler.on('dragStart', this._onDragStart, this); - dragHandler.on('mousedown', this._onMouseDown, this); -} - -/** - * Destroy method. - */ -TimeMove.prototype.destroy = function() { - this._guide.destroy(); - this.dragHandler.off(this); - this.dragHandler = this.timeGridView = this.baseController = - this._getScheduleDataFunc = this._dragStart = this._guide = null; -}; - -/** - * Check target element is expected condition for activate this plugins. - * @param {HTMLElement} target - The element to check - * @returns {boolean|object} - return object when satiate condition. - */ -TimeMove.prototype.checkExpectCondition = function(target) { - if (!domutil.closest(target, config.classname('.time-schedule'))) { - return false; - } - - return this._getTimeView(target); -}; - -/** - * Get Time view container from supplied element. - * @param {HTMLElement} target - element to find time view container. - * @returns {object|boolean} - return time view instance when finded. - */ -TimeMove.prototype._getTimeView = function(target) { - var container = domutil.closest(target, config.classname('.time-date')), - matches; - - if (!container) { - return false; - } - - matches = domutil.getClass(container).match(config.time.getViewIDRegExp); - - if (!matches || matches.length < 2) { - return false; - } - - return util.pick(this.timeGridView.children.items, Number(matches[1])); -}; - -/** - * @emits TimeMove#mousedown - * @param {object} mouseDownEventData - Drag#mousedown schedule data. - */ -TimeMove.prototype._onMouseDown = function(mouseDownEventData) { - var target = mouseDownEventData.target, - timeView = this.checkExpectCondition(target), - blockElement = domutil.closest(target, config.classname('.time-date-schedule-block')); - - if (!timeView || !blockElement) { - return; - } - - // EventTarget.target is not changed in mousemove event even if mouse is over the other element. - // It's different with other browsers(IE, Chrome, Safari) - if (util.browser.firefox) { - domevent.preventDefault(mouseDownEventData.originEvent); - } -}; - -/** - * @emits TimeMove#timeMoveDragstart - * @param {object} dragStartEventData - Drag#dragStart schedule data. - */ -TimeMove.prototype._onDragStart = function(dragStartEventData) { - var target = dragStartEventData.target, - timeView = this.checkExpectCondition(target), - blockElement = domutil.closest(target, config.classname('.time-date-schedule-block')), - getScheduleDataFunc, - scheduleData, - ctrl = this.baseController, - targetModelID, - targetModel; - - if (!timeView || !blockElement) { - return; - } - - targetModelID = domutil.getData(blockElement, 'id'); - targetModel = ctrl.schedules.items[targetModelID]; - - if (targetModel.isReadOnly) { - return; - } - - getScheduleDataFunc = this._getScheduleDataFunc = this._retriveScheduleData(timeView); - scheduleData = this._dragStart = getScheduleDataFunc( - dragStartEventData.originEvent, { - targetModelID: targetModelID, - model: targetModel - } - ); - - this.dragHandler.on({ - drag: this._onDrag, - dragEnd: this._onDragEnd, - click: this._onClick - }, this); - - /** - * @event TimeMove#timeMoveDragstart - * @type {object} - * @property {HTMLElement} target - current target in mouse event object. - * @property {Time} relatedView - time view instance related with mouse position. - * @property {MouseEvent} originEvent - mouse event object. - * @property {number} mouseY - mouse Y px mouse event. - * @property {number} gridY - grid Y index value related with mouseY value. - * @property {number} timeY - milliseconds value of mouseY points. - * @property {number} nearestGridY - nearest grid index related with mouseY value. - * @property {number} nearestGridTimeY - time value for nearestGridY. - * @property {string} targetModelID - The model unique id emitted move schedule. - * @property {Schedule} model - model instance - */ - this.fire('timeMoveDragstart', scheduleData); -}; - -/** - * @emits TimeMove#timeMoveDrag - * @param {MouseEvent} dragEventData - mousemove event object - * @param {string} [overrideEventName] - name of emitting event to override. - * @param {function} [revise] - supply function for revise schedule data before emit. - */ -TimeMove.prototype._onDrag = function(dragEventData, overrideEventName, revise) { - var getScheduleDataFunc = this._getScheduleDataFunc, - timeView = this._getTimeView(dragEventData.target), - dragStart = this._dragStart, - scheduleData; - - if (!timeView || !getScheduleDataFunc || !dragStart) { - return; - } - - scheduleData = getScheduleDataFunc(dragEventData.originEvent, { - currentView: timeView, - targetModelID: dragStart.targetModelID - }); - - if (revise) { - revise(scheduleData); - } - - /** - * @event TimeMove#timeMoveDrag - * @type {object} - * @property {HTMLElement} target - current target in mouse event object. - * @property {Time} relatedView - time view instance related with drag start position. - * @property {MouseEvent} originEvent - mouse event object. - * @property {number} mouseY - mouse Y px mouse event. - * @property {number} gridY - grid Y index value related with mouseY value. - * @property {number} timeY - milliseconds value of mouseY points. - * @property {number} nearestGridY - nearest grid index related with mouseY value. - * @property {number} nearestGridTimeY - time value for nearestGridY. - * @property {Time} currentView - time view instance related with current mouse position. - * @property {string} targetModelID - The model unique id emitted move schedule. - */ - this.fire(overrideEventName || 'timeMoveDrag', scheduleData); -}; - -/** - * Update model instance by dragend event results. - * @fires TimeMove#beforeUpdateSchedule - * @param {object} scheduleData - schedule data from TimeMove#timeMoveDragend - */ -TimeMove.prototype._updateSchedule = function(scheduleData) { - var ctrl = this.baseController, - modelID = scheduleData.targetModelID, - range = scheduleData.nearestRange, - timeDiff = range[1] - range[0], - dateDiff = 0, - schedule = ctrl.schedules.items[modelID], - relatedView = scheduleData.relatedView, - currentView = scheduleData.currentView, - newStarts, - newEnds; - - if (!schedule || !currentView) { - return; - } - - timeDiff -= datetime.millisecondsFrom('minutes', 30); - newStarts = new TZDate(schedule.getStarts()).addMilliseconds(timeDiff); - newEnds = new TZDate(schedule.getEnds()).addMilliseconds(timeDiff); - - if (currentView) { - dateDiff = currentView.getDate() - relatedView.getDate(); - } - - newStarts.addMilliseconds(dateDiff); - newEnds.addMilliseconds(dateDiff); - - /** - * @event TimeMove#beforeUpdateSchedule - * @type {object} - * @property {Schedule} schedule - The original schedule instance - * @property {Date} start - Deprecated: start time to update - * @property {Date} end - Deprecated: end time to update - * @property {object} changes - start and end time to update - * @property {Date} start - start time to update - * @property {Date} end - end time to update - */ - this.fire('beforeUpdateSchedule', { - schedule: schedule, - changes: { - start: newStarts, - end: newEnds - }, - start: newStarts, - end: newEnds - }); -}; - -/** - * @emits TimeMove#timeMoveDragend - * @param {MouseEvent} dragEndEventData - mouseup mouse event object. - */ -TimeMove.prototype._onDragEnd = function(dragEndEventData) { - var getScheduleDataFunc = this._getScheduleDataFunc, - currentView = this._getTimeView(dragEndEventData.target), - dragStart = this._dragStart, - scheduleData; - - this.dragHandler.off({ - drag: this._onDrag, - dragEnd: this._onDragEnd, - click: this._onClick - }, this); - - if (!getScheduleDataFunc || !dragStart) { - return; - } - - scheduleData = getScheduleDataFunc(dragEndEventData.originEvent, { - currentView: currentView, - targetModelID: dragStart.targetModelID - }); - - scheduleData.range = [ - dragStart.timeY, - new TZDate(scheduleData.timeY).addMinutes(30) - ]; - - scheduleData.nearestRange = [ - dragStart.nearestGridTimeY, - new TZDate(scheduleData.nearestGridTimeY).addMinutes(30) - ]; - - this._updateSchedule(scheduleData); - - /** - * @event TimeMove#timeMoveDragend - * @type {object} - * @property {HTMLElement} target - current target in mouse event object. - * @property {Time} relatedView - time view instance related with drag start position. - * @property {Time} currentView - time view instance related with current mouse position. - * @property {MouseEvent} originEvent - mouse event object. - * @property {number} mouseY - mouse Y px mouse event. - * @property {number} gridY - grid Y index value related with mouseY value. - * @property {number} timeY - milliseconds value of mouseY points. - * @property {number} nearestGridY - nearest grid index related with mouseY value. - * @property {number} nearestGridTimeY - time value for nearestGridY. - * @property {string} targetModelID - The model unique id emitted move schedule. - * @property {number[]} range - milliseconds range between drag start and end. - * @property {number[]} nearestRange - milliseconds range related with nearestGridY between start and end. - */ - this.fire('timeMoveDragend', scheduleData); -}; - -/** - * @emits TimeMove#timeMoveClick - * @param {MouseEvent} clickEventData - click mouse event object. - */ -TimeMove.prototype._onClick = function(clickEventData) { - var getScheduleDataFunc = this._getScheduleDataFunc, - dragStart = this._dragStart, - scheduleData; - - this.dragHandler.off({ - drag: this._onDrag, - dragEnd: this._onDragEnd, - click: this._onClick - }, this); - - if (!getScheduleDataFunc || !dragStart) { - return; - } - - scheduleData = getScheduleDataFunc(clickEventData.originEvent, { - targetModelID: dragStart.targetModelID - }); - - /** - * @event TimeMove#timeMoveClick - * @type {object} - * @property {HTMLElement} target - current target in mouse event object. - * @property {Time} relatedView - time view instance related with drag start position. - * @property {MouseEvent} originEvent - mouse event object. - * @property {number} mouseY - mouse Y px mouse event. - * @property {number} gridY - grid Y index value related with mouseY value. - * @property {number} timeY - milliseconds value of mouseY points. - * @property {number} nearestGridY - nearest grid index related with mouseY value. - * @property {number} nearestGridTimeY - time value for nearestGridY. - * @property {string} targetModelID - The model unique id emitted move schedule. - */ - this.fire('timeMoveClick', scheduleData); -}; - -timeCore.mixin(TimeMove); -util.CustomEvents.mixin(TimeMove); - -module.exports = TimeMove; - - -/***/ }), - -/***/ "./src/js/handler/time/moveGuide.js": -/*!******************************************!*\ - !*** ./src/js/handler/time/moveGuide.js ***! - \******************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_680304__) { - -"use strict"; -/* WEBPACK VAR INJECTION */(function(global) {/** - * @fileoverview Module for Time.Move effect while dragging. - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_680304__(/*! tui-code-snippet */ "tui-code-snippet"); -var config = __nested_webpack_require_680304__(/*! ../../config */ "./src/js/config.js"); -var domutil = __nested_webpack_require_680304__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); -var reqAnimFrame = __nested_webpack_require_680304__(/*! ../../common/reqAnimFrame */ "./src/js/common/reqAnimFrame.js"); -var ratio = __nested_webpack_require_680304__(/*! ../../common/common */ "./src/js/common/common.js").ratio; -var FloatingLayer = __nested_webpack_require_680304__(/*! ../../common/floatingLayer */ "./src/js/common/floatingLayer.js"); -var tmpl = __nested_webpack_require_680304__(/*! ../../view/template/week/timeMoveGuide.hbs */ "./src/js/view/template/week/timeMoveGuide.hbs"); -var TZDate = __nested_webpack_require_680304__(/*! ../../common/timezone */ "./src/js/common/timezone.js").Date; -var Schedule = __nested_webpack_require_680304__(/*! ../../model/schedule */ "./src/js/model/schedule.js"); -var datetime = __nested_webpack_require_680304__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); -var common = __nested_webpack_require_680304__(/*! ../../common/common */ "./src/js/common/common.js"); - -var SCHEDULE_MIN_DURATION = datetime.MILLISECONDS_SCHEDULE_MIN_DURATION; - -/** - * Class for Time.Move effect. - * @constructor - * @param {TimeMove} timeMove - The instance of TimeMove. - */ -function TimeMoveGuide(timeMove) { - /** - * @type {FloatingLayer} - */ - this._guideLayer = null; - - /** - * @Type {Schedule} - */ - this._model = null; - - /** - * @type {object} - */ - this._viewModel = null; - - /** - * @type {object} - */ - this._lastDrag = null; - - /** - * @type {HTMLElement} - */ - this.guideElement = null; - - /** - * @type {TimeMove} - */ - this.timeMove = timeMove; - - /** - * @type {HTMLElement} - */ - this._container = null; - - /** - * @type {function} - */ - this._getTopFunc = null; - - /** - * @type {number} - */ - this._startGridY = 0; - - /** - * @type {number} - */ - this._startTopPixel = 0; - - timeMove.on({ - 'timeMoveDragstart': this._onDragStart, - 'timeMoveDrag': this._onDrag, - 'timeMoveDragend': this._clearGuideElement, - 'timeMoveClick': this._clearGuideElement - }, this); -} - -/** - * Destroy method - */ -TimeMoveGuide.prototype.destroy = function() { - this._clearGuideElement(); - this.timeMove.off(this); - if (this._guideLayer) { - this._guideLayer.destroy(); - } - this.guideElement = this.timeMove = this._container = this._guideLayer = this._lastDrag = - this._getTopFunc = this._startGridY = this._startTopPixel = this._viewModel = null; -}; - -/** - * Clear guide element. - */ -TimeMoveGuide.prototype._clearGuideElement = function() { - if (!util.browser.msie) { - domutil.removeClass(global.document.body, config.classname('dragging')); - } - if (this._guideLayer) { - this._guideLayer.destroy(); - } - - this._showOriginScheduleBlocks(); - - this.guideElement = this._getTopFunc = this._guideLayer = this._model = this._lastDrag = - this._startGridY = this._startTopPixel = this._viewModel = null; -}; - -/** - * Dim element blocks - * @param {number} modelID - Schedule model instance ID - */ -TimeMoveGuide.prototype._hideOriginScheduleBlocks = function() { - var className = config.classname('time-date-schedule-block-dragging-dim'); - if (this.guideElement) { - domutil.addClass(this.guideElement, className); - } -}; - -/** - * Show element blocks - */ -TimeMoveGuide.prototype._showOriginScheduleBlocks = function() { - var className = config.classname('time-date-schedule-block-dragging-dim'); - if (this.guideElement) { - domutil.removeClass(this.guideElement, className); - } -}; - -/** - * Refresh guide element - * @param {string} top - guide element's style top. - * @param {Schedule} model - updated model - * @param {object} viewModel - view model - */ -TimeMoveGuide.prototype._refreshGuideElement = function(top, model, viewModel) { - var self = this; - - reqAnimFrame.requestAnimFrame(function() { - if (!self._guideLayer) { - return; - } - self._guideLayer.setPosition(0, top); - self._guideLayer.setContent(tmpl(util.extend({model: model}, viewModel))); - }); -}; - -/** - * TimeMove#timeMoveDragstart event handler - * @param {object} dragStartEventData - dragstart event data - */ -TimeMoveGuide.prototype._onDragStart = function(dragStartEventData) { - var guideElement = domutil.closest( - dragStartEventData.target, - config.classname('.time-date-schedule-block') - ); - var duration, modelDuration, goingDuration, comingDuration; - - if (!guideElement) { - return; - } - - this._startTopPixel = parseFloat(guideElement.style.top); - this._startGridY = dragStartEventData.nearestGridY; - this.guideElement = guideElement; - this._container = dragStartEventData.relatedView.container; - - this._model = util.extend( - Schedule.create(dragStartEventData.model), - dragStartEventData.model - ); - - modelDuration = this._model.duration(); - modelDuration = modelDuration > SCHEDULE_MIN_DURATION ? modelDuration : SCHEDULE_MIN_DURATION; - goingDuration = datetime.millisecondsFrom('minutes', this._model.goingDuration); - comingDuration = datetime.millisecondsFrom('minutes', this._model.comingDuration); - duration = goingDuration + modelDuration + comingDuration; - - this._lastDrag = dragStartEventData; - this._viewModel = { - hasGoingDuration: goingDuration > 0, - hasComingDuration: comingDuration > 0, - goingDurationHeight: common.ratio(duration, goingDuration, 100), - modelDurationHeight: common.ratio(duration, modelDuration, 100), - comingDurationHeight: common.ratio(duration, comingDuration, 100) - }; - - this._resetGuideLayer(); - this._hideOriginScheduleBlocks(); -}; - -/** - * TimeMove#timeMoveDrag event handler - * @param {object} dragEventData - drag event data - */ -TimeMoveGuide.prototype._onDrag = function(dragEventData) { - var timeView = dragEventData.currentView, - viewOptions = timeView.options, - viewHeight = timeView.getViewBound().height, - guideHeight = parseFloat(this.guideElement.style.height), - hourLength = viewOptions.hourEnd - viewOptions.hourStart, - gridYOffset = dragEventData.nearestGridY - this._startGridY, - gridYOffsetPixel = ratio(hourLength, viewHeight, gridYOffset), - gridDiff = dragEventData.nearestGridY - this._lastDrag.nearestGridY, - bottomLimit, - top; - - if (!util.browser.msie) { - domutil.addClass(global.document.body, config.classname('dragging')); - } - - if (this._container !== timeView.container) { - this._container = timeView.container; - this._resetGuideLayer(); - } - - top = this._startTopPixel + gridYOffsetPixel; - bottomLimit = viewHeight - guideHeight; - - top = Math.max(top, 0); - top = Math.min(top, bottomLimit); - - // update time - this._model.start = new TZDate(this._model.getStarts()).addMinutes(datetime.minutesFromHours(gridDiff)); - this._model.end = new TZDate(this._model.getEnds()).addMinutes(datetime.minutesFromHours(gridDiff)); - this._lastDrag = dragEventData; - - this._refreshGuideElement(top, this._model, this._viewModel); -}; - -TimeMoveGuide.prototype._resetGuideLayer = function() { - if (this._guideLayer) { - this._guideLayer.destroy(); - this._guideLayer = null; - } - this._guideLayer = new FloatingLayer(null, this._container); - this._guideLayer.setSize(this._container.getBoundingClientRect().width, this.guideElement.style.height); - this._guideLayer.setPosition(0, this.guideElement.style.top); - this._guideLayer.setContent(tmpl(util.extend({model: this._model}, this._viewModel))); - this._guideLayer.show(); -}; - -module.exports = TimeMoveGuide; - -/* WEBPACK VAR INJECTION */}.call(this, __nested_webpack_require_680304__(/*! ./../../../../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) - -/***/ }), - -/***/ "./src/js/handler/time/resize.js": -/*!***************************************!*\ - !*** ./src/js/handler/time/resize.js ***! - \***************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_688744__) { - -"use strict"; -/** - * @fileoverview Handling resize schedules from drag handler and time grid view - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_688744__(/*! tui-code-snippet */ "tui-code-snippet"); -var config = __nested_webpack_require_688744__(/*! ../../config */ "./src/js/config.js"); -var datetime = __nested_webpack_require_688744__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); -var domutil = __nested_webpack_require_688744__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); -var TZDate = __nested_webpack_require_688744__(/*! ../../common/timezone */ "./src/js/common/timezone.js").Date; -var common = __nested_webpack_require_688744__(/*! ../../common/common */ "./src/js/common/common.js"); -var timeCore = __nested_webpack_require_688744__(/*! ./core */ "./src/js/handler/time/core.js"); -var TimeResizeGuide = __nested_webpack_require_688744__(/*! ./resizeGuide */ "./src/js/handler/time/resizeGuide.js"); - -/** - * @constructor - * @implements {Handler} - * @mixes timeCore - * @mixes util.CustomEvents - * @param {Drag} [dragHandler] - Drag handler instance. - * @param {TimeGrid} [timeGridView] - TimeGrid view instance. - * @param {Base} [baseController] - Base controller instance. - */ -function TimeResize(dragHandler, timeGridView, baseController) { - /** - * @type {Drag} - */ - this.dragHandler = dragHandler; - - /** - * @type {TimeGrid} - */ - this.timeGridView = timeGridView; - - /** - * @type {Base} - */ - this.baseController = baseController; - - /** - * @type {function} - */ - this._getScheduleDataFunc = null; - - /** - * @type {object} - */ - this._dragStart = null; - - /** - * @type {TimeResizeGuide} - */ - this._guide = new TimeResizeGuide(this); - - dragHandler.on('dragStart', this._onDragStart, this); -} - -/** - * Destroy method - */ -TimeResize.prototype.destroy = function() { - this._guide.destroy(); - this.dragHandler.off(this); - this.dragHandler = this.timeGridView = this.baseController = - this._getScheduleDataFunc = this._dragStart = this._guide = null; -}; - -/** - * @param {HTMLElement} target - element to check condition. - * @returns {object|boolean} - return time view instance or false - */ -TimeResize.prototype.checkExpectCondition = function(target) { - var container, - matches; - - if (!domutil.hasClass(target, config.classname('time-resize-handle'))) { - return false; - } - - container = domutil.closest(target, config.classname('.time-date')); - - if (!container) { - return false; - } - - matches = domutil.getClass(container).match(config.time.getViewIDRegExp); - - if (!matches || matches.length < 2) { - return false; - } - - return util.pick(this.timeGridView.children.items, Number(matches[1])); -}; - -/** - * @emits TimeResize#timeResizeDragstart - * @param {object} dragStartEventData - event data of Drag#dragstart - */ -TimeResize.prototype._onDragStart = function(dragStartEventData) { - var target = dragStartEventData.target, - timeView = this.checkExpectCondition(target), - blockElement = domutil.closest(target, config.classname('.time-date-schedule-block')), - ctrl = this.baseController, - targetModelID, - getScheduleDataFunc, - scheduleData; - - if (!timeView || !blockElement) { - return; - } - - targetModelID = domutil.getData(blockElement, 'id'); - getScheduleDataFunc = this._getScheduleDataFunc = this._retriveScheduleData(timeView); - scheduleData = this._dragStart = getScheduleDataFunc( - dragStartEventData.originEvent, { - targetModelID: targetModelID, - schedule: ctrl.schedules.items[targetModelID] - } - ); - - this.dragHandler.on({ - drag: this._onDrag, - dragEnd: this._onDragEnd, - click: this._onClick - }, this); - - /** - * @event TimeResize#timeResizeDragstart - * @type {object} - * @property {HTMLElement} target - current target in mouse event object. - * @property {Time} relatedView - time view instance related with mouse position. - * @property {MouseEvent} originEvent - mouse event object. - * @property {number} mouseY - mouse Y px mouse event. - * @property {number} gridY - grid Y index value related with mouseY value. - * @property {number} timeY - milliseconds value of mouseY points. - * @property {number} nearestGridY - nearest grid index related with mouseY value. - * @property {number} nearestGridTimeY - time value for nearestGridY. - * @property {string} targetModelID - The model unique id emitted move schedule. - * @property {Schedule} schedule - schedule data - */ - this.fire('timeResizeDragstart', scheduleData); -}; - -/** - * Drag#drag event handler - * @emits TimeResize#timeResizeDrag - * @param {object} dragEventData - event data of Drag#drag custom event. - * @param {string} [overrideEventName] - override emitted event name when supplied. - * @param {function} [revise] - supply function for revise schedule data before emit. - */ -TimeResize.prototype._onDrag = function(dragEventData, overrideEventName, revise) { - var getScheduleDataFunc = this._getScheduleDataFunc, - startScheduleData = this._dragStart, - scheduleData; - - if (!getScheduleDataFunc || !startScheduleData) { - return; - } - - scheduleData = getScheduleDataFunc(dragEventData.originEvent, { - targetModelID: startScheduleData.targetModelID - }); - - if (revise) { - revise(scheduleData); - } - - /** - * @event TimeResize#timeResizeDrag - * @type {object} - * @property {HTMLElement} target - current target in mouse event object. - * @property {Time} relatedView - time view instance related with drag start position. - * @property {MouseEvent} originEvent - mouse event object. - * @property {number} mouseY - mouse Y px mouse event. - * @property {number} gridY - grid Y index value related with mouseY value. - * @property {number} timeY - milliseconds value of mouseY points. - * @property {number} nearestGridY - nearest grid index related with mouseY value. - * @property {number} nearestGridTimeY - time value for nearestGridY. - * @property {string} targetModelID - The model unique id emitted move schedule. - */ - this.fire(overrideEventName || 'timeResizeDrag', scheduleData); -}; - -/** - * Update model instance by dragend event results. - * @fires TimeResize#beforeUpdateSchedule - * @param {object} scheduleData - schedule data from TimeResize#timeResizeDragend - */ -TimeResize.prototype._updateSchedule = function(scheduleData) { - var ctrl = this.baseController, - modelID = scheduleData.targetModelID, - range = scheduleData.nearestRange, - timeDiff = range[1] - range[0], - schedule = ctrl.schedules.items[modelID], - relatedView = scheduleData.relatedView, - dateEnd, - newEnds, - baseDate; - var changes; - - if (!schedule) { - return; - } - - timeDiff -= datetime.millisecondsFrom('minutes', 30); - - baseDate = new TZDate(relatedView.getDate()); - dateEnd = datetime.end(baseDate); - newEnds = new TZDate(schedule.getEnds()).addMilliseconds(timeDiff); - - if (newEnds > dateEnd) { - newEnds = new TZDate(dateEnd); - } - - if (newEnds.getTime() - schedule.getStarts().getTime() < datetime.millisecondsFrom('minutes', 30)) { - newEnds = new TZDate(schedule.getStarts()).addMinutes(30); - } - - changes = common.getScheduleChanges( - schedule, - ['end'], - {end: newEnds} - ); - - /** - * @event TimeResize#beforeUpdateSchedule - * @type {object} - * @property {Schedule} schedule - The original schedule instance - * @property {Date} start - Deprecated: start time to update - * @property {Date} end - Deprecated: end time to update - * @property {object} changes - end time to update - * @property {date} end - end time to update - */ - this.fire('beforeUpdateSchedule', { - schedule: schedule, - changes: changes, - start: schedule.getStarts(), - end: newEnds - }); -}; - -/** - * Drag#dragEnd event handler - * @emits TimeResize#timeResizeDragend - * @param {MouseEvent} dragEndEventData - Mouse event of Drag#dragEnd custom event. - */ -TimeResize.prototype._onDragEnd = function(dragEndEventData) { - var getScheduleDataFunc = this._getScheduleDataFunc, - dragStart = this._dragStart, - scheduleData; - - this.dragHandler.off({ - drag: this._onDrag, - dragEnd: this._onDragEnd, - click: this._onClick - }, this); - - if (!getScheduleDataFunc || !dragStart) { - return; - } - - scheduleData = getScheduleDataFunc(dragEndEventData.originEvent, { - targetModelID: dragStart.targetModelID - }); - - scheduleData.range = [ - dragStart.timeY, - new TZDate(scheduleData.timeY).addMinutes(30) - ]; - - scheduleData.nearestRange = [ - dragStart.nearestGridTimeY, - scheduleData.nearestGridTimeY.addMinutes(30) - ]; - - this._updateSchedule(scheduleData); - - /** - * @event TimeResize#timeResizeDragend - * @type {object} - * @property {HTMLElement} target - current target in mouse event object. - * @property {Time} relatedView - time view instance related with drag start position. - * @property {MouseEvent} originEvent - mouse event object. - * @property {number} mouseY - mouse Y px mouse event. - * @property {number} gridY - grid Y index value related with mouseY value. - * @property {number} timeY - milliseconds value of mouseY points. - * @property {number} nearestGridY - nearest grid index related with mouseY value. - * @property {number} nearestGridTimeY - time value for nearestGridY. - * @property {string} targetModelID - The model unique id emitted move schedule. - * @property {number[]} range - milliseconds range between drag start and end. - * @property {number[]} nearestRange - milliseconds range related with nearestGridY between start and end. - */ - this.fire('timeResizeDragend', scheduleData); - - this._getScheduleDataFunc = this._dragStart = null; -}; - -/** - * @emits TimeResize#timeResizeClick - */ -TimeResize.prototype._onClick = function() { - this.dragHandler.off({ - drag: this._onDrag, - dragEnd: this._onDragEnd, - click: this._onClick - }, this); - - /** - * @event TimeResize#timeResizeClick - */ - this.fire('timeResizeClick'); -}; - -timeCore.mixin(TimeResize); -util.CustomEvents.mixin(TimeResize); - -module.exports = TimeResize; - - -/***/ }), - -/***/ "./src/js/handler/time/resizeGuide.js": -/*!********************************************!*\ - !*** ./src/js/handler/time/resizeGuide.js ***! - \********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_699508__) { - -"use strict"; -/* WEBPACK VAR INJECTION */(function(global) {/** - * @fileoverview Module for Time.Resize effect while dragging. - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_699508__(/*! tui-code-snippet */ "tui-code-snippet"); -var config = __nested_webpack_require_699508__(/*! ../../config */ "./src/js/config.js"); -var domutil = __nested_webpack_require_699508__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); -var reqAnimFrame = __nested_webpack_require_699508__(/*! ../../common/reqAnimFrame */ "./src/js/common/reqAnimFrame.js"); -var ratio = __nested_webpack_require_699508__(/*! ../../common/common */ "./src/js/common/common.js").ratio; -var datetime = __nested_webpack_require_699508__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); - -/** - * Class for Time.Resize effect. - * @constructor - * @param {TimeResize} timeResize - the instance of TimeResize handler. - */ -function TimeResizeGuide(timeResize) { - /** - * @type {HTMLElement} - */ - this.guideElement = null; - - /** - * @type {TimeResize} - */ - this.timeResize = timeResize; - - /** - * @type {function} - */ - this._getTopFunc = null; - - /** - * @type {HTMLElement} - */ - this._originScheduleElement = null; - - /** - * @type {number} - */ - this._startTopPixel = 0; - - /** - * @type {number} - */ - this._startHeightPixel = 0; - - /** - * @type {number} - */ - this._startGridY = 0; - - /** - * @type {Schedule} - */ - this._schedule = null; - - timeResize.on({ - 'timeResizeDragstart': this._onDragStart, - 'timeResizeDrag': this._onDrag, - 'timeResizeDragend': this._clearGuideElement, - 'timeResizeClick': this._clearGuideElement - }, this); -} - -/** - * Destroy method - */ -TimeResizeGuide.prototype.destroy = function() { - this._clearGuideElement(); - this.timeResize.off(this); - this.guideElement = this.timeResize = this._getTopFunc = - this._originScheduleElement = this._startHeightPixel = - this._startGridY = this._startTopPixel = null; -}; - -/** - * Clear guide element. - */ -TimeResizeGuide.prototype._clearGuideElement = function() { - var guideElement = this.guideElement, - originElement = this._originScheduleElement; - - if (!util.browser.msie) { - domutil.removeClass(global.document.body, config.classname('resizing')); - } - - if (originElement) { - originElement.style.display = 'block'; - } - - domutil.remove(guideElement); - - this.guideElement = this._getTopFunc = this._originScheduleElement = - this._startHeightPixel = this._startGridY = this._startTopPixel = null; -}; - -/** - * Refresh guide element - * @param {number} guideHeight - guide element's style height. - * @param {number} minTimeHeight - time element's min height - * @param {number} timeHeight - time element's height. - */ -TimeResizeGuide.prototype._refreshGuideElement = function(guideHeight, minTimeHeight, timeHeight) { - var guideElement = this.guideElement; - var timeElement; - - if (!guideElement) { - return; - } - - timeElement = domutil.find(config.classname('.time-schedule-content-time'), guideElement); - - reqAnimFrame.requestAnimFrame(function() { - guideElement.style.height = guideHeight + 'px'; - guideElement.style.display = 'block'; - - if (timeElement) { - timeElement.style.height = timeHeight + 'px'; - timeElement.style.minHeight = minTimeHeight + 'px'; - } - }); -}; - -/** - * TimeMove#timeMoveDragstart event handler - * @param {object} dragStartEventData - dragstart event data - */ -TimeResizeGuide.prototype._onDragStart = function(dragStartEventData) { - var originElement = domutil.closest( - dragStartEventData.target, - config.classname('.time-date-schedule-block') - ), - schedule = dragStartEventData.schedule, - guideElement; - - if (!util.browser.msie) { - domutil.addClass(global.document.body, config.classname('resizing')); - } - - if (!originElement || !schedule) { - return; - } - - this._startGridY = dragStartEventData.nearestGridY; - this._startHeightPixel = parseFloat(originElement.style.height); - this._startTopPixel = parseFloat(originElement.style.top); - - this._originScheduleElement = originElement; - this._schedule = schedule; - - guideElement = this.guideElement = originElement.cloneNode(true); - domutil.addClass(guideElement, config.classname('time-guide-resize')); - - originElement.style.display = 'none'; - dragStartEventData.relatedView.container.appendChild(guideElement); -}; - -/** - * @param {object} dragEventData - event data from Drag#drag. - */ -TimeResizeGuide.prototype._onDrag = function(dragEventData) { - var timeView = dragEventData.relatedView, - viewOptions = timeView.options, - viewHeight = timeView.getViewBound().height, - hourLength = viewOptions.hourEnd - viewOptions.hourStart, - guideElement = this.guideElement, - guideTop = parseFloat(guideElement.style.top), - gridYOffset = dragEventData.nearestGridY - this._startGridY, - // hourLength : viewHeight = gridYOffset : X; - gridYOffsetPixel = ratio(hourLength, viewHeight, gridYOffset), - goingDuration = this._schedule.goingDuration, - modelDuration = this._schedule.duration() / datetime.MILLISECONDS_PER_MINUTES, - comingDuration = this._schedule.comingDuration, - minutesLength = hourLength * 60, - timeHeight, - timeMinHeight, - minHeight, - maxHeight, - height; - - height = (this._startHeightPixel + gridYOffsetPixel); - // at least large than 30min from schedule start time. - minHeight = guideTop + ratio(hourLength, viewHeight, 0.5); - minHeight -= this._startTopPixel; - timeMinHeight = minHeight; - minHeight += ratio(minutesLength, viewHeight, goingDuration) + ratio(minutesLength, viewHeight, comingDuration); - // smaller than 24h - maxHeight = viewHeight - guideTop; - - height = Math.max(height, minHeight); - height = Math.min(height, maxHeight); - - timeHeight = ratio(minutesLength, viewHeight, modelDuration) + gridYOffsetPixel; - - this._refreshGuideElement(height, timeMinHeight, timeHeight); -}; - -module.exports = TimeResizeGuide; - -/* WEBPACK VAR INJECTION */}.call(this, __nested_webpack_require_699508__(/*! ./../../../../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) - -/***/ }), - -/***/ "./src/js/model/schedule.js": -/*!**********************************!*\ - !*** ./src/js/model/schedule.js ***! - \**********************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_706166__) { - -"use strict"; -/* eslint complexity: 0 */ -/** - * @fileoverview Model of schedule. - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_706166__(/*! tui-code-snippet */ "tui-code-snippet"); -var tz = __nested_webpack_require_706166__(/*! ../common/timezone */ "./src/js/common/timezone.js"); -var datetime = __nested_webpack_require_706166__(/*! ../common/datetime */ "./src/js/common/datetime.js"); -var dirty = __nested_webpack_require_706166__(/*! ../common/dirty */ "./src/js/common/dirty.js"); -var model = __nested_webpack_require_706166__(/*! ../common/model */ "./src/js/common/model.js"); -var TZDate = tz.Date; -var MIN_TO_MS = 60 * 1000; - -var SCHEDULE_MIN_DURATION = datetime.MILLISECONDS_SCHEDULE_MIN_DURATION; - -/** - * Schedule category - * @readonly - * @enum {string} - */ -var SCHEDULE_CATEGORY = { - /** milestone */ - MILESTONE: 'milestone', - - /** task */ - TASK: 'task', - - /** all-day schedule */ - ALLDAY: 'allday', - - /** normal schedule */ - TIME: 'time' -}; - -/** - * Get duration by primary timezone - * @param {Date} start render start date - * @param {Date} end render end date - * @returns {number} duration - */ -function getDurationByPrimaryTimezone(start, end) { - var checkOffset = tz.isDifferentOffsetStartAndEndTime(start.getTime(), end.getTime()); - var isOffsetChanged = checkOffset.isOffsetChanged; - var duration = end - start; - - if (isOffsetChanged !== 0) { - duration += checkOffset.offsetDiff * MIN_TO_MS; - } - - return duration; -} - -/** - * Get duration by native timezone - * @param {TZDate} start render start date - * @param {TZDate} end render end date - * @returns {number} duration - */ -function getDurationByNativeTimezone(start, end) { - var startOffset = start.toDate().getTimezoneOffset(); - var endOffset = end.toDate().getTimezoneOffset(); - - return (end - start) + ((endOffset - startOffset) * MIN_TO_MS); -} - -/** - * The model of calendar schedules. - * @constructor - * @mixes dirty - * @mixes model - */ -function Schedule() { - /** - * `Optional` unique id for various use. - * @type {string} - */ - this.id = ''; - - /** - * title for schedule. - * @type {string} - */ - this.title = ''; - - /** - * body for schedule. - * @type {string} - */ - this.body = ''; - - /** - * is schedule is all day schedule? - * @type {boolean} - */ - this.isAllDay = false; - - /** - * schedule start - * @type {TZDate} - */ - this.start = null; - - /** - * schedule end - * @type {TZDate} - */ - this.end = null; - - /** - * schedule text color - * @type {string} - */ - this.color = '#000'; - - /** - * schedule block visibility - * @type {boolean} - */ - this.isVisible = true; - - /** - * schedule background color - * @type {string} - */ - this.bgColor = '#a1b56c'; - - /** - * schedule background color when dragging it - * @type {string} - */ - this.dragBgColor = '#a1b56c'; - - /** - * schedule left border color - * @type {string} - */ - this.borderColor = '#000'; - - /** - * calendar ID - * @type {string} - */ - this.calendarId = ''; - - /** - * Schedule category(milestone, task, allday, time) - * @type {string} - */ - this.category = ''; - - /** - * Classification of work schedules (before work, before lunch, before work) - * @type {string} - */ - this.dueDateClass = ''; - - /** - * Custom style for schedule element - * @type {string} - */ - this.customStyle = ''; - - /** - * in progress flag to do something - * @type {boolean} - */ - this.isPending = false; - - /** - * focused schedule flag - * @type {boolean} - */ - this.isFocused = false; - - /** - * read-only schedule flag - * @type {boolean} - */ - this.isReadOnly = false; - - /** - * private schedule - * @type {boolean} - */ - this.isPrivate = false; - - /** - * location - * @type {string} - */ - this.location = ''; - - /** - * attendees - * @type {Array.} - */ - this.attendees = []; - - /** - * recurrence rule - * @type {any} - */ - this.recurrenceRule = ''; - - /** - * state. 'Busy' is default. - * @type {string} - */ - this.state = ''; - - /** - * travelTime: going-Duration minutes - * @type {number} - */ - this.goingDuration = 0; - - /** - * travelTime: coming-Duration minutes - * @type {number} - */ - this.comingDuration = 0; - - /** - * Separate data storage space independent of rendering. - * @type {object} - */ - this.raw = null; - - // initialize model id - util.stamp(this); -} - -/********** - * static props - **********/ - -Schedule.schema = { - required: ['title'], - dateRange: ['start', 'end'] -}; - -/** - * create schedule model from json(object) data. - * @param {object} data object for model. - * @returns {Schedule} Schedule model instance. - */ -Schedule.create = function(data) { - var inst = new Schedule(); - inst.init(data); - - return inst; -}; - -/********** - * prototype props - **********/ - -/** - * Initialize schedule instance. - * @param {object} options options. - */ -Schedule.prototype.init = function(options) { - options = util.extend({}, options); - if (options.category === SCHEDULE_CATEGORY.ALLDAY) { - options.isAllDay = true; - } - - this.id = options.id || ''; - this.title = options.title || ''; - this.body = options.body || ''; - this.isAllDay = util.isExisty(options.isAllDay) ? options.isAllDay : false; - this.isVisible = util.isExisty(options.isVisible) ? options.isVisible : true; - - this.color = options.color || this.color; - this.bgColor = options.bgColor || this.bgColor; - this.dragBgColor = options.dragBgColor || this.dragBgColor; - this.borderColor = options.borderColor || this.borderColor; - this.calendarId = options.calendarId || ''; - this.category = options.category || ''; - this.dueDateClass = options.dueDateClass || ''; - this.customStyle = options.customStyle || ''; - this.location = options.location || ''; - this.attendees = options.attendees || []; - this.recurrenceRule = options.recurrenceRule || ''; - this.isPrivate = options.isPrivate || false; - this.isPending = options.isPending || false; - this.isFocused = options.isFocused || false; - this.isReadOnly = options.isReadOnly || false; - this.goingDuration = options.goingDuration || 0; - this.comingDuration = options.comingDuration || 0; - this.state = options.state || ''; - - if (this.isAllDay) { - this.setAllDayPeriod(options.start, options.end); - } else { - this.setTimePeriod(options.start, options.end); - } - - this.raw = options.raw || null; -}; - -Schedule.prototype.setAllDayPeriod = function(start, end) { - // If it is an all-day schedule, only the date information of the string is used. - if (util.isString(start) && start.length === 10) { - start = datetime.parse(start); - } else { - start = new TZDate(start || Date.now()); - } - - if (util.isString(end) && end.length === 10) { - end = datetime.parse(end); - end.setHours(23, 59, 59); - } else { - end = new TZDate(end || start); - } - - this.start = datetime.start(start); - this.end = datetime.renderEnd(start, end); -}; - -Schedule.prototype.setTimePeriod = function(start, end) { - this.start = new TZDate(start || Date.now()); - this.end = new TZDate(end || this.start); - - if (!end) { - this.end.setMinutes(this.end.getMinutes() + 30); - } -}; - -/** - * @returns {Date} render start date. - */ -Schedule.prototype.getStarts = function() { - return this.start; -}; - -/** - * @returns {Date} render end date. - */ -Schedule.prototype.getEnds = function() { - return this.end; -}; - -/** - * @returns {number} instance unique id. - */ -Schedule.prototype.cid = function() { - return util.stamp(this); -}; - -/** - * Check two schedule are equals (means title, isAllDay, start, end are same) - * @param {Schedule} schedule Schedule model instance to compare. - * @returns {boolean} Return false when not same. - */ -Schedule.prototype.equals = function(schedule) { - if (this.id !== schedule.id) { - return false; - } - - if (this.title !== schedule.title) { - return false; - } - - if (this.body !== schedule.body) { - return false; - } - - if (this.isAllDay !== schedule.isAllDay) { - return false; - } - - if (datetime.compare(this.getStarts(), schedule.getStarts()) !== 0) { - return false; - } - - if (datetime.compare(this.getEnds(), schedule.getEnds()) !== 0) { - return false; - } - - if (this.color !== schedule.color) { - return false; - } - - if (this.bgColor !== schedule.bgColor) { - return false; - } - - if (this.dragBgColor !== schedule.dragBgColor) { - return false; - } - - if (this.borderColor !== schedule.borderColor) { - return false; - } - - return true; -}; - -/** - * return duration between start and end. - * @returns {Date} duration (UTC) - */ -Schedule.prototype.duration = function() { - var start = this.getStarts(), - end = this.getEnds(), - duration; - var hasPrimaryTimezoneCustomSetting = tz.hasPrimaryTimezoneCustomSetting(); - - if (this.isAllDay) { - duration = datetime.end(end) - datetime.start(start); - } else if (hasPrimaryTimezoneCustomSetting && tz.isPrimaryUsingDSTTimezone()) { - duration = getDurationByPrimaryTimezone(start, end); - } else if (hasPrimaryTimezoneCustomSetting && tz.isNativeOsUsingDSTTimezone()) { - duration = getDurationByNativeTimezone(start, end); - } else { - duration = end - start; - } - - return duration; -}; - -/** - * Returns true if the given Schedule coincides with the same time as the - * calling Schedule. - * @param {Schedule} schedule The other schedule to compare with this Schedule. - * @returns {boolean} If the other schedule occurs within the same time as the first object. - */ -Schedule.prototype.collidesWith = function(schedule) { - var ownStarts = this.getStarts(), - ownEnds = this.getEnds(), - start = schedule.getStarts(), - end = schedule.getEnds(); - var ownGoingDuration = datetime.millisecondsFrom('minutes', this.goingDuration), - ownComingDuration = datetime.millisecondsFrom('minutes', this.comingDuration), - goingDuration = datetime.millisecondsFrom('minutes', schedule.goingDuration), - comingDuration = datetime.millisecondsFrom('minutes', schedule.comingDuration); - - if (Math.abs(ownEnds - ownStarts) < SCHEDULE_MIN_DURATION) { - ownEnds += SCHEDULE_MIN_DURATION; - } - - if (Math.abs(end - start) < SCHEDULE_MIN_DURATION) { - end += SCHEDULE_MIN_DURATION; - } - - ownStarts -= ownGoingDuration; - ownEnds += ownComingDuration; - start -= goingDuration; - end += comingDuration; - - if ( - (start > ownStarts && start < ownEnds) || - (end > ownStarts && end < ownEnds) || - (start <= ownStarts && end >= ownEnds) - ) { - return true; - } - - return false; -}; - -model.mixin(Schedule.prototype); -dirty.mixin(Schedule.prototype); - -module.exports = Schedule; - - -/***/ }), - -/***/ "./src/js/model/viewModel/scheduleViewModel.js": -/*!*****************************************************!*\ - !*** ./src/js/model/viewModel/scheduleViewModel.js ***! - \*****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_717631__) { - -"use strict"; -/** - * @fileoverview Model for views - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_717631__(/*! tui-code-snippet */ "tui-code-snippet"); -var datetime = __nested_webpack_require_717631__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); - -var SCHEDULE_MIN_DURATION = datetime.MILLISECONDS_SCHEDULE_MIN_DURATION; - -/** - * Schedule ViewModel - * @constructor - * @param {Schedule} schedule Schedule instance. - */ -function ScheduleViewModel(schedule) { - /** - * The model of schedule. - * @type {Schedule} - */ - this.model = schedule; - - /** - * @type {number} - */ - this.top = 0; - - /** - * @type {number} - */ - this.left = 0; - - /** - * @type {number} - */ - this.width = 0; - - /** - * @type {number} - */ - this.height = 0; - - /** - * Represent schedule has collide with other schedules when rendering. - * @type {boolean} - */ - this.hasCollide = false; - - /** - * Extra space at rigth side of this schedule. - * @type {number} - */ - this.extraSpace = 0; - - /** - * represent this schedule block is not visible after rendered. - * - * in month view, some viewmodel in date need to hide when already rendered before dates. - * - * set true then it just shows empty space. - * @type {boolean} - */ - this.hidden = false; - - /** - * whether the schedule includes multiple dates - */ - this.hasMultiDates = false; - - /** - * represent render start date used at rendering. - * - * if set null then use model's 'start' property. - * @type {TZDate} - */ - this.renderStarts = null; - - /** - * whether the actual start-date is before the render-start-date - * @type {boolean} - */ - this.exceedLeft = false; - - /** - * represent render end date used at rendering. - * - * if set null then use model's 'end' property. - * @type {TZDate} - */ - this.renderEnds = null; - - /** - * whether the actual end-date is after the render-end-date - * @type {boolean} - */ - this.exceedRight = false; -} - -/********** - * static props - **********/ - -/** - * ScheduleViewModel factory method. - * @param {Schedule} schedule Schedule instance. - * @returns {ScheduleViewModel} ScheduleViewModel instance. - */ -ScheduleViewModel.create = function(schedule) { - return new ScheduleViewModel(schedule); -}; - -/********** - * prototype props - **********/ - -/** - * return renderStarts property to render properly when specific schedule that exceed rendering date range. - * - * if renderStarts is not set. return model's start property. - * @override - * @returns {Date} render start date. - */ -ScheduleViewModel.prototype.getStarts = function() { - if (this.renderStarts) { - return this.renderStarts; - } - - return this.model.start; -}; - -/** - * return renderStarts property to render properly when specific schedule that exceed rendering date range. - * - * if renderEnds is not set. return model's end property. - * @override - * @returns {Date} render end date. - */ -ScheduleViewModel.prototype.getEnds = function() { - if (this.renderEnds) { - return this.renderEnds; - } - - return this.model.end; -}; - -/** - * @returns {number} unique number for model. - */ -ScheduleViewModel.prototype.cid = function() { - return util.stamp(this.model); -}; - -/** - * Shadowing valueOf method for schedule sorting. - * @returns {Schedule} The model of schedule. - */ -ScheduleViewModel.prototype.valueOf = function() { - return this.model; -}; - -/** - * Link duration method - * @returns {number} Schedule#duration result. - */ -ScheduleViewModel.prototype.duration = function() { - return this.model.duration(); -}; - -/** - * Link collidesWith method - * @param {Schedule|ScheduleViewModel} viewModel - Model or viewmodel instance of Schedule. - * @returns {boolean} Schedule#collidesWith result. - */ -ScheduleViewModel.prototype.collidesWith = function(viewModel) { - var ownStarts = this.getStarts(), - ownEnds = this.getEnds(), - start = viewModel.getStarts(), - end = viewModel.getEnds(); - var ownGoingDuration = datetime.millisecondsFrom('minutes', this.valueOf().goingDuration), - ownComingDuration = datetime.millisecondsFrom('minutes', this.valueOf().comingDuration), - goingDuration = datetime.millisecondsFrom('minutes', viewModel.valueOf().goingDuration), - comingDuration = datetime.millisecondsFrom('minutes', viewModel.valueOf().comingDuration); - - if (Math.abs(ownEnds - ownStarts) < SCHEDULE_MIN_DURATION) { - ownEnds += SCHEDULE_MIN_DURATION; - } - - if (Math.abs(end - start) < SCHEDULE_MIN_DURATION) { - end += SCHEDULE_MIN_DURATION; - } - - ownStarts -= ownGoingDuration; - ownEnds += ownComingDuration; - start -= goingDuration; - end += comingDuration; - - if ((start > ownStarts && start < ownEnds) || - (end > ownStarts && end < ownEnds) || - (start <= ownStarts && end >= ownEnds)) { - return true; - } - - return false; -}; - -module.exports = ScheduleViewModel; - - -/***/ }), - -/***/ "./src/js/theme/standard.js": -/*!**********************************!*\ - !*** ./src/js/theme/standard.js ***! - \**********************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * @fileoverview The standard theme - * @author NHN FE Development Lab - */ - - -/** - * "common" prefix is for entire calendar. "common" properties can be overriden by "week", "month". - * "week" prefix is for weekly and daily view. - * "month" prefix is for monthly view. - */ -var theme = { - 'common.border': '1px solid #e5e5e5', - 'common.backgroundColor': 'white', - 'common.holiday.color': '#ff4040', - 'common.saturday.color': '#333', - 'common.dayname.color': '#333', - 'common.today.color': '#333', - - // creation guide style - 'common.creationGuide.backgroundColor': 'rgba(81, 92, 230, 0.05)', - 'common.creationGuide.border': '1px solid #515ce6', - - // month header 'dayname' - 'month.dayname.height': '31px', - 'month.dayname.borderLeft': 'none', - 'month.dayname.paddingLeft': '10px', - 'month.dayname.paddingRight': '0', - 'month.dayname.backgroundColor': 'inherit', - 'month.dayname.fontSize': '12px', - 'month.dayname.fontWeight': 'normal', - 'month.dayname.textAlign': 'left', - - // month day grid cell 'day' - 'month.holidayExceptThisMonth.color': 'rgba(255, 64, 64, 0.4)', - 'month.dayExceptThisMonth.color': 'rgba(51, 51, 51, 0.4)', - 'month.weekend.backgroundColor': 'inherit', - 'month.day.fontSize': '14px', - - // month schedule style - 'month.schedule.borderRadius': '2px', - 'month.schedule.height': '24px', - 'month.schedule.marginTop': '2px', - 'month.schedule.marginLeft': '8px', - 'month.schedule.marginRight': '8px', - - // month more view - 'month.moreView.border': '1px solid #d5d5d5', - 'month.moreView.boxShadow': '0 2px 6px 0 rgba(0, 0, 0, 0.1)', - 'month.moreView.backgroundColor': 'white', - 'month.moreView.paddingBottom': '17px', - 'month.moreViewTitle.height': '44px', - 'month.moreViewTitle.marginBottom': '12px', - 'month.moreViewTitle.borderBottom': 'none', - 'month.moreViewTitle.padding': '12px 17px 0 17px', - 'month.moreViewList.padding': '0 17px', - - // week header 'dayname' - 'week.dayname.height': '42px', - 'week.dayname.borderTop': '1px solid #e5e5e5', - 'week.dayname.borderBottom': '1px solid #e5e5e5', - 'week.dayname.borderLeft': 'none', - 'week.dayname.paddingLeft': '0', - 'week.dayname.backgroundColor': 'inherit', - 'week.dayname.textAlign': 'left', - 'week.today.color': 'inherit', - 'week.pastDay.color': '#bbb', - - // week vertical panel 'vpanel' - 'week.vpanelSplitter.border': '1px solid #e5e5e5', - 'week.vpanelSplitter.height': '3px', - - // week daygrid 'daygrid' - 'week.daygrid.borderRight': '1px solid #e5e5e5', - 'week.daygrid.backgroundColor': 'inherit', - - 'week.daygridLeft.width': '72px', - 'week.daygridLeft.backgroundColor': 'inherit', - 'week.daygridLeft.paddingRight': '8px', - 'week.daygridLeft.borderRight': '1px solid #e5e5e5', - - 'week.today.backgroundColor': 'rgba(81, 92, 230, 0.05)', - 'week.weekend.backgroundColor': 'inherit', - - // week timegrid 'timegrid' - 'week.timegridLeft.width': '72px', - 'week.timegridLeft.backgroundColor': 'inherit', - 'week.timegridLeft.borderRight': '1px solid #e5e5e5', - 'week.timegridLeft.fontSize': '11px', - - 'week.timegridOneHour.height': '52px', - 'week.timegridHalfHour.height': '26px', - 'week.timegridHalfHour.borderBottom': 'none', - 'week.timegridHorizontalLine.borderBottom': '1px solid #e5e5e5', - - 'week.timegrid.paddingRight': '8px', - 'week.timegrid.borderRight': '1px solid #e5e5e5', - 'week.timegridSchedule.borderRadius': '2px', - 'week.timegridSchedule.paddingLeft': '2px', - - 'week.currentTime.color': '#515ce6', - 'week.currentTime.fontSize': '11px', - 'week.currentTime.fontWeight': 'normal', - - 'week.currentTimeLinePast.border': '1px dashed #515ce6', - 'week.currentTimeLineBullet.backgroundColor': '#515ce6', - 'week.currentTimeLineToday.border': '1px solid #515ce6', - 'week.currentTimeLineFuture.border': 'none', - - // week creation guide style - 'week.creationGuide.color': '#515ce6', - 'week.creationGuide.fontSize': '11px', - 'week.creationGuide.fontWeight': 'bold', - - // week daygrid schedule style - 'week.dayGridSchedule.borderRadius': '2px', - 'week.dayGridSchedule.height': '24px', - 'week.dayGridSchedule.marginTop': '2px', - 'week.dayGridSchedule.marginLeft': '8px', - 'week.dayGridSchedule.marginRight': '8px' -}; - -module.exports = theme; - - -/***/ }), - -/***/ "./src/js/theme/theme.js": -/*!*******************************!*\ - !*** ./src/js/theme/theme.js ***! - \*******************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_727599__) { - -"use strict"; -/** - * @fileoverview The all configuration of a theme - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_727599__(/*! tui-code-snippet */ "tui-code-snippet"); -var themeStandard = __nested_webpack_require_727599__(/*! ./standard */ "./src/js/theme/standard.js"); -var themeConfig = __nested_webpack_require_727599__(/*! ./themeConfig */ "./src/js/theme/themeConfig.js"); -var common = __nested_webpack_require_727599__(/*! ../common/common */ "./src/js/common/common.js"); - -/** - * Theme manager - * - * @constructor - * @param {object} customTheme - custom theme - */ -function Theme(customTheme) { - var theme = customTheme || themeStandard; - - /** - * @type {util.HashMap} - */ - this._map = new util.HashMap(); - - this.setStyles(theme); -} - -/** - * Get a style with key - * @param {string} key - key for getting a style - * @returns {string|undefined} style - */ -Theme.prototype.getStyle = function(key) { - return this._map.get(key); -}; - -/** - * Set a style - * @param {string} key - key for setting a style - * @param {string} style - style value - * @returns {boolean} true if the give key is valid or false - */ -Theme.prototype.setStyle = function(key, style) { - var styles = {}; - styles[key] = style; - - return this.setStyles(styles).length === 0; -}; - -/** - * Set styles - * @param {object} styles - multiple styles map - * @returns {Array.} error keys - */ -Theme.prototype.setStyles = function(styles) { - var errors = []; - - util.forEach(styles, function(style, key) { - if (util.isUndefined(themeConfig[key])) { - errors.push(key); - } else { - this._map.set(key, style); - common.set(this, key, style); - } - }, this); - - // apply missing styles which have to be default - util.forEach(themeConfig, function(style, key) { - if (!this.getStyle(key)) { - this._map.set(key, style); - common.set(this, key, style); - } - }, this); - - return errors; -}; - -/** - * Delete all styles - */ -Theme.prototype.clear = function() { - var keys = this._map.keys(); - var categories = {}; - util.forEach(keys, function(key) { - var category = key.split('.')[0]; - if (!categories[category]) { - categories[category] = category; - } - }); - - util.forEach(categories, function(child) { - delete this[child]; - }, this); - - this._map.removeAll(); -}; - -module.exports = Theme; - - -/***/ }), - -/***/ "./src/js/theme/themeConfig.js": -/*!*************************************!*\ - !*** ./src/js/theme/themeConfig.js ***! - \*************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * @fileoverview The all configuration of a theme - * @author NHN FE Development Lab - */ - - -/** - * Full configuration for theme. - * "common" prefix is for entire calendar. "common" properties can be overriden by "week", "month". - * "week" prefix is for weekly and daily view. - * "month" prefix is for monthly view. - * @typedef {object} themeConfig - * @example - // default keys and styles - var themeConfig = { - 'common.border': '1px solid #e5e5e5', - 'common.backgroundColor': 'white', - 'common.holiday.color': '#ff4040', - 'common.saturday.color': '#333', - 'common.dayname.color': '#333', - 'common.today.color': '#333', - - // creation guide style - 'common.creationGuide.backgroundColor': 'rgba(81, 92, 230, 0.05)', - 'common.creationGuide.border': '1px solid #515ce6', - - // month header 'dayname' - 'month.dayname.height': '31px', - 'month.dayname.borderLeft': '1px solid #e5e5e5', - 'month.dayname.paddingLeft': '10px', - 'month.dayname.paddingRight': '10px', - 'month.dayname.backgroundColor': 'inherit', - 'month.dayname.fontSize': '12px', - 'month.dayname.fontWeight': 'normal', - 'month.dayname.textAlign': 'left', - - // month day grid cell 'day' - 'month.holidayExceptThisMonth.color': 'rgba(255, 64, 64, 0.4)', - 'month.dayExceptThisMonth.color': 'rgba(51, 51, 51, 0.4)', - 'month.weekend.backgroundColor': 'inherit', - 'month.day.fontSize': '14px', - - // month schedule style - 'month.schedule.borderRadius': '2px', - 'month.schedule.height': '24px', - 'month.schedule.marginTop': '2px', - 'month.schedule.marginLeft': '8px', - 'month.schedule.marginRight': '8px', - - // month more view - 'month.moreView.border': '1px solid #d5d5d5', - 'month.moreView.boxShadow': '0 2px 6px 0 rgba(0, 0, 0, 0.1)', - 'month.moreView.backgroundColor': 'white', - 'month.moreView.paddingBottom': '17px', - 'month.moreViewTitle.height': '44px', - 'month.moreViewTitle.marginBottom': '12px', - 'month.moreViewTitle.backgroundColor': 'inherit', - 'month.moreViewTitle.borderBottom': 'none', - 'month.moreViewTitle.padding': '12px 17px 0 17px', - 'month.moreViewList.padding': '0 17px', - - // week header 'dayname' - 'week.dayname.height': '42px', - 'week.dayname.borderTop': '1px solid #e5e5e5', - 'week.dayname.borderBottom': '1px solid #e5e5e5', - 'week.dayname.borderLeft': 'inherit', - 'week.dayname.paddingLeft': '0', - 'week.dayname.backgroundColor': 'inherit', - 'week.dayname.textAlign': 'left', - 'week.today.color': '#333', - 'week.pastDay.color': '#bbb', - - // week vertical panel 'vpanel' - 'week.vpanelSplitter.border': '1px solid #e5e5e5', - 'week.vpanelSplitter.height': '3px', - - // week daygrid 'daygrid' - 'week.daygrid.borderRight': '1px solid #e5e5e5', - 'week.daygrid.backgroundColor': 'inherit', - - 'week.daygridLeft.width': '72px', - 'week.daygridLeft.backgroundColor': 'inherit', - 'week.daygridLeft.paddingRight': '8px', - 'week.daygridLeft.borderRight': '1px solid #e5e5e5', - - 'week.today.backgroundColor': 'rgba(81, 92, 230, 0.05)', - 'week.weekend.backgroundColor': 'inherit', - - // week timegrid 'timegrid' - 'week.timegridLeft.width': '72px', - 'week.timegridLeft.backgroundColor': 'inherit', - 'week.timegridLeft.borderRight': '1px solid #e5e5e5', - 'week.timegridLeft.fontSize': '11px', - 'week.timegridLeftTimezoneLabel.height': '40px', - 'week.timegridLeftAdditionalTimezone.backgroundColor': 'white', - - 'week.timegridOneHour.height': '52px', - 'week.timegridHalfHour.height': '26px', - 'week.timegridHalfHour.borderBottom': 'none', - 'week.timegridHorizontalLine.borderBottom': '1px solid #e5e5e5', - - 'week.timegrid.paddingRight': '8px', - 'week.timegrid.borderRight': '1px solid #e5e5e5', - 'week.timegridSchedule.borderRadius': '2px', - 'week.timegridSchedule.paddingLeft': '2px', - - 'week.currentTime.color': '#515ce6', - 'week.currentTime.fontSize': '11px', - 'week.currentTime.fontWeight': 'normal', - - 'week.pastTime.color': '#bbb', - 'week.pastTime.fontWeight': 'normal', - - 'week.futureTime.color': '#333', - 'week.futureTime.fontWeight': 'normal', - - 'week.currentTimeLinePast.border': '1px dashed #515ce6', - 'week.currentTimeLineBullet.backgroundColor': '#515ce6', - 'week.currentTimeLineToday.border': '1px solid #515ce6', - 'week.currentTimeLineFuture.border': 'none', - - // week creation guide style - 'week.creationGuide.color': '#515ce6', - 'week.creationGuide.fontSize': '11px', - 'week.creationGuide.fontWeight': 'bold', - - // week daygrid schedule style - 'week.dayGridSchedule.borderRadius': '2px', - 'week.dayGridSchedule.height': '24px', - 'week.dayGridSchedule.marginTop': '2px', - 'week.dayGridSchedule.marginLeft': '8px', - 'week.dayGridSchedule.marginRight': '8px' -}; - */ -var themeConfig = { - 'common.border': '1px solid #e5e5e5', - 'common.backgroundColor': 'white', - 'common.holiday.color': '#ff4040', - 'common.saturday.color': '#333', - 'common.dayname.color': '#333', - 'common.today.color': '#333', - - // creation guide style - 'common.creationGuide.backgroundColor': 'rgba(81, 92, 230, 0.05)', - 'common.creationGuide.border': '1px solid #515ce6', - - // month header 'dayname' - 'month.dayname.height': '31px', - 'month.dayname.borderLeft': '1px solid #e5e5e5', - 'month.dayname.paddingLeft': '10px', - 'month.dayname.paddingRight': '10px', - 'month.dayname.backgroundColor': 'inherit', - 'month.dayname.fontSize': '12px', - 'month.dayname.fontWeight': 'normal', - 'month.dayname.textAlign': 'left', - - // month day grid cell 'day' - 'month.holidayExceptThisMonth.color': 'rgba(255, 64, 64, 0.4)', - 'month.dayExceptThisMonth.color': 'rgba(51, 51, 51, 0.4)', - 'month.weekend.backgroundColor': 'inherit', - 'month.day.fontSize': '14px', - - // month schedule style - 'month.schedule.borderRadius': '2px', - 'month.schedule.height': '24px', - 'month.schedule.marginTop': '2px', - 'month.schedule.marginLeft': '8px', - 'month.schedule.marginRight': '8px', - - // month more view - 'month.moreView.border': '1px solid #d5d5d5', - 'month.moreView.boxShadow': '0 2px 6px 0 rgba(0, 0, 0, 0.1)', - 'month.moreView.backgroundColor': 'white', - 'month.moreView.paddingBottom': '17px', - 'month.moreViewTitle.height': '44px', - 'month.moreViewTitle.marginBottom': '12px', - 'month.moreViewTitle.backgroundColor': 'inherit', - 'month.moreViewTitle.borderBottom': 'none', - 'month.moreViewTitle.padding': '12px 17px 0 17px', - 'month.moreViewList.padding': '0 17px', - - // week header 'dayname' - 'week.dayname.height': '42px', - 'week.dayname.borderTop': '1px solid #e5e5e5', - 'week.dayname.borderBottom': '1px solid #e5e5e5', - 'week.dayname.borderLeft': 'inherit', - 'week.dayname.paddingLeft': '0', - 'week.dayname.backgroundColor': 'inherit', - 'week.dayname.textAlign': 'left', - 'week.today.color': '#333', - 'week.pastDay.color': '#bbb', - - // week vertical panel 'vpanel' - 'week.vpanelSplitter.border': '1px solid #e5e5e5', - 'week.vpanelSplitter.height': '3px', - - // week daygrid 'daygrid' - 'week.daygrid.borderRight': '1px solid #e5e5e5', - 'week.daygrid.backgroundColor': 'inherit', - - 'week.daygridLeft.width': '72px', - 'week.daygridLeft.backgroundColor': 'inherit', - 'week.daygridLeft.paddingRight': '8px', - 'week.daygridLeft.borderRight': '1px solid #e5e5e5', - - 'week.today.backgroundColor': 'rgba(81, 92, 230, 0.05)', - 'week.weekend.backgroundColor': 'inherit', - - // week timegrid 'timegrid' - 'week.timegridLeft.width': '72px', - 'week.timegridLeft.backgroundColor': 'inherit', - 'week.timegridLeft.borderRight': '1px solid #e5e5e5', - 'week.timegridLeft.fontSize': '11px', - 'week.timegridLeftTimezoneLabel.height': '40px', - 'week.timegridLeftAdditionalTimezone.backgroundColor': 'white', - - 'week.timegridOneHour.height': '52px', - 'week.timegridHalfHour.height': '26px', - 'week.timegridHalfHour.borderBottom': 'none', - 'week.timegridHorizontalLine.borderBottom': '1px solid #e5e5e5', - - 'week.timegrid.paddingRight': '8px', - 'week.timegrid.borderRight': '1px solid #e5e5e5', - 'week.timegridSchedule.borderRadius': '2px', - 'week.timegridSchedule.paddingLeft': '2px', - - 'week.currentTime.color': '#515ce6', - 'week.currentTime.fontSize': '11px', - 'week.currentTime.fontWeight': 'normal', - - 'week.pastTime.color': '#bbb', - 'week.pastTime.fontWeight': 'normal', - - 'week.futureTime.color': '#333', - 'week.futureTime.fontWeight': 'normal', - - 'week.currentTimeLinePast.border': '1px dashed #515ce6', - 'week.currentTimeLineBullet.backgroundColor': '#515ce6', - 'week.currentTimeLineToday.border': '1px solid #515ce6', - 'week.currentTimeLineFuture.border': 'none', - - // week creation guide style - 'week.creationGuide.color': '#515ce6', - 'week.creationGuide.fontSize': '11px', - 'week.creationGuide.fontWeight': 'bold', - - // week daygrid schedule style - 'week.dayGridSchedule.borderRadius': '2px', - 'week.dayGridSchedule.height': '24px', - 'week.dayGridSchedule.marginTop': '2px', - 'week.dayGridSchedule.marginLeft': '8px', - 'week.dayGridSchedule.marginRight': '8px' -}; - -module.exports = themeConfig; - - -/***/ }), - -/***/ "./src/js/view/layout.js": -/*!*******************************!*\ - !*** ./src/js/view/layout.js ***! - \*******************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_739863__) { - -"use strict"; -/** - * @fileoverview Layout view. wrap all view containers at outside. - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_739863__(/*! tui-code-snippet */ "tui-code-snippet"); -var config = __nested_webpack_require_739863__(/*! ../config */ "./src/js/config.js"); -var domutil = __nested_webpack_require_739863__(/*! ../common/domutil */ "./src/js/common/domutil.js"); -var Collection = __nested_webpack_require_739863__(/*! ../common/collection */ "./src/js/common/collection.js"); -var View = __nested_webpack_require_739863__(/*! ./view */ "./src/js/view/view.js"); - -/** - * Layout view for toggle each child view. It will controlled via navigation UI. - * @constructor - * @extends {View} - * @param {HTMLElement} container Container element to use layout view. - * @param {Theme} theme - theme instance - */ -function Layout(container, theme) { - container = domutil.appendHTMLElement('div', container, config.classname('layout')); - - View.call(this, container); - - /** - * @type {Collection} Child view collection. - */ - this.children = new Collection(function(childView) { - return childView.viewName; - }); - - /** - * @type {Theme} - */ - this.theme = theme; - - this.applyTheme(); -} - -util.inherit(Layout, View); - -/** - * Clear child views. - */ -Layout.prototype.clear = function() { - this.children.each(function(childView) { - childView.destroy(); - }); - - this.children.clear(); - this.container.innerHTML = ''; -}; - -/** - * Remove child view. - * @override - * @param {(string|View)} viewName - name of view or instance. - */ -Layout.prototype.removeChild = function(viewName) { - this.children.remove(viewName); -}; - -/** - * Toggle child views. - * @param {string} viewName - Name of view. - */ -Layout.prototype.toggleChildView = function(viewName) { - var container, - prefix = ['add', 'remove'], - flag; - - this.children.each(function(childView) { - container = childView.container; - flag = Number(childView.viewName === viewName); - domutil[prefix[flag] + 'Class'](container, config.classname('hidden')); - }); -}; - -Layout.prototype.applyTheme = function() { - var style = this.container.style; - var theme = this.theme.common; - - // background color - style.backgroundColor = theme.backgroundColor; -}; - -module.exports = Layout; - - -/***/ }), - -/***/ "./src/js/view/month/month.js": -/*!************************************!*\ - !*** ./src/js/view/month/month.js ***! - \************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_742436__) { - -"use strict"; -/** - * @fileoverview Month view - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_742436__(/*! tui-code-snippet */ "tui-code-snippet"); -var config = __nested_webpack_require_742436__(/*! ../../config */ "./src/js/config.js"), - datetime = __nested_webpack_require_742436__(/*! ../../common/datetime */ "./src/js/common/datetime.js"), - domutil = __nested_webpack_require_742436__(/*! ../../common/domutil */ "./src/js/common/domutil.js"), - TZDate = __nested_webpack_require_742436__(/*! ../../common/timezone */ "./src/js/common/timezone.js").Date, - tmpl = __nested_webpack_require_742436__(/*! ../template/month/month.hbs */ "./src/js/view/template/month/month.hbs"), - View = __nested_webpack_require_742436__(/*! ../view */ "./src/js/view/view.js"), - VLayout = __nested_webpack_require_742436__(/*! ../..//common/vlayout */ "./src/js/common/vlayout.js"), - WeekdayInMonth = __nested_webpack_require_742436__(/*! ./weekdayInMonth */ "./src/js/view/month/weekdayInMonth.js"); -var mmin = Math.min; - -/** - * @constructor - * @extends {View} - * @param {object} options - options - * @param {function} [options.scheduleFilter] - schedule filter - * @param {number} [options.startDayOfWeek=0] - start day of week - * @param {string} [options.renderMonth='2015-12'] - render month - * @param {string[]} [options.daynames] - daynames to use upside of month view - * @param {HTMLElement} container - container element - * @param {Base.Month} controller - controller instance - */ -function Month(options, container, controller) { - var theme = controller ? controller.theme : null; - var monthOption; - - options = options || {}; - monthOption = options ? options.month : {}; - - View.call(this, container); - - /** - * @type {Base.Month} - */ - this.controller = controller; - - /** - * @type {VLayout} - */ - this.vLayout = new VLayout({ - panels: [ - {height: parseInt(controller.theme.month.dayname.height, 10) || 42}, - {autoHeight: true} - ] - }, container, theme); - - /** - * @type {string} - */ - this.options = util.extend({ - scheduleFilter: function(schedule) { - return Boolean(schedule.isVisible); - }, - startDayOfWeek: 0, - renderMonth: '2018-01', - daynames: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], - narrowWeekend: false, - visibleWeeksCount: null, - isAlways6Week: true, - isReadOnly: options.isReadOnly, - grid: { - header: { - height: 34 - }, - footer: { - height: 3 - } - } - }, monthOption); - - this.options.grid.header = util.extend({ - height: 34 - }, util.pick(monthOption, 'grid', 'header')); - this.options.grid.footer = util.extend({ - height: 3 - }, util.pick(monthOption, 'grid', 'footer')); - - /** - * horizontal grid information - * @type {Object} - */ - this.grids = datetime.getGridLeftAndWidth( - this.options.daynames.length, - this.options.narrowWeekend, - this.options.startDayOfWeek); -} - -util.inherit(Month, View); - -/** - * Name of view. for managing subview at layout view - * @type {string} - */ -Month.prototype.viewName = 'month'; - -/** - * Get calendar array by supplied date - * @param {string} renderMonth - month to render YYYY-MM, weeks2/3 to render YYYY-MM-DD - * @returns {array.} calendar array - */ -Month.prototype._getMonthCalendar = function(renderMonth) { - var date = new TZDate(renderMonth); - var startDayOfWeek = this.options.startDayOfWeek || 0; - var visibleWeeksCount = mmin(this.options.visibleWeeksCount || 0, 6); - var workweek = this.options.workweek || false; - var datetimeOptions, calendar; - - if (this.options.visibleWeeksCount) { - datetimeOptions = { - startDayOfWeek: startDayOfWeek, - isAlways6Week: false, - visibleWeeksCount: visibleWeeksCount, - workweek: workweek - }; - } else { - datetimeOptions = { - startDayOfWeek: startDayOfWeek, - isAlways6Week: this.options.isAlways6Week, - workweek: workweek - }; - } - - calendar = datetime.arr2dCalendar(date, datetimeOptions); - - return calendar; -}; - -/** - * Create children view (week) and add children - * @param {HTMLElement} container - container element to render weeks - * @param {array.} calendar - calendar array from datetime#arr2dCalendar - * @param {Theme} theme - theme instance - */ -Month.prototype._renderChildren = function(container, calendar, theme) { - var self = this; - var weekCount = calendar.length; - var heightPercent = 100 / weekCount; - var opt = this.options; - var renderMonth = opt.renderMonth; - var narrowWeekend = opt.narrowWeekend; - var startDayOfWeek = opt.startDayOfWeek; - var visibleWeeksCount = opt.visibleWeeksCount; - var visibleScheduleCount = opt.visibleScheduleCount; - var gridOption = opt.grid; - var isReadOnly = opt.isReadOnly; - - container.innerHTML = ''; - this.children.clear(); - - util.forEach(calendar, function(weekArr) { - var start = new TZDate(weekArr[0]), - end = new TZDate(weekArr[weekArr.length - 1]), - weekdayViewContainer, - weekdayView; - - weekdayViewContainer = domutil.appendHTMLElement( - 'div', container, config.classname('month-week-item')); - - weekdayView = new WeekdayInMonth({ - renderMonth: renderMonth, - heightPercent: heightPercent, - renderStartDate: start, - renderEndDate: end, - narrowWeekend: narrowWeekend, - startDayOfWeek: startDayOfWeek, - visibleWeeksCount: visibleWeeksCount, - visibleScheduleCount: visibleScheduleCount, - grid: gridOption, - scheduleHeight: parseInt(theme.month.schedule.height, 10), - scheduleGutter: parseInt(theme.month.schedule.marginTop, 10), - isReadOnly: isReadOnly - }, weekdayViewContainer); - - self.addChild(weekdayView); - }); -}; - -/** - * Render month view - * @override - */ -Month.prototype.render = function() { - var self = this, - opt = this.options, - vLayout = this.vLayout, - controller = this.controller, - daynames = opt.daynames, - workweek = opt.workweek, - calendar = this._getMonthCalendar(opt.renderMonth), - scheduleFilter = opt.scheduleFilter, - theme = controller ? controller.theme : null, - styles = this._getStyles(theme), - grids, - daynameViewModel, - baseViewModel; - - grids = this.grids = datetime.getGridLeftAndWidth( - opt.daynames.length, - opt.narrowWeekend, - opt.startDayOfWeek - ); - - daynameViewModel = util.map( - util.range(opt.startDayOfWeek, 7).concat(util.range(7)).slice(0, 7), - function(day, index) { - return { - day: day, - label: daynames[day], - width: grids[index] ? grids[index].width : 0, - left: grids[index] ? grids[index].left : 0, - color: this._getDayNameColor(theme, day) - }; - }, - this - ); - - if (workweek) { - grids = this.grids = datetime.getGridLeftAndWidth(5, opt.narrowWeekend, opt.startDayOfWeek, workweek); - - daynameViewModel = util.filter(daynameViewModel, function(daynameModel) { - return !datetime.isWeekend(daynameModel.day); - }); - - util.forEach(daynameViewModel, function(daynameModel, index) { - daynameModel.width = grids[index] ? grids[index].width : 0; - daynameModel.left = grids[index] ? grids[index].left : 0; - }); - } - - baseViewModel = { - daynames: daynameViewModel, - styles: styles - }; - - vLayout.panels[0].container.innerHTML = tmpl(baseViewModel); - - this._renderChildren(vLayout.panels[1].container, calendar, theme); - - baseViewModel.panelHeight = vLayout.panels[1].getHeight(); - - this.children.each(function(childView) { - var start = datetime.start(childView.options.renderStartDate); - var end = datetime.start(childView.options.renderEndDate); - var eventsInDateRange = controller.findByDateRange( - datetime.start(start), - datetime.end(end), - scheduleFilter - ); - var dateRange = datetime.range( - datetime.start(start), - datetime.end(end), - datetime.MILLISECONDS_PER_DAY); - var viewModel = { - eventsInDateRange: eventsInDateRange, - range: dateRange.slice(0, grids.length), - grids: grids, - panelHeight: baseViewModel.panelHeight, - theme: theme - }; - - childView.render(viewModel); - - self._invokeAfterRenderSchedule(eventsInDateRange); - }); -}; - -/** - * Fire 'afterRenderSchedule' event - * @param {Array} matrices - schedule matrices from view model - * @fires Month#afterRenderSchedule - */ -Month.prototype._invokeAfterRenderSchedule = function(matrices) { - var self = this; - util.forEachArray(matrices, function(matrix) { - util.forEachArray(matrix, function(column) { - util.forEachArray(column, function(scheduleViewModel) { - if (scheduleViewModel && !scheduleViewModel.hidden) { - /** - * @event Month#afterRenderSchedule - */ - self.fire('afterRenderSchedule', {schedule: scheduleViewModel.model}); - } - }); - }); - }); -}; - -/** - * Get the styles from theme - * @param {Theme} theme - theme instance - * @returns {object} styles - styles object - */ -Month.prototype._getStyles = function(theme) { - var styles = {}; - var dayname; - - if (theme) { - dayname = theme.month.dayname; - - styles.borderTop = dayname.borderTop || theme.common.border; - styles.borderLeft = dayname.borderLeft || theme.common.border; - styles.height = dayname.height; - styles.paddingLeft = dayname.paddingLeft; - styles.paddingRight = dayname.paddingRight; - styles.fontSize = dayname.fontSize; - styles.backgroundColor = dayname.backgroundColor; - styles.fontWeight = dayname.fontWeight; - styles.textAlign = dayname.textAlign; - } - - return styles; -}; - -/** - * Get a day name color - * @param {Theme} theme - theme instance - * @param {number} day - day number - * @returns {string} style - color style - */ -Month.prototype._getDayNameColor = function(theme, day) { - var color = ''; - - if (theme) { - if (day === 0) { - color = theme.common.holiday.color; - } else if (day === 6) { - color = theme.common.saturday.color; - } else { - color = theme.common.dayname.color; - } - } - - return color; -}; - -module.exports = Month; - - -/***/ }), - -/***/ "./src/js/view/month/more.js": -/*!***********************************!*\ - !*** ./src/js/view/month/more.js ***! - \***********************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_753536__) { - -"use strict"; -/** - * @fileoverview Floating layer for displaying schedule in specific date - * @author NHN FE Development Lab - */ - - -var OUT_PADDING = 5; -var VIEW_MIN_WIDTH = 280; -var util = __nested_webpack_require_753536__(/*! tui-code-snippet */ "tui-code-snippet"); -var config = __nested_webpack_require_753536__(/*! ../../config */ "./src/js/config.js"), - domevent = __nested_webpack_require_753536__(/*! ../../common/domevent */ "./src/js/common/domevent.js"), - domutil = __nested_webpack_require_753536__(/*! ../../common/domutil */ "./src/js/common/domutil.js"), - View = __nested_webpack_require_753536__(/*! ../../view/view */ "./src/js/view/view.js"), - FloatingLayer = __nested_webpack_require_753536__(/*! ../../common/floatingLayer */ "./src/js/common/floatingLayer.js"), - common = __nested_webpack_require_753536__(/*! ../../common/common */ "./src/js/common/common.js"), - tmpl = __nested_webpack_require_753536__(/*! ../template/month/more.hbs */ "./src/js/view/template/month/more.hbs"); - -/** - * @constructor - * @extends {View} - * @param {object} options - options - * @param {object} [options.moreLayerSize] - more layer size - * @param {object} [options.moreLayerSize.width=null] - css width value(px, auto). - * The default value 'null' is to fit a grid cell. - * @param {object} [options.moreLayerSize.height=null] - css height value(px, auto). - * The default value 'null' is to fit a grid cell. - * @param {HTMLElement} container = container element - * @param {Theme} theme - theme instance - */ -function More(options, container, theme) { - View.call(this, container); - - /** - * @type {FloatingLayer} - */ - this.layer = new FloatingLayer(null, container); - - /** - * cached view model - * @type {object} - */ - this._viewModel = null; - - /** - * @type {object} - */ - this.options = util.extend({ - moreLayerSize: { - width: null, - height: null - }, - scheduleHeight: parseInt(theme.month.schedule.height, 10) || 18, - scheduleGutter: parseInt(theme.month.schedule.marginTop, 10) || 2, - scheduleBulletTop: (parseInt(theme.month.schedule.height, 10) || 18) / 3, - borderRadius: theme.month.schedule.borderRadius - }, options); - - /** - * @type {Theme} - */ - this.theme = theme; - - domevent.on(container, 'click', this._onClick, this); -} - -util.inherit(More, View); - -/** - * Click event handler for close button - * @param {MouseEvent} clickEvent - mouse event object - */ -More.prototype._onClick = function(clickEvent) { - var target = domevent.getEventTarget(clickEvent); - var className = config.classname('month-more-close'); - - if (!domutil.hasClass(target, className) && !domutil.closest(target, '.' + className)) { - return; - } - - this.hide(); -}; - -/** - * Mousedown event handler for hiding more layer when user mousedown outside of - * layer - * @param {MouseEvent} mouseDownEvent - mouse event object - */ -More.prototype._onMouseDown = function(mouseDownEvent) { - var target = domevent.getEventTarget(mouseDownEvent), - moreLayer = domutil.closest(target, config.classname('.month-more')); - - if (moreLayer) { - return; - } - - this.hide(); -}; - -/** - * Get new position for more layer by +n element itself - * @param {HTMLElement} target - parent grid-line element of +n element - * @param {HTMLElement} weekItem - weekItem container element - * @returns {number[]} new position of more layer - */ -More.prototype._getRenderPosition = function(target, weekItem) { - var pos = domevent.getMousePosition({ - clientX: domutil.getPosition(target)[0], - clientY: domutil.getPosition(weekItem)[1] - }, this.container); - var containerSize = domutil.getSize(this.container); - var left = pos[0] - OUT_PADDING; - var top = pos[1] - OUT_PADDING; - - left = common.ratio(containerSize[0], 100, left); - top = common.ratio(containerSize[1], 100, top); - - return [left, top]; -}; - -/** - * @override - */ -More.prototype.destroy = function() { - this.layer.destroy(); - this.layer = null; - domevent.off(this.container, 'click', this._onClick, this); - domevent.off(document.body, 'mousedown', this._onMouseDown, this); - View.prototype.destroy.call(this); -}; - -/** - * @override - * @param {object} viewModel - view model from factory/monthView - */ -More.prototype.render = function(viewModel) { - var target = domutil.closest(viewModel.target, config.classname('.weekday-grid-line')); - var weekItem = domutil.closest(target, config.classname('.month-week-item')); - var layer = this.layer; - var self = this; - var pos = this._getRenderPosition(target, weekItem); - var minHeight = domutil.getSize(weekItem)[1] + (OUT_PADDING * 2); - var width = target.offsetWidth + (OUT_PADDING * 2); - var opt = this.options; - var optMoreLayerSize = opt.moreLayerSize; - var styles = this._getStyles(this.theme); - var maxVisibleSchedulesInLayer = 10; - var height = ''; - var containerSize = domutil.getSize(this.container); - var calWidth = 0; - var calHeight = 0; - var isOverWidth = false; - var isOverHeight = false; - var leftPos = pos[0]; - var topPos = pos[1]; - - this._viewModel = util.extend(viewModel, { - scheduleGutter: opt.scheduleGutter, - scheduleHeight: opt.scheduleHeight, - scheduleBulletTop: opt.scheduleBulletTop, - borderRadius: opt.borderRadius, - styles: styles - }); - - width = Math.max(width, VIEW_MIN_WIDTH); - height = parseInt(styles.titleHeight, 10); - height += parseInt(styles.titleMarginBottom, 10); - if (viewModel.schedules.length <= maxVisibleSchedulesInLayer) { - height += (opt.scheduleGutter + opt.scheduleHeight) * viewModel.schedules.length; - } else { - height += (opt.scheduleGutter + opt.scheduleHeight) * maxVisibleSchedulesInLayer; - } - height += parseInt(styles.paddingBottom, 10); - height += OUT_PADDING; // for border - - if (optMoreLayerSize.width) { - width = optMoreLayerSize.width; - } - - if (optMoreLayerSize.height) { - height = optMoreLayerSize.height; - } - - if (isNaN(height) || height < minHeight) { - height = minHeight; - } - - layer.setContent(tmpl(viewModel)); - - calWidth = leftPos * containerSize[0] / 100; - calHeight = topPos * containerSize[1] / 100; - isOverWidth = calWidth + width >= containerSize[0]; - isOverHeight = calHeight + height >= containerSize[1]; - leftPos = leftPos + '%'; - topPos = topPos + '%'; - - if (isOverWidth && isOverHeight) { - layer.setLTRB({ - right: 0, - bottom: 0 - }); - } else if (!isOverWidth && isOverHeight) { - layer.setLTRB({ - left: leftPos, - bottom: 0 - }); - } else if (isOverWidth && !isOverHeight) { - layer.setLTRB({ - right: 0, - top: topPos - }); - } else { - layer.setPosition(leftPos, topPos); - } - - layer.setSize(width, height); - - layer.show(); - - util.debounce(function() { - domevent.on(document.body, 'mousedown', self._onMouseDown, self); - })(); -}; - -/** - * Hide layer - */ -More.prototype.hide = function() { - this.layer.hide(); - domevent.off(document.body, 'mousedown', this._onMouseDown, this); -}; - -/** - * refresh layer - */ -More.prototype.refresh = function() { - if (this._viewModel) { - this.layer.setContent(tmpl(this._viewModel)); - } -}; - -/** - * Return more layer root element - * @returns {HTMLElement} root element - */ -More.prototype.getMoreViewElement = function() { - return domutil.find(config.classname('.month-more'), this.layer.container); -}; - -/** - * Get the styles from theme - * @param {Theme} theme - theme instance - * @returns {object} styles - styles object - */ -More.prototype._getStyles = function(theme) { - var styles = {}; - var listHeight = ''; - - if (theme) { - styles.border = theme.month.moreView.border || theme.common.border; - styles.boxShadow = theme.month.moreView.boxShadow; - styles.backgroundColor = theme.month.moreView.backgroundColor || theme.common.backgroundColor; - styles.paddingBottom = theme.month.moreView.paddingBottom; - styles.titleHeight = theme.month.moreViewTitle.height; - styles.titleMarginBottom = theme.month.moreViewTitle.marginBottom; - styles.titleBackgroundColor = theme.month.moreViewTitle.backgroundColor; - styles.titleBorderBottom = theme.month.moreViewTitle.borderBottom; - styles.titlePadding = theme.month.moreViewTitle.padding; - styles.listPadding = theme.month.moreViewList.padding; - listHeight = 'calc(100%'; - - if (parseInt(styles.titleHeight, 10)) { - listHeight += ' - ' + styles.titleHeight; - } - if (parseInt(styles.titleMarginBottom, 10)) { - listHeight += ' - ' + styles.titleMarginBottom; - } - listHeight += ')'; - - styles.listHeight = listHeight; - } - - return styles; -}; - -module.exports = More; - - -/***/ }), - -/***/ "./src/js/view/month/weekdayInMonth.js": -/*!*********************************************!*\ - !*** ./src/js/view/month/weekdayInMonth.js ***! - \*********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_762859__) { - -"use strict"; -/** - * @fileoverview Monthday in month view - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_762859__(/*! tui-code-snippet */ "tui-code-snippet"); -var config = __nested_webpack_require_762859__(/*! ../../config */ "./src/js/config.js"), - common = __nested_webpack_require_762859__(/*! ../../common/common.js */ "./src/js/common/common.js"), - domutil = __nested_webpack_require_762859__(/*! ../../common/domutil */ "./src/js/common/domutil.js"), - View = __nested_webpack_require_762859__(/*! ../../view/view */ "./src/js/view/view.js"), - Weekday = __nested_webpack_require_762859__(/*! ../weekday */ "./src/js/view/weekday.js"), - baseTmpl = __nested_webpack_require_762859__(/*! ../template/month/weekdayInMonth.hbs */ "./src/js/view/template/month/weekdayInMonth.hbs"), - scheduleTmpl = __nested_webpack_require_762859__(/*! ../template/month/weekdayInMonthSchedule.hbs */ "./src/js/view/template/month/weekdayInMonthSchedule.hbs"); -var mfloor = Math.floor, - mmin = Math.min; - -/** - * @constructor - * @extends {Weekday} - * @param {object} options - options for WeekdayInWeek view - * @param {number} [options.heightPercent] - height percent of view - * @param {number} [options.containerButtonGutter=8] - free space at bottom to - * make create easy. - * @param {number} [options.scheduleHeight=18] - height of each schedule block. - * @param {number} [options.scheduleGutter=2] - gutter height of each schedule block. - * @param {HTMLDIVElement} container - DOM element to use container for this - * view. - */ -function WeekdayInMonth(options, container) { - Weekday.call(this, options, container); - container.style.height = options.heightPercent + '%'; -} - -util.inherit(WeekdayInMonth, Weekday); - -/** - * Get schedule container element's bound properly by override - * - * View#getViewBound. - * @override - */ -WeekdayInMonth.prototype.getViewBound = function() { - var bound = View.prototype.getViewBound.call(this); - - return bound; -}; - -/** - * Get limit index of schedule block in current view - * @param {number} panelHeight - panel's height for pre-calculation - * @returns {number} limit index - */ -WeekdayInMonth.prototype._getRenderLimitIndex = function(panelHeight) { - var opt = this.options; - var containerHeight = panelHeight || this.getViewBound().height; - var gridHeaderHeight = util.pick(opt, 'grid', 'header', 'height') || 0; - var gridFooterHeight = util.pick(opt, 'grid', 'footer', 'height') || 0; - var visibleScheduleCount = opt.visibleScheduleCount || 0; - var count; - - containerHeight -= (gridHeaderHeight + gridFooterHeight); - - count = mfloor(containerHeight / (opt.scheduleHeight + opt.scheduleGutter)); - - if (!visibleScheduleCount) { - visibleScheduleCount = count; - } - - return mmin(count, visibleScheduleCount); // subtraction for '+n' label block -}; - -/** - * @override - * @param {object} viewModel - schedules view models - */ -WeekdayInMonth.prototype.getBaseViewModel = function(viewModel) { - var opt = this.options, - gridHeaderHeight = util.pick(opt, 'grid', 'header', 'height') || 0, - gridFooterHeight = util.pick(opt, 'grid', 'footer', 'height') || 0, - renderLimitIdx = this._getRenderLimitIndex() + 1, - exceedDate = this.getExceedDate(renderLimitIdx, viewModel.eventsInDateRange, viewModel.range), - styles = this._getStyles(viewModel.theme); - var baseViewModel; - - viewModel = util.extend({ - exceedDate: exceedDate - }, viewModel); - - baseViewModel = Weekday.prototype.getBaseViewModel.call(this, viewModel); - - baseViewModel = util.extend({ - matrices: viewModel.eventsInDateRange, - gridHeaderHeight: gridHeaderHeight, - gridFooterHeight: gridFooterHeight, - renderLimitIdx: renderLimitIdx, - isReadOnly: opt.isReadOnly, - styles: styles - }, baseViewModel); - - return baseViewModel; -}; - -/** - * @override - * @param {object} viewModel - schedules view models - */ -WeekdayInMonth.prototype.render = function(viewModel) { - var container = this.container, - baseViewModel = this.getBaseViewModel(viewModel), - scheduleContainer; - - if (!this.options.visibleWeeksCount) { - setIsOtherMonthFlag(baseViewModel.dates, this.options.renderMonth, viewModel.theme); - } - - container.innerHTML = baseTmpl(baseViewModel); - - scheduleContainer = domutil.find( - config.classname('.weekday-schedules'), - container - ); - - if (!scheduleContainer) { - return; - } - - scheduleContainer.innerHTML = scheduleTmpl(baseViewModel); - - common.setAutoEllipsis( - config.classname('.weekday-schedule-title'), - container, - true - ); -}; - -WeekdayInMonth.prototype._beforeDestroy = function() { -}; - -/** - * Get the styles from theme - * @param {Theme} theme - theme instance - * @returns {object} styles - styles object - */ -WeekdayInMonth.prototype._getStyles = function(theme) { - var styles = {}; - - if (theme) { - styles.borderTop = theme.common.border; - styles.borderLeft = theme.common.border; - styles.fontSize = theme.month.day.fontSize; - styles.borderRadius = theme.month.schedule.borderRadius; - styles.marginLeft = theme.month.schedule.marginLeft; - styles.marginRight = theme.month.schedule.marginRight; - styles.scheduleBulletTop = this.options.scheduleHeight / 3; - } - - return styles; -}; - -/** - * 현재 달이 아닌 날짜에 대해 isOtherMonth = true 플래그를 추가한다. - * @param {Array} dates - 날짜정보 배열 - * @param {TZDate} renderMonth - 현재 렌더링중인 월 (YYYYMM) - * @param {Theme} theme - theme instance - */ -function setIsOtherMonthFlag(dates, renderMonth, theme) { - var month = renderMonth.getMonth() + 1; - - util.forEach(dates, function(dateObj) { - var isOtherMonth = dateObj.month !== month; - dateObj.isOtherMonth = isOtherMonth; - - if (isOtherMonth) { - dateObj.color = Weekday.prototype._getDayNameColor(theme, dateObj.day, dateObj.isToday, isOtherMonth); - } - }); -} - -module.exports = WeekdayInMonth; - - -/***/ }), - -/***/ "./src/js/view/popup/scheduleCreationPopup.js": -/*!****************************************************!*\ - !*** ./src/js/view/popup/scheduleCreationPopup.js ***! - \****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_769145__) { - -"use strict"; -/** - * @fileoverview Floating layer for writing new schedules - * @author NHN FE Development Lab - */ - - -var View = __nested_webpack_require_769145__(/*! ../../view/view */ "./src/js/view/view.js"); -var FloatingLayer = __nested_webpack_require_769145__(/*! ../../common/floatingLayer */ "./src/js/common/floatingLayer.js"); -var util = __nested_webpack_require_769145__(/*! tui-code-snippet */ "tui-code-snippet"); -var DatePicker = __nested_webpack_require_769145__(/*! tui-date-picker */ "tui-date-picker"); -var timezone = __nested_webpack_require_769145__(/*! ../../common/timezone */ "./src/js/common/timezone.js"); -var config = __nested_webpack_require_769145__(/*! ../../config */ "./src/js/config.js"); -var domevent = __nested_webpack_require_769145__(/*! ../../common/domevent */ "./src/js/common/domevent.js"); -var domutil = __nested_webpack_require_769145__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); -var common = __nested_webpack_require_769145__(/*! ../../common/common */ "./src/js/common/common.js"); -var datetime = __nested_webpack_require_769145__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); -var tmpl = __nested_webpack_require_769145__(/*! ../template/popup/scheduleCreationPopup.hbs */ "./src/js/view/template/popup/scheduleCreationPopup.hbs"); -var TZDate = timezone.Date; -var MAX_WEEK_OF_MONTH = 6; - -/** - * @constructor - * @extends {View} - * @param {HTMLElement} container - container element - * @param {Array.} calendars - calendar list used to create new schedule - * @param {boolean} usageStatistics - GA tracking options in Calendar - */ -function ScheduleCreationPopup(container, calendars, usageStatistics) { - View.call(this, container); - /** - * @type {FloatingLayer} - */ - this.layer = new FloatingLayer(null, container); - - /** - * cached view model - * @type {object} - */ - this._viewModel = null; - this._selectedCal = null; - this._schedule = null; - this.calendars = calendars; - this._focusedDropdown = null; - this._usageStatistics = usageStatistics; - this._onClickListeners = [ - this._selectDropdownMenuItem.bind(this), - this._toggleDropdownMenuView.bind(this), - this._closeDropdownMenuView.bind(this, null), - this._closePopup.bind(this), - this._toggleIsAllday.bind(this), - this._toggleIsPrivate.bind(this), - this._onClickSaveSchedule.bind(this) - ]; - this._datepickerState = { - start: null, - end: null, - isAllDay: false - }; - - domevent.on(container, 'click', this._onClick, this); -} - -util.inherit(ScheduleCreationPopup, View); - -/** - * Mousedown event handler for hiding popup layer when user mousedown outside of - * layer - * @param {MouseEvent} mouseDownEvent - mouse event object - */ -ScheduleCreationPopup.prototype._onMouseDown = function(mouseDownEvent) { - var target = domevent.getEventTarget(mouseDownEvent), - popupLayer = domutil.closest(target, config.classname('.floating-layer')); - - if (popupLayer) { - return; - } - - this.hide(); -}; - -/** - * @override - */ -ScheduleCreationPopup.prototype.destroy = function() { - this.layer.destroy(); - this.layer = null; - if (this.rangePicker) { - this.rangePicker.destroy(); - this.rangePicker = null; - } - domevent.off(this.container, 'click', this._onClick, this); - domevent.off(document.body, 'mousedown', this._onMouseDown, this); - View.prototype.destroy.call(this); -}; - -/** - * @override - * Click event handler for close button - * @param {MouseEvent} clickEvent - mouse event object - */ -ScheduleCreationPopup.prototype._onClick = function(clickEvent) { - var target = domevent.getEventTarget(clickEvent); - - util.forEach(this._onClickListeners, function(listener) { - return !listener(target); - }); -}; - -/** - * Test click event target is close button, and return layer is closed(hidden) - * @param {HTMLElement} target click event target - * @returns {boolean} whether popup layer is closed or not - */ -ScheduleCreationPopup.prototype._closePopup = function(target) { - var className = config.classname('popup-close'); - - if (domutil.hasClass(target, className) || domutil.closest(target, '.' + className)) { - this.hide(); - - return true; - } - - return false; -}; - -/** - * Toggle dropdown menu view, when user clicks dropdown button - * @param {HTMLElement} target click event target - * @returns {boolean} whether user clicked dropdown button or not - */ -ScheduleCreationPopup.prototype._toggleDropdownMenuView = function(target) { - var className = config.classname('dropdown-button'); - var dropdownBtn = domutil.hasClass(target, className) ? target : domutil.closest(target, '.' + className); - - if (!dropdownBtn) { - return false; - } - - if (domutil.hasClass(dropdownBtn.parentNode, config.classname('open'))) { - this._closeDropdownMenuView(dropdownBtn.parentNode); - } else { - this._openDropdownMenuView(dropdownBtn.parentNode); - } - - return true; -}; - -/** - * Close drop down menu - * @param {HTMLElement} dropdown - dropdown element that has a opened dropdown menu - */ -ScheduleCreationPopup.prototype._closeDropdownMenuView = function(dropdown) { - dropdown = dropdown || this._focusedDropdown; - if (dropdown) { - domutil.removeClass(dropdown, config.classname('open')); - this._focusedDropdown = null; - } -}; - -/** - * Open drop down menu - * @param {HTMLElement} dropdown - dropdown element that has a closed dropdown menu - */ -ScheduleCreationPopup.prototype._openDropdownMenuView = function(dropdown) { - domutil.addClass(dropdown, config.classname('open')); - this._focusedDropdown = dropdown; -}; - -/** - * If click dropdown menu item, close dropdown menu - * @param {HTMLElement} target click event target - * @returns {boolean} whether - */ -ScheduleCreationPopup.prototype._selectDropdownMenuItem = function(target) { - var itemClassName = config.classname('dropdown-menu-item'); - var iconClassName = config.classname('icon'); - var contentClassName = config.classname('content'); - var selectedItem = domutil.hasClass(target, itemClassName) ? target : domutil.closest(target, '.' + itemClassName); - var bgColor, title, dropdown, dropdownBtn; - - if (!selectedItem) { - return false; - } - - bgColor = domutil.find('.' + iconClassName, selectedItem).style.backgroundColor || 'transparent'; - title = domutil.find('.' + contentClassName, selectedItem).innerHTML; - - dropdown = domutil.closest(selectedItem, config.classname('.dropdown')); - dropdownBtn = domutil.find(config.classname('.dropdown-button'), dropdown); - domutil.find('.' + contentClassName, dropdownBtn).innerText = title; - - if (domutil.hasClass(dropdown, config.classname('section-calendar'))) { - domutil.find('.' + iconClassName, dropdownBtn).style.backgroundColor = bgColor; - this._selectedCal = common.find(this.calendars, function(cal) { - return String(cal.id) === domutil.getData(selectedItem, 'calendarId'); - }); - } - - domutil.removeClass(dropdown, config.classname('open')); - - return true; -}; - -/** - * Toggle allday checkbox state - * @param {HTMLElement} target click event target - * @returns {boolean} whether event target is allday section or not - */ -ScheduleCreationPopup.prototype._toggleIsAllday = function(target) { - var className = config.classname('section-allday'); - var alldaySection = domutil.hasClass(target, className) ? target : domutil.closest(target, '.' + className); - var checkbox; - - if (alldaySection) { - checkbox = domutil.find(config.classname('.checkbox-square'), alldaySection); - checkbox.checked = !checkbox.checked; - - this.rangePicker.destroy(); - this.rangePicker = null; - this._setDatepickerState({isAllDay: checkbox.checked}); - this._createDatepicker(); - - return true; - } - - return false; -}; - -/** - * Toggle private button - * @param {HTMLElement} target click event target - * @returns {boolean} whether event target is private section or not - */ -ScheduleCreationPopup.prototype._toggleIsPrivate = function(target) { - var className = config.classname('section-private'); - var privateSection = domutil.hasClass(target, className) ? target : domutil.closest(target, '.' + className); - - if (privateSection) { - if (domutil.hasClass(privateSection, config.classname('public'))) { - domutil.removeClass(privateSection, config.classname('public')); - } else { - domutil.addClass(privateSection, config.classname('public')); - } - - return true; - } - - return false; -}; - -/** - * Save new schedule if user clicked save button - * @emits ScheduleCreationPopup#saveSchedule - * @param {HTMLElement} target click event target - * @returns {boolean} whether save button is clicked or not - */ -// eslint-disable-next-line complexity -ScheduleCreationPopup.prototype._onClickSaveSchedule = function(target) { - var className = config.classname('popup-save'); - var cssPrefix = config.cssPrefix; - var title; - var startDate; - var endDate; - var rangeDate; - var form; - var isAllDay; - - if (!domutil.hasClass(target, className) && !domutil.closest(target, '.' + className)) { - return false; - } - - title = domutil.get(cssPrefix + 'schedule-title'); - - startDate = new TZDate(this.rangePicker.getStartDate()); - endDate = new TZDate(this.rangePicker.getEndDate()); - - if (!this._validateForm(title, startDate, endDate)) { - if (!title.value) { - title.focus(); - } - - return false; - } - - isAllDay = !!domutil.get(cssPrefix + 'schedule-allday').checked; - rangeDate = this._getRangeDate(startDate, endDate, isAllDay); - - form = { - calendarId: this._selectedCal ? this._selectedCal.id : null, - title: title, - location: domutil.get(cssPrefix + 'schedule-location'), - start: rangeDate.start, - end: rangeDate.end, - isAllDay: isAllDay, - state: domutil.get(cssPrefix + 'schedule-state').innerText, - isPrivate: !domutil.hasClass(domutil.get(cssPrefix + 'schedule-private'), config.classname('public')) - }; - - if (this._isEditMode) { - this._onClickUpdateSchedule(form); - } else { - this._onClickCreateSchedule(form); - } - - this.hide(); - - return true; -}; - -/** - * @override - * @param {object} viewModel - view model from factory/monthView - */ -ScheduleCreationPopup.prototype.render = function(viewModel) { - var calendars = this.calendars; - var layer = this.layer; - var boxElement, guideElements, defaultStartDate, defaultEndDate; - - viewModel.zIndex = this.layer.zIndex + 5; - viewModel.calendars = calendars; - if (calendars.length) { - viewModel.selectedCal = this._selectedCal = calendars[0]; - } - - this._isEditMode = viewModel.schedule && viewModel.schedule.id; - if (this._isEditMode) { - boxElement = viewModel.target; - viewModel = this._makeEditModeData(viewModel); - } else { - this.guide = viewModel.guide; - guideElements = this._getGuideElements(this.guide); - boxElement = guideElements.length ? guideElements[0] : null; - } - layer.setContent(tmpl(viewModel)); - - defaultStartDate = new TZDate(viewModel.start); - defaultEndDate = new TZDate(viewModel.end); - // NOTE: Setting default start/end time when editing all-day schedule first time. - // This logic refers to Apple calendar's behavior. - if (viewModel.isAllDay) { - defaultStartDate.setHours(12, 0, 0); - defaultEndDate.setHours(13, 0, 0); - } - this._setDatepickerState({ - start: defaultStartDate, - end: defaultEndDate, - isAllDay: viewModel.isAllDay - }); - this._createDatepicker(); - - layer.show(); - - if (boxElement) { - this._setPopupPositionAndArrowDirection(boxElement.getBoundingClientRect()); - } - - util.debounce(function() { - domevent.on(document.body, 'mousedown', this._onMouseDown, this); - }.bind(this))(); -}; - -/** - * Make view model for edit mode - * @param {object} viewModel - original view model from 'beforeCreateEditPopup' - * @returns {object} - edit mode view model - */ -ScheduleCreationPopup.prototype._makeEditModeData = function(viewModel) { - var schedule = viewModel.schedule; - var title, isPrivate, location, startDate, endDate, isAllDay, state; - var calendars = this.calendars; - - var id = schedule.id; - title = schedule.title; - isPrivate = schedule.isPrivate; - location = schedule.location; - startDate = schedule.start; - endDate = schedule.end; - isAllDay = schedule.isAllDay; - state = schedule.state; - - viewModel.selectedCal = this._selectedCal = common.find(this.calendars, function(cal) { - return cal.id === viewModel.schedule.calendarId; - }); - - this._schedule = schedule; - - return { - id: id, - selectedCal: this._selectedCal, - calendars: calendars, - title: title, - isPrivate: isPrivate, - location: location, - isAllDay: isAllDay, - state: state, - start: startDate, - end: endDate, - zIndex: this.layer.zIndex + 5, - isEditMode: this._isEditMode - }; -}; - -ScheduleCreationPopup.prototype._setDatepickerState = function(newState) { - util.extend(this._datepickerState, newState); -}; - -/** - * Set popup position and arrow direction to appear near guide element - * @param {MonthCreationGuide|TimeCreationGuide|DayGridCreationGuide} guideBound - creation guide element - */ -ScheduleCreationPopup.prototype._setPopupPositionAndArrowDirection = function(guideBound) { - var layer = domutil.find(config.classname('.popup'), this.layer.container); - var layerSize = { - width: layer.offsetWidth, - height: layer.offsetHeight - }; - var containerBound = this.container.getBoundingClientRect(); - var pos = this._calcRenderingData(layerSize, containerBound, guideBound); - - this.layer.setPosition(pos.x, pos.y); - this._setArrowDirection(pos.arrow); -}; - -/** - * Get guide elements from creation guide object - * It is used to calculate rendering position of popup - * It will be disappeared when hiding popup - * @param {MonthCreationGuide|TimeCreationGuide|AlldayCreationGuide} guide - creation guide - * @returns {Array.} creation guide element - */ -ScheduleCreationPopup.prototype._getGuideElements = function(guide) { - var guideElements = []; - var i = 0; - - if (guide.guideElement) { - guideElements.push(guide.guideElement); - } else if (guide.guideElements) { - for (; i < MAX_WEEK_OF_MONTH; i += 1) { - if (guide.guideElements[i]) { - guideElements.push(guide.guideElements[i]); - } - } - } - - return guideElements; -}; - -/** - * Get guide element's bound data which only includes top, right, bottom, left - * @param {Array.} guideElements - creation guide elements - * @returns {Object} - popup bound data - */ -ScheduleCreationPopup.prototype._getBoundOfFirstRowGuideElement = function(guideElements) { - var bound; - - if (!guideElements.length) { - return null; - } - - bound = guideElements[0].getBoundingClientRect(); - - return { - top: bound.top, - left: bound.left, - bottom: bound.bottom, - right: bound.right - }; -}; - -/** - * Get calculate rendering positions of y and arrow direction by guide block elements - * @param {number} guideBoundTop - guide block's top - * @param {number} guideBoundBottom - guide block's bottom - * @param {number} layerHeight - popup layer's height - * @param {number} containerTop - container's top - * @param {number} containerBottom - container's bottom - * @returns {YAndArrowDirection} y and arrowDirection - */ -ScheduleCreationPopup.prototype._getYAndArrowDirection = function( - guideBoundTop, - guideBoundBottom, - layerHeight, - containerTop, - containerBottom -) { - var arrowDirection = 'arrow-bottom'; - var MARGIN = 3; - var y = guideBoundTop - layerHeight; - - if (y < containerTop) { - y = guideBoundBottom - containerTop + MARGIN; - arrowDirection = 'arrow-top'; - } else { - y = y - containerTop - MARGIN; - } - - if (y + layerHeight > containerBottom) { - y = containerBottom - layerHeight - containerTop - MARGIN; - } - - /** - * @typedef {Object} YAndArrowDirection - * @property {number} y - top position of popup layer - * @property {string} [arrowDirection] - direction of popup arrow - */ - return { - y: y, - arrowDirection: arrowDirection - }; -}; - -/** -* Get calculate rendering x position and arrow left by guide block elements -* @param {number} guideBoundLeft - guide block's left -* @param {number} guideBoundRight - guide block's right -* @param {number} layerWidth - popup layer's width -* @param {number} containerLeft - container's left -* @param {number} containerRight - container's right -* @returns {XAndArrowLeft} x and arrowLeft -*/ -ScheduleCreationPopup.prototype._getXAndArrowLeft = function( - guideBoundLeft, - guideBoundRight, - layerWidth, - containerLeft, - containerRight -) { - var guideHorizontalCenter = (guideBoundLeft + guideBoundRight) / 2; - var x = guideHorizontalCenter - (layerWidth / 2); - var ARROW_WIDTH_HALF = 8; - var arrowLeft; - - if (x + layerWidth > containerRight) { - x = guideBoundRight - layerWidth + ARROW_WIDTH_HALF; - arrowLeft = guideHorizontalCenter - x; - } else { - x += ARROW_WIDTH_HALF; - } - - if (x < containerLeft) { - x = 0; - arrowLeft = guideHorizontalCenter - containerLeft - ARROW_WIDTH_HALF; - } else { - x = x - containerLeft - ARROW_WIDTH_HALF; - } - - /** - * @typedef {Object} XAndArrowLeft - * @property {number} x - left position of popup layer - * @property {numbe3er} arrowLeft - relative position of popup arrow, if it is not set, arrow appears on the middle of popup - */ - return { - x: x, - arrowLeft: arrowLeft - }; -}; - -/** - * Calculate rendering position usering guide elements - * @param {{width: {number}, height: {number}}} layerSize - popup layer's width and height - * @param {{top: {number}, left: {number}, right: {number}, bottom: {number}}} containerBound - width and height of the upper layer, that acts as a border of popup - * @param {{top: {number}, left: {number}, right: {number}, bottom: {number}}} guideBound - guide element bound data - * @returns {PopupRenderingData} rendering position of popup and popup arrow - */ -ScheduleCreationPopup.prototype._calcRenderingData = function(layerSize, containerBound, guideBound) { - var yPosInfo = this._getYAndArrowDirection( - guideBound.top, - guideBound.bottom, - layerSize.height, - containerBound.top, - containerBound.bottom - ); - var xPosInfo = this._getXAndArrowLeft( - guideBound.left, - guideBound.right, - layerSize.width, - containerBound.left, - containerBound.right - ); - - /** - * @typedef {Object} PopupRenderingData - * @property {number} x - left position - * @property {number} y - top position - * @property {string} arrow.direction - direction of popup arrow - * @property {number} [arrow.position] - relative position of popup arrow, if it is not set, arrow appears on the middle of popup - */ - return { - x: xPosInfo.x, - y: yPosInfo.y, - arrow: { - direction: yPosInfo.arrowDirection, - position: xPosInfo.arrowLeft - } - }; -}; - -/** - * Set arrow's direction and position - * @param {Object} arrow rendering data for popup arrow - */ -ScheduleCreationPopup.prototype._setArrowDirection = function(arrow) { - var direction = arrow.direction || 'arrow-bottom'; - var arrowEl = domutil.get(config.classname('popup-arrow')); - var borderElement = domutil.find(config.classname('.popup-arrow-border', arrowEl)); - - if (direction !== config.classname('arrow-bottom')) { - domutil.removeClass(arrowEl, config.classname('arrow-bottom')); - domutil.addClass(arrowEl, config.classname(direction)); - } - - if (arrow.position) { - borderElement.style.left = arrow.position + 'px'; - } -}; - -/** - * Create date range picker using start date and end date - */ -ScheduleCreationPopup.prototype._createDatepicker = function() { - var cssPrefix = config.cssPrefix; - var start = this._datepickerState.start; - var end = this._datepickerState.end; - var isAllDay = this._datepickerState.isAllDay; - - this.rangePicker = DatePicker.createRangePicker({ - startpicker: { - date: new TZDate(start).toDate(), - input: '#' + cssPrefix + 'schedule-start-date', - container: '#' + cssPrefix + 'startpicker-container' - }, - endpicker: { - date: new TZDate(end).toDate(), - input: '#' + cssPrefix + 'schedule-end-date', - container: '#' + cssPrefix + 'endpicker-container' - }, - format: isAllDay ? 'yyyy-MM-dd' : 'yyyy-MM-dd HH:mm', - timepicker: isAllDay ? null : { - showMeridiem: false, - usageStatistics: this._usageStatistics - }, - usageStatistics: this._usageStatistics - }); - this.rangePicker.on('change:start', function() { - this._setDatepickerState({start: this.rangePicker.getStartDate()}); - }.bind(this)); - this.rangePicker.on('change:end', function() { - this._setDatepickerState({end: this.rangePicker.getEndDate()}); - }.bind(this)); -}; - -/** - * Hide layer - */ -ScheduleCreationPopup.prototype.hide = function() { - this.layer.hide(); - if (this.guide) { - this.guide.clearGuideElement(); - this.guide = null; - } - - domevent.off(document.body, 'mousedown', this._onMouseDown, this); -}; - -/** - * refresh layer - */ -ScheduleCreationPopup.prototype.refresh = function() { - if (this._viewModel) { - this.layer.setContent(this.tmpl(this._viewModel)); - } -}; - -/** - * Set calendar list - * @param {Array.} calendars - calendar list - */ -ScheduleCreationPopup.prototype.setCalendars = function(calendars) { - this.calendars = calendars || []; -}; - -/** - * Validate the form - * @param {string} title title of then entered schedule - * @param {TZDate} startDate start date time from range picker - * @param {TZDate} endDate end date time from range picker - * @returns {boolean} Returns false if the form is not valid for submission. - */ -ScheduleCreationPopup.prototype._validateForm = function(title, startDate, endDate) { - if (!title.value) { - return false; - } - - if (!startDate && !endDate) { - return false; - } - - if (datetime.compare(startDate, endDate) === 1) { - return false; - } - - return true; -}; - -/** - * Get range date from range picker - * @param {TZDate} startDate start date time from range picker - * @param {TZDate} endDate end date time from range picker - * @param {boolean} isAllDay whether it is an all-day schedule - * @returns {RangeDate} Returns the start and end time data that is the range date - */ -ScheduleCreationPopup.prototype._getRangeDate = function(startDate, endDate, isAllDay) { - var start = isAllDay ? datetime.start(startDate) : startDate; - var end = isAllDay ? datetime.renderEnd(startDate, datetime.end(endDate)) : endDate; - - /** - * @typedef {object} RangeDate - * @property {TZDate} start start time - * @property {TZDate} end end time - */ - return { - start: new TZDate(start), - end: new TZDate(end) - }; -}; - -/** - * Request schedule model creation to controller by custom schedules. - * @fires {ScheduleCreationPopup#beforeUpdateSchedule} - * @param {{ - calendarId: {string}, - title: {string}, - location: {string}, - start: {TZDate}, - end: {TZDate}, - isAllDay: {boolean}, - state: {string}, - isPrivate: {boolean} - }} form schedule input form data -*/ -ScheduleCreationPopup.prototype._onClickUpdateSchedule = function(form) { - var changes = common.getScheduleChanges( - this._schedule, - ['calendarId', 'title', 'location', 'start', 'end', 'isAllDay', 'state', 'isPrivate'], - { - calendarId: form.calendarId, - title: form.title.value, - location: form.location.value, - start: form.start, - end: form.end, - isAllDay: form.isAllDay, - state: form.state, - isPrivate: form.isPrivate - } - ); - - /** - * @event ScheduleCreationPopup#beforeUpdateSchedule - * @type {object} - * @property {Schedule} schedule - schedule object to be updated - */ - this.fire('beforeUpdateSchedule', { - schedule: this._schedule, - changes: changes, - start: form.start, - end: form.end, - calendar: this._selectedCal, - triggerEventName: 'click' - }); -}; - -/** - * Request the controller to update the schedule model according to the custom schedule. - * @fires {ScheduleCreationPopup#beforeCreateSchedule} - * @param {{ - calendarId: {string}, - title: {string}, - location: {string}, - start: {TZDate}, - end: {TZDate}, - isAllDay: {boolean}, - state: {string} - }} form schedule input form data - */ -ScheduleCreationPopup.prototype._onClickCreateSchedule = function(form) { - /** - * @event ScheduleCreationPopup#beforeCreateSchedule - * @type {object} - * @property {Schedule} schedule - new schedule instance to be added - */ - this.fire('beforeCreateSchedule', { - calendarId: form.calendarId, - title: form.title.value, - location: form.location.value, - isPrivate: form.isPrivate, - start: form.start, - end: form.end, - isAllDay: form.isAllDay, - state: form.state - }); -}; - -module.exports = ScheduleCreationPopup; - - -/***/ }), - -/***/ "./src/js/view/popup/scheduleDetailPopup.js": -/*!**************************************************!*\ - !*** ./src/js/view/popup/scheduleDetailPopup.js ***! - \**************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_795144__) { - -"use strict"; -/* eslint-disable vars-on-top */ -/** - * @fileoverview Floating layer for showing detail schedule - * @author NHN FE Development Lab - */ - - -var View = __nested_webpack_require_795144__(/*! ../../view/view */ "./src/js/view/view.js"); -var FloatingLayer = __nested_webpack_require_795144__(/*! ../../common/floatingLayer */ "./src/js/common/floatingLayer.js"); -var util = __nested_webpack_require_795144__(/*! tui-code-snippet */ "tui-code-snippet"); -var config = __nested_webpack_require_795144__(/*! ../../config */ "./src/js/config.js"), - domevent = __nested_webpack_require_795144__(/*! ../../common/domevent */ "./src/js/common/domevent.js"), - domutil = __nested_webpack_require_795144__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); -var tmpl = __nested_webpack_require_795144__(/*! ../template/popup/scheduleDetailPopup.hbs */ "./src/js/view/template/popup/scheduleDetailPopup.hbs"); -var tz = __nested_webpack_require_795144__(/*! ../../common/timezone */ "./src/js/common/timezone.js"); -var TZDate = tz.Date; -var datetime = __nested_webpack_require_795144__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); - -/** - * @constructor - * @extends {View} - * @param {HTMLElement} container - container element - */ -function ScheduleDetailPopup(container) { - View.call(this, container); - /** - * @type {FloatingLayer} - */ - this.layer = new FloatingLayer(null, container); - - /** - * cached view model - * @type {object} - */ - this._viewModel = null; - this._schedule = null; - this._calendar = null; - - domevent.on(container, 'click', this._onClick, this); -} - -util.inherit(ScheduleDetailPopup, View); - -/** - * Mousedown event handler for hiding popup layer when user mousedown outside of - * layer - * @param {MouseEvent} mouseDownEvent - mouse event object - */ -ScheduleDetailPopup.prototype._onMouseDown = function(mouseDownEvent) { - var target = domevent.getEventTarget(mouseDownEvent), - popupLayer = domutil.closest(target, config.classname('.floating-layer')); - - if (popupLayer) { - return; - } - - this.hide(); -}; - -/** - * @override - */ -ScheduleDetailPopup.prototype.destroy = function() { - this.layer.destroy(); - this.layer = null; - domevent.off(this.container, 'click', this._onClick, this); - domevent.off(document.body, 'mousedown', this._onMouseDown, this); - View.prototype.destroy.call(this); -}; - -/** - * @override - * Click event handler for close button - * @param {MouseEvent} clickEvent - mouse event object - */ -ScheduleDetailPopup.prototype._onClick = function(clickEvent) { - var target = domevent.getEventTarget(clickEvent); - - this._onClickEditSchedule(target); - - this._onClickDeleteSchedule(target); -}; - -/** - * @fires ScheduleDetailPopup#clickEditSchedule - * @param {HTMLElement} target - event target - */ -ScheduleDetailPopup.prototype._onClickEditSchedule = function(target) { - var className = config.classname('popup-edit'); - - if (domutil.hasClass(target, className) || domutil.closest(target, '.' + className)) { - this.fire('beforeUpdateSchedule', { - schedule: this._schedule, - triggerEventName: 'click', - target: this._scheduleEl - }); - - this.hide(); - } -}; - -/** - * @fires ScheduleDetailPopup#clickEditSchedule - * @param {HTMLElement} target - event target - */ -ScheduleDetailPopup.prototype._onClickDeleteSchedule = function(target) { - var className = config.classname('popup-delete'); - - if (domutil.hasClass(target, className) || domutil.closest(target, '.' + className)) { - this.fire('beforeDeleteSchedule', { - schedule: this._schedule - }); - - this.hide(); - } -}; - -/** - * @override - * @param {object} viewModel - view model from factory/monthView - */ -ScheduleDetailPopup.prototype.render = function(viewModel) { - var layer = this.layer; - var self = this; - - layer.setContent(tmpl({ - schedule: this._getScheduleModel(viewModel.schedule), - calendar: viewModel.calendar - })); - layer.show(); - this._setPopupPositionAndArrowDirection(viewModel.event); - - this._schedule = viewModel.schedule; - this._calendar = viewModel.calendar; - - util.debounce(function() { - domevent.on(document.body, 'mousedown', self._onMouseDown, self); - })(); -}; - -// eslint-disable-next-line complexity -ScheduleDetailPopup.prototype._getScheduleModel = function(scheduleViewModel) { - var viewModel = util.extend({}, scheduleViewModel); - var dayStart = datetime.start(scheduleViewModel.start); - var startDayOffset = dayStart.toDate().getTimezoneOffset(); - var nativeOffsetMs = tz.getNativeOffsetMs(); - var hasPrimaryTimezoneCustomSetting = tz.hasPrimaryTimezoneCustomSetting(); - var startOffset = viewModel.start.toDate().getTimezoneOffset(); - var endOffset = viewModel.end.toDate().getTimezoneOffset(); - var primaryTimezoneCode = tz.getPrimaryTimezoneName(); - var primaryOffset = tz.getPrimaryOffset(); - var startTimezoneOffset = tz.getOffsetByTimezoneName( - primaryTimezoneCode, - viewModel.start.getTime() - ); - var endTimezoneOffset = tz.getOffsetByTimezoneName( - primaryTimezoneCode, - viewModel.end.getTime() - ); - var MIN_TO_MS = 60 * 1000; - var offsetDiffMs = 0; - var start, end; - - if ( - hasPrimaryTimezoneCustomSetting && - tz.isNativeOsUsingDSTTimezone() && - nativeOffsetMs !== startDayOffset - ) { - // When using a custom time zone, the native time zone offset is fixed and rendered. - // So, The fixed and rendered time should be recalculated as the original time zone offset. - // The current system OS local time is not affected by summer/standard time and the schedule should always be displayed in the same location. - offsetDiffMs = (startOffset * MIN_TO_MS) - nativeOffsetMs; - start = new TZDate(viewModel.start); - start.addMilliseconds(offsetDiffMs); - - viewModel.start = start; - - offsetDiffMs = (endOffset * MIN_TO_MS) - nativeOffsetMs; - end = new TZDate(viewModel.end); - end.addMilliseconds(offsetDiffMs); - - viewModel.end = end; - } - - if ( - hasPrimaryTimezoneCustomSetting && - tz.isPrimaryUsingDSTTimezone() && - (primaryOffset !== startTimezoneOffset || primaryOffset !== endTimezoneOffset) - ) { - // The custom time zone is a time zone where two offsets including DST are applied. - // The first rendered schedule is calculated and drawn with the offset calculated at the access time(system OS local time). - // It should be recalculated with the original time zone offset. - offsetDiffMs = (primaryOffset - startTimezoneOffset) * MIN_TO_MS; - - start = new TZDate(viewModel.start); - start.addMilliseconds(offsetDiffMs); - - viewModel.start = start; - - offsetDiffMs = (primaryOffset - endTimezoneOffset) * MIN_TO_MS; - - end = new TZDate(viewModel.end); - end.addMilliseconds(offsetDiffMs); - - viewModel.end = end; - } - - return viewModel; -}; - -/** - * Set popup position and arrow direction to appear near guide element - * @param {Event} event - creation guide element - */ -ScheduleDetailPopup.prototype._setPopupPositionAndArrowDirection = function(event) { - var layer = domutil.find(config.classname('.popup'), this.layer.container); - var layerSize = { - width: layer.offsetWidth, - height: layer.offsetHeight - }; - - var containerBound = this.container.getBoundingClientRect(); - var scheduleEl = domevent.getEventTarget(event); - var blockEl = domutil.closest(scheduleEl, config.classname('.time-date-schedule-block')) - || domutil.closest(scheduleEl, config.classname('.weekday-schedule')) - || scheduleEl; - var scheduleBound = blockEl.getBoundingClientRect(); - var pos; - - this._scheduleEl = blockEl; - - pos = this._calcRenderingData(layerSize, containerBound, scheduleBound); - this.layer.setPosition(pos.x, pos.y); - this._setArrowDirection(pos.arrow); -}; - -/** - * Get calculate rendering positions of y and arrow top by schedule block elements - * @param {number} scheduleBoundTop - schedule block's top - * @param {number} scheduleBoundBottom - schedule block's bottom - * @param {number} layerHeight - popup layer's height - * @param {number} containerTop - container's top - * @param {number} containerBottom - container's bottom - * @returns {YAndArrowTop} y and arrowTop - */ -ScheduleDetailPopup.prototype._getYAndArrowTop = function( - scheduleBoundTop, - scheduleBoundBottom, - layerHeight, - containerTop, - containerBottom -) { - var ARROW_WIDTH_HALF = 8; - var scheduleVerticalCenter, y, arrowTop; - - scheduleBoundTop = scheduleBoundTop < 0 ? 0 : scheduleBoundTop; - scheduleVerticalCenter = (scheduleBoundTop + scheduleBoundBottom) / 2; - y = scheduleVerticalCenter - (layerHeight / 2); - - if (y < containerTop) { - y = 0; - arrowTop = scheduleVerticalCenter - containerTop - ARROW_WIDTH_HALF; - } else if (y + layerHeight > containerBottom) { - y = Math.max(containerBottom - layerHeight - containerTop, 0); - arrowTop = scheduleVerticalCenter - y - containerTop - ARROW_WIDTH_HALF; - } else { - y -= containerTop; - } - - if (arrowTop < 0 || arrowTop > layerHeight) { - arrowTop = null; - } - - /** - * @typedef {Object} YAndArrowTop - * @property {number} y - top position of popup layer - * @property {number} [arrowTop] - relative position of popup arrow, if it is not set, arrow appears on the middle of popup - */ - return { - y: y, - arrowTop: arrowTop - }; -}; - -/** - * Get calculate rendering x position and arrow direction by schedule block elements - * @param {number} scheduleBoundLeft - schedule block's left - * @param {number} scheduleBoundRight - schedule block's right - * @param {number} layerWidth - popup layer's width - * @param {number} containerLeft - container's left - * @param {number} containerRight - container's right - * @returns {XAndArrowDirection} x and arrowDirection - */ -ScheduleDetailPopup.prototype._getXAndArrowDirection = function( - scheduleBoundLeft, - scheduleBoundRight, - layerWidth, - containerLeft, - containerRight -) { - var arrowDirection = 'arrow-left'; - var x = scheduleBoundRight; - var MARGIN = 4; - - if (x + layerWidth > containerRight) { - arrowDirection = 'arrow-right'; - x = scheduleBoundLeft - layerWidth - MARGIN; - } else { - x += MARGIN; - } - - if (x < containerLeft) { - x = 0; - } else { - x -= containerLeft; - } - - /** - * @typedef {Object} XAndArrowDirection - * @property {number} x - left position of popup layer - * @property {string} arrowDirection - direction of popup arrow - */ - return { - x: x, - arrowDirection: arrowDirection - }; -}; - -/** - * Calculate rendering position usering guide elements - * @param {{width: {number}, height: {number}}} layerSize - popup layer's width and height - * @param {{top: {number}, left: {number}, right: {number}, bottom: {number}}} containerBound - width and height of the upper layer, that acts as a border of popup - * @param {{top: {number}, left: {number}, right: {number}, bottom: {number}}} scheduleBound - guide element bound data - * @returns {PopupRenderingData} rendering position of popup and popup arrow - */ -ScheduleDetailPopup.prototype._calcRenderingData = function(layerSize, containerBound, scheduleBound) { - var yPosInfo = this._getYAndArrowTop( - scheduleBound.top, - scheduleBound.bottom, - layerSize.height, - containerBound.top, - containerBound.bottom - ); - var xPosInfo = this._getXAndArrowDirection( - scheduleBound.left, - scheduleBound.right, - layerSize.width, - containerBound.left, - containerBound.right - ); - - /** - * @typedef {Object} PopupRenderingData - * @property {number} x - left position - * @property {number} y - top position - * @property {string} arrow.direction - direction of popup arrow - * @property {number} [arrow.position] - relative position of popup arrow, if it is not set, arrow appears on the middle of popup - */ - return { - x: xPosInfo.x, - y: yPosInfo.y, - arrow: { - direction: xPosInfo.arrowDirection, - position: yPosInfo.arrowTop - } - }; -}; - -/** - * Set arrow's direction and position - * @param {Object} arrow rendering data for popup arrow - */ -ScheduleDetailPopup.prototype._setArrowDirection = function(arrow) { - var direction = arrow.direction || 'arrow-left'; - var arrowEl = domutil.find(config.classname('.popup-arrow'), this.layer.container); - var borderElement = domutil.find(config.classname('.popup-arrow-border'), arrowEl); - - if (direction !== config.classname('arrow-left')) { - domutil.removeClass(arrowEl, config.classname('arrow-left')); - domutil.addClass(arrowEl, config.classname(direction)); - } - - if (arrow.position) { - borderElement.style.top = arrow.position + 'px'; - } -}; - -/** - * Hide layer - */ -ScheduleDetailPopup.prototype.hide = function() { - this.layer.hide(); - - if (this.guide) { - this.guide.clearGuideElement(); - this.guide = null; - } - - domevent.off(document.body, 'mousedown', this._onMouseDown, this); -}; - -/** - * refresh layer - */ -ScheduleDetailPopup.prototype.refresh = function() { - if (this._viewModel) { - this.layer.setContent(this.tmpl(this._viewModel)); - } -}; - -module.exports = ScheduleDetailPopup; - - -/***/ }), - -/***/ "./src/js/view/template/helper.js": -/*!****************************************!*\ - !*** ./src/js/view/template/helper.js ***! - \****************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_808922__) { - -"use strict"; -/* eslint complexity: 0 */ -/** - * @fileoverview Helpers for handlebar templates. - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_808922__(/*! tui-code-snippet */ "tui-code-snippet"); -var Handlebars = __nested_webpack_require_808922__(/*! handlebars-template-loader/runtime */ "./node_modules/handlebars-template-loader/runtime/index.js"); -var datetime = __nested_webpack_require_808922__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); -var common = __nested_webpack_require_808922__(/*! ../../common/common */ "./src/js/common/common.js"); -var config = __nested_webpack_require_808922__(/*! ../../config */ "./src/js/config.js"); -var mmax = Math.max; -var SIXTY_MINUTES = 60; -var helpers = { - /** - * Stamp supplied object - * - * Commonly use for rendering object's unique ID to rendered view - * @param {object} obj - object to stamp - * @returns {number} stamp value - */ - 'stamp': function(obj) { - return util.stamp(obj); - }, - - /** - * Whether supplied object are equal? - * @param {*} a - a - * @param {*} b - b - * @returns {boolean} result of operation - */ - 'equal': function(a, b) { - return a === b; - }, - - /** - * OR - * @param {*} a - a - * @param {*} b - b - * @returns {boolean} or - */ - 'or': function(a, b) { - return a || b; - }, - - /** - * AND - * @param {*} a - a - * @param {*} b - b - * @returns {boolean} or - */ - 'and': function(a, b) { - return a && b; - }, - - /** - * Compare object or apply logical operation by customizable oper parameter - * @param {*} a - a - * @param {string} oper - operator ex) '==', '<' - * @param {*} b - b - * @param {Handlebars} options - handlebar options - * @returns {boolean} result of operation - */ - 'fi': function(a, oper, b, options) { - switch (oper) { - case '==': - return (a == b) ? options.fn(this) : options.inverse(this); // eslint-disable-line - case '===': - return (a === b) ? options.fn(this) : options.inverse(this); - case '!==': - return (a !== b) ? options.fn(this) : options.inverse(this); - case '<': - return (a < b) ? options.fn(this) : options.inverse(this); - case '||': - return (a || b) ? options.fn(this) : options.inverse(this); - default: - throw new Error('Not match operation'); - } - }, - - /** - * Get hhmm formatted time str - * @param {Date} date - date object - * @returns {string} formatted value - */ - 'hhmm': function(date) { - return datetime.format(date, 'HH:mm'); - }, - - /** - * Get `width` stylesheet string - * @param {number} width - width percentage - * @returns {string} css style part - */ - 'common-width': function(width) { - return getElSize(width, '%', 'width'); - }, - - /** - * Get element left based on narrowWeekend - * @param {object} viewModel - view model - * @param {Array} grids - dates information - * @returns {number} element left - */ - 'grid-left': function(viewModel, grids) { - return getElLeft(viewModel, grids); - }, - - /** - * Get element width based on narrowWeekend - * @param {object} viewModel - view model - * @param {Array} grids - dates information - * @returns {number} element width - */ - 'grid-width': function(viewModel, grids) { - return getElWidth(viewModel, grids); - }, - - /** - * Use in time.hbs - * @param {ScheduleViewModel} viewModel viewModel - * @returns {string} element size css class - */ - 'time-scheduleBlock': function(viewModel) { - var top = getElSize(viewModel.top, 'px', 'top'), - left = getElSize(viewModel.left, '%', 'left'), - width = getElSize(viewModel.width, '%', 'width'), - height = getElSize(viewModel.height, 'px', 'height'); - - return [top, left, width, height].join(';'); - }, - - 'month-scheduleBlock': function(viewModel, grids, blockHeight, paddingTop) { - var top = getElSize(((viewModel.top - 1) * blockHeight) + paddingTop, 'px', 'top'); - var left = getElSize(grids[viewModel.left] ? grids[viewModel.left].left : 0, '%', 'left'); - var width = getElSize(getElWidth(viewModel, grids), '%', 'width'); - var height = getElSize(viewModel.height, 'px', 'height'); - - return [top, left, width, height].join(';'); - }, - - 'holiday': function(day) { - var cssClass = ''; - - if (day === 0) { - cssClass = config.classname('holiday-sun'); - } - - if (day === 6) { - cssClass = config.classname('holiday-sat'); - } - - return cssClass; - }, - - /** - * Add supplied two parameter - * @param {*} a - a - * @param {*} b - b - * @returns {number} result of operation - */ - 'add': function(a, b) { - return a + b; - }, - - /** - * Multiply supplied two parameter - * @param {*} a - a - * @param {*} b - b - * @returns {number} result of operation - */ - 'multiply': function(a, b) { - return a * b; - }, - - /** - * Divide supplied two parameter - * @param {*} a - a - * @param {*} b - b - * @returns {number} result of operation - */ - 'divide': function(a, b) { - return a / b; - }, - - /** - * Subtract supplied two parameter - * @param {*} a - a - * @param {*} b - b - * @returns {number} result of operation - */ - 'subtract': function(a, b) { - return a - b; - }, - - 'getRight': function(a, b) { - return mmax(0, 100 - (a + b)); - }, - - /** - * Get css prefix in global configuration - * @returns {string} css prefix - */ - 'CSS_PREFIX': function() { - return config.cssPrefix; - }, - - 'reverse': function(array) { - return array.slice().reverse(); - }, - - /********** - * Default schedule template - **********/ - - 'milestone-tmpl': function(model) { - var icon = config.classname('icon'); - var iconName = config.classname('ic-milestone'); - - return '' + common.stripTags(model.title) + ''; - }, - - 'milestoneTitle-tmpl': function() { - var className = config.classname('left-content'); - - return 'Milestone'; - }, - - 'task-tmpl': function(model) { - return '#' + model.title; - }, - - 'taskTitle-tmpl': function() { - var className = config.classname('left-content'); - - return 'Task'; - }, - - 'alldayTitle-tmpl': function() { - var className = config.classname('left-content'); - - return 'All Day'; - }, - - 'allday-tmpl': function(model) { - return common.stripTags(model.title); - }, - - 'time-tmpl': function(model) { - return common.stripTags(model.title); - }, - - 'goingDuration-tmpl': function(model) { - var goingDuration = model.goingDuration; - var hour = parseInt(goingDuration / SIXTY_MINUTES, 10); - var minutes = goingDuration % SIXTY_MINUTES; - - return 'GoingTime ' + datetime.leadingZero(hour, 2) + ':' + datetime.leadingZero(minutes, 2); - }, - - 'comingDuration-tmpl': function(model) { - var goingDuration = model.goingDuration; - var hour = parseInt(goingDuration / SIXTY_MINUTES, 10); - var minutes = goingDuration % SIXTY_MINUTES; - - return 'ComingTime ' + datetime.leadingZero(hour, 2) + ':' + datetime.leadingZero(minutes, 2); - }, - - 'monthMoreTitleDate-tmpl': function(date, dayname) { - var classDay = config.classname('month-more-title-day'); - var classDayLabel = config.classname('month-more-title-day-label'); - var day = util.pick(date.split('.'), 2); - - return '' + day + ' ' + dayname + ''; - }, - - 'monthMoreClose-tmpl': function() { - return ''; - }, - - 'monthGridHeader-tmpl': function(model) { - var date = parseInt(model.date.split('-')[2], 10); - var classNames = []; - - classNames.push(config.classname('weekday-grid-date')); - if (model.isToday) { - classNames.push(config.classname('weekday-grid-date-decorator')); - } - - return '' + date + ''; - }, - - 'monthGridHeaderExceed-tmpl': function(hiddenSchedules) { - var className = config.classname('weekday-grid-more-schedules'); - - return '' + hiddenSchedules + ' more'; - }, - - 'monthGridFooter-tmpl': function() { - return ''; - }, - - /* eslint no-unused-vars: 0 */ - 'monthGridFooterExceed-tmpl': function(hiddenSchedules) { - return ''; - }, - - 'monthDayname-tmpl': function(model) { - return model.label; - }, - - 'weekDayname-tmpl': function(model) { - var classDate = config.classname('dayname-date'); - var className = config.classname('dayname-name'); - - return '' + model.date + '  ' + model.dayName + ''; - }, - - 'weekGridFooterExceed-tmpl': function(hiddenSchedules) { - return '+' + hiddenSchedules; - }, - - 'dayGridTitle-tmpl': function(viewName) { - var tmpl = Handlebars.helpers[viewName + 'Title-tmpl']; - if (tmpl) { - return tmpl(viewName); - } - - return viewName; - }, - - 'schedule-tmpl': function(model) { - var tmpl = Handlebars.helpers[model.category + '-tmpl']; - if (tmpl) { - return tmpl(model); - } - - return ''; - }, - - 'collapseBtnTitle-tmpl': function() { - var iconName = config.classname('icon'); - var closeIconName = config.classname('ic-arrow-solid-top'); - - return ''; - }, - - 'timezoneDisplayLabel-tmpl': function(timezoneOffset, displayLabel) { - var gmt, hour, minutes; - - if (util.isUndefined(displayLabel)) { - gmt = timezoneOffset < 0 ? '-' : '+'; - hour = Math.abs(parseInt(timezoneOffset / SIXTY_MINUTES, 10)); - minutes = Math.abs(timezoneOffset % SIXTY_MINUTES); - displayLabel = gmt + datetime.leadingZero(hour, 2) + ':' + datetime.leadingZero(minutes, 2); - } - - return displayLabel; - }, - - 'timegridDisplayPrimayTime-tmpl': function(time) { - /* TODO: 삭제 필요 (will be deprecated) */ - return Handlebars.helpers['timegridDisplayPrimaryTime-tmpl'](time); - }, - - 'timegridDisplayPrimaryTime-tmpl': function(time) { - var hour = time.hour; - var meridiem = hour >= 12 ? 'pm' : 'am'; - - if (hour > 12) { - hour = hour - 12; - } - - return hour + ' ' + meridiem; - }, - - 'timegridDisplayTime-tmpl': function(time) { - return datetime.leadingZero(time.hour, 2) + ':' + datetime.leadingZero(time.minutes, 2); - }, - - 'timegridCurrentTime-tmpl': function(timezone) { - var templates = []; - - if (timezone.dateDifference) { - templates.push('[' + timezone.dateDifferenceSign + timezone.dateDifference + ']
'); - } - - templates.push(datetime.format(timezone.hourmarker, 'HH:mm')); - - return templates.join(''); - }, - - 'popupIsAllDay-tmpl': function() { - return 'All day'; - }, - - 'popupStateFree-tmpl': function() { - return 'Free'; - }, - - 'popupStateBusy-tmpl': function() { - return 'Busy'; - }, - - 'titlePlaceholder-tmpl': function() { - return 'Subject'; - }, - - 'locationPlaceholder-tmpl': function() { - return 'Location'; - }, - - 'startDatePlaceholder-tmpl': function() { - return 'Start date'; - }, - - 'endDatePlaceholder-tmpl': function() { - return 'End date'; - }, - 'popupSave-tmpl': function() { - return 'Save'; - }, - 'popupUpdate-tmpl': function() { - return 'Update'; - }, - 'popupDetailDate-tmpl': function(isAllDay, start, end) { - var isSameDate = datetime.isSameDate(start, end); - var endFormat = (isSameDate ? '' : 'YYYY.MM.DD ') + 'hh:mm tt'; - - if (isAllDay) { - return datetime.format(start, 'YYYY.MM.DD') + (isSameDate ? '' : ' - ' + datetime.format(end, 'YYYY.MM.DD')); - } - - return (datetime.format(start, 'YYYY.MM.DD hh:mm tt') + ' - ' + datetime.format(end, endFormat)); - }, - 'popupDetailLocation-tmpl': function(schedule) { - return schedule.location; - }, - 'popupDetailUser-tmpl': function(schedule) { - return (schedule.attendees || []).join(', '); - }, - 'popupDetailState-tmpl': function(schedule) { - return schedule.state || 'Busy'; - }, - 'popupDetailRepeat-tmpl': function(schedule) { - return schedule.recurrenceRule; - }, - 'popupDetailBody-tmpl': function(schedule) { - return schedule.body; - }, - 'popupEdit-tmpl': function() { - return 'Edit'; - }, - 'popupDelete-tmpl': function() { - return 'Delete'; - } -}; - -/** - * Get CSS syntax for element size - * @param {number} value - size value to apply element - * @param {string} postfix - postfix string ex) px, em, % - * @param {string} prefix - property name ex) width, height - * @returns {string} CSS syntax - */ -function getElSize(value, postfix, prefix) { - prefix = prefix || ''; - if (util.isNumber(value)) { - return prefix + ':' + value + postfix; - } - - return prefix + ':auto'; -} - -/** - * Get element left based on narrowWeekend - * @param {object} viewModel - view model - * @param {Array} grids - dates information - * @returns {number} element left - */ -function getElLeft(viewModel, grids) { - return grids[viewModel.left] ? grids[viewModel.left].left : 0; -} - -/** - * Get element width based on narrowWeekend - * @param {object} viewModel - view model - * @param {Array} grids - dates information - * @returns {number} element width - */ -function getElWidth(viewModel, grids) { - var width = 0; - var i = 0; - var length = grids.length; - var left; - for (; i < viewModel.width; i += 1) { - left = (viewModel.left + i) % length; - left += parseInt((viewModel.left + i) / length, 10); - if (left < length) { - width += grids[left] ? grids[left].width : 0; - } - } - - return width; -} - -Handlebars.registerHelper(helpers); - - -/***/ }), - -/***/ "./src/js/view/template/month/month.hbs": -/*!**********************************************!*\ - !*** ./src/js/view/template/month/month.hbs ***! - \**********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_823887__) { - -var Handlebars = __nested_webpack_require_823887__(/*! ./node_modules/handlebars/runtime.js */ "./node_modules/handlebars/runtime.js"); -module.exports = (Handlebars['default'] || Handlebars).template({"1":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
\n \n " - + ((stack1 = (lookupProperty(helpers,"monthDayname-tmpl")||(depth0 && lookupProperty(depth0,"monthDayname-tmpl"))||alias2).call(alias1,depth0,{"name":"monthDayname-tmpl","hash":{},"data":data,"loc":{"start":{"line":16,"column":12},"end":{"line":16,"column":40}}})) != null ? stack1 : "") - + "\n \n
\n"; -},"2":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " border-right: " - + container.escapeExpression(container.lambda(((stack1 = ((stack1 = (data && lookupProperty(data,"root"))) && lookupProperty(stack1,"styles"))) && lookupProperty(stack1,"borderLeft")), depth0)) - + ";\n"; -},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.escapeExpression, alias3=container.lambda, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
\n" - + ((stack1 = lookupProperty(helpers,"each").call(alias1,(depth0 != null ? lookupProperty(depth0,"daynames") : depth0),{"name":"each","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":3,"column":0},"end":{"line":19,"column":9}}})) != null ? stack1 : "") - + "
\n"; -},"useData":true}); - -/***/ }), - -/***/ "./src/js/view/template/month/more.hbs": -/*!*********************************************!*\ - !*** ./src/js/view/template/month/more.hbs ***! - \*********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_830885__) { - -var Handlebars = __nested_webpack_require_830885__(/*! ./node_modules/handlebars/runtime.js */ "./node_modules/handlebars/runtime.js"); -module.exports = (Handlebars['default'] || Handlebars).template({"1":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return ((stack1 = (lookupProperty(helpers,"fi")||(depth0 && lookupProperty(depth0,"fi"))||container.hooks.helperMissing).call(depth0 != null ? depth0 : (container.nullContext || {}),((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"isAllDay") : stack1),"||",(depth0 != null ? lookupProperty(depth0,"hasMultiDates") : depth0),{"name":"fi","hash":{},"fn":container.program(2, data, 0),"inverse":container.program(7, data, 0),"data":data,"loc":{"start":{"line":9,"column":8},"end":{"line":65,"column":15}}})) != null ? stack1 : ""); -},"2":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3=container.escapeExpression, alias4=container.lambda, alias5="function", lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
\n " - + ((stack1 = (lookupProperty(helpers,"allday-tmpl")||(depth0 && lookupProperty(depth0,"allday-tmpl"))||alias2).call(alias1,(depth0 != null ? lookupProperty(depth0,"model") : depth0),{"name":"allday-tmpl","hash":{},"data":data,"loc":{"start":{"line":20,"column":20},"end":{"line":20,"column":43}}})) != null ? stack1 : "") - + "\n
\n"; -},"3":function(container,depth0,helpers,partials,data) { - var stack1, alias1=container.lambda, alias2=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " color: #ffffff; background-color:" - + alias2(alias1(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"color") : stack1), depth0)) - + "; border-left:3px solid " - + alias2(alias1(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"borderColor") : stack1), depth0)) - + ";\n"; -},"5":function(container,depth0,helpers,partials,data) { - var stack1, alias1=container.lambda, alias2=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " color:" - + alias2(alias1(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"color") : stack1), depth0)) - + "; background-color:" - + alias2(alias1(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"bgColor") : stack1), depth0)) - + "; border-left:3px solid " - + alias2(alias1(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"borderColor") : stack1), depth0)) - + ";\n"; -},"7":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return ((stack1 = (lookupProperty(helpers,"fi")||(depth0 && lookupProperty(depth0,"fi"))||container.hooks.helperMissing).call(depth0 != null ? depth0 : (container.nullContext || {}),((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"category") : stack1),"===","time",{"name":"fi","hash":{},"fn":container.program(8, data, 0),"inverse":container.program(17, data, 0),"data":data,"loc":{"start":{"line":23,"column":12},"end":{"line":64,"column":19}}})) != null ? stack1 : ""); -},"8":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3=container.escapeExpression, alias4=container.lambda, alias5="function", lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
\n \n " - + ((stack1 = (lookupProperty(helpers,"time-tmpl")||(depth0 && lookupProperty(depth0,"time-tmpl"))||alias2).call(alias1,(depth0 != null ? lookupProperty(depth0,"model") : depth0),{"name":"time-tmpl","hash":{},"data":data,"loc":{"start":{"line":42,"column":53},"end":{"line":42,"column":74}}})) != null ? stack1 : "") - + "\n
\n"; -},"9":function(container,depth0,helpers,partials,data) { - return " background: #ffffff\n"; -},"11":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " background:" - + container.escapeExpression(container.lambda(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"borderColor") : stack1), depth0)) - + "\n "; -},"13":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "\n color: #ffffff;\n background-color: " - + container.escapeExpression(container.lambda(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"color") : stack1), depth0)) - + "\n"; -},"15":function(container,depth0,helpers,partials,data) { - return " color:#333;\n "; -},"17":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3=container.escapeExpression, alias4=container.lambda, alias5="function", lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
\n " - + ((stack1 = (lookupProperty(helpers,"schedule-tmpl")||(depth0 && lookupProperty(depth0,"schedule-tmpl"))||alias2).call(alias1,(depth0 != null ? lookupProperty(depth0,"model") : depth0),{"name":"schedule-tmpl","hash":{},"data":data,"loc":{"start":{"line":62,"column":65},"end":{"line":62,"column":90}}})) != null ? stack1 : "") - + "\n
\n"; -},"18":function(container,depth0,helpers,partials,data) { - var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return container.escapeExpression(((helper = (helper = lookupProperty(helpers,"CSS_PREFIX") || (depth0 != null ? lookupProperty(depth0,"CSS_PREFIX") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data,"loc":{"start":{"line":47,"column":115},"end":{"line":47,"column":129}}}) : helper))) - + "weekday-schedule-focused "; -},"20":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " margin-left: " - + container.escapeExpression(container.lambda(((stack1 = ((stack1 = (data && lookupProperty(data,"root"))) && lookupProperty(stack1,"styles"))) && lookupProperty(stack1,"marginLeft")), depth0)) - + ";\n"; -},"22":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " margin-right: " - + container.escapeExpression(container.lambda(((stack1 = ((stack1 = (data && lookupProperty(data,"root"))) && lookupProperty(stack1,"styles"))) && lookupProperty(stack1,"marginRight")), depth0)) - + ";\n"; -},"24":function(container,depth0,helpers,partials,data) { - var stack1, alias1=container.lambda, alias2=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " color: #ffffff; background-color:" - + alias2(alias1(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"color") : stack1), depth0)) - + "; border-color:" - + alias2(alias1(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"color") : stack1), depth0)) - + ";\n"; -},"26":function(container,depth0,helpers,partials,data) { - var stack1, alias1=container.lambda, alias2=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " color:" - + alias2(alias1(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"color") : stack1), depth0)) - + "; background-color:" - + alias2(alias1(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"bgColor") : stack1), depth0)) - + "; border-color:" - + alias2(alias1(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"borderColor") : stack1), depth0)) - + ";\n"; -},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
\n
\n " - + ((stack1 = (lookupProperty(helpers,"monthMoreTitleDate-tmpl")||(depth0 && lookupProperty(depth0,"monthMoreTitleDate-tmpl"))||alias2).call(alias1,(depth0 != null ? lookupProperty(depth0,"date") : depth0),(depth0 != null ? lookupProperty(depth0,"dayname") : depth0),{"name":"monthMoreTitleDate-tmpl","hash":{},"data":data,"loc":{"start":{"line":4,"column":58},"end":{"line":4,"column":100}}})) != null ? stack1 : "") - + "\n \n
\n
\n" - + ((stack1 = lookupProperty(helpers,"each").call(alias1,(depth0 != null ? lookupProperty(depth0,"schedules") : depth0),{"name":"each","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":8,"column":8},"end":{"line":66,"column":17}}})) != null ? stack1 : "") - + "
\n
\n"; -},"useData":true}); - -/***/ }), - -/***/ "./src/js/view/template/month/weekdayInMonth.hbs": -/*!*******************************************************!*\ - !*** ./src/js/view/template/month/weekdayInMonth.hbs ***! - \*******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_860220__) { - -var Handlebars = __nested_webpack_require_860220__(/*! ./node_modules/handlebars/runtime.js */ "./node_modules/handlebars/runtime.js"); -module.exports = (Handlebars['default'] || Handlebars).template({"1":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
\n
\n " - + ((stack1 = (lookupProperty(helpers,"monthGridHeader-tmpl")||(depth0 && lookupProperty(depth0,"monthGridHeader-tmpl"))||alias2).call(alias1,depth0,{"name":"monthGridHeader-tmpl","hash":{},"data":data,"loc":{"start":{"line":14,"column":44},"end":{"line":14,"column":75}}})) != null ? stack1 : "") - + "\n" - + ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"hiddenSchedules") : depth0),{"name":"if","hash":{},"fn":container.program(10, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":15,"column":12},"end":{"line":17,"column":19}}})) != null ? stack1 : "") - + "
\n
\n " - + ((stack1 = (lookupProperty(helpers,"monthGridFooter-tmpl")||(depth0 && lookupProperty(depth0,"monthGridFooter-tmpl"))||alias2).call(alias1,depth0,{"name":"monthGridFooter-tmpl","hash":{},"data":data,"loc":{"start":{"line":20,"column":44},"end":{"line":20,"column":75}}})) != null ? stack1 : "") - + "\n" - + ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"hiddenSchedules") : depth0),{"name":"if","hash":{},"fn":container.program(12, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":21,"column":12},"end":{"line":23,"column":19}}})) != null ? stack1 : "") - + "
\n
\n"; -},"2":function(container,depth0,helpers,partials,data) { - var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " " - + container.escapeExpression(((helper = (helper = lookupProperty(helpers,"CSS_PREFIX") || (depth0 != null ? lookupProperty(depth0,"CSS_PREFIX") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data,"loc":{"start":{"line":7,"column":84},"end":{"line":7,"column":98}}}) : helper))) - + "near-month-day"; -},"4":function(container,depth0,helpers,partials,data) { - var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " " - + container.escapeExpression(((helper = (helper = lookupProperty(helpers,"CSS_PREFIX") || (depth0 != null ? lookupProperty(depth0,"CSS_PREFIX") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data,"loc":{"start":{"line":7,"column":135},"end":{"line":7,"column":149}}}) : helper))) - + "today"; -},"6":function(container,depth0,helpers,partials,data) { - var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " " - + container.escapeExpression(((helper = (helper = lookupProperty(helpers,"CSS_PREFIX") || (depth0 != null ? lookupProperty(depth0,"CSS_PREFIX") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data,"loc":{"start":{"line":7,"column":182},"end":{"line":7,"column":196}}}) : helper))) - + "extra-date"; -},"8":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " border-right:" - + container.escapeExpression(container.lambda(((stack1 = ((stack1 = (data && lookupProperty(data,"root"))) && lookupProperty(stack1,"styles"))) && lookupProperty(stack1,"borderLeft")), depth0)) - + ";\n"; -},"10":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " " - + ((stack1 = (lookupProperty(helpers,"monthGridHeaderExceed-tmpl")||(depth0 && lookupProperty(depth0,"monthGridHeaderExceed-tmpl"))||alias2).call(alias1,(depth0 != null ? lookupProperty(depth0,"hiddenSchedules") : depth0),{"name":"monthGridHeaderExceed-tmpl","hash":{},"data":data,"loc":{"start":{"line":16,"column":87},"end":{"line":16,"column":135}}})) != null ? stack1 : "") - + "\n"; -},"12":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " " - + ((stack1 = (lookupProperty(helpers,"monthGridFooterExceed-tmpl")||(depth0 && lookupProperty(depth0,"monthGridFooterExceed-tmpl"))||alias2).call(alias1,(depth0 != null ? lookupProperty(depth0,"hiddenSchedules") : depth0),{"name":"monthGridFooterExceed-tmpl","hash":{},"data":data,"loc":{"start":{"line":22,"column":87},"end":{"line":22,"column":135}}})) != null ? stack1 : "") - + "\n"; -},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
\n
\n" - + ((stack1 = lookupProperty(helpers,"each").call(alias1,(depth0 != null ? lookupProperty(depth0,"dates") : depth0),{"name":"each","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":6,"column":0},"end":{"line":26,"column":11}}})) != null ? stack1 : "") - + "
\n
\n"; -},"useData":true}); - -/***/ }), - -/***/ "./src/js/view/template/month/weekdayInMonthSchedule.hbs": -/*!***************************************************************!*\ - !*** ./src/js/view/template/month/weekdayInMonthSchedule.hbs ***! - \***************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_875747__) { - -var Handlebars = __nested_webpack_require_875747__(/*! ./node_modules/handlebars/runtime.js */ "./node_modules/handlebars/runtime.js"); -module.exports = (Handlebars['default'] || Handlebars).template({"1":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return ((stack1 = lookupProperty(helpers,"each").call(depth0 != null ? depth0 : (container.nullContext || {}),depth0,{"name":"each","hash":{},"fn":container.program(2, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":2,"column":0},"end":{"line":80,"column":11}}})) != null ? stack1 : ""); -},"2":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "\n" - + ((stack1 = lookupProperty(helpers,"each").call(depth0 != null ? depth0 : (container.nullContext || {}),depth0,{"name":"each","hash":{},"fn":container.program(3, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":3,"column":0},"end":{"line":79,"column":11}}})) != null ? stack1 : ""); -},"3":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "\n" - + ((stack1 = lookupProperty(helpers,"if").call(depth0 != null ? depth0 : (container.nullContext || {}),depth0,{"name":"if","hash":{},"fn":container.program(4, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":4,"column":0},"end":{"line":78,"column":9}}})) != null ? stack1 : ""); -},"4":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "\n" - + ((stack1 = (lookupProperty(helpers,"fi")||(depth0 && lookupProperty(depth0,"fi"))||container.hooks.helperMissing).call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? lookupProperty(depth0,"top") : depth0),"<",((stack1 = (data && lookupProperty(data,"root"))) && lookupProperty(stack1,"renderLimitIdx")),{"name":"fi","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":5,"column":4},"end":{"line":77,"column":13}}})) != null ? stack1 : ""); -},"5":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3=container.escapeExpression, alias4="function", lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
\n" - + ((stack1 = (lookupProperty(helpers,"fi")||(depth0 && lookupProperty(depth0,"fi"))||alias2).call(alias1,((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"isAllDay") : stack1),"||",(depth0 != null ? lookupProperty(depth0,"hasMultiDates") : depth0),{"name":"fi","hash":{},"fn":container.program(10, data, 0),"inverse":container.program(23, data, 0),"data":data,"loc":{"start":{"line":13,"column":8},"end":{"line":75,"column":15}}})) != null ? stack1 : "") - + "
\n"; -},"6":function(container,depth0,helpers,partials,data) { - var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " " - + container.escapeExpression(((helper = (helper = lookupProperty(helpers,"CSS_PREFIX") || (depth0 != null ? lookupProperty(depth0,"CSS_PREFIX") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data,"loc":{"start":{"line":9,"column":31},"end":{"line":9,"column":45}}}) : helper))) - + "weekday-exceed-left"; -},"8":function(container,depth0,helpers,partials,data) { - var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " " - + container.escapeExpression(((helper = (helper = lookupProperty(helpers,"CSS_PREFIX") || (depth0 != null ? lookupProperty(depth0,"CSS_PREFIX") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data,"loc":{"start":{"line":10,"column":32},"end":{"line":10,"column":46}}}) : helper))) - + "weekday-exceed-right"; -},"10":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=container.lambda, alias2=container.escapeExpression, alias3=depth0 != null ? depth0 : (container.nullContext || {}), alias4=container.hooks.helperMissing, alias5="function", lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
\n " - + ((stack1 = (lookupProperty(helpers,"allday-tmpl")||(depth0 && lookupProperty(depth0,"allday-tmpl"))||alias4).call(alias3,(depth0 != null ? lookupProperty(depth0,"model") : depth0),{"name":"allday-tmpl","hash":{},"data":data,"loc":{"start":{"line":29,"column":47},"end":{"line":29,"column":70}}})) != null ? stack1 : "") - + "\n " - + ((stack1 = lookupProperty(helpers,"unless").call(alias3,(lookupProperty(helpers,"or")||(depth0 && lookupProperty(depth0,"or"))||alias4).call(alias3,((stack1 = (data && lookupProperty(data,"root"))) && lookupProperty(stack1,"isReadOnly")),((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"isReadOnly") : stack1),{"name":"or","hash":{},"data":data,"loc":{"start":{"line":30,"column":22},"end":{"line":30,"column":60}}}),{"name":"unless","hash":{},"fn":container.program(21, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":30,"column":12},"end":{"line":30,"column":194}}})) != null ? stack1 : "") - + "\n
\n"; -},"11":function(container,depth0,helpers,partials,data) { - var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return container.escapeExpression(((helper = (helper = lookupProperty(helpers,"CSS_PREFIX") || (depth0 != null ? lookupProperty(depth0,"CSS_PREFIX") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data,"loc":{"start":{"line":14,"column":146},"end":{"line":14,"column":160}}}) : helper))) - + "weekday-schedule-focused "; -},"13":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " margin-left: " - + container.escapeExpression(container.lambda(((stack1 = ((stack1 = (data && lookupProperty(data,"root"))) && lookupProperty(stack1,"styles"))) && lookupProperty(stack1,"marginLeft")), depth0)) - + ";\n"; -},"15":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " margin-right: " - + container.escapeExpression(container.lambda(((stack1 = ((stack1 = (data && lookupProperty(data,"root"))) && lookupProperty(stack1,"styles"))) && lookupProperty(stack1,"marginRight")), depth0)) - + ";\n"; -},"17":function(container,depth0,helpers,partials,data) { - var stack1, alias1=container.lambda, alias2=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " color: #ffffff; background-color:" - + alias2(alias1(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"color") : stack1), depth0)) - + "; border-color:" - + alias2(alias1(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"color") : stack1), depth0)) - + ";\n"; -},"19":function(container,depth0,helpers,partials,data) { - var stack1, alias1=container.lambda, alias2=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " color:" - + alias2(alias1(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"color") : stack1), depth0)) - + "; background-color:" - + alias2(alias1(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"bgColor") : stack1), depth0)) - + "; border-color:" - + alias2(alias1(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"borderColor") : stack1), depth0)) - + ";\n"; -},"21":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " "; -},"23":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return ((stack1 = (lookupProperty(helpers,"fi")||(depth0 && lookupProperty(depth0,"fi"))||container.hooks.helperMissing).call(depth0 != null ? depth0 : (container.nullContext || {}),((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"category") : stack1),"===","time",{"name":"fi","hash":{},"fn":container.program(24, data, 0),"inverse":container.program(33, data, 0),"data":data,"loc":{"start":{"line":33,"column":12},"end":{"line":74,"column":19}}})) != null ? stack1 : ""); -},"24":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=container.lambda, alias2=container.escapeExpression, alias3=depth0 != null ? depth0 : (container.nullContext || {}), alias4=container.hooks.helperMissing, alias5="function", lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
\n \n " - + ((stack1 = (lookupProperty(helpers,"time-tmpl")||(depth0 && lookupProperty(depth0,"time-tmpl"))||alias4).call(alias3,(depth0 != null ? lookupProperty(depth0,"model") : depth0),{"name":"time-tmpl","hash":{},"data":data,"loc":{"start":{"line":54,"column":53},"end":{"line":54,"column":74}}})) != null ? stack1 : "") - + "\n
\n"; -},"25":function(container,depth0,helpers,partials,data) { - return " background: #ffffff\n"; -},"27":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " background:" - + container.escapeExpression(container.lambda(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"borderColor") : stack1), depth0)) - + "\n"; -},"29":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " color: #ffffff;\n background-color: " - + container.escapeExpression(container.lambda(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"color") : stack1), depth0)) - + "\n"; -},"31":function(container,depth0,helpers,partials,data) { - return " color:#333;\n"; -},"33":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=container.lambda, alias2=container.escapeExpression, alias3=depth0 != null ? depth0 : (container.nullContext || {}), alias4=container.hooks.helperMissing, alias5="function", lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
\n " - + ((stack1 = (lookupProperty(helpers,"schedule-tmpl")||(depth0 && lookupProperty(depth0,"schedule-tmpl"))||alias4).call(alias3,(depth0 != null ? lookupProperty(depth0,"model") : depth0),{"name":"schedule-tmpl","hash":{},"data":data,"loc":{"start":{"line":72,"column":65},"end":{"line":72,"column":90}}})) != null ? stack1 : "") - + "\n
\n"; -},"34":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " margin-left: " - + container.escapeExpression(container.lambda(((stack1 = ((stack1 = (data && lookupProperty(data,"root"))) && lookupProperty(stack1,"styles"))) && lookupProperty(stack1,"marginLeft")), depth0)) - + ";\n"; -},"36":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " margin-right: " - + container.escapeExpression(container.lambda(((stack1 = ((stack1 = (data && lookupProperty(data,"root"))) && lookupProperty(stack1,"styles"))) && lookupProperty(stack1,"marginRight")), depth0)) - + ";\n"; -},"38":function(container,depth0,helpers,partials,data) { - var stack1, alias1=container.lambda, alias2=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " color: #ffffff; background-color:" - + alias2(alias1(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"color") : stack1), depth0)) - + "; border-color:" - + alias2(alias1(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"color") : stack1), depth0)) - + ";\n"; -},"40":function(container,depth0,helpers,partials,data) { - var stack1, alias1=container.lambda, alias2=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " color:" - + alias2(alias1(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"color") : stack1), depth0)) - + "; background-color:" - + alias2(alias1(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"bgColor") : stack1), depth0)) - + "; border-color:" - + alias2(alias1(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"borderColor") : stack1), depth0)) - + ";\n"; -},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return ((stack1 = lookupProperty(helpers,"each").call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? lookupProperty(depth0,"matrices") : depth0),{"name":"each","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":1,"column":0},"end":{"line":81,"column":11}}})) != null ? stack1 : ""); -},"useData":true}); - -/***/ }), - -/***/ "./src/js/view/template/popup/scheduleCreationPopup.hbs": -/*!**************************************************************!*\ - !*** ./src/js/view/template/popup/scheduleCreationPopup.hbs ***! - \**************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_909037__) { - -var Handlebars = __nested_webpack_require_909037__(/*! ./node_modules/handlebars/runtime.js */ "./node_modules/handlebars/runtime.js"); -module.exports = (Handlebars['default'] || Handlebars).template({"1":function(container,depth0,helpers,partials,data) { - var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " " - + container.escapeExpression(((helper = (helper = lookupProperty(helpers,"CSS_PREFIX") || (depth0 != null ? lookupProperty(depth0,"CSS_PREFIX") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data,"loc":{"start":{"line":3,"column":150},"end":{"line":3,"column":164}}}) : helper))) - + "hide"; -},"3":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
  • \n \n " - + alias4(((helper = (helper = lookupProperty(helpers,"name") || (depth0 != null ? lookupProperty(depth0,"name") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"name","hash":{},"data":data,"loc":{"start":{"line":13,"column":60},"end":{"line":13,"column":68}}}) : helper))) - + "\n
  • \n"; -},"5":function(container,depth0,helpers,partials,data) { - var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " " - + container.escapeExpression(((helper = (helper = lookupProperty(helpers,"CSS_PREFIX") || (depth0 != null ? lookupProperty(depth0,"CSS_PREFIX") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data,"loc":{"start":{"line":23,"column":135},"end":{"line":23,"column":149}}}) : helper))) - + "public"; -},"7":function(container,depth0,helpers,partials,data) { - return " checked"; -},"9":function(container,depth0,helpers,partials,data) { - var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return container.escapeExpression(((helper = (helper = lookupProperty(helpers,"state") || (depth0 != null ? lookupProperty(depth0,"state") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"state","hash":{},"data":data,"loc":{"start":{"line":54,"column":99},"end":{"line":54,"column":108}}}) : helper))); -},"11":function(container,depth0,helpers,partials,data) { - var stack1, helper, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return ((stack1 = ((helper = (helper = lookupProperty(helpers,"popupStateBusy-tmpl") || (depth0 != null ? lookupProperty(depth0,"popupStateBusy-tmpl") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"popupStateBusy-tmpl","hash":{},"data":data,"loc":{"start":{"line":54,"column":116},"end":{"line":54,"column":141}}}) : helper))) != null ? stack1 : ""); -},"13":function(container,depth0,helpers,partials,data) { - var stack1, helper, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return ((stack1 = ((helper = (helper = lookupProperty(helpers,"popupUpdate-tmpl") || (depth0 != null ? lookupProperty(depth0,"popupUpdate-tmpl") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"popupUpdate-tmpl","hash":{},"data":data,"loc":{"start":{"line":69,"column":163},"end":{"line":69,"column":185}}}) : helper))) != null ? stack1 : ""); -},"15":function(container,depth0,helpers,partials,data) { - var stack1, helper, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return ((stack1 = ((helper = (helper = lookupProperty(helpers,"popupSave-tmpl") || (depth0 != null ? lookupProperty(depth0,"popupSave-tmpl") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"popupSave-tmpl","hash":{},"data":data,"loc":{"start":{"line":69,"column":193},"end":{"line":69,"column":213}}}) : helper))) != null ? stack1 : ""); -},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
    \n
    \n
    \n \n
      \n" - + ((stack1 = lookupProperty(helpers,"each").call(alias1,(depth0 != null ? lookupProperty(depth0,"calendars") : depth0),{"name":"each","hash":{},"fn":container.program(3, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":10,"column":16},"end":{"line":15,"column":25}}})) != null ? stack1 : "") - + "
    \n
    \n
    \n
    \n \n \n
    \n \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n -\n
    \n \n \n
    \n
    \n
    \n \n \n " - + ((stack1 = ((helper = (helper = lookupProperty(helpers,"popupIsAllDay-tmpl") || (depth0 != null ? lookupProperty(depth0,"popupIsAllDay-tmpl") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"popupIsAllDay-tmpl","hash":{},"data":data,"loc":{"start":{"line":48,"column":52},"end":{"line":48,"column":76}}}) : helper))) != null ? stack1 : "") - + "\n
    \n
    \n
    \n \n
      \n
    • \n \n " - + ((stack1 = ((helper = (helper = lookupProperty(helpers,"popupStateBusy-tmpl") || (depth0 != null ? lookupProperty(depth0,"popupStateBusy-tmpl") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"popupStateBusy-tmpl","hash":{},"data":data,"loc":{"start":{"line":60,"column":52},"end":{"line":60,"column":77}}}) : helper))) != null ? stack1 : "") - + "\n
    • \n
    • \n \n " - + ((stack1 = ((helper = (helper = lookupProperty(helpers,"popupStateFree-tmpl") || (depth0 != null ? lookupProperty(depth0,"popupStateFree-tmpl") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"popupStateFree-tmpl","hash":{},"data":data,"loc":{"start":{"line":64,"column":52},"end":{"line":64,"column":77}}}) : helper))) != null ? stack1 : "") - + "\n
    • \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n"; -},"useData":true}); - -/***/ }), - -/***/ "./src/js/view/template/popup/scheduleDetailPopup.hbs": -/*!************************************************************!*\ - !*** ./src/js/view/template/popup/scheduleDetailPopup.hbs ***! - \************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_961561__) { - -var Handlebars = __nested_webpack_require_961561__(/*! ./node_modules/handlebars/runtime.js */ "./node_modules/handlebars/runtime.js"); -module.exports = (Handlebars['default'] || Handlebars).template({"1":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
    " - + ((stack1 = (lookupProperty(helpers,"popupDetailLocation-tmpl")||(depth0 && lookupProperty(depth0,"popupDetailLocation-tmpl"))||alias2).call(alias1,(depth0 != null ? lookupProperty(depth0,"schedule") : depth0),{"name":"popupDetailLocation-tmpl","hash":{},"data":data,"loc":{"start":{"line":11,"column":182},"end":{"line":11,"column":221}}})) != null ? stack1 : "") - + "
    "; -},"3":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
    " - + ((stack1 = (lookupProperty(helpers,"popupDetailRepeat-tmpl")||(depth0 && lookupProperty(depth0,"popupDetailRepeat-tmpl"))||alias2).call(alias1,(depth0 != null ? lookupProperty(depth0,"schedule") : depth0),{"name":"popupDetailRepeat-tmpl","hash":{},"data":data,"loc":{"start":{"line":12,"column":186},"end":{"line":12,"column":223}}})) != null ? stack1 : "") - + "
    "; -},"5":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
    " - + ((stack1 = (lookupProperty(helpers,"popupDetailUser-tmpl")||(depth0 && lookupProperty(depth0,"popupDetailUser-tmpl"))||alias2).call(alias1,(depth0 != null ? lookupProperty(depth0,"schedule") : depth0),{"name":"popupDetailUser-tmpl","hash":{},"data":data,"loc":{"start":{"line":13,"column":218},"end":{"line":13,"column":253}}})) != null ? stack1 : "") - + "
    "; -},"7":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
    " - + ((stack1 = (lookupProperty(helpers,"popupDetailState-tmpl")||(depth0 && lookupProperty(depth0,"popupDetailState-tmpl"))||alias2).call(alias1,(depth0 != null ? lookupProperty(depth0,"schedule") : depth0),{"name":"popupDetailState-tmpl","hash":{},"data":data,"loc":{"start":{"line":14,"column":176},"end":{"line":14,"column":212}}})) != null ? stack1 : "") - + "
    "; -},"9":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
    " - + alias4(alias5(((stack1 = (depth0 != null ? lookupProperty(depth0,"calendar") : depth0)) != null ? lookupProperty(stack1,"name") : stack1), depth0)) - + "
    \n"; -},"11":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
    " - + ((stack1 = (lookupProperty(helpers,"popupDetailBody-tmpl")||(depth0 && lookupProperty(depth0,"popupDetailBody-tmpl"))||alias2).call(alias1,(depth0 != null ? lookupProperty(depth0,"schedule") : depth0),{"name":"popupDetailBody-tmpl","hash":{},"data":data,"loc":{"start":{"line":18,"column":151},"end":{"line":18,"column":186}}})) != null ? stack1 : "") - + "
    "; -},"13":function(container,depth0,helpers,partials,data) { - return ""; -},"15":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
    \n \n
    \n \n
    \n"; -},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
    \n
    \n
    \n
    \n \n " - + alias4(alias5(((stack1 = (depth0 != null ? lookupProperty(depth0,"schedule") : depth0)) != null ? lookupProperty(stack1,"title") : stack1), depth0)) - + "\n
    \n
    " - + ((stack1 = (lookupProperty(helpers,"popupDetailDate-tmpl")||(depth0 && lookupProperty(depth0,"popupDetailDate-tmpl"))||alias2).call(alias1,((stack1 = (depth0 != null ? lookupProperty(depth0,"schedule") : depth0)) != null ? lookupProperty(stack1,"isAllDay") : stack1),((stack1 = (depth0 != null ? lookupProperty(depth0,"schedule") : depth0)) != null ? lookupProperty(stack1,"start") : stack1),((stack1 = (depth0 != null ? lookupProperty(depth0,"schedule") : depth0)) != null ? lookupProperty(stack1,"end") : stack1),{"name":"popupDetailDate-tmpl","hash":{},"data":data,"loc":{"start":{"line":8,"column":73},"end":{"line":8,"column":145}}})) != null ? stack1 : "") - + "
    \n
    \n
    \n " - + ((stack1 = lookupProperty(helpers,"if").call(alias1,((stack1 = (depth0 != null ? lookupProperty(depth0,"schedule") : depth0)) != null ? lookupProperty(stack1,"location") : stack1),{"name":"if","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":11,"column":8},"end":{"line":11,"column":241}}})) != null ? stack1 : "") - + "\n " - + ((stack1 = lookupProperty(helpers,"if").call(alias1,((stack1 = (depth0 != null ? lookupProperty(depth0,"schedule") : depth0)) != null ? lookupProperty(stack1,"recurrenceRule") : stack1),{"name":"if","hash":{},"fn":container.program(3, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":12,"column":8},"end":{"line":12,"column":243}}})) != null ? stack1 : "") - + "\n " - + ((stack1 = lookupProperty(helpers,"if").call(alias1,((stack1 = (depth0 != null ? lookupProperty(depth0,"schedule") : depth0)) != null ? lookupProperty(stack1,"attendees") : stack1),{"name":"if","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":13,"column":8},"end":{"line":13,"column":273}}})) != null ? stack1 : "") - + "\n " - + ((stack1 = lookupProperty(helpers,"if").call(alias1,((stack1 = (depth0 != null ? lookupProperty(depth0,"schedule") : depth0)) != null ? lookupProperty(stack1,"state") : stack1),{"name":"if","hash":{},"fn":container.program(7, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":14,"column":8},"end":{"line":14,"column":232}}})) != null ? stack1 : "") - + "\n" - + ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"calendar") : depth0),{"name":"if","hash":{},"fn":container.program(9, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":15,"column":8},"end":{"line":17,"column":15}}})) != null ? stack1 : "") - + " " - + ((stack1 = lookupProperty(helpers,"if").call(alias1,((stack1 = (depth0 != null ? lookupProperty(depth0,"schedule") : depth0)) != null ? lookupProperty(stack1,"body") : stack1),{"name":"if","hash":{},"fn":container.program(11, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":18,"column":8},"end":{"line":18,"column":206}}})) != null ? stack1 : "") - + "\n
    \n" - + ((stack1 = lookupProperty(helpers,"if").call(alias1,((stack1 = (depth0 != null ? lookupProperty(depth0,"schedule") : depth0)) != null ? lookupProperty(stack1,"isReadOnly") : stack1),{"name":"if","hash":{},"fn":container.program(13, data, 0),"inverse":container.program(15, data, 0),"data":data,"loc":{"start":{"line":20,"column":4},"end":{"line":27,"column":11}}})) != null ? stack1 : "") - + "
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n"; -},"useData":true}); - -/***/ }), - -/***/ "./src/js/view/template/week/dayGrid.hbs": -/*!***********************************************!*\ - !*** ./src/js/view/template/week/dayGrid.hbs ***! - \***********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_992610__) { - -var Handlebars = __nested_webpack_require_992610__(/*! ./node_modules/handlebars/runtime.js */ "./node_modules/handlebars/runtime.js"); -module.exports = (Handlebars['default'] || Handlebars).template({"1":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
    \n"; -},"2":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " border-right: " - + container.escapeExpression(container.lambda(((stack1 = ((stack1 = (data && lookupProperty(data,"root"))) && lookupProperty(stack1,"styles"))) && lookupProperty(stack1,"borderRight")), depth0)) - + ";\n"; -},"4":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return ((stack1 = lookupProperty(helpers,"each").call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? lookupProperty(depth0,"days") : depth0),{"name":"each","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":17,"column":8},"end":{"line":27,"column":19}}})) != null ? stack1 : ""); -},"5":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return ((stack1 = lookupProperty(helpers,"if").call(depth0 != null ? depth0 : (container.nullContext || {}),((stack1 = (data && lookupProperty(data,"root"))) && lookupProperty(stack1,"collapsed")),{"name":"if","hash":{},"fn":container.program(6, data, 0),"inverse":container.program(9, data, 0),"data":data,"loc":{"start":{"line":18,"column":12},"end":{"line":26,"column":19}}})) != null ? stack1 : ""); -},"6":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return ((stack1 = lookupProperty(helpers,"if").call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? lookupProperty(depth0,"hiddenSchedules") : depth0),{"name":"if","hash":{},"fn":container.program(7, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":19,"column":16},"end":{"line":21,"column":23}}})) != null ? stack1 : ""); -},"7":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " " - + ((stack1 = (lookupProperty(helpers,"weekGridFooterExceed-tmpl")||(depth0 && lookupProperty(depth0,"weekGridFooterExceed-tmpl"))||alias2).call(alias1,(depth0 != null ? lookupProperty(depth0,"hiddenSchedules") : depth0),{"name":"weekGridFooterExceed-tmpl","hash":{},"data":data,"loc":{"start":{"line":20,"column":145},"end":{"line":20,"column":192}}})) != null ? stack1 : "") - + "\n"; -},"9":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return ((stack1 = (lookupProperty(helpers,"fi")||(depth0 && lookupProperty(depth0,"fi"))||container.hooks.helperMissing).call(depth0 != null ? depth0 : (container.nullContext || {}),(data && lookupProperty(data,"key")),"===",((stack1 = (data && lookupProperty(data,"root"))) && lookupProperty(stack1,"collapseBtnIndex")),{"name":"fi","hash":{},"fn":container.program(10, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":23,"column":16},"end":{"line":25,"column":23}}})) != null ? stack1 : ""); -},"10":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " " - + ((stack1 = ((helper = (helper = lookupProperty(helpers,"collapseBtnTitle-tmpl") || (depth0 != null ? lookupProperty(depth0,"collapseBtnTitle-tmpl") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"collapseBtnTitle-tmpl","hash":{},"data":data,"loc":{"start":{"line":24,"column":121},"end":{"line":24,"column":148}}}) : helper))) != null ? stack1 : "") - + "\n"; -},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
    \n " - + ((stack1 = (lookupProperty(helpers,"dayGridTitle-tmpl")||(depth0 && lookupProperty(depth0,"dayGridTitle-tmpl"))||alias2).call(alias1,(depth0 != null ? lookupProperty(depth0,"viewName") : depth0),{"name":"dayGridTitle-tmpl","hash":{},"data":data,"loc":{"start":{"line":2,"column":4},"end":{"line":2,"column":36}}})) != null ? stack1 : "") - + "\n
    \n
    \n
    \n
    \n" - + ((stack1 = lookupProperty(helpers,"each").call(alias1,(depth0 != null ? lookupProperty(depth0,"days") : depth0),{"name":"each","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":7,"column":8},"end":{"line":14,"column":19}}})) != null ? stack1 : "") - + ((stack1 = lookupProperty(helpers,"if").call(alias1,((stack1 = (data && lookupProperty(data,"root"))) && lookupProperty(stack1,"showExpandableButton")),{"name":"if","hash":{},"fn":container.program(4, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":16,"column":8},"end":{"line":28,"column":15}}})) != null ? stack1 : "") - + "
    \n
    \n
    \n"; -},"useData":true}); - -/***/ }), - -/***/ "./src/js/view/template/week/dayGridSchedule.hbs": -/*!*******************************************************!*\ - !*** ./src/js/view/template/week/dayGridSchedule.hbs ***! - \*******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_1007824__) { - -var Handlebars = __nested_webpack_require_1007824__(/*! ./node_modules/handlebars/runtime.js */ "./node_modules/handlebars/runtime.js"); -module.exports = (Handlebars['default'] || Handlebars).template({"1":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return ((stack1 = lookupProperty(helpers,"each").call(depth0 != null ? depth0 : (container.nullContext || {}),depth0,{"name":"each","hash":{},"fn":container.program(2, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":3,"column":4},"end":{"line":27,"column":15}}})) != null ? stack1 : ""); -},"2":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "\n " - + ((stack1 = lookupProperty(helpers,"each").call(depth0 != null ? depth0 : (container.nullContext || {}),depth0,{"name":"each","hash":{},"fn":container.program(3, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":4,"column":4},"end":{"line":26,"column":15}}})) != null ? stack1 : ""); -},"3":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "\n " - + ((stack1 = lookupProperty(helpers,"if").call(depth0 != null ? depth0 : (container.nullContext || {}),depth0,{"name":"if","hash":{},"fn":container.program(4, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":5,"column":4},"end":{"line":25,"column":13}}})) != null ? stack1 : ""); -},"4":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3=container.escapeExpression, alias4="function", alias5=container.lambda, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "\n
    \n
    \n " - + ((stack1 = (lookupProperty(helpers,"schedule-tmpl")||(depth0 && lookupProperty(depth0,"schedule-tmpl"))||alias2).call(alias1,(depth0 != null ? lookupProperty(depth0,"model") : depth0),{"name":"schedule-tmpl","hash":{},"data":data,"loc":{"start":{"line":21,"column":87},"end":{"line":21,"column":112}}})) != null ? stack1 : "") - + "\n " - + ((stack1 = lookupProperty(helpers,"unless").call(alias1,(lookupProperty(helpers,"or")||(depth0 && lookupProperty(depth0,"or"))||alias2).call(alias1,((stack1 = (data && lookupProperty(data,"root"))) && lookupProperty(stack1,"isReadOnly")),((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"isReadOnly") : stack1),{"name":"or","hash":{},"data":data,"loc":{"start":{"line":22,"column":22},"end":{"line":22,"column":60}}}),{"name":"unless","hash":{},"fn":container.program(15, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":22,"column":12},"end":{"line":22,"column":193}}})) != null ? stack1 : "") - + "\n
    \n
    \n"; -},"5":function(container,depth0,helpers,partials,data) { - var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " " - + container.escapeExpression(((helper = (helper = lookupProperty(helpers,"CSS_PREFIX") || (depth0 != null ? lookupProperty(depth0,"CSS_PREFIX") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data,"loc":{"start":{"line":8,"column":31},"end":{"line":8,"column":45}}}) : helper))) - + "weekday-exceed-left"; -},"7":function(container,depth0,helpers,partials,data) { - var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " " - + container.escapeExpression(((helper = (helper = lookupProperty(helpers,"CSS_PREFIX") || (depth0 != null ? lookupProperty(depth0,"CSS_PREFIX") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data,"loc":{"start":{"line":9,"column":32},"end":{"line":9,"column":46}}}) : helper))) - + "weekday-exceed-right"; -},"9":function(container,depth0,helpers,partials,data) { - var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return container.escapeExpression(((helper = (helper = lookupProperty(helpers,"CSS_PREFIX") || (depth0 != null ? lookupProperty(depth0,"CSS_PREFIX") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data,"loc":{"start":{"line":13,"column":146},"end":{"line":13,"column":160}}}) : helper))) - + "weekday-schedule-focused "; -},"11":function(container,depth0,helpers,partials,data) { - var stack1, alias1=container.lambda, alias2=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " color: #ffffff; background-color:" - + alias2(alias1(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"color") : stack1), depth0)) - + "; border-color:" - + alias2(alias1(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"color") : stack1), depth0)) - + ";\n"; -},"13":function(container,depth0,helpers,partials,data) { - var stack1, alias1=container.lambda, alias2=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " color:" - + alias2(alias1(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"color") : stack1), depth0)) - + "; background-color:" - + alias2(alias1(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"bgColor") : stack1), depth0)) - + "; border-color:" - + alias2(alias1(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"borderColor") : stack1), depth0)) - + ";\n"; -},"15":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " "; -},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
    \n" - + ((stack1 = lookupProperty(helpers,"each").call(alias1,(depth0 != null ? lookupProperty(depth0,"matrices") : depth0),{"name":"each","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":2,"column":4},"end":{"line":28,"column":15}}})) != null ? stack1 : "") - + "
    \n"; -},"useData":true}); - -/***/ }), - -/***/ "./src/js/view/template/week/daynames.hbs": -/*!************************************************!*\ - !*** ./src/js/view/template/week/daynames.hbs ***! - \************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_1023576__) { - -var Handlebars = __nested_webpack_require_1023576__(/*! ./node_modules/handlebars/runtime.js */ "./node_modules/handlebars/runtime.js"); -module.exports = (Handlebars['default'] || Handlebars).template({"1":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
    \n \n " - + ((stack1 = (lookupProperty(helpers,"weekDayname-tmpl")||(depth0 && lookupProperty(depth0,"weekDayname-tmpl"))||alias2).call(alias1,depth0,{"name":"weekDayname-tmpl","hash":{},"data":data,"loc":{"start":{"line":7,"column":8},"end":{"line":7,"column":35}}})) != null ? stack1 : "") - + "\n \n
    \n"; -},"2":function(container,depth0,helpers,partials,data) { - var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return container.escapeExpression(((helper = (helper = lookupProperty(helpers,"CSS_PREFIX") || (depth0 != null ? lookupProperty(depth0,"CSS_PREFIX") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data,"loc":{"start":{"line":3,"column":49},"end":{"line":3,"column":63}}}) : helper))) - + "today"; -},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
    \n" - + ((stack1 = lookupProperty(helpers,"each").call(alias1,(depth0 != null ? lookupProperty(depth0,"dayNames") : depth0),{"name":"each","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":2,"column":0},"end":{"line":10,"column":9}}})) != null ? stack1 : "") - + "
    \n"; -},"useData":true}); - -/***/ }), - -/***/ "./src/js/view/template/week/time.hbs": -/*!********************************************!*\ - !*** ./src/js/view/template/week/time.hbs ***! - \********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_1030403__) { - -var Handlebars = __nested_webpack_require_1030403__(/*! ./node_modules/handlebars/runtime.js */ "./node_modules/handlebars/runtime.js"); -module.exports = (Handlebars['default'] || Handlebars).template({"1":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return ((stack1 = lookupProperty(helpers,"each").call(depth0 != null ? depth0 : (container.nullContext || {}),depth0,{"name":"each","hash":{},"fn":container.program(2, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":3,"column":4},"end":{"line":60,"column":13}}})) != null ? stack1 : ""); -},"2":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return ((stack1 = lookupProperty(helpers,"each").call(depth0 != null ? depth0 : (container.nullContext || {}),depth0,{"name":"each","hash":{},"fn":container.program(3, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":4,"column":8},"end":{"line":59,"column":17}}})) != null ? stack1 : ""); -},"3":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return ((stack1 = lookupProperty(helpers,"if").call(depth0 != null ? depth0 : (container.nullContext || {}),depth0,{"name":"if","hash":{},"fn":container.program(4, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":5,"column":8},"end":{"line":58,"column":17}}})) != null ? stack1 : ""); -},"4":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
    \n
    \n" - + ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"hasGoingDuration") : depth0),{"name":"if","hash":{},"fn":container.program(19, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":29,"column":12},"end":{"line":37,"column":19}}})) != null ? stack1 : "") - + "
    \n " - + ((stack1 = (lookupProperty(helpers,"time-tmpl")||(depth0 && lookupProperty(depth0,"time-tmpl"))||alias2).call(alias1,(depth0 != null ? lookupProperty(depth0,"model") : depth0),{"name":"time-tmpl","hash":{},"data":data,"loc":{"start":{"line":45,"column":20},"end":{"line":45,"column":41}}})) != null ? stack1 : "") - + "\n
    \n" - + ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"hasComingDuration") : depth0),{"name":"if","hash":{},"fn":container.program(26, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":47,"column":12},"end":{"line":54,"column":19}}})) != null ? stack1 : "") - + "
    \n " - + ((stack1 = lookupProperty(helpers,"unless").call(alias1,(lookupProperty(helpers,"or")||(depth0 && lookupProperty(depth0,"or"))||alias2).call(alias1,(depth0 != null ? lookupProperty(depth0,"croppedEnd") : depth0),(lookupProperty(helpers,"or")||(depth0 && lookupProperty(depth0,"or"))||alias2).call(alias1,((stack1 = (data && lookupProperty(data,"root"))) && lookupProperty(stack1,"isReadOnly")),((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"isReadOnly") : stack1),{"name":"or","hash":{},"data":data,"loc":{"start":{"line":56,"column":37},"end":{"line":56,"column":75}}}),{"name":"or","hash":{},"data":data,"loc":{"start":{"line":56,"column":22},"end":{"line":56,"column":76}}}),{"name":"unless","hash":{},"fn":container.program(29, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":56,"column":12},"end":{"line":56,"column":207}}})) != null ? stack1 : "") - + "\n
    \n"; -},"5":function(container,depth0,helpers,partials,data) { - var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " " - + container.escapeExpression(((helper = (helper = lookupProperty(helpers,"CSS_PREFIX") || (depth0 != null ? lookupProperty(depth0,"CSS_PREFIX") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data,"loc":{"start":{"line":6,"column":83},"end":{"line":6,"column":97}}}) : helper))) - + "time-date-schedule-block-pending"; -},"7":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " padding-left: " - + container.escapeExpression(container.lambda(((stack1 = ((stack1 = (data && lookupProperty(data,"root"))) && lookupProperty(stack1,"styles"))) && lookupProperty(stack1,"paddingLeft")), depth0)) - + ";\n"; -},"9":function(container,depth0,helpers,partials,data) { - var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return container.escapeExpression(((helper = (helper = lookupProperty(helpers,"CSS_PREFIX") || (depth0 != null ? lookupProperty(depth0,"CSS_PREFIX") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data,"loc":{"start":{"line":12,"column":147},"end":{"line":12,"column":161}}}) : helper))) - + "time-schedule-focused "; -},"11":function(container,depth0,helpers,partials,data) { - var stack1, alias1=container.lambda, alias2=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " border-bottom-left-radius: " - + alias2(alias1(((stack1 = ((stack1 = (data && lookupProperty(data,"root"))) && lookupProperty(stack1,"styles"))) && lookupProperty(stack1,"borderRadius")), depth0)) - + ";\n border-bottom-right-radius: " - + alias2(alias1(((stack1 = ((stack1 = (data && lookupProperty(data,"root"))) && lookupProperty(stack1,"styles"))) && lookupProperty(stack1,"borderRadius")), depth0)) - + ";\n"; -},"13":function(container,depth0,helpers,partials,data) { - var stack1, alias1=container.lambda, alias2=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " border-top-left-radius: " - + alias2(alias1(((stack1 = ((stack1 = (data && lookupProperty(data,"root"))) && lookupProperty(stack1,"styles"))) && lookupProperty(stack1,"borderRadius")), depth0)) - + ";\n border-top-right-radius: " - + alias2(alias1(((stack1 = ((stack1 = (data && lookupProperty(data,"root"))) && lookupProperty(stack1,"styles"))) && lookupProperty(stack1,"borderRadius")), depth0)) - + ";\n"; -},"15":function(container,depth0,helpers,partials,data) { - var stack1, alias1=container.lambda, alias2=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " color: #ffffff; background-color:" - + alias2(alias1(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"color") : stack1), depth0)) - + "; border-color:" - + alias2(alias1(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"color") : stack1), depth0)) - + ";\n"; -},"17":function(container,depth0,helpers,partials,data) { - var stack1, alias1=container.lambda, alias2=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " color:" - + alias2(alias1(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"color") : stack1), depth0)) - + "; background-color:" - + alias2(alias1(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"bgColor") : stack1), depth0)) - + "; border-color:" - + alias2(alias1(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"borderColor") : stack1), depth0)) - + ";\n"; -},"19":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
    " - + ((stack1 = (lookupProperty(helpers,"goingDuration-tmpl")||(depth0 && lookupProperty(depth0,"goingDuration-tmpl"))||alias2).call(alias1,(depth0 != null ? lookupProperty(depth0,"model") : depth0),{"name":"goingDuration-tmpl","hash":{},"data":data,"loc":{"start":{"line":36,"column":66},"end":{"line":36,"column":96}}})) != null ? stack1 : "") - + "
    \n"; -},"20":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " border-color:" - + container.escapeExpression(container.lambda(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"color") : stack1), depth0)) - + ";\n"; -},"22":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " border-color:" - + container.escapeExpression(container.lambda(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"borderColor") : stack1), depth0)) - + ";\n"; -},"24":function(container,depth0,helpers,partials,data) { - var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "border-bottom: 1px dashed " - + container.escapeExpression(((helper = (helper = lookupProperty(helpers,"travelBorderColor") || (depth0 != null ? lookupProperty(depth0,"travelBorderColor") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"travelBorderColor","hash":{},"data":data,"loc":{"start":{"line":44,"column":67},"end":{"line":44,"column":88}}}) : helper))) - + ";"; -},"26":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
    " - + ((stack1 = (lookupProperty(helpers,"comingDuration-tmpl")||(depth0 && lookupProperty(depth0,"comingDuration-tmpl"))||alias2).call(alias1,(depth0 != null ? lookupProperty(depth0,"model") : depth0),{"name":"comingDuration-tmpl","hash":{},"data":data,"loc":{"start":{"line":53,"column":26},"end":{"line":53,"column":57}}})) != null ? stack1 : "") - + "
    \n"; -},"27":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " border-color:" - + container.escapeExpression(container.lambda(((stack1 = (depth0 != null ? lookupProperty(depth0,"model") : depth0)) != null ? lookupProperty(stack1,"borderColor") : stack1), depth0)) - + ";\n "; -},"29":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
     
    "; -},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
    \n" - + ((stack1 = lookupProperty(helpers,"each").call(alias1,(depth0 != null ? lookupProperty(depth0,"matrices") : depth0),{"name":"each","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":2,"column":0},"end":{"line":61,"column":9}}})) != null ? stack1 : "") - + "
    \n"; -},"useData":true}); - -/***/ }), - -/***/ "./src/js/view/template/week/timeGrid.hbs": -/*!************************************************!*\ - !*** ./src/js/view/template/week/timeGrid.hbs ***! - \************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_1057197__) { - -var Handlebars = __nested_webpack_require_1057197__(/*! ./node_modules/handlebars/runtime.js */ "./node_modules/handlebars/runtime.js"); -module.exports = (Handlebars['default'] || Handlebars).template({"1":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
    \n" - + ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"isPrimary") : depth0),{"name":"if","hash":{},"fn":container.program(4, data, 0),"inverse":container.program(10, data, 0),"data":data,"loc":{"start":{"line":4,"column":8},"end":{"line":26,"column":15}}})) != null ? stack1 : "") - + "
    \n"; -},"2":function(container,depth0,helpers,partials,data) { - return "display:none;"; -},"4":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {}), lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return ((stack1 = lookupProperty(helpers,"each").call(alias1,(depth0 != null ? lookupProperty(depth0,"timeSlots") : depth0),{"name":"each","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":5,"column":12},"end":{"line":9,"column":23}}})) != null ? stack1 : "") - + ((stack1 = lookupProperty(helpers,"if").call(alias1,((stack1 = (data && lookupProperty(data,"root"))) && lookupProperty(stack1,"showHourMarker")),{"name":"if","hash":{},"fn":container.program(8, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":10,"column":12},"end":{"line":14,"column":19}}})) != null ? stack1 : ""); -},"5":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
    \n " - + ((stack1 = (lookupProperty(helpers,"timegridDisplayPrimayTime-tmpl")||(depth0 && lookupProperty(depth0,"timegridDisplayPrimayTime-tmpl"))||alias2).call(alias1,depth0,{"name":"timegridDisplayPrimayTime-tmpl","hash":{},"data":data,"loc":{"start":{"line":7,"column":68},"end":{"line":7,"column":109}}})) != null ? stack1 : "") - + "\n
    \n"; -},"6":function(container,depth0,helpers,partials,data) { - return "display:none"; -},"8":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
    \n
    " - + ((stack1 = (lookupProperty(helpers,"timegridCurrentTime-tmpl")||(depth0 && lookupProperty(depth0,"timegridCurrentTime-tmpl"))||alias2).call(alias1,depth0,{"name":"timegridCurrentTime-tmpl","hash":{},"data":data,"loc":{"start":{"line":12,"column":223},"end":{"line":12,"column":258}}})) != null ? stack1 : "") - + "
    \n
    \n"; -},"10":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {}), lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return ((stack1 = lookupProperty(helpers,"each").call(alias1,(depth0 != null ? lookupProperty(depth0,"timeSlots") : depth0),{"name":"each","hash":{},"fn":container.program(11, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":16,"column":12},"end":{"line":20,"column":23}}})) != null ? stack1 : "") - + ((stack1 = lookupProperty(helpers,"if").call(alias1,((stack1 = (data && lookupProperty(data,"root"))) && lookupProperty(stack1,"showHourMarker")),{"name":"if","hash":{},"fn":container.program(13, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":21,"column":12},"end":{"line":25,"column":19}}})) != null ? stack1 : ""); -},"11":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
    \n " - + ((stack1 = (lookupProperty(helpers,"timegridDisplayTime-tmpl")||(depth0 && lookupProperty(depth0,"timegridDisplayTime-tmpl"))||alias2).call(alias1,depth0,{"name":"timegridDisplayTime-tmpl","hash":{},"data":data,"loc":{"start":{"line":18,"column":68},"end":{"line":18,"column":103}}})) != null ? stack1 : "") - + "\n
    \n"; -},"13":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
    \n
    " - + ((stack1 = (lookupProperty(helpers,"timegridCurrentTime-tmpl")||(depth0 && lookupProperty(depth0,"timegridCurrentTime-tmpl"))||alias2).call(alias1,depth0,{"name":"timegridCurrentTime-tmpl","hash":{},"data":data,"loc":{"start":{"line":23,"column":171},"end":{"line":23,"column":206}}})) != null ? stack1 : "") - + "
    \n
    \n"; -},"15":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
    \n
    \n
    \n"; -},"16":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return " border-bottom: " - + container.escapeExpression(container.lambda(((stack1 = ((stack1 = (data && lookupProperty(data,"root"))) && lookupProperty(stack1,"styles"))) && lookupProperty(stack1,"borderBottom")), depth0)) - + ";\n"; -},"18":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
    \n
    \n
    today
    \n
    \n
    \n
    \n"; -},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
    \n" - + ((stack1 = lookupProperty(helpers,"each").call(alias1,(depth0 != null ? lookupProperty(depth0,"timezones") : depth0),{"name":"each","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":2,"column":4},"end":{"line":28,"column":15}}})) != null ? stack1 : "") - + "
    \n
    \n
    \n" - + ((stack1 = lookupProperty(helpers,"each").call(alias1,(depth0 != null ? lookupProperty(depth0,"hoursLabels") : depth0),{"name":"each","hash":{},"fn":container.program(15, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":32,"column":8},"end":{"line":40,"column":19}}})) != null ? stack1 : "") - + "
    \n
    \n
    \n
    \n\n" - + ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"showHourMarker") : depth0),{"name":"if","hash":{},"fn":container.program(18, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":46,"column":4},"end":{"line":53,"column":11}}})) != null ? stack1 : "") - + "
    \n"; -},"useData":true}); - -/***/ }), - -/***/ "./src/js/view/template/week/timeGridCurrentTime.hbs": -/*!***********************************************************!*\ - !*** ./src/js/view/template/week/timeGridCurrentTime.hbs ***! - \***********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_1086125__) { - -var Handlebars = __nested_webpack_require_1086125__(/*! ./node_modules/handlebars/runtime.js */ "./node_modules/handlebars/runtime.js"); -module.exports = (Handlebars['default'] || Handlebars).template({"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) { - var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return ((stack1 = (lookupProperty(helpers,"timegridCurrentTime-tmpl")||(depth0 && lookupProperty(depth0,"timegridCurrentTime-tmpl"))||container.hooks.helperMissing).call(depth0 != null ? depth0 : (container.nullContext || {}),depth0,{"name":"timegridCurrentTime-tmpl","hash":{},"data":data,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":35}}})) != null ? stack1 : "") - + "\n"; -},"useData":true}); - -/***/ }), - -/***/ "./src/js/view/template/week/timeMoveGuide.hbs": -/*!*****************************************************!*\ - !*** ./src/js/view/template/week/timeMoveGuide.hbs ***! - \*****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_1087394__) { - -var Handlebars = __nested_webpack_require_1087394__(/*! ./node_modules/handlebars/runtime.js */ "./node_modules/handlebars/runtime.js"); -module.exports = (Handlebars['default'] || Handlebars).template({"1":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
    " - + ((stack1 = (lookupProperty(helpers,"goingDuration-tmpl")||(depth0 && lookupProperty(depth0,"goingDuration-tmpl"))||alias2).call(alias1,(depth0 != null ? lookupProperty(depth0,"model") : depth0),{"name":"goingDuration-tmpl","hash":{},"data":data,"loc":{"start":{"line":4,"column":230},"end":{"line":4,"column":260}}})) != null ? stack1 : "") - + "
    \n"; -},"3":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
    " - + ((stack1 = (lookupProperty(helpers,"comingDuration-tmpl")||(depth0 && lookupProperty(depth0,"comingDuration-tmpl"))||alias2).call(alias1,(depth0 != null ? lookupProperty(depth0,"model") : depth0),{"name":"comingDuration-tmpl","hash":{},"data":data,"loc":{"start":{"line":10,"column":228},"end":{"line":10,"column":259}}})) != null ? stack1 : "") - + "
    \n"; -},"5":function(container,depth0,helpers,partials,data) { - var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
     
    "; -},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
    \n
    \n" - + ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"hasGoingDuration") : depth0),{"name":"if","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":3,"column":8},"end":{"line":5,"column":15}}})) != null ? stack1 : "") - + "
    \n " - + ((stack1 = (lookupProperty(helpers,"time-tmpl")||(depth0 && lookupProperty(depth0,"time-tmpl"))||alias2).call(alias1,(depth0 != null ? lookupProperty(depth0,"model") : depth0),{"name":"time-tmpl","hash":{},"data":data,"loc":{"start":{"line":7,"column":16},"end":{"line":7,"column":37}}})) != null ? stack1 : "") - + "\n
    \n" - + ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"hasComingDuration") : depth0),{"name":"if","hash":{},"fn":container.program(3, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":9,"column":8},"end":{"line":11,"column":15}}})) != null ? stack1 : "") - + "
    \n " - + ((stack1 = lookupProperty(helpers,"unless").call(alias1,(depth0 != null ? lookupProperty(depth0,"croppedEnd") : depth0),{"name":"unless","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":13,"column":4},"end":{"line":13,"column":104}}})) != null ? stack1 : "") - + "\n
    \n
    \n"; -},"useData":true}); - -/***/ }), - -/***/ "./src/js/view/template/week/timezoneSticky.hbs": -/*!******************************************************!*\ - !*** ./src/js/view/template/week/timezoneSticky.hbs ***! - \******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_1098595__) { - -var Handlebars = __nested_webpack_require_1098595__(/*! ./node_modules/handlebars/runtime.js */ "./node_modules/handlebars/runtime.js"); -module.exports = (Handlebars['default'] || Handlebars).template({"1":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
    \n
    \n" - + ((stack1 = lookupProperty(helpers,"if").call(alias1,(lookupProperty(helpers,"and")||(depth0 && lookupProperty(depth0,"and"))||alias2).call(alias1,(depth0 != null ? lookupProperty(depth0,"isPrimary") : depth0),((stack1 = (data && lookupProperty(data,"root"))) && lookupProperty(stack1,"showTimezoneCollapseButton")),{"name":"and","hash":{},"data":data,"loc":{"start":{"line":4,"column":14},"end":{"line":4,"column":62}}}),{"name":"if","hash":{},"fn":container.program(4, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":4,"column":8},"end":{"line":10,"column":15}}})) != null ? stack1 : "") - + "
    " - + ((stack1 = (lookupProperty(helpers,"timezoneDisplayLabel-tmpl")||(depth0 && lookupProperty(depth0,"timezoneDisplayLabel-tmpl"))||alias2).call(alias1,(depth0 != null ? lookupProperty(depth0,"timezoneOffset") : depth0),(depth0 != null ? lookupProperty(depth0,"displayLabel") : depth0),{"name":"timezoneDisplayLabel-tmpl","hash":{},"data":data,"loc":{"start":{"line":11,"column":59},"end":{"line":11,"column":118}}})) != null ? stack1 : "") - + "
    \n
    \n
    \n"; -},"2":function(container,depth0,helpers,partials,data) { - return "display:none;"; -},"4":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return "
    \n \n \n \n
    \n"; -},"5":function(container,depth0,helpers,partials,data) { - var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return container.escapeExpression(((helper = (helper = lookupProperty(helpers,"CSS_PREFIX") || (depth0 != null ? lookupProperty(depth0,"CSS_PREFIX") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data,"loc":{"start":{"line":7,"column":84},"end":{"line":7,"column":98}}}) : helper))) - + "ic-arrow-right"; -},"7":function(container,depth0,helpers,partials,data) { - var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return container.escapeExpression(((helper = (helper = lookupProperty(helpers,"CSS_PREFIX") || (depth0 != null ? lookupProperty(depth0,"CSS_PREFIX") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data,"loc":{"start":{"line":7,"column":120},"end":{"line":7,"column":134}}}) : helper))) - + "ic-arrow-left"; -},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {}), lookupProperty = container.lookupProperty || function(parent, propertyName) { - if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { - return parent[propertyName]; - } - return undefined - }; - - return ((stack1 = lookupProperty(helpers,"each").call(alias1,(lookupProperty(helpers,"reverse")||(depth0 && lookupProperty(depth0,"reverse"))||container.hooks.helperMissing).call(alias1,(depth0 != null ? lookupProperty(depth0,"timezones") : depth0),{"name":"reverse","hash":{},"data":data,"loc":{"start":{"line":1,"column":8},"end":{"line":1,"column":27}}}),{"name":"each","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":1,"column":0},"end":{"line":14,"column":11}}})) != null ? stack1 : ""); -},"useData":true}); - -/***/ }), - -/***/ "./src/js/view/view.js": -/*!*****************************!*\ - !*** ./src/js/view/view.js ***! - \*****************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_1109269__) { - -"use strict"; -/** - * @fileoverview The base class of views. - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_1109269__(/*! tui-code-snippet */ "tui-code-snippet"); -var domutil = __nested_webpack_require_1109269__(/*! ../common/domutil */ "./src/js/common/domutil.js"); -var Collection = __nested_webpack_require_1109269__(/*! ../common/collection */ "./src/js/common/collection.js"); - -/** - * Base class of views. - * - * All views create own container element inside supplied container element. - * @constructor - * @param {HTMLElement} container Default container element for view. - * you can use this element for this.container syntax. - */ -function View(container) { - var id = util.stamp(this); - - if (util.isUndefined(container)) { - container = domutil.appendHTMLElement('div'); - } - - domutil.addClass(container, this.cssprefix(id)); - - /** - * unique id - * @type {number} - */ - this.id = id; - - /** - * base element of view. - * @type {HTMLDIVElement} - */ - this.container = container; - - /*eslint-disable*/ - /** - * child views. - * @type {Collection} - */ - this.children = new Collection(function(view) { - return util.stamp(view); - }); - /* eslint-enable*/ - - /** - * parent view instance. - * @type {View} - */ - this.parent = null; - - /** - * state of view - */ - this.state = {}; -} - -/** - * CSS classname prefix - * @type {string} - */ -View.prototype.cssPrefix = 'tui-view-'; - -/** - * Add child views. - * @param {View} view The view instance to add. - * @param {function} [fn] Function for invoke before add. parent view class is supplied first arguments. - */ -View.prototype.addChild = function(view, fn) { - if (fn) { - fn.call(view, this); - } - // add parent view - view.parent = this; - - this.children.add(view); -}; - -/** - * Remove added child view. - * @param {(number|View)} id View id or instance itself to remove. - * @param {function} [fn] Function for invoke before remove. parent view class is supplied first arguments. - */ -View.prototype.removeChild = function(id, fn) { - var view = util.isNumber(id) ? this.children.items[id] : id; - - id = util.stamp(view); - - if (fn) { - fn.call(view, this); - } - - this.children.remove(id); -}; - -/** - * Render view recursively. - */ -View.prototype.render = function() { - this.children.each(function(childView) { - childView.render(); - }); -}; - -/** - * Invoke function recursively. - * @param {function} fn - function to invoke child view recursively - * @param {boolean} [skipThis=false] - set true then skip invoke with this(root) view. - */ -View.prototype.recursive = function(fn, skipThis) { - if (!util.isFunction(fn)) { - return; - } - - if (!skipThis) { - fn(this); - } - - this.children.each(function(childView) { - childView.recursive(fn); - }); -}; - -/** - * Resize view recursively to parent. - */ -View.prototype.resize = function() { - var args = Array.prototype.slice.call(arguments), - parent = this.parent; - - while (parent) { - if (util.isFunction(parent._onResize)) { - parent._onResize.apply(parent, args); - } - - parent = parent.parent; - } -}; - -/** - * Invoking method before destroying. - */ -View.prototype._beforeDestroy = function() {}; - -/** - * Clear properties - */ -View.prototype._destroy = function() { - this._beforeDestroy(); - this.children.clear(); - this.container.innerHTML = ''; - - this.id = this.parent = this.children = this.container = null; -}; - -/*eslint-disable*/ -/** - * Destroy child view recursively. - */ -View.prototype.destroy = function(isChildView) { - this.children.each(function(childView) { - childView.destroy(true); - childView._destroy(); - }); - - if (isChildView) { - return; - } - - this._destroy(); -}; -/* eslint-enable*/ - -/** - * Calculate view's container element bound. - * @returns {object} The bound of container element. - */ -View.prototype.getViewBound = function() { - var container = this.container, - position = domutil.getPosition(container), - size = domutil.getSize(container); - - return { - x: position[0], - y: position[1], - width: size[0], - height: size[1] - }; -}; - -/** - * Return view default CSS prefix - * @param {string} [className] - if supplied then return prefix added class name - * @returns {string} CSS prefix value - */ -View.prototype.cssprefix = function(className) { - return this.cssPrefix + (className || ''); -}; - -/** - * set state - * @param {object} state - state - */ -View.prototype.setState = function(state) { - util.extend(this.state, state); -}; - -util.CustomEvents.mixin(View); - -module.exports = View; - - -/***/ }), - -/***/ "./src/js/view/week/dayGrid.js": -/*!*************************************!*\ - !*** ./src/js/view/week/dayGrid.js ***! - \*************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_1114246__) { - -"use strict"; -/** - * @fileoverview DayGrid in weekly view - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_1114246__(/*! tui-code-snippet */ "tui-code-snippet"); -var config = __nested_webpack_require_1114246__(/*! ../../config */ "./src/js/config.js"), - common = __nested_webpack_require_1114246__(/*! ../../common/common */ "./src/js/common/common.js"), - datetime = __nested_webpack_require_1114246__(/*! ../../common/datetime */ "./src/js/common/datetime.js"), - domutil = __nested_webpack_require_1114246__(/*! ../../common/domutil */ "./src/js/common/domutil.js"), - TZDate = __nested_webpack_require_1114246__(/*! ../../common/timezone */ "./src/js/common/timezone.js").Date, - View = __nested_webpack_require_1114246__(/*! ../../view/view */ "./src/js/view/view.js"), - DayGridSchedule = __nested_webpack_require_1114246__(/*! ./dayGridSchedule */ "./src/js/view/week/dayGridSchedule.js"), - baseTmpl = __nested_webpack_require_1114246__(/*! ../template/week/dayGrid.hbs */ "./src/js/view/template/week/dayGrid.hbs"), - reqAnimFrame = __nested_webpack_require_1114246__(/*! ../../common/reqAnimFrame */ "./src/js/common/reqAnimFrame.js"); -var mmax = Math.max, - mmin = Math.min; - -/** - * @constructor - * @extends {View} - * @param {string} name - view name - * @param {object} options - options for DayGridSchedule view - * @param {number} [options.heightPercent] - height percent of view - * @param {number} [options.containerButtonGutter=8] - free space at bottom to - * make create easy. - * @param {number} [options.scheduleHeight=18] - height of each schedule block. - * @param {number} [options.scheduleGutter=2] - gutter height of each schedule block. - * @param {HTMLDIVElement} container - DOM element to use container for this - * view. - * @param {Theme} theme - theme instance - */ -function DayGrid(name, options, container, theme) { - container = domutil.appendHTMLElement( - 'div', - container, - config.classname('daygrid-layout') - ); - View.call(this, container); - - name = name || 'daygrid'; - - this.options = util.extend({ - viewName: name, - daynames: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], - renderStartDate: '', - renderEndDate: '', - containerBottomGutter: 18, - scheduleHeight: parseInt(theme.week.dayGridSchedule.height, 10), - scheduleGutter: parseInt(theme.week.dayGridSchedule.marginTop, 10), - scheduleContainerTop: 1, - timezones: options.timezones, - isReadOnly: options.isReadOnly, - getViewModelFunc: function(viewModel) { - return viewModel.schedulesInDateRange[name]; - }, - setViewModelFunc: function(viewModel, matrices) { - viewModel.schedulesInDateRange[name] = matrices; - } - }, options.week); - - this.handler = {}; - this.vPanel = null; - - this.state.collapsed = true; -} - -util.inherit(DayGrid, View); - -/** - * @override - * @param {object} viewModel - schedules view models - */ -DayGrid.prototype.getBaseViewModel = function(viewModel) { - var opt = this.options, - daynames = opt.daynames, - range = viewModel.range, - grids = viewModel.grids, - matrices = opt.getViewModelFunc(viewModel), - exceedDate = {}, - panel = getPanel(opt.panels, opt.viewName), - panelHeight = this.getViewBound().height, - collapsed = this.state.collapsed, - heightForcedSet = this.vPanel ? this.vPanel.getHeightForcedSet() : false, - timezonesCollapsed = viewModel.state.timezonesCollapsed, - styles = this._getStyles(viewModel.theme, timezonesCollapsed); - - var baseViewModel, visibleScheduleCount; - var now = new TZDate().toLocalTime(); - - if (panel.showExpandableButton) { - if (!heightForcedSet) { - if (collapsed) { - panelHeight = mmax(panelHeight, panel.maxHeight); - } else { - panelHeight = mmin(panelHeight, panel.maxExpandableHeight); - } - } - - visibleScheduleCount = Math.floor(panelHeight / (opt.scheduleHeight + opt.scheduleGutter)); - if (collapsed) { - exceedDate = this.parent.controller.getExceedDate(visibleScheduleCount, - matrices, - viewModel.range - ); - matrices = this.parent.controller.excludeExceedSchedules(matrices, visibleScheduleCount); - opt.setViewModelFunc(viewModel, matrices); - } - } - - baseViewModel = { - viewName: opt.viewName, - range: range, - grids: grids, - days: util.map(viewModel.range, function(d, index) { - var day = d.getDay(); - var ymd = datetime.format(d, 'YYYYMMDD'); - var isToday = datetime.isSameDate(now, d); - - return { - day: day, - dayName: daynames[day], - isToday: isToday, - date: d.getDate(), - renderDate: datetime.format(d, 'YYYY-MM-DD'), - hiddenSchedules: exceedDate[ymd] || 0, - width: grids[index] ? grids[index].width : 0, - left: grids[index] ? grids[index].left : 0, - backgroundColor: viewModel.range.length > 1 ? - getWeekBackgroundColor(day, isToday, styles) : styles.backgroundColor - }; - }), - exceedDate: exceedDate, - showExpandableButton: panel.showExpandableButton, - collapsed: collapsed, - collapseBtnIndex: this.state.clickedExpandBtnIndex, - styles: styles - }; - - return baseViewModel; -}; - -/** - * @override - * @param {object} viewModel - schedules view models - */ -DayGrid.prototype.render = function(viewModel) { - var opt = this.options, - container = this.container, - baseViewModel = this.getBaseViewModel(viewModel), - scheduleContainerTop = this.options.scheduleContainerTop; - var dayGridSchedule; - - container.innerHTML = baseTmpl(baseViewModel); - - this.children.clear(); - - dayGridSchedule = new DayGridSchedule( - opt, - domutil.find(config.classname('.container'), container) - ); - this.addChild(dayGridSchedule); - - dayGridSchedule.on('afterRender', function(weekdayViewModel) { - baseViewModel.height = weekdayViewModel.minHeight + scheduleContainerTop; - }); - - this.children.each(function(childView) { - childView.render(viewModel); - }, this); - - this.fire('afterRender', baseViewModel); -}; - -DayGrid.prototype._beforeDestroy = function() { -}; - -DayGrid.prototype.addHandler = function(type, handler, vPanel) { - var self = this; - - this.handler[type] = handler; - this.vPanel = vPanel; - - if (type === 'click') { - handler.on('expand', function() { - self.setState({ - collapsed: false - }); - }, this); - handler.on('collapse', function() { - self.setState({ - collapsed: true - }); - }, this); - } -}; - -DayGrid.prototype._expand = function() { - reqAnimFrame.requestAnimFrame(function() { - var vPanel = this.vPanel; - var opt = this.options; - var panel = getPanel(opt.panels, opt.viewName); - - vPanel.setMaxHeight(panel.maxExpandableHeight); - vPanel.setHeightForcedSet(false); - vPanel.setHeight(null, panel.maxExpandableHeight); - - if (this.parent) { - this.parent.render(); - } - }, this); -}; - -DayGrid.prototype._collapse = function() { - reqAnimFrame.requestAnimFrame(function() { - var vPanel = this.vPanel; - var opt = this.options; - var panel = getPanel(opt.panels, opt.viewName); - - vPanel.setMaxHeight(panel.maxHeight); - vPanel.setHeightForcedSet(false); - vPanel.setHeight(null, panel.minHeight); - - if (this.parent) { - this.parent.render(); - } - }, this); -}; - -/** - * set state - * @param {object} state - state - */ -DayGrid.prototype.setState = function(state) { - var collapsed = this.state.collapsed; - View.prototype.setState.call(this, state); - - if (this.state.collapsed === collapsed) { - return; - } - - if (this.state.collapsed) { - this._collapse(); - } else { - this._expand(); - } -}; - -/** - * Get the styles from theme - * @param {Theme} theme - theme instance - * @param {boolean} timezonesCollapsed - multiple timezones are collapsed. - * @returns {object} styles - styles object - */ -DayGrid.prototype._getStyles = function(theme, timezonesCollapsed) { - var styles = {}; - var timezonesLength = this.options.timezones.length; - var collapsed = timezonesCollapsed; - var numberAndUnit; - - if (theme) { - styles.borderRight = theme.week.daygrid.borderRight || theme.common.border; - styles.todayBackgroundColor = theme.week.today.backgroundColor; - styles.weekendBackgroundColor = theme.week.weekend.backgroundColor; - styles.backgroundColor = theme.week.daygrid.backgroundColor; - styles.leftWidth = theme.week.daygridLeft.width; - styles.leftBackgroundColor = theme.week.daygridLeft.backgroundColor; - styles.leftPaddingRight = theme.week.daygridLeft.paddingRight; - styles.leftBorderRight = theme.week.daygridLeft.borderRight; - - if (!collapsed && timezonesLength > 1) { - numberAndUnit = common.parseUnit(styles.leftWidth); - styles.leftWidth = (numberAndUnit[0] * timezonesLength) + numberAndUnit[1]; - } - } - - return styles; -}; - -/** - * Get a background color based on day. - * @param {number} day - day number - * @param {boolean} isToday - today flag - * @param {object} styles - style object - * @returns {string} backgroundColor - */ -function getWeekBackgroundColor(day, isToday, styles) { - var backgroundColor = ''; - - if (day === 0 || day === 6) { - backgroundColor = styles.weekendBackgroundColor; - } else if (isToday) { - backgroundColor = styles.todayBackgroundColor; - } else { - backgroundColor = styles.backgroundColor; - } - - return backgroundColor; -} - -/** - * get a panel infomation - * @param {Array.} panels - panel infomations - * @param {string} name - panel name - * @returns {object} panel information - */ -function getPanel(panels, name) { - var found; - - util.forEach(panels, function(panel) { - if (panel.name === name) { - found = panel; - } - }); - - return found; -} - -module.exports = DayGrid; - - -/***/ }), - -/***/ "./src/js/view/week/dayGridSchedule.js": -/*!*********************************************!*\ - !*** ./src/js/view/week/dayGridSchedule.js ***! - \*********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_1124861__) { - -"use strict"; -/** - * @fileoverview Weekday view for week - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_1124861__(/*! tui-code-snippet */ "tui-code-snippet"); -var Weekday = __nested_webpack_require_1124861__(/*! ../weekday */ "./src/js/view/weekday.js"), - tmpl = __nested_webpack_require_1124861__(/*! ../template/week/dayGridSchedule.hbs */ "./src/js/view/template/week/dayGridSchedule.hbs"); -var mmax = Math.max; - -/** - * @constructor - * @extends {Weekday} - * @param {object} options - options for DayGridSchedule view - * @param {number} [options.containerButtonGutter=8] - free space at bottom to - * make create easy. - * @param {number} [options.scheduleHeight=18] - height of each schedule block. - * @param {number} [options.scheduleGutter=2] - gutter height of each schedule block. - * @param {HTMLDivElement} container - DOM element to use container for this - * view. - */ -function DayGridSchedule(options, container) { - Weekday.call(this, options, container); - - this.collapsed = true; -} - -util.inherit(DayGridSchedule, Weekday); - -/** - * Render Weekday view - * @override - */ -DayGridSchedule.prototype.render = function(viewModel) { - var container = this.container; - var baseViewModel; - - baseViewModel = this.getBaseViewModel(viewModel); - - container.innerHTML = tmpl(baseViewModel); - - this.fire('afterRender', baseViewModel); -}; - -/** - * returns maximum schedule count in day - * @param {array} matrices - The matrices for schedule placing. - * @returns {number} maximum schedule count in day - */ -DayGridSchedule.prototype._getMaxScheduleInDay = function(matrices) { - return mmax.apply( - null, - util.map(matrices, function(matrix) { - return Math.max.apply(null, util.map(matrix, function(row) { - return row.length; - })); - }) - ); -}; - -/** - * returns minimum height for container. - * @param {number} maxScheduleInDay - max schedule blocks in one day - * @returns {number} - */ -DayGridSchedule.prototype._getMinHeight = function(maxScheduleInDay) { - var opt = this.options; - var contentHeight = (maxScheduleInDay * opt.scheduleHeight) - + ((maxScheduleInDay - 1) * opt.scheduleGutter); - - return contentHeight; -}; - -/** - * @override - * @param {object} viewModel - schedules view models - */ -DayGridSchedule.prototype.getBaseViewModel = function(viewModel) { - var opt = this.options; - var matrices = opt.getViewModelFunc(viewModel); - var maxScheduleInDay = this._getMaxScheduleInDay(matrices); - var baseViewModel; - var styles = this._getStyles(viewModel.theme); - - baseViewModel = Weekday.prototype.getBaseViewModel.call(this, viewModel); - - baseViewModel = util.extend({ - minHeight: this._getMinHeight(maxScheduleInDay), - matrices: matrices, - scheduleContainerTop: this.options.scheduleContainerTop, - maxScheduleInDay: maxScheduleInDay, - isReadOnly: opt.isReadOnly, - styles: styles - }, baseViewModel); - - return baseViewModel; -}; - -/** - * Get the styles from theme - * @param {Theme} theme - theme instance - * @returns {object} styles - styles object - */ -DayGridSchedule.prototype._getStyles = function(theme) { - var styles = {}; - - if (theme) { - styles.borderRadius = theme.week.dayGridSchedule.borderRadius; - } - - return styles; -}; - -module.exports = DayGridSchedule; - - -/***/ }), - -/***/ "./src/js/view/week/dayname.js": -/*!*************************************!*\ - !*** ./src/js/view/week/dayname.js ***! - \*************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_1128481__) { - -"use strict"; -/** - * @fileoverview View for rendering daynames - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_1128481__(/*! tui-code-snippet */ "tui-code-snippet"); -var config = __nested_webpack_require_1128481__(/*! ../../config */ "./src/js/config.js"); -var common = __nested_webpack_require_1128481__(/*! ../../common/common */ "./src/js/common/common.js"); -var datetime = __nested_webpack_require_1128481__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); -var TZDate = __nested_webpack_require_1128481__(/*! ../../common/timezone */ "./src/js/common/timezone.js").Date; -var domutil = __nested_webpack_require_1128481__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); -var View = __nested_webpack_require_1128481__(/*! ../view */ "./src/js/view/view.js"); -var daynameTmpl = __nested_webpack_require_1128481__(/*! ../template/week/daynames.hbs */ "./src/js/view/template/week/daynames.hbs"); - -/** - * @constructor - * @param {object} options - options for dayname view - * @param {HTMLElement} container Container element to use. - * @param {Theme} theme - theme instance - * @extends {View} - */ -function DayName(options, container, theme) { - container = domutil.appendHTMLElement( - 'div', - container, - config.classname('dayname-container') - ); - - this.options = util.extend({ - daynames: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], - timezones: options.timezones - }, options.week); - - /** - * @type {Theme} - */ - this.theme = theme; - - View.call(this, container); - - this.applyTheme(); -} - -util.inherit(DayName, View); - -/** - * Get default viewmodels. - * @param {Date} start The date of start render - * @param {Date} end The end of end render - * @param {object} grids grid data(width, left, day) - * @returns {array} viewmodel. - */ -DayName.prototype._getBaseViewModel = function(start, end, grids) { - var daynames = this.options.daynames, - theme = this.theme, - now = new TZDate().toLocalTime(), - viewModel; - - viewModel = util.map(datetime.range( - datetime.start(start), - datetime.end(end), - datetime.MILLISECONDS_PER_DAY - ), function(d, i) { - var day = d.getDay(); - var isToday = datetime.isSameDate(d, now); - var isPastDay = d < now && !isToday; - - return { - day: day, - dayName: daynames[day], - isToday: isToday, - date: d.getDate(), - left: grids[i] ? grids[i].left : 0, - width: grids[i] ? grids[i].width : 0, - renderDate: datetime.format(d, 'YYYY-MM-DD'), - color: this._getDayNameColor(theme, day, isToday, isPastDay) - }; - }, this); - - return viewModel; -}; - -/** - * @override - * @param {object} viewModel View model from parent (WeekView) - */ -DayName.prototype.render = function(viewModel) { - var dayNames = this._getBaseViewModel( - viewModel.renderStartDate, - viewModel.renderEndDate, - viewModel.grids - ); - var timezonesCollapsed = viewModel.state.timezonesCollapsed; - var styles = this._getStyles(this.theme, timezonesCollapsed); - var baseViewModel = util.extend({}, { - dayNames: dayNames, - styles: styles - }); - - this.container.innerHTML = daynameTmpl(baseViewModel); -}; - -/** - * Get a day name color - * @param {Theme} theme - theme instance - * @param {number} day - day number - * @param {boolean} isToday - today flag - * @param {boolean} isPastDay - is past day flag - * @returns {string} style - color style - */ -DayName.prototype._getDayNameColor = function(theme, day, isToday, isPastDay) { - var color = ''; - - if (theme) { - if (day === 0) { - color = theme.common.holiday.color; - } else if (isPastDay) { - color = theme.week.pastDay.color || theme.common.dayname.color; - } else if (day === 6) { - color = theme.common.saturday.color; - } else if (isToday) { - color = theme.week.today.color || theme.common.today.color; - } else { - color = theme.common.dayname.color; - } - } - - return color; -}; - -/** - * Get the styles from theme - * @param {Theme} theme - theme instance - * @param {boolean} timezonesCollapsed - multiple timezones are collapsed. - * @returns {object} styles - styles object - */ -DayName.prototype._getStyles = function(theme, timezonesCollapsed) { - var styles = {}; - var timezonesLength = this.options.timezones.length; - var collapsed = timezonesCollapsed; - var numberAndUnit; - - if (theme) { - styles.borderTop = theme.week.dayname.borderTop || theme.common.border; - styles.borderBottom = theme.week.dayname.borderBottom || theme.common.border; - styles.borderLeft = theme.week.dayname.borderLeft || theme.common.border; - styles.paddingLeft = theme.week.dayname.paddingLeft; - styles.backgroundColor = theme.week.dayname.backgroundColor; - styles.height = theme.week.dayname.height; - styles.textAlign = theme.week.dayname.textAlign; - styles.marginLeft = theme.week.daygridLeft.width; - - if (!collapsed && timezonesLength > 1) { - numberAndUnit = common.parseUnit(styles.marginLeft); - styles.marginLeft = (numberAndUnit[0] * timezonesLength) + numberAndUnit[1]; - } - } - - return styles; -}; - -DayName.prototype.applyTheme = function() { - var styles = this._getStyles(this.theme); - var style = this.container.style; - - style.borderTop = styles.borderTop; - style.borderBottom = styles.borderBottom; - style.height = styles.height; - style.backgroundColor = styles.backgroundColor; - style.textAlign = styles.textAlign; - - return style; -}; - -module.exports = DayName; - - -/***/ }), - -/***/ "./src/js/view/week/time.js": -/*!**********************************!*\ - !*** ./src/js/view/week/time.js ***! - \**********************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_1134390__) { - -"use strict"; -/** - * @fileoverview View of time. - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_1134390__(/*! tui-code-snippet */ "tui-code-snippet"); -var config = __nested_webpack_require_1134390__(/*! ../../config */ "./src/js/config.js"); -var datetime = __nested_webpack_require_1134390__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); -var domutil = __nested_webpack_require_1134390__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); -var View = __nested_webpack_require_1134390__(/*! ../view */ "./src/js/view/view.js"); -var timeTmpl = __nested_webpack_require_1134390__(/*! ../template/week/time.hbs */ "./src/js/view/template/week/time.hbs"); -var tz = __nested_webpack_require_1134390__(/*! ../../common/timezone */ "./src/js/common/timezone.js"); - -var forEachArr = util.forEachArray; -var SCHEDULE_MIN_DURATION = datetime.MILLISECONDS_SCHEDULE_MIN_DURATION; - -/** - * calculate offset start of schedule - * @param {ScheduleViewModel} viewModel - view model instance to calculate bound. - * @param {object} options - options for calculating schedule element's bound. - * @returns {object} - left and width - */ -function getOffsetStart(viewModel, options) { - var goingDuration = datetime.millisecondsFrom('minutes', viewModel.valueOf().goingDuration); - var startDayOffset = options.todayStart.toDate().getTimezoneOffset(); - var nativeOffsetMs = tz.getNativeOffsetMs(); - var startOffset = viewModel.valueOf().start.toDate().getTimezoneOffset(); - var primaryOffset = tz.getPrimaryOffset(); - var timezoneOffset = tz.getOffsetByTimezoneName( - tz.getPrimaryTimezoneName(), - viewModel.valueOf().start.getTime() - ); - var MIN_TO_MS = 60 * 1000; - var offsetDiffMs = 0; - var offsetStart = viewModel.valueOf().start - goingDuration - options.todayStart; - - if (tz.hasPrimaryTimezoneCustomSetting()) { - if (tz.isNativeOsUsingDSTTimezone() && nativeOffsetMs !== startDayOffset) { - // When using a custom time zone, the native time zone offset is fixed and rendered. - // So, The fixed and rendered time should be recalculated as the original time zone offset. - // The current system OS local time is not affected by summer/standard time and the schedule should always be displayed in the same location. - offsetDiffMs = (startOffset * MIN_TO_MS) - nativeOffsetMs; - offsetStart += offsetDiffMs; - } - - if (tz.isPrimaryUsingDSTTimezone() && primaryOffset !== timezoneOffset) { - // The custom time zone is a time zone where two offsets including DST are applied. - // The first rendered schedule is calculated and drawn with the offset calculated at the access time(system OS local time). - // It should be recalculated with the original time zone offset. - offsetDiffMs = (primaryOffset - timezoneOffset) * MIN_TO_MS; - offsetStart += offsetDiffMs; - } - } - - return offsetStart; -} - -/** - * @constructor - * @extends {View} - * @param {object} options Options - * @param {number} options.index Date index in week view. - * @param {number} options.width Date element width (percent) - * @param {string} options.ymd YYYMMDD string for this view - * @param {boolean} options.isToday when set true then assign today design class to container. - * @param {number} options.hourStart Can limit of render hour start. - * @param {number} options.hourEnd Can limit of render hour end. - * @param {HTMLElement} container Element to use container for this view. - * @param {Theme} theme - theme instance - */ -function Time(options, container, theme) { - View.call(this, container); - - this.options = util.extend( - { - index: 0, - width: 0, - ymd: '', - isToday: false, - pending: false, - hourStart: 0, - hourEnd: 24, - defaultMarginBottom: 2, - minHeight: 18.5, - isReadOnly: false - }, - options - ); - - this.timeTmpl = timeTmpl; - - /** - * @type {Theme} - */ - this.theme = theme; - - container.style.width = options.width + '%'; - container.style.left = options.left + '%'; - - if (this.options.isToday) { - domutil.addClass(this.container, config.classname('today')); - } - - this.applyTheme(); -} - -util.inherit(Time, View); - -/** - * Convert YYYYMMDD formatted string date to Date. - * @param {string} str formatted string. - * @returns {Date} start of date. - */ -Time.prototype._parseDateGroup = function(str) { - var y = parseInt(str.substr(0, 4), 10), - m = parseInt(str.substr(4, 2), 10), - d = parseInt(str.substr(6, 2), 10); - var date = datetime.start(); - - date.setFullYear(y, m - 1, d); - - return datetime.start(date); -}; - -/** - * calculate left and width - * @param {ScheduleViewModel} viewModel - view model instance to calculate bound. - * @param {object} options - options for calculating schedule element's bound. - * @returns {object} - left and width - */ -Time.prototype._getScheduleViewBoundX = function(viewModel, options) { - var width = options.baseWidth * (viewModel.extraSpace + 1); - - // set width auto when has no collisions. - if (!viewModel.hasCollide) { - width = null; - } - - return { - left: options.baseLeft[options.columnIndex], - width: width - }; -}; - -/** - * calculate top, height, croppedStart and croppedEnd - * @param {ScheduleViewModel} viewModel - view model instance to calculate bound. - * @param {object} options - options for calculating schedule element's bound. - * @returns {object} - left and width - */ -Time.prototype._getScheduleViewBoundY = function(viewModel, options) { - var baseMS = options.baseMS; - var baseHeight = options.baseHeight; - var croppedStart = false; - var croppedEnd = false; - var goingDuration = datetime.millisecondsFrom('minutes', viewModel.valueOf().goingDuration); - var comingDuration = datetime.millisecondsFrom('minutes', viewModel.valueOf().comingDuration); - var modelDuration = viewModel.duration(); - var top, height, duration; - var goingDurationHeight, modelDurationHeight, comingDurationHeight; - var offsetStart = getOffsetStart(viewModel, options); - - // containerHeight : milliseconds in day = x : schedule's milliseconds - top = (baseHeight * offsetStart) / baseMS; - - modelDuration = modelDuration > SCHEDULE_MIN_DURATION ? modelDuration : SCHEDULE_MIN_DURATION; - duration = modelDuration + goingDuration + comingDuration; - height = (baseHeight * duration) / baseMS; - - goingDurationHeight = (baseHeight * goingDuration) / baseMS; // common.ratio(duration, goingDuration, 100); - modelDurationHeight = (baseHeight * modelDuration) / baseMS; // common.ratio(duration, modelDuration, 100); - comingDurationHeight = (baseHeight * comingDuration) / baseMS; // common.ratio(duration, comingDuration, 100); - - if (offsetStart < 0) { - top = 0; - height += (baseHeight * offsetStart) / baseMS; - croppedStart = true; - } - - if (height + top > baseHeight) { - height = baseHeight - top; - croppedEnd = true; - } - - return { - top: top, - height: Math.max(height, this.options.minHeight) - this.options.defaultMarginBottom, - modelDurationHeight: modelDurationHeight, - goingDurationHeight: goingDurationHeight, - comingDurationHeight: comingDurationHeight, - hasGoingDuration: goingDuration > 0, - hasComingDuration: comingDuration > 0, - croppedStart: croppedStart, - croppedEnd: croppedEnd - }; -}; - -/** - * @param {ScheduleViewModel} viewModel - view model instance to calculate bound. - * @param {object} options - options for calculating schedule element's bound. - * @param {Date} options.todayStart - date object represent schedule date's start (00:00:00) - * @param {number} options.baseMS - the number of milliseconds to render schedule blocks. - * @param {number} options.baseHeight - pixel value related with baseMS options. - * @param {number[]} options.baseLeft - left position percents for each columns. - * @param {number} options.baseWidth - the unit of schedule blocks width percent. - * @param {number} options.columnIndex - the number index of schedule blocks. - * it represent rendering index from left sides in view. - * @returns {object} bound object for supplied view model. - */ -Time.prototype.getScheduleViewBound = function(viewModel, options) { - var boundX = this._getScheduleViewBoundX(viewModel, options); - var boundY = this._getScheduleViewBoundY(viewModel, options); - var schedule = viewModel.model; - var isReadOnly = util.pick(schedule, 'isReadOnly') || false; - var travelBorderColor = schedule.isFocused ? '#ffffff' : schedule.borderColor; - if (travelBorderColor === schedule.bgColor) { - travelBorderColor = null; // follow text color - } - - return util.extend( - { - isReadOnly: isReadOnly, - travelBorderColor: travelBorderColor - }, - boundX, - boundY - ); -}; - -/** - * Set viewmodels for rendering. - * @param {string} ymd The date of schedules. YYYYMMDD format. - * @param {array} matrices The matrices for schedule placing. - * @param {number} containerHeight - container's height - */ -Time.prototype._getBaseViewModel = function(ymd, matrices, containerHeight) { - var self = this, - options = this.options, - hourStart = options.hourStart, - hourEnd = options.hourEnd, - isReadOnly = options.isReadOnly, - todayStart, - baseMS; - - /** - * Calculate each schedule element bounds relative with rendered hour milliseconds and - * wrap each schedule model to viewmodels. - */ - containerHeight = containerHeight || this.getViewBound().height; - todayStart = this._parseDateGroup(ymd); - todayStart.setHours(hourStart); - baseMS = datetime.millisecondsFrom('hour', hourEnd - hourStart); - - forEachArr(matrices, function(matrix) { - var maxRowLength, widthPercent, leftPercents, i; - - maxRowLength = Math.max.apply( - null, - util.map(matrix, function(row) { - return row.length; - }) - ); - - widthPercent = 100 / maxRowLength; - - leftPercents = []; - for (i = 0; i < maxRowLength; i += 1) { - leftPercents[i] = widthPercent * i; - } - - forEachArr(matrix, function(row) { - forEachArr(row, function(viewModel, col) { - var viewBound; - - if (!viewModel) { - return; - } - - viewBound = self.getScheduleViewBound(viewModel, { - todayStart: todayStart, - baseMS: baseMS, - baseLeft: leftPercents, - baseWidth: widthPercent, - baseHeight: containerHeight, - columnIndex: col, - isReadOnly: isReadOnly - }); - - util.extend(viewModel, viewBound); - }); - }); - }); -}; - -/** - * @returns {Date} - Date of this view. - */ -Time.prototype.getDate = function() { - return this._parseDateGroup(this.options.ymd); -}; - -/** - * @override - * @param {string} ymd The date of schedules. YYYYMMDD format - * @param {array} matrices Matrices for placing schedules - * @param {number} containerHeight - container's height - */ -Time.prototype.render = function(ymd, matrices, containerHeight) { - this._getBaseViewModel(ymd, matrices, containerHeight); - this.container.innerHTML = this.timeTmpl({ - matrices: matrices, - styles: this._getStyles(this.theme), - isReadOnly: this.options.isReadOnly - }); -}; - -/** - * Get the styles from theme - * @param {Theme} theme - theme instance - * @returns {object} styles - styles object - */ -Time.prototype._getStyles = function(theme) { - var styles = {}; - var options = this.options; - - if (theme) { - styles.borderRight = theme.week.timegrid.borderRight || theme.common.border; - styles.marginRight = theme.week.timegrid.paddingRight; - styles.borderRadius = theme.week.timegridSchedule.borderRadius; - styles.paddingLeft = theme.week.timegridSchedule.paddingLeft; - styles.backgroundColor = options.isToday ? theme.week.today.backgroundColor : 'inherit'; - } - - return styles; -}; - -Time.prototype.applyTheme = function() { - var style = this.container.style; - var styles = this._getStyles(this.theme); - - style.borderRight = styles.borderRight; - style.backgroundColor = styles.backgroundColor; -}; - -module.exports = Time; - - -/***/ }), - -/***/ "./src/js/view/week/timeGrid.js": -/*!**************************************!*\ - !*** ./src/js/view/week/timeGrid.js ***! - \**************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_1147194__) { - -"use strict"; -/** - * @fileoverview View for rendered schedules by times. - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_1147194__(/*! tui-code-snippet */ "tui-code-snippet"); -var config = __nested_webpack_require_1147194__(/*! ../../config */ "./src/js/config.js"); -var common = __nested_webpack_require_1147194__(/*! ../../common/common */ "./src/js/common/common.js"); -var domutil = __nested_webpack_require_1147194__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); -var domevent = __nested_webpack_require_1147194__(/*! ../../common/domevent */ "./src/js/common/domevent.js"); -var datetime = __nested_webpack_require_1147194__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); -var tz = __nested_webpack_require_1147194__(/*! ../../common/timezone */ "./src/js/common/timezone.js"); -var reqAnimFrame = __nested_webpack_require_1147194__(/*! ../../common/reqAnimFrame */ "./src/js/common/reqAnimFrame.js"); -var View = __nested_webpack_require_1147194__(/*! ../view */ "./src/js/view/view.js"); -var Time = __nested_webpack_require_1147194__(/*! ./time */ "./src/js/view/week/time.js"); -var AutoScroll = __nested_webpack_require_1147194__(/*! ../../common/autoScroll */ "./src/js/common/autoScroll.js"); -var mainTmpl = __nested_webpack_require_1147194__(/*! ../template/week/timeGrid.hbs */ "./src/js/view/template/week/timeGrid.hbs"); -var timezoneStickyTmpl = __nested_webpack_require_1147194__(/*! ../template/week/timezoneSticky.hbs */ "./src/js/view/template/week/timezoneSticky.hbs"); -var timegridCurrentTimeTmpl = __nested_webpack_require_1147194__(/*! ../template/week/timeGridCurrentTime.hbs */ "./src/js/view/template/week/timeGridCurrentTime.hbs"); -var TZDate = tz.Date; -var HOURMARKER_REFRESH_INTERVAL = 1000 * 60; -var SIXTY_SECONDS = 60; -var SIXTY_MINUTES = 60; - -/** - * Returns a list of time labels from start to end. - * For hidden labels near the current time, set to hidden: true. - * @param {object} opt - TimeGrid.options - * @param {boolean} hasHourMarker - Whether the current time is displayed - * @param {number} timezoneOffset - timezone offset - * @param {object} styles - styles - * @returns {Array.} - */ -function getHoursLabels(opt, hasHourMarker, timezoneOffset, styles) { - var hourStart = opt.hourStart; - var hourEnd = opt.hourEnd; - var renderEndDate = new TZDate(opt.renderEndDate); - var shiftByOffset = parseInt(timezoneOffset / SIXTY_MINUTES, 10); - var shiftMinutes = Math.abs(timezoneOffset % SIXTY_MINUTES); - var now = new TZDate().toLocalTime(); - var nowMinutes = now.getMinutes(); - var hoursRange = util.range(0, 24); - var nowAroundHours = null; - var nowHours, nowHoursIndex; - var isNegativeZero = 1 / -Infinity === shiftByOffset; - - if ((shiftByOffset < 0 || isNegativeZero) && shiftMinutes > 0) { - shiftByOffset -= 1; - } - - // shift the array and take elements between start and end - common.shiftArray(hoursRange, shiftByOffset); - common.takeArray(hoursRange, hourStart, hourEnd); - - nowHours = common.shiftHours(now.getHours(), shiftByOffset) % 24; - nowHoursIndex = util.inArray(nowHours, hoursRange); - - if (hasHourMarker) { - if (nowMinutes < 20) { - nowAroundHours = nowHours; - } else if (nowMinutes > 40) { - nowAroundHours = nowHours + 1; - } - - if (util.isNumber(nowAroundHours)) { - nowAroundHours %= 24; - } - } - - return util.map(hoursRange, function(hour, index) { - var color; - var fontWeight; - var isPast = - (hasHourMarker && index <= nowHoursIndex) || - (renderEndDate < now && !datetime.isSameDate(renderEndDate, now)); - - if (isPast) { - // past - color = styles.pastTimeColor; - fontWeight = styles.pastTimeFontWeight; - } else { - // future - color = styles.futureTimeColor; - fontWeight = styles.futureTimeFontWeight; - } - - return { - hour: hour, - minutes: shiftMinutes, - hidden: nowAroundHours === hour || index === 0, - color: color || '', - fontWeight: fontWeight || '' - }; - }); -} - -/** - * Returns timezone offset from timezone object - * @param {object} timezoneObj - timezone object in options.timzones - * @param {number} timestamp - timestamp - * @returns {number} timezoneOffset - timezone offset - */ -function getOffsetByTimezoneOption(timezoneObj, timestamp) { - var primaryOffset = tz.getPrimaryOffset(); - if (util.isString(timezoneObj.timezoneName)) { - return -tz.getOffsetByTimezoneName(timezoneObj.timezoneName, timestamp); - } - - // @deprecated timezoneOffset property will be deprecated - if (util.isNumber(timezoneObj.timezoneOffset) && timezoneObj.timezoneOffset !== primaryOffset) { - return timezoneObj.timezoneOffset; - } - - return -primaryOffset; -} - -/** - * @constructor - * @extends {View} - * @param {string} name - view name - * @param {object} options The object for view customization. - * @param {string} options.renderStartDate - render start date. YYYY-MM-DD - * @param {string} options.renderEndDate - render end date. YYYY-MM-DD - * @param {number} [options.hourStart=0] You can change view's start hours. - * @param {number} [options.hourEnd=0] You can change view's end hours. - * @param {HTMLElement} panelElement panel element. - */ -function TimeGrid(name, options, panelElement) { - var container = domutil.appendHTMLElement( - 'div', - panelElement, - config.classname('timegrid-container') - ); - var stickyContainer = domutil.appendHTMLElement( - 'div', - panelElement, - config.classname('timegrid-sticky-container') - ); - - panelElement.style.position = 'relative'; // for stickyContainer - - name = name || 'time'; - - View.call(this, container); - - if (!util.browser.safari) { - /** - * @type {AutoScroll} - */ - this._autoScroll = new AutoScroll(container); - } - - this.stickyContainer = stickyContainer; - - /** - * Time view options. - * @type {object} - */ - this.options = util.extend( - { - viewName: name, - renderStartDate: '', - renderEndDate: '', - hourStart: 0, - hourEnd: 24, - timezones: options.timezones, - isReadOnly: options.isReadOnly, - showTimezoneCollapseButton: false - }, - options.week - ); - - if (this.options.timezones.length < 1) { - this.options.timezones = [ - { - timezoneOffset: tz.getPrimaryOffset() - } - ]; - } - - /** - * Interval id for hourmarker animation. - * @type {number} - */ - this.intervalID = 0; - - /** - * timer id for hourmarker initial state - * @type {number} - */ - this.timerID = 0; - - /** - * requestAnimationFrame unique ID - * @type {number} - */ - this.rAnimationFrameID = 0; - - /** - * @type {boolean} - */ - this._scrolled = false; - - /** - * cache parent's view model - * @type {object} - */ - this._cacheParentViewModel = null; - - /** - * cache hoursLabels view model to render again TimeGrid - * @type {object} - */ - this._cacheHoursLabels = null; - - this.attachEvent(); -} - -util.inherit(TimeGrid, View); - -/********** - * Prototype props - **********/ - -/** - * @type {string} - */ -TimeGrid.prototype.viewName = 'timegrid'; - -/** - * Destroy view. - * @override - */ -TimeGrid.prototype._beforeDestroy = function() { - clearInterval(this.intervalID); - clearTimeout(this.timerID); - reqAnimFrame.cancelAnimFrame(this.rAnimationFrameID); - - if (this._autoScroll) { - this._autoScroll.destroy(); - } - - domevent.off(this.stickyContainer, 'click', this._onClickStickyContainer, this); - - this._autoScroll = this.hourmarkers = this.intervalID - = this.timerID = this.rAnimationFrameID = this._cacheParentViewModel = this.stickyContainer = null; -}; - -/** - * @param {Date} [time] - date object to convert pixel in grids. - * use **Date.now()** when not supplied. - * @returns {number} The pixel value represent current time in grids. - */ -TimeGrid.prototype._getTopPercentByTime = function(time) { - var opt = this.options, - raw = datetime.raw(time || new TZDate()), - hourLength = util.range(opt.hourStart, opt.hourEnd).length, - maxMilliseconds = hourLength * datetime.MILLISECONDS_PER_HOUR, - hmsMilliseconds = - datetime.millisecondsFrom('hour', raw.h) + - datetime.millisecondsFrom('minutes', raw.m) + - datetime.millisecondsFrom('seconds', raw.s) + - raw.ms, - topPercent; - - topPercent = common.ratio(maxMilliseconds, 100, hmsMilliseconds); - topPercent -= common.ratio( - maxMilliseconds, - 100, - datetime.millisecondsFrom('hour', opt.hourStart) - ); - - return common.limit(topPercent, [0], [100]); -}; - -/** - * Get Hourmarker viewmodel. - * @param {TZDate} now - now - * @param {object} grids grid information(width, left, day) - * @param {Array.} range render range - * @returns {object} ViewModel of hourmarker. - */ -TimeGrid.prototype._getHourmarkerViewModel = function(now, grids, range) { - var todaymarkerLeft = -1; - var todaymarkerWidth = -1; - var hourmarkerTimzones = []; - var opt = this.options; - var primaryOffset = tz.getPrimaryOffset(); - var timezones = opt.timezones; - var viewModel; - - util.forEach(range, function(date, index) { - if (datetime.isSameDate(now, date)) { - todaymarkerLeft = grids[index] ? grids[index].left : 0; - todaymarkerWidth = grids[index] ? grids[index].width : 0; - } - }); - - util.forEach(timezones, function(timezone) { - var hourmarker = new TZDate(now); - var timezoneOffset = getOffsetByTimezoneOption(timezone, hourmarker.getTime()); - var timezoneDifference = timezoneOffset + primaryOffset; - var dateDifference; - - hourmarker.setMinutes(hourmarker.getMinutes() + timezoneDifference); - dateDifference = datetime.getDateDifference(hourmarker, now); - - hourmarkerTimzones.push({ - hourmarker: hourmarker, - dateDifferenceSign: dateDifference < 0 ? '-' : '+', - dateDifference: Math.abs(dateDifference) - }); - }); - - viewModel = { - currentHours: now.getHours(), - hourmarkerTop: this._getTopPercentByTime(now), - hourmarkerTimzones: hourmarkerTimzones, - todaymarkerLeft: todaymarkerLeft, - todaymarkerWidth: todaymarkerWidth, - todaymarkerRight: todaymarkerLeft + todaymarkerWidth - }; - - return viewModel; -}; - -/** - * Get timezone view model - * @param {number} currentHours - current hour - * @param {boolean} timezonesCollapsed - multiple timezones are collapsed. - * @param {object} styles - styles - * @returns {object} ViewModel - */ -TimeGrid.prototype._getTimezoneViewModel = function(currentHours, timezonesCollapsed, styles) { - var opt = this.options; - var primaryOffset = tz.getPrimaryOffset(); - var timezones = opt.timezones; - var timezonesLength = timezones.length; - var timezoneViewModel = []; - var collapsed = timezonesCollapsed; - var width = collapsed ? 100 : 100 / timezonesLength; - var now = new TZDate().toLocalTime(); - var backgroundColor = styles.displayTimezoneLabelBackgroundColor; - - // eslint-disable-next-line complexity - util.forEach(timezones, function(timezone, index) { - var hourmarker = new TZDate(now); - var timezoneOffset = getOffsetByTimezoneOption(timezone, hourmarker.getTime()); - var timezoneDifference = timezoneOffset + primaryOffset; - var timeSlots = getHoursLabels(opt, currentHours >= 0, timezoneDifference, styles); - var dateDifference; - - hourmarker.setMinutes(hourmarker.getMinutes() + timezoneDifference); - dateDifference = datetime.getDateDifference(hourmarker, now); - - if (index > 0) { - backgroundColor = styles.additionalTimezoneBackgroundColor; - } - - timezoneViewModel.push({ - timeSlots: timeSlots, - displayLabel: timezone.displayLabel, - timezoneOffset: timezone.timezoneOffset, - tooltip: timezone.tooltip || '', - width: width, - left: collapsed ? 0 : (timezones.length - index - 1) * width, - isPrimary: index === 0, - backgroundColor: backgroundColor || '', - hidden: index !== 0 && collapsed, - hourmarker: hourmarker, - dateDifferenceSign: dateDifference < 0 ? '-' : '+', - dateDifference: Math.abs(dateDifference) - }); - }); - - return timezoneViewModel; -}; - -/** - * Get base viewModel. - * @param {object} viewModel - view model - * @returns {object} ViewModel - */ -TimeGrid.prototype._getBaseViewModel = function(viewModel) { - var grids = viewModel.grids; - var range = viewModel.range; - var opt = this.options; - var baseViewModel = this._getHourmarkerViewModel(new TZDate().toLocalTime(), grids, range); - var timezonesCollapsed = util.pick(viewModel, 'state', 'timezonesCollapsed'); - var styles = this._getStyles(viewModel.theme, timezonesCollapsed); - - return util.extend(baseViewModel, { - timezones: this._getTimezoneViewModel( - baseViewModel.todaymarkerLeft, - timezonesCollapsed, - styles - ), - hoursLabels: getHoursLabels(opt, baseViewModel.todaymarkerLeft >= 0, 0, styles), - styles: styles, - showTimezoneCollapseButton: util.pick(opt, 'showTimezoneCollapseButton'), - timezonesCollapsed: timezonesCollapsed - }); -}; - -/** - * Reconcilation child views and render. - * @param {object} viewModels Viewmodel - * @param {object} grids grid information(width, left, day) - * @param {HTMLElement} container Container element for each time view. - * @param {Theme} theme - theme instance - */ -TimeGrid.prototype._renderChildren = function(viewModels, grids, container, theme) { - var self = this, - options = this.options, - childOption, - child, - isToday, - containerHeight, - today = datetime.format(new TZDate().toLocalTime(), 'YYYYMMDD'), - i = 0; - - // clear contents - container.innerHTML = ''; - this.children.clear(); - - containerHeight = domutil.getSize(container.parentElement)[1]; - - // reconcilation of child views - util.forEach(viewModels, function(schedules, ymd) { - isToday = ymd === today; - - childOption = { - index: i, - left: grids[i] ? grids[i].left : 0, - width: grids[i] ? grids[i].width : 0, - ymd: ymd, - isToday: isToday, - isPending: options.isPending, - isFocused: options.isFocused, - isReadOnly: options.isReadOnly, - hourStart: options.hourStart, - hourEnd: options.hourEnd - }; - - child = new Time( - childOption, - domutil.appendHTMLElement('div', container, config.classname('time-date')), - theme - ); - child.render(ymd, schedules, containerHeight); - - self.addChild(child); - - i += 1; - }); -}; - -/** - * @override - * @param {object} viewModel ViewModel list from Week view. - */ -TimeGrid.prototype.render = function(viewModel) { - var opt = this.options, - timeViewModel = viewModel.schedulesInDateRange[opt.viewName], - container = this.container, - grids = viewModel.grids, - baseViewModel = this._getBaseViewModel(viewModel), - scheduleLen = util.keys(timeViewModel).length; - - this._cacheParentViewModel = viewModel; - this._cacheHoursLabels = baseViewModel.hoursLabels; - - if (!scheduleLen) { - return; - } - - baseViewModel.showHourMarker = baseViewModel.todaymarkerLeft >= 0; - - container.innerHTML = mainTmpl(baseViewModel); - - /********** - * Render sticky container for timezone display label - **********/ - this.renderStickyContainer(baseViewModel); - - /********** - * Render children - **********/ - this._renderChildren( - timeViewModel, - grids, - domutil.find(config.classname('.timegrid-schedules-container'), container), - viewModel.theme - ); - - this._hourLabels = domutil.find('ul', container); - - /********** - * Render hourmarker - **********/ - this.hourmarkers = domutil.find(config.classname('.timegrid-hourmarker'), container, true); - - if (!this._scrolled) { - this._scrolled = true; - this.scrollToNow(); - } -}; - -TimeGrid.prototype.renderStickyContainer = function(baseViewModel) { - var stickyContainer = this.stickyContainer; - - stickyContainer.innerHTML = timezoneStickyTmpl(baseViewModel); - - stickyContainer.style.display = baseViewModel.timezones.length > 1 ? 'block' : 'none'; - stickyContainer.style.width = baseViewModel.styles.leftWidth; - stickyContainer.style.height = baseViewModel.styles.displayTimezoneLabelHeight; - stickyContainer.style.borderBottom = baseViewModel.styles.leftBorderRight; -}; - -/** - * Refresh hourmarker element. - */ -TimeGrid.prototype.refreshHourmarker = function() { - var hourmarkers = this.hourmarkers; - var viewModel = this._cacheParentViewModel; - var hoursLabels = this._cacheHoursLabels; - var rAnimationFrameID = this.rAnimationFrameID; - var baseViewModel; - - if (!hourmarkers || !viewModel || rAnimationFrameID) { - return; - } - - baseViewModel = this._getBaseViewModel(viewModel); - - this.rAnimationFrameID = reqAnimFrame.requestAnimFrame(function() { - var needsRender = false; - - util.forEach(hoursLabels, function(hoursLabel, index) { - if (hoursLabel.hidden !== baseViewModel.hoursLabels[index].hidden) { - needsRender = true; - - return false; - } - - return true; - }); - - if (needsRender) { - this.render(viewModel); - } else { - util.forEach(hourmarkers, function(hourmarker) { - var todaymarker = domutil.find( - config.classname('.timegrid-todaymarker'), - hourmarker - ); - var hourmarkerContainer = domutil.find( - config.classname('.timegrid-hourmarker-time'), - hourmarker - ); - var timezone = domutil.closest(hourmarker, config.classname('.timegrid-timezone')); - var timezoneIndex = timezone ? domutil.getData(timezone, 'timezoneIndex') : 0; - - hourmarker.style.top = baseViewModel.hourmarkerTop + '%'; - - if (todaymarker) { - todaymarker.style.display = - baseViewModel.todaymarkerLeft >= 0 ? 'block' : 'none'; - } - if (hourmarkerContainer) { - hourmarkerContainer.innerHTML = timegridCurrentTimeTmpl( - baseViewModel.hourmarkerTimzones[timezoneIndex] - ); - } - }); - } - - this.rAnimationFrameID = null; - }, this); -}; - -/** - * Attach events - */ -TimeGrid.prototype.attachEvent = function() { - clearInterval(this.intervalID); - clearTimeout(this.timerID); - this.intervalID = this.timerID = this.rAnimationFrameID = null; - - this.timerID = setTimeout( - this.onTick.bind(this), - (SIXTY_SECONDS - new TZDate().getSeconds()) * 1000 - ); - - domevent.on(this.stickyContainer, 'click', this._onClickStickyContainer, this); -}; - -/** - * Scroll time grid to current hourmarker. - */ -TimeGrid.prototype.scrollToNow = function() { - var container = this.container; - var offsetTop, viewBound, scrollTop, scrollAmount, scrollBy, scrollFn; - - if (!this.hourmarkers || !this.hourmarkers.length) { - return; - } - - offsetTop = this.hourmarkers[0].offsetTop; - viewBound = this.getViewBound(); - scrollTop = offsetTop; - scrollAmount = viewBound.height / 4; - scrollBy = 10; - - scrollFn = function() { - if (scrollTop > offsetTop - scrollAmount) { - scrollTop -= scrollBy; - container.scrollTop = scrollTop; - - reqAnimFrame.requestAnimFrame(scrollFn); - } else { - container.scrollTop = offsetTop - scrollAmount; - } - }; - - reqAnimFrame.requestAnimFrame(scrollFn); -}; - -/********** - * Schedule handlers - **********/ - -/** - * Interval tick handler - */ -TimeGrid.prototype.onTick = function() { - if (this.timerID) { - clearTimeout(this.timerID); - this.timerID = null; - } - - if (!this.intervalID) { - this.intervalID = setInterval(this.onTick.bind(this), HOURMARKER_REFRESH_INTERVAL); - } - this.refreshHourmarker(); -}; - -/** - * Get the styles from theme - * @param {Theme} theme - theme instance - * @param {boolean} timezonesCollapsed - multiple timezones are collapsed. - * @returns {object} styles - styles object - */ -// eslint-disable-next-line complexity -TimeGrid.prototype._getStyles = function(theme, timezonesCollapsed) { - var styles = {}; - var timezonesLength = this.options.timezones.length; - var collapsed = timezonesCollapsed; - var numberAndUnit; - - if (theme) { - styles.borderBottom = theme.week.timegridHorizontalLine.borderBottom || theme.common.border; - styles.halfHourBorderBottom = - theme.week.timegridHalfHour.borderBottom || theme.common.border; - - styles.todayBackgroundColor = theme.week.today.backgroundColor; - styles.weekendBackgroundColor = theme.week.weekend.backgroundColor; - styles.backgroundColor = theme.week.daygrid.backgroundColor; - styles.leftWidth = theme.week.timegridLeft.width; - styles.leftBackgroundColor = theme.week.timegridLeft.backgroundColor; - styles.leftBorderRight = theme.week.timegridLeft.borderRight || theme.common.border; - styles.leftFontSize = theme.week.timegridLeft.fontSize; - styles.timezoneWidth = theme.week.timegridLeft.width; - styles.additionalTimezoneBackgroundColor = - theme.week.timegridLeftAdditionalTimezone.backgroundColor || styles.leftBackgroundColor; - - styles.displayTimezoneLabelHeight = theme.week.timegridLeftTimezoneLabel.height; - styles.displayTimezoneLabelBackgroundColor = - theme.week.timegridLeft.backgroundColor === 'inherit' - ? 'white' - : theme.week.timegridLeft.backgroundColor; - - styles.oneHourHeight = theme.week.timegridOneHour.height; - styles.halfHourHeight = theme.week.timegridHalfHour.height; - styles.quaterHourHeight = (parseInt(styles.halfHourHeight, 10) / 2) + 'px'; - - styles.currentTimeColor = theme.week.currentTime.color; - styles.currentTimeFontSize = theme.week.currentTime.fontSize; - styles.currentTimeFontWeight = theme.week.currentTime.fontWeight; - - styles.pastTimeColor = theme.week.pastTime.color; - styles.pastTimeFontWeight = theme.week.pastTime.fontWeight; - - styles.futureTimeColor = theme.week.futureTime.color; - styles.futureTimeFontWeight = theme.week.futureTime.fontWeight; - - styles.currentTimeLeftBorderTop = theme.week.currentTimeLinePast.border; - styles.currentTimeBulletBackgroundColor = theme.week.currentTimeLineBullet.backgroundColor; - styles.currentTimeTodayBorderTop = theme.week.currentTimeLineToday.border; - styles.currentTimeRightBorderTop = theme.week.currentTimeLineFuture.border; - - if (!collapsed && timezonesLength > 1) { - numberAndUnit = common.parseUnit(styles.leftWidth); - styles.leftWidth = (numberAndUnit[0] * timezonesLength) + numberAndUnit[1]; - } - } - - return styles; -}; - -/** - * @param {MouseEvent} event - mouse event object - */ -TimeGrid.prototype._onClickStickyContainer = function(event) { - var target = domevent.getEventTarget(event); - var closeBtn = domutil.closest(target, config.classname('.timegrid-timezone-close-btn')); - - if (!closeBtn) { - return; - } - - this.fire('clickTimezonesCollapsedBtn'); -}; - -module.exports = TimeGrid; - - -/***/ }), - -/***/ "./src/js/view/week/week.js": -/*!**********************************!*\ - !*** ./src/js/view/week/week.js ***! - \**********************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_1171427__) { - -"use strict"; -/** - * @fileoverview View of days UI. - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_1171427__(/*! tui-code-snippet */ "tui-code-snippet"); -var config = __nested_webpack_require_1171427__(/*! ../../config */ "./src/js/config.js"); -var domutil = __nested_webpack_require_1171427__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); -var datetime = __nested_webpack_require_1171427__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); -var TZDate = __nested_webpack_require_1171427__(/*! ../../common/timezone */ "./src/js/common/timezone.js").Date; -var View = __nested_webpack_require_1171427__(/*! ../view */ "./src/js/view/view.js"); - -/** - * @constructor - * @param {Base.Week} controller The controller mixin part. - * @param {object} options View options - * @param {string} [options.renderStartDate] Start date of render. - * if not supplied then use -3d from today. YYYY-MM-DD format. - * @param {string} [options.renderEndDate] End date of render. - * if not supplied then use +3d from today. YYYY-MM-DD format. - * @param {string} [options.cssPrefix] - CSS classname prefix - * @param {HTMLElement} container The element to use container for this view. - * @param {object} panels - schedule panels like 'milestone', 'task', 'allday', 'time' - * @param {string} viewName - 'week', 'day' - * @extends {View} - */ -function Week(controller, options, container, panels, viewName) { - var range; - - container = domutil.appendHTMLElement('div', container); - - View.call(this, container); - - domutil.addClass(container, config.classname('week-container')); - - range = this._getRenderDateRange(new TZDate()); - - /** - * @type {object} Options for view. - */ - this.options = util.extend({ - scheduleFilter: [function(schedule) { - return Boolean(schedule.isVisible); - }], - renderStartDate: datetime.format(range.start, 'YYYY-MM-DD'), - renderEndDate: datetime.format(range.end, 'YYYY-MM-DD'), - narrowWeekend: false, - startDayOfWeek: 0, - workweek: false, - showTimezoneCollapseButton: false, - timezonesCollapsed: false, - hourStart: 0, - hourEnd: 24 - }, options); - - /** - * Week controller mixin. - * @type {Base.Week} - */ - this.controller = controller; - - /** - * Schedule Panels - * @type {Array.} - */ - this.panels = panels; - - /** - * Week view states - * @type {object} - */ - this.state = { - timezonesCollapsed: this.options.timezonesCollapsed - }; - - if (viewName === 'day') { - _disableDayOptions(this.options); - } -} - -util.inherit(Week, View); - -/********** - * Override props - **********/ - -/** - * Render each child view with schedules in ranges. - * @fires Week#afterRender - * @override - */ -Week.prototype.render = function() { - var self = this, - options = this.options, - scheduleFilter = options.scheduleFilter, - narrowWeekend = options.narrowWeekend, - startDayOfWeek = options.startDayOfWeek, - workweek = options.workweek, - theme = this.controller.theme || {}, - state = this.state; - var renderStartDate, renderEndDate, schedulesInDateRange, viewModel, grids, range; - - renderStartDate = new TZDate(options.renderStartDate); - renderEndDate = new TZDate(options.renderEndDate); - - range = datetime.range( - datetime.start(renderStartDate), - datetime.end(renderEndDate), - datetime.MILLISECONDS_PER_DAY - ); - - if (options.workweek && datetime.compare(renderStartDate, renderEndDate)) { - range = util.filter(range, function(date) { - return !datetime.isWeekend(date.getDay()); - }); - - renderStartDate = range[0]; - renderEndDate = range[range.length - 1]; - } - - schedulesInDateRange = this.controller.findByDateRange( - datetime.start(renderStartDate), - datetime.end(renderEndDate), - this.panels, - scheduleFilter, - this.options - ); - - grids = datetime.getGridLeftAndWidth( - range.length, - narrowWeekend, - startDayOfWeek, - workweek - ); - - viewModel = { - schedulesInDateRange: schedulesInDateRange, - renderStartDate: renderStartDate, - renderEndDate: renderEndDate, - grids: grids, - range: range, - theme: theme, - state: state - }; - - this.children.each(function(childView) { - var matrices; - var viewName = util.pick(childView.options, 'viewName'); - childView.render(viewModel); - - if (viewName) { - matrices = viewModel.schedulesInDateRange[viewName]; // DayGrid limits schedule count by visibleScheduleCount after rendering it. - - if (util.isArray(matrices)) { - self._invokeAfterRenderSchedule(matrices); - } else { - util.forEach(matrices, function(matricesOfDay) { - self._invokeAfterRenderSchedule(matricesOfDay); - }); - } - } - }); - - /** - * @event Week#afterRender - */ - this.fire('afterRender'); -}; - -/** - * Fire 'afterRenderSchedule' event - * @param {Array} matrices - schedule matrices from view model - * @fires Week#afterRenderSchedule - */ -Week.prototype._invokeAfterRenderSchedule = function(matrices) { - var self = this; - util.forEachArray(matrices, function(matrix) { - util.forEachArray(matrix, function(column) { - util.forEachArray(column, function(scheduleViewModel) { - if (scheduleViewModel) { - /** - * @event Week#afterRenderSchedule - */ - self.fire('afterRenderSchedule', {schedule: scheduleViewModel.model}); - } - }); - }); - }); -}; - -/********** - * Prototype props - **********/ - -Week.prototype.viewName = 'week'; - -/** - * Calculate default render date range from supplied date. - * @param {Date} baseDate base date. - * @returns {object} date range. - */ -Week.prototype._getRenderDateRange = function(baseDate) { - var base = datetime.start(baseDate), - start = new TZDate(Number(base)), - end = new TZDate(Number(base)); - - start.setDate(start.getDate() - 3); - end.setDate(end.getDate() + 3); - - return { - start: start, - end: end - }; -}; - -/** - * disable options for day view - * @param {WeekOptions} options - week options to disable - */ -function _disableDayOptions(options) { - options.workweek = false; -} - -util.CustomEvents.mixin(Week); - -module.exports = Week; - - -/***/ }), - -/***/ "./src/js/view/weekday.js": -/*!********************************!*\ - !*** ./src/js/view/weekday.js ***! - \********************************/ -/*! no static exports found */ -/***/ (function(module, exports, __nested_webpack_require_1178196__) { - -"use strict"; -/** - * @fileoverview Weekday view - * @author NHN FE Development Lab - */ - - -var util = __nested_webpack_require_1178196__(/*! tui-code-snippet */ "tui-code-snippet"); -var config = __nested_webpack_require_1178196__(/*! ../config */ "./src/js/config.js"), - domutil = __nested_webpack_require_1178196__(/*! ../common/domutil */ "./src/js/common/domutil.js"), - datetime = __nested_webpack_require_1178196__(/*! ../common/datetime */ "./src/js/common/datetime.js"), - TZDate = __nested_webpack_require_1178196__(/*! ../common/timezone */ "./src/js/common/timezone.js").Date, - View = __nested_webpack_require_1178196__(/*! ./view */ "./src/js/view/view.js"); - -/** - * @constructor - * @extends {View} - * @param {object} options - view options. - * @param {number} [options.containerButtonGutter=8] - free space at bottom to - * make create easy. - * @param {number} [options.scheduleHeight=18] - height of each schedule block. - * @param {number} [options.scheduleGutter=2] - gutter height of each schedule block. - * @param {HTMLDIVElement} container - DOM element to use container for this - * view. - */ -function Weekday(options, container) { - container = domutil.appendHTMLElement( - 'div', - container, - config.classname('weekday') - ); - - /** - * @type {object} - */ - this.options = util.extend({ - containerBottomGutter: 8, - scheduleHeight: 18, - scheduleGutter: 2, - narrowWeekend: false, - startDayOfWeek: 0, - workweek: false - }, options); - - /* - * cache parent's view model - * @type {object} - */ - this._cacheParentViewModel = null; - - View.call(this, container); -} - -util.inherit(Weekday, View); - -/** - * Get render date range - * @returns {Date[]} rendered date range - */ -Weekday.prototype.getRenderDateRange = function() { - return this._cacheParentViewModel.range; -}; - -/** - * Get render date grids information - * @returns {Date[]} rendered date grids information - */ -Weekday.prototype.getRenderDateGrids = function() { - return this._cacheParentViewModel.grids; -}; - -/** - * Get default view model. - * @param {object} viewModel parent's view model - * @returns {object} viewModel to rendering. - */ -Weekday.prototype.getBaseViewModel = function(viewModel) { - var opt = this.options; - var range = viewModel.range; - var gridWidth = (100 / range.length); - var grids = viewModel.grids; - var exceedDate = viewModel.exceedDate || {}; - var theme = viewModel.theme; - var now = new TZDate().toLocalTime(); - - this._cacheParentViewModel = viewModel; - - return { - width: gridWidth, - scheduleHeight: opt.scheduleHeight, - scheduleBlockHeight: (opt.scheduleHeight + opt.scheduleGutter), - scheduleBlockGutter: opt.scheduleGutter, - dates: util.map(range, function(date, index) { - var day = date.getDay(); - var ymd = datetime.format(new TZDate(date), 'YYYYMMDD'); - var isToday = datetime.isSameDate(now, date); - - return { - date: datetime.format(date, 'YYYY-MM-DD'), - month: date.getMonth() + 1, - day: day, - isToday: isToday, - ymd: ymd, - hiddenSchedules: exceedDate[ymd] || 0, - width: grids[index] ? grids[index].width : 0, - left: grids[index] ? grids[index].left : 0, - color: this._getDayNameColor(theme, day, isToday), - backgroundColor: this._getDayBackgroundColor(theme, day) - }; - }, this) - }; -}; - -/* eslint max-nested-callbacks: 0 */ -/** - * Make exceed date information - * @param {number} maxCount - exceed schedule count - * @param {Array} eventsInDateRange - matrix of ScheduleViewModel - * @param {Array.} range - date range of one week - * @returns {object} exceedDate - */ -Weekday.prototype.getExceedDate = function(maxCount, eventsInDateRange, range) { - var exceedDate = this._initExceedDate(range); - - util.forEach(eventsInDateRange, function(matrix) { - util.forEach(matrix, function(column) { - util.forEach(column, function(viewModel) { - var period; - if (!viewModel || viewModel.top < maxCount) { - return; - } - - // check that this schedule block is not visible after rendered. - viewModel.hidden = true; - - period = datetime.range( - viewModel.getStarts(), - viewModel.getEnds(), - datetime.MILLISECONDS_PER_DAY - ); - - util.forEach(period, function(date) { - var ymd = datetime.format(date, 'YYYYMMDD'); - exceedDate[ymd] += 1; - }); - }); - }); - }); - - return exceedDate; -}; - -/** - * Initiate exceed date information - * @param {Array.} range - date range of one week - * @returns {Object} - initiated exceed date - */ -Weekday.prototype._initExceedDate = function(range) { - var exceedDate = {}; - - util.forEach(range, function(date) { - var ymd = datetime.format(date, 'YYYYMMDD'); - exceedDate[ymd] = 0; - }); - - return exceedDate; -}; - -/** - * Get a day name color - * @param {Theme} theme - theme instance - * @param {number} day - day number - * @param {boolean} isToday - today flag - * @param {boolean} isOtherMonth - not this month flag - * @returns {string} style - color style - */ -Weekday.prototype._getDayNameColor = function(theme, day, isToday, isOtherMonth) { - var color = ''; - - if (theme) { - if (day === 0) { - color = isOtherMonth ? theme.month.holidayExceptThisMonth.color : theme.common.holiday.color; - } else if (day === 6) { - color = isOtherMonth ? theme.month.dayExceptThisMonth.color : theme.common.saturday.color; - } else if (isToday) { - color = theme.common.today.color; - } else { - color = isOtherMonth ? theme.month.dayExceptThisMonth.color : theme.common.dayname.color; - } - } - - return color; -}; - -/** - * Get a day background color - * @param {Theme} theme - theme instance - * @param {number} day - day number - * @returns {string} style - color style - */ -Weekday.prototype._getDayBackgroundColor = function(theme, day) { - var color = ''; - - if (theme) { - if (day === 0 || day === 6) { - color = theme.month.weekend.backgroundColor; - } else { - color = 'inherit'; - } - } - - return color; -}; - -module.exports = Weekday; - - -/***/ }), - -/***/ "tui-code-snippet": -/*!******************************************************************************************************************************!*\ - !*** external {"commonjs":"tui-code-snippet","commonjs2":"tui-code-snippet","amd":"tui-code-snippet","root":["tui","util"]} ***! - \******************************************************************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -module.exports = __WEBPACK_EXTERNAL_MODULE_tui_code_snippet__; - -/***/ }), - -/***/ "tui-date-picker": -/*!*********************************************************************************************************************************!*\ - !*** external {"commonjs":"tui-date-picker","commonjs2":"tui-date-picker","amd":"tui-date-picker","root":["tui","DatePicker"]} ***! - \*********************************************************************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -module.exports = __WEBPACK_EXTERNAL_MODULE_tui_date_picker__; - -/***/ }) - -/******/ }); -}); -//# sourceMappingURL=tui-calendar.js.map - -/***/ }), - -/***/ "./node_modules/tui-code-snippet/dist/tui-code-snippet.js": -/*!****************************************************************!*\ - !*** ./node_modules/tui-code-snippet/dist/tui-code-snippet.js ***! - \****************************************************************/ -/***/ (function(module) { - -/*! - * tui-code-snippet.js - * @version 1.5.2 - * @author NHN. FE Development Lab - * @license MIT - */ -(function webpackUniversalModuleDefinition(root, factory) { - if(true) - module.exports = factory(); - else {} -})(this, function() { -return /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; - -/******/ // The require function -/******/ function __nested_webpack_require_687__(moduleId) { - -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) -/******/ return installedModules[moduleId].exports; - -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ exports: {}, -/******/ id: moduleId, -/******/ loaded: false -/******/ }; - -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __nested_webpack_require_687__); - -/******/ // Flag the module as loaded -/******/ module.loaded = true; - -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } - - -/******/ // expose the modules object (__webpack_modules__) -/******/ __nested_webpack_require_687__.m = modules; - -/******/ // expose the module cache -/******/ __nested_webpack_require_687__.c = installedModules; - -/******/ // __webpack_public_path__ -/******/ __nested_webpack_require_687__.p = "dist"; - -/******/ // Load entry module and return exports -/******/ return __nested_webpack_require_687__(0); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ (function(module, exports, __nested_webpack_require_1892__) { - - 'use strict'; - - /** - * @fileoverview - * @author NHN. - * FE Development Lab - * @namespace tui.util - * @example - * // node, commonjs - * var util = require('tui-code-snippet'); - * @example - * // distribution file, script - * - * "; - * var result = util.encodeHTMLEntity(htmlEntityString); - * //"<script> alert('test');</script><a href='test'>" - */ - function encodeHTMLEntity(html) { - var entities = { - '"': 'quot', - '&': 'amp', - '<': 'lt', - '>': 'gt', - '\'': '#39' - }; - - return html.replace(/[<>&"']/g, function(m0) { - return entities[m0] ? '&' + entities[m0] + ';' : m0; - }); - } - - /** - * Return whether the string capable to transform into plain string is in the given string or not. - * @param {String} string - test string - * @memberof tui.util - * @returns {boolean} - */ - function hasEncodableString(string) { - return (/[<>&"']/).test(string); - } - - /** - * Return duplicate charters - * @param {string} operandStr1 The operand string - * @param {string} operandStr2 The operand string - * @private - * @memberof tui.util - * @returns {string} - * @example - * //-- #1. Get Module --// - * var util = require('tui-code-snippet'); // node, commonjs - * var util = tui.util; // distribution file - * - * //-- #2. Use property --// - * util.getDuplicatedChar('fe dev', 'nhn entertainment'); // 'e' - * util.getDuplicatedChar('fdsa', 'asdf'); // 'asdf' - */ - function getDuplicatedChar(operandStr1, operandStr2) { - var i = 0; - var len = operandStr1.length; - var pool = {}; - var dupl, key; - - for (; i < len; i += 1) { - key = operandStr1.charAt(i); - pool[key] = 1; - } - - for (i = 0, len = operandStr2.length; i < len; i += 1) { - key = operandStr2.charAt(i); - if (pool[key]) { - pool[key] += 1; - } - } - - pool = collection.filter(pool, function(item) { - return item > 1; - }); - - pool = object.keys(pool).sort(); - dupl = pool.join(''); - - return dupl; - } - - module.exports = { - decodeHTMLEntity: decodeHTMLEntity, - encodeHTMLEntity: encodeHTMLEntity, - hasEncodableString: hasEncodableString, - getDuplicatedChar: getDuplicatedChar - }; - - -/***/ }), -/* 8 */ -/***/ (function(module, exports) { - - /** - * @fileoverview collections of some technic methods. - * @author NHN. - * FE Development Lab - */ - - 'use strict'; - - var tricks = {}; - var aps = Array.prototype.slice; - - /** - * Creates a debounced function that delays invoking fn until after delay milliseconds has elapsed - * since the last time the debouced function was invoked. - * @param {function} fn The function to debounce. - * @param {number} [delay=0] The number of milliseconds to delay - * @memberof tui.util - * @returns {function} debounced function. - * @example - * //-- #1. Get Module --// - * var util = require('tui-code-snippet'); // node, commonjs - * var util = tui.util; // distribution file - * - * //-- #2. Use property --// - * function someMethodToInvokeDebounced() {} - * - * var debounced = util.debounce(someMethodToInvokeDebounced, 300); - * - * // invoke repeatedly - * debounced(); - * debounced(); - * debounced(); - * debounced(); - * debounced(); - * debounced(); // last invoke of debounced() - * - * // invoke someMethodToInvokeDebounced() after 300 milliseconds. - */ - function debounce(fn, delay) { - var timer, args; - - /* istanbul ignore next */ - delay = delay || 0; - - function debounced() { // eslint-disable-line require-jsdoc - args = aps.call(arguments); - - window.clearTimeout(timer); - timer = window.setTimeout(function() { - fn.apply(null, args); - }, delay); - } - - return debounced; - } - - /** - * return timestamp - * @memberof tui.util - * @returns {number} The number of milliseconds from Jan. 1970 00:00:00 (GMT) - */ - function timestamp() { - return Number(new Date()); - } - - /** - * Creates a throttled function that only invokes fn at most once per every interval milliseconds. - * - * You can use this throttle short time repeatedly invoking functions. (e.g MouseMove, Resize ...) - * - * if you need reuse throttled method. you must remove slugs (e.g. flag variable) related with throttling. - * @param {function} fn function to throttle - * @param {number} [interval=0] the number of milliseconds to throttle invocations to. - * @memberof tui.util - * @returns {function} throttled function - * @example - * //-- #1. Get Module --// - * var util = require('tui-code-snippet'); // node, commonjs - * var util = tui.util; // distribution file - * - * //-- #2. Use property --// - * function someMethodToInvokeThrottled() {} - * - * var throttled = util.throttle(someMethodToInvokeThrottled, 300); - * - * // invoke repeatedly - * throttled(); // invoke (leading) - * throttled(); - * throttled(); // invoke (near 300 milliseconds) - * throttled(); - * throttled(); - * throttled(); // invoke (near 600 milliseconds) - * // ... - * // invoke (trailing) - * - * // if you need reuse throttled method. then invoke reset() - * throttled.reset(); - */ - function throttle(fn, interval) { - var base; - var isLeading = true; - var tick = function(_args) { - fn.apply(null, _args); - base = null; - }; - var debounced, stamp, args; - - /* istanbul ignore next */ - interval = interval || 0; - - debounced = tricks.debounce(tick, interval); - - function throttled() { // eslint-disable-line require-jsdoc - args = aps.call(arguments); - - if (isLeading) { - tick(args); - isLeading = false; - - return; - } - - stamp = tricks.timestamp(); - - base = base || stamp; - - // pass array directly because `debounce()`, `tick()` are already use - // `apply()` method to invoke developer's `fn` handler. - // - // also, this `debounced` line invoked every time for implements - // `trailing` features. - debounced(args); - - if ((stamp - base) >= interval) { - tick(args); - } - } - - function reset() { // eslint-disable-line require-jsdoc - isLeading = true; - base = null; - } - - throttled.reset = reset; - - return throttled; - } - - tricks.timestamp = timestamp; - tricks.debounce = debounce; - tricks.throttle = throttle; - - module.exports = tricks; - - -/***/ }), -/* 9 */ -/***/ (function(module, exports, __nested_webpack_require_46171__) { - - /** - * @fileoverview This module has some functions for handling object as collection. - * @author NHN. - * FE Development Lab - */ - 'use strict'; - - var object = __nested_webpack_require_46171__(1); - var collection = __nested_webpack_require_46171__(4); - var type = __nested_webpack_require_46171__(2); - var ms7days = 7 * 24 * 60 * 60 * 1000; - - /** - * Check if the date has passed 7 days - * @param {number} date - milliseconds - * @returns {boolean} - * @ignore - */ - function isExpired(date) { - var now = new Date().getTime(); - - return now - date > ms7days; - } - - /** - * Send hostname on DOMContentLoaded. - * To prevent hostname set tui.usageStatistics to false. - * @param {string} appName - application name - * @param {string} trackingId - GA tracking ID - * @ignore - */ - function sendHostname(appName, trackingId) { - var url = 'https://www.google-analytics.com/collect'; - var hostname = location.hostname; - var hitType = 'event'; - var eventCategory = 'use'; - var applicationKeyForStorage = 'TOAST UI ' + appName + ' for ' + hostname + ': Statistics'; - var date = window.localStorage.getItem(applicationKeyForStorage); - - // skip if the flag is defined and is set to false explicitly - if (!type.isUndefined(window.tui) && window.tui.usageStatistics === false) { - return; - } - - // skip if not pass seven days old - if (date && !isExpired(date)) { - return; - } - - window.localStorage.setItem(applicationKeyForStorage, new Date().getTime()); - - setTimeout(function() { - if (document.readyState === 'interactive' || document.readyState === 'complete') { - imagePing(url, { - v: 1, - t: hitType, - tid: trackingId, - cid: hostname, - dp: hostname, - dh: appName, - el: appName, - ec: eventCategory - }); - } - }, 1000); - } - - /** - * Request image ping. - * @param {String} url url for ping request - * @param {Object} trackingInfo infos for make query string - * @returns {HTMLElement} - * @memberof tui.util - * @example - * //-- #1. Get Module --// - * var util = require('tui-code-snippet'); // node, commonjs - * var util = tui.util; // distribution file - * - * //-- #2. Use property --// - * util.imagePing('https://www.google-analytics.com/collect', { - * v: 1, - * t: 'event', - * tid: 'trackingid', - * cid: 'cid', - * dp: 'dp', - * dh: 'dh' - * }); - */ - function imagePing(url, trackingInfo) { - var queryString = collection.map(object.keys(trackingInfo), function(key, index) { - var startWith = index === 0 ? '' : '&'; - - return startWith + key + '=' + trackingInfo[key]; - }).join(''); - var trackingElement = document.createElement('img'); - - trackingElement.src = url + '?' + queryString; - - trackingElement.style.display = 'none'; - document.body.appendChild(trackingElement); - document.body.removeChild(trackingElement); - - return trackingElement; - } - - module.exports = { - imagePing: imagePing, - sendHostname: sendHostname - }; - - -/***/ }), -/* 10 */ -/***/ (function(module, exports) { - - /** - * @fileoverview This module detects the kind of well-known browser and version. - * @author NHN. - * FE Development Lab - */ - - 'use strict'; - - /** - * This object has an information that indicate the kind of browser.
    - * The list below is a detectable browser list. - * - ie8 ~ ie11 - * - chrome - * - firefox - * - safari - * - edge - * @memberof tui.util - * @example - * //-- #1. Get Module --// - * var util = require('tui-code-snippet'); // node, commonjs - * var util = tui.util; // distribution file - * - * //-- #2. Use property --// - * util.browser.chrome === true; // chrome - * util.browser.firefox === true; // firefox - * util.browser.safari === true; // safari - * util.browser.msie === true; // IE - * util.browser.edge === true; // edge - * util.browser.others === true; // other browser - * util.browser.version; // browser version - */ - var browser = { - chrome: false, - firefox: false, - safari: false, - msie: false, - edge: false, - others: false, - version: 0 - }; - - if (window && window.navigator) { - detectBrowser(); - } - - /** - * Detect the browser. - * @private - */ - function detectBrowser() { - var nav = window.navigator; - var appName = nav.appName.replace(/\s/g, '_'); - var userAgent = nav.userAgent; - - var rIE = /MSIE\s([0-9]+[.0-9]*)/; - var rIE11 = /Trident.*rv:11\./; - var rEdge = /Edge\/(\d+)\./; - var versionRegex = { - firefox: /Firefox\/(\d+)\./, - chrome: /Chrome\/(\d+)\./, - safari: /Version\/([\d.]+).*Safari\/(\d+)/ - }; - - var key, tmp; - - var detector = { - Microsoft_Internet_Explorer: function() { // eslint-disable-line camelcase - var detectedVersion = userAgent.match(rIE); - - if (detectedVersion) { // ie8 ~ ie10 - browser.msie = true; - browser.version = parseFloat(detectedVersion[1]); - } else { // no version information - browser.others = true; - } - }, - Netscape: function() { // eslint-disable-line complexity - var detected = false; - - if (rIE11.exec(userAgent)) { - browser.msie = true; - browser.version = 11; - detected = true; - } else if (rEdge.exec(userAgent)) { - browser.edge = true; - browser.version = userAgent.match(rEdge)[1]; - detected = true; - } else { - for (key in versionRegex) { - if (versionRegex.hasOwnProperty(key)) { - tmp = userAgent.match(versionRegex[key]); - if (tmp && tmp.length > 1) { // eslint-disable-line max-depth - browser[key] = detected = true; - browser.version = parseFloat(tmp[1] || 0); - break; - } - } - } - } - if (!detected) { - browser.others = true; - } - } - }; - - var fn = detector[appName]; - - if (fn) { - detector[appName](); - } - } - - module.exports = browser; - - -/***/ }), -/* 11 */ -/***/ (function(module, exports, __nested_webpack_require_52691__) { - - /** - * @fileoverview This module has some methods for handling popup-window - * @author NHN. - * FE Development Lab - */ - - 'use strict'; - - var collection = __nested_webpack_require_52691__(4); - var type = __nested_webpack_require_52691__(2); - var func = __nested_webpack_require_52691__(5); - var browser = __nested_webpack_require_52691__(10); - var object = __nested_webpack_require_52691__(1); - - var popupId = 0; - - /** - * Popup management class - * @constructor - * @memberof tui.util - * @example - * // node, commonjs - * var popup = require('tui-code-snippet').popup; - * @example - * // distribution file, script - * - * - * - */ - function CustomEvents() { - /** - * @type {HandlerItem[]} - */ - this.events = null; - - /** - * only for checking specific context event was binded - * @type {object[]} - */ - this.contexts = null; - } - - /** - * Mixin custom events feature to specific constructor - * @param {function} func - constructor - * @example - * //-- #1. Get Module --// - * var CustomEvents = require('tui-code-snippet').CustomEvents; // node, commonjs - * var CustomEvents = tui.util.CustomEvents; // distribution file - * - * //-- #2. Use property --// - * var model; - * function Model() { - * this.name = ''; - * } - * CustomEvents.mixin(Model); - * - * model = new Model(); - * model.on('change', function() { this.name = 'model'; }, this); - * model.fire('change'); - * alert(model.name); // 'model'; - */ - CustomEvents.mixin = function(func) { - object.extend(func.prototype, CustomEvents.prototype); - }; - - /** - * Get HandlerItem object - * @param {function} handler - handler function - * @param {object} [context] - context for handler - * @returns {HandlerItem} HandlerItem object - * @private - */ - CustomEvents.prototype._getHandlerItem = function(handler, context) { - var item = {handler: handler}; - - if (context) { - item.context = context; - } - - return item; - }; - - /** - * Get event object safely - * @param {string} [eventName] - create sub event map if not exist. - * @returns {(object|array)} event object. if you supplied `eventName` - * parameter then make new array and return it - * @private - */ - CustomEvents.prototype._safeEvent = function(eventName) { - var events = this.events; - var byName; - - if (!events) { - events = this.events = {}; - } - - if (eventName) { - byName = events[eventName]; - - if (!byName) { - byName = []; - events[eventName] = byName; - } - - events = byName; - } - - return events; - }; - - /** - * Get context array safely - * @returns {array} context array - * @private - */ - CustomEvents.prototype._safeContext = function() { - var context = this.contexts; - - if (!context) { - context = this.contexts = []; - } - - return context; - }; - - /** - * Get index of context - * @param {object} ctx - context that used for bind custom event - * @returns {number} index of context - * @private - */ - CustomEvents.prototype._indexOfContext = function(ctx) { - var context = this._safeContext(); - var index = 0; - - while (context[index]) { - if (ctx === context[index][0]) { - return index; - } - - index += 1; - } - - return -1; - }; - - /** - * Memorize supplied context for recognize supplied object is context or - * name: handler pair object when off() - * @param {object} ctx - context object to memorize - * @private - */ - CustomEvents.prototype._memorizeContext = function(ctx) { - var context, index; - - if (!type.isExisty(ctx)) { - return; - } - - context = this._safeContext(); - index = this._indexOfContext(ctx); - - if (index > -1) { - context[index][1] += 1; - } else { - context.push([ctx, 1]); - } - }; - - /** - * Forget supplied context object - * @param {object} ctx - context object to forget - * @private - */ - CustomEvents.prototype._forgetContext = function(ctx) { - var context, contextIndex; - - if (!type.isExisty(ctx)) { - return; - } - - context = this._safeContext(); - contextIndex = this._indexOfContext(ctx); - - if (contextIndex > -1) { - context[contextIndex][1] -= 1; - - if (context[contextIndex][1] <= 0) { - context.splice(contextIndex, 1); - } - } - }; - - /** - * Bind event handler - * @param {(string|{name:string, handler:function})} eventName - custom - * event name or an object {eventName: handler} - * @param {(function|object)} [handler] - handler function or context - * @param {object} [context] - context for binding - * @private - */ - CustomEvents.prototype._bindEvent = function(eventName, handler, context) { - var events = this._safeEvent(eventName); - this._memorizeContext(context); - events.push(this._getHandlerItem(handler, context)); - }; - - /** - * Bind event handlers - * @param {(string|{name:string, handler:function})} eventName - custom - * event name or an object {eventName: handler} - * @param {(function|object)} [handler] - handler function or context - * @param {object} [context] - context for binding - * //-- #1. Get Module --// - * var CustomEvents = require('tui-code-snippet').CustomEvents; // node, commonjs - * var CustomEvents = tui.util.CustomEvents; // distribution file - * - * //-- #2. Use property --// - * // # 2.1 Basic Usage - * CustomEvents.on('onload', handler); - * - * // # 2.2 With context - * CustomEvents.on('onload', handler, myObj); - * - * // # 2.3 Bind by object that name, handler pairs - * CustomEvents.on({ - * 'play': handler, - * 'pause': handler2 - * }); - * - * // # 2.4 Bind by object that name, handler pairs with context object - * CustomEvents.on({ - * 'play': handler - * }, myObj); - */ - CustomEvents.prototype.on = function(eventName, handler, context) { - var self = this; - - if (type.isString(eventName)) { - // [syntax 1, 2] - eventName = eventName.split(R_EVENTNAME_SPLIT); - collection.forEach(eventName, function(name) { - self._bindEvent(name, handler, context); - }); - } else if (type.isObject(eventName)) { - // [syntax 3, 4] - context = handler; - collection.forEach(eventName, function(func, name) { - self.on(name, func, context); - }); - } - }; - - /** - * Bind one-shot event handlers - * @param {(string|{name:string,handler:function})} eventName - custom - * event name or an object {eventName: handler} - * @param {function|object} [handler] - handler function or context - * @param {object} [context] - context for binding - */ - CustomEvents.prototype.once = function(eventName, handler, context) { - var self = this; - - if (type.isObject(eventName)) { - context = handler; - collection.forEach(eventName, function(func, name) { - self.once(name, func, context); - }); - - return; - } - - function onceHandler() { // eslint-disable-line require-jsdoc - handler.apply(context, arguments); - self.off(eventName, onceHandler, context); - } - - this.on(eventName, onceHandler, context); - }; - - /** - * Splice supplied array by callback result - * @param {array} arr - array to splice - * @param {function} predicate - function return boolean - * @private - */ - CustomEvents.prototype._spliceMatches = function(arr, predicate) { - var i = 0; - var len; - - if (!type.isArray(arr)) { - return; - } - - for (len = arr.length; i < len; i += 1) { - if (predicate(arr[i]) === true) { - arr.splice(i, 1); - len -= 1; - i -= 1; - } - } - }; - - /** - * Get matcher for unbind specific handler events - * @param {function} handler - handler function - * @returns {function} handler matcher - * @private - */ - CustomEvents.prototype._matchHandler = function(handler) { - var self = this; - - return function(item) { - var needRemove = handler === item.handler; - - if (needRemove) { - self._forgetContext(item.context); - } - - return needRemove; - }; - }; - - /** - * Get matcher for unbind specific context events - * @param {object} context - context - * @returns {function} object matcher - * @private - */ - CustomEvents.prototype._matchContext = function(context) { - var self = this; - - return function(item) { - var needRemove = context === item.context; - - if (needRemove) { - self._forgetContext(item.context); - } - - return needRemove; - }; - }; - - /** - * Get matcher for unbind specific hander, context pair events - * @param {function} handler - handler function - * @param {object} context - context - * @returns {function} handler, context matcher - * @private - */ - CustomEvents.prototype._matchHandlerAndContext = function(handler, context) { - var self = this; - - return function(item) { - var matchHandler = (handler === item.handler); - var matchContext = (context === item.context); - var needRemove = (matchHandler && matchContext); - - if (needRemove) { - self._forgetContext(item.context); - } - - return needRemove; - }; - }; - - /** - * Unbind event by event name - * @param {string} eventName - custom event name to unbind - * @param {function} [handler] - handler function - * @private - */ - CustomEvents.prototype._offByEventName = function(eventName, handler) { - var self = this; - var forEach = collection.forEachArray; - var andByHandler = type.isFunction(handler); - var matchHandler = self._matchHandler(handler); - - eventName = eventName.split(R_EVENTNAME_SPLIT); - - forEach(eventName, function(name) { - var handlerItems = self._safeEvent(name); - - if (andByHandler) { - self._spliceMatches(handlerItems, matchHandler); - } else { - forEach(handlerItems, function(item) { - self._forgetContext(item.context); - }); - - self.events[name] = []; - } - }); - }; - - /** - * Unbind event by handler function - * @param {function} handler - handler function - * @private - */ - CustomEvents.prototype._offByHandler = function(handler) { - var self = this; - var matchHandler = this._matchHandler(handler); - - collection.forEach(this._safeEvent(), function(handlerItems) { - self._spliceMatches(handlerItems, matchHandler); - }); - }; - - /** - * Unbind event by object(name: handler pair object or context object) - * @param {object} obj - context or {name: handler} pair object - * @param {function} handler - handler function - * @private - */ - CustomEvents.prototype._offByObject = function(obj, handler) { - var self = this; - var matchFunc; - - if (this._indexOfContext(obj) < 0) { - collection.forEach(obj, function(func, name) { - self.off(name, func); - }); - } else if (type.isString(handler)) { - matchFunc = this._matchContext(obj); - - self._spliceMatches(this._safeEvent(handler), matchFunc); - } else if (type.isFunction(handler)) { - matchFunc = this._matchHandlerAndContext(handler, obj); - - collection.forEach(this._safeEvent(), function(handlerItems) { - self._spliceMatches(handlerItems, matchFunc); - }); - } else { - matchFunc = this._matchContext(obj); - - collection.forEach(this._safeEvent(), function(handlerItems) { - self._spliceMatches(handlerItems, matchFunc); - }); - } - }; - - /** - * Unbind custom events - * @param {(string|object|function)} eventName - event name or context or - * {name: handler} pair object or handler function - * @param {(function)} handler - handler function - * @example - * //-- #1. Get Module --// - * var CustomEvents = require('tui-code-snippet').CustomEvents; // node, commonjs - * var CustomEvents = tui.util.CustomEvents; // distribution file - * - * //-- #2. Use property --// - * // # 2.1 off by event name - * CustomEvents.off('onload'); - * - * // # 2.2 off by event name and handler - * CustomEvents.off('play', handler); - * - * // # 2.3 off by handler - * CustomEvents.off(handler); - * - * // # 2.4 off by context - * CustomEvents.off(myObj); - * - * // # 2.5 off by context and handler - * CustomEvents.off(myObj, handler); - * - * // # 2.6 off by context and event name - * CustomEvents.off(myObj, 'onload'); - * - * // # 2.7 off by an Object. that is {eventName: handler} - * CustomEvents.off({ - * 'play': handler, - * 'pause': handler2 - * }); - * - * // # 2.8 off the all events - * CustomEvents.off(); - */ - CustomEvents.prototype.off = function(eventName, handler) { - if (type.isString(eventName)) { - // [syntax 1, 2] - this._offByEventName(eventName, handler); - } else if (!arguments.length) { - // [syntax 8] - this.events = {}; - this.contexts = []; - } else if (type.isFunction(eventName)) { - // [syntax 3] - this._offByHandler(eventName); - } else if (type.isObject(eventName)) { - // [syntax 4, 5, 6] - this._offByObject(eventName, handler); - } - }; - - /** - * Fire custom event - * @param {string} eventName - name of custom event - */ - CustomEvents.prototype.fire = function(eventName) { // eslint-disable-line - this.invoke.apply(this, arguments); - }; - - /** - * Fire a event and returns the result of operation 'boolean AND' with all - * listener's results. - * - * So, It is different from {@link CustomEvents#fire}. - * - * In service code, use this as a before event in component level usually - * for notifying that the event is cancelable. - * @param {string} eventName - Custom event name - * @param {...*} data - Data for event - * @returns {boolean} The result of operation 'boolean AND' - * @example - * var map = new Map(); - * map.on({ - * 'beforeZoom': function() { - * // It should cancel the 'zoom' event by some conditions. - * if (that.disabled && this.getState()) { - * return false; - * } - * return true; - * } - * }); - * - * if (this.invoke('beforeZoom')) { // check the result of 'beforeZoom' - * // if true, - * // doSomething - * } - */ - CustomEvents.prototype.invoke = function(eventName) { - var events, args, index, item; - - if (!this.hasListener(eventName)) { - return true; - } - - events = this._safeEvent(eventName); - args = Array.prototype.slice.call(arguments, 1); - index = 0; - - while (events[index]) { - item = events[index]; - - if (item.handler.apply(item.context, args) === false) { - return false; - } - - index += 1; - } - - return true; - }; - - /** - * Return whether at least one of the handlers is registered in the given - * event name. - * @param {string} eventName - Custom event name - * @returns {boolean} Is there at least one handler in event name? - */ - CustomEvents.prototype.hasListener = function(eventName) { - return this.getListenerLength(eventName) > 0; - }; - - /** - * Return a count of events registered. - * @param {string} eventName - Custom event name - * @returns {number} number of event - */ - CustomEvents.prototype.getListenerLength = function(eventName) { - var events = this._safeEvent(eventName); - - return events.length; - }; - - module.exports = CustomEvents; - - -/***/ }), -/* 17 */ -/***/ (function(module, exports, __nested_webpack_require_90552__) { - - /** - * @fileoverview This module provides a Enum Constructor. - * @author NHN. - * FE Development Lab - * @example - * // node, commonjs - * var Enum = require('tui-code-snippet').Enum; - * @example - * // distribution file, script - * - * - * - * - * \n\t *
    \";\n\t * var result = util.encodeHTMLEntity(htmlEntityString);\n\t * //\"<script> alert('test');</script><a href='test'>\"\n\t */\n\tfunction encodeHTMLEntity(html) {\n\t var entities = {\n\t '\"': 'quot',\n\t '&': 'amp',\n\t '<': 'lt',\n\t '>': 'gt',\n\t '\\'': '#39'\n\t };\n\n\t return html.replace(/[<>&\"']/g, function(m0) {\n\t return entities[m0] ? '&' + entities[m0] + ';' : m0;\n\t });\n\t}\n\n\t/**\n\t * Return whether the string capable to transform into plain string is in the given string or not.\n\t * @param {String} string - test string\n\t * @memberof tui.util\n\t * @returns {boolean}\n\t */\n\tfunction hasEncodableString(string) {\n\t return (/[<>&\"']/).test(string);\n\t}\n\n\t/**\n\t * Return duplicate charters\n\t * @param {string} operandStr1 The operand string\n\t * @param {string} operandStr2 The operand string\n\t * @private\n\t * @memberof tui.util\n\t * @returns {string}\n\t * @example\n\t * //-- #1. Get Module --//\n\t * var util = require('tui-code-snippet'); // node, commonjs\n\t * var util = tui.util; // distribution file\n\t *\n\t * //-- #2. Use property --//\n\t * util.getDuplicatedChar('fe dev', 'nhn entertainment'); // 'e'\n\t * util.getDuplicatedChar('fdsa', 'asdf'); // 'asdf'\n\t */\n\tfunction getDuplicatedChar(operandStr1, operandStr2) {\n\t var i = 0;\n\t var len = operandStr1.length;\n\t var pool = {};\n\t var dupl, key;\n\n\t for (; i < len; i += 1) {\n\t key = operandStr1.charAt(i);\n\t pool[key] = 1;\n\t }\n\n\t for (i = 0, len = operandStr2.length; i < len; i += 1) {\n\t key = operandStr2.charAt(i);\n\t if (pool[key]) {\n\t pool[key] += 1;\n\t }\n\t }\n\n\t pool = collection.filter(pool, function(item) {\n\t return item > 1;\n\t });\n\n\t pool = object.keys(pool).sort();\n\t dupl = pool.join('');\n\n\t return dupl;\n\t}\n\n\tmodule.exports = {\n\t decodeHTMLEntity: decodeHTMLEntity,\n\t encodeHTMLEntity: encodeHTMLEntity,\n\t hasEncodableString: hasEncodableString,\n\t getDuplicatedChar: getDuplicatedChar\n\t};\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports) {\n\n\t/**\n\t * @fileoverview collections of some technic methods.\n\t * @author NHN.\n\t * FE Development Lab \n\t */\n\n\t'use strict';\n\n\tvar tricks = {};\n\tvar aps = Array.prototype.slice;\n\n\t/**\n\t * Creates a debounced function that delays invoking fn until after delay milliseconds has elapsed\n\t * since the last time the debouced function was invoked.\n\t * @param {function} fn The function to debounce.\n\t * @param {number} [delay=0] The number of milliseconds to delay\n\t * @memberof tui.util\n\t * @returns {function} debounced function.\n\t * @example\n\t * //-- #1. Get Module --//\n\t * var util = require('tui-code-snippet'); // node, commonjs\n\t * var util = tui.util; // distribution file\n\t *\n\t * //-- #2. Use property --//\n\t * function someMethodToInvokeDebounced() {}\n\t *\n\t * var debounced = util.debounce(someMethodToInvokeDebounced, 300);\n\t *\n\t * // invoke repeatedly\n\t * debounced();\n\t * debounced();\n\t * debounced();\n\t * debounced();\n\t * debounced();\n\t * debounced(); // last invoke of debounced()\n\t *\n\t * // invoke someMethodToInvokeDebounced() after 300 milliseconds.\n\t */\n\tfunction debounce(fn, delay) {\n\t var timer, args;\n\n\t /* istanbul ignore next */\n\t delay = delay || 0;\n\n\t function debounced() { // eslint-disable-line require-jsdoc\n\t args = aps.call(arguments);\n\n\t window.clearTimeout(timer);\n\t timer = window.setTimeout(function() {\n\t fn.apply(null, args);\n\t }, delay);\n\t }\n\n\t return debounced;\n\t}\n\n\t/**\n\t * return timestamp\n\t * @memberof tui.util\n\t * @returns {number} The number of milliseconds from Jan. 1970 00:00:00 (GMT)\n\t */\n\tfunction timestamp() {\n\t return Number(new Date());\n\t}\n\n\t/**\n\t * Creates a throttled function that only invokes fn at most once per every interval milliseconds.\n\t *\n\t * You can use this throttle short time repeatedly invoking functions. (e.g MouseMove, Resize ...)\n\t *\n\t * if you need reuse throttled method. you must remove slugs (e.g. flag variable) related with throttling.\n\t * @param {function} fn function to throttle\n\t * @param {number} [interval=0] the number of milliseconds to throttle invocations to.\n\t * @memberof tui.util\n\t * @returns {function} throttled function\n\t * @example\n\t * //-- #1. Get Module --//\n\t * var util = require('tui-code-snippet'); // node, commonjs\n\t * var util = tui.util; // distribution file\n\t *\n\t * //-- #2. Use property --//\n\t * function someMethodToInvokeThrottled() {}\n\t *\n\t * var throttled = util.throttle(someMethodToInvokeThrottled, 300);\n\t *\n\t * // invoke repeatedly\n\t * throttled(); // invoke (leading)\n\t * throttled();\n\t * throttled(); // invoke (near 300 milliseconds)\n\t * throttled();\n\t * throttled();\n\t * throttled(); // invoke (near 600 milliseconds)\n\t * // ...\n\t * // invoke (trailing)\n\t *\n\t * // if you need reuse throttled method. then invoke reset()\n\t * throttled.reset();\n\t */\n\tfunction throttle(fn, interval) {\n\t var base;\n\t var isLeading = true;\n\t var tick = function(_args) {\n\t fn.apply(null, _args);\n\t base = null;\n\t };\n\t var debounced, stamp, args;\n\n\t /* istanbul ignore next */\n\t interval = interval || 0;\n\n\t debounced = tricks.debounce(tick, interval);\n\n\t function throttled() { // eslint-disable-line require-jsdoc\n\t args = aps.call(arguments);\n\n\t if (isLeading) {\n\t tick(args);\n\t isLeading = false;\n\n\t return;\n\t }\n\n\t stamp = tricks.timestamp();\n\n\t base = base || stamp;\n\n\t // pass array directly because `debounce()`, `tick()` are already use\n\t // `apply()` method to invoke developer's `fn` handler.\n\t //\n\t // also, this `debounced` line invoked every time for implements\n\t // `trailing` features.\n\t debounced(args);\n\n\t if ((stamp - base) >= interval) {\n\t tick(args);\n\t }\n\t }\n\n\t function reset() { // eslint-disable-line require-jsdoc\n\t isLeading = true;\n\t base = null;\n\t }\n\n\t throttled.reset = reset;\n\n\t return throttled;\n\t}\n\n\ttricks.timestamp = timestamp;\n\ttricks.debounce = debounce;\n\ttricks.throttle = throttle;\n\n\tmodule.exports = tricks;\n\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/**\n\t * @fileoverview This module has some functions for handling object as collection.\n\t * @author NHN.\n\t * FE Development Lab \n\t */\n\t'use strict';\n\n\tvar object = __webpack_require__(1);\n\tvar collection = __webpack_require__(4);\n\tvar type = __webpack_require__(2);\n\tvar ms7days = 7 * 24 * 60 * 60 * 1000;\n\n\t/**\n\t * Check if the date has passed 7 days\n\t * @param {number} date - milliseconds\n\t * @returns {boolean}\n\t * @ignore\n\t */\n\tfunction isExpired(date) {\n\t var now = new Date().getTime();\n\n\t return now - date > ms7days;\n\t}\n\n\t/**\n\t * Send hostname on DOMContentLoaded.\n\t * To prevent hostname set tui.usageStatistics to false.\n\t * @param {string} appName - application name\n\t * @param {string} trackingId - GA tracking ID\n\t * @ignore\n\t */\n\tfunction sendHostname(appName, trackingId) {\n\t var url = 'https://www.google-analytics.com/collect';\n\t var hostname = location.hostname;\n\t var hitType = 'event';\n\t var eventCategory = 'use';\n\t var applicationKeyForStorage = 'TOAST UI ' + appName + ' for ' + hostname + ': Statistics';\n\t var date = window.localStorage.getItem(applicationKeyForStorage);\n\n\t // skip if the flag is defined and is set to false explicitly\n\t if (!type.isUndefined(window.tui) && window.tui.usageStatistics === false) {\n\t return;\n\t }\n\n\t // skip if not pass seven days old\n\t if (date && !isExpired(date)) {\n\t return;\n\t }\n\n\t window.localStorage.setItem(applicationKeyForStorage, new Date().getTime());\n\n\t setTimeout(function() {\n\t if (document.readyState === 'interactive' || document.readyState === 'complete') {\n\t imagePing(url, {\n\t v: 1,\n\t t: hitType,\n\t tid: trackingId,\n\t cid: hostname,\n\t dp: hostname,\n\t dh: appName,\n\t el: appName,\n\t ec: eventCategory\n\t });\n\t }\n\t }, 1000);\n\t}\n\n\t/**\n\t * Request image ping.\n\t * @param {String} url url for ping request\n\t * @param {Object} trackingInfo infos for make query string\n\t * @returns {HTMLElement}\n\t * @memberof tui.util\n\t * @example\n\t * //-- #1. Get Module --//\n\t * var util = require('tui-code-snippet'); // node, commonjs\n\t * var util = tui.util; // distribution file\n\t *\n\t * //-- #2. Use property --//\n\t * util.imagePing('https://www.google-analytics.com/collect', {\n\t * v: 1,\n\t * t: 'event',\n\t * tid: 'trackingid',\n\t * cid: 'cid',\n\t * dp: 'dp',\n\t * dh: 'dh'\n\t * });\n\t */\n\tfunction imagePing(url, trackingInfo) {\n\t var queryString = collection.map(object.keys(trackingInfo), function(key, index) {\n\t var startWith = index === 0 ? '' : '&';\n\n\t return startWith + key + '=' + trackingInfo[key];\n\t }).join('');\n\t var trackingElement = document.createElement('img');\n\n\t trackingElement.src = url + '?' + queryString;\n\n\t trackingElement.style.display = 'none';\n\t document.body.appendChild(trackingElement);\n\t document.body.removeChild(trackingElement);\n\n\t return trackingElement;\n\t}\n\n\tmodule.exports = {\n\t imagePing: imagePing,\n\t sendHostname: sendHostname\n\t};\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports) {\n\n\t/**\n\t * @fileoverview This module detects the kind of well-known browser and version.\n\t * @author NHN.\n\t * FE Development Lab \n\t */\n\n\t'use strict';\n\n\t/**\n\t * This object has an information that indicate the kind of browser.
    \n\t * The list below is a detectable browser list.\n\t * - ie8 ~ ie11\n\t * - chrome\n\t * - firefox\n\t * - safari\n\t * - edge\n\t * @memberof tui.util\n\t * @example\n\t * //-- #1. Get Module --//\n\t * var util = require('tui-code-snippet'); // node, commonjs\n\t * var util = tui.util; // distribution file\n\t *\n\t * //-- #2. Use property --//\n\t * util.browser.chrome === true; // chrome\n\t * util.browser.firefox === true; // firefox\n\t * util.browser.safari === true; // safari\n\t * util.browser.msie === true; // IE\n\t * util.browser.edge === true; // edge\n\t * util.browser.others === true; // other browser\n\t * util.browser.version; // browser version\n\t */\n\tvar browser = {\n\t chrome: false,\n\t firefox: false,\n\t safari: false,\n\t msie: false,\n\t edge: false,\n\t others: false,\n\t version: 0\n\t};\n\n\tif (window && window.navigator) {\n\t detectBrowser();\n\t}\n\n\t/**\n\t * Detect the browser.\n\t * @private\n\t */\n\tfunction detectBrowser() {\n\t var nav = window.navigator;\n\t var appName = nav.appName.replace(/\\s/g, '_');\n\t var userAgent = nav.userAgent;\n\n\t var rIE = /MSIE\\s([0-9]+[.0-9]*)/;\n\t var rIE11 = /Trident.*rv:11\\./;\n\t var rEdge = /Edge\\/(\\d+)\\./;\n\t var versionRegex = {\n\t firefox: /Firefox\\/(\\d+)\\./,\n\t chrome: /Chrome\\/(\\d+)\\./,\n\t safari: /Version\\/([\\d.]+).*Safari\\/(\\d+)/\n\t };\n\n\t var key, tmp;\n\n\t var detector = {\n\t Microsoft_Internet_Explorer: function() { // eslint-disable-line camelcase\n\t var detectedVersion = userAgent.match(rIE);\n\n\t if (detectedVersion) { // ie8 ~ ie10\n\t browser.msie = true;\n\t browser.version = parseFloat(detectedVersion[1]);\n\t } else { // no version information\n\t browser.others = true;\n\t }\n\t },\n\t Netscape: function() { // eslint-disable-line complexity\n\t var detected = false;\n\n\t if (rIE11.exec(userAgent)) {\n\t browser.msie = true;\n\t browser.version = 11;\n\t detected = true;\n\t } else if (rEdge.exec(userAgent)) {\n\t browser.edge = true;\n\t browser.version = userAgent.match(rEdge)[1];\n\t detected = true;\n\t } else {\n\t for (key in versionRegex) {\n\t if (versionRegex.hasOwnProperty(key)) {\n\t tmp = userAgent.match(versionRegex[key]);\n\t if (tmp && tmp.length > 1) { // eslint-disable-line max-depth\n\t browser[key] = detected = true;\n\t browser.version = parseFloat(tmp[1] || 0);\n\t break;\n\t }\n\t }\n\t }\n\t }\n\t if (!detected) {\n\t browser.others = true;\n\t }\n\t }\n\t };\n\n\t var fn = detector[appName];\n\n\t if (fn) {\n\t detector[appName]();\n\t }\n\t}\n\n\tmodule.exports = browser;\n\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/**\n\t * @fileoverview This module has some methods for handling popup-window\n\t * @author NHN.\n\t * FE Development Lab \n\t */\n\n\t'use strict';\n\n\tvar collection = __webpack_require__(4);\n\tvar type = __webpack_require__(2);\n\tvar func = __webpack_require__(5);\n\tvar browser = __webpack_require__(10);\n\tvar object = __webpack_require__(1);\n\n\tvar popupId = 0;\n\n\t/**\n\t * Popup management class\n\t * @constructor\n\t * @memberof tui.util\n\t * @example\n\t * // node, commonjs\n\t * var popup = require('tui-code-snippet').popup;\n\t * @example\n\t * // distribution file, script\n\t * \n\t * \n\t * \n\t */\n\tfunction CustomEvents() {\n\t /**\n\t * @type {HandlerItem[]}\n\t */\n\t this.events = null;\n\n\t /**\n\t * only for checking specific context event was binded\n\t * @type {object[]}\n\t */\n\t this.contexts = null;\n\t}\n\n\t/**\n\t * Mixin custom events feature to specific constructor\n\t * @param {function} func - constructor\n\t * @example\n\t * //-- #1. Get Module --//\n\t * var CustomEvents = require('tui-code-snippet').CustomEvents; // node, commonjs\n\t * var CustomEvents = tui.util.CustomEvents; // distribution file\n\t *\n\t * //-- #2. Use property --//\n\t * var model;\n\t * function Model() {\n\t * this.name = '';\n\t * }\n\t * CustomEvents.mixin(Model);\n\t *\n\t * model = new Model();\n\t * model.on('change', function() { this.name = 'model'; }, this);\n\t * model.fire('change');\n\t * alert(model.name); // 'model';\n\t */\n\tCustomEvents.mixin = function(func) {\n\t object.extend(func.prototype, CustomEvents.prototype);\n\t};\n\n\t/**\n\t * Get HandlerItem object\n\t * @param {function} handler - handler function\n\t * @param {object} [context] - context for handler\n\t * @returns {HandlerItem} HandlerItem object\n\t * @private\n\t */\n\tCustomEvents.prototype._getHandlerItem = function(handler, context) {\n\t var item = {handler: handler};\n\n\t if (context) {\n\t item.context = context;\n\t }\n\n\t return item;\n\t};\n\n\t/**\n\t * Get event object safely\n\t * @param {string} [eventName] - create sub event map if not exist.\n\t * @returns {(object|array)} event object. if you supplied `eventName`\n\t * parameter then make new array and return it\n\t * @private\n\t */\n\tCustomEvents.prototype._safeEvent = function(eventName) {\n\t var events = this.events;\n\t var byName;\n\n\t if (!events) {\n\t events = this.events = {};\n\t }\n\n\t if (eventName) {\n\t byName = events[eventName];\n\n\t if (!byName) {\n\t byName = [];\n\t events[eventName] = byName;\n\t }\n\n\t events = byName;\n\t }\n\n\t return events;\n\t};\n\n\t/**\n\t * Get context array safely\n\t * @returns {array} context array\n\t * @private\n\t */\n\tCustomEvents.prototype._safeContext = function() {\n\t var context = this.contexts;\n\n\t if (!context) {\n\t context = this.contexts = [];\n\t }\n\n\t return context;\n\t};\n\n\t/**\n\t * Get index of context\n\t * @param {object} ctx - context that used for bind custom event\n\t * @returns {number} index of context\n\t * @private\n\t */\n\tCustomEvents.prototype._indexOfContext = function(ctx) {\n\t var context = this._safeContext();\n\t var index = 0;\n\n\t while (context[index]) {\n\t if (ctx === context[index][0]) {\n\t return index;\n\t }\n\n\t index += 1;\n\t }\n\n\t return -1;\n\t};\n\n\t/**\n\t * Memorize supplied context for recognize supplied object is context or\n\t * name: handler pair object when off()\n\t * @param {object} ctx - context object to memorize\n\t * @private\n\t */\n\tCustomEvents.prototype._memorizeContext = function(ctx) {\n\t var context, index;\n\n\t if (!type.isExisty(ctx)) {\n\t return;\n\t }\n\n\t context = this._safeContext();\n\t index = this._indexOfContext(ctx);\n\n\t if (index > -1) {\n\t context[index][1] += 1;\n\t } else {\n\t context.push([ctx, 1]);\n\t }\n\t};\n\n\t/**\n\t * Forget supplied context object\n\t * @param {object} ctx - context object to forget\n\t * @private\n\t */\n\tCustomEvents.prototype._forgetContext = function(ctx) {\n\t var context, contextIndex;\n\n\t if (!type.isExisty(ctx)) {\n\t return;\n\t }\n\n\t context = this._safeContext();\n\t contextIndex = this._indexOfContext(ctx);\n\n\t if (contextIndex > -1) {\n\t context[contextIndex][1] -= 1;\n\n\t if (context[contextIndex][1] <= 0) {\n\t context.splice(contextIndex, 1);\n\t }\n\t }\n\t};\n\n\t/**\n\t * Bind event handler\n\t * @param {(string|{name:string, handler:function})} eventName - custom\n\t * event name or an object {eventName: handler}\n\t * @param {(function|object)} [handler] - handler function or context\n\t * @param {object} [context] - context for binding\n\t * @private\n\t */\n\tCustomEvents.prototype._bindEvent = function(eventName, handler, context) {\n\t var events = this._safeEvent(eventName);\n\t this._memorizeContext(context);\n\t events.push(this._getHandlerItem(handler, context));\n\t};\n\n\t/**\n\t * Bind event handlers\n\t * @param {(string|{name:string, handler:function})} eventName - custom\n\t * event name or an object {eventName: handler}\n\t * @param {(function|object)} [handler] - handler function or context\n\t * @param {object} [context] - context for binding\n\t * //-- #1. Get Module --//\n\t * var CustomEvents = require('tui-code-snippet').CustomEvents; // node, commonjs\n\t * var CustomEvents = tui.util.CustomEvents; // distribution file\n\t *\n\t * //-- #2. Use property --//\n\t * // # 2.1 Basic Usage\n\t * CustomEvents.on('onload', handler);\n\t *\n\t * // # 2.2 With context\n\t * CustomEvents.on('onload', handler, myObj);\n\t *\n\t * // # 2.3 Bind by object that name, handler pairs\n\t * CustomEvents.on({\n\t * 'play': handler,\n\t * 'pause': handler2\n\t * });\n\t *\n\t * // # 2.4 Bind by object that name, handler pairs with context object\n\t * CustomEvents.on({\n\t * 'play': handler\n\t * }, myObj);\n\t */\n\tCustomEvents.prototype.on = function(eventName, handler, context) {\n\t var self = this;\n\n\t if (type.isString(eventName)) {\n\t // [syntax 1, 2]\n\t eventName = eventName.split(R_EVENTNAME_SPLIT);\n\t collection.forEach(eventName, function(name) {\n\t self._bindEvent(name, handler, context);\n\t });\n\t } else if (type.isObject(eventName)) {\n\t // [syntax 3, 4]\n\t context = handler;\n\t collection.forEach(eventName, function(func, name) {\n\t self.on(name, func, context);\n\t });\n\t }\n\t};\n\n\t/**\n\t * Bind one-shot event handlers\n\t * @param {(string|{name:string,handler:function})} eventName - custom\n\t * event name or an object {eventName: handler}\n\t * @param {function|object} [handler] - handler function or context\n\t * @param {object} [context] - context for binding\n\t */\n\tCustomEvents.prototype.once = function(eventName, handler, context) {\n\t var self = this;\n\n\t if (type.isObject(eventName)) {\n\t context = handler;\n\t collection.forEach(eventName, function(func, name) {\n\t self.once(name, func, context);\n\t });\n\n\t return;\n\t }\n\n\t function onceHandler() { // eslint-disable-line require-jsdoc\n\t handler.apply(context, arguments);\n\t self.off(eventName, onceHandler, context);\n\t }\n\n\t this.on(eventName, onceHandler, context);\n\t};\n\n\t/**\n\t * Splice supplied array by callback result\n\t * @param {array} arr - array to splice\n\t * @param {function} predicate - function return boolean\n\t * @private\n\t */\n\tCustomEvents.prototype._spliceMatches = function(arr, predicate) {\n\t var i = 0;\n\t var len;\n\n\t if (!type.isArray(arr)) {\n\t return;\n\t }\n\n\t for (len = arr.length; i < len; i += 1) {\n\t if (predicate(arr[i]) === true) {\n\t arr.splice(i, 1);\n\t len -= 1;\n\t i -= 1;\n\t }\n\t }\n\t};\n\n\t/**\n\t * Get matcher for unbind specific handler events\n\t * @param {function} handler - handler function\n\t * @returns {function} handler matcher\n\t * @private\n\t */\n\tCustomEvents.prototype._matchHandler = function(handler) {\n\t var self = this;\n\n\t return function(item) {\n\t var needRemove = handler === item.handler;\n\n\t if (needRemove) {\n\t self._forgetContext(item.context);\n\t }\n\n\t return needRemove;\n\t };\n\t};\n\n\t/**\n\t * Get matcher for unbind specific context events\n\t * @param {object} context - context\n\t * @returns {function} object matcher\n\t * @private\n\t */\n\tCustomEvents.prototype._matchContext = function(context) {\n\t var self = this;\n\n\t return function(item) {\n\t var needRemove = context === item.context;\n\n\t if (needRemove) {\n\t self._forgetContext(item.context);\n\t }\n\n\t return needRemove;\n\t };\n\t};\n\n\t/**\n\t * Get matcher for unbind specific hander, context pair events\n\t * @param {function} handler - handler function\n\t * @param {object} context - context\n\t * @returns {function} handler, context matcher\n\t * @private\n\t */\n\tCustomEvents.prototype._matchHandlerAndContext = function(handler, context) {\n\t var self = this;\n\n\t return function(item) {\n\t var matchHandler = (handler === item.handler);\n\t var matchContext = (context === item.context);\n\t var needRemove = (matchHandler && matchContext);\n\n\t if (needRemove) {\n\t self._forgetContext(item.context);\n\t }\n\n\t return needRemove;\n\t };\n\t};\n\n\t/**\n\t * Unbind event by event name\n\t * @param {string} eventName - custom event name to unbind\n\t * @param {function} [handler] - handler function\n\t * @private\n\t */\n\tCustomEvents.prototype._offByEventName = function(eventName, handler) {\n\t var self = this;\n\t var forEach = collection.forEachArray;\n\t var andByHandler = type.isFunction(handler);\n\t var matchHandler = self._matchHandler(handler);\n\n\t eventName = eventName.split(R_EVENTNAME_SPLIT);\n\n\t forEach(eventName, function(name) {\n\t var handlerItems = self._safeEvent(name);\n\n\t if (andByHandler) {\n\t self._spliceMatches(handlerItems, matchHandler);\n\t } else {\n\t forEach(handlerItems, function(item) {\n\t self._forgetContext(item.context);\n\t });\n\n\t self.events[name] = [];\n\t }\n\t });\n\t};\n\n\t/**\n\t * Unbind event by handler function\n\t * @param {function} handler - handler function\n\t * @private\n\t */\n\tCustomEvents.prototype._offByHandler = function(handler) {\n\t var self = this;\n\t var matchHandler = this._matchHandler(handler);\n\n\t collection.forEach(this._safeEvent(), function(handlerItems) {\n\t self._spliceMatches(handlerItems, matchHandler);\n\t });\n\t};\n\n\t/**\n\t * Unbind event by object(name: handler pair object or context object)\n\t * @param {object} obj - context or {name: handler} pair object\n\t * @param {function} handler - handler function\n\t * @private\n\t */\n\tCustomEvents.prototype._offByObject = function(obj, handler) {\n\t var self = this;\n\t var matchFunc;\n\n\t if (this._indexOfContext(obj) < 0) {\n\t collection.forEach(obj, function(func, name) {\n\t self.off(name, func);\n\t });\n\t } else if (type.isString(handler)) {\n\t matchFunc = this._matchContext(obj);\n\n\t self._spliceMatches(this._safeEvent(handler), matchFunc);\n\t } else if (type.isFunction(handler)) {\n\t matchFunc = this._matchHandlerAndContext(handler, obj);\n\n\t collection.forEach(this._safeEvent(), function(handlerItems) {\n\t self._spliceMatches(handlerItems, matchFunc);\n\t });\n\t } else {\n\t matchFunc = this._matchContext(obj);\n\n\t collection.forEach(this._safeEvent(), function(handlerItems) {\n\t self._spliceMatches(handlerItems, matchFunc);\n\t });\n\t }\n\t};\n\n\t/**\n\t * Unbind custom events\n\t * @param {(string|object|function)} eventName - event name or context or\n\t * {name: handler} pair object or handler function\n\t * @param {(function)} handler - handler function\n\t * @example\n\t * //-- #1. Get Module --//\n\t * var CustomEvents = require('tui-code-snippet').CustomEvents; // node, commonjs\n\t * var CustomEvents = tui.util.CustomEvents; // distribution file\n\t *\n\t * //-- #2. Use property --//\n\t * // # 2.1 off by event name\n\t * CustomEvents.off('onload');\n\t *\n\t * // # 2.2 off by event name and handler\n\t * CustomEvents.off('play', handler);\n\t *\n\t * // # 2.3 off by handler\n\t * CustomEvents.off(handler);\n\t *\n\t * // # 2.4 off by context\n\t * CustomEvents.off(myObj);\n\t *\n\t * // # 2.5 off by context and handler\n\t * CustomEvents.off(myObj, handler);\n\t *\n\t * // # 2.6 off by context and event name\n\t * CustomEvents.off(myObj, 'onload');\n\t *\n\t * // # 2.7 off by an Object. that is {eventName: handler}\n\t * CustomEvents.off({\n\t * 'play': handler,\n\t * 'pause': handler2\n\t * });\n\t *\n\t * // # 2.8 off the all events\n\t * CustomEvents.off();\n\t */\n\tCustomEvents.prototype.off = function(eventName, handler) {\n\t if (type.isString(eventName)) {\n\t // [syntax 1, 2]\n\t this._offByEventName(eventName, handler);\n\t } else if (!arguments.length) {\n\t // [syntax 8]\n\t this.events = {};\n\t this.contexts = [];\n\t } else if (type.isFunction(eventName)) {\n\t // [syntax 3]\n\t this._offByHandler(eventName);\n\t } else if (type.isObject(eventName)) {\n\t // [syntax 4, 5, 6]\n\t this._offByObject(eventName, handler);\n\t }\n\t};\n\n\t/**\n\t * Fire custom event\n\t * @param {string} eventName - name of custom event\n\t */\n\tCustomEvents.prototype.fire = function(eventName) { // eslint-disable-line\n\t this.invoke.apply(this, arguments);\n\t};\n\n\t/**\n\t * Fire a event and returns the result of operation 'boolean AND' with all\n\t * listener's results.\n\t *\n\t * So, It is different from {@link CustomEvents#fire}.\n\t *\n\t * In service code, use this as a before event in component level usually\n\t * for notifying that the event is cancelable.\n\t * @param {string} eventName - Custom event name\n\t * @param {...*} data - Data for event\n\t * @returns {boolean} The result of operation 'boolean AND'\n\t * @example\n\t * var map = new Map();\n\t * map.on({\n\t * 'beforeZoom': function() {\n\t * // It should cancel the 'zoom' event by some conditions.\n\t * if (that.disabled && this.getState()) {\n\t * return false;\n\t * }\n\t * return true;\n\t * }\n\t * });\n\t *\n\t * if (this.invoke('beforeZoom')) { // check the result of 'beforeZoom'\n\t * // if true,\n\t * // doSomething\n\t * }\n\t */\n\tCustomEvents.prototype.invoke = function(eventName) {\n\t var events, args, index, item;\n\n\t if (!this.hasListener(eventName)) {\n\t return true;\n\t }\n\n\t events = this._safeEvent(eventName);\n\t args = Array.prototype.slice.call(arguments, 1);\n\t index = 0;\n\n\t while (events[index]) {\n\t item = events[index];\n\n\t if (item.handler.apply(item.context, args) === false) {\n\t return false;\n\t }\n\n\t index += 1;\n\t }\n\n\t return true;\n\t};\n\n\t/**\n\t * Return whether at least one of the handlers is registered in the given\n\t * event name.\n\t * @param {string} eventName - Custom event name\n\t * @returns {boolean} Is there at least one handler in event name?\n\t */\n\tCustomEvents.prototype.hasListener = function(eventName) {\n\t return this.getListenerLength(eventName) > 0;\n\t};\n\n\t/**\n\t * Return a count of events registered.\n\t * @param {string} eventName - Custom event name\n\t * @returns {number} number of event\n\t */\n\tCustomEvents.prototype.getListenerLength = function(eventName) {\n\t var events = this._safeEvent(eventName);\n\n\t return events.length;\n\t};\n\n\tmodule.exports = CustomEvents;\n\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/**\n\t * @fileoverview This module provides a Enum Constructor.\n\t * @author NHN.\n\t * FE Development Lab \n\t * @example\n\t * // node, commonjs\n\t * var Enum = require('tui-code-snippet').Enum;\n\t * @example\n\t * // distribution file, script\n\t * \n\t * \n\t * \n\t * \n\t *