Merge lp:~dimitern/maas/1.2-node-view-shows-kernel-params into lp:maas/1.2

Proposed by Dimiter Naydenov
Status: Superseded
Proposed branch: lp:~dimitern/maas/1.2-node-view-shows-kernel-params
Merge into: lp:maas/1.2
Prerequisite: lp:~jameinel/maas/1.2-node-get-effective-kernel-options
Diff against target: 421803 lines (+3451/-408425) (has conflicts)
1370 files modified
Makefile (+8/-3)
docs/conf.py (+2/-2)
docs/index.rst (+2/-1)
docs/maascli.rst (+556/-9)
docs/man/maas-cli.8.rst (+26/-0)
docs/nodes.rst (+1/-1)
docs/tags.rst (+127/-0)
docs/troubleshooting.rst (+58/-26)
etc/celeryconfig_common.py (+4/-3)
etc/democeleryconfig.py (+1/-1)
etc/democeleryconfig_cluster.py (+2/-2)
etc/maas/import_pxe_files (+2/-2)
required-packages/base (+2/-0)
required-packages/dev (+2/-0)
src/apiclient/maas_client.py (+26/-1)
src/apiclient/tests/test_maas_client.py (+61/-0)
src/maas/settings.py (+6/-4)
src/maas/urls.py (+1/-1)
src/maascli/api.py (+30/-3)
src/maascli/cli.py (+14/-4)
src/maascli/utils.py (+5/-0)
src/maasserver/api.py (+144/-15)
src/maasserver/dhcp_connect.py (+1/-1)
src/maasserver/dns.py (+28/-20)
src/maasserver/dns_connect.py (+14/-5)
src/maasserver/fixtures/dev_fixture.yaml (+5/-5)
src/maasserver/forms.py (+9/-1)
src/maasserver/management/commands/config_master_dhcp.py (+0/-107)
src/maasserver/management/commands/get_named_conf.py (+2/-2)
src/maasserver/management/commands/set_up_dns.py (+1/-1)
src/maasserver/management/commands/write_dns_config.py (+34/-0)
src/maasserver/middleware.py (+1/-1)
src/maasserver/migrations/0043_unique_hostname_preparation.py (+218/-0)
src/maasserver/migrations/0044_node_hostname_unique.py (+201/-0)
src/maasserver/migrations/0045_add_tag_kernel_opts.py (+203/-0)
src/maasserver/models/node.py (+63/-12)
src/maasserver/models/nodegroup.py (+22/-1)
src/maasserver/models/tag.py (+3/-0)
src/maasserver/signals.py (+31/-8)
src/maasserver/static/css/components/blocks.css (+3/-0)
src/maasserver/static/css/components/table_list.css (+13/-0)
src/maasserver/static/css/modifiers.css (+3/-0)
src/maasserver/static/js/tests/test_enums.html (+1/-1)
src/maasserver/static/js/tests/test_longpoll.html (+1/-1)
src/maasserver/static/js/tests/test_morph.html (+1/-1)
src/maasserver/static/js/tests/test_node.html (+1/-1)
src/maasserver/static/js/tests/test_node_add.html (+1/-1)
src/maasserver/static/js/tests/test_node_views.html (+2/-2)
src/maasserver/static/js/tests/test_nodes_chart.html (+2/-2)
src/maasserver/static/js/tests/test_power_parameters.html (+1/-1)
src/maasserver/static/js/tests/test_prefs.html (+1/-1)
src/maasserver/static/js/tests/test_user_panel.html (+1/-1)
src/maasserver/static/js/tests/test_utils.html (+1/-1)
src/maasserver/static/jslibs/raphael/raphael-min.js (+0/-10)
src/maasserver/static/jslibs/yui/align-plugin/align-plugin-debug.js (+0/-199)
src/maasserver/static/jslibs/yui/align-plugin/align-plugin-min.js (+0/-7)
src/maasserver/static/jslibs/yui/align-plugin/align-plugin.js (+0/-199)
src/maasserver/static/jslibs/yui/anim-base/anim-base-debug.js (+0/-682)
src/maasserver/static/jslibs/yui/anim-base/anim-base-min.js (+0/-7)
src/maasserver/static/jslibs/yui/anim-base/anim-base.js (+0/-681)
src/maasserver/static/jslibs/yui/anim-color/anim-color-debug.js (+0/-54)
src/maasserver/static/jslibs/yui/anim-color/anim-color-min.js (+0/-7)
src/maasserver/static/jslibs/yui/anim-color/anim-color.js (+0/-54)
src/maasserver/static/jslibs/yui/anim-curve/anim-curve-debug.js (+0/-63)
src/maasserver/static/jslibs/yui/anim-curve/anim-curve-min.js (+0/-7)
src/maasserver/static/jslibs/yui/anim-curve/anim-curve.js (+0/-63)
src/maasserver/static/jslibs/yui/anim-easing/anim-easing-debug.js (+0/-356)
src/maasserver/static/jslibs/yui/anim-easing/anim-easing-min.js (+0/-7)
src/maasserver/static/jslibs/yui/anim-easing/anim-easing.js (+0/-356)
src/maasserver/static/jslibs/yui/anim-node-plugin/anim-node-plugin-debug.js (+0/-32)
src/maasserver/static/jslibs/yui/anim-node-plugin/anim-node-plugin-min.js (+0/-7)
src/maasserver/static/jslibs/yui/anim-node-plugin/anim-node-plugin.js (+0/-32)
src/maasserver/static/jslibs/yui/anim-scroll/anim-scroll-debug.js (+0/-44)
src/maasserver/static/jslibs/yui/anim-scroll/anim-scroll-min.js (+0/-7)
src/maasserver/static/jslibs/yui/anim-scroll/anim-scroll.js (+0/-44)
src/maasserver/static/jslibs/yui/anim-shape-transform/anim-shape-transform-debug.js (+0/-112)
src/maasserver/static/jslibs/yui/anim-shape-transform/anim-shape-transform-min.js (+0/-7)
src/maasserver/static/jslibs/yui/anim-shape-transform/anim-shape-transform.js (+0/-112)
src/maasserver/static/jslibs/yui/anim-xy/anim-xy-debug.js (+0/-32)
src/maasserver/static/jslibs/yui/anim-xy/anim-xy-min.js (+0/-7)
src/maasserver/static/jslibs/yui/anim-xy/anim-xy.js (+0/-32)
src/maasserver/static/jslibs/yui/app-base/app-base-debug.js (+0/-1142)
src/maasserver/static/jslibs/yui/app-base/app-base-min.js (+0/-7)
src/maasserver/static/jslibs/yui/app-base/app-base.js (+0/-1142)
src/maasserver/static/jslibs/yui/app-transitions-css/app-transitions-css-min.css (+0/-7)
src/maasserver/static/jslibs/yui/app-transitions-css/app-transitions-css.css (+0/-24)
src/maasserver/static/jslibs/yui/app-transitions-native/app-transitions-native-debug.js (+0/-358)
src/maasserver/static/jslibs/yui/app-transitions-native/app-transitions-native-min.js (+0/-7)
src/maasserver/static/jslibs/yui/app-transitions-native/app-transitions-native.js (+0/-358)
src/maasserver/static/jslibs/yui/app-transitions/app-transitions-debug.js (+0/-257)
src/maasserver/static/jslibs/yui/app-transitions/app-transitions-min.js (+0/-7)
src/maasserver/static/jslibs/yui/app-transitions/app-transitions.js (+0/-257)
src/maasserver/static/jslibs/yui/array-extras/array-extras-debug.js (+0/-367)
src/maasserver/static/jslibs/yui/array-extras/array-extras-min.js (+0/-7)
src/maasserver/static/jslibs/yui/array-extras/array-extras.js (+0/-366)
src/maasserver/static/jslibs/yui/array-invoke/array-invoke-debug.js (+0/-46)
src/maasserver/static/jslibs/yui/array-invoke/array-invoke-min.js (+0/-7)
src/maasserver/static/jslibs/yui/array-invoke/array-invoke.js (+0/-46)
src/maasserver/static/jslibs/yui/arraylist-add/arraylist-add-debug.js (+0/-93)
src/maasserver/static/jslibs/yui/arraylist-add/arraylist-add-min.js (+0/-7)
src/maasserver/static/jslibs/yui/arraylist-add/arraylist-add.js (+0/-93)
src/maasserver/static/jslibs/yui/arraylist-filter/arraylist-filter-debug.js (+0/-51)
src/maasserver/static/jslibs/yui/arraylist-filter/arraylist-filter-min.js (+0/-7)
src/maasserver/static/jslibs/yui/arraylist-filter/arraylist-filter.js (+0/-51)
src/maasserver/static/jslibs/yui/arraylist/arraylist-debug.js (+0/-220)
src/maasserver/static/jslibs/yui/arraylist/arraylist-min.js (+0/-7)
src/maasserver/static/jslibs/yui/arraylist/arraylist.js (+0/-220)
src/maasserver/static/jslibs/yui/arraysort/arraysort-debug.js (+0/-71)
src/maasserver/static/jslibs/yui/arraysort/arraysort-min.js (+0/-7)
src/maasserver/static/jslibs/yui/arraysort/arraysort.js (+0/-71)
src/maasserver/static/jslibs/yui/assets/skins/sam/autocomplete-list.css (+0/-7)
src/maasserver/static/jslibs/yui/assets/skins/sam/calendar-base.css (+0/-7)
src/maasserver/static/jslibs/yui/assets/skins/sam/calendar.css (+0/-7)
src/maasserver/static/jslibs/yui/assets/skins/sam/calendarnavigator.css (+0/-7)
src/maasserver/static/jslibs/yui/assets/skins/sam/console-filters.css (+0/-7)
src/maasserver/static/jslibs/yui/assets/skins/sam/console.css (+0/-7)
src/maasserver/static/jslibs/yui/assets/skins/sam/datatable-base-deprecated.css (+0/-8)
src/maasserver/static/jslibs/yui/assets/skins/sam/datatable-base.css (+0/-7)
src/maasserver/static/jslibs/yui/assets/skins/sam/datatable-message.css (+0/-7)
src/maasserver/static/jslibs/yui/assets/skins/sam/datatable-scroll.css (+0/-7)
src/maasserver/static/jslibs/yui/assets/skins/sam/datatable-sort.css (+0/-7)
src/maasserver/static/jslibs/yui/assets/skins/sam/dial.css (+0/-7)
src/maasserver/static/jslibs/yui/assets/skins/sam/node-flick.css (+0/-7)
src/maasserver/static/jslibs/yui/assets/skins/sam/node-menunav.css (+0/-7)
src/maasserver/static/jslibs/yui/assets/skins/sam/overlay.css (+0/-7)
src/maasserver/static/jslibs/yui/assets/skins/sam/panel.css (+0/-7)
src/maasserver/static/jslibs/yui/assets/skins/sam/resize-base.css (+0/-7)
src/maasserver/static/jslibs/yui/assets/skins/sam/scrollview-base.css (+0/-7)
src/maasserver/static/jslibs/yui/assets/skins/sam/scrollview-list.css (+0/-7)
src/maasserver/static/jslibs/yui/assets/skins/sam/scrollview-scrollbars.css (+0/-7)
src/maasserver/static/jslibs/yui/assets/skins/sam/skin.css (+0/-35)
src/maasserver/static/jslibs/yui/assets/skins/sam/slider-base.css (+0/-7)
src/maasserver/static/jslibs/yui/assets/skins/sam/tabview.css (+0/-7)
src/maasserver/static/jslibs/yui/assets/skins/sam/test-console.css (+0/-7)
src/maasserver/static/jslibs/yui/assets/skins/sam/test.css (+0/-7)
src/maasserver/static/jslibs/yui/assets/skins/sam/widget-base.css (+0/-7)
src/maasserver/static/jslibs/yui/assets/skins/sam/widget-buttons.css (+0/-7)
src/maasserver/static/jslibs/yui/assets/skins/sam/widget-modality.css (+0/-7)
src/maasserver/static/jslibs/yui/assets/skins/sam/widget-stack.css (+0/-7)
src/maasserver/static/jslibs/yui/async-queue/async-queue-debug.js (+0/-528)
src/maasserver/static/jslibs/yui/async-queue/async-queue-min.js (+0/-7)
src/maasserver/static/jslibs/yui/async-queue/async-queue.js (+0/-528)
src/maasserver/static/jslibs/yui/attribute-base/attribute-base-debug.js (+0/-111)
src/maasserver/static/jslibs/yui/attribute-base/attribute-base-min.js (+0/-7)
src/maasserver/static/jslibs/yui/attribute-base/attribute-base.js (+0/-111)
src/maasserver/static/jslibs/yui/attribute-complex/attribute-complex-debug.js (+0/-132)
src/maasserver/static/jslibs/yui/attribute-complex/attribute-complex-min.js (+0/-7)
src/maasserver/static/jslibs/yui/attribute-complex/attribute-complex.js (+0/-132)
src/maasserver/static/jslibs/yui/attribute-core/attribute-core-debug.js (+0/-1029)
src/maasserver/static/jslibs/yui/attribute-core/attribute-core-min.js (+0/-7)
src/maasserver/static/jslibs/yui/attribute-core/attribute-core.js (+0/-1017)
src/maasserver/static/jslibs/yui/attribute-events/attribute-events-debug.js (+0/-180)
src/maasserver/static/jslibs/yui/attribute-events/attribute-events-min.js (+0/-7)
src/maasserver/static/jslibs/yui/attribute-events/attribute-events.js (+0/-179)
src/maasserver/static/jslibs/yui/attribute-extras/attribute-extras-debug.js (+0/-150)
src/maasserver/static/jslibs/yui/attribute-extras/attribute-extras-min.js (+0/-7)
src/maasserver/static/jslibs/yui/attribute-extras/attribute-extras.js (+0/-149)
src/maasserver/static/jslibs/yui/autocomplete-base/autocomplete-base-debug.js (+0/-1552)
src/maasserver/static/jslibs/yui/autocomplete-base/autocomplete-base-min.js (+0/-8)
src/maasserver/static/jslibs/yui/autocomplete-base/autocomplete-base.js (+0/-1544)
src/maasserver/static/jslibs/yui/autocomplete-filters-accentfold/autocomplete-filters-accentfold-debug.js (+0/-142)
src/maasserver/static/jslibs/yui/autocomplete-filters-accentfold/autocomplete-filters-accentfold-min.js (+0/-7)
src/maasserver/static/jslibs/yui/autocomplete-filters-accentfold/autocomplete-filters-accentfold.js (+0/-142)
src/maasserver/static/jslibs/yui/autocomplete-filters/autocomplete-filters-debug.js (+0/-245)
src/maasserver/static/jslibs/yui/autocomplete-filters/autocomplete-filters-min.js (+0/-7)
src/maasserver/static/jslibs/yui/autocomplete-filters/autocomplete-filters.js (+0/-245)
src/maasserver/static/jslibs/yui/autocomplete-highlighters-accentfold/autocomplete-highlighters-accentfold-debug.js (+0/-113)
src/maasserver/static/jslibs/yui/autocomplete-highlighters-accentfold/autocomplete-highlighters-accentfold-min.js (+0/-7)
src/maasserver/static/jslibs/yui/autocomplete-highlighters-accentfold/autocomplete-highlighters-accentfold.js (+0/-113)
src/maasserver/static/jslibs/yui/autocomplete-highlighters/autocomplete-highlighters-debug.js (+0/-205)
src/maasserver/static/jslibs/yui/autocomplete-highlighters/autocomplete-highlighters-min.js (+0/-7)
src/maasserver/static/jslibs/yui/autocomplete-highlighters/autocomplete-highlighters.js (+0/-205)
src/maasserver/static/jslibs/yui/autocomplete-list-keys/autocomplete-list-keys-debug.js (+0/-192)
src/maasserver/static/jslibs/yui/autocomplete-list-keys/autocomplete-list-keys-min.js (+0/-7)
src/maasserver/static/jslibs/yui/autocomplete-list-keys/autocomplete-list-keys.js (+0/-192)
src/maasserver/static/jslibs/yui/autocomplete-list/assets/autocomplete-list-core.css (+0/-33)
src/maasserver/static/jslibs/yui/autocomplete-list/assets/skins/night/autocomplete-list-skin.css (+0/-57)
src/maasserver/static/jslibs/yui/autocomplete-list/assets/skins/night/autocomplete-list.css (+0/-7)
src/maasserver/static/jslibs/yui/autocomplete-list/assets/skins/sam/autocomplete-list-skin.css (+0/-23)
src/maasserver/static/jslibs/yui/autocomplete-list/assets/skins/sam/autocomplete-list.css (+0/-7)
src/maasserver/static/jslibs/yui/autocomplete-list/autocomplete-list-debug.js (+0/-893)
src/maasserver/static/jslibs/yui/autocomplete-list/autocomplete-list-min.js (+0/-8)
src/maasserver/static/jslibs/yui/autocomplete-list/autocomplete-list.js (+0/-893)
src/maasserver/static/jslibs/yui/autocomplete-list/lang/autocomplete-list.js (+0/-7)
src/maasserver/static/jslibs/yui/autocomplete-list/lang/autocomplete-list_en.js (+0/-7)
src/maasserver/static/jslibs/yui/autocomplete-plugin/autocomplete-plugin-debug.js (+0/-54)
src/maasserver/static/jslibs/yui/autocomplete-plugin/autocomplete-plugin-min.js (+0/-7)
src/maasserver/static/jslibs/yui/autocomplete-plugin/autocomplete-plugin.js (+0/-54)
src/maasserver/static/jslibs/yui/autocomplete-sources/autocomplete-sources-debug.js (+0/-482)
src/maasserver/static/jslibs/yui/autocomplete-sources/autocomplete-sources-min.js (+0/-7)
src/maasserver/static/jslibs/yui/autocomplete-sources/autocomplete-sources.js (+0/-482)
src/maasserver/static/jslibs/yui/base-base/base-base-debug.js (+0/-354)
src/maasserver/static/jslibs/yui/base-base/base-base-min.js (+0/-7)
src/maasserver/static/jslibs/yui/base-base/base-base.js (+0/-352)
src/maasserver/static/jslibs/yui/base-build/base-build-debug.js (+0/-428)
src/maasserver/static/jslibs/yui/base-build/base-build-min.js (+0/-7)
src/maasserver/static/jslibs/yui/base-build/base-build.js (+0/-428)
src/maasserver/static/jslibs/yui/base-core/base-core-debug.js (+0/-621)
src/maasserver/static/jslibs/yui/base-core/base-core-min.js (+0/-7)
src/maasserver/static/jslibs/yui/base-core/base-core.js (+0/-616)
src/maasserver/static/jslibs/yui/base-pluginhost/base-pluginhost-debug.js (+0/-42)
src/maasserver/static/jslibs/yui/base-pluginhost/base-pluginhost-min.js (+0/-7)
src/maasserver/static/jslibs/yui/base-pluginhost/base-pluginhost.js (+0/-42)
src/maasserver/static/jslibs/yui/button-base/button-base-debug.js (+0/-344)
src/maasserver/static/jslibs/yui/button-base/button-base-min.js (+0/-7)
src/maasserver/static/jslibs/yui/button-base/button-base.js (+0/-344)
src/maasserver/static/jslibs/yui/button-core/button-core-debug.js (+0/-253)
src/maasserver/static/jslibs/yui/button-core/button-core-min.js (+0/-7)
src/maasserver/static/jslibs/yui/button-core/button-core.js (+0/-253)
src/maasserver/static/jslibs/yui/button-group/button-group-debug.js (+0/-182)
src/maasserver/static/jslibs/yui/button-group/button-group-min.js (+0/-7)
src/maasserver/static/jslibs/yui/button-group/button-group.js (+0/-182)
src/maasserver/static/jslibs/yui/button-plugin/button-plugin-debug.js (+0/-138)
src/maasserver/static/jslibs/yui/button-plugin/button-plugin-min.js (+0/-7)
src/maasserver/static/jslibs/yui/button-plugin/button-plugin.js (+0/-138)
src/maasserver/static/jslibs/yui/button/button-debug.js (+0/-325)
src/maasserver/static/jslibs/yui/button/button-min.js (+0/-7)
src/maasserver/static/jslibs/yui/button/button.js (+0/-325)
src/maasserver/static/jslibs/yui/cache-base/cache-base-debug.js (+0/-448)
src/maasserver/static/jslibs/yui/cache-base/cache-base-min.js (+0/-7)
src/maasserver/static/jslibs/yui/cache-base/cache-base.js (+0/-438)
src/maasserver/static/jslibs/yui/cache-offline/cache-offline-debug.js (+0/-347)
src/maasserver/static/jslibs/yui/cache-offline/cache-offline-min.js (+0/-7)
src/maasserver/static/jslibs/yui/cache-offline/cache-offline.js (+0/-339)
src/maasserver/static/jslibs/yui/cache-plugin/cache-plugin-debug.js (+0/-59)
src/maasserver/static/jslibs/yui/cache-plugin/cache-plugin-min.js (+0/-7)
src/maasserver/static/jslibs/yui/cache-plugin/cache-plugin.js (+0/-59)
src/maasserver/static/jslibs/yui/calendar-base/assets/calendar-base-core.css (+0/-27)
src/maasserver/static/jslibs/yui/calendar-base/assets/calendar-core.css (+0/-37)
src/maasserver/static/jslibs/yui/calendar-base/assets/calendarnavigator-core.css (+0/-22)
src/maasserver/static/jslibs/yui/calendar-base/assets/skins/night/calendar-base-skin.css (+0/-88)
src/maasserver/static/jslibs/yui/calendar-base/assets/skins/night/calendar-base.css (+0/-7)
src/maasserver/static/jslibs/yui/calendar-base/assets/skins/night/calendar-skin.css (+0/-13)
src/maasserver/static/jslibs/yui/calendar-base/assets/skins/night/calendarnavigator-skin.css (+0/-39)
src/maasserver/static/jslibs/yui/calendar-base/assets/skins/sam/calendar-base-skin.css (+0/-94)
src/maasserver/static/jslibs/yui/calendar-base/assets/skins/sam/calendar-base.css (+0/-7)
src/maasserver/static/jslibs/yui/calendar-base/assets/skins/sam/calendar-skin.css (+0/-13)
src/maasserver/static/jslibs/yui/calendar-base/assets/skins/sam/calendarnavigator-skin.css (+0/-39)
src/maasserver/static/jslibs/yui/calendar-base/calendar-base-debug.js (+0/-1702)
src/maasserver/static/jslibs/yui/calendar-base/calendar-base-min.js (+0/-9)
src/maasserver/static/jslibs/yui/calendar-base/calendar-base.js (+0/-1702)
src/maasserver/static/jslibs/yui/calendar-base/lang/calendar-base.js (+0/-7)
src/maasserver/static/jslibs/yui/calendar-base/lang/calendar-base_de.js (+0/-7)
src/maasserver/static/jslibs/yui/calendar-base/lang/calendar-base_en.js (+0/-7)
src/maasserver/static/jslibs/yui/calendar-base/lang/calendar-base_fr.js (+0/-7)
src/maasserver/static/jslibs/yui/calendar-base/lang/calendar-base_ja.js (+0/-7)
src/maasserver/static/jslibs/yui/calendar-base/lang/calendar-base_nb-NO.js (+0/-7)
src/maasserver/static/jslibs/yui/calendar-base/lang/calendar-base_pt-BR.js (+0/-7)
src/maasserver/static/jslibs/yui/calendar-base/lang/calendar-base_ru.js (+0/-7)
src/maasserver/static/jslibs/yui/calendar-base/lang/calendar-base_zh-HANT-TW.js (+0/-7)
src/maasserver/static/jslibs/yui/calendar/assets/calendar-base-core.css (+0/-27)
src/maasserver/static/jslibs/yui/calendar/assets/calendar-core.css (+0/-37)
src/maasserver/static/jslibs/yui/calendar/assets/calendarnavigator-core.css (+0/-22)
src/maasserver/static/jslibs/yui/calendar/assets/skins/night/calendar-base-skin.css (+0/-88)
src/maasserver/static/jslibs/yui/calendar/assets/skins/night/calendar-skin.css (+0/-13)
src/maasserver/static/jslibs/yui/calendar/assets/skins/night/calendar.css (+0/-7)
src/maasserver/static/jslibs/yui/calendar/assets/skins/night/calendarnavigator-skin.css (+0/-39)
src/maasserver/static/jslibs/yui/calendar/assets/skins/sam/calendar-base-skin.css (+0/-94)
src/maasserver/static/jslibs/yui/calendar/assets/skins/sam/calendar-skin.css (+0/-13)
src/maasserver/static/jslibs/yui/calendar/assets/skins/sam/calendar.css (+0/-7)
src/maasserver/static/jslibs/yui/calendar/assets/skins/sam/calendarnavigator-skin.css (+0/-39)
src/maasserver/static/jslibs/yui/calendar/calendar-base-debug.js (+0/-183)
src/maasserver/static/jslibs/yui/calendar/calendar-base-min.js (+0/-7)
src/maasserver/static/jslibs/yui/calendar/calendar-base.js (+0/-182)
src/maasserver/static/jslibs/yui/calendar/calendar-debug.js (+0/-544)
src/maasserver/static/jslibs/yui/calendar/calendar-min.js (+0/-7)
src/maasserver/static/jslibs/yui/calendar/calendar.js (+0/-544)
src/maasserver/static/jslibs/yui/calendar/lang/calendar.js (+0/-7)
src/maasserver/static/jslibs/yui/calendar/lang/calendar_de.js (+0/-7)
src/maasserver/static/jslibs/yui/calendar/lang/calendar_en.js (+0/-7)
src/maasserver/static/jslibs/yui/calendar/lang/calendar_fr.js (+0/-7)
src/maasserver/static/jslibs/yui/calendar/lang/calendar_ja.js (+0/-7)
src/maasserver/static/jslibs/yui/calendar/lang/calendar_nb-NO.js (+0/-7)
src/maasserver/static/jslibs/yui/calendar/lang/calendar_pt-BR.js (+0/-7)
src/maasserver/static/jslibs/yui/calendar/lang/calendar_ru.js (+0/-7)
src/maasserver/static/jslibs/yui/calendar/lang/calendar_zh-HANT-TW.js (+0/-7)
src/maasserver/static/jslibs/yui/calendarnavigator/assets/calendar-base-core.css (+0/-27)
src/maasserver/static/jslibs/yui/calendarnavigator/assets/calendar-core.css (+0/-37)
src/maasserver/static/jslibs/yui/calendarnavigator/assets/calendarnavigator-core.css (+0/-22)
src/maasserver/static/jslibs/yui/calendarnavigator/assets/skins/night/calendar-base-skin.css (+0/-88)
src/maasserver/static/jslibs/yui/calendarnavigator/assets/skins/night/calendar-skin.css (+0/-13)
src/maasserver/static/jslibs/yui/calendarnavigator/assets/skins/night/calendarnavigator-skin.css (+0/-39)
src/maasserver/static/jslibs/yui/calendarnavigator/assets/skins/night/calendarnavigator.css (+0/-7)
src/maasserver/static/jslibs/yui/calendarnavigator/assets/skins/sam/calendar-base-skin.css (+0/-94)
src/maasserver/static/jslibs/yui/calendarnavigator/assets/skins/sam/calendar-skin.css (+0/-13)
src/maasserver/static/jslibs/yui/calendarnavigator/assets/skins/sam/calendarnavigator-skin.css (+0/-39)
src/maasserver/static/jslibs/yui/calendarnavigator/assets/skins/sam/calendarnavigator.css (+0/-7)
src/maasserver/static/jslibs/yui/calendarnavigator/calendarnavigator-debug.js (+0/-284)
src/maasserver/static/jslibs/yui/calendarnavigator/calendarnavigator-min.js (+0/-7)
src/maasserver/static/jslibs/yui/calendarnavigator/calendarnavigator.js (+0/-284)
src/maasserver/static/jslibs/yui/charts-base/charts-base-debug.js (+0/-15451)
src/maasserver/static/jslibs/yui/charts-base/charts-base-min.js (+0/-27)
src/maasserver/static/jslibs/yui/charts-base/charts-base.js (+0/-15451)
src/maasserver/static/jslibs/yui/charts-legend/charts-legend-debug.js (+0/-1668)
src/maasserver/static/jslibs/yui/charts-legend/charts-legend-min.js (+0/-9)
src/maasserver/static/jslibs/yui/charts-legend/charts-legend.js (+0/-1668)
src/maasserver/static/jslibs/yui/charts/charts-debug.js (+0/-30)
src/maasserver/static/jslibs/yui/charts/charts-min.js (+0/-7)
src/maasserver/static/jslibs/yui/charts/charts.js (+0/-30)
src/maasserver/static/jslibs/yui/classnamemanager/classnamemanager-debug.js (+0/-90)
src/maasserver/static/jslibs/yui/classnamemanager/classnamemanager-min.js (+0/-7)
src/maasserver/static/jslibs/yui/classnamemanager/classnamemanager.js (+0/-90)
src/maasserver/static/jslibs/yui/clickable-rail/assets/slider-base-core.css (+0/-37)
src/maasserver/static/jslibs/yui/clickable-rail/assets/slider-core.css (+0/-37)
src/maasserver/static/jslibs/yui/clickable-rail/clickable-rail-debug.js (+0/-219)
src/maasserver/static/jslibs/yui/clickable-rail/clickable-rail-min.js (+0/-7)
src/maasserver/static/jslibs/yui/clickable-rail/clickable-rail.js (+0/-219)
src/maasserver/static/jslibs/yui/console-filters/assets/console-filters-core.css (+0/-6)
src/maasserver/static/jslibs/yui/console-filters/assets/skins/sam/console-filters-skin.css (+0/-33)
src/maasserver/static/jslibs/yui/console-filters/assets/skins/sam/console-filters.css (+0/-7)
src/maasserver/static/jslibs/yui/console-filters/console-filters-debug.js (+0/-729)
src/maasserver/static/jslibs/yui/console-filters/console-filters-min.js (+0/-7)
src/maasserver/static/jslibs/yui/console-filters/console-filters.js (+0/-729)
src/maasserver/static/jslibs/yui/console/assets/console-core.css (+0/-6)
src/maasserver/static/jslibs/yui/console/assets/console-filters-core.css (+0/-6)
src/maasserver/static/jslibs/yui/console/assets/skins/sam/console-filters-skin.css (+0/-33)
src/maasserver/static/jslibs/yui/console/assets/skins/sam/console-filters.css (+0/-7)
src/maasserver/static/jslibs/yui/console/assets/skins/sam/console-skin.css (+0/-191)
src/maasserver/static/jslibs/yui/console/assets/skins/sam/console.css (+0/-7)
src/maasserver/static/jslibs/yui/console/console-debug.js (+0/-1523)
src/maasserver/static/jslibs/yui/console/console-min.js (+0/-8)
src/maasserver/static/jslibs/yui/console/console.js (+0/-1523)
src/maasserver/static/jslibs/yui/console/lang/console.js (+0/-7)
src/maasserver/static/jslibs/yui/console/lang/console_en.js (+0/-7)
src/maasserver/static/jslibs/yui/console/lang/console_es.js (+0/-7)
src/maasserver/static/jslibs/yui/console/lang/console_ja.js (+0/-7)
src/maasserver/static/jslibs/yui/cookie/cookie-debug.js (+0/-505)
src/maasserver/static/jslibs/yui/cookie/cookie-min.js (+0/-7)
src/maasserver/static/jslibs/yui/cookie/cookie.js (+0/-505)
src/maasserver/static/jslibs/yui/createlink-base/createlink-base-debug.js (+0/-91)
src/maasserver/static/jslibs/yui/createlink-base/createlink-base-min.js (+0/-7)
src/maasserver/static/jslibs/yui/createlink-base/createlink-base.js (+0/-90)
src/maasserver/static/jslibs/yui/cssbase-context/base-context-min.css (+0/-7)
src/maasserver/static/jslibs/yui/cssbase-context/base-context.css (+0/-81)
src/maasserver/static/jslibs/yui/cssbase-context/cssbase-context-min.css (+0/-7)
src/maasserver/static/jslibs/yui/cssbase-context/cssbase-context.css (+0/-81)
src/maasserver/static/jslibs/yui/cssbase/base-min.css (+0/-7)
src/maasserver/static/jslibs/yui/cssbase/base.css (+0/-81)
src/maasserver/static/jslibs/yui/cssbase/cssbase-min.css (+0/-7)
src/maasserver/static/jslibs/yui/cssbase/cssbase.css (+0/-81)
src/maasserver/static/jslibs/yui/cssbutton/cssbutton-min.css (+0/-7)
src/maasserver/static/jslibs/yui/cssbutton/cssbutton.css (+0/-148)
src/maasserver/static/jslibs/yui/cssfonts-context/cssfonts-context-min.css (+0/-7)
src/maasserver/static/jslibs/yui/cssfonts-context/cssfonts-context.css (+0/-48)
src/maasserver/static/jslibs/yui/cssfonts-context/fonts-context-min.css (+0/-7)
src/maasserver/static/jslibs/yui/cssfonts-context/fonts-context.css (+0/-48)
src/maasserver/static/jslibs/yui/cssfonts/cssfonts-min.css (+0/-7)
src/maasserver/static/jslibs/yui/cssfonts/cssfonts.css (+0/-48)
src/maasserver/static/jslibs/yui/cssfonts/fonts-min.css (+0/-7)
src/maasserver/static/jslibs/yui/cssfonts/fonts.css (+0/-48)
src/maasserver/static/jslibs/yui/cssgrids-base/cssgrids-base-min.css (+0/-7)
src/maasserver/static/jslibs/yui/cssgrids-base/cssgrids-base.css (+0/-21)
src/maasserver/static/jslibs/yui/cssgrids-context-deprecated/grids-context-min.css (+0/-8)
src/maasserver/static/jslibs/yui/cssgrids-context-deprecated/grids-context.css (+0/-490)
src/maasserver/static/jslibs/yui/cssgrids-units/cssgrids-units-min.css (+0/-7)
src/maasserver/static/jslibs/yui/cssgrids-units/cssgrids-units.css (+0/-154)
src/maasserver/static/jslibs/yui/cssgrids/cssgrids-min.css (+0/-7)
src/maasserver/static/jslibs/yui/cssgrids/cssgrids.css (+0/-167)
src/maasserver/static/jslibs/yui/cssgrids/grids-min.css (+0/-7)
src/maasserver/static/jslibs/yui/cssgrids/grids.css (+0/-167)
src/maasserver/static/jslibs/yui/cssreset-context/cssreset-context-min.css (+0/-7)
src/maasserver/static/jslibs/yui/cssreset-context/cssreset-context.css (+0/-126)
src/maasserver/static/jslibs/yui/cssreset-context/reset-context-min.css (+0/-7)
src/maasserver/static/jslibs/yui/cssreset-context/reset-context.css (+0/-126)
src/maasserver/static/jslibs/yui/cssreset/cssreset-min.css (+0/-7)
src/maasserver/static/jslibs/yui/cssreset/cssreset.css (+0/-126)
src/maasserver/static/jslibs/yui/cssreset/reset-min.css (+0/-7)
src/maasserver/static/jslibs/yui/cssreset/reset.css (+0/-126)
src/maasserver/static/jslibs/yui/dataschema-array/dataschema-array-debug.js (+0/-195)
src/maasserver/static/jslibs/yui/dataschema-array/dataschema-array-min.js (+0/-7)
src/maasserver/static/jslibs/yui/dataschema-array/dataschema-array.js (+0/-192)
src/maasserver/static/jslibs/yui/dataschema-base/dataschema-base-debug.js (+0/-73)
src/maasserver/static/jslibs/yui/dataschema-base/dataschema-base-min.js (+0/-7)
src/maasserver/static/jslibs/yui/dataschema-base/dataschema-base.js (+0/-72)
src/maasserver/static/jslibs/yui/dataschema-json/dataschema-json-debug.js (+0/-449)
src/maasserver/static/jslibs/yui/dataschema-json/dataschema-json-min.js (+0/-7)
src/maasserver/static/jslibs/yui/dataschema-json/dataschema-json.js (+0/-445)
src/maasserver/static/jslibs/yui/dataschema-text/dataschema-text-debug.js (+0/-189)
src/maasserver/static/jslibs/yui/dataschema-text/dataschema-text-min.js (+0/-7)
src/maasserver/static/jslibs/yui/dataschema-text/dataschema-text.js (+0/-188)
src/maasserver/static/jslibs/yui/dataschema-xml/dataschema-xml-debug.js (+0/-387)
src/maasserver/static/jslibs/yui/dataschema-xml/dataschema-xml-min.js (+0/-7)
src/maasserver/static/jslibs/yui/dataschema-xml/dataschema-xml.js (+0/-385)
src/maasserver/static/jslibs/yui/datasource-arrayschema/datasource-arrayschema-debug.js (+0/-112)
src/maasserver/static/jslibs/yui/datasource-arrayschema/datasource-arrayschema-min.js (+0/-7)
src/maasserver/static/jslibs/yui/datasource-arrayschema/datasource-arrayschema.js (+0/-112)
src/maasserver/static/jslibs/yui/datasource-cache/datasource-cache-debug.js (+0/-172)
src/maasserver/static/jslibs/yui/datasource-cache/datasource-cache-min.js (+0/-7)
src/maasserver/static/jslibs/yui/datasource-cache/datasource-cache.js (+0/-172)
src/maasserver/static/jslibs/yui/datasource-function/datasource-function-debug.js (+0/-111)
src/maasserver/static/jslibs/yui/datasource-function/datasource-function-min.js (+0/-7)
src/maasserver/static/jslibs/yui/datasource-function/datasource-function.js (+0/-109)
src/maasserver/static/jslibs/yui/datasource-get/datasource-get-debug.js (+0/-219)
src/maasserver/static/jslibs/yui/datasource-get/datasource-get-min.js (+0/-7)
src/maasserver/static/jslibs/yui/datasource-get/datasource-get.js (+0/-215)
src/maasserver/static/jslibs/yui/datasource-io/datasource-io-debug.js (+0/-210)
src/maasserver/static/jslibs/yui/datasource-io/datasource-io-min.js (+0/-7)
src/maasserver/static/jslibs/yui/datasource-io/datasource-io.js (+0/-207)
src/maasserver/static/jslibs/yui/datasource-jsonschema/datasource-jsonschema-debug.js (+0/-109)
src/maasserver/static/jslibs/yui/datasource-jsonschema/datasource-jsonschema-min.js (+0/-7)
src/maasserver/static/jslibs/yui/datasource-jsonschema/datasource-jsonschema.js (+0/-109)
src/maasserver/static/jslibs/yui/datasource-local/datasource-local-debug.js (+0/-408)
src/maasserver/static/jslibs/yui/datasource-local/datasource-local-min.js (+0/-7)
src/maasserver/static/jslibs/yui/datasource-local/datasource-local.js (+0/-404)
src/maasserver/static/jslibs/yui/datasource-polling/datasource-polling-debug.js (+0/-99)
src/maasserver/static/jslibs/yui/datasource-polling/datasource-polling-min.js (+0/-7)
src/maasserver/static/jslibs/yui/datasource-polling/datasource-polling.js (+0/-99)
src/maasserver/static/jslibs/yui/datasource-textschema/datasource-textschema-debug.js (+0/-108)
src/maasserver/static/jslibs/yui/datasource-textschema/datasource-textschema-min.js (+0/-7)
src/maasserver/static/jslibs/yui/datasource-textschema/datasource-textschema.js (+0/-108)
src/maasserver/static/jslibs/yui/datasource-xmlschema/datasource-xmlschema-debug.js (+0/-108)
src/maasserver/static/jslibs/yui/datasource-xmlschema/datasource-xmlschema-min.js (+0/-7)
src/maasserver/static/jslibs/yui/datasource-xmlschema/datasource-xmlschema.js (+0/-108)
src/maasserver/static/jslibs/yui/datatable-base-deprecated/assets/datatable-base-deprecated-core.css (+0/-93)
src/maasserver/static/jslibs/yui/datatable-base-deprecated/assets/skins/night/datatable-base-deprecated-skin.css (+0/-295)
src/maasserver/static/jslibs/yui/datatable-base-deprecated/assets/skins/night/datatable-base-deprecated.css (+0/-8)
src/maasserver/static/jslibs/yui/datatable-base-deprecated/assets/skins/sam/datatable-base-deprecated-skin.css (+0/-243)
src/maasserver/static/jslibs/yui/datatable-base-deprecated/assets/skins/sam/datatable-base-deprecated.css (+0/-8)
src/maasserver/static/jslibs/yui/datatable-base-deprecated/datatable-base-deprecated-debug.js (+0/-1709)
src/maasserver/static/jslibs/yui/datatable-base-deprecated/datatable-base-deprecated-min.js (+0/-8)
src/maasserver/static/jslibs/yui/datatable-base-deprecated/datatable-base-deprecated.js (+0/-1709)
src/maasserver/static/jslibs/yui/datatable-base/assets/datatable-base-core.css (+0/-10)
src/maasserver/static/jslibs/yui/datatable-base/assets/skins/night/datatable-base-skin.css (+0/-80)
src/maasserver/static/jslibs/yui/datatable-base/assets/skins/night/datatable-base.css (+0/-7)
src/maasserver/static/jslibs/yui/datatable-base/assets/skins/sam/datatable-base-skin.css (+0/-75)
src/maasserver/static/jslibs/yui/datatable-base/assets/skins/sam/datatable-base.css (+0/-7)
src/maasserver/static/jslibs/yui/datatable-base/datatable-base-debug.js (+0/-241)
src/maasserver/static/jslibs/yui/datatable-base/datatable-base-min.js (+0/-7)
src/maasserver/static/jslibs/yui/datatable-base/datatable-base.js (+0/-241)
src/maasserver/static/jslibs/yui/datatable-body/datatable-body-debug.js (+0/-898)
src/maasserver/static/jslibs/yui/datatable-body/datatable-body-min.js (+0/-7)
src/maasserver/static/jslibs/yui/datatable-body/datatable-body.js (+0/-898)
src/maasserver/static/jslibs/yui/datatable-column-widths/datatable-column-widths-debug.js (+0/-307)
src/maasserver/static/jslibs/yui/datatable-column-widths/datatable-column-widths-min.js (+0/-7)
src/maasserver/static/jslibs/yui/datatable-column-widths/datatable-column-widths.js (+0/-307)
src/maasserver/static/jslibs/yui/datatable-core/datatable-core-debug.js (+0/-1628)
src/maasserver/static/jslibs/yui/datatable-core/datatable-core-min.js (+0/-8)
src/maasserver/static/jslibs/yui/datatable-core/datatable-core.js (+0/-1626)
src/maasserver/static/jslibs/yui/datatable-datasource-deprecated/datatable-datasource-deprecated-debug.js (+0/-189)
src/maasserver/static/jslibs/yui/datatable-datasource-deprecated/datatable-datasource-deprecated-min.js (+0/-7)
src/maasserver/static/jslibs/yui/datatable-datasource-deprecated/datatable-datasource-deprecated.js (+0/-189)
src/maasserver/static/jslibs/yui/datatable-datasource/datatable-datasource-debug.js (+0/-186)
src/maasserver/static/jslibs/yui/datatable-datasource/datatable-datasource-min.js (+0/-7)
src/maasserver/static/jslibs/yui/datatable-datasource/datatable-datasource.js (+0/-186)
src/maasserver/static/jslibs/yui/datatable-head/datatable-head-debug.js (+0/-507)
src/maasserver/static/jslibs/yui/datatable-head/datatable-head-min.js (+0/-7)
src/maasserver/static/jslibs/yui/datatable-head/datatable-head.js (+0/-507)
src/maasserver/static/jslibs/yui/datatable-message/assets/datatable-message-core.css (+0/-14)
src/maasserver/static/jslibs/yui/datatable-message/assets/skins/night/datatable-message-skin.css (+0/-12)
src/maasserver/static/jslibs/yui/datatable-message/assets/skins/night/datatable-message.css (+0/-7)
src/maasserver/static/jslibs/yui/datatable-message/assets/skins/sam/datatable-message-skin.css (+0/-11)
src/maasserver/static/jslibs/yui/datatable-message/assets/skins/sam/datatable-message.css (+0/-7)
src/maasserver/static/jslibs/yui/datatable-message/datatable-message-debug.js (+0/-294)
src/maasserver/static/jslibs/yui/datatable-message/datatable-message-min.js (+0/-7)
src/maasserver/static/jslibs/yui/datatable-message/datatable-message.js (+0/-294)
src/maasserver/static/jslibs/yui/datatable-message/lang/datatable-message.js (+0/-7)
src/maasserver/static/jslibs/yui/datatable-message/lang/datatable-message_en.js (+0/-7)
src/maasserver/static/jslibs/yui/datatable-mutable/datatable-mutable-debug.js (+0/-641)
src/maasserver/static/jslibs/yui/datatable-mutable/datatable-mutable-min.js (+0/-7)
src/maasserver/static/jslibs/yui/datatable-mutable/datatable-mutable.js (+0/-636)
src/maasserver/static/jslibs/yui/datatable-scroll-deprecated/datatable-scroll-deprecated-debug.js (+0/-738)
src/maasserver/static/jslibs/yui/datatable-scroll-deprecated/datatable-scroll-deprecated-min.js (+0/-8)
src/maasserver/static/jslibs/yui/datatable-scroll-deprecated/datatable-scroll-deprecated.js (+0/-738)
src/maasserver/static/jslibs/yui/datatable-scroll/assets/datatable-scroll-core.css (+0/-77)
src/maasserver/static/jslibs/yui/datatable-scroll/assets/skins/night/datatable-scroll-skin.css (+0/-31)
src/maasserver/static/jslibs/yui/datatable-scroll/assets/skins/night/datatable-scroll.css (+0/-7)
src/maasserver/static/jslibs/yui/datatable-scroll/assets/skins/sam/datatable-scroll-skin.css (+0/-30)
src/maasserver/static/jslibs/yui/datatable-scroll/assets/skins/sam/datatable-scroll.css (+0/-7)
src/maasserver/static/jslibs/yui/datatable-scroll/datatable-scroll-debug.js (+0/-1391)
src/maasserver/static/jslibs/yui/datatable-scroll/datatable-scroll-min.js (+0/-9)
src/maasserver/static/jslibs/yui/datatable-scroll/datatable-scroll.js (+0/-1391)
src/maasserver/static/jslibs/yui/datatable-sort-deprecated/datatable-sort-deprecated-debug.js (+0/-371)
src/maasserver/static/jslibs/yui/datatable-sort-deprecated/datatable-sort-deprecated-min.js (+0/-7)
src/maasserver/static/jslibs/yui/datatable-sort-deprecated/datatable-sort-deprecated.js (+0/-371)
src/maasserver/static/jslibs/yui/datatable-sort-deprecated/lang/datatable-sort-deprecated.js (+0/-7)
src/maasserver/static/jslibs/yui/datatable-sort-deprecated/lang/datatable-sort-deprecated_en.js (+0/-7)
src/maasserver/static/jslibs/yui/datatable-sort/assets/datatable-sort-core.css (+0/-15)
src/maasserver/static/jslibs/yui/datatable-sort/assets/skins/night/datatable-sort-skin.css (+0/-91)
src/maasserver/static/jslibs/yui/datatable-sort/assets/skins/night/datatable-sort.css (+0/-7)
src/maasserver/static/jslibs/yui/datatable-sort/assets/skins/sam/datatable-sort-skin.css (+0/-49)
src/maasserver/static/jslibs/yui/datatable-sort/assets/skins/sam/datatable-sort.css (+0/-7)
src/maasserver/static/jslibs/yui/datatable-sort/datatable-sort-debug.js (+0/-904)
src/maasserver/static/jslibs/yui/datatable-sort/datatable-sort-min.js (+0/-7)
src/maasserver/static/jslibs/yui/datatable-sort/datatable-sort.js (+0/-904)
src/maasserver/static/jslibs/yui/datatable-sort/lang/datatable-sort.js (+0/-7)
src/maasserver/static/jslibs/yui/datatable-sort/lang/datatable-sort_en.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/datatype-date-format-debug.js (+0/-441)
src/maasserver/static/jslibs/yui/datatype-date-format/datatype-date-format-min.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/datatype-date-format.js (+0/-437)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_ar-JO.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_ar.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_ca-ES.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_ca.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_da-DK.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_da.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_de-AT.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_de-DE.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_de.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_el-GR.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_el.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_en-AU.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_en-CA.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_en-GB.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_en-IE.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_en-IN.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_en-JO.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_en-MY.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_en-NZ.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_en-PH.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_en-SG.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_en-US.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_en.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_es-AR.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_es-BO.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_es-CL.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_es-CO.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_es-EC.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_es-ES.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_es-MX.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_es-PE.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_es-PY.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_es-US.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_es-UY.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_es-VE.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_es.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_fi-FI.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_fi.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_fr-BE.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_fr-CA.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_fr-FR.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_fr.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_hi-IN.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_hi.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_id-ID.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_id.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_it-IT.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_it.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_ja-JP.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_ja.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_ko-KR.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_ko.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_ms-MY.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_ms.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_nb-NO.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_nb.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_nl-BE.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_nl-NL.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_nl.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_pl-PL.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_pl.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_pt-BR.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_pt.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_ro-RO.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_ro.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_ru-RU.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_ru.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_sv-SE.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_sv.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_th-TH.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_th.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_tr-TR.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_tr.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_vi-VN.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_vi.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_zh-Hans-CN.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_zh-Hans.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_zh-Hant-HK.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_zh-Hant-TW.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-format/lang/datatype-date-format_zh-Hant.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-math/datatype-date-math-debug.js (+0/-211)
src/maasserver/static/jslibs/yui/datatype-date-math/datatype-date-math-min.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-math/datatype-date-math.js (+0/-210)
src/maasserver/static/jslibs/yui/datatype-date-parse/datatype-date-parse-debug.js (+0/-52)
src/maasserver/static/jslibs/yui/datatype-date-parse/datatype-date-parse-min.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-date-parse/datatype-date-parse.js (+0/-51)
src/maasserver/static/jslibs/yui/datatype-number-format/datatype-number-format-debug.js (+0/-111)
src/maasserver/static/jslibs/yui/datatype-number-format/datatype-number-format-min.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-number-format/datatype-number-format.js (+0/-110)
src/maasserver/static/jslibs/yui/datatype-number-parse/datatype-number-parse-debug.js (+0/-44)
src/maasserver/static/jslibs/yui/datatype-number-parse/datatype-number-parse-min.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-number-parse/datatype-number-parse.js (+0/-43)
src/maasserver/static/jslibs/yui/datatype-xml-format/datatype-xml-format-debug.js (+0/-59)
src/maasserver/static/jslibs/yui/datatype-xml-format/datatype-xml-format-min.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-xml-format/datatype-xml-format.js (+0/-58)
src/maasserver/static/jslibs/yui/datatype-xml-parse/datatype-xml-parse-debug.js (+0/-62)
src/maasserver/static/jslibs/yui/datatype-xml-parse/datatype-xml-parse-min.js (+0/-7)
src/maasserver/static/jslibs/yui/datatype-xml-parse/datatype-xml-parse.js (+0/-60)
src/maasserver/static/jslibs/yui/dd-constrain/dd-constrain-debug.js (+0/-563)
src/maasserver/static/jslibs/yui/dd-constrain/dd-constrain-min.js (+0/-7)
src/maasserver/static/jslibs/yui/dd-constrain/dd-constrain.js (+0/-563)
src/maasserver/static/jslibs/yui/dd-ddm-base/dd-ddm-base-debug.js (+0/-360)
src/maasserver/static/jslibs/yui/dd-ddm-base/dd-ddm-base-min.js (+0/-7)
src/maasserver/static/jslibs/yui/dd-ddm-base/dd-ddm-base.js (+0/-360)
src/maasserver/static/jslibs/yui/dd-ddm-drop/dd-ddm-drop-debug.js (+0/-414)
src/maasserver/static/jslibs/yui/dd-ddm-drop/dd-ddm-drop-min.js (+0/-7)
src/maasserver/static/jslibs/yui/dd-ddm-drop/dd-ddm-drop.js (+0/-414)
src/maasserver/static/jslibs/yui/dd-ddm/dd-ddm-debug.js (+0/-130)
src/maasserver/static/jslibs/yui/dd-ddm/dd-ddm-min.js (+0/-7)
src/maasserver/static/jslibs/yui/dd-ddm/dd-ddm.js (+0/-130)
src/maasserver/static/jslibs/yui/dd-delegate/dd-delegate-debug.js (+0/-341)
src/maasserver/static/jslibs/yui/dd-delegate/dd-delegate-min.js (+0/-7)
src/maasserver/static/jslibs/yui/dd-delegate/dd-delegate.js (+0/-341)
src/maasserver/static/jslibs/yui/dd-drag/dd-drag-debug.js (+0/-1269)
src/maasserver/static/jslibs/yui/dd-drag/dd-drag-min.js (+0/-8)
src/maasserver/static/jslibs/yui/dd-drag/dd-drag.js (+0/-1266)
src/maasserver/static/jslibs/yui/dd-drop-plugin/dd-drop-plugin-debug.js (+0/-50)
src/maasserver/static/jslibs/yui/dd-drop-plugin/dd-drop-plugin-min.js (+0/-7)
src/maasserver/static/jslibs/yui/dd-drop-plugin/dd-drop-plugin.js (+0/-50)
src/maasserver/static/jslibs/yui/dd-drop/dd-drop-debug.js (+0/-564)
src/maasserver/static/jslibs/yui/dd-drop/dd-drop-min.js (+0/-7)
src/maasserver/static/jslibs/yui/dd-drop/dd-drop.js (+0/-563)
src/maasserver/static/jslibs/yui/dd-gestures/dd-gestures-debug.js (+0/-47)
src/maasserver/static/jslibs/yui/dd-gestures/dd-gestures-min.js (+0/-7)
src/maasserver/static/jslibs/yui/dd-gestures/dd-gestures.js (+0/-45)
src/maasserver/static/jslibs/yui/dd-plugin/dd-plugin-debug.js (+0/-211)
src/maasserver/static/jslibs/yui/dd-plugin/dd-plugin-min.js (+0/-7)
src/maasserver/static/jslibs/yui/dd-plugin/dd-plugin.js (+0/-206)
src/maasserver/static/jslibs/yui/dd-proxy/dd-proxy-debug.js (+0/-255)
src/maasserver/static/jslibs/yui/dd-proxy/dd-proxy-min.js (+0/-7)
src/maasserver/static/jslibs/yui/dd-proxy/dd-proxy.js (+0/-255)
src/maasserver/static/jslibs/yui/dd-scroll/dd-scroll-debug.js (+0/-425)
src/maasserver/static/jslibs/yui/dd-scroll/dd-scroll-min.js (+0/-7)
src/maasserver/static/jslibs/yui/dd-scroll/dd-scroll.js (+0/-425)
src/maasserver/static/jslibs/yui/dial/assets/dial-core.css (+0/-48)
src/maasserver/static/jslibs/yui/dial/assets/skins/night/dial-skin.css (+0/-95)
src/maasserver/static/jslibs/yui/dial/assets/skins/night/dial.css (+0/-7)
src/maasserver/static/jslibs/yui/dial/assets/skins/sam/dial-skin.css (+0/-81)
src/maasserver/static/jslibs/yui/dial/assets/skins/sam/dial.css (+0/-7)
src/maasserver/static/jslibs/yui/dial/dial-debug.js (+0/-1298)
src/maasserver/static/jslibs/yui/dial/dial-min.js (+0/-9)
src/maasserver/static/jslibs/yui/dial/dial.js (+0/-1298)
src/maasserver/static/jslibs/yui/dial/lang/dial.js (+0/-7)
src/maasserver/static/jslibs/yui/dial/lang/dial_en.js (+0/-7)
src/maasserver/static/jslibs/yui/dial/lang/dial_es.js (+0/-7)
src/maasserver/static/jslibs/yui/dom-attrs/dom-attrs-debug.js (+0/-214)
src/maasserver/static/jslibs/yui/dom-attrs/dom-attrs-min.js (+0/-7)
src/maasserver/static/jslibs/yui/dom-attrs/dom-attrs.js (+0/-211)
src/maasserver/static/jslibs/yui/dom-base/dom-base-debug.js (+0/-694)
src/maasserver/static/jslibs/yui/dom-base/dom-base-min.js (+0/-8)
src/maasserver/static/jslibs/yui/dom-base/dom-base.js (+0/-690)
src/maasserver/static/jslibs/yui/dom-class/dom-class-debug.js (+0/-98)
src/maasserver/static/jslibs/yui/dom-class/dom-class-min.js (+0/-7)
src/maasserver/static/jslibs/yui/dom-class/dom-class.js (+0/-97)
src/maasserver/static/jslibs/yui/dom-core/dom-core-debug.js (+0/-379)
src/maasserver/static/jslibs/yui/dom-core/dom-core-min.js (+0/-7)
src/maasserver/static/jslibs/yui/dom-core/dom-core.js (+0/-379)
src/maasserver/static/jslibs/yui/dom-create/dom-create-debug.js (+0/-285)
src/maasserver/static/jslibs/yui/dom-create/dom-create-min.js (+0/-7)
src/maasserver/static/jslibs/yui/dom-create/dom-create.js (+0/-284)
src/maasserver/static/jslibs/yui/dom-deprecated/dom-deprecated-debug.js (+0/-67)
src/maasserver/static/jslibs/yui/dom-deprecated/dom-deprecated-min.js (+0/-7)
src/maasserver/static/jslibs/yui/dom-deprecated/dom-deprecated.js (+0/-67)
src/maasserver/static/jslibs/yui/dom-screen/dom-screen-debug.js (+0/-617)
src/maasserver/static/jslibs/yui/dom-screen/dom-screen-min.js (+0/-7)
src/maasserver/static/jslibs/yui/dom-screen/dom-screen.js (+0/-611)
src/maasserver/static/jslibs/yui/dom-size/dom-size-debug.js (+0/-54)
src/maasserver/static/jslibs/yui/dom-size/dom-size-min.js (+0/-7)
src/maasserver/static/jslibs/yui/dom-size/dom-size.js (+0/-54)
src/maasserver/static/jslibs/yui/dom-style-ie/dom-style-ie-debug.js (+0/-312)
src/maasserver/static/jslibs/yui/dom-style-ie/dom-style-ie-min.js (+0/-7)
src/maasserver/static/jslibs/yui/dom-style-ie/dom-style-ie.js (+0/-309)
src/maasserver/static/jslibs/yui/dom-style/dom-style-debug.js (+0/-333)
src/maasserver/static/jslibs/yui/dom-style/dom-style-min.js (+0/-7)
src/maasserver/static/jslibs/yui/dom-style/dom-style.js (+0/-333)
src/maasserver/static/jslibs/yui/dump/dump-debug.js (+0/-111)
src/maasserver/static/jslibs/yui/dump/dump-min.js (+0/-7)
src/maasserver/static/jslibs/yui/dump/dump.js (+0/-111)
src/maasserver/static/jslibs/yui/editor-base/editor-base-debug.js (+0/-914)
src/maasserver/static/jslibs/yui/editor-base/editor-base-min.js (+0/-8)
src/maasserver/static/jslibs/yui/editor-base/editor-base.js (+0/-910)
src/maasserver/static/jslibs/yui/editor-bidi/editor-bidi-debug.js (+0/-342)
src/maasserver/static/jslibs/yui/editor-bidi/editor-bidi-min.js (+0/-7)
src/maasserver/static/jslibs/yui/editor-bidi/editor-bidi.js (+0/-342)
src/maasserver/static/jslibs/yui/editor-br/editor-br-debug.js (+0/-137)
src/maasserver/static/jslibs/yui/editor-br/editor-br-min.js (+0/-7)
src/maasserver/static/jslibs/yui/editor-br/editor-br.js (+0/-137)
src/maasserver/static/jslibs/yui/editor-lists/editor-lists-debug.js (+0/-131)
src/maasserver/static/jslibs/yui/editor-lists/editor-lists-min.js (+0/-7)
src/maasserver/static/jslibs/yui/editor-lists/editor-lists.js (+0/-126)
src/maasserver/static/jslibs/yui/editor-para-base/editor-para-base-debug.js (+0/-130)
src/maasserver/static/jslibs/yui/editor-para-base/editor-para-base-min.js (+0/-7)
src/maasserver/static/jslibs/yui/editor-para-base/editor-para-base.js (+0/-129)
src/maasserver/static/jslibs/yui/editor-para-ie/editor-para-ie-debug.js (+0/-131)
src/maasserver/static/jslibs/yui/editor-para-ie/editor-para-ie-min.js (+0/-7)
src/maasserver/static/jslibs/yui/editor-para-ie/editor-para-ie.js (+0/-131)
src/maasserver/static/jslibs/yui/editor-para/editor-para-debug.js (+0/-306)
src/maasserver/static/jslibs/yui/editor-para/editor-para-min.js (+0/-7)
src/maasserver/static/jslibs/yui/editor-para/editor-para.js (+0/-305)
src/maasserver/static/jslibs/yui/editor-selection/editor-selection-debug.js (+0/-1028)
src/maasserver/static/jslibs/yui/editor-selection/editor-selection-min.js (+0/-8)
src/maasserver/static/jslibs/yui/editor-selection/editor-selection.js (+0/-1007)
src/maasserver/static/jslibs/yui/editor-tab/editor-tab-debug.js (+0/-75)
src/maasserver/static/jslibs/yui/editor-tab/editor-tab-min.js (+0/-7)
src/maasserver/static/jslibs/yui/editor-tab/editor-tab.js (+0/-74)
src/maasserver/static/jslibs/yui/escape/escape-debug.js (+0/-98)
src/maasserver/static/jslibs/yui/escape/escape-min.js (+0/-7)
src/maasserver/static/jslibs/yui/escape/escape.js (+0/-98)
src/maasserver/static/jslibs/yui/event-base-ie/event-base-ie-debug.js (+0/-309)
src/maasserver/static/jslibs/yui/event-base-ie/event-base-ie-min.js (+0/-9)
src/maasserver/static/jslibs/yui/event-base-ie/event-base-ie.js (+0/-309)
src/maasserver/static/jslibs/yui/event-base/event-base-debug.js (+0/-1383)
src/maasserver/static/jslibs/yui/event-base/event-base-min.js (+0/-8)
src/maasserver/static/jslibs/yui/event-base/event-base.js (+0/-1372)
src/maasserver/static/jslibs/yui/event-contextmenu/event-contextmenu-debug.js (+0/-191)
src/maasserver/static/jslibs/yui/event-contextmenu/event-contextmenu-min.js (+0/-7)
src/maasserver/static/jslibs/yui/event-contextmenu/event-contextmenu.js (+0/-191)
src/maasserver/static/jslibs/yui/event-custom-base/event-custom-base-debug.js (+0/-2220)
src/maasserver/static/jslibs/yui/event-custom-base/event-custom-base-min.js (+0/-9)
src/maasserver/static/jslibs/yui/event-custom-base/event-custom-base.js (+0/-2206)
src/maasserver/static/jslibs/yui/event-custom-complex/event-custom-complex-debug.js (+0/-505)
src/maasserver/static/jslibs/yui/event-custom-complex/event-custom-complex-min.js (+0/-7)
src/maasserver/static/jslibs/yui/event-custom-complex/event-custom-complex.js (+0/-504)
src/maasserver/static/jslibs/yui/event-delegate/event-delegate-debug.js (+0/-329)
src/maasserver/static/jslibs/yui/event-delegate/event-delegate-min.js (+0/-7)
src/maasserver/static/jslibs/yui/event-delegate/event-delegate.js (+0/-328)
src/maasserver/static/jslibs/yui/event-flick/event-flick-debug.js (+0/-270)
src/maasserver/static/jslibs/yui/event-flick/event-flick-min.js (+0/-7)
src/maasserver/static/jslibs/yui/event-flick/event-flick.js (+0/-270)
src/maasserver/static/jslibs/yui/event-focus/event-focus-debug.js (+0/-246)
src/maasserver/static/jslibs/yui/event-focus/event-focus-min.js (+0/-7)
src/maasserver/static/jslibs/yui/event-focus/event-focus.js (+0/-246)
src/maasserver/static/jslibs/yui/event-hover/event-hover-debug.js (+0/-76)
src/maasserver/static/jslibs/yui/event-hover/event-hover-min.js (+0/-7)
src/maasserver/static/jslibs/yui/event-hover/event-hover.js (+0/-76)
src/maasserver/static/jslibs/yui/event-key/event-key-debug.js (+0/-177)
src/maasserver/static/jslibs/yui/event-key/event-key-min.js (+0/-7)
src/maasserver/static/jslibs/yui/event-key/event-key.js (+0/-177)
src/maasserver/static/jslibs/yui/event-mouseenter/event-mouseenter-debug.js (+0/-135)
src/maasserver/static/jslibs/yui/event-mouseenter/event-mouseenter-min.js (+0/-7)
src/maasserver/static/jslibs/yui/event-mouseenter/event-mouseenter.js (+0/-135)
src/maasserver/static/jslibs/yui/event-mousewheel/event-mousewheel-debug.js (+0/-56)
src/maasserver/static/jslibs/yui/event-mousewheel/event-mousewheel-min.js (+0/-7)
src/maasserver/static/jslibs/yui/event-mousewheel/event-mousewheel.js (+0/-56)
src/maasserver/static/jslibs/yui/event-move/event-move-debug.js (+0/-523)
src/maasserver/static/jslibs/yui/event-move/event-move-min.js (+0/-7)
src/maasserver/static/jslibs/yui/event-move/event-move.js (+0/-513)
src/maasserver/static/jslibs/yui/event-outside/event-outside-debug.js (+0/-106)
src/maasserver/static/jslibs/yui/event-outside/event-outside-min.js (+0/-7)
src/maasserver/static/jslibs/yui/event-outside/event-outside.js (+0/-106)
src/maasserver/static/jslibs/yui/event-resize/event-resize-debug.js (+0/-59)
src/maasserver/static/jslibs/yui/event-resize/event-resize-min.js (+0/-7)
src/maasserver/static/jslibs/yui/event-resize/event-resize.js (+0/-59)
src/maasserver/static/jslibs/yui/event-simulate/event-simulate-debug.js (+0/-615)
src/maasserver/static/jslibs/yui/event-simulate/event-simulate-min.js (+0/-7)
src/maasserver/static/jslibs/yui/event-simulate/event-simulate.js (+0/-615)
src/maasserver/static/jslibs/yui/event-synthetic/event-synthetic-debug.js (+0/-834)
src/maasserver/static/jslibs/yui/event-synthetic/event-synthetic-min.js (+0/-7)
src/maasserver/static/jslibs/yui/event-synthetic/event-synthetic.js (+0/-834)
src/maasserver/static/jslibs/yui/event-touch/event-touch-debug.js (+0/-133)
src/maasserver/static/jslibs/yui/event-touch/event-touch-min.js (+0/-7)
src/maasserver/static/jslibs/yui/event-touch/event-touch.js (+0/-127)
src/maasserver/static/jslibs/yui/event-valuechange/event-valuechange-debug.js (+0/-481)
src/maasserver/static/jslibs/yui/event-valuechange/event-valuechange-min.js (+0/-7)
src/maasserver/static/jslibs/yui/event-valuechange/event-valuechange.js (+0/-467)
src/maasserver/static/jslibs/yui/exec-command/exec-command-debug.js (+0/-718)
src/maasserver/static/jslibs/yui/exec-command/exec-command-min.js (+0/-8)
src/maasserver/static/jslibs/yui/exec-command/exec-command.js (+0/-714)
src/maasserver/static/jslibs/yui/features/features-debug.js (+0/-341)
src/maasserver/static/jslibs/yui/features/features-min.js (+0/-7)
src/maasserver/static/jslibs/yui/features/features.js (+0/-340)
src/maasserver/static/jslibs/yui/file-flash/file-flash-debug.js (+0/-342)
src/maasserver/static/jslibs/yui/file-flash/file-flash-min.js (+0/-7)
src/maasserver/static/jslibs/yui/file-flash/file-flash.js (+0/-342)
src/maasserver/static/jslibs/yui/file-html5/file-html5-debug.js (+0/-450)
src/maasserver/static/jslibs/yui/file-html5/file-html5-min.js (+0/-7)
src/maasserver/static/jslibs/yui/file-html5/file-html5.js (+0/-450)
src/maasserver/static/jslibs/yui/file/file-debug.js (+0/-37)
src/maasserver/static/jslibs/yui/file/file-min.js (+0/-7)
src/maasserver/static/jslibs/yui/file/file.js (+0/-37)
src/maasserver/static/jslibs/yui/frame/frame-debug.js (+0/-1037)
src/maasserver/static/jslibs/yui/frame/frame-min.js (+0/-8)
src/maasserver/static/jslibs/yui/frame/frame.js (+0/-1008)
src/maasserver/static/jslibs/yui/get-nodejs/get-debug.js (+0/-208)
src/maasserver/static/jslibs/yui/get-nodejs/get-min.js (+0/-7)
src/maasserver/static/jslibs/yui/get-nodejs/get-nodejs-debug.js (+0/-105)
src/maasserver/static/jslibs/yui/get-nodejs/get-nodejs-min.js (+0/-7)
src/maasserver/static/jslibs/yui/get-nodejs/get-nodejs.js (+0/-97)
src/maasserver/static/jslibs/yui/get-nodejs/get.js (+0/-198)
src/maasserver/static/jslibs/yui/get/get-debug.js (+0/-1274)
src/maasserver/static/jslibs/yui/get/get-min.js (+0/-8)
src/maasserver/static/jslibs/yui/get/get.js (+0/-1257)
src/maasserver/static/jslibs/yui/graphics-canvas-default/graphics-canvas-default-debug.js (+0/-18)
src/maasserver/static/jslibs/yui/graphics-canvas-default/graphics-canvas-default-min.js (+0/-7)
src/maasserver/static/jslibs/yui/graphics-canvas-default/graphics-canvas-default.js (+0/-18)
src/maasserver/static/jslibs/yui/graphics-canvas/graphics-canvas-debug.js (+0/-2963)
src/maasserver/static/jslibs/yui/graphics-canvas/graphics-canvas-min.js (+0/-10)
src/maasserver/static/jslibs/yui/graphics-canvas/graphics-canvas.js (+0/-2963)
src/maasserver/static/jslibs/yui/graphics-svg-default/graphics-svg-default-debug.js (+0/-18)
src/maasserver/static/jslibs/yui/graphics-svg-default/graphics-svg-default-min.js (+0/-7)
src/maasserver/static/jslibs/yui/graphics-svg-default/graphics-svg-default.js (+0/-18)
src/maasserver/static/jslibs/yui/graphics-svg/graphics-svg-debug.js (+0/-2861)
src/maasserver/static/jslibs/yui/graphics-svg/graphics-svg-min.js (+0/-10)
src/maasserver/static/jslibs/yui/graphics-svg/graphics-svg.js (+0/-2861)
src/maasserver/static/jslibs/yui/graphics-vml-default/graphics-vml-default-debug.js (+0/-18)
src/maasserver/static/jslibs/yui/graphics-vml-default/graphics-vml-default-min.js (+0/-7)
src/maasserver/static/jslibs/yui/graphics-vml-default/graphics-vml-default.js (+0/-18)
src/maasserver/static/jslibs/yui/graphics-vml/graphics-vml-debug.js (+0/-2872)
src/maasserver/static/jslibs/yui/graphics-vml/graphics-vml-min.js (+0/-10)
src/maasserver/static/jslibs/yui/graphics-vml/graphics-vml.js (+0/-2871)
src/maasserver/static/jslibs/yui/graphics/graphics-debug.js (+0/-1133)
src/maasserver/static/jslibs/yui/graphics/graphics-min.js (+0/-7)
src/maasserver/static/jslibs/yui/graphics/graphics.js (+0/-1133)
src/maasserver/static/jslibs/yui/handlebars-base/handlebars-base-debug.js (+0/-359)
src/maasserver/static/jslibs/yui/handlebars-base/handlebars-base-min.js (+0/-12)
src/maasserver/static/jslibs/yui/handlebars-base/handlebars-base.js (+0/-359)
src/maasserver/static/jslibs/yui/handlebars-compiler/handlebars-compiler-debug.js (+0/-1531)
src/maasserver/static/jslibs/yui/handlebars-compiler/handlebars-compiler-min.js (+0/-16)
src/maasserver/static/jslibs/yui/handlebars-compiler/handlebars-compiler.js (+0/-1531)
src/maasserver/static/jslibs/yui/highlight-accentfold/highlight-accentfold-debug.js (+0/-150)
src/maasserver/static/jslibs/yui/highlight-accentfold/highlight-accentfold-min.js (+0/-7)
src/maasserver/static/jslibs/yui/highlight-accentfold/highlight-accentfold.js (+0/-150)
src/maasserver/static/jslibs/yui/highlight-base/highlight-base-debug.js (+0/-318)
src/maasserver/static/jslibs/yui/highlight-base/highlight-base-min.js (+0/-7)
src/maasserver/static/jslibs/yui/highlight-base/highlight-base.js (+0/-318)
src/maasserver/static/jslibs/yui/history-base/history-base-debug.js (+0/-646)
src/maasserver/static/jslibs/yui/history-base/history-base-min.js (+0/-7)
src/maasserver/static/jslibs/yui/history-base/history-base.js (+0/-646)
src/maasserver/static/jslibs/yui/history-hash-ie/history-hash-ie-debug.js (+0/-144)
src/maasserver/static/jslibs/yui/history-hash-ie/history-hash-ie-min.js (+0/-7)
src/maasserver/static/jslibs/yui/history-hash-ie/history-hash-ie.js (+0/-140)
src/maasserver/static/jslibs/yui/history-hash/history-hash-debug.js (+0/-470)
src/maasserver/static/jslibs/yui/history-hash/history-hash-min.js (+0/-7)
src/maasserver/static/jslibs/yui/history-hash/history-hash.js (+0/-470)
src/maasserver/static/jslibs/yui/history-html5/history-html5-debug.js (+0/-184)
src/maasserver/static/jslibs/yui/history-html5/history-html5-min.js (+0/-7)
src/maasserver/static/jslibs/yui/history-html5/history-html5.js (+0/-184)
src/maasserver/static/jslibs/yui/imageloader/imageloader-debug.js (+0/-671)
src/maasserver/static/jslibs/yui/imageloader/imageloader-min.js (+0/-7)
src/maasserver/static/jslibs/yui/imageloader/imageloader.js (+0/-659)
src/maasserver/static/jslibs/yui/intl-base/intl-base-debug.js (+0/-94)
src/maasserver/static/jslibs/yui/intl-base/intl-base-min.js (+0/-7)
src/maasserver/static/jslibs/yui/intl-base/intl-base.js (+0/-94)
src/maasserver/static/jslibs/yui/intl/intl-debug.js (+0/-156)
src/maasserver/static/jslibs/yui/intl/intl-min.js (+0/-7)
src/maasserver/static/jslibs/yui/intl/intl.js (+0/-156)
src/maasserver/static/jslibs/yui/io-base/io-base-debug.js (+0/-1001)
src/maasserver/static/jslibs/yui/io-base/io-base-min.js (+0/-7)
src/maasserver/static/jslibs/yui/io-base/io-base.js (+0/-997)
src/maasserver/static/jslibs/yui/io-form/io-form-debug.js (+0/-102)
src/maasserver/static/jslibs/yui/io-form/io-form-min.js (+0/-7)
src/maasserver/static/jslibs/yui/io-form/io-form.js (+0/-101)
src/maasserver/static/jslibs/yui/io-nodejs/io-nodejs-debug.js (+0/-142)
src/maasserver/static/jslibs/yui/io-nodejs/io-nodejs-min.js (+0/-7)
src/maasserver/static/jslibs/yui/io-nodejs/io-nodejs.js (+0/-135)
src/maasserver/static/jslibs/yui/io-queue/io-queue-debug.js (+0/-165)
src/maasserver/static/jslibs/yui/io-queue/io-queue-min.js (+0/-7)
src/maasserver/static/jslibs/yui/io-queue/io-queue.js (+0/-162)
src/maasserver/static/jslibs/yui/io-upload-iframe/io-upload-iframe-debug.js (+0/-297)
src/maasserver/static/jslibs/yui/io-upload-iframe/io-upload-iframe-min.js (+0/-7)
src/maasserver/static/jslibs/yui/io-upload-iframe/io-upload-iframe.js (+0/-289)
src/maasserver/static/jslibs/yui/io-xdr/io-xdr-debug.js (+0/-318)
src/maasserver/static/jslibs/yui/io-xdr/io-xdr-min.js (+0/-7)
src/maasserver/static/jslibs/yui/io-xdr/io-xdr.js (+0/-318)
src/maasserver/static/jslibs/yui/json-parse/json-parse-debug.js (+0/-236)
src/maasserver/static/jslibs/yui/json-parse/json-parse-min.js (+0/-7)
src/maasserver/static/jslibs/yui/json-parse/json-parse.js (+0/-236)
src/maasserver/static/jslibs/yui/json-stringify/json-stringify-debug.js (+0/-354)
src/maasserver/static/jslibs/yui/json-stringify/json-stringify-min.js (+0/-7)
src/maasserver/static/jslibs/yui/json-stringify/json-stringify.js (+0/-354)
src/maasserver/static/jslibs/yui/jsonp-url/jsonp-url-debug.js (+0/-132)
src/maasserver/static/jslibs/yui/jsonp-url/jsonp-url-min.js (+0/-7)
src/maasserver/static/jslibs/yui/jsonp-url/jsonp-url.js (+0/-132)
src/maasserver/static/jslibs/yui/jsonp/jsonp-debug.js (+0/-258)
src/maasserver/static/jslibs/yui/jsonp/jsonp-min.js (+0/-7)
src/maasserver/static/jslibs/yui/jsonp/jsonp.js (+0/-253)
src/maasserver/static/jslibs/yui/loader-base/loader-base-debug.js (+0/-2567)
src/maasserver/static/jslibs/yui/loader-base/loader-base-min.js (+0/-10)
src/maasserver/static/jslibs/yui/loader-base/loader-base.js (+0/-2529)
src/maasserver/static/jslibs/yui/loader-rollup/loader-rollup-debug.js (+0/-108)
src/maasserver/static/jslibs/yui/loader-rollup/loader-rollup-min.js (+0/-7)
src/maasserver/static/jslibs/yui/loader-rollup/loader-rollup.js (+0/-105)
src/maasserver/static/jslibs/yui/loader-yui3/loader-yui3-debug.js (+0/-2442)
src/maasserver/static/jslibs/yui/loader-yui3/loader-yui3-min.js (+0/-10)
src/maasserver/static/jslibs/yui/loader-yui3/loader-yui3.js (+0/-2442)
src/maasserver/static/jslibs/yui/loader/loader-debug.js (+0/-5109)
src/maasserver/static/jslibs/yui/loader/loader-min.js (+0/-13)
src/maasserver/static/jslibs/yui/loader/loader.js (+0/-5068)
src/maasserver/static/jslibs/yui/matrix/matrix-debug.js (+0/-924)
src/maasserver/static/jslibs/yui/matrix/matrix-min.js (+0/-8)
src/maasserver/static/jslibs/yui/matrix/matrix.js (+0/-924)
src/maasserver/static/jslibs/yui/model-list/model-list-debug.js (+0/-1090)
src/maasserver/static/jslibs/yui/model-list/model-list-min.js (+0/-7)
src/maasserver/static/jslibs/yui/model-list/model-list.js (+0/-1090)
src/maasserver/static/jslibs/yui/model/model-debug.js (+0/-975)
src/maasserver/static/jslibs/yui/model/model-min.js (+0/-7)
src/maasserver/static/jslibs/yui/model/model.js (+0/-973)
src/maasserver/static/jslibs/yui/node-base/node-base-debug.js (+0/-1143)
src/maasserver/static/jslibs/yui/node-base/node-base-min.js (+0/-8)
src/maasserver/static/jslibs/yui/node-base/node-base.js (+0/-1141)
src/maasserver/static/jslibs/yui/node-core/node-core-debug.js (+0/-1596)
src/maasserver/static/jslibs/yui/node-core/node-core-min.js (+0/-8)
src/maasserver/static/jslibs/yui/node-core/node-core.js (+0/-1592)
src/maasserver/static/jslibs/yui/node-deprecated/node-deprecated-debug.js (+0/-131)
src/maasserver/static/jslibs/yui/node-deprecated/node-deprecated-min.js (+0/-7)
src/maasserver/static/jslibs/yui/node-deprecated/node-deprecated.js (+0/-125)
src/maasserver/static/jslibs/yui/node-event-delegate/node-event-delegate-debug.js (+0/-60)
src/maasserver/static/jslibs/yui/node-event-delegate/node-event-delegate-min.js (+0/-7)
src/maasserver/static/jslibs/yui/node-event-delegate/node-event-delegate.js (+0/-60)
src/maasserver/static/jslibs/yui/node-event-html5/node-event-html5-debug.js (+0/-58)
src/maasserver/static/jslibs/yui/node-event-html5/node-event-html5-min.js (+0/-7)
src/maasserver/static/jslibs/yui/node-event-html5/node-event-html5.js (+0/-58)
src/maasserver/static/jslibs/yui/node-event-simulate/node-event-simulate-debug.js (+0/-29)
src/maasserver/static/jslibs/yui/node-event-simulate/node-event-simulate-min.js (+0/-7)
src/maasserver/static/jslibs/yui/node-event-simulate/node-event-simulate.js (+0/-29)
src/maasserver/static/jslibs/yui/node-flick/assets/node-flick-core.css (+0/-14)
src/maasserver/static/jslibs/yui/node-flick/assets/skins/sam/node-flick-skin.css (+0/-7)
src/maasserver/static/jslibs/yui/node-flick/assets/skins/sam/node-flick.css (+0/-7)
src/maasserver/static/jslibs/yui/node-flick/node-flick-debug.js (+0/-530)
src/maasserver/static/jslibs/yui/node-flick/node-flick-min.js (+0/-7)
src/maasserver/static/jslibs/yui/node-flick/node-flick.js (+0/-529)
src/maasserver/static/jslibs/yui/node-focusmanager/node-focusmanager-debug.js (+0/-1075)
src/maasserver/static/jslibs/yui/node-focusmanager/node-focusmanager-min.js (+0/-7)
src/maasserver/static/jslibs/yui/node-focusmanager/node-focusmanager.js (+0/-1072)
src/maasserver/static/jslibs/yui/node-load/node-load-debug.js (+0/-71)
src/maasserver/static/jslibs/yui/node-load/node-load-min.js (+0/-7)
src/maasserver/static/jslibs/yui/node-load/node-load.js (+0/-71)
src/maasserver/static/jslibs/yui/node-menunav/assets/node-menunav-core.css (+0/-175)
src/maasserver/static/jslibs/yui/node-menunav/assets/skins/night/node-menunav-skin.css (+0/-318)
src/maasserver/static/jslibs/yui/node-menunav/assets/skins/night/node-menunav.css (+0/-7)
src/maasserver/static/jslibs/yui/node-menunav/assets/skins/sam/node-menunav-skin.css (+0/-272)
src/maasserver/static/jslibs/yui/node-menunav/assets/skins/sam/node-menunav.css (+0/-7)
src/maasserver/static/jslibs/yui/node-menunav/node-menunav-debug.js (+0/-2190)
src/maasserver/static/jslibs/yui/node-menunav/node-menunav-min.js (+0/-9)
src/maasserver/static/jslibs/yui/node-menunav/node-menunav.js (+0/-2190)
src/maasserver/static/jslibs/yui/node-pluginhost/node-pluginhost-debug.js (+0/-65)
src/maasserver/static/jslibs/yui/node-pluginhost/node-pluginhost-min.js (+0/-7)
src/maasserver/static/jslibs/yui/node-pluginhost/node-pluginhost.js (+0/-65)
src/maasserver/static/jslibs/yui/node-screen/node-screen-debug.js (+0/-246)
src/maasserver/static/jslibs/yui/node-screen/node-screen-min.js (+0/-7)
src/maasserver/static/jslibs/yui/node-screen/node-screen.js (+0/-244)
src/maasserver/static/jslibs/yui/node-style/node-style-debug.js (+0/-112)
src/maasserver/static/jslibs/yui/node-style/node-style-min.js (+0/-7)
src/maasserver/static/jslibs/yui/node-style/node-style.js (+0/-112)
src/maasserver/static/jslibs/yui/oop/oop-debug.js (+0/-396)
src/maasserver/static/jslibs/yui/oop/oop-min.js (+0/-7)
src/maasserver/static/jslibs/yui/oop/oop.js (+0/-396)
src/maasserver/static/jslibs/yui/overlay/assets/overlay-core.css (+0/-17)
src/maasserver/static/jslibs/yui/overlay/assets/skins/night/overlay-skin.css (+0/-179)
src/maasserver/static/jslibs/yui/overlay/assets/skins/night/overlay.css (+0/-7)
src/maasserver/static/jslibs/yui/overlay/assets/skins/sam/overlay-skin.css (+0/-6)
src/maasserver/static/jslibs/yui/overlay/assets/skins/sam/overlay.css (+0/-7)
src/maasserver/static/jslibs/yui/overlay/overlay-debug.js (+0/-35)
src/maasserver/static/jslibs/yui/overlay/overlay-min.js (+0/-7)
src/maasserver/static/jslibs/yui/overlay/overlay.js (+0/-35)
src/maasserver/static/jslibs/yui/panel/assets/panel-core.css (+0/-28)
src/maasserver/static/jslibs/yui/panel/assets/skins/night/panel-skin.css (+0/-129)
src/maasserver/static/jslibs/yui/panel/assets/skins/night/panel.css (+0/-7)
src/maasserver/static/jslibs/yui/panel/assets/skins/sam/panel-skin.css (+0/-101)
src/maasserver/static/jslibs/yui/panel/assets/skins/sam/panel.css (+0/-7)
src/maasserver/static/jslibs/yui/panel/panel-debug.js (+0/-105)
src/maasserver/static/jslibs/yui/panel/panel-min.js (+0/-7)
src/maasserver/static/jslibs/yui/panel/panel.js (+0/-105)
src/maasserver/static/jslibs/yui/parallel/parallel-debug.js (+0/-110)
src/maasserver/static/jslibs/yui/parallel/parallel-min.js (+0/-7)
src/maasserver/static/jslibs/yui/parallel/parallel.js (+0/-108)
src/maasserver/static/jslibs/yui/pjax-base/pjax-base-debug.js (+0/-517)
src/maasserver/static/jslibs/yui/pjax-base/pjax-base-min.js (+0/-7)
src/maasserver/static/jslibs/yui/pjax-base/pjax-base.js (+0/-517)
src/maasserver/static/jslibs/yui/pjax-plugin/pjax-plugin-debug.js (+0/-35)
src/maasserver/static/jslibs/yui/pjax-plugin/pjax-plugin-min.js (+0/-7)
src/maasserver/static/jslibs/yui/pjax-plugin/pjax-plugin.js (+0/-35)
src/maasserver/static/jslibs/yui/pjax/pjax-debug.js (+0/-340)
src/maasserver/static/jslibs/yui/pjax/pjax-min.js (+0/-7)
src/maasserver/static/jslibs/yui/pjax/pjax.js (+0/-340)
src/maasserver/static/jslibs/yui/plugin/plugin-debug.js (+0/-235)
src/maasserver/static/jslibs/yui/plugin/plugin-min.js (+0/-7)
src/maasserver/static/jslibs/yui/plugin/plugin.js (+0/-233)
src/maasserver/static/jslibs/yui/pluginhost-base/pluginhost-base-debug.js (+0/-184)
src/maasserver/static/jslibs/yui/pluginhost-base/pluginhost-base-min.js (+0/-7)
src/maasserver/static/jslibs/yui/pluginhost-base/pluginhost-base.js (+0/-183)
src/maasserver/static/jslibs/yui/pluginhost-config/pluginhost-config-debug.js (+0/-136)
src/maasserver/static/jslibs/yui/pluginhost-config/pluginhost-config-min.js (+0/-7)
src/maasserver/static/jslibs/yui/pluginhost-config/pluginhost-config.js (+0/-136)
src/maasserver/static/jslibs/yui/profiler/profiler-debug.js (+0/-553)
src/maasserver/static/jslibs/yui/profiler/profiler-min.js (+0/-7)
src/maasserver/static/jslibs/yui/profiler/profiler.js (+0/-553)
src/maasserver/static/jslibs/yui/querystring-parse-simple/querystring-parse-simple-debug.js (+0/-85)
src/maasserver/static/jslibs/yui/querystring-parse-simple/querystring-parse-simple-min.js (+0/-7)
src/maasserver/static/jslibs/yui/querystring-parse-simple/querystring-parse-simple.js (+0/-85)
src/maasserver/static/jslibs/yui/querystring-parse/querystring-parse-debug.js (+0/-165)
src/maasserver/static/jslibs/yui/querystring-parse/querystring-parse-min.js (+0/-7)
src/maasserver/static/jslibs/yui/querystring-parse/querystring-parse.js (+0/-165)
src/maasserver/static/jslibs/yui/querystring-stringify-simple/querystring-stringify-simple-debug.js (+0/-67)
src/maasserver/static/jslibs/yui/querystring-stringify-simple/querystring-stringify-simple-min.js (+0/-7)
src/maasserver/static/jslibs/yui/querystring-stringify-simple/querystring-stringify-simple.js (+0/-67)
src/maasserver/static/jslibs/yui/querystring-stringify/querystring-stringify-debug.js (+0/-118)
src/maasserver/static/jslibs/yui/querystring-stringify/querystring-stringify-min.js (+0/-7)
src/maasserver/static/jslibs/yui/querystring-stringify/querystring-stringify.js (+0/-113)
src/maasserver/static/jslibs/yui/queue-promote/queue-promote-debug.js (+0/-59)
src/maasserver/static/jslibs/yui/queue-promote/queue-promote-min.js (+0/-7)
src/maasserver/static/jslibs/yui/queue-promote/queue-promote.js (+0/-59)
src/maasserver/static/jslibs/yui/range-slider/assets/slider-base-core.css (+0/-37)
src/maasserver/static/jslibs/yui/range-slider/assets/slider-core.css (+0/-37)
src/maasserver/static/jslibs/yui/range-slider/range-slider-debug.js (+0/-35)
src/maasserver/static/jslibs/yui/range-slider/range-slider-min.js (+0/-7)
src/maasserver/static/jslibs/yui/range-slider/range-slider.js (+0/-35)
src/maasserver/static/jslibs/yui/recordset-base/recordset-base-debug.js (+0/-657)
src/maasserver/static/jslibs/yui/recordset-base/recordset-base-min.js (+0/-7)
src/maasserver/static/jslibs/yui/recordset-base/recordset-base.js (+0/-656)
src/maasserver/static/jslibs/yui/recordset-filter/recordset-filter-debug.js (+0/-111)
src/maasserver/static/jslibs/yui/recordset-filter/recordset-filter-min.js (+0/-7)
src/maasserver/static/jslibs/yui/recordset-filter/recordset-filter.js (+0/-111)
src/maasserver/static/jslibs/yui/recordset-indexer/recordset-indexer-debug.js (+0/-233)
src/maasserver/static/jslibs/yui/recordset-indexer/recordset-indexer-min.js (+0/-7)
src/maasserver/static/jslibs/yui/recordset-indexer/recordset-indexer.js (+0/-233)
src/maasserver/static/jslibs/yui/recordset-sort/recordset-sort-debug.js (+0/-212)
src/maasserver/static/jslibs/yui/recordset-sort/recordset-sort-min.js (+0/-7)
src/maasserver/static/jslibs/yui/recordset-sort/recordset-sort.js (+0/-211)
src/maasserver/static/jslibs/yui/resize-base/assets/resize-base-core.css (+0/-129)
src/maasserver/static/jslibs/yui/resize-base/assets/skins/night/resize-base-skin.css (+0/-52)
src/maasserver/static/jslibs/yui/resize-base/assets/skins/night/resize-base.css (+0/-7)
src/maasserver/static/jslibs/yui/resize-base/assets/skins/sam/resize-base-skin.css (+0/-52)
src/maasserver/static/jslibs/yui/resize-base/assets/skins/sam/resize-base.css (+0/-7)
src/maasserver/static/jslibs/yui/resize-base/resize-base-debug.js (+0/-1640)
src/maasserver/static/jslibs/yui/resize-base/resize-base-min.js (+0/-8)
src/maasserver/static/jslibs/yui/resize-base/resize-base.js (+0/-1639)
src/maasserver/static/jslibs/yui/resize-constrain/assets/resize-base-core.css (+0/-129)
src/maasserver/static/jslibs/yui/resize-constrain/resize-constrain-debug.js (+0/-461)
src/maasserver/static/jslibs/yui/resize-constrain/resize-constrain-min.js (+0/-7)
src/maasserver/static/jslibs/yui/resize-constrain/resize-constrain.js (+0/-461)
src/maasserver/static/jslibs/yui/resize-plugin/assets/resize-base-core.css (+0/-129)
src/maasserver/static/jslibs/yui/resize-plugin/resize-plugin-debug.js (+0/-214)
src/maasserver/static/jslibs/yui/resize-plugin/resize-plugin-min.js (+0/-7)
src/maasserver/static/jslibs/yui/resize-plugin/resize-plugin.js (+0/-214)
src/maasserver/static/jslibs/yui/resize-proxy/assets/resize-base-core.css (+0/-129)
src/maasserver/static/jslibs/yui/resize-proxy/resize-proxy-debug.js (+0/-172)
src/maasserver/static/jslibs/yui/resize-proxy/resize-proxy-min.js (+0/-7)
src/maasserver/static/jslibs/yui/resize-proxy/resize-proxy.js (+0/-172)
src/maasserver/static/jslibs/yui/router/router-debug.js (+0/-1079)
src/maasserver/static/jslibs/yui/router/router-min.js (+0/-7)
src/maasserver/static/jslibs/yui/router/router.js (+0/-1077)
src/maasserver/static/jslibs/yui/scrollview-base-ie/scrollview-base-ie-debug.js (+0/-61)
src/maasserver/static/jslibs/yui/scrollview-base-ie/scrollview-base-ie-min.js (+0/-7)
src/maasserver/static/jslibs/yui/scrollview-base-ie/scrollview-base-ie.js (+0/-61)
src/maasserver/static/jslibs/yui/scrollview-base/assets/scrollview-base-core.css (+0/-20)
src/maasserver/static/jslibs/yui/scrollview-base/assets/skins/night/scrollview-base-skin.css (+0/-6)
src/maasserver/static/jslibs/yui/scrollview-base/assets/skins/night/scrollview-base.css (+0/-7)
src/maasserver/static/jslibs/yui/scrollview-base/assets/skins/sam/scrollview-base-skin.css (+0/-9)
src/maasserver/static/jslibs/yui/scrollview-base/assets/skins/sam/scrollview-base.css (+0/-7)
src/maasserver/static/jslibs/yui/scrollview-base/scrollview-base-debug.js (+0/-1224)
src/maasserver/static/jslibs/yui/scrollview-base/scrollview-base-min.js (+0/-8)
src/maasserver/static/jslibs/yui/scrollview-base/scrollview-base.js (+0/-1222)
src/maasserver/static/jslibs/yui/scrollview-list/assets/scrollview-list-core.css (+0/-6)
src/maasserver/static/jslibs/yui/scrollview-list/assets/skins/night/scrollview-list-skin.css (+0/-63)
src/maasserver/static/jslibs/yui/scrollview-list/assets/skins/night/scrollview-list.css (+0/-7)
src/maasserver/static/jslibs/yui/scrollview-list/assets/skins/sam/scrollview-list-skin.css (+0/-43)
src/maasserver/static/jslibs/yui/scrollview-list/assets/skins/sam/scrollview-list.css (+0/-7)
src/maasserver/static/jslibs/yui/scrollview-list/scrollview-list-debug.js (+0/-136)
src/maasserver/static/jslibs/yui/scrollview-list/scrollview-list-min.js (+0/-7)
src/maasserver/static/jslibs/yui/scrollview-list/scrollview-list.js (+0/-136)
src/maasserver/static/jslibs/yui/scrollview-paginator/scrollview-paginator-debug.js (+0/-454)
src/maasserver/static/jslibs/yui/scrollview-paginator/scrollview-paginator-min.js (+0/-7)
src/maasserver/static/jslibs/yui/scrollview-paginator/scrollview-paginator.js (+0/-454)
src/maasserver/static/jslibs/yui/scrollview-scrollbars/assets/scrollview-scrollbars-core.css (+0/-101)
src/maasserver/static/jslibs/yui/scrollview-scrollbars/assets/skins/night/scrollview-scrollbars-skin.css (+0/-102)
src/maasserver/static/jslibs/yui/scrollview-scrollbars/assets/skins/night/scrollview-scrollbars.css (+0/-7)
src/maasserver/static/jslibs/yui/scrollview-scrollbars/assets/skins/sam/scrollview-scrollbars-skin.css (+0/-96)
src/maasserver/static/jslibs/yui/scrollview-scrollbars/assets/skins/sam/scrollview-scrollbars.css (+0/-7)
src/maasserver/static/jslibs/yui/scrollview-scrollbars/scrollview-scrollbars-debug.js (+0/-559)
src/maasserver/static/jslibs/yui/scrollview-scrollbars/scrollview-scrollbars-min.js (+0/-7)
src/maasserver/static/jslibs/yui/scrollview-scrollbars/scrollview-scrollbars.js (+0/-559)
src/maasserver/static/jslibs/yui/scrollview/scrollview-debug.js (+0/-27)
src/maasserver/static/jslibs/yui/scrollview/scrollview-min.js (+0/-7)
src/maasserver/static/jslibs/yui/scrollview/scrollview.js (+0/-27)
src/maasserver/static/jslibs/yui/selector-css2/selector-css2-debug.js (+0/-451)
src/maasserver/static/jslibs/yui/selector-css2/selector-css2-min.js (+0/-7)
src/maasserver/static/jslibs/yui/selector-css2/selector-css2.js (+0/-450)
src/maasserver/static/jslibs/yui/selector-css3/selector-css3-debug.js (+0/-158)
src/maasserver/static/jslibs/yui/selector-css3/selector-css3-min.js (+0/-7)
src/maasserver/static/jslibs/yui/selector-css3/selector-css3.js (+0/-158)
src/maasserver/static/jslibs/yui/selector-native/selector-native-debug.js (+0/-381)
src/maasserver/static/jslibs/yui/selector-native/selector-native-min.js (+0/-7)
src/maasserver/static/jslibs/yui/selector-native/selector-native.js (+0/-376)
src/maasserver/static/jslibs/yui/selector/selector-debug.js (+0/-12)
src/maasserver/static/jslibs/yui/selector/selector-min.js (+0/-7)
src/maasserver/static/jslibs/yui/selector/selector.js (+0/-12)
src/maasserver/static/jslibs/yui/shim-plugin/shim-plugin-debug.js (+0/-112)
src/maasserver/static/jslibs/yui/shim-plugin/shim-plugin-min.js (+0/-7)
src/maasserver/static/jslibs/yui/shim-plugin/shim-plugin.js (+0/-112)
src/maasserver/static/jslibs/yui/simpleyui/simpleyui-debug.js (+0/-19938)
src/maasserver/static/jslibs/yui/simpleyui/simpleyui-min.js (+0/-29)
src/maasserver/static/jslibs/yui/simpleyui/simpleyui.js (+0/-19844)
src/maasserver/static/jslibs/yui/slider-base/assets/skins/audio-light/slider-base-skin.css (+0/-97)
src/maasserver/static/jslibs/yui/slider-base/assets/skins/audio-light/slider-base.css (+0/-7)
src/maasserver/static/jslibs/yui/slider-base/assets/skins/audio-light/slider-skin.css (+0/-97)
src/maasserver/static/jslibs/yui/slider-base/assets/skins/audio/slider-base-skin.css (+0/-97)
src/maasserver/static/jslibs/yui/slider-base/assets/skins/audio/slider-base.css (+0/-7)
src/maasserver/static/jslibs/yui/slider-base/assets/skins/audio/slider-skin.css (+0/-97)
src/maasserver/static/jslibs/yui/slider-base/assets/skins/capsule-dark/slider-base-skin.css (+0/-97)
src/maasserver/static/jslibs/yui/slider-base/assets/skins/capsule-dark/slider-base.css (+0/-7)
src/maasserver/static/jslibs/yui/slider-base/assets/skins/capsule-dark/slider-skin.css (+0/-97)
src/maasserver/static/jslibs/yui/slider-base/assets/skins/capsule/slider-base-skin.css (+0/-99)
src/maasserver/static/jslibs/yui/slider-base/assets/skins/capsule/slider-base.css (+0/-7)
src/maasserver/static/jslibs/yui/slider-base/assets/skins/capsule/slider-skin.css (+0/-99)
src/maasserver/static/jslibs/yui/slider-base/assets/skins/night/slider-base-skin.css (+0/-93)
src/maasserver/static/jslibs/yui/slider-base/assets/skins/night/slider-base.css (+0/-7)
src/maasserver/static/jslibs/yui/slider-base/assets/skins/night/slider-skin.css (+0/-93)
src/maasserver/static/jslibs/yui/slider-base/assets/skins/round-dark/slider-base-skin.css (+0/-95)
src/maasserver/static/jslibs/yui/slider-base/assets/skins/round-dark/slider-base.css (+0/-7)
src/maasserver/static/jslibs/yui/slider-base/assets/skins/round-dark/slider-skin.css (+0/-95)
src/maasserver/static/jslibs/yui/slider-base/assets/skins/round/slider-base-skin.css (+0/-95)
src/maasserver/static/jslibs/yui/slider-base/assets/skins/round/slider-base.css (+0/-7)
src/maasserver/static/jslibs/yui/slider-base/assets/skins/round/slider-skin.css (+0/-95)
src/maasserver/static/jslibs/yui/slider-base/assets/skins/sam-dark/slider-base-skin.css (+0/-93)
src/maasserver/static/jslibs/yui/slider-base/assets/skins/sam-dark/slider-base.css (+0/-7)
src/maasserver/static/jslibs/yui/slider-base/assets/skins/sam-dark/slider-skin.css (+0/-93)
src/maasserver/static/jslibs/yui/slider-base/assets/skins/sam/slider-base-skin.css (+0/-93)
src/maasserver/static/jslibs/yui/slider-base/assets/skins/sam/slider-base.css (+0/-7)
src/maasserver/static/jslibs/yui/slider-base/assets/skins/sam/slider-skin.css (+0/-93)
src/maasserver/static/jslibs/yui/slider-base/assets/slider-base-core.css (+0/-37)
src/maasserver/static/jslibs/yui/slider-base/assets/slider-core.css (+0/-37)
src/maasserver/static/jslibs/yui/slider-base/slider-base-debug.js (+0/-767)
src/maasserver/static/jslibs/yui/slider-base/slider-base-min.js (+0/-7)
src/maasserver/static/jslibs/yui/slider-base/slider-base.js (+0/-765)
src/maasserver/static/jslibs/yui/slider-value-range/assets/slider-base-core.css (+0/-37)
src/maasserver/static/jslibs/yui/slider-value-range/assets/slider-core.css (+0/-37)
src/maasserver/static/jslibs/yui/slider-value-range/slider-value-range-debug.js (+0/-425)
src/maasserver/static/jslibs/yui/slider-value-range/slider-value-range-min.js (+0/-7)
src/maasserver/static/jslibs/yui/slider-value-range/slider-value-range.js (+0/-421)
src/maasserver/static/jslibs/yui/sortable-scroll/sortable-scroll-debug.js (+0/-73)
src/maasserver/static/jslibs/yui/sortable-scroll/sortable-scroll-min.js (+0/-7)
src/maasserver/static/jslibs/yui/sortable-scroll/sortable-scroll.js (+0/-73)
src/maasserver/static/jslibs/yui/sortable/sortable-debug.js (+0/-506)
src/maasserver/static/jslibs/yui/sortable/sortable-min.js (+0/-7)
src/maasserver/static/jslibs/yui/sortable/sortable.js (+0/-505)
src/maasserver/static/jslibs/yui/stylesheet/stylesheet-debug.js (+0/-648)
src/maasserver/static/jslibs/yui/stylesheet/stylesheet-min.js (+0/-7)
src/maasserver/static/jslibs/yui/stylesheet/stylesheet.js (+0/-644)
src/maasserver/static/jslibs/yui/substitute/substitute-debug.js (+0/-166)
src/maasserver/static/jslibs/yui/substitute/substitute-min.js (+0/-7)
src/maasserver/static/jslibs/yui/substitute/substitute.js (+0/-166)
src/maasserver/static/jslibs/yui/swf/swf-debug.js (+0/-208)
src/maasserver/static/jslibs/yui/swf/swf-min.js (+0/-7)
src/maasserver/static/jslibs/yui/swf/swf.js (+0/-207)
src/maasserver/static/jslibs/yui/swfdetect/swfdetect-debug.js (+0/-122)
src/maasserver/static/jslibs/yui/swfdetect/swfdetect-min.js (+0/-7)
src/maasserver/static/jslibs/yui/swfdetect/swfdetect.js (+0/-121)
src/maasserver/static/jslibs/yui/tabview-base/assets/tabview-core.css (+0/-48)
src/maasserver/static/jslibs/yui/tabview-base/assets/tabview.css (+0/-28)
src/maasserver/static/jslibs/yui/tabview-base/tabview-base-debug.js (+0/-150)
src/maasserver/static/jslibs/yui/tabview-base/tabview-base-min.js (+0/-7)
src/maasserver/static/jslibs/yui/tabview-base/tabview-base.js (+0/-150)
src/maasserver/static/jslibs/yui/tabview-plugin/assets/tabview-core.css (+0/-48)
src/maasserver/static/jslibs/yui/tabview-plugin/assets/tabview.css (+0/-28)
src/maasserver/static/jslibs/yui/tabview-plugin/tabview-plugin-debug.js (+0/-22)
src/maasserver/static/jslibs/yui/tabview-plugin/tabview-plugin-min.js (+0/-7)
src/maasserver/static/jslibs/yui/tabview-plugin/tabview-plugin.js (+0/-22)
src/maasserver/static/jslibs/yui/tabview/assets/skins/night/tabview-skin.css (+0/-95)
src/maasserver/static/jslibs/yui/tabview/assets/skins/night/tabview.css (+0/-7)
src/maasserver/static/jslibs/yui/tabview/assets/skins/sam/tabview-skin.css (+0/-64)
src/maasserver/static/jslibs/yui/tabview/assets/skins/sam/tabview.css (+0/-7)
src/maasserver/static/jslibs/yui/tabview/assets/tabview-core.css (+0/-48)
src/maasserver/static/jslibs/yui/tabview/assets/tabview.css (+0/-28)
src/maasserver/static/jslibs/yui/tabview/tabview-debug.js (+0/-407)
src/maasserver/static/jslibs/yui/tabview/tabview-min.js (+0/-7)
src/maasserver/static/jslibs/yui/tabview/tabview.js (+0/-407)
src/maasserver/static/jslibs/yui/test-console/assets/skins/sam/test-console-skin.css (+0/-64)
src/maasserver/static/jslibs/yui/test-console/assets/skins/sam/test-console.css (+0/-7)
src/maasserver/static/jslibs/yui/test-console/assets/test-console-core.css (+0/-14)
src/maasserver/static/jslibs/yui/test-console/test-console-debug.js (+0/-104)
src/maasserver/static/jslibs/yui/test-console/test-console-min.js (+0/-7)
src/maasserver/static/jslibs/yui/test-console/test-console.js (+0/-104)
src/maasserver/static/jslibs/yui/test/assets/skins/sam/test-skin.css (+0/-19)
src/maasserver/static/jslibs/yui/test/assets/skins/sam/test.css (+0/-7)
src/maasserver/static/jslibs/yui/test/assets/test-console.css (+0/-17)
src/maasserver/static/jslibs/yui/test/test-debug.js (+0/-3733)
src/maasserver/static/jslibs/yui/test/test-min.js (+0/-12)
src/maasserver/static/jslibs/yui/test/test.js (+0/-3733)
src/maasserver/static/jslibs/yui/text-accentfold/text-accentfold-debug.js (+0/-168)
src/maasserver/static/jslibs/yui/text-accentfold/text-accentfold-min.js (+0/-7)
src/maasserver/static/jslibs/yui/text-accentfold/text-accentfold.js (+0/-168)
src/maasserver/static/jslibs/yui/text-data-accentfold/text-data-accentfold-debug.js (+0/-52)
src/maasserver/static/jslibs/yui/text-data-accentfold/text-data-accentfold-min.js (+0/-7)
src/maasserver/static/jslibs/yui/text-data-accentfold/text-data-accentfold.js (+0/-52)
src/maasserver/static/jslibs/yui/text-data-wordbreak/text-data-wordbreak-debug.js (+0/-35)
src/maasserver/static/jslibs/yui/text-data-wordbreak/text-data-wordbreak-min.js (+0/-8)
src/maasserver/static/jslibs/yui/text-data-wordbreak/text-data-wordbreak.js (+0/-35)
src/maasserver/static/jslibs/yui/text-wordbreak/text-wordbreak-debug.js (+0/-369)
src/maasserver/static/jslibs/yui/text-wordbreak/text-wordbreak-min.js (+0/-7)
src/maasserver/static/jslibs/yui/text-wordbreak/text-wordbreak.js (+0/-368)
src/maasserver/static/jslibs/yui/transition-native/transition-native-debug.js (+0/-718)
src/maasserver/static/jslibs/yui/transition-native/transition-native-min.js (+0/-8)
src/maasserver/static/jslibs/yui/transition-native/transition-native.js (+0/-716)
src/maasserver/static/jslibs/yui/transition-timer/transition-timer-debug.js (+0/-345)
src/maasserver/static/jslibs/yui/transition-timer/transition-timer-min.js (+0/-7)
src/maasserver/static/jslibs/yui/transition-timer/transition-timer.js (+0/-345)
src/maasserver/static/jslibs/yui/transition/transition-debug.js (+0/-707)
src/maasserver/static/jslibs/yui/transition/transition-min.js (+0/-8)
src/maasserver/static/jslibs/yui/transition/transition.js (+0/-705)
src/maasserver/static/jslibs/yui/uploader-deprecated/uploader-deprecated-debug.js (+0/-602)
src/maasserver/static/jslibs/yui/uploader-deprecated/uploader-deprecated-min.js (+0/-7)
src/maasserver/static/jslibs/yui/uploader-deprecated/uploader-deprecated.js (+0/-600)
src/maasserver/static/jslibs/yui/uploader-flash/assets/uploader-flash-core.css (+0/-10)
src/maasserver/static/jslibs/yui/uploader-flash/uploader-flash-debug.js (+0/-966)
src/maasserver/static/jslibs/yui/uploader-flash/uploader-flash-min.js (+0/-8)
src/maasserver/static/jslibs/yui/uploader-flash/uploader-flash.js (+0/-966)
src/maasserver/static/jslibs/yui/uploader-html5/assets/uploader-flash-core.css (+0/-10)
src/maasserver/static/jslibs/yui/uploader-html5/uploader-html5-debug.js (+0/-814)
src/maasserver/static/jslibs/yui/uploader-html5/uploader-html5-min.js (+0/-8)
src/maasserver/static/jslibs/yui/uploader-html5/uploader-html5.js (+0/-814)
src/maasserver/static/jslibs/yui/uploader-queue/assets/uploader-flash-core.css (+0/-10)
src/maasserver/static/jslibs/yui/uploader-queue/uploader-queue-debug.js (+0/-572)
src/maasserver/static/jslibs/yui/uploader-queue/uploader-queue-min.js (+0/-7)
src/maasserver/static/jslibs/yui/uploader-queue/uploader-queue.js (+0/-572)
src/maasserver/static/jslibs/yui/uploader/assets/uploader-flash-core.css (+0/-10)
src/maasserver/static/jslibs/yui/uploader/uploader-debug.js (+0/-59)
src/maasserver/static/jslibs/yui/uploader/uploader-min.js (+0/-7)
src/maasserver/static/jslibs/yui/uploader/uploader.js (+0/-59)
src/maasserver/static/jslibs/yui/view-node-map/view-node-map-debug.js (+0/-89)
src/maasserver/static/jslibs/yui/view-node-map/view-node-map-min.js (+0/-7)
src/maasserver/static/jslibs/yui/view-node-map/view-node-map.js (+0/-89)
src/maasserver/static/jslibs/yui/view/view-debug.js (+0/-431)
src/maasserver/static/jslibs/yui/view/view-min.js (+0/-7)
src/maasserver/static/jslibs/yui/view/view.js (+0/-431)
src/maasserver/static/jslibs/yui/widget-anim/widget-anim-debug.js (+0/-263)
src/maasserver/static/jslibs/yui/widget-anim/widget-anim-min.js (+0/-7)
src/maasserver/static/jslibs/yui/widget-anim/widget-anim.js (+0/-263)
src/maasserver/static/jslibs/yui/widget-autohide/widget-autohide-debug.js (+0/-243)
src/maasserver/static/jslibs/yui/widget-autohide/widget-autohide-min.js (+0/-7)
src/maasserver/static/jslibs/yui/widget-autohide/widget-autohide.js (+0/-242)
src/maasserver/static/jslibs/yui/widget-base-ie/assets/widget-base-core.css (+0/-26)
src/maasserver/static/jslibs/yui/widget-base-ie/widget-base-ie-debug.js (+0/-55)
src/maasserver/static/jslibs/yui/widget-base-ie/widget-base-ie-min.js (+0/-7)
src/maasserver/static/jslibs/yui/widget-base-ie/widget-base-ie.js (+0/-55)
src/maasserver/static/jslibs/yui/widget-base/assets/skins/night/widget-base-skin.css (+0/-6)
src/maasserver/static/jslibs/yui/widget-base/assets/skins/night/widget-base.css (+0/-7)
src/maasserver/static/jslibs/yui/widget-base/assets/skins/sam/widget-base-skin.css (+0/-6)
src/maasserver/static/jslibs/yui/widget-base/assets/skins/sam/widget-base.css (+0/-7)
src/maasserver/static/jslibs/yui/widget-base/assets/widget-base-core.css (+0/-26)
src/maasserver/static/jslibs/yui/widget-base/widget-base-debug.js (+0/-1260)
src/maasserver/static/jslibs/yui/widget-base/widget-base-min.js (+0/-8)
src/maasserver/static/jslibs/yui/widget-base/widget-base.js (+0/-1256)
src/maasserver/static/jslibs/yui/widget-buttons/assets/skins/night/widget-buttons-skin.css (+0/-9)
src/maasserver/static/jslibs/yui/widget-buttons/assets/skins/night/widget-buttons.css (+0/-7)
src/maasserver/static/jslibs/yui/widget-buttons/assets/skins/sam/widget-buttons-skin.css (+0/-9)
src/maasserver/static/jslibs/yui/widget-buttons/assets/skins/sam/widget-buttons.css (+0/-7)
src/maasserver/static/jslibs/yui/widget-buttons/assets/widget-buttons-core.css (+0/-21)
src/maasserver/static/jslibs/yui/widget-buttons/widget-buttons-debug.js (+0/-1296)
src/maasserver/static/jslibs/yui/widget-buttons/widget-buttons-min.js (+0/-8)
src/maasserver/static/jslibs/yui/widget-buttons/widget-buttons.js (+0/-1296)
src/maasserver/static/jslibs/yui/widget-child/widget-child-debug.js (+0/-383)
src/maasserver/static/jslibs/yui/widget-child/widget-child-min.js (+0/-7)
src/maasserver/static/jslibs/yui/widget-child/widget-child.js (+0/-383)
src/maasserver/static/jslibs/yui/widget-htmlparser/assets/widget-base-core.css (+0/-26)
src/maasserver/static/jslibs/yui/widget-htmlparser/widget-htmlparser-debug.js (+0/-169)
src/maasserver/static/jslibs/yui/widget-htmlparser/widget-htmlparser-min.js (+0/-7)
src/maasserver/static/jslibs/yui/widget-htmlparser/widget-htmlparser.js (+0/-169)
src/maasserver/static/jslibs/yui/widget-locale/assets/widget-base-core.css (+0/-26)
src/maasserver/static/jslibs/yui/widget-locale/widget-locale-debug.js (+0/-179)
src/maasserver/static/jslibs/yui/widget-locale/widget-locale-min.js (+0/-7)
src/maasserver/static/jslibs/yui/widget-locale/widget-locale.js (+0/-175)
src/maasserver/static/jslibs/yui/widget-modality/assets/skins/night/widget-modality-skin.css (+0/-13)
src/maasserver/static/jslibs/yui/widget-modality/assets/skins/night/widget-modality.css (+0/-7)
src/maasserver/static/jslibs/yui/widget-modality/assets/skins/sam/widget-modality-skin.css (+0/-13)
src/maasserver/static/jslibs/yui/widget-modality/assets/skins/sam/widget-modality.css (+0/-7)
src/maasserver/static/jslibs/yui/widget-modality/assets/widget-modality-core.css (+0/-7)
src/maasserver/static/jslibs/yui/widget-modality/widget-modality-debug.js (+0/-578)
src/maasserver/static/jslibs/yui/widget-modality/widget-modality-min.js (+0/-9)
src/maasserver/static/jslibs/yui/widget-modality/widget-modality.js (+0/-578)
src/maasserver/static/jslibs/yui/widget-parent/widget-parent-debug.js (+0/-876)
src/maasserver/static/jslibs/yui/widget-parent/widget-parent-min.js (+0/-7)
src/maasserver/static/jslibs/yui/widget-parent/widget-parent.js (+0/-875)
src/maasserver/static/jslibs/yui/widget-position-align/widget-position-align-debug.js (+0/-659)
src/maasserver/static/jslibs/yui/widget-position-align/widget-position-align-min.js (+0/-7)
src/maasserver/static/jslibs/yui/widget-position-align/widget-position-align.js (+0/-655)
src/maasserver/static/jslibs/yui/widget-position-constrain/widget-position-constrain-debug.js (+0/-352)
src/maasserver/static/jslibs/yui/widget-position-constrain/widget-position-constrain-min.js (+0/-7)
src/maasserver/static/jslibs/yui/widget-position-constrain/widget-position-constrain.js (+0/-352)
src/maasserver/static/jslibs/yui/widget-position/widget-position-debug.js (+0/-281)
src/maasserver/static/jslibs/yui/widget-position/widget-position-min.js (+0/-7)
src/maasserver/static/jslibs/yui/widget-position/widget-position.js (+0/-281)
src/maasserver/static/jslibs/yui/widget-skin/assets/widget-base-core.css (+0/-26)
src/maasserver/static/jslibs/yui/widget-skin/widget-skin-debug.js (+0/-49)
src/maasserver/static/jslibs/yui/widget-skin/widget-skin-min.js (+0/-7)
src/maasserver/static/jslibs/yui/widget-skin/widget-skin.js (+0/-49)
src/maasserver/static/jslibs/yui/widget-stack/assets/skins/night/widget-stack-skin.css (+0/-6)
src/maasserver/static/jslibs/yui/widget-stack/assets/skins/night/widget-stack.css (+0/-7)
src/maasserver/static/jslibs/yui/widget-stack/assets/skins/sam/widget-stack-skin.css (+0/-6)
src/maasserver/static/jslibs/yui/widget-stack/assets/skins/sam/widget-stack.css (+0/-7)
src/maasserver/static/jslibs/yui/widget-stack/assets/widget-stack-core.css (+0/-25)
src/maasserver/static/jslibs/yui/widget-stack/widget-stack-debug.js (+0/-444)
src/maasserver/static/jslibs/yui/widget-stack/widget-stack-min.js (+0/-7)
src/maasserver/static/jslibs/yui/widget-stack/widget-stack.js (+0/-444)
src/maasserver/static/jslibs/yui/widget-stdmod/widget-stdmod-debug.js (+0/-785)
src/maasserver/static/jslibs/yui/widget-stdmod/widget-stdmod-min.js (+0/-7)
src/maasserver/static/jslibs/yui/widget-stdmod/widget-stdmod.js (+0/-785)
src/maasserver/static/jslibs/yui/widget-uievents/assets/widget-base-core.css (+0/-26)
src/maasserver/static/jslibs/yui/widget-uievents/widget-uievents-debug.js (+0/-233)
src/maasserver/static/jslibs/yui/widget-uievents/widget-uievents-min.js (+0/-7)
src/maasserver/static/jslibs/yui/widget-uievents/widget-uievents.js (+0/-232)
src/maasserver/static/jslibs/yui/yql/yql-debug.js (+0/-145)
src/maasserver/static/jslibs/yui/yql/yql-min.js (+0/-7)
src/maasserver/static/jslibs/yui/yql/yql.js (+0/-144)
src/maasserver/static/jslibs/yui/yui-base/yui-base-debug.js (+0/-5562)
src/maasserver/static/jslibs/yui/yui-base/yui-base-min.js (+0/-12)
src/maasserver/static/jslibs/yui/yui-base/yui-base.js (+0/-5530)
src/maasserver/static/jslibs/yui/yui-core/yui-core-debug.js (+0/-3681)
src/maasserver/static/jslibs/yui/yui-core/yui-core-min.js (+0/-10)
src/maasserver/static/jslibs/yui/yui-core/yui-core.js (+0/-3667)
src/maasserver/static/jslibs/yui/yui-later/yui-later-debug.js (+0/-83)
src/maasserver/static/jslibs/yui/yui-later/yui-later-min.js (+0/-7)
src/maasserver/static/jslibs/yui/yui-later/yui-later.js (+0/-83)
src/maasserver/static/jslibs/yui/yui-log-nodejs/yui-log-nodejs-debug.js (+0/-86)
src/maasserver/static/jslibs/yui/yui-log-nodejs/yui-log-nodejs-min.js (+0/-7)
src/maasserver/static/jslibs/yui/yui-log-nodejs/yui-log-nodejs.js (+0/-86)
src/maasserver/static/jslibs/yui/yui-log/yui-log-debug.js (+0/-115)
src/maasserver/static/jslibs/yui/yui-log/yui-log-min.js (+0/-7)
src/maasserver/static/jslibs/yui/yui-log/yui-log.js (+0/-115)
src/maasserver/static/jslibs/yui/yui-nodejs/yui-nodejs-debug.js (+0/-9675)
src/maasserver/static/jslibs/yui/yui-nodejs/yui-nodejs-min.js (+0/-18)
src/maasserver/static/jslibs/yui/yui-nodejs/yui-nodejs.js (+0/-9609)
src/maasserver/static/jslibs/yui/yui-throttle/yui-throttle-debug.js (+0/-60)
src/maasserver/static/jslibs/yui/yui-throttle/yui-throttle-min.js (+0/-9)
src/maasserver/static/jslibs/yui/yui-throttle/yui-throttle.js (+0/-60)
src/maasserver/static/jslibs/yui/yui/yui-debug.js (+0/-10661)
src/maasserver/static/jslibs/yui/yui/yui-min.js (+0/-19)
src/maasserver/static/jslibs/yui/yui/yui.js (+0/-10588)
src/maasserver/templates/maasserver/form_field.html (+1/-1)
src/maasserver/templates/maasserver/node_list.html (+1/-1)
src/maasserver/templates/maasserver/node_view.html (+14/-0)
src/maasserver/templates/maasserver/nodegroup_edit.html (+3/-0)
src/maasserver/templates/maasserver/nodegroupinterface_new.html (+23/-0)
src/maasserver/templates/maasserver/nodes_listing.html (+7/-0)
src/maasserver/templates/maasserver/settings.html (+16/-1)
src/maasserver/templates/maasserver/settings_cluster_listing.html (+9/-0)
src/maasserver/templates/maasserver/settings_cluster_listing_row.html (+8/-2)
src/maasserver/templates/maasserver/tag_view.html (+12/-0)
src/maasserver/testing/factory.py (+7/-6)
src/maasserver/tests/test_api.py (+254/-16)
src/maasserver/tests/test_commands_config_master_dhcp.py (+0/-144)
src/maasserver/tests/test_commands_write_dns_config.py (+52/-0)
src/maasserver/tests/test_dhcplease.py (+3/-3)
src/maasserver/tests/test_dns.py (+51/-17)
src/maasserver/tests/test_forms.py (+0/-12)
src/maasserver/tests/test_node.py (+105/-36)
src/maasserver/tests/test_node_constraint_filter.py (+2/-2)
src/maasserver/tests/test_nodegroup.py (+60/-27)
src/maasserver/tests/test_signals.py (+33/-10)
src/maasserver/tests/test_tag.py (+10/-0)
src/maasserver/tests/test_views_account.py (+8/-0)
src/maasserver/tests/test_views_nodes.py (+151/-6)
src/maasserver/tests/test_views_settings.py (+64/-9)
src/maasserver/tests/test_views_settings_clusters.py (+29/-1)
src/maasserver/tests/test_views_tags.py (+112/-47)
src/maasserver/urls.py (+4/-0)
src/maasserver/views/account.py (+5/-1)
src/maasserver/views/nodes.py (+51/-2)
src/maasserver/views/settings.py (+19/-0)
src/maasserver/views/settings_clusters.py (+27/-0)
src/maastesting/bindfixture.py (+2/-1)
src/maastesting/fixtures.py (+15/-0)
src/maastesting/httpd.py (+94/-0)
src/maastesting/tests/test_fixtures.py (+18/-1)
src/maastesting/tests/test_httpd.py (+27/-1)
src/provisioningserver/boot_images.py (+4/-1)
src/provisioningserver/dhcp/leases.py (+5/-1)
src/provisioningserver/dns/config.py (+2/-1)
src/provisioningserver/dns/tests/test_config.py (+1/-1)
src/provisioningserver/kernel_opts.py (+4/-0)
src/provisioningserver/logging.py (+0/-22)
src/provisioningserver/start_cluster_controller.py (+9/-20)
src/provisioningserver/tags.py (+30/-14)
src/provisioningserver/tasks.py (+2/-2)
src/provisioningserver/tests/test_kernel_opts.py (+13/-0)
src/provisioningserver/tests/test_start_cluster_controller.py (+1/-0)
src/provisioningserver/tests/test_tags.py (+34/-4)
src/provisioningserver/tests/test_tasks.py (+17/-16)
utilities/find-imported-module-files (+83/-0)
versions.cfg (+1/-1)
Text conflict in src/maasserver/templates/maasserver/tag_view.html
Text conflict in src/maasserver/tests/test_views_tags.py
To merge this branch: bzr merge lp:~dimitern/maas/1.2-node-view-shows-kernel-params
Reviewer Review Type Date Requested Status
MAAS Maintainers Pending
Review via email: mp+133215@code.launchpad.net

This proposal has been superseded by a proposal from 2012-11-08.

Commit message

Related to bug #1044503: Add UI for kernel parameters in the node, tag and settings pages.

Description of the change

This is a resubmit of the MP here, but targeting the right branch (1.2).

https://code.launchpad.net/~dimitern/maas/1.2-node-view-shows-kernel-params/+merge/132911

In addition, the settings page now uses a single line long field for the global kernel params:

http://people.canonical.com/~dimitern/maas-settings-kernel-opts.png

To post a comment you must log in.
1286. By Dimiter Naydenov

Added tests for node and settings views; fixed a few minor things with naming

1287. By Dimiter Naydenov

Merge 1.2

Revision history for this message
Martin Packman (gz) wrote :

Will want a little followup as the other branches land, but the view and template stuff looks good to me.

1288. By Dimiter Naydenov

Silenced lint warnings

1289. By Dimiter Naydenov

Fixed some tests after integrating the other two branches

Revision history for this message
Dimiter Naydenov (dimitern) wrote :

I'm ready with the changes and tests - everything works with one exception - test_view_node_shows_tag_kernel_params still fails, because it assumes Node.get_effective_kernel_options() returns (Tag, kernel_opts) tuple when a tag has kernel_opts and is applied to a node. So, once https://code.launchpad.net/~jameinel/maas/1.2-kernel-option-tags lands, the failing test should pass.

1290. By Dimiter Naydenov

Merge 1.2

1291. By Dimiter Naydenov

Fixed a test after integration

1292. By Dimiter Naydenov

Merge lp:~jameinel/maas/land-kernel-opts-in-trunk

Unmerged revisions

1292. By Dimiter Naydenov

Merge lp:~jameinel/maas/land-kernel-opts-in-trunk

1291. By Dimiter Naydenov

Fixed a test after integration

1290. By Dimiter Naydenov

Merge 1.2

1289. By Dimiter Naydenov

Fixed some tests after integrating the other two branches

1288. By Dimiter Naydenov

Silenced lint warnings

1287. By Dimiter Naydenov

Merge 1.2

1286. By Dimiter Naydenov

Added tests for node and settings views; fixed a few minor things with naming

1285. By Dimiter Naydenov

Changes to the UI + integration with upcoming changes for Node and Tag models

1284. By Dimiter Naydenov

Updated templates to show kernel opts where needed for a review

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'Makefile'
2--- Makefile 2012-10-04 23:31:12 +0000
3+++ Makefile 2012-11-08 10:58:27 +0000
4@@ -49,7 +49,7 @@
5 install-dependencies:
6 sudo DEBIAN_FRONTEND=noninteractive apt-get -y \
7 --no-install-recommends install \
8- $(shell sort -u required-packages/*)
9+ $(shell sort -u required-packages/base required-packages/dev)
10
11 bin/python bin/pip:
12 $(virtualenv) --python=$(python) --system-site-packages $(CURDIR)
13@@ -101,7 +101,7 @@
14 $(buildout) install flake8
15 @touch --no-create $@
16
17-bin/sphinx: bin/buildout buildout.cfg versions.cfg setup.py
18+bin/sphinx bin/sphinx-build: bin/buildout buildout.cfg versions.cfg setup.py
19 $(buildout) install sphinx
20 @touch --no-create $@
21
22@@ -139,6 +139,11 @@
23 doc: bin/sphinx docs/api.rst
24 bin/sphinx
25
26+man: $(patsubst docs/man/%.rst,man/%,$(wildcard docs/man/*.rst))
27+
28+man/%: docs/man/%.rst | bin/sphinx-build
29+ bin/sphinx-build -b man docs man $^
30+
31 enums: $(js_enums)
32
33 $(js_enums): bin/py src/maasserver/utils/jsenums.py $(py_enums)
34@@ -175,7 +180,6 @@
35 $(dbrun) bin/maas syncdb --noinput
36 $(dbrun) bin/maas migrate maasserver --noinput
37 $(dbrun) bin/maas migrate metadataserver --noinput
38- $(dbrun) bin/maas config_master_dhcp --ensure
39
40 define phony_targets
41 build
42@@ -190,6 +194,7 @@
43 lint
44 lint-css
45 lint-js
46+ man
47 sampledata
48 syncdb
49 test
50
51=== modified file 'docs/conf.py'
52--- docs/conf.py 2012-10-03 20:16:24 +0000
53+++ docs/conf.py 2012-11-08 10:58:27 +0000
54@@ -227,8 +227,8 @@
55 # One entry per manual page. List of tuples
56 # (source start file, name, description, authors, manual section).
57 man_pages = [
58- ('index', 'maas', u'MAAS Documentation',
59- [u'MAAS Developers'], 1)
60+ ('man/maas-cli.8', 'maas-cli', u'MAAS API commandline utility',
61+ [u'Canonical 2012'], 8)
62 ]
63
64
65
66=== modified file 'docs/index.rst'
67--- docs/index.rst 2012-10-04 15:14:12 +0000
68+++ docs/index.rst 2012-11-08 10:58:27 +0000
69@@ -37,7 +37,8 @@
70 :maxdepth: 2
71
72 juju-quick-start
73-
74+ tags
75+
76 ******************************
77 Using the maas-cli commandline
78 ******************************
79
80=== modified file 'docs/maascli.rst'
81--- docs/maascli.rst 2012-10-04 15:14:12 +0000
82+++ docs/maascli.rst 2012-11-08 10:58:27 +0000
83@@ -1,24 +1,571 @@
84
85-As well as the web interface, many tasks can be performed by accessing the MAAS API directly through the maas-cli command. This section details how to login with this tool and perform some common operations.
86+As well as the web interface, many tasks can be performed by accessing
87+the MAAS API directly through the maas-cli command. This section
88+details how to login with this tool and perform some common
89+operations.
90
91 .. _api-key:
92
93 Logging in
94 ----------
95
96-Before the API will accept any commands from maas-cli, you must first login. To do this, you need the API key which can be found in the user interface.
97-
98-Login to the web interface on your MAAS. Click on the username in the top right corner and select 'Preferences' from the menu which appears.
99-
100+Before the API will accept any commands from maas-cli, you must first
101+login. To do this, you need the API key which can be found in the user
102+interface.
103+
104+Login to the web interface on your MAAS. Click on the username in the
105+top right corner and select 'Preferences' from the menu which appears.
106+
107+.. only:: html
108 .. image:: media/maascli-prefs.*
109
110 A new page will load...
111
112 .. image:: media/maascli-key.*
113
114-The very first item is a list of MAAS keys. One will have already been generated when the system was installed. It's easiest to just select and copy the key (it's quite long!) and then paste it into the commandline::
115-
116- $ maas-cli login <key>
117-
118+The very first item is a list of MAAS keys. One will have already been
119+generated when the system was installed. It's easiest to just select
120+and copy the key (it's quite long!) and then paste it into the
121+commandline. The format of the login command is::
122+
123+ $ maas-cli login <profile-name> <hostname> <key>
124+
125+The profile created is an easy way of associating your credentials with any
126+subsequent call to the API. So an example login might look like this::
127+
128+$ maas-cli login maas http://10.98.0.13/MAAS/api/1.0 AWSCRMzqMNy:jjk...5e1FenoP82Qm5te2
129+
130+which creates the profile 'maas' and registers it with the given key at the
131+specified API endpoint.
132+If you omit the credentials, they will be prompted for in the console. It is
133+also possible to use a hyphen, '-' in place of the credentials. In this case a
134+single line will be read from stdin, stripped of any whitespace and used as the
135+credentials, which can be useful if you are devolping scripts for specific
136+tasks.
137+If an empty string is passed instead of the credentials, the profile will be
138+logged in anonymously (and consequently some of the API calls will not be
139+available)
140+
141+
142+maas-cli commands
143+-----------------
144+
145+The ``maas-cli`` command exposes the whole API, so you can do anything
146+you actually *can* do with MAAS using this command. Unsurprisingly,
147+this leaves us with a vast number of options, but before we delve into
148+detail on the specifics, here is a sort of 'cheat-sheet' for common
149+tasks you might want to do using ``maas-cli``.
150+
151+ * :ref:`Configure DHCP and DNS services <cli-dhcp>`
152+
153+ * :ref:`Commission all enlisted nodes <cli-commission>`
154+
155+ * :ref:`Setting IPMI power parameters for a node <cli-power>`
156+
157+The main maas-cli commands are:
158+
159+.. program:: maas-cli
160+
161+.. option:: list
162+
163+ lists the details [name url auth-key] of all the currently logged-in
164+ profiles.
165+
166+.. option:: login <profile> <url> <key>
167+
168+ Logs in to the MAAS controller API at the given URL, using the key
169+ provided and associates this connection with the given profile name.
170+
171+.. option::logout <profile>
172+
173+ Logs out from the given profile, flushing the stored credentials.
174+
175+.. option:: refresh
176+
177+ Refreshes the API descriptions of all the current logged in
178+ profiles. This may become necessary for example when upgrading the
179+ maas packages to ensure the command-line options match with the API.
180+
181+.. option:: <profile> [command] [options] ...
182+
183+ Using the given profile name instructs ``maas-cli`` to direct the
184+ subsequent commands and options to the relevant MAAS, which for the
185+ current API are detailed below...
186+
187+
188+account
189+^^^^^^^
190+This command is used for creating and destroying the
191+MAAS authorisation tokens associated with a profile.
192+
193+Usage: maas-cli *<profile>* account [-d --debug] [-h --help]
194+create-authorisation-token | delete-authorisation-token [token_key=\
195+*<value>*]
196+
197+.. program:: maas-cli account
198+
199+.. option:: -d, --debug
200+
201+ Displays debug information listing the API responses.
202+
203+.. option:: -h, --help
204+
205+ Display usage information.
206+
207+.. option:: -k, --insecure
208+
209+ Disables the SSL certificate check.
210+
211+.. option:: x-create-authorisation-token `
212+
213+ Creates a new MAAS authorisation token for the current profile
214+ which can be used to authenticate connections to the API.
215+
216+.. option:: x-delete-authorisation-token token_key=<value>
217+
218+ Removes the given key from the list of authorisation tokens.
219+
220+
221+
222+
223+.. boot-images - not useful in user context
224+.. ^^^^^^^^^^^
225+
226+
227+.. files - not useful in user context
228+.. ^^^^^
229+
230+
231+node
232+^^^^
233+
234+API calls which operate on individual nodes. With these commands, the
235+node is always identified by its "system_id" property - a unique tag
236+allocated at the time of enlistment. To discover the value of the
237+system_id, you can use the ``maas-cli <profile> nodes list`` command.
238+
239+USAGE: maas-cli <profile> node [-h] release | start | stop | delete |
240+read | update <system_id>
241+
242+.. program:: maas-cli node
243+
244+.. option:: -h, --help
245+
246+ Display usage information.
247+
248+.. option:: release <system_id>
249+
250+ Releases the node given by *<system_id>*
251+
252+.. option:: start <system_id>
253+
254+ Powers up the node identified by *<system_id>* (where MAAS has
255+ information for power management for this node).
256+
257+.. option:: stop <system_id>
258+
259+ Powers off the node identified by *<system_id>* (where MAAS has
260+ information for power management for this node).
261+
262+.. option:: delete <system_id>
263+
264+ Removes the given node from the MAAS database.
265+
266+.. option:: read <system_id>
267+
268+ Returns all the current known information about the node specified
269+ by *<system_id>
270+
271+.. option:: update <system_id> [parameters...]
272+
273+ Used to change or set specific values for the node. The valid
274+ parameters are listed below::
275+
276+ hostname=<value>
277+ The new hostname for this node.
278+
279+ architecture=<value>
280+ Sets the architecture type, where <value>
281+ is a string containing a valid architecture type,
282+ e.g. "i386/generic"
283+
284+ power_type=<value>
285+ Apply the given dotted decimal value as the broadcast IP address
286+ for this subnet.
287+
288+ power_parameters_{param1}... =<value>
289+ Set the given power parameters. Note that the valid options for these
290+ depend on the power type chosen.
291+
292+ power_parameters_skip_check 'true' | 'false'
293+ Whether to sanity check the supplied parameters against this node's
294+ declared power type. The default is 'false'.
295+
296+
297+
298+.. _cli-power:
299+
300+Example: Setting the power parameters for an ipmi enabled node::
301+
302+ maas-cli maas node update <system_id> \
303+ power_type="ipmi" \
304+ power_parameters_power_address=192.168.22.33 \
305+ power_parameters_power_user=root \
306+ power_parameters_power_pass=ubuntu;
307+
308+
309+
310+
311+nodes
312+^^^^^
313+
314+Usage: maas-cli <profile> nodes [-h] is-registered | list-allocated |
315+acquire | list | accept | accept-all | new | check-commissioning
316+
317+.. program:: maas-cli nodes
318+
319+.. option:: -h, --help
320+
321+ Display usage information.
322+
323+
324+.. option:: accept <system_id>
325+
326+ Accepts the node referenced by <system_id>.
327+
328+.. option:: x-accept-all
329+
330+ Accepts all currently discovered but not previously accepted nodes.
331+
332+.. option:: acquire
333+
334+ Allocates a node to the profile used to issue the command. Any
335+ ready node may be allocated.
336+
337+.. option:: is-registered mac_address='<address>'
338+
339+ Checks to see whether the specified MAC address is registered to a
340+ node.
341+
342+.. option:: list
343+
344+ Returns a JSON formatted object listing all the currently known
345+ nodes, their system_id, status and other details.
346+
347+.. option:: x-list-allocated
348+
349+ Returns a JSON formatted object listing all the currently allocated
350+ nodes, their system_id, status and other details.
351+
352+.. option:: new architecture=<value> mac_addresses=<value> [parameters]
353+
354+ Creates a new node entry given the provided key=value information
355+ for the node. A minimum of the MAC address and architecture must be
356+ provided. Other parameters may also be supplied::
357+
358+ architecture="<value>" - The architecture of the node, must be
359+ one of the recognised architecture strings (e.g. "i386/generic")
360+ hostname="<value>" - a name for this node. If not supplied a name
361+ will be generated.
362+ mac_addresses="<value>" - The mac address(es)
363+ allocated to this node.
364+ powertype="<value>" - the power type of
365+ the node (e.g. virsh, ipmi)
366+
367+
368+.. option:: x-check-commissioning
369+
370+ Displays current status of nodes in the commissioning phase. Any
371+ that have not returned before the system timeout value are listed
372+ as "failed".
373+
374+.. _cli-commission:
375+
376+Examples:
377+Accept and commission all discovered nodes::
378+
379+ $ maas-cli maas nodes accept-all
380+
381+List all known nodes::
382+
383+ $ maas-cli maas nodes list
384+
385+Filter the list using specific key/value pairs::
386+
387+ $ maas-cli maas nodes list architecture="i386/generic"
388+
389+
390+
391+node-groups
392+^^^^^^^^^^^
393+Usage: maas-cli <profile> node-groups [-d --debug] [-h --help] [-k
394+--insecure] register | list | refresh-workers | accept | reject
395+
396+.. program:: maas-cli node-groups
397+
398+.. option:: -d, --debug
399+
400+ Displays debug information listing the API responses.
401+
402+.. option:: -h, --help
403+
404+ Display usage information.
405+
406+.. option:: -k, --insecure
407+
408+ Disables the SSL certificate check.
409+
410+.. option:: register uuid=<value> name=<value> interfaces=<json_string>
411+
412+ Registers a new node group with the given name and uuid. The
413+ interfaces parameter must be supplied in the form of a JSON string
414+ comprising the key/value data for the interface to be used, for
415+ example: interface='["ip":"192.168.21.5","interface":"eth1", \
416+ "subnet_mask":"255.255.255.0","broadcast_ip":"192.168.21.255", \
417+ "router_ip":"192.168.21.1", "ip_range_low":"192.168.21.10", \
418+ "ip_range_high":"192.168.21.50"}]'
419+
420+.. option:: list
421+
422+ Returns a JSON list of all currently defined node groups.
423+
424+.. option:: refresh_workers
425+
426+ It sounds a bit like they will get a cup of tea and a
427+ biscuit. Actually this just sends each node-group worker an update
428+ of its credentials (API key, node-group name). This command is
429+ usually not needed at a user level, but is often used by worker
430+ nodes.
431+
432+.. option:: accept <uuid>
433+
434+ Accepts a node-group or number of nodegroups indicated by the
435+ supplied UUID
436+
437+.. option:: reject <uuid>
438+
439+ Rejects a node-group or number of nodegroups indicated by the
440+ supplied UUID
441+
442+
443+
444+node-group-interface
445+^^^^^^^^^^^^^^^^^^^^
446+For managing the applied interfaces. See also :ref:<node_group_interfaces>.
447+
448+Usage: maas-cli *<profile>* node-group-interfaces [-d --debug] [-h
449+--help] [-k --insecure] read | update | delete [parameters...]
450+
451+..program:: maas-cli node-group-interface
452+
453+.. option:: read <uuid> <interface>
454+
455+ Returns the current settings for the given UUID and interface
456+
457+.. option:: update [parameters]
458+
459+ Changes the settings for the interface according to the given
460+ parameters::
461+
462+ management= 0 | 1 | 2
463+ The service to be managed on the interface ( 0= none, 1=DHCP, 2=DHCP
464+ and DNS).
465+
466+ subnet_mask=<value>
467+ Apply the given dotted decimal value as the subnet mask.
468+
469+ broadcast_ip=<value>
470+ Apply the given dotted decimal value as the broadcast IP address for
471+ this subnet.
472+
473+ router_ip=<value>
474+ Apply the given dotted decimal value as the default router address
475+ for this subnet.
476+
477+ ip_range_low=<value>
478+ The lowest value of IP address to allocate via DHCP
479+
480+ ip_range_high=<value>
481+ The highest value of IP address to allocate via DHCP
482+
483+.. option:: delete <uuid> <interface>
484+
485+ Removes the entry for the given UUID and interface.
486+
487+ .. _cli-dhcp:
488+
489+Example:
490+Configuring DHCP and DNS.
491+
492+To enable MAAS to manage DHCP and DNS, it needs to be supplied with the relevant
493+interface information. To do this we need to first determine the UUID of the
494+node group affected::
495+
496+ $ uuid=$(maas-cli <profile> node-groups list | grep uuid | cut -d\" -f4)
497+
498+Once we have the UUID we can use this to update the node-group-interface for
499+that nodegroup, and pass it the relevant interface details::
500+
501+ $ maas-cli <profile> node-group-interface update $uuid eth0 \
502+ ip_range_high=192.168.123.200 \
503+ ip_range_low=192.168.123.100 \
504+ management=2 \
505+ broadcast_ip=192.168.123.255 \
506+ router_ip=192.168.123.1 \
507+
508+Replacing the example values with those required for this network. The only
509+non-obvious parameter is 'management' which takes the values 0 (no management), 1
510+(manage DHCP) and 2 (manage DHCP and DNS).
511+
512+
513+.. _node-group-interfaces
514+node-group-interfaces
515+^^^^^^^^^^^^^^^^^^^^^
516+
517+The node-group-interfaces commands are used for configuring the
518+management of DHCP and DNS services where these are managed by MAAS.
519+
520+Usage: maas-cli *<profile>* node-group-interfaces [-d --debug] [-h
521+--help] [-k --insecure] list | new [parameters...]
522+
523+.. program:: maas-cli node-group-interfaces
524+
525+.. option:: -d, --debug
526+
527+ Displays debug information listing the API responses.
528+
529+.. option:: -h, --help
530+
531+ Display usage information.
532+
533+.. option:: -k, --insecure
534+
535+ Disables the SSL certificate check.
536+
537+.. option:: list <label>
538+
539+ Lists the current stored configurations for the given identifier
540+ <label> in a key:value format which should be easy to decipher.
541+
542+
543+.. option:: new <label> ip=<value> interface=<if_device> [parameters...]
544+
545+ Creates a new interface group. The required parameters are the IP
546+ address and the network interface this appies to (e.g. eth0). In
547+ order to do anything useful, further parameters are required::
548+
549+ management= 0 | 1 | 2
550+ The service to be managed on the interface
551+ ( 0= none, 1=DHCP, 2=DHCP and DNS).
552+
553+ subnet_mask=<value>
554+ Apply the given dotted decimal value as the subnet mask.
555+
556+ broadcast_ip=<value>
557+ Apply the given dotted decimal value as the
558+ broadcast IP address for this subnet.
559+
560+ router_ip=<value>
561+ Apply the given dotted decimal value as the
562+ default router address for this subnet.
563+
564+ ip_range_low=<value>
565+ The lowest value of IP address to allocate via DHCP
566+
567+ ip_range_high=<value>
568+ The highest value of IP address to allocate via DHCP
569+
570+
571+
572+
573+tag
574+^^^
575+
576+Usage: maas-cli <profile> tag read | update-nodes | rebuild | update |
577+ nodes | delete
578+
579+.. program:: maas-cli tag
580+
581+.. option:: read <tag_name>
582+
583+ Returns information on the tag specified by <name>
584+
585+.. option:: update-nodes <tag_name> [add="<system_id>"]
586+ [remove="<system_id>"] [nodegroup="<system_id>"]
587+
588+ Applies or removes the given tag from a list of nodes specified by
589+ either or both of add="<system_id>" and remove="<system_id>". The
590+ nodegroup parameter, which restricts the operations to a particular
591+ nodegroup, is optional, but only the superuser can execute this
592+ command without it.
593+
594+.. option:: rebuild
595+
596+ Triggers a rebuild of the tag to node mapping.
597+
598+.. option:: update <tag_name> [name=<value>] | [comment=<value>]
599+ |[definition=<value>]
600+
601+ Updates the tag identified by tag_name. Any or all of name,comment
602+ and definition may be supplied as parameters. If no parameters are
603+ supplied, this command returns the current values.
604+
605+.. option:: nodes <tag_name>
606+
607+ Returns a list of nodes which are associated with the given tag.
608+
609+.. option:: delete <tag_name>
610+
611+ Deletes the given tag.
612+
613+tags
614+^^^^
615+Tags are a really useful way of identifying nodes with particular
616+characteristics.
617+
618+.. only:: html For more information on how to use them effectively, please see :ref:`deploy-tags`
619+
620+Usage: maas-cli <profile> tag [-d --debug] [-h --help] [-k
621+--insecure] list | new
622+
623+.. program:: maas-cli tag
624+
625+.. option:: -d, --debug
626+
627+ Displays debug information listing the API responses.
628+
629+.. option:: -h, --help
630+
631+ Display usage information.
632+
633+.. option:: -k, --insecure
634+
635+ Disables the SSL certificate check.
636+
637+.. option:: list
638+
639+ Returns a JSON object listing all the current tags known by the MAAS server
640+
641+.. option:: create name=<value> definition=<value> [comment=<value>]
642+
643+ Creates a new tag with the given name and definition. A comment is
644+ optional. Names must be unique, obviously - an error will be
645+ returned if the given name already exists. The definition is in the form of
646+ an XPath expression which parses the XML returned by running ``lshw`` on the
647+ node.
648+
649+Example:
650+Adding a tag to all nodes which have an Intel GPU::
651+
652+ $ maas-cli maas tags new name='intel-gpu' \
653+ comment='Machines which have an Intel display driver' \
654+ definition='contains(//node[@id="display"]/vendor, "Intel")
655+
656+
657+unused commands
658+^^^^^^^^^^^^^^^
659+Because the ``maas-cli`` command exposes all of the API, it also lists
660+some command options which are not really intended for end users, such
661+as the "file" and "boot-images" options.
662
663
664
665=== added directory 'docs/man'
666=== added file 'docs/man/maas-cli.8.rst'
667--- docs/man/maas-cli.8.rst 1970-01-01 00:00:00 +0000
668+++ docs/man/maas-cli.8.rst 2012-11-08 10:58:27 +0000
669@@ -0,0 +1,26 @@
670+
671+maas-cli
672+--------
673+
674+
675+Usage
676+^^^^^
677+
678+ $ maas-cli <profile> <command> [parameters]
679+
680+The available commands are dependent on the API you are connecting to and the
681+profile you use. The currently available options are explained below.
682+
683+
684+Description
685+^^^^^^^^^^^
686+
687+.. include:: ../maascli.rst
688+
689+Further Documentation
690+^^^^^^^^^^^^^^^^^^^^^
691+For more documentation of MAAS, please see https://maas.ubuntu.com/docs
692+
693+
694+
695+
696
697=== modified file 'docs/nodes.rst'
698--- docs/nodes.rst 2012-10-04 15:14:12 +0000
699+++ docs/nodes.rst 2012-11-08 10:58:27 +0000
700@@ -19,7 +19,7 @@
701
702 To save time, you can also accept and commission all nodes from the commandline. This requires that you first login with the API key, which :ref:`you can retrieve from the web interface <api-key>`::
703
704- $ maas-cli api maas nodes accept-all
705+ $ maas-cli maas nodes accept-all
706
707
708
709
710=== added file 'docs/tags.rst'
711--- docs/tags.rst 1970-01-01 00:00:00 +0000
712+++ docs/tags.rst 2012-11-08 10:58:27 +0000
713@@ -0,0 +1,127 @@
714+
715+.. _deploy-tags:
716+Making use of Tags
717+==================
718+
719+MAAS implements a system of tags based on the physical properties of the nodes.
720+The idea behind this is that you can use the tags to identify nodes with
721+particular abilities which may be useful when it comes to deploying services.
722+
723+A real world example of this might be to identify nodes which have fast GPUs
724+installed, if you were planning on deploying software which used CUDA or
725+OpenCL which would make use of this hardware.
726+
727+Tag definitions
728+---------------
729+
730+
731+Before we can create a tag we need to know how we will select which nodes it
732+gets applied to. MAAS collects hardware information from the nodes using the
733+`"lshw" utility <http://ezix.org/project/wiki/HardwareLiSter>`_ to return
734+detailed information in XML format. The definitions used in creating a tag are
735+then constructed using XPath expressions.
736+If you are unfamiliar with XPath expressions, it is well worth checking out the
737+`w3schools documentation <http://www.w3schools.com/xpath/xpath_syntax.asp>`_.
738+For the lshw XML, we will just check all the available nodes for some properties.
739+In our example case, we might want to find GPUs with a clock speed of over 1GHz.
740+In this case, the relevant XML node from the output will be labelled "display"
741+and does have a property called clock, so it will look like this::
742+
743+ //node[@id="display"]/clock > 1000000000
744+
745+Now we have a definition, we can go ahead and create a tag.
746+
747+Creating a tag
748+--------------
749+
750+Once we have sorted out what definition we will be using, creating the tag is
751+easy using the ``maas-cli`` command. You will need to :ref:`be logged in to the API first <api-key>`::
752+
753+ $ maas-cli maas tags new name='gpu' \
754+ comment='GPU with clock speed >1GHz for running CUDA type operations.' \
755+ definition='//node[@id="display"]/clock > 1000000000'
756+
757+The comment is really for your benefit. It pays to keep the actual tag name
758+short and to the point as you will be using it frequently in commands, but it
759+may subsequently be hard to work out what exactly was the difference between
760+tags like "gpu" and "fastgpu" unless you have a good comment. Something which
761+explains the definition in plain language is always a good idea!
762+
763+To check which nodes this tag applies to we can use the tag command::
764+
765+ $ maas-cli maas tag nodes gpu
766+
767+The process of updating the tags does take some time - not a lot of time, but
768+if nothing shows up straight away, try running the command again after a minute
769+or so.
770+
771+Using the tag
772+-------------
773+
774+You can use the tag in the web interface to discover applicable nodes, but the
775+real significance of it is when using juju to deploy services. Tags can be used
776+with juju constraints to make sure that a particular service only gets deployed
777+on hardware with the tag you have created.
778+
779+Example:
780+To use the 'gpu' tag we created to run a service called 'cuda' we would use::
781+
782+ $ juju deploy --constraints maas-tags=gpu cuda
783+
784+You could list several tags if required, and mix in other juju constraints if
785+needed::
786+
787+ $ juju deploy --constraints "mem=1024 maas-tags=gpu,intel" cuda
788+
789+
790+
791+Manually assigning tags
792+-----------------------
793+
794+MAAS supports the creation of arbitrary tags which don't depend on XPath
795+definitions ("nodes which make a lot of noise" perhaps). If a tag is created
796+without specifying the definition parameter then it will simply be ignored by
797+tag refresh mechanism, but the MAAS administrator will be able to manually add
798+and remove the tag from specific nodes.
799+
800+In this example we are assuming you are using the 'maas' profile and you want
801+to create a tag called 'my_tag'::
802+
803+ $ maas-cli maas tags new name='my_tag' comment='nodes which go ping'
804+ $ maas-cli maas tag update-nodes my_tag add="<system_id>"
805+
806+The first line creates a new tag but omits the definition, so no nodes are
807+automatically added to it. The second line applies that tag to a specific node
808+referenced by its system id property.
809+
810+You can easily remove a tag from a particular node, or indeed add
811+and remove them at the same time::
812+
813+ $ maas-cli maas tag update-nodes my_tag add=<system_id_1> \
814+ add=<system_id_2> add=<system_id_3> remove=<system_id_4>
815+
816+As the rule is that tags without a definition are ignored when rebuilds are
817+done, it is also possible to create a normal tag with a definition, and then
818+subsequently edit it to remove the definition. From this point the tag behaves
819+as if you had manually created it, but it still retains all the existing
820+associations it has with nodes. This is particularly useful if you have some
821+hardware which is conceptually similar but doesn't easily fit within a single
822+tag definition::
823+
824+ $ maas-cli maas tag new name='my_tag' comment='nodes I like ' \
825+ definition='contains(//node[@id=network]/vendor, "Intel")'
826+ $ maas-cli maas tag update my_tag definition=''
827+ $ maas-cli mass tag update-nodes my_tag add=<system_id>
828+
829+
830+.. tip::
831+ If you add and remove the same node in one operation, it ends up having
832+ the tag removed (even if the tag was in place before the operation).
833+
834+
835+
836+
837+
838+
839+
840+
841
842=== modified file 'docs/troubleshooting.rst'
843--- docs/troubleshooting.rst 2012-10-03 20:16:24 +0000
844+++ docs/troubleshooting.rst 2012-11-08 10:58:27 +0000
845@@ -1,7 +1,9 @@
846 ********************
847 MAAS Troubleshooting
848 ********************
849-Some parts of MAAS may still be a little confusing, and sometimes you might be trying to do things that are just plain impossible. This section covers some of the most commonly encountered problems and tries its best to make them gone.
850+Some parts of MAAS may still be a little confusing, and sometimes you might be
851+trying to do things that are just plain impossible. This section covers some of
852+the most commonly encountered problems and tries its best to make them gone.
853
854 .. contents:: Contents
855 :depth: 1
856@@ -13,58 +15,79 @@
857
858 Possible Cause: Timing issues
859 -----------------------------
860-Various parts of MAAS rely on OAuth to negotiate a connection to nodes. If the current time reported by the hardware clock on your node differs significantly from that on the MAAS server, the connection will not be made.
861+Various parts of MAAS rely on OAuth to negotiate a connection to nodes. If the
862+current time reported by the hardware clock on your node differs significantly
863+from that on the MAAS server, the connection will not be made.
864
865-**SOLUTION:** Check that the hardware clocks are consistent, and if necessary, adjust them. This can usually be done from within the system BIOS, without needing to install an OS
866+**SOLUTION:** Check that the hardware clocks are consistent, and if necessary,
867+adjust them. This can usually be done from within the system BIOS, without
868+needing to install an OS
869
870 Possible Cause: Network drivers
871 -------------------------------
872
873-Sometimes the hardware can boot from PXE, but fail to load correct drivers when booting the received image. This is sometimes the case when no open source drivers are available for the network hardware.
874+Sometimes the hardware can boot from PXE, but fail to load correct drivers when
875+booting the received image. This is sometimes the case when no open source
876+drivers are available for the network hardware.
877
878-**SOLUTION:** The best fix for this problem is to install a Linux-friendly network adaptor. It *is* theoretically possible to modify the boot image to include proprietary drivers, but it is not a straightforward task.
879+**SOLUTION:** The best fix for this problem is to install a Linux-friendly
880+network adaptor. It *is* theoretically possible to modify the boot image to
881+include proprietary drivers, but it is not a straightforward task.
882
883 **Nodes fail to PXE boot**
884-=========================
885+==========================
886
887 Possible Cause: Using an incorrectly configured VM
888----------------
889-Some Virtual Machine setups include emulation of network hardware that does not support PXE booting, and in most setups, you will need to explicitly set up the VM to boot via PXE.
890+--------------------------------------------------
891+Some Virtual Machine setups include emulation of network hardware that does not
892+support PXE booting, and in most setups, you will need to explicitly set up the
893+VM to boot via PXE.
894
895 **SOLUTION**: Consult the VM docs for details of PXE booting.
896
897 Possible Cause: DHCP conflict
898----------------
899-If you are using MAAS in a setup with an existing DHCP, *DO NOT SET UP THE MAAS DHCP SERVER* as this will cause no end of confusion to the rest of your network and most likely won't discover any nodes either.
900+-----------------------------
901+If you are using MAAS in a setup with an existing DHCP, *DO NOT SET UP THE MAAS
902+DHCP SERVER* as this will cause no end of confusion to the rest of your network
903+and most likely won't discover any nodes either.
904
905 **SOLUTION**: You will need to either:
906
907
908 * Configure your existing DHCP server to point to the MAAS server.
909
910-or
911+ or
912
913-* Enlist nodes using avahi, which is the preferred option. For a quick guide to this, please see https://wiki.ubuntu.com/ServerTeam/MAAS/AvahiBoot
914+* Enlist nodes using avahi, which is the preferred option. For a quick guide to
915+ this, please see https://wiki.ubuntu.com/ServerTeam/MAAS/AvahiBoot
916
917
918
919 **Can't log in to node**
920 ========================
921
922-Sometimes you may wish to login directly to a node on your system. If you have set up Juju and MAAS, the attached nodes will automatically receive existing ssh keys and sets up ssh on the node to authenticate via key, so you can just login with no password from the server.
923-There is also an option in the MAAS web interface to add new ssh keys to the nodes (via Preferences in the drop down menu which appears when clicking your username in the top-right of the page).
924+Sometimes you may wish to login directly to a node on your system. If you have
925+set up Juju and MAAS, the attached nodes will automatically receive existing ssh
926+keys and sets up ssh on the node to authenticate via key, so you can just login
927+with no password from the server.
928+There is also an option in the MAAS web interface to add new ssh keys to the
929+nodes (via Preferences in the drop down menu which appears when clicking your
930+username in the top-right of the page).
931
932 **Forgot MAAS superuser password**
933 ==================================
934
935-As long as you have sudo privileges, this is not a disaster. You can use the ``maas`` command to change the password for the MAAS superuser on the MAAS server:
936+As long as you have sudo privileges, this is not a disaster. You can use the
937+``maas`` command to change the password for the MAAS superuser on the MAAS
938+server:
939
940- ``sudo maas changepassword maas-root``
941+ ``sudo maas changepassword root``
942
943
944 **Need to reconfigure server IP address**
945 =========================================
946-If you made a mistake during setup or you just need to reconfigure your MAAS server, you can simply run the setup again:
947+If you made a mistake during setup or you just need to reconfigure your MAAS
948+server, you can simply run the setup again:
949
950 ``sudo dpkg-reconfigure maas``
951
952@@ -72,12 +95,21 @@
953 **Can't find MAAS webpage**
954 ===========================
955
956-The default webpage is located at ``http://<hostname>/maas``. If you can't access it, there are a few things to try:
957-
958- #. Check that the webserver is running - By default the web interface uses Apache, which runs under the service name *apache2*. To check it, on the MAAS server box you can run ``sudo /etc/init.d/apache2 status``.
959- #. Check that the hostname is correct - It may seem obvious, but check that the hostname is being resolved properly. Try running a browser (even a text mode one like lynx) on the same box as the MAAS server and navigating to the page. If that doesn't work, try ``http://127.0.0.1/maas``, which will always point at the local server.
960- #. If you are still getting "404 - Page not found" errors, check that the MAAS web interface has been installed in the right place. There should be a file present called /usr/share/maas/maas/urls.py
961-
962-
963-Getting help
964-~~~~~~~~~~~~
965+The default webpage is located at ``http://<hostname>/maas``. If you can't
966+access it, there are a few things to try:
967+
968+ #. Check that the webserver is running - By default the web interface uses
969+ Apache, which runs under the service name *apache2*. To check it, on the
970+ MAAS server box you can run ``sudo /etc/init.d/apache2 status``.
971+ #. Check that the hostname is correct - It may seem obvious, but check that
972+ the hostname is being resolved properly. Try running a browser (even a text
973+ mode one like lynx) on the same box as the MAAS server and navigating to the
974+ page. If that doesn't work, try ``http://127.0.0.1/maas``, which will always
975+ point at the local server.
976+ #. If you are still getting "404 - Page not found" errors, check that the MAAS
977+ web interface has been installed in the right place. There should be a file
978+ present called /usr/share/maas/maas/urls.py
979+
980+
981+
982+
983
984=== modified file 'etc/celeryconfig_common.py'
985--- etc/celeryconfig_common.py 2012-10-30 11:26:16 +0000
986+++ etc/celeryconfig_common.py 2012-11-08 10:58:27 +0000
987@@ -46,11 +46,12 @@
988 # this setting.
989 BROKER_URL = 'amqp://guest:guest@localhost:5672//'
990
991-# Location for log file.
992-MAAS_CELERY_LOG = '/var/log/maas/celery.log'
993+# Logging.
994+CELERYD_LOG_FILE = '/var/log/maas/celery.log'
995+CELERYD_LOG_LEVEL = 'INFO'
996
997 # Location for the cluster worker schedule file.
998-MAAS_CLUSTER_CELERY_DB = '/var/lib/maas/celerybeat-cluster-schedule'
999+CELERYBEAT_SCHEDULE_FILENAME = '/var/lib/maas/celerybeat-cluster-schedule'
1000
1001 WORKER_QUEUE_DNS = 'celery'
1002
1003
1004=== modified file 'etc/democeleryconfig.py'
1005--- etc/democeleryconfig.py 2012-10-03 14:18:17 +0000
1006+++ etc/democeleryconfig.py 2012-11-08 10:58:27 +0000
1007@@ -26,5 +26,5 @@
1008
1009 import_settings(democeleryconfig_common)
1010
1011-MAAS_CELERY_LOG = os.path.join(
1012+CELERYD_LOG_FILE = os.path.join(
1013 DEV_ROOT_DIRECTORY, 'logs/region-worker/current')
1014
1015=== modified file 'etc/democeleryconfig_cluster.py'
1016--- etc/democeleryconfig_cluster.py 2012-10-11 12:42:06 +0000
1017+++ etc/democeleryconfig_cluster.py 2012-11-08 10:58:27 +0000
1018@@ -30,8 +30,8 @@
1019 # maas_local_celeryconfig.
1020 CLUSTER_UUID = "adfd3977-f251-4f2c-8d61-745dbd690bfc"
1021
1022-MAAS_CELERY_LOG = os.path.join(
1023+CELERYD_LOG_FILE = os.path.join(
1024 DEV_ROOT_DIRECTORY, 'logs/cluster-worker/current')
1025
1026-MAAS_CLUSTER_CELERY_DB = os.path.join(
1027+CELERYBEAT_SCHEDULE_FILENAME = os.path.join(
1028 DEV_ROOT_DIRECTORY, 'run/celerybeat-cluster-schedule')
1029
1030=== modified file 'etc/maas/import_pxe_files'
1031--- etc/maas/import_pxe_files 2012-10-02 17:00:19 +0000
1032+++ etc/maas/import_pxe_files 2012-11-08 10:58:27 +0000
1033@@ -12,8 +12,8 @@
1034 fi
1035
1036
1037-#RELEASES="oneiric precise"
1038-RELEASES="precise"
1039+#RELEASES="precise"
1040+RELEASES="precise quantal"
1041 #ARCHES="amd64/generic i386/generic armhf/highbank"
1042 #LOCALE="en_US"
1043 #IMPORT_EPHEMERALS=1
1044
1045=== modified file 'required-packages/base'
1046--- required-packages/base 2012-10-02 06:29:49 +0000
1047+++ required-packages/base 2012-11-08 10:58:27 +0000
1048@@ -7,6 +7,8 @@
1049 dnsutils
1050 freeipmi-tools
1051 isc-dhcp-common
1052+libjs-yui3-min
1053+libjs-raphael
1054 libpq-dev
1055 postgresql-9.1
1056 python-amqplib
1057
1058=== modified file 'required-packages/dev'
1059--- required-packages/dev 2012-09-22 15:37:01 +0000
1060+++ required-packages/dev 2012-11-08 10:58:27 +0000
1061@@ -3,10 +3,12 @@
1062 curl
1063 firefox
1064 ipython
1065+libjs-yui3-full
1066 make
1067 python-lxml
1068 python-pip
1069 python-pocket-lint
1070+python-selenium
1071 python-sphinx
1072 python-virtualenv
1073 xvfb
1074
1075=== modified file 'src/apiclient/maas_client.py'
1076--- src/apiclient/maas_client.py 2012-10-09 14:19:33 +0000
1077+++ src/apiclient/maas_client.py 2012-11-08 10:58:27 +0000
1078@@ -16,6 +16,8 @@
1079 'MAASOAuth',
1080 ]
1081
1082+import gzip
1083+from io import BytesIO
1084 import urllib2
1085
1086 from apiclient.encode_json import encode_json_data
1087@@ -82,8 +84,31 @@
1088
1089 :return: A open file-like object that contains the response.
1090 """
1091+ headers = dict(headers)
1092+ # header keys are case insensitive, so we have to pass over them
1093+ set_accept_encoding = False
1094+ for key in headers:
1095+ if key.lower() == 'accept-encoding':
1096+ # The user already supplied a requested encoding, so just pass
1097+ # it along.
1098+ break
1099+ else:
1100+ set_accept_encoding = True
1101+ headers['Accept-encoding'] = 'gzip'
1102 req = urllib2.Request(request_url, data, headers)
1103- return urllib2.urlopen(req)
1104+ res = urllib2.urlopen(req)
1105+ # If we set the Accept-encoding header, then we decode the header for
1106+ # the caller.
1107+ is_gzip = (
1108+ set_accept_encoding
1109+ and res.info().get('Content-Encoding') == 'gzip')
1110+ if is_gzip:
1111+ # Workaround python's gzip failure, gzip.GzipFile wants to be able
1112+ # to seek the file object.
1113+ res_content_io = BytesIO(res.read())
1114+ ungz = gzip.GzipFile(mode='rb', fileobj=res_content_io)
1115+ res = urllib2.addinfourl(ungz, res.headers, res.url, res.code)
1116+ return res
1117
1118
1119 class MAASClient:
1120
1121=== modified file 'src/apiclient/tests/test_maas_client.py'
1122--- src/apiclient/tests/test_maas_client.py 2012-10-09 14:19:33 +0000
1123+++ src/apiclient/tests/test_maas_client.py 2012-11-08 10:58:27 +0000
1124@@ -12,8 +12,11 @@
1125 __metaclass__ = type
1126 __all__ = []
1127
1128+import gzip
1129+from io import BytesIO
1130 import json
1131 from random import randint
1132+import urllib2
1133 from urlparse import (
1134 parse_qs,
1135 urljoin,
1136@@ -29,7 +32,9 @@
1137 parse_headers_and_body_with_django,
1138 parse_headers_and_body_with_mimer,
1139 )
1140+from maastesting.fixtures import TempWDFixture
1141 from maastesting.factory import factory
1142+from maastesting.httpd import HTTPServerFixture
1143 from maastesting.testcase import TestCase
1144 from testtools.matchers import (
1145 AfterPreprocessing,
1146@@ -55,6 +60,62 @@
1147 self.assertEqual(
1148 contents, MAASDispatcher().dispatch_query(url, {}).read())
1149
1150+ def test_request_from_http(self):
1151+ # We can't just call self.make_file because HTTPServerFixture will only
1152+ # serve content from the current WD. And we don't want to create random
1153+ # content in the original WD.
1154+ self.useFixture(TempWDFixture())
1155+ name = factory.getRandomString()
1156+ content = factory.getRandomString().encode('ascii')
1157+ factory.make_file(location='.', name=name, contents=content)
1158+ with HTTPServerFixture() as httpd:
1159+ url = urljoin(httpd.url, name)
1160+ response = MAASDispatcher().dispatch_query(url, {})
1161+ self.assertEqual(200, response.code)
1162+ self.assertEqual(content, response.read())
1163+
1164+ def test_supports_content_encoding_gzip(self):
1165+ # The client will set the Accept-Encoding: gzip header, and it will
1166+ # also decompress the response if it comes back with Content-Encoding:
1167+ # gzip.
1168+ self.useFixture(TempWDFixture())
1169+ name = factory.getRandomString()
1170+ content = factory.getRandomString(300).encode('ascii')
1171+ factory.make_file(location='.', name=name, contents=content)
1172+ called = []
1173+ orig_urllib = urllib2.urlopen
1174+
1175+ def logging_urlopen(*args, **kwargs):
1176+ called.append((args, kwargs))
1177+ return orig_urllib(*args, **kwargs)
1178+ self.patch(urllib2, 'urlopen', logging_urlopen)
1179+ with HTTPServerFixture() as httpd:
1180+ url = urljoin(httpd.url, name)
1181+ res = MAASDispatcher().dispatch_query(url, {})
1182+ self.assertEqual(200, res.code)
1183+ self.assertEqual(content, res.read())
1184+ request = called[0][0][0]
1185+ self.assertEqual([((request,), {})], called)
1186+ self.assertEqual('gzip', request.headers.get('Accept-encoding'))
1187+
1188+ def test_doesnt_override_accept_encoding_headers(self):
1189+ # If someone passes their own Accept-Encoding header, then dispatch
1190+ # just passes it through.
1191+ self.useFixture(TempWDFixture())
1192+ name = factory.getRandomString()
1193+ content = factory.getRandomString(300).encode('ascii')
1194+ factory.make_file(location='.', name=name, contents=content)
1195+ with HTTPServerFixture() as httpd:
1196+ url = urljoin(httpd.url, name)
1197+ headers = {'Accept-encoding': 'gzip'}
1198+ res = MAASDispatcher().dispatch_query(url, headers)
1199+ self.assertEqual(200, res.code)
1200+ self.assertEqual('gzip', res.info().get('Content-Encoding'))
1201+ raw_content = res.read()
1202+ read_content = gzip.GzipFile(
1203+ mode='rb', fileobj=BytesIO(raw_content)).read()
1204+ self.assertEqual(content, read_content)
1205+
1206
1207 def make_url():
1208 """Create an arbitrary URL."""
1209
1210=== modified file 'src/maas/settings.py'
1211--- src/maas/settings.py 2012-09-19 13:48:42 +0000
1212+++ src/maas/settings.py 2012-11-08 10:58:27 +0000
1213@@ -92,16 +92,16 @@
1214 # path relative to the 'static' directory.
1215 # Use an absolute path (like '/usr/share/javascript/raphael/') to serve the
1216 # files from a custom location.
1217-RAPHAELJS_LOCATION = os.path.join('jslibs', 'raphael')
1218+RAPHAELJS_LOCATION = '/usr/share/javascript/raphael/'
1219
1220 YUI_DEBUG = DEBUG
1221
1222 # Set this to where YUI3 files can be found.
1223 # Use a relative path (i.e. a path not starting with '/') to indicate a
1224 # path relative to the 'static' directory.
1225-# Use an absolute path (like '/usr/share/javascript/yui/') to serve the files
1226+# Use an absolute path (like '/usr/share/javascript/yui3/') to serve the files
1227 # from a custom location.
1228-YUI_LOCATION = os.path.join('jslibs', 'yui')
1229+YUI_LOCATION = '/usr/share/javascript/yui3/'
1230
1231 STATIC_LOCAL_SERVE = DEBUG
1232
1233@@ -174,7 +174,8 @@
1234
1235 # URL prefix for static files.
1236 # Example: "http://media.lawrence.com/static/"
1237-STATIC_URL = '/static/'
1238+STATIC_URL_PATTERN = '/static/'
1239+STATIC_URL = STATIC_URL_PATTERN
1240 if FORCE_SCRIPT_NAME is not None:
1241 STATIC_URL = FORCE_SCRIPT_NAME + STATIC_URL
1242
1243@@ -246,6 +247,7 @@
1244 'django.contrib.auth.middleware.AuthenticationMiddleware',
1245 'django.contrib.messages.middleware.MessageMiddleware',
1246 'maasserver.middleware.AccessMiddleware',
1247+ 'django.middleware.gzip.GZipMiddleware',
1248 )
1249
1250 ROOT_URLCONF = 'maas.urls'
1251
1252=== modified file 'src/maas/urls.py'
1253--- src/maas/urls.py 2012-06-20 14:41:56 +0000
1254+++ src/maas/urls.py 2012-11-08 10:58:27 +0000
1255@@ -32,7 +32,7 @@
1256 {'document_root': settings.MEDIA_ROOT}),
1257 )
1258
1259- urlpatterns += staticfiles_urlpatterns()
1260+ urlpatterns += staticfiles_urlpatterns(settings.STATIC_URL_PATTERN)
1261
1262 if settings.DEBUG:
1263 from django.contrib import admin
1264
1265=== modified file 'src/maascli/api.py'
1266--- src/maascli/api.py 2012-10-08 20:56:17 +0000
1267+++ src/maascli/api.py 2012-11-08 10:58:27 +0000
1268@@ -21,6 +21,10 @@
1269 import json
1270 from operator import itemgetter
1271 import sys
1272+from textwrap import (
1273+ dedent,
1274+ fill,
1275+ )
1276 from urlparse import (
1277 urljoin,
1278 urlparse,
1279@@ -257,7 +261,8 @@
1280 }
1281 action_class = type(action_name, action_bases, action_ns)
1282 action_parser = parser.subparsers.add_parser(
1283- action_name, help=help_title, description=help_body)
1284+ action_name, help=help_title, description=help_title,
1285+ epilog=help_body)
1286 action_parser.set_defaults(
1287 execute=action_class(action_parser))
1288
1289@@ -267,7 +272,8 @@
1290 help_title, help_body = parse_docstring(handler["doc"])
1291 handler_name = handler_command_name(handler["name"])
1292 handler_parser = parser.subparsers.add_parser(
1293- handler_name, help=help_title, description=help_body)
1294+ handler_name, help=help_title, description=help_title,
1295+ epilog=help_body)
1296 register_actions(profile, handler, handler_parser)
1297
1298
1299@@ -308,11 +314,32 @@
1300 register_handler(profile, represent_as, parser)
1301
1302
1303+profile_help = '\n\n'.join(
1304+ map(fill, map(dedent, [
1305+ """\
1306+ This is a profile. Any commands you issue on this
1307+ profile will operate on the MAAS region server.
1308+ """,
1309+ """\
1310+ The command information you see here comes from the
1311+ region server's API; it may differ for different
1312+ profiles. If you believe the API may have changed,
1313+ use the command's 'refresh' sub-command to fetch the
1314+ latest version of this help information from the
1315+ server.
1316+ """,
1317+ ])))
1318+
1319+
1320 def register_api_commands(parser):
1321 """Register all profiles as subcommands on `parser`."""
1322 with ProfileConfig.open() as config:
1323 for profile_name in config:
1324 profile = config[profile_name]
1325 profile_parser = parser.subparsers.add_parser(
1326- profile["name"], help="Interact with %(url)s" % profile)
1327+ profile["name"], help="Interact with %(url)s" % profile,
1328+ description=(
1329+ "Issue commands to the MAAS region controller at %(url)s."
1330+ % profile),
1331+ epilog=profile_help)
1332 register_resources(profile, profile_parser)
1333
1334=== modified file 'src/maascli/cli.py'
1335--- src/maascli/cli.py 2012-10-09 11:54:44 +0000
1336+++ src/maascli/cli.py 2012-11-08 10:58:27 +0000
1337@@ -29,7 +29,7 @@
1338
1339
1340 class cmd_login(Command):
1341- """Log-in to a remote API, storing its description and credentials.
1342+ """Log in to a remote API, and remember its description and credentials.
1343
1344 If credentials are not provided on the command-line, they will be prompted
1345 for interactively.
1346@@ -95,7 +95,12 @@
1347
1348
1349 class cmd_refresh(Command):
1350- """Refresh the API descriptions of all profiles."""
1351+ """Refresh the API descriptions of all profiles.
1352+
1353+ This retrieves the latest version of the help information for each
1354+ profile. Use it to update your maas-cli client's information after an
1355+ upgrade to the MAAS server.
1356+ """
1357
1358 def __call__(self, options):
1359 with ProfileConfig.open() as config:
1360@@ -107,7 +112,11 @@
1361
1362
1363 class cmd_logout(Command):
1364- """Log-out of a remote API, purging any stored credentials."""
1365+ """Log out of a remote API, purging any stored credentials.
1366+
1367+ This will remove the given profile from your maas-cli client. You can
1368+ re-create it by logging in again later.
1369+ """
1370
1371 def __init__(self, parser):
1372 super(cmd_logout, self).__init__(parser)
1373@@ -151,5 +160,6 @@
1374 for name, command in commands.items():
1375 help_title, help_body = parse_docstring(command)
1376 command_parser = parser.subparsers.add_parser(
1377- safe_name(name), help=help_title, description=help_body)
1378+ safe_name(name), help=help_title, description=help_title,
1379+ epilog=help_body)
1380 command_parser.set_defaults(execute=command(command_parser))
1381
1382=== modified file 'src/maascli/utils.py'
1383--- src/maascli/utils.py 2012-10-08 20:56:17 +0000
1384+++ src/maascli/utils.py 2012-11-08 10:58:27 +0000
1385@@ -39,6 +39,11 @@
1386
1387
1388 def parse_docstring(thing):
1389+ """Parse python docstring for `thing`.
1390+
1391+ Returns a tuple: (title, body). As per docstring convention, title is
1392+ the docstring's first paragraph and body is the rest.
1393+ """
1394 is_string = isinstance(thing, basestring)
1395 doc = cleandoc(thing) if is_string else getdoc(thing)
1396 doc = empty if doc is None else doc
1397
1398=== modified file 'src/maasserver/api.py'
1399--- src/maasserver/api.py 2012-11-08 09:54:37 +0000
1400+++ src/maasserver/api.py 2012-11-08 10:58:27 +0000
1401@@ -471,7 +471,10 @@
1402
1403
1404 class NodeHandler(OperationsHandler):
1405- """Manage individual Nodes."""
1406+ """Manage an individual Node.
1407+
1408+ The Node is identified by its system_id.
1409+ """
1410 create = None # Disable create.
1411 model = Node
1412 fields = DISPLAYED_NODE_FIELDS
1413@@ -653,7 +656,7 @@
1414
1415
1416 class AnonNodesHandler(AnonymousOperationsHandler):
1417- """Create Nodes."""
1418+ """Anonymous access to Nodes."""
1419 create = read = update = delete = None
1420 model = Node
1421 fields = DISPLAYED_NODE_FIELDS
1422@@ -732,7 +735,7 @@
1423
1424
1425 class NodesHandler(OperationsHandler):
1426- """Manage collection of Nodes."""
1427+ """Manage the collection of all Nodes in the MAAS."""
1428 create = read = update = delete = None
1429 anonymous = AnonNodesHandler
1430
1431@@ -827,6 +830,51 @@
1432 nodes = [node.accept_enlistment(request.user) for node in nodes]
1433 return filter(None, nodes)
1434
1435+ @operation(idempotent=False)
1436+ def release(self, request):
1437+ """Release multiple nodes.
1438+
1439+ This places the nodes back into the pool, ready to be reallocated.
1440+
1441+ :param nodes: system_ids of the nodes which are to be released.
1442+ (An empty list is acceptable).
1443+ :return: The system_ids of any nodes that have their status
1444+ changed by this call. Thus, nodes that were already released
1445+ are excluded from the result.
1446+ """
1447+ system_ids = set(request.POST.getlist('nodes'))
1448+ # Check the existence of these nodes first.
1449+ self._check_system_ids_exist(system_ids)
1450+ # Make sure that the user has the required permission.
1451+ nodes = Node.objects.get_nodes(
1452+ request.user, perm=NODE_PERMISSION.EDIT, ids=system_ids)
1453+ if len(nodes) < len(system_ids):
1454+ permitted_ids = set(node.system_id for node in nodes)
1455+ raise PermissionDenied(
1456+ "You don't have the required permission to release the "
1457+ "following node(s): %s." % (
1458+ ', '.join(system_ids - permitted_ids)))
1459+
1460+ released_ids = []
1461+ failed = []
1462+ for node in nodes:
1463+ if node.status == NODE_STATUS.READY:
1464+ # Nothing to do.
1465+ pass
1466+ elif node.status in [NODE_STATUS.ALLOCATED, NODE_STATUS.RESERVED]:
1467+ node.release()
1468+ released_ids.append(node.system_id)
1469+ else:
1470+ failed.append(
1471+ "%s ('%s')"
1472+ % (node.system_id, node.display_status()))
1473+
1474+ if any(failed):
1475+ raise NodeStateViolation(
1476+ "Node(s) cannot be released in their current state: %s."
1477+ % ', '.join(failed))
1478+ return released_ids
1479+
1480 @operation(idempotent=True)
1481 def list(self, request):
1482 """List Nodes visible to the user, optionally filtered by criteria.
1483@@ -884,10 +932,12 @@
1484
1485
1486 class NodeMacsHandler(OperationsHandler):
1487- """
1488- Manage all the MAC addresses linked to a Node / Create a new MAC address
1489- for a Node.
1490-
1491+ """Manage MAC addresses for a given Node.
1492+
1493+ This is where you manage the MAC addresses linked to a Node, including
1494+ associating a new MAC address with the Node.
1495+
1496+ The Node is identified by its system_id.
1497 """
1498 update = delete = None
1499
1500@@ -911,7 +961,11 @@
1501
1502
1503 class NodeMacHandler(OperationsHandler):
1504- """Manage a MAC address linked to a Node."""
1505+ """Manage a MAC address.
1506+
1507+ The MAC address object is identified by the system_id for the Node it
1508+ is attached to, plus the MAC address itself.
1509+ """
1510 create = update = None
1511 fields = ('mac_address',)
1512 model = MACAddress
1513@@ -1032,7 +1086,7 @@
1514
1515
1516 class AnonNodeGroupsHandler(AnonymousOperationsHandler):
1517- """Anon Node-groups API."""
1518+ """Anonymous access to NodeGroups."""
1519 create = read = update = delete = None
1520 fields = DISPLAYED_NODEGROUP_FIELDS
1521
1522@@ -1125,7 +1179,7 @@
1523
1524
1525 class NodeGroupsHandler(OperationsHandler):
1526- """Node-groups API."""
1527+ """Manage NodeGroups."""
1528 anonymous = AnonNodeGroupsHandler
1529 create = read = update = delete = None
1530 fields = DISPLAYED_NODEGROUP_FIELDS
1531@@ -1154,6 +1208,16 @@
1532 raise PermissionDenied("That method is reserved to admin users.")
1533
1534 @operation(idempotent=False)
1535+ def import_boot_images(self, request):
1536+ """Import the boot images on all the accepted cluster controllers."""
1537+ if not request.user.is_superuser:
1538+ raise PermissionDenied("That method is reserved to admin users.")
1539+ NodeGroup.objects.import_boot_images_accepted_clusters()
1540+ return HttpResponse(
1541+ "Import of boot images started on all cluster controllers",
1542+ status=httplib.OK)
1543+
1544+ @operation(idempotent=False)
1545 def reject(self, request):
1546 """Reject nodegroup enlistment(s).
1547
1548@@ -1194,7 +1258,17 @@
1549
1550
1551 class NodeGroupHandler(OperationsHandler):
1552- """Node-group API."""
1553+ """Manage a NodeGroup.
1554+
1555+ NodeGroup is the internal name for a cluster.
1556+
1557+ The NodeGroup is identified by its UUID, a random identifier that looks
1558+ something like:
1559+
1560+ 5977f6ab-9160-4352-b4db-d71a99066c4f
1561+
1562+ Each NodeGroup has its own uuid.
1563+ """
1564
1565 create = update = delete = None
1566 fields = DISPLAYED_NODEGROUP_FIELDS
1567@@ -1213,6 +1287,11 @@
1568
1569 @operation(idempotent=False)
1570 def update_leases(self, request, uuid):
1571+ """Submit latest state of DHCP leases within the cluster.
1572+
1573+ The cluster controller calls this periodically to tell the region
1574+ controller about the IP addresses it manages.
1575+ """
1576 leases = get_mandatory_param(request.data, 'leases')
1577 nodegroup = get_object_or_404(NodeGroup, uuid=uuid)
1578 check_nodegroup_access(request, nodegroup)
1579@@ -1223,6 +1302,17 @@
1580 {ip: leases[ip] for ip in new_leases if ip in leases})
1581 return HttpResponse("Leases updated.", status=httplib.OK)
1582
1583+ @operation(idempotent=False)
1584+ def import_boot_images(self, request, uuid):
1585+ """Import the pxe files on this cluster controller."""
1586+ if not request.user.is_superuser:
1587+ raise PermissionDenied("That method is reserved to admin users.")
1588+ nodegroup = get_object_or_404(NodeGroup, uuid=uuid)
1589+ nodegroup.import_boot_images()
1590+ return HttpResponse(
1591+ "Import of boot images started on cluster %r" % nodegroup.uuid,
1592+ status=httplib.OK)
1593+
1594 @operation(idempotent=True)
1595 def list_nodes(self, request, uuid):
1596 """Get the list of node ids that are part of this group."""
1597@@ -1271,7 +1361,11 @@
1598
1599
1600 class NodeGroupInterfacesHandler(OperationsHandler):
1601- """NodeGroupInterfaces API."""
1602+ """Manage NodeGroupInterfaces.
1603+
1604+ A NodeGroupInterface is a network interface attached to a cluster
1605+ controller, with its network properties.
1606+ """
1607 create = read = update = delete = None
1608 fields = DISPLAYED_NODEGROUP_FIELDS
1609
1610@@ -1320,7 +1414,11 @@
1611
1612
1613 class NodeGroupInterfaceHandler(OperationsHandler):
1614- """NodeGroupInterface API."""
1615+ """Manage a NodeGroupInterface.
1616+
1617+ A NodeGroupInterface is identified by the uuid for its NodeGroup, and
1618+ the name of the network interface it represents: "eth0" for example.
1619+ """
1620 create = delete = None
1621 fields = DISPLAYED_NODEGROUP_FIELDS
1622
1623@@ -1423,13 +1521,20 @@
1624
1625
1626 class TagHandler(OperationsHandler):
1627- """Manage individual Tags."""
1628+ """Manage individual Tags.
1629+
1630+ Tags are properties that can be associated with a Node and serve as
1631+ criteria for selecting and allocating nodes.
1632+
1633+ A Tag is identified by its name.
1634+ """
1635 create = None
1636 model = Tag
1637 fields = (
1638 'name',
1639 'definition',
1640 'comment',
1641+ 'kernel_opts',
1642 )
1643
1644 def read(self, request, name):
1645@@ -1503,6 +1608,10 @@
1646
1647 :param add: system_ids of nodes to add to this tag.
1648 :param remove: system_ids of nodes to remove from this tag.
1649+ :param definition: (optional) If supplied, the definition will be
1650+ validated against the current definition of the tag. If the value
1651+ does not match, then the update will be dropped (assuming this was
1652+ just a case of a worker being out-of-date)
1653 :param nodegroup: A uuid of a nodegroup being processed. This value is
1654 optional. If not supplied, the requester must be a superuser. If
1655 supplied, then the requester must be the worker associated with
1656@@ -1518,6 +1627,13 @@
1657 'Must be a superuser or supply a nodegroup')
1658 nodegroup = get_one(NodeGroup.objects.filter(uuid=uuid))
1659 check_nodegroup_access(request, nodegroup)
1660+ definition = request.data.get('definition', None)
1661+ if definition is not None and tag.definition != definition:
1662+ return HttpResponse(
1663+ "Definition supplied '%s' "
1664+ "doesn't match current definition '%s'"
1665+ % (definition, tag.definition),
1666+ status=httplib.CONFLICT)
1667 nodes_to_add = self._get_nodes_for(request, 'add', nodegroup)
1668 tag.node_set.add(*nodes_to_add)
1669 nodes_to_remove = self._get_nodes_for(request, 'remove', nodegroup)
1670@@ -1550,6 +1666,11 @@
1671 It is meant as a human readable description of the tag.
1672 :param definition: An XPATH query that will be evaluated against the
1673 hardware_details stored for all nodes (output of `lshw -xml`).
1674+ :param kernel_opts: Can be None. If set, nodes associated with this tag
1675+ will add this string to their kernel options when booting. The
1676+ value overrides the global 'kernel_opts' setting. If more than one
1677+ tag is associated with a node, the one with the lowest alphabetical
1678+ name will be picked (eg 01-my-tag will be taken over 99-tag-name).
1679 """
1680 if not request.user.is_superuser:
1681 raise PermissionDenied()
1682@@ -1784,6 +1905,13 @@
1683 else:
1684 series = node.get_distro_series()
1685
1686+ if node is not None:
1687+ # We don't care if the kernel opts is from the global setting or a tag,
1688+ # just get the options
1689+ _, extra_kernel_opts = node.get_effective_kernel_options()
1690+ else:
1691+ extra_kernel_opts = None
1692+
1693 purpose = get_boot_purpose(node)
1694 server_address = get_maas_facing_server_address()
1695 cluster_address = get_mandatory_param(request.GET, "local")
1696@@ -1791,7 +1919,8 @@
1697 params = KernelParameters(
1698 arch=arch, subarch=subarch, release=series, purpose=purpose,
1699 hostname=hostname, domain=domain, preseed_url=preseed_url,
1700- log_host=server_address, fs_host=cluster_address)
1701+ log_host=server_address, fs_host=cluster_address,
1702+ extra_opts=extra_kernel_opts)
1703
1704 return HttpResponse(
1705 json.dumps(params._asdict()),
1706
1707=== modified file 'src/maasserver/dhcp_connect.py'
1708--- src/maasserver/dhcp_connect.py 2012-10-03 07:48:03 +0000
1709+++ src/maasserver/dhcp_connect.py 2012-11-08 10:58:27 +0000
1710@@ -31,7 +31,7 @@
1711 configure_dhcp(instance.nodegroup)
1712
1713
1714-def dhcp_post_edit_status_NodeGroup(instance, old_field):
1715+def dhcp_post_edit_status_NodeGroup(instance, old_field, **kwargs):
1716 """The status of a NodeGroup changed."""
1717 # This could be optimized a bit by detecting if the status change is
1718 # actually a change from 'do not manage DHCP' to 'manage DHCP'.
1719
1720=== modified file 'src/maasserver/dns.py'
1721--- src/maasserver/dns.py 2012-10-01 16:34:43 +0000
1722+++ src/maasserver/dns.py 2012-11-08 10:58:27 +0000
1723@@ -37,6 +37,7 @@
1724 from maasserver.models import (
1725 DHCPLease,
1726 NodeGroup,
1727+ NodeGroupInterface,
1728 )
1729 from maasserver.sequence import (
1730 INT_MAX,
1731@@ -64,6 +65,14 @@
1732 return '%0.10d' % zone_serial.nextval()
1733
1734
1735+def is_dns_in_use():
1736+ """Is there at least one interface configured to manage DNS?"""
1737+ interfaces_with_dns = (
1738+ NodeGroupInterface.objects.filter(
1739+ management=NODEGROUPINTERFACE_MANAGEMENT.DHCP_AND_DNS))
1740+ return interfaces_with_dns.exists()
1741+
1742+
1743 def is_dns_enabled():
1744 """Is MAAS configured to manage DNS?"""
1745 return settings.DNS_CONNECT
1746@@ -82,17 +91,18 @@
1747 interface.management == NODEGROUPINTERFACE_MANAGEMENT.DHCP_AND_DNS)
1748
1749
1750+WARNING_MESSAGE = (
1751+ "The DNS server will use the address '%s', which is inside the "
1752+ "loopback network. This may not be a problem if you're not using "
1753+ "MAAS's DNS features or if you don't rely on this information. "
1754+ "Be sure to configure the DEFAULT_MAAS_URL setting in MAAS's "
1755+ "/etc/maas/maas_local_settings.py.")
1756+
1757+
1758 def warn_loopback(ip):
1759 """Warn if the given IP address is in the loopback network."""
1760 if IPAddress(ip) in IPNetwork('127.0.0.1/8'):
1761- logging.getLogger('maas').warn(
1762- "The DNS server will use the address '%s', which is inside the "
1763- "loopback network. This may not be a problem if you're not using "
1764- "MAAS's DNS features or if you don't rely on this information. "
1765- "Be sure to configure the DEFAULT_MAAS_URL setting in MAAS's "
1766- "settings.py (or demo.py/development.py if you are running a "
1767- "development system)."
1768- % ip)
1769+ logging.getLogger('maas').warn(WARNING_MESSAGE % ip)
1770
1771
1772 def get_dns_server_address():
1773@@ -251,7 +261,7 @@
1774 zone should be updated.
1775 :type nodegroups: list (or :class:`NodeGroup`)
1776 """
1777- if not is_dns_enabled():
1778+ if not (is_dns_enabled() and is_dns_in_use()):
1779 return
1780 serial = next_zone_serial()
1781 for zone in ZoneGenerator(nodegroups, serial):
1782@@ -271,7 +281,7 @@
1783 :param nodegroup: The nodegroup for which the zone should be added.
1784 :type nodegroup: :class:`NodeGroup`
1785 """
1786- if not is_dns_enabled():
1787+ if not (is_dns_enabled() and is_dns_in_use()):
1788 return
1789 zones_to_write = ZoneGenerator(nodegroup).as_list()
1790 if len(zones_to_write) == 0:
1791@@ -286,23 +296,21 @@
1792 zones=zones_to_write, callback=write_dns_config_subtask)
1793
1794
1795-def write_full_dns_config(active=True, reload_retry=False):
1796+def write_full_dns_config(reload_retry=False, force=False):
1797 """Write the DNS configuration.
1798
1799- :param active: If True, write the DNS config for all the nodegroups.
1800- Otherwise write an empty DNS config (with no zones). Defaults
1801- to `True`.
1802- :type active: bool
1803 :param reload_retry: Should the reload rndc command be retried in case
1804 of failure? Defaults to `False`.
1805 :type reload_retry: bool
1806+ :param force: Write the configuration even if no interface is
1807+ configured to manage DNS.
1808+ :type force: bool
1809 """
1810- if not is_dns_enabled():
1811+ write_conf = (
1812+ is_dns_enabled() and (force or is_dns_in_use()))
1813+ if not write_conf:
1814 return
1815- if active:
1816- zones = ZoneGenerator(NodeGroup.objects.all()).as_list()
1817- else:
1818- zones = []
1819+ zones = ZoneGenerator(NodeGroup.objects.all()).as_list()
1820 tasks.write_full_dns_config.delay(
1821 zones=zones,
1822 callback=tasks.rndc_command.subtask(
1823
1824=== modified file 'src/maasserver/dns_connect.py'
1825--- src/maasserver/dns_connect.py 2012-10-08 12:50:32 +0000
1826+++ src/maasserver/dns_connect.py 2012-11-08 10:58:27 +0000
1827@@ -19,6 +19,7 @@
1828 post_save,
1829 )
1830 from django.dispatch import receiver
1831+from maasserver.enum import NODEGROUPINTERFACE_MANAGEMENT
1832 from maasserver.models import (
1833 Node,
1834 NodeGroup,
1835@@ -50,11 +51,19 @@
1836 write_full_dns_config()
1837
1838
1839-@receiver(post_delete, sender=NodeGroup)
1840-def dns_post_delete_NodeGroup(sender, instance, **kwargs):
1841- """Delete DNS zones related to the nodegroup."""
1842+def dns_post_edit_management_NodeGroupInterface(instance, old_field, deleted):
1843+ """Delete DNS zones related to the interface."""
1844 from maasserver.dns import write_full_dns_config
1845- write_full_dns_config()
1846+ if old_field == NODEGROUPINTERFACE_MANAGEMENT.DHCP_AND_DNS:
1847+ # Force the dns config to be written as this might have been
1848+ # triggered by the last DNS-enabled interface being deleted
1849+ # or switched off (i.e. management set to DHCP or UNMANAGED).
1850+ write_full_dns_config(force=True)
1851+
1852+
1853+connect_to_field_change(
1854+ dns_post_edit_management_NodeGroupInterface,
1855+ NodeGroupInterface, 'management', delete=True)
1856
1857
1858 @receiver(post_delete, sender=Node)
1859@@ -70,7 +79,7 @@
1860 pass
1861
1862
1863-def dns_post_edit_hostname_Node(instance, old_field):
1864+def dns_post_edit_hostname_Node(instance, old_field, **kwargs):
1865 """When a Node has been flagged, update the related zone."""
1866 from maasserver.dns import change_dns_zones
1867 change_dns_zones(instance.nodegroup)
1868
1869=== modified file 'src/maasserver/fixtures/dev_fixture.yaml'
1870--- src/maasserver/fixtures/dev_fixture.yaml 2012-10-08 10:40:20 +0000
1871+++ src/maasserver/fixtures/dev_fixture.yaml 2012-11-08 10:58:27 +0000
1872@@ -1,6 +1,6 @@
1873 - fields: {
1874 created: 2012-01-24, hostname: sun, architecture: 'i386/generic',
1875- owner: null, status: 0, nodegroup: 1, tags: [30],
1876+ owner: null, status: 0, nodegroup: null, tags: [30],
1877 cpu_count: 16, memory: 16384,
1878 system_id: node-2666dd64-4671-11e1-93b8-00225f89f211,
1879 updated: !!timestamp '2012-01-24 10:52:38.735954'}
1880@@ -8,7 +8,7 @@
1881 pk: 15
1882 - fields: {
1883 created: 2012-01-24, hostname: moon, architecture: 'i386/generic',
1884- owner: null, status: 2, nodegroup: 1, tags: [],
1885+ owner: null, status: 2, nodegroup: null, tags: [],
1886 cpu_count: 1, memory: 512,
1887 system_id: node-29d7ad70-4671-11e1-93b8-00225f89f211,
1888 updated: !!timestamp '2012-01-24 10:52:44.507777'}
1889@@ -16,7 +16,7 @@
1890 pk: 16
1891 - fields: {
1892 created: 2012-01-24, hostname: mars, architecture: 'i386/generic',
1893- owner: 106, status: 3, nodegroup: 1, tags: [31],
1894+ owner: 106, status: 3, nodegroup: null, tags: [31],
1895 cpu_count: 2, memory: 2096,
1896 system_id: node-2d424b28-4671-11e1-93b8-00225f89f211,
1897 updated: !!timestamp '2012-01-24 10:52:50.239704'}
1898@@ -24,7 +24,7 @@
1899 pk: 17
1900 - fields: {
1901 created: 2012-01-24, hostname: jupiter, architecture: 'i386/generic',
1902- owner: null, status: 0, nodegroup: 1, tags: [30, 31],
1903+ owner: null, status: 0, nodegroup: null, tags: [30, 31],
1904 cpu_count: 4, memory: 8192,
1905 system_id: node-2fb4fec8-4671-11e1-93b8-00225f89f211,
1906 updated: !!timestamp '2012-01-24 10:52:54.346832'}
1907@@ -32,7 +32,7 @@
1908 pk: 18
1909 - fields: {
1910 created: 2012-01-24, hostname: saturn, architecture: 'i386/generic',
1911- owner: 101, status: 3, nodegroup: 1, tags: [30, 31, 32],
1912+ owner: 101, status: 3, nodegroup: null, tags: [30, 31, 32],
1913 cpu_count: 4, memory: 4096,
1914 system_id: node-33b55e28-4671-11e1-93b8-00225f89f211,
1915 updated: !!timestamp '2012-01-24 10:53:01.060176'}
1916
1917=== modified file 'src/maasserver/forms.py'
1918--- src/maasserver/forms.py 2012-11-08 09:14:58 +0000
1919+++ src/maasserver/forms.py 2012-11-08 10:58:27 +0000
1920@@ -403,7 +403,7 @@
1921 hostname == "" or
1922 IP_BASED_HOSTNAME_REGEXP.match(stripped_hostname) != None)
1923 if generate_hostname:
1924- node.set_mac_based_hostname(self.cleaned_data['mac_addresses'][0])
1925+ node.set_random_hostname()
1926 return node
1927
1928
1929@@ -646,6 +646,13 @@
1930 self._load_initials()
1931
1932
1933+class GlobalKernelOptsForm(ConfigForm):
1934+ """Settings page, Global Kernel Parameters section."""
1935+ kernel_opts = forms.CharField(
1936+ label="Boot parameters to pass to the kernel by default",
1937+ required=False)
1938+
1939+
1940 hostname_error_msg = "Enter a valid hostname (e.g. host.example.com)."
1941
1942
1943@@ -855,6 +862,7 @@
1944 'name',
1945 'comment',
1946 'definition',
1947+ 'kernel_opts',
1948 )
1949
1950 def clean_definition(self):
1951
1952=== removed file 'src/maasserver/management/commands/config_master_dhcp.py'
1953--- src/maasserver/management/commands/config_master_dhcp.py 2012-09-19 13:48:42 +0000
1954+++ src/maasserver/management/commands/config_master_dhcp.py 1970-01-01 00:00:00 +0000
1955@@ -1,107 +0,0 @@
1956-# Copyright 2012 Canonical Ltd. This software is licensed under the
1957-# GNU Affero General Public License version 3 (see the file LICENSE).
1958-
1959-"""Django command: Configure master DHCP.
1960-
1961-The master DHCP settings apply to the DHCP server running on the MAAS server
1962-itself. They can be either disabled (if you don't want MAAS to manage DHCP)
1963-or fully configured using this command.
1964-"""
1965-
1966-from __future__ import (
1967- absolute_import,
1968- print_function,
1969- unicode_literals,
1970- )
1971-
1972-__metaclass__ = type
1973-__all__ = [
1974- 'Command',
1975- ]
1976-
1977-from optparse import (
1978- make_option,
1979- OptionValueError,
1980- )
1981-
1982-from django.core.management.base import BaseCommand
1983-from maasserver.enum import NODEGROUPINTERFACE_MANAGEMENT
1984-from maasserver.models import (
1985- NodeGroup,
1986- NodeGroupInterface,
1987- )
1988-
1989-
1990-dhcp_items = {
1991- 'interface': "The network interface that should service DHCP requests.",
1992- 'ip': "The IP address at which nodes can reach the DHCP server.",
1993- 'subnet_mask': "Subnet mask, e.g. 255.0.0.0.",
1994- 'broadcast_ip': "Broadcast address for this subnet, e.g. 10.255.255.255.",
1995- 'router_ip': "Address of default gateway.",
1996- 'ip_range_low': "Lowest IP address to assign to clients.",
1997- 'ip_range_high': "Highest IP address to assign to clients.",
1998- }
1999-
2000-
2001-def get_settings(options):
2002- """Get the DHCP settings from `options`, as a dict.
2003-
2004- Checks validity of the settings.
2005- """
2006- settings = {
2007- item: options.get(item)
2008- for item in dhcp_items}
2009- # All of the DHCP settings must have (non-empty) values.
2010- if not all(settings.values()):
2011- raise OptionValueError(
2012- "Specify all DHCP settings: %s" % ', '.join(dhcp_items))
2013- return settings
2014-
2015-
2016-def name_option(dhcp_setting):
2017- """Formulate the option name corresponding to a DHCP setting name."""
2018- return '--%s' % dhcp_setting.replace('_', '-')
2019-
2020-
2021-class Command(BaseCommand):
2022-
2023- option_list = BaseCommand.option_list + (
2024- make_option(
2025- '--clear', dest='clear', action='store_true', default=False,
2026- help=(
2027- "Clear settings. Do only when MAAS DHCP is disabled. "
2028- "If given, any DHCP parameters are ignored.")),
2029- make_option(
2030- '--ensure', dest='ensure', action='store_true', default=False,
2031- help=(
2032- "Ensure that the master node group is configured, "
2033- "but if it was already set up, don't change its settings. "
2034- "If given, any DHCP parameters are ignored.")),
2035- ) + tuple(
2036- make_option(
2037- name_option(item), dest=item, default=None,
2038- help="DHCP parameter: %s" % help)
2039- for item, help in dhcp_items.items())
2040- help = "Initialize master DHCP settings."
2041-
2042- def handle(self, *args, **options):
2043- if options.get('ensure') and options.get('clear'):
2044- raise OptionValueError(
2045- "The --ensure option conflicts with --clear.")
2046- master_nodegroup = NodeGroup.objects.ensure_master()
2047- if not options.get('ensure'):
2048- if options.get('clear'):
2049- master_nodegroup.nodegroupinterface_set.all().delete()
2050- return
2051-
2052- settings = get_settings(options)
2053- interface = master_nodegroup.get_managed_interface()
2054- if interface is None:
2055- interface = NodeGroupInterface(
2056- nodegroup=master_nodegroup,
2057- management=NODEGROUPINTERFACE_MANAGEMENT.DHCP)
2058- # That kind of manipulation should really be done via a form
2059- # rather than with 'setattr'.
2060- for item, value in settings.items():
2061- setattr(interface, item, value)
2062- interface.save()
2063
2064=== modified file 'src/maasserver/management/commands/get_named_conf.py'
2065--- src/maasserver/management/commands/get_named_conf.py 2012-07-16 13:22:56 +0000
2066+++ src/maasserver/management/commands/get_named_conf.py 2012-11-08 10:58:27 +0000
2067@@ -23,8 +23,8 @@
2068 from provisioningserver.dns.config import DNSConfig
2069
2070
2071-INCLUDE_SNIPPET_COMMENT = """
2072-# Append the following content to your local BIND configuration
2073+INCLUDE_SNIPPET_COMMENT = """\
2074+# Append the following content to your local BIND configuration
2075 # file (usually /etc/bind/named.conf.local) in order to allow
2076 # MAAS to manage its DNS zones.
2077 """
2078
2079=== modified file 'src/maasserver/management/commands/set_up_dns.py'
2080--- src/maasserver/management/commands/set_up_dns.py 2012-08-13 11:04:44 +0000
2081+++ src/maasserver/management/commands/set_up_dns.py 2012-11-08 10:58:27 +0000
2082@@ -6,7 +6,7 @@
2083 This creates a basic, blank DNS configuration which will allow MAAS to
2084 reload its configuration once zone files will be written.
2085
2086-The main purpose of this command is for it to be run when MAAS is
2087+The main purpose of this command is for it to be run when 'maas-dns' is
2088 installed.
2089 """
2090
2091
2092=== added file 'src/maasserver/management/commands/write_dns_config.py'
2093--- src/maasserver/management/commands/write_dns_config.py 1970-01-01 00:00:00 +0000
2094+++ src/maasserver/management/commands/write_dns_config.py 2012-11-08 10:58:27 +0000
2095@@ -0,0 +1,34 @@
2096+# Copyright 2012 Canonical Ltd. This software is licensed under the
2097+# GNU Affero General Public License version 3 (see the file LICENSE).
2098+
2099+"""Django command: write the MAAS named zone files.
2100+
2101+If any of the cluster controllers connected to this MAAS region controller
2102+is configured to manage DNS, write the DNS configuration.
2103+
2104+The main purpose of this command is for it to be run when 'maas-dns' is
2105+installed.
2106+"""
2107+
2108+from __future__ import (
2109+ absolute_import,
2110+ print_function,
2111+ unicode_literals,
2112+ )
2113+
2114+__metaclass__ = type
2115+__all__ = [
2116+ 'Command',
2117+ ]
2118+
2119+from django.core.management.base import BaseCommand
2120+from maasserver.dns import write_full_dns_config
2121+
2122+
2123+class Command(BaseCommand):
2124+ help = (
2125+ "Write the DNS configuration files and reload the DNS server if "
2126+ "this region has cluster controllers configured to manage DNS.")
2127+
2128+ def handle(self, *args, **options):
2129+ write_full_dns_config()
2130
2131=== modified file 'src/maasserver/middleware.py'
2132--- src/maasserver/middleware.py 2012-10-06 14:00:38 +0000
2133+++ src/maasserver/middleware.py 2012-11-08 10:58:27 +0000
2134@@ -78,7 +78,7 @@
2135 reverse('combo-maas'),
2136 reverse('combo-raphael'),
2137 # Static resources are publicly visible.
2138- settings.STATIC_URL,
2139+ settings.STATIC_URL_PATTERN,
2140 reverse('robots'),
2141 reverse('api-doc'),
2142 # Metadata service is for use by nodes; no login.
2143
2144=== added file 'src/maasserver/migrations/0043_unique_hostname_preparation.py'
2145--- src/maasserver/migrations/0043_unique_hostname_preparation.py 1970-01-01 00:00:00 +0000
2146+++ src/maasserver/migrations/0043_unique_hostname_preparation.py 2012-11-08 10:58:27 +0000
2147@@ -0,0 +1,218 @@
2148+# -*- coding: utf-8 -*-
2149+import datetime
2150+
2151+from django.db import models
2152+from django.db.models import Count
2153+from south.db import db
2154+from south.v2 import DataMigration
2155+
2156+
2157+class Migration(DataMigration):
2158+
2159+ def forwards(self, orm):
2160+ # Find the nodes with duplicated hostnames.
2161+ duplicated_hostnames = orm['maasserver.node'].objects.values_list(
2162+ 'hostname', flat=True).annotate(
2163+ hostname_count=Count('hostname')).exclude(hostname_count=1)
2164+ # Rename the nodes with duplicated hostnames.
2165+ for duplicated_hostname in duplicated_hostnames:
2166+ nodes_with_duplicated_hostnames = (
2167+ orm['maasserver.node'].objects.filter(
2168+ hostname=duplicated_hostname))
2169+ # Rename all the nodes but one.
2170+ for node in nodes_with_duplicated_hostnames[1:]:
2171+ number = 1
2172+ while True:
2173+ new_hostname = '%s-%d' % (node.hostname, number)
2174+ if not orm['maasserver.node'].objects.filter(hostname=new_hostname).exists():
2175+ node.hostname = new_hostname
2176+ node.save()
2177+ break
2178+ number += 1
2179+
2180+
2181+ def backwards(self, orm):
2182+ pass
2183+
2184+ models = {
2185+ 'auth.group': {
2186+ 'Meta': {'object_name': 'Group'},
2187+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2188+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
2189+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
2190+ },
2191+ 'auth.permission': {
2192+ 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
2193+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
2194+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
2195+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2196+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
2197+ },
2198+ 'auth.user': {
2199+ 'Meta': {'object_name': 'User'},
2200+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
2201+ 'email': ('django.db.models.fields.EmailField', [], {'unique': 'True', 'max_length': '75', 'blank': 'True'}),
2202+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
2203+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
2204+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2205+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2206+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
2207+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
2208+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
2209+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
2210+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
2211+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
2212+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
2213+ },
2214+ 'contenttypes.contenttype': {
2215+ 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
2216+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
2217+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2218+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
2219+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
2220+ },
2221+ u'maasserver.bootimage': {
2222+ 'Meta': {'unique_together': "((u'nodegroup', u'architecture', u'subarchitecture', u'release', u'purpose'),)", 'object_name': 'BootImage'},
2223+ 'architecture': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
2224+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2225+ 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}),
2226+ 'purpose': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
2227+ 'release': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
2228+ 'subarchitecture': ('django.db.models.fields.CharField', [], {'max_length': '255'})
2229+ },
2230+ u'maasserver.componenterror': {
2231+ 'Meta': {'object_name': 'ComponentError'},
2232+ 'component': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}),
2233+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
2234+ 'error': ('django.db.models.fields.CharField', [], {'max_length': '1000'}),
2235+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2236+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
2237+ },
2238+ u'maasserver.config': {
2239+ 'Meta': {'object_name': 'Config'},
2240+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2241+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
2242+ 'value': ('maasserver.fields.JSONObjectField', [], {'null': 'True'})
2243+ },
2244+ u'maasserver.dhcplease': {
2245+ 'Meta': {'object_name': 'DHCPLease'},
2246+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2247+ 'ip': ('django.db.models.fields.IPAddressField', [], {'unique': 'True', 'max_length': '15'}),
2248+ 'mac': ('maasserver.fields.MACAddressField', [], {}),
2249+ 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"})
2250+ },
2251+ u'maasserver.filestorage': {
2252+ 'Meta': {'object_name': 'FileStorage'},
2253+ 'content': ('metadataserver.fields.BinaryField', [], {}),
2254+ 'filename': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
2255+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
2256+ },
2257+ u'maasserver.macaddress': {
2258+ 'Meta': {'object_name': 'MACAddress'},
2259+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
2260+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2261+ 'mac_address': ('maasserver.fields.MACAddressField', [], {'unique': 'True'}),
2262+ 'node': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Node']"}),
2263+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
2264+ },
2265+ u'maasserver.node': {
2266+ 'Meta': {'object_name': 'Node'},
2267+ 'after_commissioning_action': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
2268+ 'architecture': ('django.db.models.fields.CharField', [], {'default': "u'i386/generic'", 'max_length': '31'}),
2269+ 'cpu_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
2270+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
2271+ 'distro_series': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '10', 'null': 'True', 'blank': 'True'}),
2272+ 'error': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
2273+ 'hardware_details': ('maasserver.fields.XMLField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
2274+ 'hostname': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
2275+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2276+ 'memory': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
2277+ 'netboot': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2278+ 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']", 'null': 'True'}),
2279+ 'owner': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}),
2280+ 'power_parameters': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'blank': 'True'}),
2281+ 'power_type': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '10', 'blank': 'True'}),
2282+ 'status': ('django.db.models.fields.IntegerField', [], {'default': '0', 'max_length': '10'}),
2283+ 'system_id': ('django.db.models.fields.CharField', [], {'default': "u'node-6b5652fe-2412-11e2-9eff-9c4e363b1c94'", 'unique': 'True', 'max_length': '41'}),
2284+ 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['maasserver.Tag']", 'symmetrical': 'False'}),
2285+ 'token': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['piston.Token']", 'null': 'True'}),
2286+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
2287+ },
2288+ u'maasserver.nodegroup': {
2289+ 'Meta': {'object_name': 'NodeGroup'},
2290+ 'api_key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '18'}),
2291+ 'api_token': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['piston.Token']", 'unique': 'True'}),
2292+ 'cluster_name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100', 'blank': 'True'}),
2293+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
2294+ 'dhcp_key': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
2295+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2296+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '80', 'blank': 'True'}),
2297+ 'status': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
2298+ 'updated': ('django.db.models.fields.DateTimeField', [], {}),
2299+ 'uuid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '36'})
2300+ },
2301+ u'maasserver.nodegroupinterface': {
2302+ 'Meta': {'unique_together': "((u'nodegroup', u'interface'),)", 'object_name': 'NodeGroupInterface'},
2303+ 'broadcast_ip': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
2304+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
2305+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2306+ 'interface': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
2307+ 'ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39'}),
2308+ 'ip_range_high': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
2309+ 'ip_range_low': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
2310+ 'management': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
2311+ 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}),
2312+ 'router_ip': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
2313+ 'subnet_mask': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
2314+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
2315+ },
2316+ u'maasserver.sshkey': {
2317+ 'Meta': {'unique_together': "((u'user', u'key'),)", 'object_name': 'SSHKey'},
2318+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
2319+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2320+ 'key': ('django.db.models.fields.TextField', [], {}),
2321+ 'updated': ('django.db.models.fields.DateTimeField', [], {}),
2322+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
2323+ },
2324+ u'maasserver.tag': {
2325+ 'Meta': {'object_name': 'Tag'},
2326+ 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
2327+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
2328+ 'definition': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
2329+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2330+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}),
2331+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
2332+ },
2333+ u'maasserver.userprofile': {
2334+ 'Meta': {'object_name': 'UserProfile'},
2335+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2336+ 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True'})
2337+ },
2338+ 'piston.consumer': {
2339+ 'Meta': {'object_name': 'Consumer'},
2340+ 'description': ('django.db.models.fields.TextField', [], {}),
2341+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2342+ 'key': ('django.db.models.fields.CharField', [], {'max_length': '18'}),
2343+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
2344+ 'secret': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
2345+ 'status': ('django.db.models.fields.CharField', [], {'default': "'pending'", 'max_length': '16'}),
2346+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'consumers'", 'null': 'True', 'to': "orm['auth.User']"})
2347+ },
2348+ 'piston.token': {
2349+ 'Meta': {'object_name': 'Token'},
2350+ 'callback': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
2351+ 'callback_confirmed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
2352+ 'consumer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['piston.Consumer']"}),
2353+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2354+ 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
2355+ 'key': ('django.db.models.fields.CharField', [], {'max_length': '18'}),
2356+ 'secret': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
2357+ 'timestamp': ('django.db.models.fields.IntegerField', [], {'default': '1351767230L'}),
2358+ 'token_type': ('django.db.models.fields.IntegerField', [], {}),
2359+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'tokens'", 'null': 'True', 'to': "orm['auth.User']"}),
2360+ 'verifier': ('django.db.models.fields.CharField', [], {'max_length': '10'})
2361+ }
2362+ }
2363+
2364+ complete_apps = ['maasserver']
2365+ symmetrical = True
2366
2367=== added file 'src/maasserver/migrations/0044_node_hostname_unique.py'
2368--- src/maasserver/migrations/0044_node_hostname_unique.py 1970-01-01 00:00:00 +0000
2369+++ src/maasserver/migrations/0044_node_hostname_unique.py 2012-11-08 10:58:27 +0000
2370@@ -0,0 +1,201 @@
2371+# -*- coding: utf-8 -*-
2372+import datetime
2373+
2374+from django.db import models
2375+from south.db import db
2376+from south.v2 import SchemaMigration
2377+
2378+
2379+class Migration(SchemaMigration):
2380+
2381+ def forwards(self, orm):
2382+ # Adding unique constraint on 'Node', fields ['hostname']
2383+ db.create_unique(u'maasserver_node', ['hostname'])
2384+
2385+
2386+ def backwards(self, orm):
2387+ # Removing unique constraint on 'Node', fields ['hostname']
2388+ db.delete_unique(u'maasserver_node', ['hostname'])
2389+
2390+
2391+ models = {
2392+ 'auth.group': {
2393+ 'Meta': {'object_name': 'Group'},
2394+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2395+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
2396+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
2397+ },
2398+ 'auth.permission': {
2399+ 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
2400+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
2401+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
2402+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2403+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
2404+ },
2405+ 'auth.user': {
2406+ 'Meta': {'object_name': 'User'},
2407+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
2408+ 'email': ('django.db.models.fields.EmailField', [], {'unique': 'True', 'max_length': '75', 'blank': 'True'}),
2409+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
2410+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
2411+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2412+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2413+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
2414+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
2415+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
2416+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
2417+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
2418+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
2419+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
2420+ },
2421+ 'contenttypes.contenttype': {
2422+ 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
2423+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
2424+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2425+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
2426+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
2427+ },
2428+ u'maasserver.bootimage': {
2429+ 'Meta': {'unique_together': "((u'nodegroup', u'architecture', u'subarchitecture', u'release', u'purpose'),)", 'object_name': 'BootImage'},
2430+ 'architecture': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
2431+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2432+ 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}),
2433+ 'purpose': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
2434+ 'release': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
2435+ 'subarchitecture': ('django.db.models.fields.CharField', [], {'max_length': '255'})
2436+ },
2437+ u'maasserver.componenterror': {
2438+ 'Meta': {'object_name': 'ComponentError'},
2439+ 'component': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}),
2440+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
2441+ 'error': ('django.db.models.fields.CharField', [], {'max_length': '1000'}),
2442+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2443+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
2444+ },
2445+ u'maasserver.config': {
2446+ 'Meta': {'object_name': 'Config'},
2447+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2448+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
2449+ 'value': ('maasserver.fields.JSONObjectField', [], {'null': 'True'})
2450+ },
2451+ u'maasserver.dhcplease': {
2452+ 'Meta': {'object_name': 'DHCPLease'},
2453+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2454+ 'ip': ('django.db.models.fields.IPAddressField', [], {'unique': 'True', 'max_length': '15'}),
2455+ 'mac': ('maasserver.fields.MACAddressField', [], {}),
2456+ 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"})
2457+ },
2458+ u'maasserver.filestorage': {
2459+ 'Meta': {'object_name': 'FileStorage'},
2460+ 'content': ('metadataserver.fields.BinaryField', [], {}),
2461+ 'filename': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
2462+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
2463+ },
2464+ u'maasserver.macaddress': {
2465+ 'Meta': {'object_name': 'MACAddress'},
2466+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
2467+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2468+ 'mac_address': ('maasserver.fields.MACAddressField', [], {'unique': 'True'}),
2469+ 'node': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Node']"}),
2470+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
2471+ },
2472+ u'maasserver.node': {
2473+ 'Meta': {'object_name': 'Node'},
2474+ 'after_commissioning_action': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
2475+ 'architecture': ('django.db.models.fields.CharField', [], {'default': "u'i386/generic'", 'max_length': '31'}),
2476+ 'cpu_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
2477+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
2478+ 'distro_series': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '10', 'null': 'True', 'blank': 'True'}),
2479+ 'error': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
2480+ 'hardware_details': ('maasserver.fields.XMLField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
2481+ 'hostname': ('django.db.models.fields.CharField', [], {'default': "u''", 'unique': 'True', 'max_length': '255', 'blank': 'True'}),
2482+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2483+ 'memory': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
2484+ 'netboot': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2485+ 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']", 'null': 'True'}),
2486+ 'owner': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}),
2487+ 'power_parameters': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'blank': 'True'}),
2488+ 'power_type': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '10', 'blank': 'True'}),
2489+ 'status': ('django.db.models.fields.IntegerField', [], {'default': '0', 'max_length': '10'}),
2490+ 'system_id': ('django.db.models.fields.CharField', [], {'default': "u'node-763aa1fc-2412-11e2-be98-9c4e363b1c94'", 'unique': 'True', 'max_length': '41'}),
2491+ 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['maasserver.Tag']", 'symmetrical': 'False'}),
2492+ 'token': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['piston.Token']", 'null': 'True'}),
2493+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
2494+ },
2495+ u'maasserver.nodegroup': {
2496+ 'Meta': {'object_name': 'NodeGroup'},
2497+ 'api_key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '18'}),
2498+ 'api_token': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['piston.Token']", 'unique': 'True'}),
2499+ 'cluster_name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100', 'blank': 'True'}),
2500+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
2501+ 'dhcp_key': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
2502+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2503+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '80', 'blank': 'True'}),
2504+ 'status': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
2505+ 'updated': ('django.db.models.fields.DateTimeField', [], {}),
2506+ 'uuid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '36'})
2507+ },
2508+ u'maasserver.nodegroupinterface': {
2509+ 'Meta': {'unique_together': "((u'nodegroup', u'interface'),)", 'object_name': 'NodeGroupInterface'},
2510+ 'broadcast_ip': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
2511+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
2512+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2513+ 'interface': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
2514+ 'ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39'}),
2515+ 'ip_range_high': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
2516+ 'ip_range_low': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
2517+ 'management': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
2518+ 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}),
2519+ 'router_ip': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
2520+ 'subnet_mask': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
2521+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
2522+ },
2523+ u'maasserver.sshkey': {
2524+ 'Meta': {'unique_together': "((u'user', u'key'),)", 'object_name': 'SSHKey'},
2525+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
2526+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2527+ 'key': ('django.db.models.fields.TextField', [], {}),
2528+ 'updated': ('django.db.models.fields.DateTimeField', [], {}),
2529+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
2530+ },
2531+ u'maasserver.tag': {
2532+ 'Meta': {'object_name': 'Tag'},
2533+ 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
2534+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
2535+ 'definition': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
2536+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2537+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}),
2538+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
2539+ },
2540+ u'maasserver.userprofile': {
2541+ 'Meta': {'object_name': 'UserProfile'},
2542+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2543+ 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True'})
2544+ },
2545+ 'piston.consumer': {
2546+ 'Meta': {'object_name': 'Consumer'},
2547+ 'description': ('django.db.models.fields.TextField', [], {}),
2548+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2549+ 'key': ('django.db.models.fields.CharField', [], {'max_length': '18'}),
2550+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
2551+ 'secret': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
2552+ 'status': ('django.db.models.fields.CharField', [], {'default': "'pending'", 'max_length': '16'}),
2553+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'consumers'", 'null': 'True', 'to': "orm['auth.User']"})
2554+ },
2555+ 'piston.token': {
2556+ 'Meta': {'object_name': 'Token'},
2557+ 'callback': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
2558+ 'callback_confirmed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
2559+ 'consumer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['piston.Consumer']"}),
2560+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2561+ 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
2562+ 'key': ('django.db.models.fields.CharField', [], {'max_length': '18'}),
2563+ 'secret': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
2564+ 'timestamp': ('django.db.models.fields.IntegerField', [], {'default': '1351767248L'}),
2565+ 'token_type': ('django.db.models.fields.IntegerField', [], {}),
2566+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'tokens'", 'null': 'True', 'to': "orm['auth.User']"}),
2567+ 'verifier': ('django.db.models.fields.CharField', [], {'max_length': '10'})
2568+ }
2569+ }
2570+
2571+ complete_apps = ['maasserver']
2572\ No newline at end of file
2573
2574=== added file 'src/maasserver/migrations/0045_add_tag_kernel_opts.py'
2575--- src/maasserver/migrations/0045_add_tag_kernel_opts.py 1970-01-01 00:00:00 +0000
2576+++ src/maasserver/migrations/0045_add_tag_kernel_opts.py 2012-11-08 10:58:27 +0000
2577@@ -0,0 +1,203 @@
2578+# -*- coding: utf-8 -*-
2579+import datetime
2580+from south.db import db
2581+from south.v2 import SchemaMigration
2582+from django.db import models
2583+
2584+
2585+class Migration(SchemaMigration):
2586+
2587+ def forwards(self, orm):
2588+ # Adding field 'Tag.kernel_opts'
2589+ db.add_column(u'maasserver_tag', 'kernel_opts',
2590+ self.gf('django.db.models.fields.TextField')(null=True, blank=True),
2591+ keep_default=False)
2592+
2593+
2594+ def backwards(self, orm):
2595+ # Deleting field 'Tag.kernel_opts'
2596+ db.delete_column(u'maasserver_tag', 'kernel_opts')
2597+
2598+
2599+ models = {
2600+ 'auth.group': {
2601+ 'Meta': {'object_name': 'Group'},
2602+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2603+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
2604+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
2605+ },
2606+ 'auth.permission': {
2607+ 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
2608+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
2609+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
2610+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2611+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
2612+ },
2613+ 'auth.user': {
2614+ 'Meta': {'object_name': 'User'},
2615+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
2616+ 'email': ('django.db.models.fields.EmailField', [], {'unique': 'True', 'max_length': '75', 'blank': 'True'}),
2617+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
2618+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
2619+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2620+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2621+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
2622+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
2623+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
2624+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
2625+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
2626+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
2627+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
2628+ },
2629+ 'contenttypes.contenttype': {
2630+ 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
2631+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
2632+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2633+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
2634+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
2635+ },
2636+ u'maasserver.bootimage': {
2637+ 'Meta': {'unique_together': "((u'nodegroup', u'architecture', u'subarchitecture', u'release', u'purpose'),)", 'object_name': 'BootImage'},
2638+ 'architecture': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
2639+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2640+ 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}),
2641+ 'purpose': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
2642+ 'release': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
2643+ 'subarchitecture': ('django.db.models.fields.CharField', [], {'max_length': '255'})
2644+ },
2645+ u'maasserver.componenterror': {
2646+ 'Meta': {'object_name': 'ComponentError'},
2647+ 'component': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}),
2648+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
2649+ 'error': ('django.db.models.fields.CharField', [], {'max_length': '1000'}),
2650+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2651+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
2652+ },
2653+ u'maasserver.config': {
2654+ 'Meta': {'object_name': 'Config'},
2655+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2656+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
2657+ 'value': ('maasserver.fields.JSONObjectField', [], {'null': 'True'})
2658+ },
2659+ u'maasserver.dhcplease': {
2660+ 'Meta': {'object_name': 'DHCPLease'},
2661+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2662+ 'ip': ('django.db.models.fields.IPAddressField', [], {'unique': 'True', 'max_length': '15'}),
2663+ 'mac': ('maasserver.fields.MACAddressField', [], {}),
2664+ 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"})
2665+ },
2666+ u'maasserver.filestorage': {
2667+ 'Meta': {'object_name': 'FileStorage'},
2668+ 'content': ('metadataserver.fields.BinaryField', [], {}),
2669+ 'filename': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
2670+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
2671+ },
2672+ u'maasserver.macaddress': {
2673+ 'Meta': {'object_name': 'MACAddress'},
2674+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
2675+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2676+ 'mac_address': ('maasserver.fields.MACAddressField', [], {'unique': 'True'}),
2677+ 'node': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Node']"}),
2678+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
2679+ },
2680+ u'maasserver.node': {
2681+ 'Meta': {'object_name': 'Node'},
2682+ 'after_commissioning_action': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
2683+ 'architecture': ('django.db.models.fields.CharField', [], {'default': "u'i386/generic'", 'max_length': '31'}),
2684+ 'cpu_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
2685+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
2686+ 'distro_series': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '10', 'null': 'True', 'blank': 'True'}),
2687+ 'error': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
2688+ 'hardware_details': ('maasserver.fields.XMLField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
2689+ 'hostname': ('django.db.models.fields.CharField', [], {'default': "u''", 'unique': 'True', 'max_length': '255', 'blank': 'True'}),
2690+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2691+ 'memory': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
2692+ 'netboot': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2693+ 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']", 'null': 'True'}),
2694+ 'owner': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}),
2695+ 'power_parameters': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'blank': 'True'}),
2696+ 'power_type': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '10', 'blank': 'True'}),
2697+ 'status': ('django.db.models.fields.IntegerField', [], {'default': '0', 'max_length': '10'}),
2698+ 'system_id': ('django.db.models.fields.CharField', [], {'default': "u'node-a776a79c-298b-11e2-90d1-080027748fea'", 'unique': 'True', 'max_length': '41'}),
2699+ 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['maasserver.Tag']", 'symmetrical': 'False'}),
2700+ 'token': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['piston.Token']", 'null': 'True'}),
2701+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
2702+ },
2703+ u'maasserver.nodegroup': {
2704+ 'Meta': {'object_name': 'NodeGroup'},
2705+ 'api_key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '18'}),
2706+ 'api_token': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['piston.Token']", 'unique': 'True'}),
2707+ 'cluster_name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100', 'blank': 'True'}),
2708+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
2709+ 'dhcp_key': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
2710+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2711+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '80', 'blank': 'True'}),
2712+ 'status': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
2713+ 'updated': ('django.db.models.fields.DateTimeField', [], {}),
2714+ 'uuid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '36'})
2715+ },
2716+ u'maasserver.nodegroupinterface': {
2717+ 'Meta': {'unique_together': "((u'nodegroup', u'interface'),)", 'object_name': 'NodeGroupInterface'},
2718+ 'broadcast_ip': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
2719+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
2720+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2721+ 'interface': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
2722+ 'ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39'}),
2723+ 'ip_range_high': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
2724+ 'ip_range_low': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
2725+ 'management': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
2726+ 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}),
2727+ 'router_ip': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
2728+ 'subnet_mask': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
2729+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
2730+ },
2731+ u'maasserver.sshkey': {
2732+ 'Meta': {'unique_together': "((u'user', u'key'),)", 'object_name': 'SSHKey'},
2733+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
2734+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2735+ 'key': ('django.db.models.fields.TextField', [], {}),
2736+ 'updated': ('django.db.models.fields.DateTimeField', [], {}),
2737+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
2738+ },
2739+ u'maasserver.tag': {
2740+ 'Meta': {'object_name': 'Tag'},
2741+ 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
2742+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
2743+ 'definition': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
2744+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2745+ 'kernel_opts': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
2746+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}),
2747+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
2748+ },
2749+ u'maasserver.userprofile': {
2750+ 'Meta': {'object_name': 'UserProfile'},
2751+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2752+ 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True'})
2753+ },
2754+ 'piston.consumer': {
2755+ 'Meta': {'object_name': 'Consumer'},
2756+ 'description': ('django.db.models.fields.TextField', [], {}),
2757+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2758+ 'key': ('django.db.models.fields.CharField', [], {'max_length': '18'}),
2759+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
2760+ 'secret': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
2761+ 'status': ('django.db.models.fields.CharField', [], {'default': "'pending'", 'max_length': '16'}),
2762+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'consumers'", 'null': 'True', 'to': "orm['auth.User']"})
2763+ },
2764+ 'piston.token': {
2765+ 'Meta': {'object_name': 'Token'},
2766+ 'callback': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
2767+ 'callback_confirmed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
2768+ 'consumer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['piston.Consumer']"}),
2769+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2770+ 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
2771+ 'key': ('django.db.models.fields.CharField', [], {'max_length': '18'}),
2772+ 'secret': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
2773+ 'timestamp': ('django.db.models.fields.IntegerField', [], {'default': '1352369055L'}),
2774+ 'token_type': ('django.db.models.fields.IntegerField', [], {}),
2775+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'tokens'", 'null': 'True', 'to': "orm['auth.User']"}),
2776+ 'verifier': ('django.db.models.fields.CharField', [], {'max_length': '10'})
2777+ }
2778+ }
2779+
2780+ complete_apps = ['maasserver']
2781\ No newline at end of file
2782
2783=== modified file 'src/maasserver/models/node.py'
2784--- src/maasserver/models/node.py 2012-11-08 09:14:58 +0000
2785+++ src/maasserver/models/node.py 2012-11-08 10:58:27 +0000
2786@@ -18,8 +18,14 @@
2787 "update_hardware_details",
2788 ]
2789
2790+from itertools import (
2791+ imap,
2792+ islice,
2793+ repeat,
2794+ )
2795 import math
2796 import os
2797+import random
2798 from string import whitespace
2799 from uuid import uuid1
2800
2801@@ -67,7 +73,10 @@
2802 get_db_state,
2803 strip_domain,
2804 )
2805-from maasserver.utils.orm import get_first
2806+from maasserver.utils.orm import (
2807+ get_first,
2808+ get_one,
2809+ )
2810 from piston.models import Token
2811 from provisioningserver.enum import (
2812 POWER_TYPE,
2813@@ -397,6 +406,16 @@
2814 node.save()
2815
2816
2817+# Non-ambiguous characters (i.e. without 'ilousvz1250').
2818+non_ambiguous_characters = imap(
2819+ random.choice, repeat('abcdefghjkmnpqrtwxy346789'))
2820+
2821+
2822+def generate_hostname(size):
2823+ """Generate a hostname using only non-ambiguous characters."""
2824+ return "".join(islice(non_ambiguous_characters, size))
2825+
2826+
2827 class Node(CleanSave, TimestampedModel):
2828 """A `Node` represents a physical machine used by the MAAS Server.
2829
2830@@ -412,6 +431,7 @@
2831 :ivar power_type: The :class:`POWER_TYPE` that determines how this
2832 node will be powered on. If not given, the default will be used as
2833 configured in the `node_power_type` setting.
2834+ :ivar nodegroup: The `NodeGroup` this `Node` belongs to.
2835 :ivar tags: The list of :class:`Tag`s associated with this `Node`.
2836 :ivar objects: The :class:`NodeManager`.
2837
2838@@ -424,7 +444,7 @@
2839 max_length=41, unique=True, default=generate_node_system_id,
2840 editable=False)
2841
2842- hostname = CharField(max_length=255, default='', blank=True)
2843+ hostname = CharField(max_length=255, default='', blank=True, unique=True)
2844
2845 status = IntegerField(
2846 max_length=10, choices=NODE_STATUS_CHOICES, editable=False,
2847@@ -655,19 +675,30 @@
2848
2849 super(Node, self).delete()
2850
2851- def set_mac_based_hostname(self, mac_address):
2852- """Set default `hostname` based on `mac_address`
2853-
2854- The hostname will include the `enlistment_domain` if set.
2855+ def set_random_hostname(self):
2856+ """Set 5 character `hostname` using non-ambiguous characters.
2857+
2858+ Using 5 letters from the set 'abcdefghjkmnpqrtwxy346789' we get
2859+ 9,765,625 combinations (pow(25, 5)).
2860+
2861+ Note that having a hostname starting with a number is perfectly
2862+ valid, see
2863+ http://en.wikipedia.org/wiki/Hostname#Restrictions_on_valid_host_names
2864 """
2865- mac_hostname = mac_address.replace(':', '').lower()
2866 domain = Config.objects.get_config("enlistment_domain")
2867 domain = domain.strip("." + whitespace)
2868- if len(domain) > 0:
2869- self.hostname = "node-%s.%s" % (mac_hostname, domain)
2870- else:
2871- self.hostname = "node-%s" % mac_hostname
2872- self.save()
2873+ while True:
2874+ new_hostname = generate_hostname(5)
2875+ if len(domain) > 0:
2876+ self.hostname = "%s.%s" % (new_hostname, domain)
2877+ else:
2878+ self.hostname = "%s" % new_hostname
2879+ try:
2880+ self.save()
2881+ except ValidationError:
2882+ pass
2883+ else:
2884+ break
2885
2886 def get_effective_power_type(self):
2887 """Get power-type to use for this node.
2888@@ -694,6 +725,26 @@
2889 else:
2890 return None
2891
2892+ def get_effective_kernel_options(self):
2893+ """Determine any special kernel parameters for this node.
2894+
2895+ :return: (tag, kernel_options)
2896+ tag is a Tag object or None. If None, the kernel_options came from
2897+ the global setting.
2898+ kernel_options, a string indicating extra kernel_options that
2899+ should be used when booting this node. May be None if no tags match
2900+ and no global setting has been configured.
2901+ """
2902+ # First, see if there are any tags associated with this node that has a
2903+ # custom kernel parameter
2904+ tags = self.tags.filter(kernel_opts__isnull=False)
2905+ tags = tags.order_by('name')[:1]
2906+ tag = get_one(tags)
2907+ if tag is not None:
2908+ return tag, tag.kernel_opts
2909+ global_value = Config.objects.get_config('kernel_opts')
2910+ return None, global_value
2911+
2912 @property
2913 def work_queue(self):
2914 """The name of the queue for tasks specific to this node."""
2915
2916=== modified file 'src/maasserver/models/nodegroup.py'
2917--- src/maasserver/models/nodegroup.py 2012-10-30 15:11:10 +0000
2918+++ src/maasserver/models/nodegroup.py 2012-11-08 10:58:27 +0000
2919@@ -36,7 +36,10 @@
2920 Token,
2921 )
2922 from provisioningserver.omshell import generate_omapi_key
2923-from provisioningserver.tasks import add_new_dhcp_host_map
2924+from provisioningserver.tasks import (
2925+ add_new_dhcp_host_map,
2926+ import_boot_images,
2927+ )
2928
2929
2930 class NodeGroupManager(Manager):
2931@@ -130,6 +133,13 @@
2932 return self._mass_change_status(
2933 NODEGROUP_STATUS.PENDING, NODEGROUP_STATUS.ACCEPTED)
2934
2935+ def import_boot_images_accepted_clusters(self):
2936+ """Import the boot images on all the accepted cluster controllers."""
2937+ accepted_nodegroups = NodeGroup.objects.filter(
2938+ status=NODEGROUP_STATUS.ACCEPTED)
2939+ for nodegroup in accepted_nodegroups:
2940+ nodegroup.import_boot_images()
2941+
2942
2943 NODEGROUP_CLUSTER_NAME_TEMPLATE = "Cluster %(uuid)s"
2944
2945@@ -221,6 +231,17 @@
2946 """The name of the queue for tasks specific to this nodegroup."""
2947 return self.uuid
2948
2949+ def import_boot_images(self):
2950+ """Import the pxe files on this cluster controller.
2951+
2952+ The files are downloaded through the proxy defined in the config
2953+ setting 'http_proxy' if defined.
2954+ """
2955+ # Avoid circular imports.
2956+ from maasserver.models import Config
2957+ task_kwargs = dict(http_proxy=Config.objects.get_config('http_proxy'))
2958+ import_boot_images.apply_async(queue=self.uuid, kwargs=task_kwargs)
2959+
2960 def add_dhcp_host_maps(self, new_leases):
2961 if self.get_managed_interface() is not None and len(new_leases) > 0:
2962 # XXX JeroenVermeulen 2012-08-21, bug=1039362: the DHCP
2963
2964=== modified file 'src/maasserver/models/tag.py'
2965--- src/maasserver/models/tag.py 2012-11-08 09:14:58 +0000
2966+++ src/maasserver/models/tag.py 2012-11-08 10:58:27 +0000
2967@@ -89,6 +89,8 @@
2968 tag.
2969 :ivar comment: A long-form description for humans about what this tag is
2970 trying to accomplish.
2971+ :ivar kernel_opts: Optional kernel command-line parameters string to be
2972+ used in the PXE config for nodes with this tags.
2973 :ivar objects: The :class:`TagManager`.
2974 """
2975
2976@@ -101,6 +103,7 @@
2977 validators=[RegexValidator(_tag_name_regex)])
2978 definition = TextField(blank=True)
2979 comment = TextField(blank=True)
2980+ kernel_opts = TextField(blank=True, null=True)
2981
2982 objects = TagManager()
2983
2984
2985=== modified file 'src/maasserver/signals.py'
2986--- src/maasserver/signals.py 2012-08-03 18:57:08 +0000
2987+++ src/maasserver/signals.py 2012-11-08 10:58:27 +0000
2988@@ -15,13 +15,15 @@
2989 ]
2990
2991 from django.db.models.signals import (
2992+ post_delete,
2993 post_init,
2994 post_save,
2995+ pre_delete,
2996 pre_save,
2997 )
2998
2999
3000-def connect_to_field_change(callback, model, field_name):
3001+def connect_to_field_change(callback, model, field_name, delete=False):
3002 """Call the provided callback when a field is modified on a model.
3003
3004 The provided `callback` method will be called when the value of the field
3005@@ -29,13 +31,24 @@
3006
3007 The signature of the callback method should be the following:
3008
3009- >>> def callback(instance, old_value):
3010+ >>> def callback(instance, old_value, deleted):
3011 ...
3012 pass
3013
3014- Where `instance` is the object which has just being saved to the database
3015- and `old_value` is the old value of the field (different from the value of
3016- the field in `instance`).
3017+ Where `instance` is the object which has just being saved to the
3018+ database, `old_value` is the old value of the field (different from the
3019+ value of the field in `instance`) and `deleted` indicates whether or not
3020+ the callback was called because the object was deleted.
3021+
3022+ :param callback: The callback function.
3023+ :type callback: callable
3024+ :param model: Specifies a particular sender to receive signals from.
3025+ :type model: class
3026+ :param field_name: Name of the field to monitor.
3027+ :type field_name: basestring
3028+ :param delete: Should the deletion of an object be considered a change
3029+ in the field?
3030+ :type delete: bool
3031 """
3032 last_seen_flag = '_field_last_seen_value_%s' % field_name
3033 delta_flag = '_field_delta_%s' % field_name
3034@@ -47,17 +60,27 @@
3035 post_init.connect(post_init_callback, sender=model, weak=False)
3036
3037 # Set 'delta_flag' with the new and the old value of the field.
3038- def pre_save_callback(sender, instance, **kwargs):
3039+ def record_delta_flag(sender, instance, **kwargs):
3040 original_value = getattr(instance, last_seen_flag)
3041 new_value = getattr(instance, field_name)
3042 setattr(instance, delta_flag, (new_value, original_value))
3043- pre_save.connect(pre_save_callback, sender=model, weak=False)
3044+ pre_save.connect(record_delta_flag, sender=model, weak=False)
3045
3046 # Call the `callback` if the field has changed.
3047 def post_save_callback(sender, instance, created, **kwargs):
3048 (new_value, original_value) = getattr(instance, delta_flag)
3049 # Call the callback method is the field has changed.
3050 if original_value != new_value:
3051- callback(instance, original_value)
3052+ callback(instance, original_value, deleted=False)
3053 setattr(instance, last_seen_flag, new_value)
3054+
3055+ if delete:
3056+ pre_delete.connect(record_delta_flag, sender=model, weak=False)
3057+
3058+ def post_delete_callback(sender, instance, **kwargs):
3059+ (new_value, original_value) = getattr(instance, delta_flag)
3060+ callback(instance, original_value, deleted=True)
3061+
3062+ post_delete.connect(post_delete_callback, sender=model, weak=False)
3063+
3064 post_save.connect(post_save_callback, sender=model, weak=False)
3065
3066=== modified file 'src/maasserver/static/css/components/blocks.css'
3067--- src/maasserver/static/css/components/blocks.css 2012-10-03 03:59:53 +0000
3068+++ src/maasserver/static/css/components/blocks.css 2012-11-08 10:58:27 +0000
3069@@ -82,3 +82,6 @@
3070 .size12 {
3071 width: 720px;
3072 }
3073+.size12 input {
3074+ width: 100%;
3075+ }
3076
3077=== modified file 'src/maasserver/static/css/components/table_list.css'
3078--- src/maasserver/static/css/components/table_list.css 2012-04-05 06:23:59 +0000
3079+++ src/maasserver/static/css/components/table_list.css 2012-11-08 10:58:27 +0000
3080@@ -30,6 +30,19 @@
3081 border-color: #dd4814;
3082 cursor: pointer;
3083 }
3084+.sort-none,
3085+.sort-asc,
3086+.sort-desc {
3087+ background-repeat: no-repeat;
3088+ background-position: right center;
3089+ padding-right: 16px;
3090+ }
3091+.sort-asc {
3092+ background-image: url('../?img/sort_ascending.png');
3093+ }
3094+.sort-desc {
3095+ background-image: url('../?img/sort_descending.png');
3096+ }
3097 /* ul list */
3098 ul.list {
3099 list-style: none;
3100
3101=== modified file 'src/maasserver/static/css/modifiers.css'
3102--- src/maasserver/static/css/modifiers.css 2012-10-04 05:13:15 +0000
3103+++ src/maasserver/static/css/modifiers.css 2012-11-08 10:58:27 +0000
3104@@ -65,3 +65,6 @@
3105 .pad-top-large {
3106 padding-top: 40px;
3107 }
3108+.warning {
3109+ color: #9F6000;
3110+ }
3111
3112=== added file 'src/maasserver/static/img/sort_ascending.png'
3113Binary files src/maasserver/static/img/sort_ascending.png 1970-01-01 00:00:00 +0000 and src/maasserver/static/img/sort_ascending.png 2012-11-08 10:58:27 +0000 differ
3114=== added file 'src/maasserver/static/img/sort_descending.png'
3115Binary files src/maasserver/static/img/sort_descending.png 1970-01-01 00:00:00 +0000 and src/maasserver/static/img/sort_descending.png 2012-11-08 10:58:27 +0000 differ
3116=== modified file 'src/maasserver/static/js/tests/test_enums.html'
3117--- src/maasserver/static/js/tests/test_enums.html 2012-06-13 11:02:58 +0000
3118+++ src/maasserver/static/js/tests/test_enums.html 2012-11-08 10:58:27 +0000
3119@@ -5,7 +5,7 @@
3120
3121 <!-- YUI and test setup -->
3122 <script type="text/javascript" src="../testing/yui_test_conf.js"></script>
3123- <script type="text/javascript" src="../../jslibs/yui/yui/yui.js"></script>
3124+ <script type="text/javascript" src="/usr/share/javascript/yui3/yui/yui.js"></script>
3125 <script type="text/javascript" src="../testing/testrunner.js"></script>
3126 <script type="text/javascript" src="../testing/testing.js"></script>
3127 <script type="text/javascript" src="../node.js"></script>
3128
3129=== modified file 'src/maasserver/static/js/tests/test_longpoll.html'
3130--- src/maasserver/static/js/tests/test_longpoll.html 2012-06-13 11:02:58 +0000
3131+++ src/maasserver/static/js/tests/test_longpoll.html 2012-11-08 10:58:27 +0000
3132@@ -5,7 +5,7 @@
3133
3134 <!-- YUI and test setup -->
3135 <script type="text/javascript" src="../testing/yui_test_conf.js"></script>
3136- <script type="text/javascript" src="../../jslibs/yui/yui/yui.js"></script>
3137+ <script type="text/javascript" src="/usr/share/javascript/yui3/yui/yui.js"></script>
3138 <script type="text/javascript" src="../testing/testrunner.js"></script>
3139 <script type="text/javascript" src="../testing/testing.js"></script>
3140 <!-- The module under test -->
3141
3142=== modified file 'src/maasserver/static/js/tests/test_morph.html'
3143--- src/maasserver/static/js/tests/test_morph.html 2012-06-13 11:02:58 +0000
3144+++ src/maasserver/static/js/tests/test_morph.html 2012-11-08 10:58:27 +0000
3145@@ -5,7 +5,7 @@
3146
3147 <!-- YUI and test setup -->
3148 <script type="text/javascript" src="../testing/yui_test_conf.js"></script>
3149- <script type="text/javascript" src="../../jslibs/yui/yui/yui.js"></script>
3150+ <script type="text/javascript" src="/usr/share/javascript/yui3/yui/yui.js"></script>
3151 <script type="text/javascript" src="../testing/testrunner.js"></script>
3152 <script type="text/javascript" src="../testing/testing.js"></script>
3153 <!-- The module under test -->
3154
3155=== modified file 'src/maasserver/static/js/tests/test_node.html'
3156--- src/maasserver/static/js/tests/test_node.html 2012-06-13 11:02:58 +0000
3157+++ src/maasserver/static/js/tests/test_node.html 2012-11-08 10:58:27 +0000
3158@@ -5,7 +5,7 @@
3159
3160 <!-- YUI and test setup -->
3161 <script type="text/javascript" src="../testing/yui_test_conf.js"></script>
3162- <script type="text/javascript" src="../../jslibs/yui/yui/yui.js"></script>
3163+ <script type="text/javascript" src="/usr/share/javascript/yui3/yui/yui.js"></script>
3164 <script type="text/javascript" src="../testing/testrunner.js"></script>
3165 <!-- The module under test -->
3166 <script type="text/javascript" src="../node.js"></script>
3167
3168=== modified file 'src/maasserver/static/js/tests/test_node_add.html'
3169--- src/maasserver/static/js/tests/test_node_add.html 2012-06-13 11:02:58 +0000
3170+++ src/maasserver/static/js/tests/test_node_add.html 2012-11-08 10:58:27 +0000
3171@@ -5,7 +5,7 @@
3172
3173 <!-- YUI and test setup -->
3174 <script type="text/javascript" src="../testing/yui_test_conf.js"></script>
3175- <script type="text/javascript" src="../../jslibs/yui/yui/yui.js"></script>
3176+ <script type="text/javascript" src="/usr/share/javascript/yui3/yui/yui.js"></script>
3177 <script type="text/javascript" src="../testing/testrunner.js"></script>
3178 <script type="text/javascript" src="../testing/testing.js"></script>
3179 <script type="text/javascript" src="../morph.js"></script>
3180
3181=== modified file 'src/maasserver/static/js/tests/test_node_views.html'
3182--- src/maasserver/static/js/tests/test_node_views.html 2012-06-13 11:02:58 +0000
3183+++ src/maasserver/static/js/tests/test_node_views.html 2012-11-08 10:58:27 +0000
3184@@ -4,9 +4,9 @@
3185 <title>Test maas.node_views</title>
3186
3187 <!-- YUI and test setup -->
3188- <script type="text/javascript" src="../../jslibs/raphael/raphael-min.js"></script>
3189+ <script type="text/javascript" src="/usr/share/javascript/raphael/raphael-min.js"></script>
3190 <script type="text/javascript" src="../testing/yui_test_conf.js"></script>
3191- <script type="text/javascript" src="../../jslibs/yui/yui/yui.js"></script>
3192+ <script type="text/javascript" src="/usr/share/javascript/yui3/yui/yui.js"></script>
3193 <script type="text/javascript" src="../testing/testrunner.js"></script>
3194 <script type="text/javascript" src="../testing/testing.js"></script>
3195 <script type="text/javascript" src="../enums.js"></script>
3196
3197=== modified file 'src/maasserver/static/js/tests/test_nodes_chart.html'
3198--- src/maasserver/static/js/tests/test_nodes_chart.html 2012-06-13 11:02:58 +0000
3199+++ src/maasserver/static/js/tests/test_nodes_chart.html 2012-11-08 10:58:27 +0000
3200@@ -4,9 +4,9 @@
3201 <title>Test maas.nodes_chart</title>
3202
3203 <!-- YUI and test setup -->
3204- <script type="text/javascript" src="../../jslibs/raphael/raphael-min.js"></script>
3205+ <script type="text/javascript" src="/usr/share/javascript/raphael/raphael-min.js"></script>
3206 <script type="text/javascript" src="../testing/yui_test_conf.js"></script>
3207- <script type="text/javascript" src="../../jslibs/yui/yui/yui.js"></script>
3208+ <script type="text/javascript" src="/usr/share/javascript/yui3/yui/yui.js"></script>
3209 <script type="text/javascript" src="../testing/testrunner.js"></script>
3210 <script type="text/javascript" src="../testing/testing.js"></script>
3211 <!-- The module under test -->
3212
3213=== modified file 'src/maasserver/static/js/tests/test_power_parameters.html'
3214--- src/maasserver/static/js/tests/test_power_parameters.html 2012-06-13 11:02:58 +0000
3215+++ src/maasserver/static/js/tests/test_power_parameters.html 2012-11-08 10:58:27 +0000
3216@@ -5,7 +5,7 @@
3217
3218 <!-- YUI and test setup -->
3219 <script type="text/javascript" src="../testing/yui_test_conf.js"></script>
3220- <script type="text/javascript" src="../../jslibs/yui/yui/yui.js"></script>
3221+ <script type="text/javascript" src="/usr/share/javascript/yui3/yui/yui.js"></script>
3222 <script type="text/javascript" src="../testing/testrunner.js"></script>
3223 <script type="text/javascript" src="../testing/testing.js"></script>
3224 <!-- The module under test -->
3225
3226=== modified file 'src/maasserver/static/js/tests/test_prefs.html'
3227--- src/maasserver/static/js/tests/test_prefs.html 2012-06-13 11:02:58 +0000
3228+++ src/maasserver/static/js/tests/test_prefs.html 2012-11-08 10:58:27 +0000
3229@@ -5,7 +5,7 @@
3230
3231 <!-- YUI and test setup -->
3232 <script type="text/javascript" src="../testing/yui_test_conf.js"></script>
3233- <script type="text/javascript" src="../../jslibs/yui/yui/yui.js"></script>
3234+ <script type="text/javascript" src="/usr/share/javascript/yui3/yui/yui.js"></script>
3235 <script type="text/javascript" src="../testing/testrunner.js"></script>
3236 <script type="text/javascript" src="../testing/testing.js"></script>
3237 <!-- The module under test -->
3238
3239=== modified file 'src/maasserver/static/js/tests/test_user_panel.html'
3240--- src/maasserver/static/js/tests/test_user_panel.html 2012-06-13 11:02:58 +0000
3241+++ src/maasserver/static/js/tests/test_user_panel.html 2012-11-08 10:58:27 +0000
3242@@ -5,7 +5,7 @@
3243
3244 <!-- YUI and test setup -->
3245 <script type="text/javascript" src="../testing/yui_test_conf.js"></script>
3246- <script type="text/javascript" src="../../jslibs/yui/yui/yui.js"></script>
3247+ <script type="text/javascript" src="/usr/share/javascript/yui3/yui/yui.js"></script>
3248 <script type="text/javascript" src="../testing/testrunner.js"></script>
3249 <script type="text/javascript" src="../testing/testing.js"></script>
3250 <!-- The module under test -->
3251
3252=== modified file 'src/maasserver/static/js/tests/test_utils.html'
3253--- src/maasserver/static/js/tests/test_utils.html 2012-06-13 11:02:58 +0000
3254+++ src/maasserver/static/js/tests/test_utils.html 2012-11-08 10:58:27 +0000
3255@@ -5,7 +5,7 @@
3256
3257 <!-- YUI and test setup -->
3258 <script type="text/javascript" src="../testing/yui_test_conf.js"></script>
3259- <script type="text/javascript" src="../../jslibs/yui/yui/yui.js"></script>
3260+ <script type="text/javascript" src="/usr/share/javascript/yui3/yui/yui.js"></script>
3261 <script type="text/javascript" src="../testing/testrunner.js"></script>
3262 <script type="text/javascript" src="../testing/testing.js"></script>
3263 <!-- The module under test -->
3264
3265=== removed directory 'src/maasserver/static/jslibs'
3266=== removed directory 'src/maasserver/static/jslibs/raphael'
3267=== removed file 'src/maasserver/static/jslibs/raphael/raphael-min.js'
3268--- src/maasserver/static/jslibs/raphael/raphael-min.js 2012-03-19 03:24:16 +0000
3269+++ src/maasserver/static/jslibs/raphael/raphael-min.js 1970-01-01 00:00:00 +0000
3270@@ -1,10 +0,0 @@
3271-// ┌────────────────────────────────────────────────────────────────────┐ \\
3272-// │ Raphaël 2.1.0 - JavaScript Vector Library │ \\
3273-// ├────────────────────────────────────────────────────────────────────┤ \\
3274-// │ Copyright © 2008-2012 Dmitry Baranovskiy (http://raphaeljs.com) │ \\
3275-// │ Copyright © 2008-2012 Sencha Labs (http://sencha.com) │ \\
3276-// ├────────────────────────────────────────────────────────────────────┤ \\
3277-// │ Licensed under the MIT (http://raphaeljs.com/license.html) license.│ \\
3278-// └────────────────────────────────────────────────────────────────────┘ \\
3279-
3280-(function(a){var b="0.3.4",c="hasOwnProperty",d=/[\.\/]/,e="*",f=function(){},g=function(a,b){return a-b},h,i,j={n:{}},k=function(a,b){var c=j,d=i,e=Array.prototype.slice.call(arguments,2),f=k.listeners(a),l=0,m=!1,n,o=[],p={},q=[],r=h,s=[];h=a,i=0;for(var t=0,u=f.length;t<u;t++)"zIndex"in f[t]&&(o.push(f[t].zIndex),f[t].zIndex<0&&(p[f[t].zIndex]=f[t]));o.sort(g);while(o[l]<0){n=p[o[l++]],q.push(n.apply(b,e));if(i){i=d;return q}}for(t=0;t<u;t++){n=f[t];if("zIndex"in n)if(n.zIndex==o[l]){q.push(n.apply(b,e));if(i)break;do{l++,n=p[o[l]],n&&q.push(n.apply(b,e));if(i)break}while(n)}else p[n.zIndex]=n;else{q.push(n.apply(b,e));if(i)break}}i=d,h=r;return q.length?q:null};k.listeners=function(a){var b=a.split(d),c=j,f,g,h,i,k,l,m,n,o=[c],p=[];for(i=0,k=b.length;i<k;i++){n=[];for(l=0,m=o.length;l<m;l++){c=o[l].n,g=[c[b[i]],c[e]],h=2;while(h--)f=g[h],f&&(n.push(f),p=p.concat(f.f||[]))}o=n}return p},k.on=function(a,b){var c=a.split(d),e=j;for(var g=0,h=c.length;g<h;g++)e=e.n,!e[c[g]]&&(e[c[g]]={n:{}}),e=e[c[g]];e.f=e.f||[];for(g=0,h=e.f.length;g<h;g++)if(e.f[g]==b)return f;e.f.push(b);return function(a){+a==+a&&(b.zIndex=+a)}},k.stop=function(){i=1},k.nt=function(a){if(a)return(new RegExp("(?:\\.|\\/|^)"+a+"(?:\\.|\\/|$)")).test(h);return h},k.off=k.unbind=function(a,b){var f=a.split(d),g,h,i,k,l,m,n,o=[j];for(k=0,l=f.length;k<l;k++)for(m=0;m<o.length;m+=i.length-2){i=[m,1],g=o[m].n;if(f[k]!=e)g[f[k]]&&i.push(g[f[k]]);else for(h in g)g[c](h)&&i.push(g[h]);o.splice.apply(o,i)}for(k=0,l=o.length;k<l;k++){g=o[k];while(g.n){if(b){if(g.f){for(m=0,n=g.f.length;m<n;m++)if(g.f[m]==b){g.f.splice(m,1);break}!g.f.length&&delete g.f}for(h in g.n)if(g.n[c](h)&&g.n[h].f){var p=g.n[h].f;for(m=0,n=p.length;m<n;m++)if(p[m]==b){p.splice(m,1);break}!p.length&&delete g.n[h].f}}else{delete g.f;for(h in g.n)g.n[c](h)&&g.n[h].f&&delete g.n[h].f}g=g.n}}},k.once=function(a,b){var c=function(){var d=b.apply(this,arguments);k.unbind(a,c);return d};return k.on(a,c)},k.version=b,k.toString=function(){return"You are running Eve "+b},typeof module!="undefined"&&module.exports?module.exports=k:typeof define!="undefined"?define("eve",[],function(){return k}):a.eve=k})(this),function(){function cF(a){for(var b=0;b<cy.length;b++)cy[b].el.paper==a&&cy.splice(b--,1)}function cE(b,d,e,f,h,i){e=Q(e);var j,k,l,m=[],o,p,q,t=b.ms,u={},v={},w={};if(f)for(y=0,z=cy.length;y<z;y++){var x=cy[y];if(x.el.id==d.id&&x.anim==b){x.percent!=e?(cy.splice(y,1),l=1):k=x,d.attr(x.totalOrigin);break}}else f=+v;for(var y=0,z=b.percents.length;y<z;y++){if(b.percents[y]==e||b.percents[y]>f*b.top){e=b.percents[y],p=b.percents[y-1]||0,t=t/b.top*(e-p),o=b.percents[y+1],j=b.anim[e];break}f&&d.attr(b.anim[b.percents[y]])}if(!!j){if(!k){for(var A in j)if(j[g](A))if(U[g](A)||d.paper.customAttributes[g](A)){u[A]=d.attr(A),u[A]==null&&(u[A]=T[A]),v[A]=j[A];switch(U[A]){case C:w[A]=(v[A]-u[A])/t;break;case"colour":u[A]=a.getRGB(u[A]);var B=a.getRGB(v[A]);w[A]={r:(B.r-u[A].r)/t,g:(B.g-u[A].g)/t,b:(B.b-u[A].b)/t};break;case"path":var D=bR(u[A],v[A]),E=D[1];u[A]=D[0],w[A]=[];for(y=0,z=u[A].length;y<z;y++){w[A][y]=[0];for(var F=1,G=u[A][y].length;F<G;F++)w[A][y][F]=(E[y][F]-u[A][y][F])/t}break;case"transform":var H=d._,I=ca(H[A],v[A]);if(I){u[A]=I.from,v[A]=I.to,w[A]=[],w[A].real=!0;for(y=0,z=u[A].length;y<z;y++){w[A][y]=[u[A][y][0]];for(F=1,G=u[A][y].length;F<G;F++)w[A][y][F]=(v[A][y][F]-u[A][y][F])/t}}else{var J=d.matrix||new cb,K={_:{transform:H.transform},getBBox:function(){return d.getBBox(1)}};u[A]=[J.a,J.b,J.c,J.d,J.e,J.f],b$(K,v[A]),v[A]=K._.transform,w[A]=[(K.matrix.a-J.a)/t,(K.matrix.b-J.b)/t,(K.matrix.c-J.c)/t,(K.matrix.d-J.d)/t,(K.matrix.e-J.e)/t,(K.matrix.f-J.f)/t]}break;case"csv":var L=r(j[A])[s](c),M=r(u[A])[s](c);if(A=="clip-rect"){u[A]=M,w[A]=[],y=M.length;while(y--)w[A][y]=(L[y]-u[A][y])/t}v[A]=L;break;default:L=[][n](j[A]),M=[][n](u[A]),w[A]=[],y=d.paper.customAttributes[A].length;while(y--)w[A][y]=((L[y]||0)-(M[y]||0))/t}}var O=j.easing,P=a.easing_formulas[O];if(!P){P=r(O).match(N);if(P&&P.length==5){var R=P;P=function(a){return cC(a,+R[1],+R[2],+R[3],+R[4],t)}}else P=bf}q=j.start||b.start||+(new Date),x={anim:b,percent:e,timestamp:q,start:q+(b.del||0),status:0,initstatus:f||0,stop:!1,ms:t,easing:P,from:u,diff:w,to:v,el:d,callback:j.callback,prev:p,next:o,repeat:i||b.times,origin:d.attr(),totalOrigin:h},cy.push(x);if(f&&!k&&!l){x.stop=!0,x.start=new Date-t*f;if(cy.length==1)return cA()}l&&(x.start=new Date-x.ms*f),cy.length==1&&cz(cA)}else k.initstatus=f,k.start=new Date-k.ms*f;eve("raphael.anim.start."+d.id,d,b)}}function cD(a,b){var c=[],d={};this.ms=b,this.times=1;if(a){for(var e in a)a[g](e)&&(d[Q(e)]=a[e],c.push(Q(e)));c.sort(bd)}this.anim=d,this.top=c[c.length-1],this.percents=c}function cC(a,b,c,d,e,f){function o(a,b){var c,d,e,f,j,k;for(e=a,k=0;k<8;k++){f=m(e)-a;if(z(f)<b)return e;j=(3*i*e+2*h)*e+g;if(z(j)<1e-6)break;e=e-f/j}c=0,d=1,e=a;if(e<c)return c;if(e>d)return d;while(c<d){f=m(e);if(z(f-a)<b)return e;a>f?c=e:d=e,e=(d-c)/2+c}return e}function n(a,b){var c=o(a,b);return((l*c+k)*c+j)*c}function m(a){return((i*a+h)*a+g)*a}var g=3*b,h=3*(d-b)-g,i=1-g-h,j=3*c,k=3*(e-c)-j,l=1-j-k;return n(a,1/(200*f))}function cq(){return this.x+q+this.y+q+this.width+" × "+this.height}function cp(){return this.x+q+this.y}function cb(a,b,c,d,e,f){a!=null?(this.a=+a,this.b=+b,this.c=+c,this.d=+d,this.e=+e,this.f=+f):(this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0)}function bH(b,c,d){b=a._path2curve(b),c=a._path2curve(c);var e,f,g,h,i,j,k,l,m,n,o=d?0:[];for(var p=0,q=b.length;p<q;p++){var r=b[p];if(r[0]=="M")e=i=r[1],f=j=r[2];else{r[0]=="C"?(m=[e,f].concat(r.slice(1)),e=m[6],f=m[7]):(m=[e,f,e,f,i,j,i,j],e=i,f=j);for(var s=0,t=c.length;s<t;s++){var u=c[s];if(u[0]=="M")g=k=u[1],h=l=u[2];else{u[0]=="C"?(n=[g,h].concat(u.slice(1)),g=n[6],h=n[7]):(n=[g,h,g,h,k,l,k,l],g=k,h=l);var v=bG(m,n,d);if(d)o+=v;else{for(var w=0,x=v.length;w<x;w++)v[w].segment1=p,v[w].segment2=s,v[w].bez1=m,v[w].bez2=n;o=o.concat(v)}}}}}return o}function bG(b,c,d){var e=a.bezierBBox(b),f=a.bezierBBox(c);if(!a.isBBoxIntersect(e,f))return d?0:[];var g=bB.apply(0,b),h=bB.apply(0,c),i=~~(g/5),j=~~(h/5),k=[],l=[],m={},n=d?0:[];for(var o=0;o<i+1;o++){var p=a.findDotsAtSegment.apply(a,b.concat(o/i));k.push({x:p.x,y:p.y,t:o/i})}for(o=0;o<j+1;o++)p=a.findDotsAtSegment.apply(a,c.concat(o/j)),l.push({x:p.x,y:p.y,t:o/j});for(o=0;o<i;o++)for(var q=0;q<j;q++){var r=k[o],s=k[o+1],t=l[q],u=l[q+1],v=z(s.x-r.x)<.001?"y":"x",w=z(u.x-t.x)<.001?"y":"x",x=bD(r.x,r.y,s.x,s.y,t.x,t.y,u.x,u.y);if(x){if(m[x.x.toFixed(4)]==x.y.toFixed(4))continue;m[x.x.toFixed(4)]=x.y.toFixed(4);var y=r.t+z((x[v]-r[v])/(s[v]-r[v]))*(s.t-r.t),A=t.t+z((x[w]-t[w])/(u[w]-t[w]))*(u.t-t.t);y>=0&&y<=1&&A>=0&&A<=1&&(d?n++:n.push({x:x.x,y:x.y,t1:y,t2:A}))}}return n}function bF(a,b){return bG(a,b,1)}function bE(a,b){return bG(a,b)}function bD(a,b,c,d,e,f,g,h){if(!(x(a,c)<y(e,g)||y(a,c)>x(e,g)||x(b,d)<y(f,h)||y(b,d)>x(f,h))){var i=(a*d-b*c)*(e-g)-(a-c)*(e*h-f*g),j=(a*d-b*c)*(f-h)-(b-d)*(e*h-f*g),k=(a-c)*(f-h)-(b-d)*(e-g);if(!k)return;var l=i/k,m=j/k,n=+l.toFixed(2),o=+m.toFixed(2);if(n<+y(a,c).toFixed(2)||n>+x(a,c).toFixed(2)||n<+y(e,g).toFixed(2)||n>+x(e,g).toFixed(2)||o<+y(b,d).toFixed(2)||o>+x(b,d).toFixed(2)||o<+y(f,h).toFixed(2)||o>+x(f,h).toFixed(2))return;return{x:l,y:m}}}function bC(a,b,c,d,e,f,g,h,i){if(!(i<0||bB(a,b,c,d,e,f,g,h)<i)){var j=1,k=j/2,l=j-k,m,n=.01;m=bB(a,b,c,d,e,f,g,h,l);while(z(m-i)>n)k/=2,l+=(m<i?1:-1)*k,m=bB(a,b,c,d,e,f,g,h,l);return l}}function bB(a,b,c,d,e,f,g,h,i){i==null&&(i=1),i=i>1?1:i<0?0:i;var j=i/2,k=12,l=[-0.1252,.1252,-0.3678,.3678,-0.5873,.5873,-0.7699,.7699,-0.9041,.9041,-0.9816,.9816],m=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],n=0;for(var o=0;o<k;o++){var p=j*l[o]+j,q=bA(p,a,c,e,g),r=bA(p,b,d,f,h),s=q*q+r*r;n+=m[o]*w.sqrt(s)}return j*n}function bA(a,b,c,d,e){var f=-3*b+9*c-9*d+3*e,g=a*f+6*b-12*c+6*d;return a*g-3*b+3*c}function by(a,b){var c=[];for(var d=0,e=a.length;e-2*!b>d;d+=2){var f=[{x:+a[d-2],y:+a[d-1]},{x:+a[d],y:+a[d+1]},{x:+a[d+2],y:+a[d+3]},{x:+a[d+4],y:+a[d+5]}];b?d?e-4==d?f[3]={x:+a[0],y:+a[1]}:e-2==d&&(f[2]={x:+a[0],y:+a[1]},f[3]={x:+a[2],y:+a[3]}):f[0]={x:+a[e-2],y:+a[e-1]}:e-4==d?f[3]=f[2]:d||(f[0]={x:+a[d],y:+a[d+1]}),c.push(["C",(-f[0].x+6*f[1].x+f[2].x)/6,(-f[0].y+6*f[1].y+f[2].y)/6,(f[1].x+6*f[2].x-f[3].x)/6,(f[1].y+6*f[2].y-f[3].y)/6,f[2].x,f[2].y])}return c}function bx(){return this.hex}function bv(a,b,c){function d(){var e=Array.prototype.slice.call(arguments,0),f=e.join("␀"),h=d.cache=d.cache||{},i=d.count=d.count||[];if(h[g](f)){bu(i,f);return c?c(h[f]):h[f]}i.length>=1e3&&delete h[i.shift()],i.push(f),h[f]=a[m](b,e);return c?c(h[f]):h[f]}return d}function bu(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return a.push(a.splice(c,1)[0])}function bm(a){if(Object(a)!==a)return a;var b=new a.constructor;for(var c in a)a[g](c)&&(b[c]=bm(a[c]));return b}function a(c){if(a.is(c,"function"))return b?c():eve.on("raphael.DOMload",c);if(a.is(c,E))return a._engine.create[m](a,c.splice(0,3+a.is(c[0],C))).add(c);var d=Array.prototype.slice.call(arguments,0);if(a.is(d[d.length-1],"function")){var e=d.pop();return b?e.call(a._engine.create[m](a,d)):eve.on("raphael.DOMload",function(){e.call(a._engine.create[m](a,d))})}return a._engine.create[m](a,arguments)}a.version="2.1.0",a.eve=eve;var b,c=/[, ]+/,d={circle:1,rect:1,path:1,ellipse:1,text:1,image:1},e=/\{(\d+)\}/g,f="prototype",g="hasOwnProperty",h={doc:document,win:window},i={was:Object.prototype[g].call(h.win,"Raphael"),is:h.win.Raphael},j=function(){this.ca=this.customAttributes={}},k,l="appendChild",m="apply",n="concat",o="createTouch"in h.doc,p="",q=" ",r=String,s="split",t="click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend touchcancel"[s](q),u={mousedown:"touchstart",mousemove:"touchmove",mouseup:"touchend"},v=r.prototype.toLowerCase,w=Math,x=w.max,y=w.min,z=w.abs,A=w.pow,B=w.PI,C="number",D="string",E="array",F="toString",G="fill",H=Object.prototype.toString,I={},J="push",K=a._ISURL=/^url\(['"]?([^\)]+?)['"]?\)$/i,L=/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i,M={NaN:1,Infinity:1,"-Infinity":1},N=/^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,O=w.round,P="setAttribute",Q=parseFloat,R=parseInt,S=r.prototype.toUpperCase,T=a._availableAttrs={"arrow-end":"none","arrow-start":"none",blur:0,"clip-rect":"0 0 1e9 1e9",cursor:"default",cx:0,cy:0,fill:"#fff","fill-opacity":1,font:'10px "Arial"',"font-family":'"Arial"',"font-size":"10","font-style":"normal","font-weight":400,gradient:0,height:0,href:"http://raphaeljs.com/","letter-spacing":0,opacity:1,path:"M0,0",r:0,rx:0,ry:0,src:"",stroke:"#000","stroke-dasharray":"","stroke-linecap":"butt","stroke-linejoin":"butt","stroke-miterlimit":0,"stroke-opacity":1,"stroke-width":1,target:"_blank","text-anchor":"middle",title:"Raphael",transform:"",width:0,x:0,y:0},U=a._availableAnimAttrs={blur:C,"clip-rect":"csv",cx:C,cy:C,fill:"colour","fill-opacity":C,"font-size":C,height:C,opacity:C,path:"path",r:C,rx:C,ry:C,stroke:"colour","stroke-opacity":C,"stroke-width":C,transform:"transform",width:C,x:C,y:C},V=/[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]/g,W=/[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/,X={hs:1,rg:1},Y=/,?([achlmqrstvxz]),?/gi,Z=/([achlmrqstvz])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/ig,$=/([rstm])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/ig,_=/(-?\d*\.?\d*(?:e[\-+]?\d+)?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/ig,ba=a._radial_gradient=/^r(?:\(([^,]+?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*([^\)]+?)\))?/,bb={},bc=function(a,b){return a.key-b.key},bd=function(a,b){return Q(a)-Q(b)},be=function(){},bf=function(a){return a},bg=a._rectPath=function(a,b,c,d,e){if(e)return[["M",a+e,b],["l",c-e*2,0],["a",e,e,0,0,1,e,e],["l",0,d-e*2],["a",e,e,0,0,1,-e,e],["l",e*2-c,0],["a",e,e,0,0,1,-e,-e],["l",0,e*2-d],["a",e,e,0,0,1,e,-e],["z"]];return[["M",a,b],["l",c,0],["l",0,d],["l",-c,0],["z"]]},bh=function(a,b,c,d){d==null&&(d=c);return[["M",a,b],["m",0,-d],["a",c,d,0,1,1,0,2*d],["a",c,d,0,1,1,0,-2*d],["z"]]},bi=a._getPath={path:function(a){return a.attr("path")},circle:function(a){var b=a.attrs;return bh(b.cx,b.cy,b.r)},ellipse:function(a){var b=a.attrs;return bh(b.cx,b.cy,b.rx,b.ry)},rect:function(a){var b=a.attrs;return bg(b.x,b.y,b.width,b.height,b.r)},image:function(a){var b=a.attrs;return bg(b.x,b.y,b.width,b.height)},text:function(a){var b=a._getBBox();return bg(b.x,b.y,b.width,b.height)}},bj=a.mapPath=function(a,b){if(!b)return a;var c,d,e,f,g,h,i;a=bR(a);for(e=0,g=a.length;e<g;e++){i=a[e];for(f=1,h=i.length;f<h;f+=2)c=b.x(i[f],i[f+1]),d=b.y(i[f],i[f+1]),i[f]=c,i[f+1]=d}return a};a._g=h,a.type=h.win.SVGAngle||h.doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")?"SVG":"VML";if(a.type=="VML"){var bk=h.doc.createElement("div"),bl;bk.innerHTML='<v:shape adj="1"/>',bl=bk.firstChild,bl.style.behavior="url(#default#VML)";if(!bl||typeof bl.adj!="object")return a.type=p;bk=null}a.svg=!(a.vml=a.type=="VML"),a._Paper=j,a.fn=k=j.prototype=a.prototype,a._id=0,a._oid=0,a.is=function(a,b){b=v.call(b);if(b=="finite")return!M[g](+a);if(b=="array")return a instanceof Array;return b=="null"&&a===null||b==typeof a&&a!==null||b=="object"&&a===Object(a)||b=="array"&&Array.isArray&&Array.isArray(a)||H.call(a).slice(8,-1).toLowerCase()==b},a.angle=function(b,c,d,e,f,g){if(f==null){var h=b-d,i=c-e;if(!h&&!i)return 0;return(180+w.atan2(-i,-h)*180/B+360)%360}return a.angle(b,c,f,g)-a.angle(d,e,f,g)},a.rad=function(a){return a%360*B/180},a.deg=function(a){return a*180/B%360},a.snapTo=function(b,c,d){d=a.is(d,"finite")?d:10;if(a.is(b,E)){var e=b.length;while(e--)if(z(b[e]-c)<=d)return b[e]}else{b=+b;var f=c%b;if(f<d)return c-f;if(f>b-d)return c-f+b}return c};var bn=a.createUUID=function(a,b){return function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(a,b).toUpperCase()}}(/[xy]/g,function(a){var b=w.random()*16|0,c=a=="x"?b:b&3|8;return c.toString(16)});a.setWindow=function(b){eve("raphael.setWindow",a,h.win,b),h.win=b,h.doc=h.win.document,a._engine.initWin&&a._engine.initWin(h.win)};var bo=function(b){if(a.vml){var c=/^\s+|\s+$/g,d;try{var e=new ActiveXObject("htmlfile");e.write("<body>"),e.close(),d=e.body}catch(f){d=createPopup().document.body}var g=d.createTextRange();bo=bv(function(a){try{d.style.color=r(a).replace(c,p);var b=g.queryCommandValue("ForeColor");b=(b&255)<<16|b&65280|(b&16711680)>>>16;return"#"+("000000"+b.toString(16)).slice(-6)}catch(e){return"none"}})}else{var i=h.doc.createElement("i");i.title="Raphaël Colour Picker",i.style.display="none",h.doc.body.appendChild(i),bo=bv(function(a){i.style.color=a;return h.doc.defaultView.getComputedStyle(i,p).getPropertyValue("color")})}return bo(b)},bp=function(){return"hsb("+[this.h,this.s,this.b]+")"},bq=function(){return"hsl("+[this.h,this.s,this.l]+")"},br=function(){return this.hex},bs=function(b,c,d){c==null&&a.is(b,"object")&&"r"in b&&"g"in b&&"b"in b&&(d=b.b,c=b.g,b=b.r);if(c==null&&a.is(b,D)){var e=a.getRGB(b);b=e.r,c=e.g,d=e.b}if(b>1||c>1||d>1)b/=255,c/=255,d/=255;return[b,c,d]},bt=function(b,c,d,e){b*=255,c*=255,d*=255;var f={r:b,g:c,b:d,hex:a.rgb(b,c,d),toString:br};a.is(e,"finite")&&(f.opacity=e);return f};a.color=function(b){var c;a.is(b,"object")&&"h"in b&&"s"in b&&"b"in b?(c=a.hsb2rgb(b),b.r=c.r,b.g=c.g,b.b=c.b,b.hex=c.hex):a.is(b,"object")&&"h"in b&&"s"in b&&"l"in b?(c=a.hsl2rgb(b),b.r=c.r,b.g=c.g,b.b=c.b,b.hex=c.hex):(a.is(b,"string")&&(b=a.getRGB(b)),a.is(b,"object")&&"r"in b&&"g"in b&&"b"in b?(c=a.rgb2hsl(b),b.h=c.h,b.s=c.s,b.l=c.l,c=a.rgb2hsb(b),b.v=c.b):(b={hex:"none"},b.r=b.g=b.b=b.h=b.s=b.v=b.l=-1)),b.toString=br;return b},a.hsb2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"b"in a&&(c=a.b,b=a.s,a=a.h,d=a.o),a*=360;var e,f,g,h,i;a=a%360/60,i=c*b,h=i*(1-z(a%2-1)),e=f=g=c-i,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a];return bt(e,f,g,d)},a.hsl2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"l"in a&&(c=a.l,b=a.s,a=a.h);if(a>1||b>1||c>1)a/=360,b/=100,c/=100;a*=360;var e,f,g,h,i;a=a%360/60,i=2*b*(c<.5?c:1-c),h=i*(1-z(a%2-1)),e=f=g=c-i/2,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a];return bt(e,f,g,d)},a.rgb2hsb=function(a,b,c){c=bs(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g;f=x(a,b,c),g=f-y(a,b,c),d=g==0?null:f==a?(b-c)/g:f==b?(c-a)/g+2:(a-b)/g+4,d=(d+360)%6*60/360,e=g==0?0:g/f;return{h:d,s:e,b:f,toString:bp}},a.rgb2hsl=function(a,b,c){c=bs(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g,h,i;g=x(a,b,c),h=y(a,b,c),i=g-h,d=i==0?null:g==a?(b-c)/i:g==b?(c-a)/i+2:(a-b)/i+4,d=(d+360)%6*60/360,f=(g+h)/2,e=i==0?0:f<.5?i/(2*f):i/(2-2*f);return{h:d,s:e,l:f,toString:bq}},a._path2string=function(){return this.join(",").replace(Y,"$1")};var bw=a._preload=function(a,b){var c=h.doc.createElement("img");c.style.cssText="position:absolute;left:-9999em;top:-9999em",c.onload=function(){b.call(this),this.onload=null,h.doc.body.removeChild(this)},c.onerror=function(){h.doc.body.removeChild(this)},h.doc.body.appendChild(c),c.src=a};a.getRGB=bv(function(b){if(!b||!!((b=r(b)).indexOf("-")+1))return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:bx};if(b=="none")return{r:-1,g:-1,b:-1,hex:"none",toString:bx};!X[g](b.toLowerCase().substring(0,2))&&b.charAt()!="#"&&(b=bo(b));var c,d,e,f,h,i,j,k=b.match(L);if(k){k[2]&&(f=R(k[2].substring(5),16),e=R(k[2].substring(3,5),16),d=R(k[2].substring(1,3),16)),k[3]&&(f=R((i=k[3].charAt(3))+i,16),e=R((i=k[3].charAt(2))+i,16),d=R((i=k[3].charAt(1))+i,16)),k[4]&&(j=k[4][s](W),d=Q(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=Q(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),f=Q(j[2]),j[2].slice(-1)=="%"&&(f*=2.55),k[1].toLowerCase().slice(0,4)=="rgba"&&(h=Q(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100));if(k[5]){j=k[5][s](W),d=Q(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=Q(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),f=Q(j[2]),j[2].slice(-1)=="%"&&(f*=2.55),(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360),k[1].toLowerCase().slice(0,4)=="hsba"&&(h=Q(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsb2rgb(d,e,f,h)}if(k[6]){j=k[6][s](W),d=Q(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=Q(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),f=Q(j[2]),j[2].slice(-1)=="%"&&(f*=2.55),(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360),k[1].toLowerCase().slice(0,4)=="hsla"&&(h=Q(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsl2rgb(d,e,f,h)}k={r:d,g:e,b:f,toString:bx},k.hex="#"+(16777216|f|e<<8|d<<16).toString(16).slice(1),a.is(h,"finite")&&(k.opacity=h);return k}return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:bx}},a),a.hsb=bv(function(b,c,d){return a.hsb2rgb(b,c,d).hex}),a.hsl=bv(function(b,c,d){return a.hsl2rgb(b,c,d).hex}),a.rgb=bv(function(a,b,c){return"#"+(16777216|c|b<<8|a<<16).toString(16).slice(1)}),a.getColor=function(a){var b=this.getColor.start=this.getColor.start||{h:0,s:1,b:a||.75},c=this.hsb2rgb(b.h,b.s,b.b);b.h+=.075,b.h>1&&(b.h=0,b.s-=.2,b.s<=0&&(this.getColor.start={h:0,s:1,b:b.b}));return c.hex},a.getColor.reset=function(){delete this.start},a.parsePathString=function(b){if(!b)return null;var c=bz(b);if(c.arr)return bJ(c.arr);var d={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},e=[];a.is(b,E)&&a.is(b[0],E)&&(e=bJ(b)),e.length||r(b).replace(Z,function(a,b,c){var f=[],g=b.toLowerCase();c.replace(_,function(a,b){b&&f.push(+b)}),g=="m"&&f.length>2&&(e.push([b][n](f.splice(0,2))),g="l",b=b=="m"?"l":"L");if(g=="r")e.push([b][n](f));else while(f.length>=d[g]){e.push([b][n](f.splice(0,d[g])));if(!d[g])break}}),e.toString=a._path2string,c.arr=bJ(e);return e},a.parseTransformString=bv(function(b){if(!b)return null;var c={r:3,s:4,t:2,m:6},d=[];a.is(b,E)&&a.is(b[0],E)&&(d=bJ(b)),d.length||r(b).replace($,function(a,b,c){var e=[],f=v.call(b);c.replace(_,function(a,b){b&&e.push(+b)}),d.push([b][n](e))}),d.toString=a._path2string;return d});var bz=function(a){var b=bz.ps=bz.ps||{};b[a]?b[a].sleep=100:b[a]={sleep:100},setTimeout(function(){for(var c in b)b[g](c)&&c!=a&&(b[c].sleep--,!b[c].sleep&&delete b[c])});return b[a]};a.findDotsAtSegment=function(a,b,c,d,e,f,g,h,i){var j=1-i,k=A(j,3),l=A(j,2),m=i*i,n=m*i,o=k*a+l*3*i*c+j*3*i*i*e+n*g,p=k*b+l*3*i*d+j*3*i*i*f+n*h,q=a+2*i*(c-a)+m*(e-2*c+a),r=b+2*i*(d-b)+m*(f-2*d+b),s=c+2*i*(e-c)+m*(g-2*e+c),t=d+2*i*(f-d)+m*(h-2*f+d),u=j*a+i*c,v=j*b+i*d,x=j*e+i*g,y=j*f+i*h,z=90-w.atan2(q-s,r-t)*180/B;(q>s||r<t)&&(z+=180);return{x:o,y:p,m:{x:q,y:r},n:{x:s,y:t},start:{x:u,y:v},end:{x:x,y:y},alpha:z}},a.bezierBBox=function(b,c,d,e,f,g,h,i){a.is(b,"array")||(b=[b,c,d,e,f,g,h,i]);var j=bQ.apply(null,b);return{x:j.min.x,y:j.min.y,x2:j.max.x,y2:j.max.y,width:j.max.x-j.min.x,height:j.max.y-j.min.y}},a.isPointInsideBBox=function(a,b,c){return b>=a.x&&b<=a.x2&&c>=a.y&&c<=a.y2},a.isBBoxIntersect=function(b,c){var d=a.isPointInsideBBox;return d(c,b.x,b.y)||d(c,b.x2,b.y)||d(c,b.x,b.y2)||d(c,b.x2,b.y2)||d(b,c.x,c.y)||d(b,c.x2,c.y)||d(b,c.x,c.y2)||d(b,c.x2,c.y2)||(b.x<c.x2&&b.x>c.x||c.x<b.x2&&c.x>b.x)&&(b.y<c.y2&&b.y>c.y||c.y<b.y2&&c.y>b.y)},a.pathIntersection=function(a,b){return bH(a,b)},a.pathIntersectionNumber=function(a,b){return bH(a,b,1)},a.isPointInsidePath=function(b,c,d){var e=a.pathBBox(b);return a.isPointInsideBBox(e,c,d)&&bH(b,[["M",c,d],["H",e.x2+10]],1)%2==1},a._removedFactory=function(a){return function(){eve("raphael.log",null,"Raphaël: you are calling to method “"+a+"” of removed object",a)}};var bI=a.pathBBox=function(a){var b=bz(a);if(b.bbox)return b.bbox;if(!a)return{x:0,y:0,width:0,height:0,x2:0,y2:0};a=bR(a);var c=0,d=0,e=[],f=[],g;for(var h=0,i=a.length;h<i;h++){g=a[h];if(g[0]=="M")c=g[1],d=g[2],e.push(c),f.push(d);else{var j=bQ(c,d,g[1],g[2],g[3],g[4],g[5],g[6]);e=e[n](j.min.x,j.max.x),f=f[n](j.min.y,j.max.y),c=g[5],d=g[6]}}var k=y[m](0,e),l=y[m](0,f),o=x[m](0,e),p=x[m](0,f),q={x:k,y:l,x2:o,y2:p,width:o-k,height:p-l};b.bbox=bm(q);return q},bJ=function(b){var c=bm(b);c.toString=a._path2string;return c},bK=a._pathToRelative=function(b){var c=bz(b);if(c.rel)return bJ(c.rel);if(!a.is(b,E)||!a.is(b&&b[0],E))b=a.parsePathString(b);var d=[],e=0,f=0,g=0,h=0,i=0;b[0][0]=="M"&&(e=b[0][1],f=b[0][2],g=e,h=f,i++,d.push(["M",e,f]));for(var j=i,k=b.length;j<k;j++){var l=d[j]=[],m=b[j];if(m[0]!=v.call(m[0])){l[0]=v.call(m[0]);switch(l[0]){case"a":l[1]=m[1],l[2]=m[2],l[3]=m[3],l[4]=m[4],l[5]=m[5],l[6]=+(m[6]-e).toFixed(3),l[7]=+(m[7]-f).toFixed(3);break;case"v":l[1]=+(m[1]-f).toFixed(3);break;case"m":g=m[1],h=m[2];default:for(var n=1,o=m.length;n<o;n++)l[n]=+(m[n]-(n%2?e:f)).toFixed(3)}}else{l=d[j]=[],m[0]=="m"&&(g=m[1]+e,h=m[2]+f);for(var p=0,q=m.length;p<q;p++)d[j][p]=m[p]}var r=d[j].length;switch(d[j][0]){case"z":e=g,f=h;break;case"h":e+=+d[j][r-1];break;case"v":f+=+d[j][r-1];break;default:e+=+d[j][r-2],f+=+d[j][r-1]}}d.toString=a._path2string,c.rel=bJ(d);return d},bL=a._pathToAbsolute=function(b){var c=bz(b);if(c.abs)return bJ(c.abs);if(!a.is(b,E)||!a.is(b&&b[0],E))b=a.parsePathString(b);if(!b||!b.length)return[["M",0,0]];var d=[],e=0,f=0,g=0,h=0,i=0;b[0][0]=="M"&&(e=+b[0][1],f=+b[0][2],g=e,h=f,i++,d[0]=["M",e,f]);var j=b.length==3&&b[0][0]=="M"&&b[1][0].toUpperCase()=="R"&&b[2][0].toUpperCase()=="Z";for(var k,l,m=i,o=b.length;m<o;m++){d.push(k=[]),l=b[m];if(l[0]!=S.call(l[0])){k[0]=S.call(l[0]);switch(k[0]){case"A":k[1]=l[1],k[2]=l[2],k[3]=l[3],k[4]=l[4],k[5]=l[5],k[6]=+(l[6]+e),k[7]=+(l[7]+f);break;case"V":k[1]=+l[1]+f;break;case"H":k[1]=+l[1]+e;break;case"R":var p=[e,f][n](l.slice(1));for(var q=2,r=p.length;q<r;q++)p[q]=+p[q]+e,p[++q]=+p[q]+f;d.pop(),d=d[n](by(p,j));break;case"M":g=+l[1]+e,h=+l[2]+f;default:for(q=1,r=l.length;q<r;q++)k[q]=+l[q]+(q%2?e:f)}}else if(l[0]=="R")p=[e,f][n](l.slice(1)),d.pop(),d=d[n](by(p,j)),k=["R"][n](l.slice(-2));else for(var s=0,t=l.length;s<t;s++)k[s]=l[s];switch(k[0]){case"Z":e=g,f=h;break;case"H":e=k[1];break;case"V":f=k[1];break;case"M":g=k[k.length-2],h=k[k.length-1];default:e=k[k.length-2],f=k[k.length-1]}}d.toString=a._path2string,c.abs=bJ(d);return d},bM=function(a,b,c,d){return[a,b,c,d,c,d]},bN=function(a,b,c,d,e,f){var g=1/3,h=2/3;return[g*a+h*c,g*b+h*d,g*e+h*c,g*f+h*d,e,f]},bO=function(a,b,c,d,e,f,g,h,i,j){var k=B*120/180,l=B/180*(+e||0),m=[],o,p=bv(function(a,b,c){var d=a*w.cos(c)-b*w.sin(c),e=a*w.sin(c)+b*w.cos(c);return{x:d,y:e}});if(!j){o=p(a,b,-l),a=o.x,b=o.y,o=p(h,i,-l),h=o.x,i=o.y;var q=w.cos(B/180*e),r=w.sin(B/180*e),t=(a-h)/2,u=(b-i)/2,v=t*t/(c*c)+u*u/(d*d);v>1&&(v=w.sqrt(v),c=v*c,d=v*d);var x=c*c,y=d*d,A=(f==g?-1:1)*w.sqrt(z((x*y-x*u*u-y*t*t)/(x*u*u+y*t*t))),C=A*c*u/d+(a+h)/2,D=A*-d*t/c+(b+i)/2,E=w.asin(((b-D)/d).toFixed(9)),F=w.asin(((i-D)/d).toFixed(9));E=a<C?B-E:E,F=h<C?B-F:F,E<0&&(E=B*2+E),F<0&&(F=B*2+F),g&&E>F&&(E=E-B*2),!g&&F>E&&(F=F-B*2)}else E=j[0],F=j[1],C=j[2],D=j[3];var G=F-E;if(z(G)>k){var H=F,I=h,J=i;F=E+k*(g&&F>E?1:-1),h=C+c*w.cos(F),i=D+d*w.sin(F),m=bO(h,i,c,d,e,0,g,I,J,[F,H,C,D])}G=F-E;var K=w.cos(E),L=w.sin(E),M=w.cos(F),N=w.sin(F),O=w.tan(G/4),P=4/3*c*O,Q=4/3*d*O,R=[a,b],S=[a+P*L,b-Q*K],T=[h+P*N,i-Q*M],U=[h,i];S[0]=2*R[0]-S[0],S[1]=2*R[1]-S[1];if(j)return[S,T,U][n](m);m=[S,T,U][n](m).join()[s](",");var V=[];for(var W=0,X=m.length;W<X;W++)V[W]=W%2?p(m[W-1],m[W],l).y:p(m[W],m[W+1],l).x;return V},bP=function(a,b,c,d,e,f,g,h,i){var j=1-i;return{x:A(j,3)*a+A(j,2)*3*i*c+j*3*i*i*e+A(i,3)*g,y:A(j,3)*b+A(j,2)*3*i*d+j*3*i*i*f+A(i,3)*h}},bQ=bv(function(a,b,c,d,e,f,g,h){var i=e-2*c+a-(g-2*e+c),j=2*(c-a)-2*(e-c),k=a-c,l=(-j+w.sqrt(j*j-4*i*k))/2/i,n=(-j-w.sqrt(j*j-4*i*k))/2/i,o=[b,h],p=[a,g],q;z(l)>"1e12"&&(l=.5),z(n)>"1e12"&&(n=.5),l>0&&l<1&&(q=bP(a,b,c,d,e,f,g,h,l),p.push(q.x),o.push(q.y)),n>0&&n<1&&(q=bP(a,b,c,d,e,f,g,h,n),p.push(q.x),o.push(q.y)),i=f-2*d+b-(h-2*f+d),j=2*(d-b)-2*(f-d),k=b-d,l=(-j+w.sqrt(j*j-4*i*k))/2/i,n=(-j-w.sqrt(j*j-4*i*k))/2/i,z(l)>"1e12"&&(l=.5),z(n)>"1e12"&&(n=.5),l>0&&l<1&&(q=bP(a,b,c,d,e,f,g,h,l),p.push(q.x),o.push(q.y)),n>0&&n<1&&(q=bP(a,b,c,d,e,f,g,h,n),p.push(q.x),o.push(q.y));return{min:{x:y[m](0,p),y:y[m](0,o)},max:{x:x[m](0,p),y:x[m](0,o)}}}),bR=a._path2curve=bv(function(a,b){var c=!b&&bz(a);if(!b&&c.curve)return bJ(c.curve);var d=bL(a),e=b&&bL(b),f={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},g={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},h=function(a,b){var c,d;if(!a)return["C",b.x,b.y,b.x,b.y,b.x,b.y];!(a[0]in{T:1,Q:1})&&(b.qx=b.qy=null);switch(a[0]){case"M":b.X=a[1],b.Y=a[2];break;case"A":a=["C"][n](bO[m](0,[b.x,b.y][n](a.slice(1))));break;case"S":c=b.x+(b.x-(b.bx||b.x)),d=b.y+(b.y-(b.by||b.y)),a=["C",c,d][n](a.slice(1));break;case"T":b.qx=b.x+(b.x-(b.qx||b.x)),b.qy=b.y+(b.y-(b.qy||b.y)),a=["C"][n](bN(b.x,b.y,b.qx,b.qy,a[1],a[2]));break;case"Q":b.qx=a[1],b.qy=a[2],a=["C"][n](bN(b.x,b.y,a[1],a[2],a[3],a[4]));break;case"L":a=["C"][n](bM(b.x,b.y,a[1],a[2]));break;case"H":a=["C"][n](bM(b.x,b.y,a[1],b.y));break;case"V":a=["C"][n](bM(b.x,b.y,b.x,a[1]));break;case"Z":a=["C"][n](bM(b.x,b.y,b.X,b.Y))}return a},i=function(a,b){if(a[b].length>7){a[b].shift();var c=a[b];while(c.length)a.splice(b++,0,["C"][n](c.splice(0,6)));a.splice(b,1),l=x(d.length,e&&e.length||0)}},j=function(a,b,c,f,g){a&&b&&a[g][0]=="M"&&b[g][0]!="M"&&(b.splice(g,0,["M",f.x,f.y]),c.bx=0,c.by=0,c.x=a[g][1],c.y=a[g][2],l=x(d.length,e&&e.length||0))};for(var k=0,l=x(d.length,e&&e.length||0);k<l;k++){d[k]=h(d[k],f),i(d,k),e&&(e[k]=h(e[k],g)),e&&i(e,k),j(d,e,f,g,k),j(e,d,g,f,k);var o=d[k],p=e&&e[k],q=o.length,r=e&&p.length;f.x=o[q-2],f.y=o[q-1],f.bx=Q(o[q-4])||f.x,f.by=Q(o[q-3])||f.y,g.bx=e&&(Q(p[r-4])||g.x),g.by=e&&(Q(p[r-3])||g.y),g.x=e&&p[r-2],g.y=e&&p[r-1]}e||(c.curve=bJ(d));return e?[d,e]:d},null,bJ),bS=a._parseDots=bv(function(b){var c=[];for(var d=0,e=b.length;d<e;d++){var f={},g=b[d].match(/^([^:]*):?([\d\.]*)/);f.color=a.getRGB(g[1]);if(f.color.error)return null;f.color=f.color.hex,g[2]&&(f.offset=g[2]+"%"),c.push(f)}for(d=1,e=c.length-1;d<e;d++)if(!c[d].offset){var h=Q(c[d-1].offset||0),i=0;for(var j=d+1;j<e;j++)if(c[j].offset){i=c[j].offset;break}i||(i=100,j=e),i=Q(i);var k=(i-h)/(j-d+1);for(;d<j;d++)h+=k,c[d].offset=h+"%"}return c}),bT=a._tear=function(a,b){a==b.top&&(b.top=a.prev),a==b.bottom&&(b.bottom=a.next),a.next&&(a.next.prev=a.prev),a.prev&&(a.prev.next=a.next)},bU=a._tofront=function(a,b){b.top!==a&&(bT(a,b),a.next=null,a.prev=b.top,b.top.next=a,b.top=a)},bV=a._toback=function(a,b){b.bottom!==a&&(bT(a,b),a.next=b.bottom,a.prev=null,b.bottom.prev=a,b.bottom=a)},bW=a._insertafter=function(a,b,c){bT(a,c),b==c.top&&(c.top=a),b.next&&(b.next.prev=a),a.next=b.next,a.prev=b,b.next=a},bX=a._insertbefore=function(a,b,c){bT(a,c),b==c.bottom&&(c.bottom=a),b.prev&&(b.prev.next=a),a.prev=b.prev,b.prev=a,a.next=b},bY=a.toMatrix=function(a,b){var c=bI(a),d={_:{transform:p},getBBox:function(){return c}};b$(d,b);return d.matrix},bZ=a.transformPath=function(a,b){return bj(a,bY(a,b))},b$=a._extractTransform=function(b,c){if(c==null)return b._.transform;c=r(c).replace(/\.{3}|\u2026/g,b._.transform||p);var d=a.parseTransformString(c),e=0,f=0,g=0,h=1,i=1,j=b._,k=new cb;j.transform=d||[];if(d)for(var l=0,m=d.length;l<m;l++){var n=d[l],o=n.length,q=r(n[0]).toLowerCase(),s=n[0]!=q,t=s?k.invert():0,u,v,w,x,y;q=="t"&&o==3?s?(u=t.x(0,0),v=t.y(0,0),w=t.x(n[1],n[2]),x=t.y(n[1],n[2]),k.translate(w-u,x-v)):k.translate(n[1],n[2]):q=="r"?o==2?(y=y||b.getBBox(1),k.rotate(n[1],y.x+y.width/2,y.y+y.height/2),e+=n[1]):o==4&&(s?(w=t.x(n[2],n[3]),x=t.y(n[2],n[3]),k.rotate(n[1],w,x)):k.rotate(n[1],n[2],n[3]),e+=n[1]):q=="s"?o==2||o==3?(y=y||b.getBBox(1),k.scale(n[1],n[o-1],y.x+y.width/2,y.y+y.height/2),h*=n[1],i*=n[o-1]):o==5&&(s?(w=t.x(n[3],n[4]),x=t.y(n[3],n[4]),k.scale(n[1],n[2],w,x)):k.scale(n[1],n[2],n[3],n[4]),h*=n[1],i*=n[2]):q=="m"&&o==7&&k.add(n[1],n[2],n[3],n[4],n[5],n[6]),j.dirtyT=1,b.matrix=k}b.matrix=k,j.sx=h,j.sy=i,j.deg=e,j.dx=f=k.e,j.dy=g=k.f,h==1&&i==1&&!e&&j.bbox?(j.bbox.x+=+f,j.bbox.y+=+g):j.dirtyT=1},b_=function(a){var b=a[0];switch(b.toLowerCase()){case"t":return[b,0,0];case"m":return[b,1,0,0,1,0,0];case"r":return a.length==4?[b,0,a[2],a[3]]:[b,0];case"s":return a.length==5?[b,1,1,a[3],a[4]]:a.length==3?[b,1,1]:[b,1]}},ca=a._equaliseTransform=function(b,c){c=r(c).replace(/\.{3}|\u2026/g,b),b=a.parseTransformString(b)||[],c=a.parseTransformString(c)||[];var d=x(b.length,c.length),e=[],f=[],g=0,h,i,j,k;for(;g<d;g++){j=b[g]||b_(c[g]),k=c[g]||b_(j);if(j[0]!=k[0]||j[0].toLowerCase()=="r"&&(j[2]!=k[2]||j[3]!=k[3])||j[0].toLowerCase()=="s"&&(j[3]!=k[3]||j[4]!=k[4]))return;e[g]=[],f[g]=[];for(h=0,i=x(j.length,k.length);h<i;h++)h in j&&(e[g][h]=j[h]),h in k&&(f[g][h]=k[h])}return{from:e,to:f}};a._getContainer=function(b,c,d,e){var f;f=e==null&&!a.is(b,"object")?h.doc.getElementById(b):b;if(f!=null){if(f.tagName)return c==null?{container:f,width:f.style.pixelWidth||f.offsetWidth,height:f.style.pixelHeight||f.offsetHeight}:{container:f,width:c,height:d};return{container:1,x:b,y:c,width:d,height:e}}},a.pathToRelative=bK,a._engine={},a.path2curve=bR,a.matrix=function(a,b,c,d,e,f){return new cb(a,b,c,d,e,f)},function(b){function d(a){var b=w.sqrt(c(a));a[0]&&(a[0]/=b),a[1]&&(a[1]/=b)}function c(a){return a[0]*a[0]+a[1]*a[1]}b.add=function(a,b,c,d,e,f){var g=[[],[],[]],h=[[this.a,this.c,this.e],[this.b,this.d,this.f],[0,0,1]],i=[[a,c,e],[b,d,f],[0,0,1]],j,k,l,m;a&&a instanceof cb&&(i=[[a.a,a.c,a.e],[a.b,a.d,a.f],[0,0,1]]);for(j=0;j<3;j++)for(k=0;k<3;k++){m=0;for(l=0;l<3;l++)m+=h[j][l]*i[l][k];g[j][k]=m}this.a=g[0][0],this.b=g[1][0],this.c=g[0][1],this.d=g[1][1],this.e=g[0][2],this.f=g[1][2]},b.invert=function(){var a=this,b=a.a*a.d-a.b*a.c;return new cb(a.d/b,-a.b/b,-a.c/b,a.a/b,(a.c*a.f-a.d*a.e)/b,(a.b*a.e-a.a*a.f)/b)},b.clone=function(){return new cb(this.a,this.b,this.c,this.d,this.e,this.f)},b.translate=function(a,b){this.add(1,0,0,1,a,b)},b.scale=function(a,b,c,d){b==null&&(b=a),(c||d)&&this.add(1,0,0,1,c,d),this.add(a,0,0,b,0,0),(c||d)&&this.add(1,0,0,1,-c,-d)},b.rotate=function(b,c,d){b=a.rad(b),c=c||0,d=d||0;var e=+w.cos(b).toFixed(9),f=+w.sin(b).toFixed(9);this.add(e,f,-f,e,c,d),this.add(1,0,0,1,-c,-d)},b.x=function(a,b){return a*this.a+b*this.c+this.e},b.y=function(a,b){return a*this.b+b*this.d+this.f},b.get=function(a){return+this[r.fromCharCode(97+a)].toFixed(4)},b.toString=function(){return a.svg?"matrix("+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)].join()+")":[this.get(0),this.get(2),this.get(1),this.get(3),0,0].join()},b.toFilter=function(){return"progid:DXImageTransform.Microsoft.Matrix(M11="+this.get(0)+", M12="+this.get(2)+", M21="+this.get(1)+", M22="+this.get(3)+", Dx="+this.get(4)+", Dy="+this.get(5)+", sizingmethod='auto expand')"},b.offset=function(){return[this.e.toFixed(4),this.f.toFixed(4)]},b.split=function(){var b={};b.dx=this.e,b.dy=this.f;var e=[[this.a,this.c],[this.b,this.d]];b.scalex=w.sqrt(c(e[0])),d(e[0]),b.shear=e[0][0]*e[1][0]+e[0][1]*e[1][1],e[1]=[e[1][0]-e[0][0]*b.shear,e[1][1]-e[0][1]*b.shear],b.scaley=w.sqrt(c(e[1])),d(e[1]),b.shear/=b.scaley;var f=-e[0][1],g=e[1][1];g<0?(b.rotate=a.deg(w.acos(g)),f<0&&(b.rotate=360-b.rotate)):b.rotate=a.deg(w.asin(f)),b.isSimple=!+b.shear.toFixed(9)&&(b.scalex.toFixed(9)==b.scaley.toFixed(9)||!b.rotate),b.isSuperSimple=!+b.shear.toFixed(9)&&b.scalex.toFixed(9)==b.scaley.toFixed(9)&&!b.rotate,b.noRotation=!+b.shear.toFixed(9)&&!b.rotate;return b},b.toTransformString=function(a){var b=a||this[s]();if(b.isSimple){b.scalex=+b.scalex.toFixed(4),b.scaley=+b.scaley.toFixed(4),b.rotate=+b.rotate.toFixed(4);return(b.dx||b.dy?"t"+[b.dx,b.dy]:p)+(b.scalex!=1||b.scaley!=1?"s"+[b.scalex,b.scaley,0,0]:p)+(b.rotate?"r"+[b.rotate,0,0]:p)}return"m"+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)]}}(cb.prototype);var cc=navigator.userAgent.match(/Version\/(.*?)\s/)||navigator.userAgent.match(/Chrome\/(\d+)/);navigator.vendor=="Apple Computer, Inc."&&(cc&&cc[1]<4||navigator.platform.slice(0,2)=="iP")||navigator.vendor=="Google Inc."&&cc&&cc[1]<8?k.safari=function(){var a=this.rect(-99,-99,this.width+99,this.height+99).attr({stroke:"none"});setTimeout(function(){a.remove()})}:k.safari=be;var cd=function(){this.returnValue=!1},ce=function(){return this.originalEvent.preventDefault()},cf=function(){this.cancelBubble=!0},cg=function(){return this.originalEvent.stopPropagation()},ch=function(){if(h.doc.addEventListener)return function(a,b,c,d){var e=o&&u[b]?u[b]:b,f=function(e){var f=h.doc.documentElement.scrollTop||h.doc.body.scrollTop,i=h.doc.documentElement.scrollLeft||h.doc.body.scrollLeft,j=e.clientX+i,k=e.clientY+f;if(o&&u[g](b))for(var l=0,m=e.targetTouches&&e.targetTouches.length;l<m;l++)if(e.targetTouches[l].target==a){var n=e;e=e.targetTouches[l],e.originalEvent=n,e.preventDefault=ce,e.stopPropagation=cg;break}return c.call(d,e,j,k)};a.addEventListener(e,f,!1);return function(){a.removeEventListener(e,f,!1);return!0}};if(h.doc.attachEvent)return function(a,b,c,d){var e=function(a){a=a||h.win.event;var b=h.doc.documentElement.scrollTop||h.doc.body.scrollTop,e=h.doc.documentElement.scrollLeft||h.doc.body.scrollLeft,f=a.clientX+e,g=a.clientY+b;a.preventDefault=a.preventDefault||cd,a.stopPropagation=a.stopPropagation||cf;return c.call(d,a,f,g)};a.attachEvent("on"+b,e);var f=function(){a.detachEvent("on"+b,e);return!0};return f}}(),ci=[],cj=function(a){var b=a.clientX,c=a.clientY,d=h.doc.documentElement.scrollTop||h.doc.body.scrollTop,e=h.doc.documentElement.scrollLeft||h.doc.body.scrollLeft,f,g=ci.length;while(g--){f=ci[g];if(o){var i=a.touches.length,j;while(i--){j=a.touches[i];if(j.identifier==f.el._drag.id){b=j.clientX,c=j.clientY,(a.originalEvent?a.originalEvent:a).preventDefault();break}}}else a.preventDefault();var k=f.el.node,l,m=k.nextSibling,n=k.parentNode,p=k.style.display;h.win.opera&&n.removeChild(k),k.style.display="none",l=f.el.paper.getElementByPoint(b,c),k.style.display=p,h.win.opera&&(m?n.insertBefore(k,m):n.appendChild(k)),l&&eve("raphael.drag.over."+f.el.id,f.el,l),b+=e,c+=d,eve("raphael.drag.move."+f.el.id,f.move_scope||f.el,b-f.el._drag.x,c-f.el._drag.y,b,c,a)}},ck=function(b){a.unmousemove(cj).unmouseup(ck);var c=ci.length,d;while(c--)d=ci[c],d.el._drag={},eve("raphael.drag.end."+d.el.id,d.end_scope||d.start_scope||d.move_scope||d.el,b);ci=[]},cl=a.el={};for(var cm=t.length;cm--;)(function(b){a[b]=cl[b]=function(c,d){a.is(c,"function")&&(this.events=this.events||[],this.events.push({name:b,f:c,unbind:ch(this.shape||this.node||h.doc,b,c,d||this)}));return this},a["un"+b]=cl["un"+b]=function(a){var c=this.events||[],d=c.length;while(d--)if(c[d].name==b&&c[d].f==a){c[d].unbind(),c.splice(d,1),!c.length&&delete this.events;return this}return this}})(t[cm]);cl.data=function(b,c){var d=bb[this.id]=bb[this.id]||{};if(arguments.length==1){if(a.is(b,"object")){for(var e in b)b[g](e)&&this.data(e,b[e]);return this}eve("raphael.data.get."+this.id,this,d[b],b);return d[b]}d[b]=c,eve("raphael.data.set."+this.id,this,c,b);return this},cl.removeData=function(a){a==null?bb[this.id]={}:bb[this.id]&&delete bb[this.id][a];return this},cl.hover=function(a,b,c,d){return this.mouseover(a,c).mouseout(b,d||c)},cl.unhover=function(a,b){return this.unmouseover(a).unmouseout(b)};var cn=[];cl.drag=function(b,c,d,e,f,g){function i(i){(i.originalEvent||i).preventDefault();var j=h.doc.documentElement.scrollTop||h.doc.body.scrollTop,k=h.doc.documentElement.scrollLeft||h.doc.body.scrollLeft;this._drag.x=i.clientX+k,this._drag.y=i.clientY+j,this._drag.id=i.identifier,!ci.length&&a.mousemove(cj).mouseup(ck),ci.push({el:this,move_scope:e,start_scope:f,end_scope:g}),c&&eve.on("raphael.drag.start."+this.id,c),b&&eve.on("raphael.drag.move."+this.id,b),d&&eve.on("raphael.drag.end."+this.id,d),eve("raphael.drag.start."+this.id,f||e||this,i.clientX+k,i.clientY+j,i)}this._drag={},cn.push({el:this,start:i}),this.mousedown(i);return this},cl.onDragOver=function(a){a?eve.on("raphael.drag.over."+this.id,a):eve.unbind("raphael.drag.over."+this.id)},cl.undrag=function(){var b=cn.length;while(b--)cn[b].el==this&&(this.unmousedown(cn[b].start),cn.splice(b,1),eve.unbind("raphael.drag.*."+this.id));!cn.length&&a.unmousemove(cj).unmouseup(ck)},k.circle=function(b,c,d){var e=a._engine.circle(this,b||0,c||0,d||0);this.__set__&&this.__set__.push(e);return e},k.rect=function(b,c,d,e,f){var g=a._engine.rect(this,b||0,c||0,d||0,e||0,f||0);this.__set__&&this.__set__.push(g);return g},k.ellipse=function(b,c,d,e){var f=a._engine.ellipse(this,b||0,c||0,d||0,e||0);this.__set__&&this.__set__.push(f);return f},k.path=function(b){b&&!a.is(b,D)&&!a.is(b[0],E)&&(b+=p);var c=a._engine.path(a.format[m](a,arguments),this);this.__set__&&this.__set__.push(c);return c},k.image=function(b,c,d,e,f){var g=a._engine.image(this,b||"about:blank",c||0,d||0,e||0,f||0);this.__set__&&this.__set__.push(g);return g},k.text=function(b,c,d){var e=a._engine.text(this,b||0,c||0,r(d));this.__set__&&this.__set__.push(e);return e},k.set=function(b){!a.is(b,"array")&&(b=Array.prototype.splice.call(arguments,0,arguments.length));var c=new cG(b);this.__set__&&this.__set__.push(c);return c},k.setStart=function(a){this.__set__=a||this.set()},k.setFinish=function(a){var b=this.__set__;delete this.__set__;return b},k.setSize=function(b,c){return a._engine.setSize.call(this,b,c)},k.setViewBox=function(b,c,d,e,f){return a._engine.setViewBox.call(this,b,c,d,e,f)},k.top=k.bottom=null,k.raphael=a;var co=function(a){var b=a.getBoundingClientRect(),c=a.ownerDocument,d=c.body,e=c.documentElement,f=e.clientTop||d.clientTop||0,g=e.clientLeft||d.clientLeft||0,i=b.top+(h.win.pageYOffset||e.scrollTop||d.scrollTop)-f,j=b.left+(h.win.pageXOffset||e.scrollLeft||d.scrollLeft)-g;return{y:i,x:j}};k.getElementByPoint=function(a,b){var c=this,d=c.canvas,e=h.doc.elementFromPoint(a,b);if(h.win.opera&&e.tagName=="svg"){var f=co(d),g=d.createSVGRect();g.x=a-f.x,g.y=b-f.y,g.width=g.height=1;var i=d.getIntersectionList(g,null);i.length&&(e=i[i.length-1])}if(!e)return null;while(e.parentNode&&e!=d.parentNode&&!e.raphael)e=e.parentNode;e==c.canvas.parentNode&&(e=d),e=e&&e.raphael?c.getById(e.raphaelid):null;return e},k.getById=function(a){var b=this.bottom;while(b){if(b.id==a)return b;b=b.next}return null},k.forEach=function(a,b){var c=this.bottom;while(c){if(a.call(b,c)===!1)return this;c=c.next}return this},k.getElementsByPoint=function(a,b){var c=this.set();this.forEach(function(d){d.isPointInside(a,b)&&c.push(d)});return c},cl.isPointInside=function(b,c){var d=this.realPath=this.realPath||bi[this.type](this);return a.isPointInsidePath(d,b,c)},cl.getBBox=function(a){if(this.removed)return{};var b=this._;if(a){if(b.dirty||!b.bboxwt)this.realPath=bi[this.type](this),b.bboxwt=bI(this.realPath),b.bboxwt.toString=cq,b.dirty=0;return b.bboxwt}if(b.dirty||b.dirtyT||!b.bbox){if(b.dirty||!this.realPath)b.bboxwt=0,this.realPath=bi[this.type](this);b.bbox=bI(bj(this.realPath,this.matrix)),b.bbox.toString=cq,b.dirty=b.dirtyT=0}return b.bbox},cl.clone=function(){if(this.removed)return null;var a=this.paper[this.type]().attr(this.attr());this.__set__&&this.__set__.push(a);return a},cl.glow=function(a){if(this.type=="text")return null;a=a||{};var b={width:(a.width||10)+(+this.attr("stroke-width")||1),fill:a.fill||!1,opacity:a.opacity||.5,offsetx:a.offsetx||0,offsety:a.offsety||0,color:a.color||"#000"},c=b.width/2,d=this.paper,e=d.set(),f=this.realPath||bi[this.type](this);f=this.matrix?bj(f,this.matrix):f;for(var g=1;g<c+1;g++)e.push(d.path(f).attr({stroke:b.color,fill:b.fill?b.color:"none","stroke-linejoin":"round","stroke-linecap":"round","stroke-width":+(b.width/c*g).toFixed(3),opacity:+(b.opacity/c).toFixed(3)}));return e.insertBefore(this).translate(b.offsetx,b.offsety)};var cr={},cs=function(b,c,d,e,f,g,h,i,j){return j==null?bB(b,c,d,e,f,g,h,i):a.findDotsAtSegment(b,c,d,e,f,g,h,i,bC(b,c,d,e,f,g,h,i,j))},ct=function(b,c){return function(d,e,f){d=bR(d);var g,h,i,j,k="",l={},m,n=0;for(var o=0,p=d.length;o<p;o++){i=d[o];if(i[0]=="M")g=+i[1],h=+i[2];else{j=cs(g,h,i[1],i[2],i[3],i[4],i[5],i[6]);if(n+j>e){if(c&&!l.start){m=cs(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),k+=["C"+m.start.x,m.start.y,m.m.x,m.m.y,m.x,m.y];if(f)return k;l.start=k,k=["M"+m.x,m.y+"C"+m.n.x,m.n.y,m.end.x,m.end.y,i[5],i[6]].join(),n+=j,g=+i[5],h=+i[6];continue}if(!b&&!c){m=cs(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n);return{x:m.x,y:m.y,alpha:m.alpha}}}n+=j,g=+i[5],h=+i[6]}k+=i.shift()+i}l.end=k,m=b?n:c?l:a.findDotsAtSegment(g,h,i[0],i[1],i[2],i[3],i[4],i[5],1),m.alpha&&(m={x:m.x,y:m.y,alpha:m.alpha});return m}},cu=ct(1),cv=ct(),cw=ct(0,1);a.getTotalLength=cu,a.getPointAtLength=cv,a.getSubpath=function(a,b,c){if(this.getTotalLength(a)-c<1e-6)return cw(a,b).end;var d=cw(a,c,1);return b?cw(d,b).end:d},cl.getTotalLength=function(){if(this.type=="path"){if(this.node.getTotalLength)return this.node.getTotalLength();return cu(this.attrs.path)}},cl.getPointAtLength=function(a){if(this.type=="path")return cv(this.attrs.path,a)},cl.getSubpath=function(b,c){if(this.type=="path")return a.getSubpath(this.attrs.path,b,c)};var cx=a.easing_formulas={linear:function(a){return a},"<":function(a){return A(a,1.7)},">":function(a){return A(a,.48)},"<>":function(a){var b=.48-a/1.04,c=w.sqrt(.1734+b*b),d=c-b,e=A(z(d),1/3)*(d<0?-1:1),f=-c-b,g=A(z(f),1/3)*(f<0?-1:1),h=e+g+.5;return(1-h)*3*h*h+h*h*h},backIn:function(a){var b=1.70158;return a*a*((b+1)*a-b)},backOut:function(a){a=a-1;var b=1.70158;return a*a*((b+1)*a+b)+1},elastic:function(a){if(a==!!a)return a;return A(2,-10*a)*w.sin((a-.075)*2*B/.3)+1},bounce:function(a){var b=7.5625,c=2.75,d;a<1/c?d=b*a*a:a<2/c?(a-=1.5/c,d=b*a*a+.75):a<2.5/c?(a-=2.25/c,d=b*a*a+.9375):(a-=2.625/c,d=b*a*a+.984375);return d}};cx.easeIn=cx["ease-in"]=cx["<"],cx.easeOut=cx["ease-out"]=cx[">"],cx.easeInOut=cx["ease-in-out"]=cx["<>"],cx["back-in"]=cx.backIn,cx["back-out"]=cx.backOut;var cy=[],cz=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(a){setTimeout(a,16)},cA=function(){var b=+(new Date),c=0;for(;c<cy.length;c++){var d=cy[c];if(d.el.removed||d.paused)continue;var e=b-d.start,f=d.ms,h=d.easing,i=d.from,j=d.diff,k=d.to,l=d.t,m=d.el,o={},p,r={},s;d.initstatus?(e=(d.initstatus*d.anim.top-d.prev)/(d.percent-d.prev)*f,d.status=d.initstatus,delete d.initstatus,d.stop&&cy.splice(c--,1)):d.status=(d.prev+(d.percent-d.prev)*(e/f))/d.anim.top;if(e<0)continue;if(e<f){var t=h(e/f);for(var u in i)if(i[g](u)){switch(U[u]){case C:p=+i[u]+t*f*j[u];break;case"colour":p="rgb("+[cB(O(i[u].r+t*f*j[u].r)),cB(O(i[u].g+t*f*j[u].g)),cB(O(i[u].b+t*f*j[u].b))].join(",")+")";break;case"path":p=[];for(var v=0,w=i[u].length;v<w;v++){p[v]=[i[u][v][0]];for(var x=1,y=i[u][v].length;x<y;x++)p[v][x]=+i[u][v][x]+t*f*j[u][v][x];p[v]=p[v].join(q)}p=p.join(q);break;case"transform":if(j[u].real){p=[];for(v=0,w=i[u].length;v<w;v++){p[v]=[i[u][v][0]];for(x=1,y=i[u][v].length;x<y;x++)p[v][x]=i[u][v][x]+t*f*j[u][v][x]}}else{var z=function(a){return+i[u][a]+t*f*j[u][a]};p=[["m",z(0),z(1),z(2),z(3),z(4),z(5)]]}break;case"csv":if(u=="clip-rect"){p=[],v=4;while(v--)p[v]=+i[u][v]+t*f*j[u][v]}break;default:var A=[][n](i[u]);p=[],v=m.paper.customAttributes[u].length;while(v--)p[v]=+A[v]+t*f*j[u][v]}o[u]=p}m.attr(o),function(a,b,c){setTimeout(function(){eve("raphael.anim.frame."+a,b,c)})}(m.id,m,d.anim)}else{(function(b,c,d){setTimeout(function(){eve("raphael.anim.frame."+c.id,c,d),eve("raphael.anim.finish."+c.id,c,d),a.is(b,"function")&&b.call(c)})})(d.callback,m,d.anim),m.attr(k),cy.splice(c--,1);if(d.repeat>1&&!d.next){for(s in k)k[g](s)&&(r[s]=d.totalOrigin[s]);d.el.attr(r),cE(d.anim,d.el,d.anim.percents[0],null,d.totalOrigin,d.repeat-1)}d.next&&!d.stop&&cE(d.anim,d.el,d.next,null,d.totalOrigin,d.repeat)}}a.svg&&m&&m.paper&&m.paper.safari(),cy.length&&cz(cA)},cB=function(a){return a>255?255:a<0?0:a};cl.animateWith=function(b,c,d,e,f,g){var h=this;if(h.removed){g&&g.call(h);return h}var i=d instanceof cD?d:a.animation(d,e,f,g),j,k;cE(i,h,i.percents[0],null,h.attr());for(var l=0,m=cy.length;l<m;l++)if(cy[l].anim==c&&cy[l].el==b){cy[m-1].start=cy[l].start;break}return h},cl.onAnimation=function(a){a?eve.on("raphael.anim.frame."+this.id,a):eve.unbind("raphael.anim.frame."+this.id);return this},cD.prototype.delay=function(a){var b=new cD(this.anim,this.ms);b.times=this.times,b.del=+a||0;return b},cD.prototype.repeat=function(a){var b=new cD(this.anim,this.ms);b.del=this.del,b.times=w.floor(x(a,0))||1;return b},a.animation=function(b,c,d,e){if(b instanceof cD)return b;if(a.is(d,"function")||!d)e=e||d||null,d=null;b=Object(b),c=+c||0;var f={},h,i;for(i in b)b[g](i)&&Q(i)!=i&&Q(i)+"%"!=i&&(h=!0,f[i]=b[i]);if(!h)return new cD(b,c);d&&(f.easing=d),e&&(f.callback=e);return new cD({100:f},c)},cl.animate=function(b,c,d,e){var f=this;if(f.removed){e&&e.call(f);return f}var g=b instanceof cD?b:a.animation(b,c,d,e);cE(g,f,g.percents[0],null,f.attr());return f},cl.setTime=function(a,b){a&&b!=null&&this.status(a,y(b,a.ms)/a.ms);return this},cl.status=function(a,b){var c=[],d=0,e,f;if(b!=null){cE(a,this,-1,y(b,1));return this}e=cy.length;for(;d<e;d++){f=cy[d];if(f.el.id==this.id&&(!a||f.anim==a)){if(a)return f.status;c.push({anim:f.anim,status:f.status})}}if(a)return 0;return c},cl.pause=function(a){for(var b=0;b<cy.length;b++)cy[b].el.id==this.id&&(!a||cy[b].anim==a)&&eve("raphael.anim.pause."+this.id,this,cy[b].anim)!==!1&&(cy[b].paused=!0);return this},cl.resume=function(a){for(var b=0;b<cy.length;b++)if(cy[b].el.id==this.id&&(!a||cy[b].anim==a)){var c=cy[b];eve("raphael.anim.resume."+this.id,this,c.anim)!==!1&&(delete c.paused,this.status(c.anim,c.status))}return this},cl.stop=function(a){for(var b=0;b<cy.length;b++)cy[b].el.id==this.id&&(!a||cy[b].anim==a)&&eve("raphael.anim.stop."+this.id,this,cy[b].anim)!==!1&&cy.splice(b--,1);return this},eve.on("raphael.remove",cF),eve.on("raphael.clear",cF),cl.toString=function(){return"Raphaël’s object"};var cG=function(a){this.items=[],this.length=0,this.type="set";if(a)for(var b=0,c=a.length;b<c;b++)a[b]&&(a[b].constructor==cl.constructor||a[b].constructor==cG)&&(this[this.items.length]=this.items[this.items.length]=a[b],this.length++)},cH=cG.prototype;cH.push=function(){var a,b;for(var c=0,d=arguments.length;c<d;c++)a=arguments[c],a&&(a.constructor==cl.constructor||a.constructor==cG)&&(b=this.items.length,this[b]=this.items[b]=a,this.length++);return this},cH.pop=function(){this.length&&delete this[this.length--];return this.items.pop()},cH.forEach=function(a,b){for(var c=0,d=this.items.length;c<d;c++)if(a.call(b,this.items[c],c)===!1)return this;return this};for(var cI in cl)cl[g](cI)&&(cH[cI]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a][m](c,b)})}}(cI));cH.attr=function(b,c){if(b&&a.is(b,E)&&a.is(b[0],"object"))for(var d=0,e=b.length;d<e;d++)this.items[d].attr(b[d]);else for(var f=0,g=this.items.length;f<g;f++)this.items[f].attr(b,c);return this},cH.clear=function(){while(this.length)this.pop()},cH.splice=function(a,b,c){a=a<0?x(this.length+a,0):a,b=x(0,y(this.length-a,b));var d=[],e=[],f=[],g;for(g=2;g<arguments.length;g++)f.push(arguments[g]);for(g=0;g<b;g++)e.push(this[a+g]);for(;g<this.length-a;g++)d.push(this[a+g]);var h=f.length;for(g=0;g<h+d.length;g++)this.items[a+g]=this[a+g]=g<h?f[g]:d[g-h];g=this.items.length=this.length-=b-h;while(this[g])delete this[g++];return new cG(e)},cH.exclude=function(a){for(var b=0,c=this.length;b<c;b++)if(this[b]==a){this.splice(b,1);return!0}},cH.animate=function(b,c,d,e){(a.is(d,"function")||!d)&&(e=d||null);var f=this.items.length,g=f,h,i=this,j;if(!f)return this;e&&(j=function(){!--f&&e.call(i)}),d=a.is(d,D)?d:j;var k=a.animation(b,c,d,j);h=this.items[--g].animate(k);while(g--)this.items[g]&&!this.items[g].removed&&this.items[g].animateWith(h,k,k);return this},cH.insertAfter=function(a){var b=this.items.length;while(b--)this.items[b].insertAfter(a);return this},cH.getBBox=function(){var a=[],b=[],c=[],d=[];for(var e=this.items.length;e--;)if(!this.items[e].removed){var f=this.items[e].getBBox();a.push(f.x),b.push(f.y),c.push(f.x+f.width),d.push(f.y+f.height)}a=y[m](0,a),b=y[m](0,b),c=x[m](0,c),d=x[m](0,d);return{x:a,y:b,x2:c,y2:d,width:c-a,height:d-b}},cH.clone=function(a){a=new cG;for(var b=0,c=this.items.length;b<c;b++)a.push(this.items[b].clone());return a},cH.toString=function(){return"Raphaël‘s set"},a.registerFont=function(a){if(!a.face)return a;this.fonts=this.fonts||{};var b={w:a.w,face:{},glyphs:{}},c=a.face["font-family"];for(var d in a.face)a.face[g](d)&&(b.face[d]=a.face[d]);this.fonts[c]?this.fonts[c].push(b):this.fonts[c]=[b];if(!a.svg){b.face["units-per-em"]=R(a.face["units-per-em"],10);for(var e in a.glyphs)if(a.glyphs[g](e)){var f=a.glyphs[e];b.glyphs[e]={w:f.w,k:{},d:f.d&&"M"+f.d.replace(/[mlcxtrv]/g,function(a){return{l:"L",c:"C",x:"z",t:"m",r:"l",v:"c"}[a]||"M"})+"z"};if(f.k)for(var h in f.k)f[g](h)&&(b.glyphs[e].k[h]=f.k[h])}}return a},k.getFont=function(b,c,d,e){e=e||"normal",d=d||"normal",c=+c||{normal:400,bold:700,lighter:300,bolder:800}[c]||400;if(!!a.fonts){var f=a.fonts[b];if(!f){var h=new RegExp("(^|\\s)"+b.replace(/[^\w\d\s+!~.:_-]/g,p)+"(\\s|$)","i");for(var i in a.fonts)if(a.fonts[g](i)&&h.test(i)){f=a.fonts[i];break}}var j;if(f)for(var k=0,l=f.length;k<l;k++){j=f[k];if(j.face["font-weight"]==c&&(j.face["font-style"]==d||!j.face["font-style"])&&j.face["font-stretch"]==e)break}return j}},k.print=function(b,d,e,f,g,h,i){h=h||"middle",i=x(y(i||0,1),-1);var j=r(e)[s](p),k=0,l=0,m=p,n;a.is(f,e)&&(f=this.getFont(f));if(f){n=(g||16)/f.face["units-per-em"];var o=f.face.bbox[s](c),q=+o[0],t=o[3]-o[1],u=0,v=+o[1]+(h=="baseline"?t+ +f.face.descent:t/2);for(var w=0,z=j.length;w<z;w++){if(j[w]=="\n")k=0,B=0,l=0,u+=t;else{var A=l&&f.glyphs[j[w-1]]||{},B=f.glyphs[j[w]];k+=l?(A.w||f.w)+(A.k&&A.k[j[w]]||0)+f.w*i:0,l=1}B&&B.d&&(m+=a.transformPath(B.d,["t",k*n,u*n,"s",n,n,q,v,"t",(b-q)/n,(d-v)/n]))}}return this.path(m).attr({fill:"#000",stroke:"none"})},k.add=function(b){if(a.is(b,"array")){var c=this.set(),e=0,f=b.length,h;for(;e<f;e++)h=b[e]||{},d[g](h.type)&&c.push(this[h.type]().attr(h))}return c},a.format=function(b,c){var d=a.is(c,E)?[0][n](c):arguments;b&&a.is(b,D)&&d.length-1&&(b=b.replace(e,function(a,b){return d[++b]==null?p:d[b]}));return b||p},a.fullfill=function(){var a=/\{([^\}]+)\}/g,b=/(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g,c=function(a,c,d){var e=d;c.replace(b,function(a,b,c,d,f){b=b||d,e&&(b in e&&(e=e[b]),typeof e=="function"&&f&&(e=e()))}),e=(e==null||e==d?a:e)+"";return e};return function(b,d){return String(b).replace(a,function(a,b){return c(a,b,d)})}}(),a.ninja=function(){i.was?h.win.Raphael=i.is:delete Raphael;return a},a.st=cH,function(b,c,d){function e(){/in/.test(b.readyState)?setTimeout(e,9):a.eve("raphael.DOMload")}b.readyState==null&&b.addEventListener&&(b.addEventListener(c,d=function(){b.removeEventListener(c,d,!1),b.readyState="complete"},!1),b.readyState="loading"),e()}(document,"DOMContentLoaded"),i.was?h.win.Raphael=a:Raphael=a,eve.on("raphael.DOMload",function(){b=!0})}(),window.Raphael.svg&&function(a){var b="hasOwnProperty",c=String,d=parseFloat,e=parseInt,f=Math,g=f.max,h=f.abs,i=f.pow,j=/[, ]+/,k=a.eve,l="",m=" ",n="http://www.w3.org/1999/xlink",o={block:"M5,0 0,2.5 5,5z",classic:"M5,0 0,2.5 5,5 3.5,3 3.5,2z",diamond:"M2.5,0 5,2.5 2.5,5 0,2.5z",open:"M6,1 1,3.5 6,6",oval:"M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z"},p={};a.toString=function(){return"Your browser supports SVG.\nYou are running Raphaël "+this.version};var q=function(d,e){if(e){typeof d=="string"&&(d=q(d));for(var f in e)e[b](f)&&(f.substring(0,6)=="xlink:"?d.setAttributeNS(n,f.substring(6),c(e[f])):d.setAttribute(f,c(e[f])))}else d=a._g.doc.createElementNS("http://www.w3.org/2000/svg",d),d.style&&(d.style.webkitTapHighlightColor="rgba(0,0,0,0)");return d},r=function(b,e){var j="linear",k=b.id+e,m=.5,n=.5,o=b.node,p=b.paper,r=o.style,s=a._g.doc.getElementById(k);if(!s){e=c(e).replace(a._radial_gradient,function(a,b,c){j="radial";if(b&&c){m=d(b),n=d(c);var e=(n>.5)*2-1;i(m-.5,2)+i(n-.5,2)>.25&&(n=f.sqrt(.25-i(m-.5,2))*e+.5)&&n!=.5&&(n=n.toFixed(5)-1e-5*e)}return l}),e=e.split(/\s*\-\s*/);if(j=="linear"){var t=e.shift();t=-d(t);if(isNaN(t))return null;var u=[0,0,f.cos(a.rad(t)),f.sin(a.rad(t))],v=1/(g(h(u[2]),h(u[3]))||1);u[2]*=v,u[3]*=v,u[2]<0&&(u[0]=-u[2],u[2]=0),u[3]<0&&(u[1]=-u[3],u[3]=0)}var w=a._parseDots(e);if(!w)return null;k=k.replace(/[\(\)\s,\xb0#]/g,"_"),b.gradient&&k!=b.gradient.id&&(p.defs.removeChild(b.gradient),delete b.gradient);if(!b.gradient){s=q(j+"Gradient",{id:k}),b.gradient=s,q(s,j=="radial"?{fx:m,fy:n}:{x1:u[0],y1:u[1],x2:u[2],y2:u[3],gradientTransform:b.matrix.invert()}),p.defs.appendChild(s);for(var x=0,y=w.length;x<y;x++)s.appendChild(q("stop",{offset:w[x].offset?w[x].offset:x?"100%":"0%","stop-color":w[x].color||"#fff"}))}}q(o,{fill:"url(#"+k+")",opacity:1,"fill-opacity":1}),r.fill=l,r.opacity=1,r.fillOpacity=1;return 1},s=function(a){var b=a.getBBox(1);q(a.pattern,{patternTransform:a.matrix.invert()+" translate("+b.x+","+b.y+")"})},t=function(d,e,f){if(d.type=="path"){var g=c(e).toLowerCase().split("-"),h=d.paper,i=f?"end":"start",j=d.node,k=d.attrs,m=k["stroke-width"],n=g.length,r="classic",s,t,u,v,w,x=3,y=3,z=5;while(n--)switch(g[n]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":r=g[n];break;case"wide":y=5;break;case"narrow":y=2;break;case"long":x=5;break;case"short":x=2}r=="open"?(x+=2,y+=2,z+=2,u=1,v=f?4:1,w={fill:"none",stroke:k.stroke}):(v=u=x/2,w={fill:k.stroke,stroke:"none"}),d._.arrows?f?(d._.arrows.endPath&&p[d._.arrows.endPath]--,d._.arrows.endMarker&&p[d._.arrows.endMarker]--):(d._.arrows.startPath&&p[d._.arrows.startPath]--,d._.arrows.startMarker&&p[d._.arrows.startMarker]--):d._.arrows={};if(r!="none"){var A="raphael-marker-"+r,B="raphael-marker-"+i+r+x+y;a._g.doc.getElementById(A)?p[A]++:(h.defs.appendChild(q(q("path"),{"stroke-linecap":"round",d:o[r],id:A})),p[A]=1);var C=a._g.doc.getElementById(B),D;C?(p[B]++,D=C.getElementsByTagName("use")[0]):(C=q(q("marker"),{id:B,markerHeight:y,markerWidth:x,orient:"auto",refX:v,refY:y/2}),D=q(q("use"),{"xlink:href":"#"+A,transform:(f?"rotate(180 "+x/2+" "+y/2+") ":l)+"scale("+x/z+","+y/z+")","stroke-width":(1/((x/z+y/z)/2)).toFixed(4)}),C.appendChild(D),h.defs.appendChild(C),p[B]=1),q(D,w);var F=u*(r!="diamond"&&r!="oval");f?(s=d._.arrows.startdx*m||0,t=a.getTotalLength(k.path)-F*m):(s=F*m,t=a.getTotalLength(k.path)-(d._.arrows.enddx*m||0)),w={},w["marker-"+i]="url(#"+B+")";if(t||s)w.d=Raphael.getSubpath(k.path,s,t);q(j,w),d._.arrows[i+"Path"]=A,d._.arrows[i+"Marker"]=B,d._.arrows[i+"dx"]=F,d._.arrows[i+"Type"]=r,d._.arrows[i+"String"]=e}else f?(s=d._.arrows.startdx*m||0,t=a.getTotalLength(k.path)-s):(s=0,t=a.getTotalLength(k.path)-(d._.arrows.enddx*m||0)),d._.arrows[i+"Path"]&&q(j,{d:Raphael.getSubpath(k.path,s,t)}),delete d._.arrows[i+"Path"],delete d._.arrows[i+"Marker"],delete d._.arrows[i+"dx"],delete d._.arrows[i+"Type"],delete d._.arrows[i+"String"];for(w in p)if(p[b](w)&&!p[w]){var G=a._g.doc.getElementById(w);G&&G.parentNode.removeChild(G)}}},u={"":[0],none:[0],"-":[3,1],".":[1,1],"-.":[3,1,1,1],"-..":[3,1,1,1,1,1],". ":[1,3],"- ":[4,3],"--":[8,3],"- .":[4,3,1,3],"--.":[8,3,1,3],"--..":[8,3,1,3,1,3]},v=function(a,b,d){b=u[c(b).toLowerCase()];if(b){var e=a.attrs["stroke-width"]||"1",f={round:e,square:e,butt:0}[a.attrs["stroke-linecap"]||d["stroke-linecap"]]||0,g=[],h=b.length;while(h--)g[h]=b[h]*e+(h%2?1:-1)*f;q(a.node,{"stroke-dasharray":g.join(",")})}},w=function(d,f){var i=d.node,k=d.attrs,m=i.style.visibility;i.style.visibility="hidden";for(var o in f)if(f[b](o)){if(!a._availableAttrs[b](o))continue;var p=f[o];k[o]=p;switch(o){case"blur":d.blur(p);break;case"href":case"title":case"target":var u=i.parentNode;if(u.tagName.toLowerCase()!="a"){var w=q("a");u.insertBefore(w,i),w.appendChild(i),u=w}o=="target"?u.setAttributeNS(n,"show",p=="blank"?"new":p):u.setAttributeNS(n,o,p);break;case"cursor":i.style.cursor=p;break;case"transform":d.transform(p);break;case"arrow-start":t(d,p);break;case"arrow-end":t(d,p,1);break;case"clip-rect":var x=c(p).split(j);if(x.length==4){d.clip&&d.clip.parentNode.parentNode.removeChild(d.clip.parentNode);var z=q("clipPath"),A=q("rect");z.id=a.createUUID(),q(A,{x:x[0],y:x[1],width:x[2],height:x[3]}),z.appendChild(A),d.paper.defs.appendChild(z),q(i,{"clip-path":"url(#"+z.id+")"}),d.clip=A}if(!p){var B=i.getAttribute("clip-path");if(B){var C=a._g.doc.getElementById(B.replace(/(^url\(#|\)$)/g,l));C&&C.parentNode.removeChild(C),q(i,{"clip-path":l}),delete d.clip}}break;case"path":d.type=="path"&&(q(i,{d:p?k.path=a._pathToAbsolute(p):"M0,0"}),d._.dirty=1,d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1)));break;case"width":i.setAttribute(o,p),d._.dirty=1;if(k.fx)o="x",p=k.x;else break;case"x":k.fx&&(p=-k.x-(k.width||0));case"rx":if(o=="rx"&&d.type=="rect")break;case"cx":i.setAttribute(o,p),d.pattern&&s(d),d._.dirty=1;break;case"height":i.setAttribute(o,p),d._.dirty=1;if(k.fy)o="y",p=k.y;else break;case"y":k.fy&&(p=-k.y-(k.height||0));case"ry":if(o=="ry"&&d.type=="rect")break;case"cy":i.setAttribute(o,p),d.pattern&&s(d),d._.dirty=1;break;case"r":d.type=="rect"?q(i,{rx:p,ry:p}):i.setAttribute(o,p),d._.dirty=1;break;case"src":d.type=="image"&&i.setAttributeNS(n,"href",p);break;case"stroke-width":if(d._.sx!=1||d._.sy!=1)p/=g(h(d._.sx),h(d._.sy))||1;d.paper._vbSize&&(p*=d.paper._vbSize),i.setAttribute(o,p),k["stroke-dasharray"]&&v(d,k["stroke-dasharray"],f),d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"stroke-dasharray":v(d,p,f);break;case"fill":var D=c(p).match(a._ISURL);if(D){z=q("pattern");var F=q("image");z.id=a.createUUID(),q(z,{x:0,y:0,patternUnits:"userSpaceOnUse",height:1,width:1}),q(F,{x:0,y:0,"xlink:href":D[1]}),z.appendChild(F),function(b){a._preload(D[1],function(){var a=this.offsetWidth,c=this.offsetHeight;q(b,{width:a,height:c}),q(F,{width:a,height:c}),d.paper.safari()})}(z),d.paper.defs.appendChild(z),q(i,{fill:"url(#"+z.id+")"}),d.pattern=z,d.pattern&&s(d);break}var G=a.getRGB(p);if(!G.error)delete f.gradient,delete k.gradient,!a.is(k.opacity,"undefined")&&a.is(f.opacity,"undefined")&&q(i,{opacity:k.opacity}),!a.is(k["fill-opacity"],"undefined")&&a.is(f["fill-opacity"],"undefined")&&q(i,{"fill-opacity":k["fill-opacity"]});else if((d.type=="circle"||d.type=="ellipse"||c(p).charAt()!="r")&&r(d,p)){if("opacity"in k||"fill-opacity"in k){var H=a._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l));if(H){var I=H.getElementsByTagName("stop");q(I[I.length-1],{"stop-opacity":("opacity"in k?k.opacity:1)*("fill-opacity"in k?k["fill-opacity"]:1)})}}k.gradient=p,k.fill="none";break}G[b]("opacity")&&q(i,{"fill-opacity":G.opacity>1?G.opacity/100:G.opacity});case"stroke":G=a.getRGB(p),i.setAttribute(o,G.hex),o=="stroke"&&G[b]("opacity")&&q(i,{"stroke-opacity":G.opacity>1?G.opacity/100:G.opacity}),o=="stroke"&&d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"gradient":(d.type=="circle"||d.type=="ellipse"||c(p).charAt()!="r")&&r(d,p);break;case"opacity":k.gradient&&!k[b]("stroke-opacity")&&q(i,{"stroke-opacity":p>1?p/100:p});case"fill-opacity":if(k.gradient){H=a._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l)),H&&(I=H.getElementsByTagName("stop"),q(I[I.length-1],{"stop-opacity":p}));break};default:o=="font-size"&&(p=e(p,10)+"px");var J=o.replace(/(\-.)/g,function(a){return a.substring(1).toUpperCase()});i.style[J]=p,d._.dirty=1,i.setAttribute(o,p)}}y(d,f),i.style.visibility=m},x=1.2,y=function(d,f){if(d.type=="text"&&!!(f[b]("text")||f[b]("font")||f[b]("font-size")||f[b]("x")||f[b]("y"))){var g=d.attrs,h=d.node,i=h.firstChild?e(a._g.doc.defaultView.getComputedStyle(h.firstChild,l).getPropertyValue("font-size"),10):10;if(f[b]("text")){g.text=f.text;while(h.firstChild)h.removeChild(h.firstChild);var j=c(f.text).split("\n"),k=[],m;for(var n=0,o=j.length;n<o;n++)m=q("tspan"),n&&q(m,{dy:i*x,x:g.x}),m.appendChild(a._g.doc.createTextNode(j[n])),h.appendChild(m),k[n]=m}else{k=h.getElementsByTagName("tspan");for(n=0,o=k.length;n<o;n++)n?q(k[n],{dy:i*x,x:g.x}):q(k[0],{dy:0})}q(h,{x:g.x,y:g.y}),d._.dirty=1;var p=d._getBBox(),r=g.y-(p.y+p.height/2);r&&a.is(r,"finite")&&q(k[0],{dy:r})}},z=function(b,c){var d=0,e=0;this[0]=this.node=b,b.raphael=!0,this.id=a._oid++,b.raphaelid=this.id,this.matrix=a.matrix(),this.realPath=null,this.paper=c,this.attrs=this.attrs||{},this._={transform:[],sx:1,sy:1,deg:0,dx:0,dy:0,dirty:1},!c.bottom&&(c.bottom=this),this.prev=c.top,c.top&&(c.top.next=this),c.top=this,this.next=null},A=a.el;z.prototype=A,A.constructor=z,a._engine.path=function(a,b){var c=q("path");b.canvas&&b.canvas.appendChild(c);var d=new z(c,b);d.type="path",w(d,{fill:"none",stroke:"#000",path:a});return d},A.rotate=function(a,b,e){if(this.removed)return this;a=c(a).split(j),a.length-1&&(b=d(a[1]),e=d(a[2])),a=d(a[0]),e==null&&(b=e);if(b==null||e==null){var f=this.getBBox(1);b=f.x+f.width/2,e=f.y+f.height/2}this.transform(this._.transform.concat([["r",a,b,e]]));return this},A.scale=function(a,b,e,f){if(this.removed)return this;a=c(a).split(j),a.length-1&&(b=d(a[1]),e=d(a[2]),f=d(a[3])),a=d(a[0]),b==null&&(b=a),f==null&&(e=f);if(e==null||f==null)var g=this.getBBox(1);e=e==null?g.x+g.width/2:e,f=f==null?g.y+g.height/2:f,this.transform(this._.transform.concat([["s",a,b,e,f]]));return this},A.translate=function(a,b){if(this.removed)return this;a=c(a).split(j),a.length-1&&(b=d(a[1])),a=d(a[0])||0,b=+b||0,this.transform(this._.transform.concat([["t",a,b]]));return this},A.transform=function(c){var d=this._;if(c==null)return d.transform;a._extractTransform(this,c),this.clip&&q(this.clip,{transform:this.matrix.invert()}),this.pattern&&s(this),this.node&&q(this.node,{transform:this.matrix});if(d.sx!=1||d.sy!=1){var e=this.attrs[b]("stroke-width")?this.attrs["stroke-width"]:1;this.attr({"stroke-width":e})}return this},A.hide=function(){!this.removed&&this.paper.safari(this.node.style.display="none");return this},A.show=function(){!this.removed&&this.paper.safari(this.node.style.display="");return this},A.remove=function(){if(!this.removed&&!!this.node.parentNode){var b=this.paper;b.__set__&&b.__set__.exclude(this),k.unbind("raphael.*.*."+this.id),this.gradient&&b.defs.removeChild(this.gradient),a._tear(this,b),this.node.parentNode.tagName.toLowerCase()=="a"?this.node.parentNode.parentNode.removeChild(this.node.parentNode):this.node.parentNode.removeChild(this.node);for(var c in this)this[c]=typeof this[c]=="function"?a._removedFactory(c):null;this.removed=!0}},A._getBBox=function(){if(this.node.style.display=="none"){this.show();var a=!0}var b={};try{b=this.node.getBBox()}catch(c){}finally{b=b||{}}a&&this.hide();return b},A.attr=function(c,d){if(this.removed)return this;if(c==null){var e={};for(var f in this.attrs)this.attrs[b](f)&&(e[f]=this.attrs[f]);e.gradient&&e.fill=="none"&&(e.fill=e.gradient)&&delete e.gradient,e.transform=this._.transform;return e}if(d==null&&a.is(c,"string")){if(c=="fill"&&this.attrs.fill=="none"&&this.attrs.gradient)return this.attrs.gradient;if(c=="transform")return this._.transform;var g=c.split(j),h={};for(var i=0,l=g.length;i<l;i++)c=g[i],c in this.attrs?h[c]=this.attrs[c]:a.is(this.paper.customAttributes[c],"function")?h[c]=this.paper.customAttributes[c].def:h[c]=a._availableAttrs[c];return l-1?h:h[g[0]]}if(d==null&&a.is(c,"array")){h={};for(i=0,l=c.length;i<l;i++)h[c[i]]=this.attr(c[i]);return h}if(d!=null){var m={};m[c]=d}else c!=null&&a.is(c,"object")&&(m=c);for(var n in m)k("raphael.attr."+n+"."+this.id,this,m[n]);for(n in this.paper.customAttributes)if(this.paper.customAttributes[b](n)&&m[b](n)&&a.is(this.paper.customAttributes[n],"function")){var o=this.paper.customAttributes[n].apply(this,[].concat(m[n]));this.attrs[n]=m[n];for(var p in o)o[b](p)&&(m[p]=o[p])}w(this,m);return this},A.toFront=function(){if(this.removed)return this;this.node.parentNode.tagName.toLowerCase()=="a"?this.node.parentNode.parentNode.appendChild(this.node.parentNode):this.node.parentNode.appendChild(this.node);var b=this.paper;b.top!=this&&a._tofront(this,b);return this},A.toBack=function(){if(this.removed)return this;var b=this.node.parentNode;b.tagName.toLowerCase()=="a"?b.parentNode.insertBefore(this.node.parentNode,this.node.parentNode.parentNode.firstChild):b.firstChild!=this.node&&b.insertBefore(this.node,this.node.parentNode.firstChild),a._toback(this,this.paper);var c=this.paper;return this},A.insertAfter=function(b){if(this.removed)return this;var c=b.node||b[b.length-1].node;c.nextSibling?c.parentNode.insertBefore(this.node,c.nextSibling):c.parentNode.appendChild(this.node),a._insertafter(this,b,this.paper);return this},A.insertBefore=function(b){if(this.removed)return this;var c=b.node||b[0].node;c.parentNode.insertBefore(this.node,c),a._insertbefore(this,b,this.paper);return this},A.blur=function(b){var c=this;if(+b!==0){var d=q("filter"),e=q("feGaussianBlur");c.attrs.blur=b,d.id=a.createUUID(),q(e,{stdDeviation:+b||1.5}),d.appendChild(e),c.paper.defs.appendChild(d),c._blur=d,q(c.node,{filter:"url(#"+d.id+")"})}else c._blur&&(c._blur.parentNode.removeChild(c._blur),delete c._blur,delete c.attrs.blur),c.node.removeAttribute("filter")},a._engine.circle=function(a,b,c,d){var e=q("circle");a.canvas&&a.canvas.appendChild(e);var f=new z(e,a);f.attrs={cx:b,cy:c,r:d,fill:"none",stroke:"#000"},f.type="circle",q(e,f.attrs);return f},a._engine.rect=function(a,b,c,d,e,f){var g=q("rect");a.canvas&&a.canvas.appendChild(g);var h=new z(g,a);h.attrs={x:b,y:c,width:d,height:e,r:f||0,rx:f||0,ry:f||0,fill:"none",stroke:"#000"},h.type="rect",q(g,h.attrs);return h},a._engine.ellipse=function(a,b,c,d,e){var f=q("ellipse");a.canvas&&a.canvas.appendChild(f);var g=new z(f,a);g.attrs={cx:b,cy:c,rx:d,ry:e,fill:"none",stroke:"#000"},g.type="ellipse",q(f,g.attrs);return g},a._engine.image=function(a,b,c,d,e,f){var g=q("image");q(g,{x:c,y:d,width:e,height:f,preserveAspectRatio:"none"}),g.setAttributeNS(n,"href",b),a.canvas&&a.canvas.appendChild(g);var h=new z(g,a);h.attrs={x:c,y:d,width:e,height:f,src:b},h.type="image";return h},a._engine.text=function(b,c,d,e){var f=q("text");b.canvas&&b.canvas.appendChild(f);var g=new z(f,b);g.attrs={x:c,y:d,"text-anchor":"middle",text:e,font:a._availableAttrs.font,stroke:"none",fill:"#000"},g.type="text",w(g,g.attrs);return g},a._engine.setSize=function(a,b){this.width=a||this.width,this.height=b||this.height,this.canvas.setAttribute("width",this.width),this.canvas.setAttribute("height",this.height),this._viewBox&&this.setViewBox.apply(this,this._viewBox);return this},a._engine.create=function(){var b=a._getContainer.apply(0,arguments),c=b&&b.container,d=b.x,e=b.y,f=b.width,g=b.height;if(!c)throw new Error("SVG container not found.");var h=q("svg"),i="overflow:hidden;",j;d=d||0,e=e||0,f=f||512,g=g||342,q(h,{height:g,version:1.1,width:f,xmlns:"http://www.w3.org/2000/svg"}),c==1?(h.style.cssText=i+"position:absolute;left:"+d+"px;top:"+e+"px",a._g.doc.body.appendChild(h),j=1):(h.style.cssText=i+"position:relative",c.firstChild?c.insertBefore(h,c.firstChild):c.appendChild(h)),c=new a._Paper,c.width=f,c.height=g,c.canvas=h,c.clear(),c._left=c._top=0,j&&(c.renderfix=function(){}),c.renderfix();return c},a._engine.setViewBox=function(a,b,c,d,e){k("raphael.setViewBox",this,this._viewBox,[a,b,c,d,e]);var f=g(c/this.width,d/this.height),h=this.top,i=e?"meet":"xMinYMin",j,l;a==null?(this._vbSize&&(f=1),delete this._vbSize,j="0 0 "+this.width+m+this.height):(this._vbSize=f,j=a+m+b+m+c+m+d),q(this.canvas,{viewBox:j,preserveAspectRatio:i});while(f&&h)l="stroke-width"in h.attrs?h.attrs["stroke-width"]:1,h.attr({"stroke-width":l}),h._.dirty=1,h._.dirtyT=1,h=h.prev;this._viewBox=[a,b,c,d,!!e];return this},a.prototype.renderfix=function(){var a=this.canvas,b=a.style,c;try{c=a.getScreenCTM()||a.createSVGMatrix()}catch(d){c=a.createSVGMatrix()}var e=-c.e%1,f=-c.f%1;if(e||f)e&&(this._left=(this._left+e)%1,b.left=this._left+"px"),f&&(this._top=(this._top+f)%1,b.top=this._top+"px")},a.prototype.clear=function(){a.eve("raphael.clear",this);var b=this.canvas;while(b.firstChild)b.removeChild(b.firstChild);this.bottom=this.top=null,(this.desc=q("desc")).appendChild(a._g.doc.createTextNode("Created with Raphaël "+a.version)),b.appendChild(this.desc),b.appendChild(this.defs=q("defs"))},a.prototype.remove=function(){k("raphael.remove",this),this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var b in this)this[b]=typeof this[b]=="function"?a._removedFactory(b):null};var B=a.st;for(var C in A)A[b](C)&&!B[b](C)&&(B[C]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(C))}(window.Raphael),window.Raphael.vml&&function(a){var b="hasOwnProperty",c=String,d=parseFloat,e=Math,f=e.round,g=e.max,h=e.min,i=e.abs,j="fill",k=/[, ]+/,l=a.eve,m=" progid:DXImageTransform.Microsoft",n=" ",o="",p={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},q=/([clmz]),?([^clmz]*)/gi,r=/ progid:\S+Blur\([^\)]+\)/g,s=/-?[^,\s-]+/g,t="position:absolute;left:0;top:0;width:1px;height:1px",u=21600,v={path:1,rect:1,image:1},w={circle:1,ellipse:1},x=function(b){var d=/[ahqstv]/ig,e=a._pathToAbsolute;c(b).match(d)&&(e=a._path2curve),d=/[clmz]/g;if(e==a._pathToAbsolute&&!c(b).match(d)){var g=c(b).replace(q,function(a,b,c){var d=[],e=b.toLowerCase()=="m",g=p[b];c.replace(s,function(a){e&&d.length==2&&(g+=d+p[b=="m"?"l":"L"],d=[]),d.push(f(a*u))});return g+d});return g}var h=e(b),i,j;g=[];for(var k=0,l=h.length;k<l;k++){i=h[k],j=h[k][0].toLowerCase(),j=="z"&&(j="x");for(var m=1,r=i.length;m<r;m++)j+=f(i[m]*u)+(m!=r-1?",":o);g.push(j)}return g.join(n)},y=function(b,c,d){var e=a.matrix();e.rotate(-b,.5,.5);return{dx:e.x(c,d),dy:e.y(c,d)}},z=function(a,b,c,d,e,f){var g=a._,h=a.matrix,k=g.fillpos,l=a.node,m=l.style,o=1,p="",q,r=u/b,s=u/c;m.visibility="hidden";if(!!b&&!!c){l.coordsize=i(r)+n+i(s),m.rotation=f*(b*c<0?-1:1);if(f){var t=y(f,d,e);d=t.dx,e=t.dy}b<0&&(p+="x"),c<0&&(p+=" y")&&(o=-1),m.flip=p,l.coordorigin=d*-r+n+e*-s;if(k||g.fillsize){var v=l.getElementsByTagName(j);v=v&&v[0],l.removeChild(v),k&&(t=y(f,h.x(k[0],k[1]),h.y(k[0],k[1])),v.position=t.dx*o+n+t.dy*o),g.fillsize&&(v.size=g.fillsize[0]*i(b)+n+g.fillsize[1]*i(c)),l.appendChild(v)}m.visibility="visible"}};a.toString=function(){return"Your browser doesn’t support SVG. Falling down to VML.\nYou are running Raphaël "+this.version};var A=function(a,b,d){var e=c(b).toLowerCase().split("-"),f=d?"end":"start",g=e.length,h="classic",i="medium",j="medium";while(g--)switch(e[g]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":h=e[g];break;case"wide":case"narrow":j=e[g];break;case"long":case"short":i=e[g]}var k=a.node.getElementsByTagName("stroke")[0];k[f+"arrow"]=h,k[f+"arrowlength"]=i,k[f+"arrowwidth"]=j},B=function(e,i){e.attrs=e.attrs||{};var l=e.node,m=e.attrs,p=l.style,q,r=v[e.type]&&(i.x!=m.x||i.y!=m.y||i.width!=m.width||i.height!=m.height||i.cx!=m.cx||i.cy!=m.cy||i.rx!=m.rx||i.ry!=m.ry||i.r!=m.r),s=w[e.type]&&(m.cx!=i.cx||m.cy!=i.cy||m.r!=i.r||m.rx!=i.rx||m.ry!=i.ry),t=e;for(var y in i)i[b](y)&&(m[y]=i[y]);r&&(m.path=a._getPath[e.type](e),e._.dirty=1),i.href&&(l.href=i.href),i.title&&(l.title=i.title),i.target&&(l.target=i.target),i.cursor&&(p.cursor=i.cursor),"blur"in i&&e.blur(i.blur);if(i.path&&e.type=="path"||r)l.path=x(~c(m.path).toLowerCase().indexOf("r")?a._pathToAbsolute(m.path):m.path),e.type=="image"&&(e._.fillpos=[m.x,m.y],e._.fillsize=[m.width,m.height],z(e,1,1,0,0,0));"transform"in i&&e.transform(i.transform);if(s){var B=+m.cx,D=+m.cy,E=+m.rx||+m.r||0,G=+m.ry||+m.r||0;l.path=a.format("ar{0},{1},{2},{3},{4},{1},{4},{1}x",f((B-E)*u),f((D-G)*u),f((B+E)*u),f((D+G)*u),f(B*u))}if("clip-rect"in i){var H=c(i["clip-rect"]).split(k);if(H.length==4){H[2]=+H[2]+ +H[0],H[3]=+H[3]+ +H[1];var I=l.clipRect||a._g.doc.createElement("div"),J=I.style;J.clip=a.format("rect({1}px {2}px {3}px {0}px)",H),l.clipRect||(J.position="absolute",J.top=0,J.left=0,J.width=e.paper.width+"px",J.height=e.paper.height+"px",l.parentNode.insertBefore(I,l),I.appendChild(l),l.clipRect=I)}i["clip-rect"]||l.clipRect&&(l.clipRect.style.clip="auto")}if(e.textpath){var K=e.textpath.style;i.font&&(K.font=i.font),i["font-family"]&&(K.fontFamily='"'+i["font-family"].split(",")[0].replace(/^['"]+|['"]+$/g,o)+'"'),i["font-size"]&&(K.fontSize=i["font-size"]),i["font-weight"]&&(K.fontWeight=i["font-weight"]),i["font-style"]&&(K.fontStyle=i["font-style"])}"arrow-start"in i&&A(t,i["arrow-start"]),"arrow-end"in i&&A(t,i["arrow-end"],1);if(i.opacity!=null||i["stroke-width"]!=null||i.fill!=null||i.src!=null||i.stroke!=null||i["stroke-width"]!=null||i["stroke-opacity"]!=null||i["fill-opacity"]!=null||i["stroke-dasharray"]!=null||i["stroke-miterlimit"]!=null||i["stroke-linejoin"]!=null||i["stroke-linecap"]!=null){var L=l.getElementsByTagName(j),M=!1;L=L&&L[0],!L&&(M=L=F(j)),e.type=="image"&&i.src&&(L.src=i.src),i.fill&&(L.on=!0);if(L.on==null||i.fill=="none"||i.fill===null)L.on=!1;if(L.on&&i.fill){var N=c(i.fill).match(a._ISURL);if(N){L.parentNode==l&&l.removeChild(L),L.rotate=!0,L.src=N[1],L.type="tile";var O=e.getBBox(1);L.position=O.x+n+O.y,e._.fillpos=[O.x,O.y],a._preload(N[1],function(){e._.fillsize=[this.offsetWidth,this.offsetHeight]})}else L.color=a.getRGB(i.fill).hex,L.src=o,L.type="solid",a.getRGB(i.fill).error&&(t.type in{circle:1,ellipse:1}||c(i.fill).charAt()!="r")&&C(t,i.fill,L)&&(m.fill="none",m.gradient=i.fill,L.rotate=!1)}if("fill-opacity"in i||"opacity"in i){var P=((+m["fill-opacity"]+1||2)-1)*((+m.opacity+1||2)-1)*((+a.getRGB(i.fill).o+1||2)-1);P=h(g(P,0),1),L.opacity=P,L.src&&(L.color="none")}l.appendChild(L);var Q=l.getElementsByTagName("stroke")&&l.getElementsByTagName("stroke")[0],T=!1;!Q&&(T=Q=F("stroke"));if(i.stroke&&i.stroke!="none"||i["stroke-width"]||i["stroke-opacity"]!=null||i["stroke-dasharray"]||i["stroke-miterlimit"]||i["stroke-linejoin"]||i["stroke-linecap"])Q.on=!0;(i.stroke=="none"||i.stroke===null||Q.on==null||i.stroke==0||i["stroke-width"]==0)&&(Q.on=!1);var U=a.getRGB(i.stroke);Q.on&&i.stroke&&(Q.color=U.hex),P=((+m["stroke-opacity"]+1||2)-1)*((+m.opacity+1||2)-1)*((+U.o+1||2)-1);var V=(d(i["stroke-width"])||1)*.75;P=h(g(P,0),1),i["stroke-width"]==null&&(V=m["stroke-width"]),i["stroke-width"]&&(Q.weight=V),V&&V<1&&(P*=V)&&(Q.weight=1),Q.opacity=P,i["stroke-linejoin"]&&(Q.joinstyle=i["stroke-linejoin"]||"miter"),Q.miterlimit=i["stroke-miterlimit"]||8,i["stroke-linecap"]&&(Q.endcap=i["stroke-linecap"]=="butt"?"flat":i["stroke-linecap"]=="square"?"square":"round");if(i["stroke-dasharray"]){var W={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};Q.dashstyle=W[b](i["stroke-dasharray"])?W[i["stroke-dasharray"]]:o}T&&l.appendChild(Q)}if(t.type=="text"){t.paper.canvas.style.display=o;var X=t.paper.span,Y=100,Z=m.font&&m.font.match(/\d+(?:\.\d*)?(?=px)/);p=X.style,m.font&&(p.font=m.font),m["font-family"]&&(p.fontFamily=m["font-family"]),m["font-weight"]&&(p.fontWeight=m["font-weight"]),m["font-style"]&&(p.fontStyle=m["font-style"]),Z=d(m["font-size"]||Z&&Z[0])||10,p.fontSize=Z*Y+"px",t.textpath.string&&(X.innerHTML=c(t.textpath.string).replace(/</g,"&#60;").replace(/&/g,"&#38;").replace(/\n/g,"<br>"));var $=X.getBoundingClientRect();t.W=m.w=($.right-$.left)/Y,t.H=m.h=($.bottom-$.top)/Y,t.X=m.x,t.Y=m.y+t.H/2,("x"in i||"y"in i)&&(t.path.v=a.format("m{0},{1}l{2},{1}",f(m.x*u),f(m.y*u),f(m.x*u)+1));var _=["x","y","text","font","font-family","font-weight","font-style","font-size"];for(var ba=0,bb=_.length;ba<bb;ba++)if(_[ba]in i){t._.dirty=1;break}switch(m["text-anchor"]){case"start":t.textpath.style["v-text-align"]="left",t.bbx=t.W/2;break;case"end":t.textpath.style["v-text-align"]="right",t.bbx=-t.W/2;break;default:t.textpath.style["v-text-align"]="center",t.bbx=0}t.textpath.style["v-text-kern"]=!0}},C=function(b,f,g){b.attrs=b.attrs||{};var h=b.attrs,i=Math.pow,j,k,l="linear",m=".5 .5";b.attrs.gradient=f,f=c(f).replace(a._radial_gradient,function(a,b,c){l="radial",b&&c&&(b=d(b),c=d(c),i(b-.5,2)+i(c-.5,2)>.25&&(c=e.sqrt(.25-i(b-.5,2))*((c>.5)*2-1)+.5),m=b+n+c);return o}),f=f.split(/\s*\-\s*/);if(l=="linear"){var p=f.shift();p=-d(p);if(isNaN(p))return null}var q=a._parseDots(f);if(!q)return null;b=b.shape||b.node;if(q.length){b.removeChild(g),g.on=!0,g.method="none",g.color=q[0].color,g.color2=q[q.length-1].color;var r=[];for(var s=0,t=q.length;s<t;s++)q[s].offset&&r.push(q[s].offset+n+q[s].color);g.colors=r.length?r.join():"0% "+g.color,l=="radial"?(g.type="gradientTitle",g.focus="100%",g.focussize="0 0",g.focusposition=m,g.angle=0):(g.type="gradient",g.angle=(270-p)%360),b.appendChild(g)}return 1},D=function(b,c){this[0]=this.node=b,b.raphael=!0,this.id=a._oid++,b.raphaelid=this.id,this.X=0,this.Y=0,this.attrs={},this.paper=c,this.matrix=a.matrix(),this._={transform:[],sx:1,sy:1,dx:0,dy:0,deg:0,dirty:1,dirtyT:1},!c.bottom&&(c.bottom=this),this.prev=c.top,c.top&&(c.top.next=this),c.top=this,this.next=null},E=a.el;D.prototype=E,E.constructor=D,E.transform=function(b){if(b==null)return this._.transform;var d=this.paper._viewBoxShift,e=d?"s"+[d.scale,d.scale]+"-1-1t"+[d.dx,d.dy]:o,f;d&&(f=b=c(b).replace(/\.{3}|\u2026/g,this._.transform||o)),a._extractTransform(this,e+b);var g=this.matrix.clone(),h=this.skew,i=this.node,j,k=~c(this.attrs.fill).indexOf("-"),l=!c(this.attrs.fill).indexOf("url(");g.translate(-0.5,-0.5);if(l||k||this.type=="image"){h.matrix="1 0 0 1",h.offset="0 0",j=g.split();if(k&&j.noRotation||!j.isSimple){i.style.filter=g.toFilter();var m=this.getBBox(),p=this.getBBox(1),q=m.x-p.x,r=m.y-p.y;i.coordorigin=q*-u+n+r*-u,z(this,1,1,q,r,0)}else i.style.filter=o,z(this,j.scalex,j.scaley,j.dx,j.dy,j.rotate)}else i.style.filter=o,h.matrix=c(g),h.offset=g.offset();f&&(this._.transform=f);return this},E.rotate=function(a,b,e){if(this.removed)return this;if(a!=null){a=c(a).split(k),a.length-1&&(b=d(a[1]),e=d(a[2])),a=d(a[0]),e==null&&(b=e);if(b==null||e==null){var f=this.getBBox(1);b=f.x+f.width/2,e=f.y+f.height/2}this._.dirtyT=1,this.transform(this._.transform.concat([["r",a,b,e]]));return this}},E.translate=function(a,b){if(this.removed)return this;a=c(a).split(k),a.length-1&&(b=d(a[1])),a=d(a[0])||0,b=+b||0,this._.bbox&&(this._.bbox.x+=a,this._.bbox.y+=b),this.transform(this._.transform.concat([["t",a,b]]));return this},E.scale=function(a,b,e,f){if(this.removed)return this;a=c(a).split(k),a.length-1&&(b=d(a[1]),e=d(a[2]),f=d(a[3]),isNaN(e)&&(e=null),isNaN(f)&&(f=null)),a=d(a[0]),b==null&&(b=a),f==null&&(e=f);if(e==null||f==null)var g=this.getBBox(1);e=e==null?g.x+g.width/2:e,f=f==null?g.y+g.height/2:f,this.transform(this._.transform.concat([["s",a,b,e,f]])),this._.dirtyT=1;return this},E.hide=function(){!this.removed&&(this.node.style.display="none");return this},E.show=function(){!this.removed&&(this.node.style.display=o);return this},E._getBBox=function(){if(this.removed)return{};return{x:this.X+(this.bbx||0)-this.W/2,y:this.Y-this.H,width:this.W,height:this.H}},E.remove=function(){if(!this.removed&&!!this.node.parentNode){this.paper.__set__&&this.paper.__set__.exclude(this),a.eve.unbind("raphael.*.*."+this.id),a._tear(this,this.paper),this.node.parentNode.removeChild(this.node),this.shape&&this.shape.parentNode.removeChild(this.shape);for(var b in this)this[b]=typeof this[b]=="function"?a._removedFactory(b):null;this.removed=!0}},E.attr=function(c,d){if(this.removed)return this;if(c==null){var e={};for(var f in this.attrs)this.attrs[b](f)&&(e[f]=this.attrs[f]);e.gradient&&e.fill=="none"&&(e.fill=e.gradient)&&delete e.gradient,e.transform=this._.transform;return e}if(d==null&&a.is(c,"string")){if(c==j&&this.attrs.fill=="none"&&this.attrs.gradient)return this.attrs.gradient;var g=c.split(k),h={};for(var i=0,m=g.length;i<m;i++)c=g[i],c in this.attrs?h[c]=this.attrs[c]:a.is(this.paper.customAttributes[c],"function")?h[c]=this.paper.customAttributes[c].def:h[c]=a._availableAttrs[c];return m-1?h:h[g[0]]}if(this.attrs&&d==null&&a.is(c,"array")){h={};for(i=0,m=c.length;i<m;i++)h[c[i]]=this.attr(c[i]);return h}var n;d!=null&&(n={},n[c]=d),d==null&&a.is(c,"object")&&(n=c);for(var o in n)l("raphael.attr."+o+"."+this.id,this,n[o]);if(n){for(o in this.paper.customAttributes)if(this.paper.customAttributes[b](o)&&n[b](o)&&a.is(this.paper.customAttributes[o],"function")){var p=this.paper.customAttributes[o].apply(this,[].concat(n[o]));this.attrs[o]=n[o];for(var q in p)p[b](q)&&(n[q]=p[q])}n.text&&this.type=="text"&&(this.textpath.string=n.text),B(this,n)}return this},E.toFront=function(){!this.removed&&this.node.parentNode.appendChild(this.node),this.paper&&this.paper.top!=this&&a._tofront(this,this.paper);return this},E.toBack=function(){if(this.removed)return this;this.node.parentNode.firstChild!=this.node&&(this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild),a._toback(this,this.paper));return this},E.insertAfter=function(b){if(this.removed)return this;b.constructor==a.st.constructor&&(b=b[b.length-1]),b.node.nextSibling?b.node.parentNode.insertBefore(this.node,b.node.nextSibling):b.node.parentNode.appendChild(this.node),a._insertafter(this,b,this.paper);return this},E.insertBefore=function(b){if(this.removed)return this;b.constructor==a.st.constructor&&(b=b[0]),b.node.parentNode.insertBefore(this.node,b.node),a._insertbefore(this,b,this.paper);return this},E.blur=function(b){var c=this.node.runtimeStyle,d=c.filter;d=d.replace(r,o),+b!==0?(this.attrs.blur=b,c.filter=d+n+m+".Blur(pixelradius="+(+b||1.5)+")",c.margin=a.format("-{0}px 0 0 -{0}px",f(+b||1.5))):(c.filter=d,c.margin=0,delete this.attrs.blur)},a._engine.path=function(a,b){var c=F("shape");c.style.cssText=t,c.coordsize=u+n+u,c.coordorigin=b.coordorigin;var d=new D(c,b),e={fill:"none",stroke:"#000"};a&&(e.path=a),d.type="path",d.path=[],d.Path=o,B(d,e),b.canvas.appendChild(c);var f=F("skew");f.on=!0,c.appendChild(f),d.skew=f,d.transform(o);return d},a._engine.rect=function(b,c,d,e,f,g){var h=a._rectPath(c,d,e,f,g),i=b.path(h),j=i.attrs;i.X=j.x=c,i.Y=j.y=d,i.W=j.width=e,i.H=j.height=f,j.r=g,j.path=h,i.type="rect";return i},a._engine.ellipse=function(a,b,c,d,e){var f=a.path(),g=f.attrs;f.X=b-d,f.Y=c-e,f.W=d*2,f.H=e*2,f.type="ellipse",B(f,{cx:b,cy:c,rx:d,ry:e});return f},a._engine.circle=function(a,b,c,d){var e=a.path(),f=e.attrs;e.X=b-d,e.Y=c-d,e.W=e.H=d*2,e.type="circle",B(e,{cx:b,cy:c,r:d});return e},a._engine.image=function(b,c,d,e,f,g){var h=a._rectPath(d,e,f,g),i=b.path(h).attr({stroke:"none"}),k=i.attrs,l=i.node,m=l.getElementsByTagName(j)[0];k.src=c,i.X=k.x=d,i.Y=k.y=e,i.W=k.width=f,i.H=k.height=g,k.path=h,i.type="image",m.parentNode==l&&l.removeChild(m),m.rotate=!0,m.src=c,m.type="tile",i._.fillpos=[d,e],i._.fillsize=[f,g],l.appendChild(m),z(i,1,1,0,0,0);return i},a._engine.text=function(b,d,e,g){var h=F("shape"),i=F("path"),j=F("textpath");d=d||0,e=e||0,g=g||"",i.v=a.format("m{0},{1}l{2},{1}",f(d*u),f(e*u),f(d*u)+1),i.textpathok=!0,j.string=c(g),j.on=!0,h.style.cssText=t,h.coordsize=u+n+u,h.coordorigin="0 0";var k=new D(h,b),l={fill:"#000",stroke:"none",font:a._availableAttrs.font,text:g};k.shape=h,k.path=i,k.textpath=j,k.type="text",k.attrs.text=c(g),k.attrs.x=d,k.attrs.y=e,k.attrs.w=1,k.attrs.h=1,B(k,l),h.appendChild(j),h.appendChild(i),b.canvas.appendChild(h);var m=F("skew");m.on=!0,h.appendChild(m),k.skew=m,k.transform(o);return k},a._engine.setSize=function(b,c){var d=this.canvas.style;this.width=b,this.height=c,b==+b&&(b+="px"),c==+c&&(c+="px"),d.width=b,d.height=c,d.clip="rect(0 "+b+" "+c+" 0)",this._viewBox&&a._engine.setViewBox.apply(this,this._viewBox);return this},a._engine.setViewBox=function(b,c,d,e,f){a.eve("raphael.setViewBox",this,this._viewBox,[b,c,d,e,f]);var h=this.width,i=this.height,j=1/g(d/h,e/i),k,l;f&&(k=i/e,l=h/d,d*k<h&&(b-=(h-d*k)/2/k),e*l<i&&(c-=(i-e*l)/2/l)),this._viewBox=[b,c,d,e,!!f],this._viewBoxShift={dx:-b,dy:-c,scale:j},this.forEach(function(a){a.transform("...")});return this};var F;a._engine.initWin=function(a){var b=a.document;b.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)");try{!b.namespaces.rvml&&b.namespaces.add("rvml","urn:schemas-microsoft-com:vml"),F=function(a){return b.createElement("<rvml:"+a+' class="rvml">')}}catch(c){F=function(a){return b.createElement("<"+a+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}},a._engine.initWin(a._g.win),a._engine.create=function(){var b=a._getContainer.apply(0,arguments),c=b.container,d=b.height,e,f=b.width,g=b.x,h=b.y;if(!c)throw new Error("VML container not found.");var i=new a._Paper,j=i.canvas=a._g.doc.createElement("div"),k=j.style;g=g||0,h=h||0,f=f||512,d=d||342,i.width=f,i.height=d,f==+f&&(f+="px"),d==+d&&(d+="px"),i.coordsize=u*1e3+n+u*1e3,i.coordorigin="0 0",i.span=a._g.doc.createElement("span"),i.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;",j.appendChild(i.span),k.cssText=a.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",f,d),c==1?(a._g.doc.body.appendChild(j),k.left=g+"px",k.top=h+"px",k.position="absolute"):c.firstChild?c.insertBefore(j,c.firstChild):c.appendChild(j),i.renderfix=function(){};return i},a.prototype.clear=function(){a.eve("raphael.clear",this),this.canvas.innerHTML=o,this.span=a._g.doc.createElement("span"),this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;",this.canvas.appendChild(this.span),this.bottom=this.top=null},a.prototype.remove=function(){a.eve("raphael.remove",this),this.canvas.parentNode.removeChild(this.canvas);for(var b in this)this[b]=typeof this[b]=="function"?a._removedFactory(b):null;return!0};var G=a.st;for(var H in E)E[b](H)&&!G[b](H)&&(G[H]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(H))}(window.Raphael)
3281\ No newline at end of file
3282
3283=== removed directory 'src/maasserver/static/jslibs/yui'
3284=== removed directory 'src/maasserver/static/jslibs/yui/align-plugin'
3285=== removed file 'src/maasserver/static/jslibs/yui/align-plugin/align-plugin-debug.js'
3286--- src/maasserver/static/jslibs/yui/align-plugin/align-plugin-debug.js 2012-06-11 14:32:48 +0000
3287+++ src/maasserver/static/jslibs/yui/align-plugin/align-plugin-debug.js 1970-01-01 00:00:00 +0000
3288@@ -1,199 +0,0 @@
3289-/*
3290-YUI 3.5.1 (build 22)
3291-Copyright 2012 Yahoo! Inc. All rights reserved.
3292-Licensed under the BSD License.
3293-http://yuilibrary.com/license/
3294-*/
3295-YUI.add('align-plugin', function(Y) {
3296-
3297- /**
3298- * Provides advanced positioning support for Node via a Plugin
3299- * for centering and alignment.
3300- * @module align-plugin
3301- */
3302-
3303- var OFFSET_WIDTH = 'offsetWidth',
3304- OFFSET_HEIGHT = 'offsetHeight',
3305- undefined = undefined;
3306-
3307- /**
3308- * Node plugin which can be used to align a node with another node,
3309- * region, or the viewport.
3310- *
3311- * @class Plugin.Align
3312- * @param {Object} User configuration object
3313- */
3314- function Align(config) {
3315- if (config.host) {
3316- this._host = config.host;
3317- }
3318- }
3319-
3320- Align.prototype = {
3321- /**
3322- * Aligns node with a point on another node or region.
3323- * Possible alignment points are:
3324- * <dl>
3325- * <dt>tl</dt>
3326- * <dd>top left</dd>
3327- * <dt>tr</dt>
3328- * <dd>top right</dd>
3329- * <dt>bl</dt>
3330- * <dd>bottom left</dd>
3331- * <dt>br</dt>
3332- * <dd>bottom right</dd>
3333- * <dt>tc</dt>
3334- * <dd>top center</dd>
3335- * <dt>bc</dt>
3336- * <dd>bottom center</dd>
3337- * <dt>rc</dt>
3338- * <dd>right center</dd>
3339- * <dt>lc</dt>
3340- * <dd>left center</dd>
3341- * <dt>cc</dt>
3342- * <dd>center center</dd>
3343- * </dl>
3344- * @method to
3345- * @param region {String || Node || HTMLElement || Object} The node or
3346- * region to align with. Defaults to the viewport region.
3347- * @param regionPoint {String} The point of the region to align with.
3348- * @param point {String} The point of the node aligned to the region.
3349- * @param resize {Boolean} Whether or not the node should re-align when
3350- * the window is resized. Defaults to false.
3351- */
3352- to: function(region, regionPoint, point, syncOnResize) {
3353- // cache original args for syncing
3354- this._syncArgs = Y.Array(arguments);
3355-
3356- if (region.top === undefined) {
3357- region = Y.one(region).get('region');
3358- }
3359-
3360- if (region) {
3361- var xy = [region.left, region.top],
3362- offxy = [region.width, region.height],
3363- points = Align.points,
3364- node = this._host,
3365- NULL = null,
3366- size = node.getAttrs([OFFSET_HEIGHT, OFFSET_WIDTH]),
3367- nodeoff = [0 - size[OFFSET_WIDTH], 0 - size[OFFSET_HEIGHT]], // reverse offsets
3368- regionFn0 = regionPoint ? points[regionPoint.charAt(0)]: NULL,
3369- regionFn1 = (regionPoint && regionPoint !== 'cc') ? points[regionPoint.charAt(1)] : NULL,
3370- nodeFn0 = point ? points[point.charAt(0)] : NULL,
3371- nodeFn1 = (point && point !== 'cc') ? points[point.charAt(1)] : NULL;
3372-
3373- if (regionFn0) {
3374- xy = regionFn0(xy, offxy, regionPoint);
3375- }
3376- if (regionFn1) {
3377- xy = regionFn1(xy, offxy, regionPoint);
3378- }
3379-
3380- if (nodeFn0) {
3381- xy = nodeFn0(xy, nodeoff, point);
3382- }
3383- if (nodeFn1) {
3384- xy = nodeFn1(xy, nodeoff, point);
3385- }
3386-
3387- if (xy && node) {
3388- node.setXY(xy);
3389- }
3390-
3391- this._resize(syncOnResize);
3392-
3393- }
3394- return this;
3395- },
3396-
3397- sync: function() {
3398- this.to.apply(this, this._syncArgs);
3399- return this;
3400- },
3401-
3402- _resize: function(add) {
3403- var handle = this._handle;
3404- if (add && !handle) {
3405- this._handle = Y.on('resize', this._onresize, window, this);
3406- } else if (!add && handle) {
3407- handle.detach();
3408- }
3409-
3410- },
3411-
3412- _onresize: function() {
3413- var self = this;
3414- setTimeout(function() { // for performance
3415- self.sync();
3416- });
3417- },
3418-
3419- /**
3420- * Aligns the center of a node to the center of another node or region.
3421- * @method center
3422- * @param region {Node || HTMLElement || Object} optional The node or
3423- * region to align with. Defaults to the viewport region.
3424- * the window is resized. If centering to viewport, this defaults
3425- * to true, otherwise default is false.
3426- */
3427- center: function(region, resize) {
3428- this.to(region, 'cc', 'cc', resize);
3429- return this;
3430- },
3431-
3432- /**
3433- * Removes the resize handler, if any. This is called automatically
3434- * when unplugged from the host node.
3435- * @method destroy
3436- */
3437- destroy: function() {
3438- var handle = this._handle;
3439- if (handle) {
3440- handle.detach();
3441- }
3442- }
3443- };
3444-
3445- Align.points = {
3446- 't': function(xy, off) {
3447- return xy;
3448- },
3449-
3450- 'r': function(xy, off) {
3451- return [xy[0] + off[0], xy[1]];
3452- },
3453-
3454- 'b': function(xy, off) {
3455- return [xy[0], xy[1] + off[1]];
3456- },
3457-
3458- 'l': function(xy, off) {
3459- return xy;
3460- },
3461-
3462- 'c': function(xy, off, point) {
3463- var axis = (point[0] === 't' || point[0] === 'b') ? 0 : 1,
3464- ret, val;
3465-
3466- if (point === 'cc') {
3467- ret = [xy[0] + off[0] / 2, xy[1] + off[1] / 2];
3468- } else {
3469- val = xy[axis] + off[axis] / 2;
3470- ret = (axis) ? [xy[0], val] : [val, xy[1]];
3471- }
3472-
3473- return ret;
3474- }
3475- };
3476-
3477- Align.NAME = 'Align';
3478- Align.NS = 'align';
3479-
3480- Align.prototype.constructor = Align;
3481-
3482- Y.namespace('Plugin');
3483- Y.Plugin.Align = Align;
3484-
3485-
3486-
3487-}, '3.5.1' ,{requires:['node-pluginhost', 'node-screen']});
3488
3489=== removed file 'src/maasserver/static/jslibs/yui/align-plugin/align-plugin-min.js'
3490--- src/maasserver/static/jslibs/yui/align-plugin/align-plugin-min.js 2012-06-11 14:32:48 +0000
3491+++ src/maasserver/static/jslibs/yui/align-plugin/align-plugin-min.js 1970-01-01 00:00:00 +0000
3492@@ -1,7 +0,0 @@
3493-/*
3494-YUI 3.5.1 (build 22)
3495-Copyright 2012 Yahoo! Inc. All rights reserved.
3496-Licensed under the BSD License.
3497-http://yuilibrary.com/license/
3498-*/
3499-YUI.add("align-plugin",function(c){var e="offsetWidth",d="offsetHeight",b=b;function a(f){if(f.host){this._host=f.host;}}a.prototype={to:function(j,t,l,o){this._syncArgs=c.Array(arguments);if(j.top===b){j=c.one(j).get("region");}if(j){var s=[j.left,j.top],q=[j.width,j.height],n=a.points,f=this._host,h=null,r=f.getAttrs([d,e]),k=[0-r[e],0-r[d]],p=t?n[t.charAt(0)]:h,m=(t&&t!=="cc")?n[t.charAt(1)]:h,i=l?n[l.charAt(0)]:h,g=(l&&l!=="cc")?n[l.charAt(1)]:h;if(p){s=p(s,q,t);}if(m){s=m(s,q,t);}if(i){s=i(s,k,l);}if(g){s=g(s,k,l);}if(s&&f){f.setXY(s);}this._resize(o);}return this;},sync:function(){this.to.apply(this,this._syncArgs);return this;},_resize:function(g){var f=this._handle;if(g&&!f){this._handle=c.on("resize",this._onresize,window,this);}else{if(!g&&f){f.detach();}}},_onresize:function(){var f=this;setTimeout(function(){f.sync();});},center:function(g,f){this.to(g,"cc","cc",f);return this;},destroy:function(){var f=this._handle;if(f){f.detach();}}};a.points={"t":function(f,g){return f;},"r":function(f,g){return[f[0]+g[0],f[1]];},"b":function(f,g){return[f[0],f[1]+g[1]];},"l":function(f,g){return f;},"c":function(i,k,f){var h=(f[0]==="t"||f[0]==="b")?0:1,g,j;if(f==="cc"){g=[i[0]+k[0]/2,i[1]+k[1]/2];}else{j=i[h]+k[h]/2;g=(h)?[i[0],j]:[j,i[1]];}return g;}};a.NAME="Align";a.NS="align";a.prototype.constructor=a;c.namespace("Plugin");c.Plugin.Align=a;},"3.5.1",{requires:["node-pluginhost","node-screen"]});
3500\ No newline at end of file
3501
3502=== removed file 'src/maasserver/static/jslibs/yui/align-plugin/align-plugin.js'
3503--- src/maasserver/static/jslibs/yui/align-plugin/align-plugin.js 2012-06-11 14:32:48 +0000
3504+++ src/maasserver/static/jslibs/yui/align-plugin/align-plugin.js 1970-01-01 00:00:00 +0000
3505@@ -1,199 +0,0 @@
3506-/*
3507-YUI 3.5.1 (build 22)
3508-Copyright 2012 Yahoo! Inc. All rights reserved.
3509-Licensed under the BSD License.
3510-http://yuilibrary.com/license/
3511-*/
3512-YUI.add('align-plugin', function(Y) {
3513-
3514- /**
3515- * Provides advanced positioning support for Node via a Plugin
3516- * for centering and alignment.
3517- * @module align-plugin
3518- */
3519-
3520- var OFFSET_WIDTH = 'offsetWidth',
3521- OFFSET_HEIGHT = 'offsetHeight',
3522- undefined = undefined;
3523-
3524- /**
3525- * Node plugin which can be used to align a node with another node,
3526- * region, or the viewport.
3527- *
3528- * @class Plugin.Align
3529- * @param {Object} User configuration object
3530- */
3531- function Align(config) {
3532- if (config.host) {
3533- this._host = config.host;
3534- }
3535- }
3536-
3537- Align.prototype = {
3538- /**
3539- * Aligns node with a point on another node or region.
3540- * Possible alignment points are:
3541- * <dl>
3542- * <dt>tl</dt>
3543- * <dd>top left</dd>
3544- * <dt>tr</dt>
3545- * <dd>top right</dd>
3546- * <dt>bl</dt>
3547- * <dd>bottom left</dd>
3548- * <dt>br</dt>
3549- * <dd>bottom right</dd>
3550- * <dt>tc</dt>
3551- * <dd>top center</dd>
3552- * <dt>bc</dt>
3553- * <dd>bottom center</dd>
3554- * <dt>rc</dt>
3555- * <dd>right center</dd>
3556- * <dt>lc</dt>
3557- * <dd>left center</dd>
3558- * <dt>cc</dt>
3559- * <dd>center center</dd>
3560- * </dl>
3561- * @method to
3562- * @param region {String || Node || HTMLElement || Object} The node or
3563- * region to align with. Defaults to the viewport region.
3564- * @param regionPoint {String} The point of the region to align with.
3565- * @param point {String} The point of the node aligned to the region.
3566- * @param resize {Boolean} Whether or not the node should re-align when
3567- * the window is resized. Defaults to false.
3568- */
3569- to: function(region, regionPoint, point, syncOnResize) {
3570- // cache original args for syncing
3571- this._syncArgs = Y.Array(arguments);
3572-
3573- if (region.top === undefined) {
3574- region = Y.one(region).get('region');
3575- }
3576-
3577- if (region) {
3578- var xy = [region.left, region.top],
3579- offxy = [region.width, region.height],
3580- points = Align.points,
3581- node = this._host,
3582- NULL = null,
3583- size = node.getAttrs([OFFSET_HEIGHT, OFFSET_WIDTH]),
3584- nodeoff = [0 - size[OFFSET_WIDTH], 0 - size[OFFSET_HEIGHT]], // reverse offsets
3585- regionFn0 = regionPoint ? points[regionPoint.charAt(0)]: NULL,
3586- regionFn1 = (regionPoint && regionPoint !== 'cc') ? points[regionPoint.charAt(1)] : NULL,
3587- nodeFn0 = point ? points[point.charAt(0)] : NULL,
3588- nodeFn1 = (point && point !== 'cc') ? points[point.charAt(1)] : NULL;
3589-
3590- if (regionFn0) {
3591- xy = regionFn0(xy, offxy, regionPoint);
3592- }
3593- if (regionFn1) {
3594- xy = regionFn1(xy, offxy, regionPoint);
3595- }
3596-
3597- if (nodeFn0) {
3598- xy = nodeFn0(xy, nodeoff, point);
3599- }
3600- if (nodeFn1) {
3601- xy = nodeFn1(xy, nodeoff, point);
3602- }
3603-
3604- if (xy && node) {
3605- node.setXY(xy);
3606- }
3607-
3608- this._resize(syncOnResize);
3609-
3610- }
3611- return this;
3612- },
3613-
3614- sync: function() {
3615- this.to.apply(this, this._syncArgs);
3616- return this;
3617- },
3618-
3619- _resize: function(add) {
3620- var handle = this._handle;
3621- if (add && !handle) {
3622- this._handle = Y.on('resize', this._onresize, window, this);
3623- } else if (!add && handle) {
3624- handle.detach();
3625- }
3626-
3627- },
3628-
3629- _onresize: function() {
3630- var self = this;
3631- setTimeout(function() { // for performance
3632- self.sync();
3633- });
3634- },
3635-
3636- /**
3637- * Aligns the center of a node to the center of another node or region.
3638- * @method center
3639- * @param region {Node || HTMLElement || Object} optional The node or
3640- * region to align with. Defaults to the viewport region.
3641- * the window is resized. If centering to viewport, this defaults
3642- * to true, otherwise default is false.
3643- */
3644- center: function(region, resize) {
3645- this.to(region, 'cc', 'cc', resize);
3646- return this;
3647- },
3648-
3649- /**
3650- * Removes the resize handler, if any. This is called automatically
3651- * when unplugged from the host node.
3652- * @method destroy
3653- */
3654- destroy: function() {
3655- var handle = this._handle;
3656- if (handle) {
3657- handle.detach();
3658- }
3659- }
3660- };
3661-
3662- Align.points = {
3663- 't': function(xy, off) {
3664- return xy;
3665- },
3666-
3667- 'r': function(xy, off) {
3668- return [xy[0] + off[0], xy[1]];
3669- },
3670-
3671- 'b': function(xy, off) {
3672- return [xy[0], xy[1] + off[1]];
3673- },
3674-
3675- 'l': function(xy, off) {
3676- return xy;
3677- },
3678-
3679- 'c': function(xy, off, point) {
3680- var axis = (point[0] === 't' || point[0] === 'b') ? 0 : 1,
3681- ret, val;
3682-
3683- if (point === 'cc') {
3684- ret = [xy[0] + off[0] / 2, xy[1] + off[1] / 2];
3685- } else {
3686- val = xy[axis] + off[axis] / 2;
3687- ret = (axis) ? [xy[0], val] : [val, xy[1]];
3688- }
3689-
3690- return ret;
3691- }
3692- };
3693-
3694- Align.NAME = 'Align';
3695- Align.NS = 'align';
3696-
3697- Align.prototype.constructor = Align;
3698-
3699- Y.namespace('Plugin');
3700- Y.Plugin.Align = Align;
3701-
3702-
3703-
3704-}, '3.5.1' ,{requires:['node-pluginhost', 'node-screen']});
3705
3706=== removed directory 'src/maasserver/static/jslibs/yui/anim-base'
3707=== removed file 'src/maasserver/static/jslibs/yui/anim-base/anim-base-debug.js'
3708--- src/maasserver/static/jslibs/yui/anim-base/anim-base-debug.js 2012-06-11 14:32:48 +0000
3709+++ src/maasserver/static/jslibs/yui/anim-base/anim-base-debug.js 1970-01-01 00:00:00 +0000
3710@@ -1,682 +0,0 @@
3711-/*
3712-YUI 3.5.1 (build 22)
3713-Copyright 2012 Yahoo! Inc. All rights reserved.
3714-Licensed under the BSD License.
3715-http://yuilibrary.com/license/
3716-*/
3717-YUI.add('anim-base', function(Y) {
3718-
3719-/**
3720-* The Animation Utility provides an API for creating advanced transitions.
3721-* @module anim
3722-*/
3723-
3724-/**
3725-* Provides the base Anim class, for animating numeric properties.
3726-*
3727-* @module anim
3728-* @submodule anim-base
3729-*/
3730-
3731- /**
3732- * A class for constructing animation instances.
3733- * @class Anim
3734- * @for Anim
3735- * @constructor
3736- * @extends Base
3737- */
3738-
3739- var RUNNING = 'running',
3740- START_TIME = 'startTime',
3741- ELAPSED_TIME = 'elapsedTime',
3742- /**
3743- * @for Anim
3744- * @event start
3745- * @description fires when an animation begins.
3746- * @param {Event} ev The start event.
3747- * @type Event.Custom
3748- */
3749- START = 'start',
3750-
3751- /**
3752- * @event tween
3753- * @description fires every frame of the animation.
3754- * @param {Event} ev The tween event.
3755- * @type Event.Custom
3756- */
3757- TWEEN = 'tween',
3758-
3759- /**
3760- * @event end
3761- * @description fires after the animation completes.
3762- * @param {Event} ev The end event.
3763- * @type Event.Custom
3764- */
3765- END = 'end',
3766- NODE = 'node',
3767- PAUSED = 'paused',
3768- REVERSE = 'reverse', // TODO: cleanup
3769- ITERATION_COUNT = 'iterationCount',
3770-
3771- NUM = Number;
3772-
3773- var _running = {},
3774- _timer;
3775-
3776- Y.Anim = function() {
3777- Y.Anim.superclass.constructor.apply(this, arguments);
3778- Y.Anim._instances[Y.stamp(this)] = this;
3779- };
3780-
3781- Y.Anim.NAME = 'anim';
3782-
3783- Y.Anim._instances = {};
3784-
3785- /**
3786- * Regex of properties that should use the default unit.
3787- *
3788- * @property RE_DEFAULT_UNIT
3789- * @static
3790- */
3791- Y.Anim.RE_DEFAULT_UNIT = /^width|height|top|right|bottom|left|margin.*|padding.*|border.*$/i;
3792-
3793- /**
3794- * The default unit to use with properties that pass the RE_DEFAULT_UNIT test.
3795- *
3796- * @property DEFAULT_UNIT
3797- * @static
3798- */
3799- Y.Anim.DEFAULT_UNIT = 'px';
3800-
3801- Y.Anim.DEFAULT_EASING = function (t, b, c, d) {
3802- return c * t / d + b; // linear easing
3803- };
3804-
3805- /**
3806- * Time in milliseconds passed to setInterval for frame processing
3807- *
3808- * @property intervalTime
3809- * @default 20
3810- * @static
3811- */
3812- Y.Anim._intervalTime = 20;
3813-
3814- /**
3815- * Bucket for custom getters and setters
3816- *
3817- * @property behaviors
3818- * @static
3819- */
3820- Y.Anim.behaviors = {
3821- left: {
3822- get: function(anim, attr) {
3823- return anim._getOffset(attr);
3824- }
3825- }
3826- };
3827-
3828- Y.Anim.behaviors.top = Y.Anim.behaviors.left;
3829-
3830- /**
3831- * The default setter to use when setting object properties.
3832- *
3833- * @property DEFAULT_SETTER
3834- * @static
3835- */
3836- Y.Anim.DEFAULT_SETTER = function(anim, att, from, to, elapsed, duration, fn, unit) {
3837- var node = anim._node,
3838- domNode = node._node,
3839- val = fn(elapsed, NUM(from), NUM(to) - NUM(from), duration);
3840- //make sure node instance
3841- if (domNode && (domNode.style || domNode.attributes)) {
3842- if (att in domNode.style || att in Y.DOM.CUSTOM_STYLES) {
3843- unit = unit || '';
3844- node.setStyle(att, val + unit);
3845- } else if (domNode.attributes[att]) {
3846- node.setAttribute(att, val);
3847- }
3848- } else if (node.set) {
3849- node.set(att, val);
3850- }
3851- };
3852-
3853- /**
3854- * The default getter to use when getting object properties.
3855- *
3856- * @property DEFAULT_GETTER
3857- * @static
3858- */
3859- Y.Anim.DEFAULT_GETTER = function(anim, att) {
3860- var node = anim._node,
3861- domNode = node._node,
3862- val = '';
3863- //make sure node instance
3864- if (domNode && (domNode.style || domNode.attributes)) {
3865- if (att in domNode.style || att in Y.DOM.CUSTOM_STYLES) {
3866- val = node.getComputedStyle(att);
3867- } else if (domNode.attributes[att]) {
3868- val = node.getAttribute(att);
3869- }
3870- } else if (node.get) {
3871- val = node.get(att);
3872- }
3873-
3874- return val;
3875- };
3876-
3877- Y.Anim.ATTRS = {
3878- /**
3879- * The object to be animated.
3880- * @attribute node
3881- * @type Node
3882- */
3883- node: {
3884- setter: function(node) {
3885- if (node) {
3886- if (typeof node == 'string' || node.nodeType) {
3887- node = Y.one(node);
3888- }
3889- }
3890-
3891- this._node = node;
3892- if (!node) {
3893- Y.log(node + ' is not a valid node', 'warn', 'Anim');
3894- }
3895- return node;
3896- }
3897- },
3898-
3899- /**
3900- * The length of the animation. Defaults to "1" (second).
3901- * @attribute duration
3902- * @type NUM
3903- */
3904- duration: {
3905- value: 1
3906- },
3907-
3908- /**
3909- * The method that will provide values to the attribute(s) during the animation.
3910- * Defaults to "Easing.easeNone".
3911- * @attribute easing
3912- * @type Function
3913- */
3914- easing: {
3915- value: Y.Anim.DEFAULT_EASING,
3916-
3917- setter: function(val) {
3918- if (typeof val === 'string' && Y.Easing) {
3919- return Y.Easing[val];
3920- }
3921- }
3922- },
3923-
3924- /**
3925- * The starting values for the animated properties.
3926- *
3927- * Fields may be strings, numbers, or functions.
3928- * If a function is used, the return value becomes the from value.
3929- * If no from value is specified, the DEFAULT_GETTER will be used.
3930- * Supports any unit, provided it matches the "to" (or default)
3931- * unit (e.g. `{width: '10em', color: 'rgb(0, 0 0)', borderColor: '#ccc'}`).
3932- *
3933- * If using the default ('px' for length-based units), the unit may be omitted
3934- * (e.g. `{width: 100}, borderColor: 'ccc'}`, which defaults to pixels
3935- * and hex, respectively).
3936- *
3937- * @attribute from
3938- * @type Object
3939- */
3940- from: {},
3941-
3942- /**
3943- * The ending values for the animated properties.
3944- *
3945- * Fields may be strings, numbers, or functions.
3946- * Supports any unit, provided it matches the "from" (or default)
3947- * unit (e.g. `{width: '50%', color: 'red', borderColor: '#ccc'}`).
3948- *
3949- * If using the default ('px' for length-based units), the unit may be omitted
3950- * (e.g. `{width: 100, borderColor: 'ccc'}`, which defaults to pixels
3951- * and hex, respectively).
3952- *
3953- * @attribute to
3954- * @type Object
3955- */
3956- to: {},
3957-
3958- /**
3959- * Date stamp for the first frame of the animation.
3960- * @attribute startTime
3961- * @type Int
3962- * @default 0
3963- * @readOnly
3964- */
3965- startTime: {
3966- value: 0,
3967- readOnly: true
3968- },
3969-
3970- /**
3971- * Current time the animation has been running.
3972- * @attribute elapsedTime
3973- * @type Int
3974- * @default 0
3975- * @readOnly
3976- */
3977- elapsedTime: {
3978- value: 0,
3979- readOnly: true
3980- },
3981-
3982- /**
3983- * Whether or not the animation is currently running.
3984- * @attribute running
3985- * @type Boolean
3986- * @default false
3987- * @readOnly
3988- */
3989- running: {
3990- getter: function() {
3991- return !!_running[Y.stamp(this)];
3992- },
3993- value: false,
3994- readOnly: true
3995- },
3996-
3997- /**
3998- * The number of times the animation should run
3999- * @attribute iterations
4000- * @type Int
4001- * @default 1
4002- */
4003- iterations: {
4004- value: 1
4005- },
4006-
4007- /**
4008- * The number of iterations that have occurred.
4009- * Resets when an animation ends (reaches iteration count or stop() called).
4010- * @attribute iterationCount
4011- * @type Int
4012- * @default 0
4013- * @readOnly
4014- */
4015- iterationCount: {
4016- value: 0,
4017- readOnly: true
4018- },
4019-
4020- /**
4021- * How iterations of the animation should behave.
4022- * Possible values are "normal" and "alternate".
4023- * Normal will repeat the animation, alternate will reverse on every other pass.
4024- *
4025- * @attribute direction
4026- * @type String
4027- * @default "normal"
4028- */
4029- direction: {
4030- value: 'normal' // | alternate (fwd on odd, rev on even per spec)
4031- },
4032-
4033- /**
4034- * Whether or not the animation is currently paused.
4035- * @attribute paused
4036- * @type Boolean
4037- * @default false
4038- * @readOnly
4039- */
4040- paused: {
4041- readOnly: true,
4042- value: false
4043- },
4044-
4045- /**
4046- * If true, animation begins from last frame
4047- * @attribute reverse
4048- * @type Boolean
4049- * @default false
4050- */
4051- reverse: {
4052- value: false
4053- }
4054-
4055-
4056- };
4057-
4058- /**
4059- * Runs all animation instances.
4060- * @method run
4061- * @static
4062- */
4063- Y.Anim.run = function() {
4064- var instances = Y.Anim._instances;
4065- for (var i in instances) {
4066- if (instances[i].run) {
4067- instances[i].run();
4068- }
4069- }
4070- };
4071-
4072- /**
4073- * Pauses all animation instances.
4074- * @method pause
4075- * @static
4076- */
4077- Y.Anim.pause = function() {
4078- for (var i in _running) { // stop timer if nothing running
4079- if (_running[i].pause) {
4080- _running[i].pause();
4081- }
4082- }
4083-
4084- Y.Anim._stopTimer();
4085- };
4086-
4087- /**
4088- * Stops all animation instances.
4089- * @method stop
4090- * @static
4091- */
4092- Y.Anim.stop = function() {
4093- for (var i in _running) { // stop timer if nothing running
4094- if (_running[i].stop) {
4095- _running[i].stop();
4096- }
4097- }
4098- Y.Anim._stopTimer();
4099- };
4100-
4101- Y.Anim._startTimer = function() {
4102- if (!_timer) {
4103- _timer = setInterval(Y.Anim._runFrame, Y.Anim._intervalTime);
4104- }
4105- };
4106-
4107- Y.Anim._stopTimer = function() {
4108- clearInterval(_timer);
4109- _timer = 0;
4110- };
4111-
4112- /**
4113- * Called per Interval to handle each animation frame.
4114- * @method _runFrame
4115- * @private
4116- * @static
4117- */
4118- Y.Anim._runFrame = function() {
4119- var done = true;
4120- for (var anim in _running) {
4121- if (_running[anim]._runFrame) {
4122- done = false;
4123- _running[anim]._runFrame();
4124- }
4125- }
4126-
4127- if (done) {
4128- Y.Anim._stopTimer();
4129- }
4130- };
4131-
4132- Y.Anim.RE_UNITS = /^(-?\d*\.?\d*){1}(em|ex|px|in|cm|mm|pt|pc|%)*$/;
4133-
4134- var proto = {
4135- /**
4136- * Starts or resumes an animation.
4137- * @method run
4138- * @chainable
4139- */
4140- run: function() {
4141- if (this.get(PAUSED)) {
4142- this._resume();
4143- } else if (!this.get(RUNNING)) {
4144- this._start();
4145- }
4146- return this;
4147- },
4148-
4149- /**
4150- * Pauses the animation and
4151- * freezes it in its current state and time.
4152- * Calling run() will continue where it left off.
4153- * @method pause
4154- * @chainable
4155- */
4156- pause: function() {
4157- if (this.get(RUNNING)) {
4158- this._pause();
4159- }
4160- return this;
4161- },
4162-
4163- /**
4164- * Stops the animation and resets its time.
4165- * @method stop
4166- * @param {Boolean} finish If true, the animation will move to the last frame
4167- * @chainable
4168- */
4169- stop: function(finish) {
4170- if (this.get(RUNNING) || this.get(PAUSED)) {
4171- this._end(finish);
4172- }
4173- return this;
4174- },
4175-
4176- _added: false,
4177-
4178- _start: function() {
4179- this._set(START_TIME, new Date() - this.get(ELAPSED_TIME));
4180- this._actualFrames = 0;
4181- if (!this.get(PAUSED)) {
4182- this._initAnimAttr();
4183- }
4184- _running[Y.stamp(this)] = this;
4185- Y.Anim._startTimer();
4186-
4187- this.fire(START);
4188- },
4189-
4190- _pause: function() {
4191- this._set(START_TIME, null);
4192- this._set(PAUSED, true);
4193- delete _running[Y.stamp(this)];
4194-
4195- /**
4196- * @event pause
4197- * @description fires when an animation is paused.
4198- * @param {Event} ev The pause event.
4199- * @type Event.Custom
4200- */
4201- this.fire('pause');
4202- },
4203-
4204- _resume: function() {
4205- this._set(PAUSED, false);
4206- _running[Y.stamp(this)] = this;
4207- this._set(START_TIME, new Date() - this.get(ELAPSED_TIME));
4208- Y.Anim._startTimer();
4209-
4210- /**
4211- * @event resume
4212- * @description fires when an animation is resumed (run from pause).
4213- * @param {Event} ev The pause event.
4214- * @type Event.Custom
4215- */
4216- this.fire('resume');
4217- },
4218-
4219- _end: function(finish) {
4220- var duration = this.get('duration') * 1000;
4221- if (finish) { // jump to last frame
4222- this._runAttrs(duration, duration, this.get(REVERSE));
4223- }
4224-
4225- this._set(START_TIME, null);
4226- this._set(ELAPSED_TIME, 0);
4227- this._set(PAUSED, false);
4228-
4229- delete _running[Y.stamp(this)];
4230- this.fire(END, {elapsed: this.get(ELAPSED_TIME)});
4231- },
4232-
4233- _runFrame: function() {
4234- var d = this._runtimeAttr.duration,
4235- t = new Date() - this.get(START_TIME),
4236- reverse = this.get(REVERSE),
4237- done = (t >= d),
4238- attribute,
4239- setter;
4240-
4241- this._runAttrs(t, d, reverse);
4242- this._actualFrames += 1;
4243- this._set(ELAPSED_TIME, t);
4244-
4245- this.fire(TWEEN);
4246- if (done) {
4247- this._lastFrame();
4248- }
4249- },
4250-
4251- _runAttrs: function(t, d, reverse) {
4252- var attr = this._runtimeAttr,
4253- customAttr = Y.Anim.behaviors,
4254- easing = attr.easing,
4255- lastFrame = d,
4256- done = false,
4257- attribute,
4258- setter,
4259- i;
4260-
4261- if (t >= d) {
4262- done = true;
4263- }
4264-
4265- if (reverse) {
4266- t = d - t;
4267- lastFrame = 0;
4268- }
4269-
4270- for (i in attr) {
4271- if (attr[i].to) {
4272- attribute = attr[i];
4273- setter = (i in customAttr && 'set' in customAttr[i]) ?
4274- customAttr[i].set : Y.Anim.DEFAULT_SETTER;
4275-
4276- if (!done) {
4277- setter(this, i, attribute.from, attribute.to, t, d, easing, attribute.unit);
4278- } else {
4279- setter(this, i, attribute.from, attribute.to, lastFrame, d, easing, attribute.unit);
4280- }
4281- }
4282- }
4283-
4284-
4285- },
4286-
4287- _lastFrame: function() {
4288- var iter = this.get('iterations'),
4289- iterCount = this.get(ITERATION_COUNT);
4290-
4291- iterCount += 1;
4292- if (iter === 'infinite' || iterCount < iter) {
4293- if (this.get('direction') === 'alternate') {
4294- this.set(REVERSE, !this.get(REVERSE)); // flip it
4295- }
4296- /**
4297- * @event iteration
4298- * @description fires when an animation begins an iteration.
4299- * @param {Event} ev The iteration event.
4300- * @type Event.Custom
4301- */
4302- this.fire('iteration');
4303- } else {
4304- iterCount = 0;
4305- this._end();
4306- }
4307-
4308- this._set(START_TIME, new Date());
4309- this._set(ITERATION_COUNT, iterCount);
4310- },
4311-
4312- _initAnimAttr: function() {
4313- var from = this.get('from') || {},
4314- to = this.get('to') || {},
4315- attr = {
4316- duration: this.get('duration') * 1000,
4317- easing: this.get('easing')
4318- },
4319- customAttr = Y.Anim.behaviors,
4320- node = this.get(NODE), // implicit attr init
4321- unit, begin, end;
4322-
4323- Y.each(to, function(val, name) {
4324- if (typeof val === 'function') {
4325- val = val.call(this, node);
4326- }
4327-
4328- begin = from[name];
4329- if (begin === undefined) {
4330- begin = (name in customAttr && 'get' in customAttr[name]) ?
4331- customAttr[name].get(this, name) : Y.Anim.DEFAULT_GETTER(this, name);
4332- } else if (typeof begin === 'function') {
4333- begin = begin.call(this, node);
4334- }
4335-
4336- var mFrom = Y.Anim.RE_UNITS.exec(begin);
4337- var mTo = Y.Anim.RE_UNITS.exec(val);
4338-
4339- begin = mFrom ? mFrom[1] : begin;
4340- end = mTo ? mTo[1] : val;
4341- unit = mTo ? mTo[2] : mFrom ? mFrom[2] : ''; // one might be zero TODO: mixed units
4342-
4343- if (!unit && Y.Anim.RE_DEFAULT_UNIT.test(name)) {
4344- unit = Y.Anim.DEFAULT_UNIT;
4345- }
4346-
4347- if (!begin || !end) {
4348- Y.error('invalid "from" or "to" for "' + name + '"', 'Anim');
4349- return;
4350- }
4351-
4352- attr[name] = {
4353- from: begin,
4354- to: end,
4355- unit: unit
4356- };
4357-
4358- }, this);
4359-
4360- this._runtimeAttr = attr;
4361- },
4362-
4363-
4364- // TODO: move to computedStyle? (browsers dont agree on default computed offsets)
4365- _getOffset: function(attr) {
4366- var node = this._node,
4367- val = node.getComputedStyle(attr),
4368- get = (attr === 'left') ? 'getX': 'getY',
4369- set = (attr === 'left') ? 'setX': 'setY';
4370-
4371- if (val === 'auto') {
4372- var position = node.getStyle('position');
4373- if (position === 'absolute' || position === 'fixed') {
4374- val = node[get]();
4375- node[set](val);
4376- } else {
4377- val = 0;
4378- }
4379- }
4380-
4381- return val;
4382- },
4383-
4384- destructor: function() {
4385- delete Y.Anim._instances[Y.stamp(this)];
4386- }
4387- };
4388-
4389- Y.extend(Y.Anim, Y.Base, proto);
4390-
4391-
4392-}, '3.5.1' ,{requires:['base-base', 'node-style']});
4393
4394=== removed file 'src/maasserver/static/jslibs/yui/anim-base/anim-base-min.js'
4395--- src/maasserver/static/jslibs/yui/anim-base/anim-base-min.js 2012-06-11 14:32:48 +0000
4396+++ src/maasserver/static/jslibs/yui/anim-base/anim-base-min.js 1970-01-01 00:00:00 +0000
4397@@ -1,7 +0,0 @@
4398-/*
4399-YUI 3.5.1 (build 22)
4400-Copyright 2012 Yahoo! Inc. All rights reserved.
4401-Licensed under the BSD License.
4402-http://yuilibrary.com/license/
4403-*/
4404-YUI.add("anim-base",function(b){var c="running",n="startTime",l="elapsedTime",j="start",i="tween",m="end",d="node",k="paused",o="reverse",h="iterationCount",a=Number;var f={},e;b.Anim=function(){b.Anim.superclass.constructor.apply(this,arguments);b.Anim._instances[b.stamp(this)]=this;};b.Anim.NAME="anim";b.Anim._instances={};b.Anim.RE_DEFAULT_UNIT=/^width|height|top|right|bottom|left|margin.*|padding.*|border.*$/i;b.Anim.DEFAULT_UNIT="px";b.Anim.DEFAULT_EASING=function(q,p,s,r){return s*q/r+p;};b.Anim._intervalTime=20;b.Anim.behaviors={left:{get:function(q,p){return q._getOffset(p);}}};b.Anim.behaviors.top=b.Anim.behaviors.left;b.Anim.DEFAULT_SETTER=function(t,u,w,x,z,s,v,y){var q=t._node,r=q._node,p=v(z,a(w),a(x)-a(w),s);if(r&&(r.style||r.attributes)){if(u in r.style||u in b.DOM.CUSTOM_STYLES){y=y||"";q.setStyle(u,p+y);}else{if(r.attributes[u]){q.setAttribute(u,p);}}}else{if(q.set){q.set(u,p);}}};b.Anim.DEFAULT_GETTER=function(s,p){var r=s._node,q=r._node,t="";if(q&&(q.style||q.attributes)){if(p in q.style||p in b.DOM.CUSTOM_STYLES){t=r.getComputedStyle(p);}else{if(q.attributes[p]){t=r.getAttribute(p);}}}else{if(r.get){t=r.get(p);}}return t;};b.Anim.ATTRS={node:{setter:function(p){if(p){if(typeof p=="string"||p.nodeType){p=b.one(p);}}this._node=p;if(!p){}return p;}},duration:{value:1},easing:{value:b.Anim.DEFAULT_EASING,setter:function(p){if(typeof p==="string"&&b.Easing){return b.Easing[p];}}},from:{},to:{},startTime:{value:0,readOnly:true},elapsedTime:{value:0,readOnly:true},running:{getter:function(){return !!f[b.stamp(this)];},value:false,readOnly:true},iterations:{value:1},iterationCount:{value:0,readOnly:true},direction:{value:"normal"},paused:{readOnly:true,value:false},reverse:{value:false}};b.Anim.run=function(){var q=b.Anim._instances;for(var p in q){if(q[p].run){q[p].run();}}};b.Anim.pause=function(){for(var p in f){if(f[p].pause){f[p].pause();}}b.Anim._stopTimer();};b.Anim.stop=function(){for(var p in f){if(f[p].stop){f[p].stop();}}b.Anim._stopTimer();};b.Anim._startTimer=function(){if(!e){e=setInterval(b.Anim._runFrame,b.Anim._intervalTime);}};b.Anim._stopTimer=function(){clearInterval(e);e=0;};b.Anim._runFrame=function(){var p=true;for(var q in f){if(f[q]._runFrame){p=false;f[q]._runFrame();}}if(p){b.Anim._stopTimer();}};b.Anim.RE_UNITS=/^(-?\d*\.?\d*){1}(em|ex|px|in|cm|mm|pt|pc|%)*$/;var g={run:function(){if(this.get(k)){this._resume();}else{if(!this.get(c)){this._start();}}return this;},pause:function(){if(this.get(c)){this._pause();}return this;},stop:function(p){if(this.get(c)||this.get(k)){this._end(p);}return this;},_added:false,_start:function(){this._set(n,new Date()-this.get(l));this._actualFrames=0;if(!this.get(k)){this._initAnimAttr();}f[b.stamp(this)]=this;b.Anim._startTimer();this.fire(j);},_pause:function(){this._set(n,null);this._set(k,true);delete f[b.stamp(this)];this.fire("pause");},_resume:function(){this._set(k,false);f[b.stamp(this)]=this;this._set(n,new Date()-this.get(l));b.Anim._startTimer();this.fire("resume");},_end:function(p){var q=this.get("duration")*1000;if(p){this._runAttrs(q,q,this.get(o));}this._set(n,null);this._set(l,0);this._set(k,false);delete f[b.stamp(this)];this.fire(m,{elapsed:this.get(l)});},_runFrame:function(){var u=this._runtimeAttr.duration,r=new Date()-this.get(n),q=this.get(o),p=(r>=u),s,v;this._runAttrs(r,u,q);this._actualFrames+=1;this._set(l,r);this.fire(i);if(p){this._lastFrame();}},_runAttrs:function(A,z,w){var x=this._runtimeAttr,r=b.Anim.behaviors,y=x.easing,p=z,u=false,q,s,v;if(A>=z){u=true;}if(w){A=z-A;p=0;}for(v in x){if(x[v].to){q=x[v];s=(v in r&&"set" in r[v])?r[v].set:b.Anim.DEFAULT_SETTER;if(!u){s(this,v,q.from,q.to,A,z,y,q.unit);}else{s(this,v,q.from,q.to,p,z,y,q.unit);}}}},_lastFrame:function(){var p=this.get("iterations"),q=this.get(h);q+=1;if(p==="infinite"||q<p){if(this.get("direction")==="alternate"){this.set(o,!this.get(o));}this.fire("iteration");}else{q=0;this._end();}this._set(n,new Date());this._set(h,q);},_initAnimAttr:function(){var w=this.get("from")||{},v=this.get("to")||{},p={duration:this.get("duration")*1000,easing:this.get("easing")},r=b.Anim.behaviors,u=this.get(d),t,s,q;b.each(v,function(A,y){if(typeof A==="function"){A=A.call(this,u);}s=w[y];if(s===undefined){s=(y in r&&"get" in r[y])?r[y].get(this,y):b.Anim.DEFAULT_GETTER(this,y);}else{if(typeof s==="function"){s=s.call(this,u);}}var x=b.Anim.RE_UNITS.exec(s);var z=b.Anim.RE_UNITS.exec(A);s=x?x[1]:s;q=z?z[1]:A;t=z?z[2]:x?x[2]:"";if(!t&&b.Anim.RE_DEFAULT_UNIT.test(y)){t=b.Anim.DEFAULT_UNIT;}if(!s||!q){b.error('invalid "from" or "to" for "'+y+'"',"Anim");return;}p[y]={from:s,to:q,unit:t};},this);this._runtimeAttr=p;},_getOffset:function(q){var s=this._node,t=s.getComputedStyle(q),r=(q==="left")?"getX":"getY",u=(q==="left")?"setX":"setY";if(t==="auto"){var p=s.getStyle("position");if(p==="absolute"||p==="fixed"){t=s[r]();s[u](t);}else{t=0;}}return t;},destructor:function(){delete b.Anim._instances[b.stamp(this)];}};b.extend(b.Anim,b.Base,g);},"3.5.1",{requires:["base-base","node-style"]});
4405\ No newline at end of file
4406
4407=== removed file 'src/maasserver/static/jslibs/yui/anim-base/anim-base.js'
4408--- src/maasserver/static/jslibs/yui/anim-base/anim-base.js 2012-06-11 14:32:48 +0000
4409+++ src/maasserver/static/jslibs/yui/anim-base/anim-base.js 1970-01-01 00:00:00 +0000
4410@@ -1,681 +0,0 @@
4411-/*
4412-YUI 3.5.1 (build 22)
4413-Copyright 2012 Yahoo! Inc. All rights reserved.
4414-Licensed under the BSD License.
4415-http://yuilibrary.com/license/
4416-*/
4417-YUI.add('anim-base', function(Y) {
4418-
4419-/**
4420-* The Animation Utility provides an API for creating advanced transitions.
4421-* @module anim
4422-*/
4423-
4424-/**
4425-* Provides the base Anim class, for animating numeric properties.
4426-*
4427-* @module anim
4428-* @submodule anim-base
4429-*/
4430-
4431- /**
4432- * A class for constructing animation instances.
4433- * @class Anim
4434- * @for Anim
4435- * @constructor
4436- * @extends Base
4437- */
4438-
4439- var RUNNING = 'running',
4440- START_TIME = 'startTime',
4441- ELAPSED_TIME = 'elapsedTime',
4442- /**
4443- * @for Anim
4444- * @event start
4445- * @description fires when an animation begins.
4446- * @param {Event} ev The start event.
4447- * @type Event.Custom
4448- */
4449- START = 'start',
4450-
4451- /**
4452- * @event tween
4453- * @description fires every frame of the animation.
4454- * @param {Event} ev The tween event.
4455- * @type Event.Custom
4456- */
4457- TWEEN = 'tween',
4458-
4459- /**
4460- * @event end
4461- * @description fires after the animation completes.
4462- * @param {Event} ev The end event.
4463- * @type Event.Custom
4464- */
4465- END = 'end',
4466- NODE = 'node',
4467- PAUSED = 'paused',
4468- REVERSE = 'reverse', // TODO: cleanup
4469- ITERATION_COUNT = 'iterationCount',
4470-
4471- NUM = Number;
4472-
4473- var _running = {},
4474- _timer;
4475-
4476- Y.Anim = function() {
4477- Y.Anim.superclass.constructor.apply(this, arguments);
4478- Y.Anim._instances[Y.stamp(this)] = this;
4479- };
4480-
4481- Y.Anim.NAME = 'anim';
4482-
4483- Y.Anim._instances = {};
4484-
4485- /**
4486- * Regex of properties that should use the default unit.
4487- *
4488- * @property RE_DEFAULT_UNIT
4489- * @static
4490- */
4491- Y.Anim.RE_DEFAULT_UNIT = /^width|height|top|right|bottom|left|margin.*|padding.*|border.*$/i;
4492-
4493- /**
4494- * The default unit to use with properties that pass the RE_DEFAULT_UNIT test.
4495- *
4496- * @property DEFAULT_UNIT
4497- * @static
4498- */
4499- Y.Anim.DEFAULT_UNIT = 'px';
4500-
4501- Y.Anim.DEFAULT_EASING = function (t, b, c, d) {
4502- return c * t / d + b; // linear easing
4503- };
4504-
4505- /**
4506- * Time in milliseconds passed to setInterval for frame processing
4507- *
4508- * @property intervalTime
4509- * @default 20
4510- * @static
4511- */
4512- Y.Anim._intervalTime = 20;
4513-
4514- /**
4515- * Bucket for custom getters and setters
4516- *
4517- * @property behaviors
4518- * @static
4519- */
4520- Y.Anim.behaviors = {
4521- left: {
4522- get: function(anim, attr) {
4523- return anim._getOffset(attr);
4524- }
4525- }
4526- };
4527-
4528- Y.Anim.behaviors.top = Y.Anim.behaviors.left;
4529-
4530- /**
4531- * The default setter to use when setting object properties.
4532- *
4533- * @property DEFAULT_SETTER
4534- * @static
4535- */
4536- Y.Anim.DEFAULT_SETTER = function(anim, att, from, to, elapsed, duration, fn, unit) {
4537- var node = anim._node,
4538- domNode = node._node,
4539- val = fn(elapsed, NUM(from), NUM(to) - NUM(from), duration);
4540- //make sure node instance
4541- if (domNode && (domNode.style || domNode.attributes)) {
4542- if (att in domNode.style || att in Y.DOM.CUSTOM_STYLES) {
4543- unit = unit || '';
4544- node.setStyle(att, val + unit);
4545- } else if (domNode.attributes[att]) {
4546- node.setAttribute(att, val);
4547- }
4548- } else if (node.set) {
4549- node.set(att, val);
4550- }
4551- };
4552-
4553- /**
4554- * The default getter to use when getting object properties.
4555- *
4556- * @property DEFAULT_GETTER
4557- * @static
4558- */
4559- Y.Anim.DEFAULT_GETTER = function(anim, att) {
4560- var node = anim._node,
4561- domNode = node._node,
4562- val = '';
4563- //make sure node instance
4564- if (domNode && (domNode.style || domNode.attributes)) {
4565- if (att in domNode.style || att in Y.DOM.CUSTOM_STYLES) {
4566- val = node.getComputedStyle(att);
4567- } else if (domNode.attributes[att]) {
4568- val = node.getAttribute(att);
4569- }
4570- } else if (node.get) {
4571- val = node.get(att);
4572- }
4573-
4574- return val;
4575- };
4576-
4577- Y.Anim.ATTRS = {
4578- /**
4579- * The object to be animated.
4580- * @attribute node
4581- * @type Node
4582- */
4583- node: {
4584- setter: function(node) {
4585- if (node) {
4586- if (typeof node == 'string' || node.nodeType) {
4587- node = Y.one(node);
4588- }
4589- }
4590-
4591- this._node = node;
4592- if (!node) {
4593- }
4594- return node;
4595- }
4596- },
4597-
4598- /**
4599- * The length of the animation. Defaults to "1" (second).
4600- * @attribute duration
4601- * @type NUM
4602- */
4603- duration: {
4604- value: 1
4605- },
4606-
4607- /**
4608- * The method that will provide values to the attribute(s) during the animation.
4609- * Defaults to "Easing.easeNone".
4610- * @attribute easing
4611- * @type Function
4612- */
4613- easing: {
4614- value: Y.Anim.DEFAULT_EASING,
4615-
4616- setter: function(val) {
4617- if (typeof val === 'string' && Y.Easing) {
4618- return Y.Easing[val];
4619- }
4620- }
4621- },
4622-
4623- /**
4624- * The starting values for the animated properties.
4625- *
4626- * Fields may be strings, numbers, or functions.
4627- * If a function is used, the return value becomes the from value.
4628- * If no from value is specified, the DEFAULT_GETTER will be used.
4629- * Supports any unit, provided it matches the "to" (or default)
4630- * unit (e.g. `{width: '10em', color: 'rgb(0, 0 0)', borderColor: '#ccc'}`).
4631- *
4632- * If using the default ('px' for length-based units), the unit may be omitted
4633- * (e.g. `{width: 100}, borderColor: 'ccc'}`, which defaults to pixels
4634- * and hex, respectively).
4635- *
4636- * @attribute from
4637- * @type Object
4638- */
4639- from: {},
4640-
4641- /**
4642- * The ending values for the animated properties.
4643- *
4644- * Fields may be strings, numbers, or functions.
4645- * Supports any unit, provided it matches the "from" (or default)
4646- * unit (e.g. `{width: '50%', color: 'red', borderColor: '#ccc'}`).
4647- *
4648- * If using the default ('px' for length-based units), the unit may be omitted
4649- * (e.g. `{width: 100, borderColor: 'ccc'}`, which defaults to pixels
4650- * and hex, respectively).
4651- *
4652- * @attribute to
4653- * @type Object
4654- */
4655- to: {},
4656-
4657- /**
4658- * Date stamp for the first frame of the animation.
4659- * @attribute startTime
4660- * @type Int
4661- * @default 0
4662- * @readOnly
4663- */
4664- startTime: {
4665- value: 0,
4666- readOnly: true
4667- },
4668-
4669- /**
4670- * Current time the animation has been running.
4671- * @attribute elapsedTime
4672- * @type Int
4673- * @default 0
4674- * @readOnly
4675- */
4676- elapsedTime: {
4677- value: 0,
4678- readOnly: true
4679- },
4680-
4681- /**
4682- * Whether or not the animation is currently running.
4683- * @attribute running
4684- * @type Boolean
4685- * @default false
4686- * @readOnly
4687- */
4688- running: {
4689- getter: function() {
4690- return !!_running[Y.stamp(this)];
4691- },
4692- value: false,
4693- readOnly: true
4694- },
4695-
4696- /**
4697- * The number of times the animation should run
4698- * @attribute iterations
4699- * @type Int
4700- * @default 1
4701- */
4702- iterations: {
4703- value: 1
4704- },
4705-
4706- /**
4707- * The number of iterations that have occurred.
4708- * Resets when an animation ends (reaches iteration count or stop() called).
4709- * @attribute iterationCount
4710- * @type Int
4711- * @default 0
4712- * @readOnly
4713- */
4714- iterationCount: {
4715- value: 0,
4716- readOnly: true
4717- },
4718-
4719- /**
4720- * How iterations of the animation should behave.
4721- * Possible values are "normal" and "alternate".
4722- * Normal will repeat the animation, alternate will reverse on every other pass.
4723- *
4724- * @attribute direction
4725- * @type String
4726- * @default "normal"
4727- */
4728- direction: {
4729- value: 'normal' // | alternate (fwd on odd, rev on even per spec)
4730- },
4731-
4732- /**
4733- * Whether or not the animation is currently paused.
4734- * @attribute paused
4735- * @type Boolean
4736- * @default false
4737- * @readOnly
4738- */
4739- paused: {
4740- readOnly: true,
4741- value: false
4742- },
4743-
4744- /**
4745- * If true, animation begins from last frame
4746- * @attribute reverse
4747- * @type Boolean
4748- * @default false
4749- */
4750- reverse: {
4751- value: false
4752- }
4753-
4754-
4755- };
4756-
4757- /**
4758- * Runs all animation instances.
4759- * @method run
4760- * @static
4761- */
4762- Y.Anim.run = function() {
4763- var instances = Y.Anim._instances;
4764- for (var i in instances) {
4765- if (instances[i].run) {
4766- instances[i].run();
4767- }
4768- }
4769- };
4770-
4771- /**
4772- * Pauses all animation instances.
4773- * @method pause
4774- * @static
4775- */
4776- Y.Anim.pause = function() {
4777- for (var i in _running) { // stop timer if nothing running
4778- if (_running[i].pause) {
4779- _running[i].pause();
4780- }
4781- }
4782-
4783- Y.Anim._stopTimer();
4784- };
4785-
4786- /**
4787- * Stops all animation instances.
4788- * @method stop
4789- * @static
4790- */
4791- Y.Anim.stop = function() {
4792- for (var i in _running) { // stop timer if nothing running
4793- if (_running[i].stop) {
4794- _running[i].stop();
4795- }
4796- }
4797- Y.Anim._stopTimer();
4798- };
4799-
4800- Y.Anim._startTimer = function() {
4801- if (!_timer) {
4802- _timer = setInterval(Y.Anim._runFrame, Y.Anim._intervalTime);
4803- }
4804- };
4805-
4806- Y.Anim._stopTimer = function() {
4807- clearInterval(_timer);
4808- _timer = 0;
4809- };
4810-
4811- /**
4812- * Called per Interval to handle each animation frame.
4813- * @method _runFrame
4814- * @private
4815- * @static
4816- */
4817- Y.Anim._runFrame = function() {
4818- var done = true;
4819- for (var anim in _running) {
4820- if (_running[anim]._runFrame) {
4821- done = false;
4822- _running[anim]._runFrame();
4823- }
4824- }
4825-
4826- if (done) {
4827- Y.Anim._stopTimer();
4828- }
4829- };
4830-
4831- Y.Anim.RE_UNITS = /^(-?\d*\.?\d*){1}(em|ex|px|in|cm|mm|pt|pc|%)*$/;
4832-
4833- var proto = {
4834- /**
4835- * Starts or resumes an animation.
4836- * @method run
4837- * @chainable
4838- */
4839- run: function() {
4840- if (this.get(PAUSED)) {
4841- this._resume();
4842- } else if (!this.get(RUNNING)) {
4843- this._start();
4844- }
4845- return this;
4846- },
4847-
4848- /**
4849- * Pauses the animation and
4850- * freezes it in its current state and time.
4851- * Calling run() will continue where it left off.
4852- * @method pause
4853- * @chainable
4854- */
4855- pause: function() {
4856- if (this.get(RUNNING)) {
4857- this._pause();
4858- }
4859- return this;
4860- },
4861-
4862- /**
4863- * Stops the animation and resets its time.
4864- * @method stop
4865- * @param {Boolean} finish If true, the animation will move to the last frame
4866- * @chainable
4867- */
4868- stop: function(finish) {
4869- if (this.get(RUNNING) || this.get(PAUSED)) {
4870- this._end(finish);
4871- }
4872- return this;
4873- },
4874-
4875- _added: false,
4876-
4877- _start: function() {
4878- this._set(START_TIME, new Date() - this.get(ELAPSED_TIME));
4879- this._actualFrames = 0;
4880- if (!this.get(PAUSED)) {
4881- this._initAnimAttr();
4882- }
4883- _running[Y.stamp(this)] = this;
4884- Y.Anim._startTimer();
4885-
4886- this.fire(START);
4887- },
4888-
4889- _pause: function() {
4890- this._set(START_TIME, null);
4891- this._set(PAUSED, true);
4892- delete _running[Y.stamp(this)];
4893-
4894- /**
4895- * @event pause
4896- * @description fires when an animation is paused.
4897- * @param {Event} ev The pause event.
4898- * @type Event.Custom
4899- */
4900- this.fire('pause');
4901- },
4902-
4903- _resume: function() {
4904- this._set(PAUSED, false);
4905- _running[Y.stamp(this)] = this;
4906- this._set(START_TIME, new Date() - this.get(ELAPSED_TIME));
4907- Y.Anim._startTimer();
4908-
4909- /**
4910- * @event resume
4911- * @description fires when an animation is resumed (run from pause).
4912- * @param {Event} ev The pause event.
4913- * @type Event.Custom
4914- */
4915- this.fire('resume');
4916- },
4917-
4918- _end: function(finish) {
4919- var duration = this.get('duration') * 1000;
4920- if (finish) { // jump to last frame
4921- this._runAttrs(duration, duration, this.get(REVERSE));
4922- }
4923-
4924- this._set(START_TIME, null);
4925- this._set(ELAPSED_TIME, 0);
4926- this._set(PAUSED, false);
4927-
4928- delete _running[Y.stamp(this)];
4929- this.fire(END, {elapsed: this.get(ELAPSED_TIME)});
4930- },
4931-
4932- _runFrame: function() {
4933- var d = this._runtimeAttr.duration,
4934- t = new Date() - this.get(START_TIME),
4935- reverse = this.get(REVERSE),
4936- done = (t >= d),
4937- attribute,
4938- setter;
4939-
4940- this._runAttrs(t, d, reverse);
4941- this._actualFrames += 1;
4942- this._set(ELAPSED_TIME, t);
4943-
4944- this.fire(TWEEN);
4945- if (done) {
4946- this._lastFrame();
4947- }
4948- },
4949-
4950- _runAttrs: function(t, d, reverse) {
4951- var attr = this._runtimeAttr,
4952- customAttr = Y.Anim.behaviors,
4953- easing = attr.easing,
4954- lastFrame = d,
4955- done = false,
4956- attribute,
4957- setter,
4958- i;
4959-
4960- if (t >= d) {
4961- done = true;
4962- }
4963-
4964- if (reverse) {
4965- t = d - t;
4966- lastFrame = 0;
4967- }
4968-
4969- for (i in attr) {
4970- if (attr[i].to) {
4971- attribute = attr[i];
4972- setter = (i in customAttr && 'set' in customAttr[i]) ?
4973- customAttr[i].set : Y.Anim.DEFAULT_SETTER;
4974-
4975- if (!done) {
4976- setter(this, i, attribute.from, attribute.to, t, d, easing, attribute.unit);
4977- } else {
4978- setter(this, i, attribute.from, attribute.to, lastFrame, d, easing, attribute.unit);
4979- }
4980- }
4981- }
4982-
4983-
4984- },
4985-
4986- _lastFrame: function() {
4987- var iter = this.get('iterations'),
4988- iterCount = this.get(ITERATION_COUNT);
4989-
4990- iterCount += 1;
4991- if (iter === 'infinite' || iterCount < iter) {
4992- if (this.get('direction') === 'alternate') {
4993- this.set(REVERSE, !this.get(REVERSE)); // flip it
4994- }
4995- /**
4996- * @event iteration
4997- * @description fires when an animation begins an iteration.
4998- * @param {Event} ev The iteration event.
4999- * @type Event.Custom
5000- */
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches

to status/vote changes: