ÿØÿà JFIF    ÿÛ „  ( %!1"%)+...383-7(-.+  -%%--------+------------/----------------------------ÿÀ  ¶" ÿÄ     ÿÄ @    !1AQaq‘¡"±ÁÑð2’BRráS‚ñ3b¢CT²Ò #cÿÄ    ÿÄ '   1!AQ2a"‘±#ÿÚ   ? ò(/p‘—–¢·,M|¯G»R£üešT. ôŸEoCFñ‡ 4ÔkåóxR|µÁ¨ÓDà!Ç´µ˜‡p ÍQ‹§!þž^õWsŒy  åÁ§$á«%ºq˜™JyyË0y«^Ϗ -3ÃÏËÈ£Æ\P’ä„s&•‹Üs üô'àWt¹pñCp$bÚF`·7.^)¾!)ÒÙ˜–ÅÏš^h¾ø³·ìe±ŒaeÖ—Í,e=B}Jéߦ$$½—šÙÜCC¯¶è8β–Åkèwx LÉngT±æ¹£Ócœ¿Í/©Éÿ ‰ÚCÒ­mq;Tt¶–}0"zÖPcd1š­¤tˆ„ÐÓâqú[™öUCŠ2޿د­É(¸ßúçšmW,Ò ºf‹Ån™ÄLêÁ8üÁkÁ€L¥ÍuJ1œôrÂSŒÓöt!7EUíïb)AËi¬â-ÙHk8òÁiXYwÅ)O^"ÇØriÛô{»wRUKÙÏÚlÓ¬€‚’שT ] ªb—ÊîKC^×M“xùäñz¬zJ× {4[¹M'IÆeH1LCWÕ]œûº WDæà°OÅ‚¹c²ÞuA–rL`HšpCez‡V’— Ž‚Ë„–ñ­'µR0ÕÖ=À:±G»C\nÆÉ5*¢ †3šhQ4ýÒi$Õ1"Ü]¢p-q3zcQ$ªö¨¥æf›‘»´ÝÚHá„e²JÇ–iÊ:·à¬Øc5Åk»Laª*wi [0Ówk ¦a¦0Õ²ÅÅ‚T¸’³q:Æ<¹ú Ò˜Æ}2VE•Ѐp¡Ô3Úº …h³^LJºçì¥Ánó|˜ÖˆÎˆ+« ¦dø‘Mº–d\ªDðÛ„Ì×LÝ——Ð9Ç|•FèçVm™¨€™3õS–9Äå¢<̉Ìm¢±`·º˜&Z²ž Ë®D«¶»6™‰©­HÈ Àá«h­i³04æ’hxœi3ï¨(ÓL·†‹¶ËpŒ ƒÜÒ? :õdsÀ –3æÓ·Üjâ¬9—]8n¼&]I F£¼…ì–—Œ0v°LǐÅfÛ2TÖ’aµ˜N@ÖBSÏ^à´4-±°b×nÈÈœÆD=KdŒø…ÄÈK,›ÖR§fjü$^ÔÎ!„6^ s:Üun\ôkCÞò÷<—Lúl Í›G¹ÀPá¼Nc¡šÒ…ÙWͳœ±vÊáЄ×9‹P‰cEØ‘™›µŸP<×g1 º©Ø¬wiÁ^l5× I/';Ë+´Z‡ÓÄFÕp[Èð’ HÄ ó 9¬Dl4“é±Ï”V=^Hð;žLädÉa‚°Ë,#/Ž~²BÔÛ QãñQtIeórVB,ÏÂf‹4#Μc‹É3ZIÖ Œ¢¥·üxa‡Ãçè„jŠ[5 Ä!U?,3žÎ×…ðdÓ÷háŠA‰ìÄ4÷ÃÜZÃE{‰®+W\ZÍE[‰»µk»MÝ­`¢©†˜ÃV‹-f¢¡†¢a«eŠ%«Y¨©q%jâd,Ôq`) ¤¦…šˆ ¦E>0Ùb²t–Ÿ  ÷jsςҒKÈcø(é›;k(’#ôŒQ ™C> õ³M9óºÆµ¤çâ;uÀ)5>RÔ¸fÓ~Ȧ—’-$fe«"FâUˆÊwµPÏu w+"åÉó¨6s™Û9(À¨ù©hE°½†n`m~“@©›p!Vkhµ Á1šbEqqÊ@ºèl›2 –Yã%‘‚hÛ{a¶‡ÅÞM²¬çL34®Çl]®‹ŽØŒm'RÜe35æöˆ­Á­ cP9šeÁköo´L³Ì=p8]”‡B¶,šº|ɏdzXˆØk*ÇÚ{#ñ‰pã(€¶‡9ý'šÜ³½¯kƒ†Â’ëSOƒ•Å®H6+a¢µˆ‹Y¨b˜b+XˆÖ!°u!¢"µˆˆn2ˆ Å0Ä`Å Ô®c(ÓÜGº•Ä»Œ âWî%q.áÐÄ÷î%umÍ£+ÜQ,Vn¦-GphU¸¢X­&,Gt ·K¢ÅÅ·¥RÄÊÉbKn N­R2g$VµÕó Qr#–ÓZUÏð0ÎtÙÀœz ëöo“Îk¯n„T°"SÞ+³/…€½"ižãO%Í%&Δâ‘ËØ´IˆÓ°Ë‰ÞM3.™yçÁzit›`4C`k¢¼á!álÄï sÂ[×!¤l¾æo"ƒIÔ'@ªu)3›ô®“@Z à¾] üœ'‡4¸PÞkÁ-qÄH‰ÓÍBd´ÿ —¹°ÄA&ÊUC„öz‚‚RæŠtf¬>˜ÑidšEçÑL÷áý¡V±h§­c¿¥¨ƒ@g¼…Ýö^ÞËc.ž„æ“I[ ª+·zÐÒÚ,½Ð»¶€C›7jk$๖€Ž¾ÅÙpp¶ÍþéΤ ½ØÎŒq ñpæžÅ¥#Øâ49ÃÂK^MYV“,¶Éz_òæ:…;Õ«¦I3âJ£¤û5$7Èxün\â]Êe¯(Ÿ&Ž‹¶2<6Ćf× æ¢ƱqWı[(ÙÂŽç‚T7¨@ÈÉÍß‚ïÙ"&3TYlGށ†)†#5ŠA©^T2ÆÁ†)©†©†¤yGXÁ†©"†)©¼ÅV WS†#©]R–r‹q5ÕbâWþBh¯u+ªÅÄ×ü„nÑ^êkªÁj‰jeœWˆÕÕ`µDµ2Ì+Ä µDµµ5Ô{¤Þ0RF’H÷AÛ<ÊÁ§ ƈæ0Ñ£ê4 öÚµ[¬/1²€â<-¬šö²r×0o×w ´xÐÒË„ g01¬„åEM蛇Ã\6µE›‘fÙO k÷CºnÓ1`iîÒ² áÂ!ÑLÄÿ ³¬\õ*:M=Ç»c‹2[‰ØsÕLò\ŒK L^™üÄN\¶#» Ç\……ßïIœÉ$¸ÎñÍ®ÔHÇ Ûí/´>Li”„†g^$ 7NÍÑÑ2M2ªNg=k½Ð}Ÿl6‡ —JWˆ”ÞéT·+µ¦üÂFè¢Vs6ýÆ4»2+2IÝ9ô9®ÇGÙÇ1+Ä8;*Õ§ž½D*îÑWÚçá3Ma¤·ˆ¥t}š²Ü…Q+Æüµ8HíS”üxGéÁˆ¦Ël„éÈ 5 µÄƒ6äÜ(kIš¯S†fÖ&¸®×v|Äyˆ*禌Éù@7-®Ä[]ÎÖ¿ê`º…=:…žJVnݳvðÖKE¼‚ »mà ÷f®:Ë ™–4rð¡4` ܹçž~‹C=œ…¾Ïj|VDtK.ƒ"9 Ï ­–éXá³6WÒïIL-Ї Ç entity.label.class.php000064400000004562152266437620010777 0ustar00. /** * @package moodlecore * @subpackage backup-imscc * @copyright 2009 Mauro Rondinelli (mauro.rondinelli [AT] uvcms.com) * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.'); class cc_label extends entities { public function generate_node() { cc2moodle::log_action('Creating Labels mods'); $response = ''; $sheet_mod_label = cc2moodle::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_LABEL); if (!empty(cc2moodle::$instances['instances'][MOODLE_TYPE_LABEL])) { foreach (cc2moodle::$instances['instances'][MOODLE_TYPE_LABEL] as $instance) { $response .= $this->create_node_course_modules_mod_label($sheet_mod_label, $instance); } } return $response; } private function create_node_course_modules_mod_label($sheet_mod_label, $instance) { if ($instance['deep'] <= ROOT_DEEP) { return ''; } $find_tags = array('[#mod_instance#]', '[#mod_name#]', '[#mod_content#]', '[#date_now#]'); $title = isset($instance['title']) && !empty($instance['title']) ? $instance['title'] : 'Untitled'; $content = "\"Folder\" {$title}"; $replace_values = array($instance['instance'], self::safexml($title), self::safexml($content), time()); return str_replace($find_tags, $replace_values, $sheet_mod_label); } } entity11.lti.class.php000064400000011420152266437620010641 0ustar00. /** * @package moodlecore * @subpackage backup-imscc * @copyright 2011 Darko Miletic (dmiletic@moodlerooms.com) * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.'); class cc11_lti extends entities11 { public function generate_node() { cc2moodle::log_action('Creating BasicLTI mods'); $response = ''; if (!empty(cc2moodle::$instances['instances'][MOODLE_TYPE_LTI])) { foreach (cc2moodle::$instances['instances'][MOODLE_TYPE_LTI] as $instance) { $response .= $this->create_node_course_modules_mod_basiclti($instance); } } return $response; } private function create_node_course_modules_mod_basiclti($instance) { $sheet_mod_basiclti = cc112moodle::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_LTI); $topic_data = $this->get_basiclti_data($instance); $result = ''; if (!empty($topic_data)) { $find_tags = array('[#mod_instance#]' , '[#mod_basiclti_name#]' , '[#mod_basiclti_intro#]' , '[#mod_basiclti_timec#]' , '[#mod_basiclti_timem#]' , '[#mod_basiclti_toolurl#]', '[#mod_basiclti_icon#]' ); $replace_values = array($instance['instance'], $topic_data['title'], $topic_data['description'], time(),time(), $topic_data['launchurl'], $topic_data['icon'] ); $result = str_replace($find_tags, $replace_values, $sheet_mod_basiclti); } return $result; } protected function getValue($node, $default = '') { $result = $default; if (is_object($node) && ($node->length > 0) && !empty($node->item(0)->nodeValue)) { $result = htmlspecialchars(trim($node->item(0)->nodeValue), ENT_COMPAT, 'UTF-8', false); } return $result; } public function get_basiclti_data($instance) { $topic_data = array(); $basiclti_file = $this->get_external_xml($instance['resource_indentifier']); if (!empty($basiclti_file)) { $basiclti_file_path = cc2moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . $basiclti_file; $basiclti_file_dir = dirname($basiclti_file_path); $basiclti = $this->load_xml_resource($basiclti_file_path); if (!empty($basiclti)) { $xpath = cc2moodle::newx_path($basiclti, cc112moodle::$basicltins); $topic_title = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:title'),'Untitled'); $blti_description = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:description')); $launch_url = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:launch_url')); $launch_icon = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:icon')); $tool_raw = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:vendor/lticp:code'),null); $tool_url = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:vendor/lticp:url'),null); $tool_desc = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:vendor/lticp:description'),null); $topic_data['title' ] = $topic_title; $topic_data['description'] = $blti_description; $topic_data['launchurl' ] = $launch_url; $topic_data['icon' ] = $launch_icon; $topic_data['orgid' ] = $tool_raw; $topic_data['orgurl' ] = $tool_url; $topic_data['orgdesc' ] = $tool_desc; } } return $topic_data; } } entity11.resource.class.php000064400000020325152266437620011704 0ustar00. /** * @package moodlecore * @subpackage backup-imscc * @copyright 2009 Mauro Rondinelli (mauro.rondinelli [AT] uvcms.com) * @copyright 2011 Darko Miletic (dmiletic@moodlerooms.com) * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.'); class cc11_resource extends entities11 { public function generate_node() { cc112moodle::log_action('Creating Resource mods'); $response = ''; $sheet_mod_resource = cc112moodle::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_RESOURCE); if (!empty(cc112moodle::$instances['instances'][MOODLE_TYPE_RESOURCE])) { foreach (cc112moodle::$instances['instances'][MOODLE_TYPE_RESOURCE] as $instance) { $response .= $this->create_node_course_modules_mod_resource($sheet_mod_resource, $instance); } } return $response; } private function create_node_course_modules_mod_resource($sheet_mod_resource, $instance) { global $CFG; require_once($CFG->libdir.'/validateurlsyntax.php'); $link = ''; $mod_alltext = ''; $mod_summary = ''; $xpath = cc112moodle::newx_path(cc112moodle::$manifest, cc112moodle::$namespaces); if ($instance['common_cartriedge_type'] == cc112moodle::CC_TYPE_WEBCONTENT || $instance['common_cartriedge_type'] == cc112moodle::CC_TYPE_ASSOCIATED_CONTENT) { $resource = $xpath->query('/imscc:manifest/imscc:resources/imscc:resource[@identifier="' . $instance['resource_indentifier'] . '"]/@href'); if ($resource->length > 0) { $resource = !empty($resource->item(0)->nodeValue) ? $resource->item(0)->nodeValue : ''; } else { $resource = ''; } if (empty($resource)) { unset($resource); $resource = $xpath->query('/imscc:manifest/imscc:resources/imscc:resource[@identifier="' . $instance['resource_indentifier'] . '"]/imscc:file/@href'); if ($resource->length > 0) { $resource = !empty($resource->item(0)->nodeValue) ? $resource->item(0)->nodeValue : ''; } else { $resource = ''; } } if (!empty($resource)) { $link = $resource; } } if ($instance['common_cartriedge_type'] == cc112moodle::CC_TYPE_WEBLINK) { $external_resource = $xpath->query('/imscc:manifest/imscc:resources/imscc:resource[@identifier="' . $instance['resource_indentifier'] . '"]/imscc:file/@href')->item(0)->nodeValue; if ($external_resource) { $resource = $this->load_xml_resource(cc112moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . $external_resource); if (!empty($resource)) { $xpath = cc112moodle::newx_path($resource, cc112moodle::$resourcens); $resource = $xpath->query('/wl:webLink/wl:url/@href'); if ($resource->length > 0) { $rawlink = $resource->item(0)->nodeValue; if (!validateUrlSyntax($rawlink, 's+')) { $changed = rawurldecode($rawlink); if (validateUrlSyntax($changed, 's+')) { $link = $changed; } else { $link = 'http://invalidurldetected/'; } } else { $link = htmlspecialchars(trim($rawlink), ENT_COMPAT, 'UTF-8', false); } } } } } $find_tags = array('[#mod_instance#]', '[#mod_name#]', '[#mod_type#]', '[#mod_reference#]', '[#mod_summary#]', '[#mod_alltext#]', '[#mod_options#]', '[#date_now#]'); $mod_type = 'file'; $mod_options = 'objectframe'; $mod_reference = $link; //detected if we are dealing with html file if (!empty($link) && ($instance['common_cartriedge_type'] == cc112moodle::CC_TYPE_WEBCONTENT)) { $ext = strtolower(pathinfo($link, PATHINFO_EXTENSION)); if (in_array($ext, array('html', 'htm', 'xhtml'))) { $mod_type = 'html'; //extract the content of the file $rootpath = realpath(cc112moodle::$path_to_manifest_folder); $htmlpath = realpath($rootpath . DIRECTORY_SEPARATOR . $link); $dirpath = dirname($htmlpath); if (file_exists($htmlpath)) { $fcontent = file_get_contents($htmlpath); $mod_alltext = clean_param($this->prepare_content($fcontent), PARAM_CLEANHTML); $mod_reference = ''; $mod_options = ''; /** * try to handle embedded resources * images, linked static resources, applets, videos */ $doc = new DOMDocument(); $cdir = getcwd(); chdir($dirpath); try { $doc->loadHTML($mod_alltext); $xpath = new DOMXPath($doc); $attributes = array('href', 'src', 'background', 'archive', 'code'); $qtemplate = "//*[@##][not(contains(@##,'://'))]/@##"; $query = ''; foreach ($attributes as $attrname) { if (!empty($query)) { $query .= " | "; } $query .= str_replace('##', $attrname, $qtemplate); } $list = $xpath->query($query); $searches = array(); $replaces = array(); foreach ($list as $resrc) { $rpath = $resrc->nodeValue; $rtp = realpath($rpath); if (($rtp !== false) && is_file($rtp)) { //file is there - we are in business $strip = str_replace("\\", "/", str_ireplace($rootpath, '', $rtp)); $encoded_file = '$@FILEPHP@$'.str_replace('/', '$@SLASH@$', $strip); $searches[] = $resrc->nodeValue; $replaces[] = $encoded_file; } } $mod_alltext = str_replace($searches, $replaces, $mod_alltext); } catch (Exception $e) { //silence the complaints } chdir($cdir); $mod_alltext = self::safexml($mod_alltext); } } } $replace_values = array($instance['instance'], self::safexml($instance['title']), $mod_type, $mod_reference, '', $mod_alltext, $mod_options, time()); return str_replace($find_tags, $replace_values, $sheet_mod_resource); } } entities.class.php000064400000026110152266437620010222 0ustar00. /** * @package moodlecore * @subpackage backup-imscc * @copyright 2009 Mauro Rondinelli (mauro.rondinelli [AT] uvcms.com) * @copyright 2011 Darko Miletic (dmiletic@moodlerooms.com) * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.'); class entities { /** * Prepares convert for inclusion into XML * * @param string $value * @return string */ public static function safexml($value) { $result = htmlspecialchars(html_entity_decode($value, ENT_QUOTES, 'UTF-8'), ENT_NOQUOTES, 'UTF-8', false); return $result; } protected function prepare_content($content) { $result = $content; if (empty($result)) { return ''; } $encoding = null; $xml_error = new libxml_errors_mgr(); $dom = new DOMDocument(); $dom->validateOnParse = false; $dom->strictErrorChecking = false; if ($dom->loadHTML($content)) { $encoding = $dom->xmlEncoding; } if (empty($encoding)) { $encoding = mb_detect_encoding($content, 'auto', true); } if (!empty($encoding) && !mb_check_encoding($content, 'UTF-8')) { $result = mb_convert_encoding($content, 'UTF-8', $encoding); } // See if we can strip off body tag and anything outside of it. foreach (array('body', 'html') as $tagname) { $regex = str_replace('##', $tagname, "/<##[^>]*>(.+)<\/##>/is"); if (preg_match($regex, $result, $matches)) { $result = $matches[1]; break; } } return $result; } public function load_xml_resource($path_to_file) { $resource = new DOMDocument(); cc2moodle::log_action('Load the XML resource file: '.$path_to_file); if (!$resource->load($path_to_file)) { cc2moodle::log_action('Cannot load the XML resource file: ' . $path_to_file, false); } return $resource; } public function update_sources($html, $root_path = '') { $document = $this->load_html($html); $tags = array('img' => 'src' , 'a' => 'href'); foreach ($tags as $tag => $attribute) { $elements = $document->getElementsByTagName($tag); foreach ($elements as $element) { $attribute_value = $element->getAttribute($attribute); $protocol = parse_url($attribute_value, PHP_URL_SCHEME); if (empty($protocol)) { $attribute_value = str_replace("\$IMS-CC-FILEBASE\$", "", $attribute_value); $attribute_value = $this->full_path($root_path . "/" . $attribute_value, "/"); $attribute_value = "\$@FILEPHP@\$" . "/" . $attribute_value; } $element->setAttribute($attribute, $attribute_value); } } $html = $this->html_insidebody($document); return $html; } public function full_path($path, $dir_sep = DIRECTORY_SEPARATOR) { $token = '$IMS-CC-FILEBASE$'; $path = str_replace($token, '', $path); if (is_string($path) && ($path != '')) { $dot_dir = '.'; $up_dir = '..'; $length = strlen($path); $rtemp = trim($path); $start = strrpos($path, $dir_sep); $can_continue = ($start !== false); $result = $can_continue ? '' : $path; $rcount = 0; while ($can_continue) { $dir_part = ($start !== false) ? substr($rtemp, $start + 1, $length - $start) : $rtemp; $can_continue = ($dir_part !== false); if ($can_continue) { if ($dir_part != $dot_dir) { if ($dir_part == $up_dir) { $rcount++; } else { if ($rcount > 0) { $rcount --; } else { $result = ($result == '') ? $dir_part : $dir_part . $dir_sep . $result; } } } $rtemp = substr($path, 0, $start); $start = strrpos($rtemp, $dir_sep); $can_continue = (($start !== false) || (strlen($rtemp) > 0)); } } } return $result; } public function include_titles($html) { $document = $this->load_html($html); $images = $document->getElementsByTagName('img'); foreach ($images as $image) { $src = $image->getAttribute('src'); $alt = $image->getAttribute('alt'); $title = $image->getAttribute('title'); $filename = pathinfo($src); $filename = $filename['filename']; $alt = empty($alt) ? $filename : $alt; $title = empty($title) ? $filename : $title; $image->setAttribute('alt', $alt); $image->setAttribute('title', $title); } $html = $this->html_insidebody($document); return $html; } public function get_external_xml($identifier) { $xpath = cc2moodle::newx_path(cc2moodle::$manifest, cc2moodle::$namespaces); $files = $xpath->query('/imscc:manifest/imscc:resources/imscc:resource[@identifier="'. $identifier.'"]/imscc:file/@href'); if (empty($files)) { $response = ''; } else { $response = $files->item(0)->nodeValue; } return $response; } public function move_files($files, $destination_folder) { global $CFG, $OUTPUT; if (!empty($files)) { foreach ($files as $file) { $source = cc2moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . $file; $destination = $destination_folder . DIRECTORY_SEPARATOR . $file; $destination_directory = dirname($destination); cc2moodle::log_action('Copy the file: ' . $source . ' to ' . $destination); if (!file_exists($destination_directory)) { mkdir($destination_directory, $CFG->directorypermissions, true); } $copy_success = true; if (is_file($source)) { $copy_success = @copy($source, $destination); } if (!$copy_success) { echo $OUTPUT->notification('WARNING: Cannot copy the file ' . $source . ' to ' . $destination); cc2moodle::log_action('Cannot copy the file ' . $source . ' to ' . $destination, false); } } } } protected function get_all_files() { global $CFG; $all_files = array(); $xpath = cc2moodle::newx_path(cc2moodle::$manifest, cc2moodle::$namespaces); foreach (cc2moodle::$restypes as $type) { $files = $xpath->query('/imscc:manifest/imscc:resources/imscc:resource[@type="' . $type . '"]/imscc:file/@href'); if (!empty($files) && ($files->length > 0)) { foreach ($files as $file) { // Omit html files. $ext = strtolower(pathinfo($file->nodeValue, PATHINFO_EXTENSION)); if (in_array($ext, array('html', 'htm', 'xhtml'))) { continue; } $all_files[] = $file->nodeValue; } } unset($files); } // Are there any labels? $xquery = "//imscc:item/imscc:item/imscc:item[imscc:title][not(@identifierref)]"; $labels = $xpath->query($xquery); if (!empty($labels) && ($labels->length > 0)) { $tname = 'course_files'; $dpath = cc2moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . $tname; $rfpath = 'files.gif'; $fpath = $dpath . DIRECTORY_SEPARATOR . $rfpath; if (!file_exists($dpath)) { mkdir($dpath, $CFG->directorypermissions, true); } // Copy the folder.gif file. $folder_gif = "{$CFG->dirroot}/pix/i/files.gif"; copy($folder_gif, $fpath); $all_files[] = $rfpath; } $all_files = empty($all_files) ? '' : $all_files; return $all_files; } public function move_all_files() { $files = $this->get_all_files(); if (!empty($files)) { $this->move_files($files, cc2moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . 'course_files', true); } } /** * @param string $html * @return DOMDocument */ private function load_html($html) { // Need to make sure that the html passed has charset meta tag. $metatag = ''; if (strpos($html, $metatag) === false) { $html = ''.$metatag.''.$html.''; } $document = new DOMDocument(); @$document->loadHTML($html); return $document; } /** * @param DOMDocument $domdocument * @return string */ private function html_insidebody($domdocument) { $html = ''; $bodyitems = $domdocument->getElementsByTagName('body'); if ($bodyitems->length > 0) { $body = $bodyitems->item(0); $html = str_ireplace(array('', ''), '', $body->C14N()); } return $html; } public function generate_random_string($length = 6) { $response = ''; $source = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; if ($length > 0) { $response = ''; $source = str_split($source, 1); for ($i = 1; $i <= $length; $i++) { $num = mt_rand(1, count($source)); $response .= $source[$num - 1]; } } return $response; } public function truncate_text($text, $max, $remove_html) { if ($max > 10) { $text = substr($text, 0, ($max - 6)) . ' [...]'; } else { $text = substr($text, 0, $max); } $text = $remove_html ? strip_tags($text) : $text; return $text; } } cc_lib/cc_version1.php000064400000051247152266437620010731 0ustar00. /** * @package backup-convert * @subpackage cc-library * @copyright 2011 Darko Miletic * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ require_once('cc_utils.php'); require_once('cc_version_base.php'); require_once('cc_organization.php'); /** * Version 1 class of Common Cartridge * */ class cc_version1 extends cc_version_base { const webcontent = 'webcontent'; const questionbank = 'imsqti_xmlv1p2/imscc_xmlv1p0/question-bank'; const assessment = 'imsqti_xmlv1p2/imscc_xmlv1p0/assessment'; const associatedcontent = 'associatedcontent/imscc_xmlv1p0/learning-application-resource'; const discussiontopic = 'imsdt_xmlv1p0'; const weblink = 'imswl_xmlv1p0'; /** @var array CC URL profiles. */ protected $ccnsnames = []; public static $checker = array(self::webcontent, self::assessment, self::associatedcontent, self::discussiontopic, self::questionbank, self::weblink); /** * Validate if the type are valid or not * * @param string $type * @return bool */ public function valid($type) { return in_array($type, self::$checker); } public function __construct() { $this->ccnamespaces = array('imscc' => 'http://www.imsglobal.org/xsd/imscc/imscp_v1p1', 'lomimscc' => 'http://ltsc.ieee.org/xsd/imscc/LOM', 'lom' => 'http://ltsc.ieee.org/xsd/LOM', 'voc' => 'http://ltsc.ieee.org/xsd/LOM/vocab', 'xsi' => 'http://www.w3.org/2001/XMLSchema-instance' ); $this->ccnsnames = array( 'imscc' => 'http://www.imsglobal.org/profile/cc/ccv1p0/derived_schema/imscp_v1p2_localised.xsd', 'lom' => 'http://www.imsglobal.org/profile/cc/ccv1p0/derived_schema/domainProfile_2/lomLoose_localised.xsd', 'lomimscc' => 'http://www.imsglobal.org/profile/cc/ccv1p0/derived_schema/domainProfile_1/lomLoose_localised.xsd', 'voc' => 'http://www.imsglobal.org/profile/cc/ccv1p0/derived_schema/domainProfile_2/vocab/loose.xsd' ); $this->ccversion = '1.0.0'; $this->camversion = '1.0.0'; $this->_generator = 'Moodle 2 Common Cartridge generator'; } protected function on_create(DOMDocument &$doc, $rootmanifestnode = null, $nmanifestID = null) { $doc->formatOutput = true; $doc->preserveWhiteSpace = true; $this->manifestID = is_null($nmanifestID) ? cc_helpers::uuidgen('M_') : $nmanifestID; $mUUID = $doc->createAttribute('identifier'); $mUUID->nodeValue = $this->manifestID; if (is_null($rootmanifestnode)) { if (!empty($this->_generator)) { $comment = $doc->createComment($this->_generator); $doc->appendChild($comment); } $rootel = $doc->createElementNS($this->ccnamespaces['imscc'], 'manifest'); $rootel->appendChild($mUUID); $doc->appendChild($rootel); // Add all namespaces. foreach ($this->ccnamespaces as $key => $value) { $dummy_attr = $key.":dummy"; $doc->createAttributeNS($value, $dummy_attr); } // Add location of schemas. $schemaLocation = ''; foreach ($this->ccnsnames as $key => $value) { $vt = empty($schemaLocation) ? '' : ' '; $schemaLocation .= $vt.$this->ccnamespaces[$key].' '.$value; } $aSchemaLoc = $doc->createAttributeNS($this->ccnamespaces['xsi'], 'xsi:schemaLocation'); $aSchemaLoc->nodeValue = $schemaLocation; $rootel->appendChild($aSchemaLoc); } else { $rootel = $doc->createElementNS($this->ccnamespaces['imscc'], 'imscc:manifest'); $rootel->appendChild($mUUID); } $metadata = $doc->createElementNS($this->ccnamespaces['imscc'], 'metadata'); $schema = $doc->createElementNS($this->ccnamespaces['imscc'], 'schema', 'IMS Common Cartridge'); $schemaversion = $doc->createElementNS($this->ccnamespaces['imscc'], 'schemaversion', $this->ccversion); $metadata->appendChild($schema); $metadata->appendChild($schemaversion); $rootel->appendChild($metadata); if (!is_null($rootmanifestnode)) { $rootmanifestnode->appendChild($rootel); } $organizations = $doc->createElementNS($this->ccnamespaces['imscc'], 'organizations'); $rootel->appendChild($organizations); $resources = $doc->createElementNS($this->ccnamespaces['imscc'], 'resources'); $rootel->appendChild($resources); return true; } protected function update_attribute(DOMDocument &$doc, $attrname, $attrvalue, DOMElement &$node) { $busenew = (is_object($node) && $node->hasAttribute($attrname)); $nResult = null; if (!$busenew && is_null($attrvalue)) { $node->removeAttribute($attrname); } else { $nResult = $busenew ? $node->getAttributeNode($attrname) : $doc->createAttribute($attrname); $nResult->nodeValue = $attrvalue; if (!$busenew) { $node->appendChild($nResult); } } return $nResult; } protected function update_attribute_ns(DOMDocument &$doc, $attrname, $attrnamespace,$attrvalue, DOMElement &$node) { $busenew = (is_object($node) && $node->hasAttributeNS($attrnamespace, $attrname)); $nResult = null; if (!$busenew && is_null($attrvalue)) { $node->removeAttributeNS($attrnamespace, $attrname); } else { $nResult = $busenew ? $node->getAttributeNodeNS($attrnamespace, $attrname) : $doc->createAttributeNS($attrnamespace, $attrname); $nResult->nodeValue = $attrvalue; if (!$busenew) { $node->appendChild($nResult); } } return $nResult; } protected function get_child_node(DOMDocument &$doc, $itemname, DOMElement &$node) { $nlist = $node->getElementsByTagName($itemname); $item = is_object($nlist) && ($nlist->length > 0) ? $nlist->item(0) : null; return $item; } protected function update_child_item(DOMDocument &$doc, $itemname, $itemvalue, DOMElement &$node, $attrtostore=null) { $tnode = $this->get_child_node($doc, 'title', $node); $usenew = is_null($tnode); $tnode = $usenew ? $doc->createElementNS($this->ccnamespaces['imscc'], $itemname) : $tnode; if (!is_null($attrtostore)) { foreach ($attrtostore as $key => $value) { $this->update_attribute($doc, $key, $value, $tnode); } } $tnode->nodeValue = $itemvalue; if ($usenew) { $node->appendChild($tnode); } } protected function update_items($items, DOMDocument &$doc, DOMElement &$xmlnode) { foreach ($items as $key => $item) { $itemnode = $doc->createElementNS($this->ccnamespaces['imscc'], 'item'); $this->update_attribute($doc, 'identifier' , $key , $itemnode); $this->update_attribute($doc, 'identifierref', $item->identifierref, $itemnode); $this->update_attribute($doc, 'parameters' , $item->parameters , $itemnode); if (!empty($item->title)) { $titlenode = $doc->createElementNS($this->ccnamespaces['imscc'], 'title', $item->title); $itemnode->appendChild($titlenode); } if ($item->has_child_items()) { $this->update_items($item->childitems, $doc, $itemnode); } $xmlnode->appendChild($itemnode); } } /** * Create a Resource (How to) * * @param cc_i_resource $res * @param DOMDocument $doc * @param object $xmlnode * @return DOMNode */ protected function create_resource(cc_i_resource &$res, DOMDocument &$doc, $xmlnode=null) { $usenew = is_object($xmlnode); $dnode = $usenew ? $xmlnode : $doc->createElementNS($this->ccnamespaces['imscc'], "resource"); $this->update_attribute($doc, 'identifier', $res->identifier, $dnode); $this->update_attribute($doc, 'type', $res->type, $dnode); !is_null($res->href) ? $this->update_attribute($doc, 'href', $res->href, $dnode) : null; $this->update_attribute($doc, 'base', $res->base, $dnode); foreach ($res->files as $file) { $nd = $doc->createElementNS($this->ccnamespaces['imscc'], 'file'); $ndatt = $doc->createAttribute('href'); $ndatt->nodeValue = $file; $nd->appendChild($ndatt); $dnode->appendChild($nd); } $this->resources[$res->identifier] = $res; $this->resources_ind[$res->files[0]] = $res->identifier; foreach ($res->dependency as $dependency) { $nd = $doc->createElementNS($this->ccnamespaces['imscc'], 'dependency'); $ndatt = $doc->createAttribute('identifierref'); $ndatt->nodeValue = $dependency; $nd->appendChild($ndatt); $dnode->appendChild($nd); } return $dnode; } /** * Create an Item Folder (How To) * * @param cc_i_organization $org * @param DOMDocument $doc * @param DOMElement $xmlnode */ protected function create_item_folder(cc_i_organization &$org, DOMDocument &$doc, ?DOMElement &$xmlnode = null) { $itemfoldernode = $doc->createElementNS($this->ccnamespaces['imscc'], 'item'); $this->update_attribute($doc, 'identifier', "root", $itemfoldernode); if ($org->has_items()) { $this->update_items($org->itemlist, $doc, $itemfoldernode); } if (is_null($this->organizations)) { $this->organizations = array(); } $this->organizations[$org->identifier] = $org; $xmlnode->appendChild($itemfoldernode); } /** * Create an Organization (How To) * * @param cc_i_organization $org * @param DOMDocument $doc * @param object $xmlnode * @return DOMNode */ protected function create_organization(cc_i_organization &$org, DOMDocument &$doc, $xmlnode = null) { $usenew = is_object($xmlnode); $dnode = $usenew ? $xmlnode : $doc->createElementNS($this->ccnamespaces['imscc'], "organization"); $this->update_attribute($doc, 'identifier', $org->identifier, $dnode); $this->update_attribute($doc, 'structure', $org->structure, $dnode); $this->create_item_folder($org, $doc, $dnode); return $dnode; } /** * Create Metadata For Manifest (How To) * * @param cc_i_metadata_manifest $met * @param DOMDocument $doc * @param object $xmlnode * @return DOMNode */ protected function create_metadata_manifest(cc_i_metadata_manifest $met, DOMDocument &$doc, $xmlnode = null) { $dnode = $doc->createElementNS($this->ccnamespaces['lomimscc'], "lom"); if (!empty($xmlnode)) { $xmlnode->appendChild($dnode); } $dnodegeneral = empty($met->arraygeneral) ? null : $this->create_metadata_general($met, $doc, $xmlnode); $dnodetechnical = empty($met->arraytech) ? null : $this->create_metadata_technical($met, $doc, $xmlnode); $dnoderights = empty($met->arrayrights) ? null : $this->create_metadata_rights($met, $doc, $xmlnode); $dnodelifecycle = empty($met->arraylifecycle) ? null : $this->create_metadata_lifecycle($met, $doc, $xmlnode); !is_null($dnodegeneral) ? $dnode->appendChild($dnodegeneral) : null; !is_null($dnodetechnical) ? $dnode->appendChild($dnodetechnical) : null; !is_null($dnoderights) ? $dnode->appendChild($dnoderights) : null; !is_null($dnodelifecycle) ? $dnode->appendChild($dnodelifecycle) : null; return $dnode; } /** * Create Metadata For Resource (How To) * * @param cc_i_metadata_resource $met * @param DOMDocument $doc * @param object $xmlnode * @return DOMNode */ protected function create_metadata_resource(cc_i_metadata_resource $met, DOMDocument &$doc, $xmlnode = null) { $dnode = $doc->createElementNS($this->ccnamespaces['lom'], "lom"); !empty($xmlnode) ? $xmlnode->appendChild($dnode) : null; !empty($met->arrayeducational) ? $this->create_metadata_educational($met, $doc, $dnode) : null; return $dnode; } /** * Create Metadata For File (How To) * * @param cc_i_metadata_file $met * @param DOMDocument $doc * @param Object $xmlnode * @return DOMNode */ protected function create_metadata_file(cc_i_metadata_file $met, DOMDocument &$doc, $xmlnode = null) { $dnode = $doc->createElementNS($this->ccnamespaces['lom'], "lom"); !empty($xmlnode) ? $xmlnode->appendChild($dnode) : null; !empty($met->arrayeducational) ? $this->create_metadata_educational($met, $doc, $dnode) : null; return $dnode; } /** * Create General Metadata (How To) * * @param object $met * @param DOMDocument $doc * @param object $xmlnode * @return DOMNode */ protected function create_metadata_general($met, DOMDocument &$doc, $xmlnode) { $nd = $doc->createElementNS($this->ccnamespaces['lomimscc'], 'general'); foreach ($met->arraygeneral as $name => $value) { !is_array($value) ? $value = array($value) : null; foreach ($value as $v) { if ($name != 'language' && $name != 'catalog' && $name != 'entry') { $nd2 = $doc->createElementNS($this->ccnamespaces['lomimscc'], $name); $nd3 = $doc->createElementNS($this->ccnamespaces['lomimscc'], 'string', $v[1]); $ndatt = $doc->createAttribute('language'); $ndatt->nodeValue = $v[0]; $nd3->appendChild($ndatt); $nd2->appendChild($nd3); $nd->appendChild($nd2); } else { if ($name == 'language') { $nd2 = $doc->createElementNS($this->ccnamespaces['lomimscc'], $name, $v[0]); $nd->appendChild($nd2); } } } } if (!empty($met->arraygeneral['catalog']) || !empty($met->arraygeneral['entry'])) { $nd2 = $doc->createElementNS($this->ccnamespaces['lomimscc'], 'identifier'); $nd->appendChild($nd2); if (!empty($met->arraygeneral['catalog'])) { $nd3 = $doc->createElementNS($this->ccnamespaces['lomimscc'], 'catalog', $met->arraygeneral['catalog'][0][0]); $nd2->appendChild($nd3); } if (!empty($met->arraygeneral['entry'])) { $nd4 = $doc->createElementNS($this->ccnamespaces['lomimscc'], 'entry', $met->arraygeneral['entry'][0][0]); $nd2->appendChild($nd4); } } return $nd; } /** * Create Technical Metadata (How To) * * @param object $met * @param DOMDocument $doc * @param object $xmlnode * @return DOMNode */ protected function create_metadata_technical($met, DOMDocument &$doc, $xmlnode) { $nd = $doc->createElementNS($this->ccnamespaces['lomimscc'], 'technical'); $xmlnode->appendChild($nd); foreach ($met->arraytech as $name => $value) { !is_array($value) ? $value = array($value) : null; foreach ($value as $v) { $nd2 = $doc->createElementNS($this->ccnamespaces['lomimscc'], $name, $v[0]); $nd->appendChild($nd2); } } return $nd; } /** * Create Rights Metadata (How To) * * @param object $met * @param DOMDocument $doc * @param object $xmlnode * @return DOMNode */ protected function create_metadata_rights($met, DOMDocument &$doc, $xmlnode) { $nd = $doc->createElementNS($this->ccnamespaces['lomimscc'], 'rights'); foreach ($met->arrayrights as $name => $value) { !is_array($value) ? $value = array($value) : null; foreach ($value as $v) { if ($name == 'description') { $nd2 = $doc->createElementNS($this->ccnamespaces['lomimscc'], $name); $nd3 = $doc->createElementNS($this->ccnamespaces['lomimscc'], 'string', $v[1]); $ndatt = $doc->createAttribute('language'); $ndatt->nodeValue = $v[0]; $nd3->appendChild($ndatt); $nd2->appendChild($nd3); $nd->appendChild($nd2); } else if ($name == 'copyrightAndOtherRestrictions' || $name == 'cost') { $nd2 = $doc->createElementNS($this->ccnamespaces['lomimscc'], $name); $nd3 = $doc->createElementNS($this->ccnamespaces['lomimscc'], 'value', $v[0]); $nd2->appendChild($nd3); $nd->appendChild($nd2); } } } return $nd; } /** * Create Lifecycle Metadata (How To) * * @param object $met * @param DOMDocument $doc * @param object $xmlnode * @return DOMNode */ protected function create_metadata_lifecycle($met, DOMDocument &$doc, $xmlnode) { $nd = $doc->createElementNS($this->ccnamespaces['lomimscc'], 'lifeCycle'); $nd2 = $doc->createElementNS($this->ccnamespaces['lomimscc'], 'contribute'); $nd->appendChild($nd2); $xmlnode->appendChild($nd); foreach ($met->arraylifecycle as $name => $value) { !is_array($value) ? $value = array($value) : null; foreach ($value as $v) { if ($name == 'role') { $nd3 = $doc->createElementNS($this->ccnamespaces['lomimscc'], $name); $nd2->appendChild($nd3); $nd4 = $doc->createElementNS($this->ccnamespaces['lomimscc'], 'value', $v[0]); $nd3->appendChild($nd4); } else { if ($name == 'date') { $nd3 = $doc->createElementNS($this->ccnamespaces['lomimscc'], $name); $nd2->appendChild($nd3); $nd4 = $doc->createElementNS($this->ccnamespaces['lomimscc'], 'dateTime', $v[0]); $nd3->appendChild($nd4); } else { $nd3 = $doc->createElementNS($this->ccnamespaces['lomimscc'], $name, $v[0]); $nd2->appendChild($nd3); } } } } return $nd; } /** * Create Education Metadata (How To) * * @param object $met * @param DOMDocument $doc * @param object $xmlnode * @return DOMNode */ public function create_metadata_educational($met, DOMDocument &$doc, $xmlnode) { $nd = $doc->createElementNS($this->ccnamespaces['lom'], 'educational'); $nd2 = $doc->createElementNS($this->ccnamespaces['lom'], 'intendedEndUserRole'); $nd3 = $doc->createElementNS($this->ccnamespaces['voc'], 'vocabulary'); $xmlnode->appendChild($nd); $nd->appendChild($nd2); $nd2->appendChild($nd3); foreach ($met->arrayeducational as $name => $value) { !is_array($value) ? $value = array($value) : null; foreach ($value as $v) { $nd4 = $doc->createElementNS($this->ccnamespaces['voc'], $name, $v[0]); $nd3->appendChild($nd4); } } return $nd; } }cc_lib/cc_weblink.php000064400000007024152266437620010610 0ustar00. /** * @package backup-convert * @subpackage cc-library * @copyright 2011 Darko Miletic * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ require_once 'cc_general.php'; class url1_resurce_file extends general_cc_file { const deafultname = 'weblink.xml'; protected $rootns = 'wl'; protected $rootname = 'wl:webLink'; protected $ccnamespaces = array('wl' => 'http://www.imsglobal.org/xsd/imswl_v1p0', 'xsi' => 'http://www.w3.org/2001/XMLSchema-instance'); protected $ccnsnames = array('wl' => 'http://www.imsglobal.org/profile/cc/ccv1p0/derived_schema/domainProfile_5/imswl_v1p0_localised.xsd'); protected $url = null; protected $title = null; protected $href = null; protected $target = '_self'; protected $window_features = null; /** * * Set the url title * @param string $title */ public function set_title($title) { $this->title = self::safexml($title); } /** * * Set the url specifics * @param string $url * @param string $target * @param string $window_features */ public function set_url($url, $target='_self', $window_features=null) { $this->url = $url; $this->target = $target; $this->window_features = $window_features; } protected function on_save() { $this->append_new_element($this->root, 'title', $this->title); $url = $this->append_new_element($this->root, 'url'); $this->append_new_attribute($url, 'href', $this->url); if (!empty($this->target)) { $this->append_new_attribute($url, 'target', $this->target); } if (!empty($this->window_features)) { $this->append_new_attribute($url, 'windowFeatures', $this->window_features); } return true; } } class url11_resurce_file extends url1_resurce_file { protected $rootname = 'webLink'; protected $ccnamespaces = array('wl' => 'http://www.imsglobal.org/xsd/imsccv1p1/imswl_v1p1', 'xsi' => 'http://www.w3.org/2001/XMLSchema-instance'); protected $ccnsnames = array('wl' => 'http://www.imsglobal.org/profile/cc/ccv1p1/ccv1p1_imswl_v1p1.xsd'); protected function on_save() { $rns = $this->ccnamespaces[$this->rootns]; $this->append_new_element_ns($this->root, $rns, 'title', $this->title); $url = $this->append_new_element_ns($this->root, $rns, 'url'); $this->append_new_attribute_ns($url, $rns, 'href', $this->url); if (!empty($this->target)) { $this->append_new_attribute_ns($url, $rns, 'target', $this->target); } if (!empty($this->window_features)) { $this->append_new_attribute_ns($url, $rns, 'windowFeatures', $this->window_features); } return true; } } cc_lib/cc_version11.php000064400000012227152266437620011005 0ustar00. /** * @package backup-convert * @subpackage cc-library * @copyright 2011 Darko Miletic * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ require_once('cc_version1.php'); /** * Version 1.1 class of Common Cartridge * */ class cc_version11 extends cc_version1 { const webcontent = 'webcontent'; const questionbank = 'imsqti_xmlv1p2/imscc_xmlv1p1/question-bank'; const assessment = 'imsqti_xmlv1p2/imscc_xmlv1p1/assessment'; const associatedcontent = 'associatedcontent/imscc_xmlv1p1/learning-application-resource'; const discussiontopic = 'imsdt_xmlv1p1'; const weblink = 'imswl_xmlv1p1'; const basiclti = 'imsbasiclti_xmlv1p0'; public static $checker = array(self::webcontent, self::assessment, self::associatedcontent, self::discussiontopic, self::questionbank, self::weblink, self::basiclti); /** * Validate if the type are valid or not * * @param string $type * @return bool */ public function valid($type) { return in_array($type, self::$checker); } public function __construct() { $this->ccnamespaces = array('imscc' => 'http://www.imsglobal.org/xsd/imsccv1p1/imscp_v1p1', 'lomimscc' => 'http://ltsc.ieee.org/xsd/imsccv1p1/LOM/manifest' , 'lom' => 'http://ltsc.ieee.org/xsd/imsccv1p1/LOM/resource' , 'xsi' => 'http://www.w3.org/2001/XMLSchema-instance' ); $this->ccnsnames = array('imscc' => 'http://www.imsglobal.org/profile/cc/ccv1p1/ccv1p1_imscp_v1p2_v1p0.xsd' , 'lomimscc' => 'http://www.imsglobal.org/profile/cc/ccv1p1/LOM/ccv1p1_lommanifest_v1p0.xsd', 'lom' => 'http://www.imsglobal.org/profile/cc/ccv1p1/LOM/ccv1p1_lomresource_v1p0.xsd' ); $this->ccversion = '1.1.0'; $this->camversion = '1.1.0'; $this->_generator = 'Moodle 2 Common Cartridge generator'; } protected function update_items($items, DOMDocument &$doc, DOMElement &$xmlnode) { foreach ($items as $key => $item) { $itemnode = $doc->createElementNS($this->ccnamespaces['imscc'], 'item'); $this->update_attribute($doc, 'identifier' , $key , $itemnode); $this->update_attribute($doc, 'identifierref', $item->identifierref, $itemnode); if (!is_null($item->title)) { $titlenode = $doc->createElementNS($this->ccnamespaces['imscc'], 'title'); $titlenode->appendChild(new DOMText($item->title)); $itemnode->appendChild($titlenode); } if ($item->has_child_items()) { $this->update_items($item->childitems, $doc, $itemnode); } $xmlnode->appendChild($itemnode); } } /** * Create Education Metadata (How To) * * @param object $met * @param DOMDocument $doc * @param object $xmlnode * @return DOMNode */ public function create_metadata_educational($met, DOMDocument &$doc, $xmlnode) { $metadata = $doc->createElementNS($this->ccnamespaces['imscc'], 'metadata'); $xmlnode->insertBefore($metadata, $xmlnode->firstChild); $lom = $doc->createElementNS($this->ccnamespaces['lom'], 'lom'); $metadata->appendChild($lom); $educational = $doc->createElementNS($this->ccnamespaces['lom'], 'educational'); $lom->appendChild($educational); foreach ($met->arrayeducational as $value) { !is_array($value) ? $value = array($value) : null; foreach ($value as $v) { $userrole = $doc->createElementNS($this->ccnamespaces['lom'], 'intendedEndUserRole'); $educational->appendChild($userrole); $nd4 = $doc->createElementNS($this->ccnamespaces['lom'], 'source', 'IMSGLC_CC_Rolesv1p1'); $nd5 = $doc->createElementNS($this->ccnamespaces['lom'], 'value', $v[0]); $userrole->appendChild($nd4); $userrole->appendChild($nd5); } } return $metadata; } } cc_lib/cc_converter_page.php000064400000004652152266437620012164 0ustar00. /** * @package backup-convert * @subpackage cc-library * @copyright 2011 Darko Miletic * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ require_once 'cc_converters.php'; require_once 'cc_general.php'; require_once 'cc_page.php'; class cc_converter_page extends cc_converter { public function __construct(cc_i_item &$item, cc_i_manifest &$manifest, $rootpath, $path){ $this->cc_type = cc_version11::webcontent; $this->defaultfile = 'page.xml'; $this->defaultname = uniqid().'.html'; parent::__construct($item, $manifest, $rootpath, $path); } public function convert($outdir) { $rt = new page11_resurce_file(); $title = $this->doc->nodeValue('/activity/page/name'); $intro = $this->doc->nodeValue('/activity/page/intro'); $contextid = $this->doc->nodeValue('/activity/@contextid'); $pagecontent = $this->doc->nodeValue('/activity/page/content'); $rt->set_title($title); $rawname = str_replace(' ', '_', strtolower(trim(clean_param($title, PARAM_FILE)))); if (!empty($rawname)) { $this->defaultname = $rawname.".html"; } $result = cc_helpers::process_linked_files( $pagecontent, $this->manifest, $this->rootpath, $contextid, $outdir, true); $rt->set_content($result[0]); $rt->set_intro($intro); //store everything $this->store($rt, $outdir, $title, $result[1]); return true; } } cc_lib/cc_general.php000064400000004703152266437620010573 0ustar00. /** * @package backup-convert * @subpackage cc-library * @copyright 2011 Darko Miletic * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ require_once 'gral_lib/cssparser.php'; require_once 'xmlbase.php'; class general_cc_file extends XMLGenericDocument { /** * * Root element * @var DOMElement */ protected $root = null; protected $rootns = null; protected $rootname = null; protected $ccnamespaces = array(); protected $ccnsnames = array(); public function __construct() { parent::__construct(); foreach ($this->ccnamespaces as $key => $value){ $this->registerNS($key,$value); } } protected function on_create() { $rootel = $this->append_new_element_ns($this->doc, $this->ccnamespaces[$this->rootns], $this->rootname); //add all namespaces foreach ($this->ccnamespaces as $key => $value) { $dummy_attr = "{$key}:dummy"; $this->doc->createAttributeNS($value,$dummy_attr); } // add location of schemas $schemaLocation=''; foreach ($this->ccnsnames as $key => $value) { $vt = empty($schemaLocation) ? '' : ' '; $schemaLocation .= $vt.$this->ccnamespaces[$key].' '.$value; } if (!empty($schemaLocation) && isset($this->ccnamespaces['xsi'])) { $this->append_new_attribute_ns($rootel, $this->ccnamespaces['xsi'], 'xsi:schemaLocation', $schemaLocation); } $this->root = $rootel; } } cc_lib/cc_converter_quiz.php000064400000007722152266437620012241 0ustar00. /** * @package backup-convert * @subpackage cc-library * @copyright 2012 Darko Miletic * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ require_once('cc_converters.php'); require_once('cc_general.php'); require_once('cc_asssesment.php'); require_once('cc_assesment_truefalse.php'); require_once('cc_assesment_essay.php'); require_once('cc_assesment_sfib.php'); class cc_converter_quiz extends cc_converter { public function __construct(cc_i_item &$item, cc_i_manifest &$manifest, $rootpath, $path) { $this->cc_type = cc_version11::assessment; $this->defaultfile = 'quiz.xml'; $this->defaultname = assesment11_resurce_file::deafultname; parent::__construct($item, $manifest, $rootpath, $path); } public function convert($outdir) { $rt = new assesment11_resurce_file(); $title = $this->doc->nodeValue('/activity/quiz/name'); $rt->set_title($title); // Metadata. $metadata = new cc_assesment_metadata(); $rt->set_metadata($metadata); $metadata->enable_feedback(); $metadata->enable_hints(); $metadata->enable_solutions(); // Attempts. $max_attempts = (int)$this->doc->nodeValue('/activity/quiz/attempts_number'); if ($max_attempts > 0) { // Qti does not support number of specific attempts bigger than 5 (??) if ($max_attempts > 5) { $max_attempts = cc_qti_values::unlimited; } $metadata->set_maxattempts($max_attempts); } // Time limit must be converted into minutes. $timelimit = (int)floor((int)$this->doc->nodeValue('/activity/quiz/timelimit') / 60); if ($timelimit > 0) { $metadata->set_timelimit($timelimit); $metadata->enable_latesubmissions(false); } $contextid = $this->doc->nodeValue('/activity/@contextid'); $result = cc_helpers::process_linked_files( $this->doc->nodeValue('/activity/quiz/intro'), $this->manifest, $this->rootpath, $contextid, $outdir); cc_assesment_helper::add_assesment_description($rt, $result[0], cc_qti_values::htmltype); // Section. $section = new cc_assesment_section(); $rt->set_section($section); // Process the actual questions. $ndeps = cc_assesment_helper::process_questions($this->doc, $this->manifest, $section, $this->rootpath, $contextid, $outdir); if ($ndeps === false) { // No exportable questions in quiz or quiz has no questions // so just skip it. return true; } // Store any additional dependencies. $deps = array_merge($result[1], $ndeps); // Store everything. $this->store($rt, $outdir, $title, $deps); return true; } } cc_lib/cc_basiclti.php000064400000017652152266437620010757 0ustar00. /** * @package backup-convert * @copyright 2011 Darko Miletic * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ require_once 'cc_general.php'; class basicltil1_resurce_file extends general_cc_file { const deafultname = 'basiclti.xml'; protected $rootns = 'xmlns'; protected $rootname = 'cartridge_basiclti_link'; protected $ccnamespaces = array('xmlns' => 'http://www.imsglobal.org/xsd/imslticc_v1p0', 'blti' => 'http://www.imsglobal.org/xsd/imsbasiclti_v1p0', 'lticm' => 'http://www.imsglobal.org/xsd/imslticm_v1p0', 'lticp' => 'http://www.imsglobal.org/xsd/imslticp_v1p0', 'xsi' => 'http://www.w3.org/2001/XMLSchema-instance'); protected $ccnsnames = array('xmlns' => 'http://www.imsglobal.org/xsd/lti/ltiv1p0/imslticc_v1p0.xsd', 'blti' => 'http://www.imsglobal.org/xsd/lti/ltiv1p0/imsbasiclti_v1p0p1.xsd', 'lticm' => 'http://www.imsglobal.org/xsd/lti/ltiv1p0/imslticm_v1p0.xsd', 'lticp' => 'http://www.imsglobal.org/xsd/lti/ltiv1p0/imslticp_v1p0.xsd'); protected $title = 'Untitled'; protected $description = 'description'; protected $custom_properties = array(); protected $extension_properties = array(); protected $extension_platform = null; protected $launch_url = null; protected $secure_launch_url = null; protected $icon = null; protected $secure_icon = null; protected $vendor = false; protected $vendor_code = 'I'; protected $vendor_name = null; protected $vendor_description = null; protected $vendor_url = null; protected $vendor_contact = null; protected $cartridge_bundle = null; protected $cartridge_icon = null; public function set_title($title) { $this->title = self::safexml($title); } public function set_description($description) { $this->description = self::safexml($description); } public function set_launch_url($url) { $this->launch_url = $url; } public function set_secure_launch_url($url) { $this->secure_launch_url = $url; } public function set_launch_icon($icon) { $this->icon = $icon; } public function set_secure_launch_icon($icon) { $this->secure_icon = $icon; } public function set_vendor_code($code) { $this->vendor_code = $code; $this->vendor = true; } public function set_vendor_name($name) { $this->vendor_name = self::safexml($name); $this->vendor = true; } public function set_vendor_description($desc) { $this->vendor_description = self::safexml($desc); $this->vendor = true; } public function set_vendor_url($url) { $this->vendor_url = $url; $this->vendor = true; } public function set_vendor_contact($email) { $this->vendor_contact = array('email' => $email); $this->vendor = true; } public function add_custom_property($property, $value) { $this->custom_properties[$property] = $value; } public function add_extension($extension, $value) { $this->extension_properties[$extension] = $value; } public function set_extension_platform($value) { $this->extension_platform = $value; } public function set_cartridge_bundle($value) { $this->cartridge_bundle = $value; } public function set_cartridge_icon($value) { $this->cartridge_icon = $value; } protected function on_save() { //this has to be done like this since order of apearance of the tags is also mandatory //and specified in basiclti schema files //main items $rns = $this->ccnamespaces['blti']; $this->append_new_element_ns($this->root, $rns, 'title' , $this->title ); $this->append_new_element_ns($this->root, $rns, 'description', $this->description); //custom properties if (!empty($this->custom_properties)) { $custom = $this->append_new_element_ns($this->root, $rns, 'custom'); foreach ($this->custom_properties as $property => $value) { $node = $this->append_new_element_ns($custom, $this->ccnamespaces['lticm'], 'property' , $value); $this->append_new_attribute_ns($node, $this->ccnamespaces['xmlns'],'name', $property); } } //extension properties if (!empty($this->extension_properties)) { $extension = $this->append_new_element_ns($this->root, $rns, 'extensions'); if (!empty($this->extension_platform)) { $this->append_new_attribute_ns($extension, $this->ccnamespaces['xmlns'], 'platform', $this->extension_platform); } foreach ($this->extension_properties as $property => $value) { $node = $this->append_new_element_ns($extension, $this->ccnamespaces['lticm'], 'property' , $value); $this->append_new_attribute_ns($node, $this->ccnamespaces['xmlns'], 'name', $property); } } $this->append_new_element_ns($this->root, $rns, 'launch_url' , $this->launch_url ); if (!empty($this->secure_launch_url)) { $this->append_new_element_ns($this->root, $rns, 'secure_launch_url' , $this->secure_launch_url); } $this->append_new_element_ns($this->root, $rns, 'icon' , $this->icon ); if (!empty($this->secure_icon)) { $this->append_new_element_ns($this->root, $rns, 'secure_icon' , $this->secure_icon); } //vendor info $vendor = $this->append_new_element_ns($this->root, $rns, 'vendor'); $vcode = empty($this->vendor_code) ? 'I' : $this->vendor_code; $this->append_new_element_ns($vendor, $this->ccnamespaces['lticp'], 'code', $vcode); $this->append_new_element_ns($vendor, $this->ccnamespaces['lticp'], 'name', $this->vendor_name); if (!empty($this->vendor_description)) { $this->append_new_element_ns($vendor, $this->ccnamespaces['lticp'], 'description', $this->vendor_description); } if (!empty($this->vendor_url)) { $this->append_new_element_ns($vendor, $this->ccnamespaces['lticp'], 'url', $this->vendor_url); } if (!empty($this->vendor_contact)) { $vcontact = $this->append_new_element_ns($vendor, $this->ccnamespaces['lticp'], 'contact'); $this->append_new_element_ns($vcontact, $this->ccnamespaces['lticp'], 'email', $this->vendor_contact['email']); } //cartridge bundle and icon if (!empty($this->cartridge_bundle)) { $cbundle = $this->append_new_element_ns($this->root, $this->ccnamespaces['xmlns'], 'cartridge_bundle'); $this->append_new_attribute_ns($cbundle, $this->ccnamespaces['xmlns'], 'identifierref', $this->cartridge_bundle); } if (!empty($this->cartridge_icon)) { $cicon = $this->append_new_element_ns($this->root, $this->ccnamespaces['xmlns'], 'cartridge_icon'); $this->append_new_attribute_ns($cicon, $this->ccnamespaces['xmlns'], 'identifierref', $this->cartridge_icon); } return true; } } cc_lib/cc_organization.php000064400000020674152266437620011667 0ustar00. /** * @package backup-convert * @subpackage cc-library * @copyright 2011 Darko Miletic * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ require_once 'cc_utils.php'; require_once 'cc_version_base.php'; require_once 'cc_resources.php'; require_once 'cc_manifest.php'; /** * Organization Class * */ class cc_organization implements cc_i_organization { public $title = null; public $identifier = null; public $structure = null; public $itemlist = null; private $metadata = null; private $sequencing = null; /** @var bool true if empty, otherwise false. */ protected $isempty; public function __construct($node=null, $doc=null) { if (is_object($node) && is_object($doc)) { $this->process_organization($node,$doc); } else { $this->init_new(); } } /** * Add one Item into the Organization * * @param cc_i_item $item */ public function add_item(cc_i_item &$item) { if (is_null($this->itemlist)) { $this->itemlist = array(); } $this->itemlist[$item->identifier] = $item; } /** * Add new Item into the Organization * * @param string $title * @return cc_i_item */ public function add_new_item($title='') { $nitem = new cc_item(); $nitem->title = $title; $this->add_item($nitem); return $nitem; } public function has_items() { return is_array($this->itemlist) && (count($this->itemlist) > 0); } public function attr_value(&$nod, $name, $ns=null) { return is_null($ns) ? ($nod->hasAttribute($name) ? $nod->getAttribute($name) : null) : ($nod->hasAttributeNS($ns, $name) ? $nod->getAttributeNS($ns, $name) : null); } public function process_organization(&$node,&$doc) { $this->identifier = $this->attr_value($node,"identifier"); $this->structure = $this->attr_value($node,"structure"); $this->title = ''; $nlist = $node->getElementsByTagName('title'); if (is_object($nlist) && ($nlist->length > 0) ) { $this->title = $nlist->item(0)->nodeValue; } $nlist = $doc->nodeList("//imscc:organization[@identifier='".$this->identifier."']/imscc:item"); $this->itemlist=array(); foreach ($nlist as $item) { $this->itemlist[$item->getAttribute("identifier")] = new cc_item($item,$doc); } $this->isempty=false; } public function init_new() { $this->title = null; $this->identifier = cc_helpers::uuidgen('O_'); $this->structure = 'rooted-hierarchy'; $this->itemlist = null; $this->metadata = null; $this->sequencing = null; } public function uuidgen() { $uuid = sprintf('%04x%04x', mt_rand(0, 65535), mt_rand(0, 65535)); return strtoupper(trim($uuid)); } } /** * Item Class * */ class cc_item implements cc_i_item { public $identifier = null; public $identifierref = null; public $isvisible = null; public $title = null; public $parameters = null; public $childitems = null; private $parentItem = null; private $isempty = true; /** @var mixed node structure. */ public $structure; public function __construct($node=null,$doc=null) { if (is_object($node)) { $clname = get_class($node); if ($clname =='cc_resource') { $this->init_new_item(); $this->identifierref = $node->identifier; $this->title = is_string($doc) && (!empty($doc)) ? $doc : 'item'; } else if ($clname =='cc_manifest') { $this->init_new_item(); $this->identifierref = $node->manifestID(); $this->title = is_string($doc) && (!empty($doc)) ? $doc : 'item'; } else if ( is_object($doc)){ $this->process_item($node,$doc); } else { $this->init_new_item(); } } else { $this->init_new_item(); } } public function attr_value(&$nod, $name, $ns=null) { return is_null($ns) ? ($nod->hasAttribute($name) ? $nod->getAttribute($name) : null) : ($nod->hasAttributeNS($ns, $name) ? $nod->getAttributeNS($ns, $name) : null); } public function process_item(&$node,&$doc) { $this->identifier = $this->attr_value($node,"identifier"); $this->structure = $this->attr_value($node,"structure"); $this->identifierref = $this->attr_value($node,"identifierref"); $atr = $this->attr_value($node,"isvisible"); $this->isvisible = is_null($atr) ? true : $atr; $nlist = $node->getElementsByTagName('title'); if (is_object($nlist) && ($nlist->length > 0) ) { $this->title = $nlist->item(0)->nodeValue; } $nlist = $doc->nodeList("//imscc:item[@identifier='".$this->identifier."']/imscc:item"); if ($nlist->length > 0) { $this->childitems=array(); foreach ($nlist as $item) { $key=$this->attr_value($item,"identifier"); $this->childitems[$key] = new cc_item($item,$doc); } } $this->isempty = false; } /** * Add one Child Item * * @param cc_i_item $item */ public function add_child_item(cc_i_item &$item) { if (is_null($this->childitems)) { $this->childitems = array(); } $this->childitems[$item->identifier] = $item; } /** * Add new child Item * * @param string $title * @return cc_i_item */ public function add_new_child_item($title='') { $sc = new cc_item(); $sc->title = $title; $this->add_child_item($sc); return $sc; } public function attach_resource($resource) { if ($this->has_child_items()) { throw new Exception("Can not attach resource to item that contains other items!"); } $resident = null; if (is_string($resource)) { $resident = $resource; } else if (is_object($resource)) { $clname = get_class($resource); if ($clname == 'cc_resource') { $resident = $resource->identifier; } else if ($clname == 'cc_manifest') { $resident = $resource->manifestID(); } else { throw new Exception("Unable to attach resource. Invalid object."); } } if (is_null($resident) || (empty($resident))) { throw new Exception("Resource must have valid identifier!"); } $this->identifierref = $resident; } public function has_child_items() { return is_array($this->childitems) && (count($this->childitems) > 0); } public function child_item($identifier) { return $this->has_child_items() ? $this->childitems[$identifier] : null; } public function init_clean() { $this->identifier = null; $this->isvisible = null; $this->title = null; $this->parameters = null; $this->childitems = null; $this->parentItem = null; $this->isempty = true; } public function init_new_item() { $this->identifier = cc_helpers::uuidgen('I_'); $this->isvisible = true; //default is true $this->title = null; $this->parameters = null; $this->childitems = null; $this->parentItem = null; $this->isempty = false; } }cc_lib/cc_converter_url.php000064400000004430152266437620012044 0ustar00. /** * @package backup-convert * @subpackage cc-library * @copyright 2011 Darko Miletic * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ require_once 'cc_converters.php'; require_once 'cc_general.php'; require_once 'cc_weblink.php'; class cc_converter_url extends cc_converter { public function __construct(cc_i_item &$item, cc_i_manifest &$manifest, $rootpath, $path){ $this->cc_type = cc_version11::weblink; $this->defaultfile = 'url.xml'; $this->defaultname = 'weblink.xml'; parent::__construct($item, $manifest, $rootpath, $path); } public function convert($outdir) { $rt = new url11_resurce_file(); $title = $this->doc->nodeValue('/activity/url/name'); $rt->set_title($title); $url = $this->doc->nodeValue('/activity/url/externalurl'); if (!empty($url)) { /** * * Display value choices * 0 - automatic (system chooses what to do) (usualy defaults to the open) * 1 - embed - display within a frame * 5 - open - just open it full in the same frame * 6 - in popup - popup - new frame */ $display = intval($this->doc->nodeValue('/activity/forum/display')); $target = ($display == 6) ? '_blank' : '_self'; //TODO: Moodle also supports custom parameters //this should be transformed somehow into url where possible $rt->set_url($url, $target); } $this->store($rt, $outdir, $title); return true; } } cc_lib/cc_manifest.php000064400000027412152266437620010766 0ustar00. /** * Manifest management * * @package backup-convert * @subpackage cc-library * @copyright 2011 Darko Miletic * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ require_once('cc_utils.php'); require_once('xmlbase.php'); require_once('cc_resources.php'); require_once('cc_version_base.php'); require_once('gral_lib/pathutils.php'); /** * Manifest Class * */ class cc_manifest extends XMLGenericDocument implements cc_i_manifest { private $ccversion = null; private $ccobj = null; private $rootmanifest = null; private $activemanifest = null; private $parentmanifest = null; private $parentparentmanifest = null; private $ares = array(); private $mainidentifier = null; public function __construct($ccver = cc_version::v1, $activemanifest=null, $parentmanifest=null, $parentparentmanifest=null) { if (is_int($ccver)) { $this->ccversion=$ccver; $classname = "cc_version{$ccver}"; $this->ccobj = new $classname; parent::__construct('UTF-8', true); } else if (is_object($ccver) && (get_class($ccver)=='cc_manifest')) { $this->doc = $ccver->doc; $this->rootmanifest = $ccver->rootmanifest; $this->activemanifest = $activemanifest; $this->parentmanifest = $parentmanifest; $this->parentparentmanifest = $parentparentmanifest; $this->ccversion = $ccver->ccversion; $this->ccobj = $ccver; $this->register_namespaces_for_xpath(); } } /** * Register Namespace for use XPATH * */ public function register_namespaces_for_xpath() { $scnam = $this->activemanifest->get_cc_namespaces(); foreach ($scnam as $key => $value) { $this->registerNS($key, $value); } } /** * TODO - implement this method - critical * Enter description here ... */ private function fill_manifest() { } /** * Add Metadata For Manifest * * @param cc_i_metadata_manifest $met */ public function add_metadata_manifest(cc_i_metadata_manifest $met) { $metanode = $this->node("//imscc:manifest[@identifier='". $this->activemanifest->manifestID(). "']/imscc:metadata"); $nmeta = $this->activemanifest->create_metadata_node($met, $this->doc, $metanode); $metanode->appendChild($nmeta); } /** * Add Metadata For Resource * * @param cc_i_metadata_resource $met * @param string $identifier */ public function add_metadata_resource(cc_i_metadata_resource $met, $identifier) { $metanode = $this->node("//imscc:resource". "[@identifier='". $identifier. "']"); $metanode2 = $this->node("//imscc:resource". "[@identifier='". $identifier. "']/imscc:file"); $nspaces = $this->activemanifest->get_cc_namespaces(); $dnode = $this->append_new_element_ns($metanode2, $nspaces['imscc'], 'metadata'); $this->activemanifest->create_metadata_resource_node($met, $this->doc, $dnode); } /** * Add Metadata For File * * @param cc_i_metadata_file $met * @param string $identifier * @param string $filename */ public function add_metadata_file(cc_i_metadata_file $met, $identifier, $filename) { if (empty($met) || empty($identifier) || empty($filename)) { throw new Exception('Try to add a metadata file with nulls values given!'); } $metanode = $this->node("//imscc:resource". "[@identifier='". $identifier. "']/imscc:file". "[@href='". $filename. "']"); $nspaces = $this->activemanifest->get_cc_namespaces(); $dnode = $this->doc->createElementNS($nspaces['imscc'], "metadata"); $metanode->appendChild($dnode); $this->activemanifest->create_metadata_file_node($met, $this->doc, $dnode); } public function on_create() { $this->activemanifest = cc_builder_creator::factory($this->ccversion); $this->rootmanifest = $this->activemanifest; $result = $this->activemanifest->create_manifest($this->doc); $this->register_namespaces_for_xpath(); return $result; } public function get_relative_base_path() { return $this->activemanifest->base(); } public function parent_manifest() { return new cc_manifest($this, $this->parentmanifest, $this->parentparentmanifest); } public function root_manifest() { return new cc_manifest($this, $this->rootmanifest); } public function manifestID() { return $this->activemanifest->manifestID(); } public function get_manifest_namespaces() { return $this->rootmanifest->get_cc_namespaces(); } /** * Add a new organization * * @param cc_i_organization $org */ public function add_new_organization(cc_i_organization &$org) { $norg = $this->activemanifest->create_organization_node($org, $this->doc); $orgnode = $this->node("//imscc:manifest[@identifier='". $this->activemanifest->manifestID(). "']/imscc:organizations"); $orgnode->appendChild($norg); } public function get_resources($searchspecific='') { $reslist = $this->get_resource_list($searchspecific); $resourcelist = array(); foreach ($reslist as $resourceitem) { $resourcelist[] = new cc_resource($this, $resourceitem); } return $resourcelist; } public function get_cc_namespace_path($nsname) { if (is_string($nsname) && (!empty($nsname))) { $scnam = $this->activemanifest->get_cc_namespaces(); return $scnam[$nsname]; } return null; } public function get_resource_list($searchspecific = '') { return $this->nodeList("//imscc:manifest[@identifier='". $this->activemanifest->manifestID(). "']/imscc:resources/imscc:resource".$searchspecific); } public function on_load() { $this->register_namespaces_for_xpath(); $this->fill_manifest(); return true; } public function on_save() { return true; } /** * Add a resource to the manifest * * @param cc_i_resource $res * @param string $identifier * @param string $type * @return array */ public function add_resource(cc_i_resource $res, $identifier = null, $type = 'webcontent') { if (!$this->ccobj->valid($type)) { throw new Exception("Type invalid..."); } if ($res == null) { throw new Exception('Invalid Resource or dont give it'); } $rst = $res; // TODO: This has to be reviewed since it does not handle multiple files properly. // Dependencies. if (is_object($identifier)) { $this->activemanifest->create_resource_node($rst, $this->doc, $identifier); } else { $nresnode = null; $rst->type = $type; if (!cc_helpers::is_html($rst->filename)) { $rst->href = null; } $this->activemanifest->create_resource_node($rst, $this->doc, $nresnode); foreach ($rst->files as $file) { $ident = $this->get_identifier_by_filename($file); if ($ident == null) { $newres = new cc_resource($rst->manifestroot, $file); if (!cc_helpers::is_html($file)) { $newres->href = null; } $newres->type = 'webcontent'; $this->activemanifest->create_resource_node($newres, $this->doc, $nresnode); } } } $tmparray = array($rst->identifier, $rst->files[0]); return $tmparray; } private function check_if_exist_in_other($name, $identifier) { $status = array(); foreach ($this->activemanifest->resources as $value) { if (($value->identifier != $identifier) && isset($value->files[$name])) { $status[] = $value->identifier; } } return $status; } private function replace_file_x_dependency($depen, $name) { foreach ($depen as $key => $value) { ($key); $ident = $this->get_identifier_by_filename($name); $this->activemanifest->resources[$value]->files = $this->array_remove_by_value($this->activemanifest->resources[$value]->files, $name); if (!in_array($ident, $this->activemanifest->resources[$value]->dependency)) { array_push($this->activemanifest->resources[$value]->dependency, $ident); } } return true; } private function get_identifier_by_filename($name) { $result = null; if (isset($this->activemanifest->resources_ind[$name])) { $result = $this->activemanifest->resources_ind[$name]; } return $result; } private function array_remove_by_value($arr, $value) { return array_values(array_diff($arr, array($value))); } private function array_remove_by_key($arr, $key) { return array_values(array_diff_key($arr, array($key))); } public function update_instructoronly($identifier, $value = false) { if (isset($this->activemanifest->resources[$identifier])) { $resource = $this->activemanifest->resources[$identifier]; $resource->instructoronly = $value; } } /** * Append the resources nodes in the Manifest * * @return DOMNode */ public function put_nodes() { $resnodestr = "//imscc:manifest[@identifier='".$this->activemanifest->manifestID(). "']/imscc:resources"; $resnode = $this->node($resnodestr); foreach ($this->activemanifest->resources as $k => $v) { ($k); $depen = $this->check_if_exist_in_other($v->files[0], $v->identifier); if (!empty($depen)) { $this->replace_file_x_dependency($depen, $v->files[0]); $v->type = 'webcontent'; } } foreach ($this->activemanifest->resources as $node) { $rnode = $this->activemanifest->create_resource_node($node, $this->doc, null); $resnode->appendChild($rnode); if ($node->instructoronly) { $metafileceduc = new cc_metadata_resouce_educational(); $metafileceduc->set_value(intended_user_role::INSTRUCTOR); $metafile = new cc_metadata_resouce(); $metafile->add_metadata_resource_educational($metafileceduc); $this->activemanifest->create_metadata_educational($metafile, $this->doc, $rnode); } } return $resnode; } } cc_lib/cc_resources.php000064400000020060152266437620011162 0ustar00. /** * @package backup-convert * @subpackage cc-library * @copyright 2011 Darko Miletic * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ require_once('cc_interfaces.php'); require_once('xmlbase.php'); require_once('gral_lib/pathutils.php'); require_once('gral_lib/ccdependencyparser.php'); require_once('cc_version_base.php'); require_once('cc_version1.php'); require_once('cc_manifest.php'); /** * Common Cartridge Version * */ class cc_version{ const v1 = 1; const v11 = 11; } class cc1_resource_type { const webcontent = 'webcontent'; const questionbank = 'imsqti_xmlv1p2/imscc_xmlv1p0/question-bank'; const assessment = 'imsqti_xmlv1p2/imscc_xmlv1p0/assessment'; const associatedcontent = 'associatedcontent/imscc_xmlv1p0/learning-application-resource'; const discussiontopic = 'imsdt_xmlv1p0'; const weblink = 'imswl_xmlv1p0'; public static $checker = array(self::webcontent, self::assessment, self::associatedcontent, self::discussiontopic, self::questionbank, self::weblink); } class cc11_resource_type { const webcontent = 'webcontent'; const questionbank = 'imsqti_xmlv1p2/imscc_xmlv1p1/question-bank'; const assessment = 'imsqti_xmlv1p2/imscc_xmlv1p1/assessment'; const associatedcontent = 'associatedcontent/imscc_xmlv1p1/learning-application-resource'; const discussiontopic = 'imsdt_xmlv1p1'; const weblink = 'imswl_xmlv1p1'; const basiclti = 'imsbasiclti_xmlv1p0'; public static $checker = array(self::webcontent, self::assessment, self::associatedcontent, self::discussiontopic, self::questionbank, self::weblink, self::basiclti); } /** * Resource Class * */ class cc_resource implements cc_i_resource { public $identifier = null; public $type = null; public $dependency = array(); public $identifierref = null; public $href = null; public $base = null; public $persiststate = null; public $metadata = array(); public $filename = null; public $files = array(); public $isempty = null; public $manifestroot = null; public $folder = null; public $instructoronly = false; private $throwonerror = true; public function __construct($manifest, $file, $folder='', $throwonerror = true) { $this->throwonerror = $throwonerror; if (is_string($manifest)) { $this->folder = $folder; $this->process_resource($manifest, $file, $folder); $this->manifestroot = $manifest; } else if (is_object($manifest)) { $this->import_resource($file, $manifest); } } /** * Add resource * * @param string $fname * @param string $location */ public function add_resource($fname, $location ='') { $this->process_resource($fname, $location, null); } /** * Import a resource * * @param DOMElement $node * @param cc_i_manifest $doc */ public function import_resource(DOMElement &$node, cc_i_manifest &$doc) { $searchstr = "//imscc:manifest[@identifier='".$doc->manifestID(). "']/imscc:resources/imscc:resource"; $this->identifier = $this->get_attr_value($node, "identifier"); $this->type = $this->get_attr_value($node, "type"); $this->href = $this->get_attr_value($node, "href"); $this->base = $this->get_attr_value($node, "base"); $this->persiststate = null; $nodo = $doc->nodeList($searchstr."[@identifier='". $this->identifier."']/metadata/@href"); $this->metadata = $nodo->nodeValue; $this->filename = $this->href; $nlist = $doc->nodeList($searchstr."[@identifier='". $this->identifier."']/imscc:file/@href"); $this->files = array(); foreach ($nlist as $file) { $this->files[] = $file->nodeValue; } $nlist = $doc->nodeList($searchstr."[@identifier='". $this->identifier."']/imscc:dependency/@identifierref"); $this->dependency = array(); foreach ($nlist as $dependency) { $this->dependency[] = $dependency->nodeValue; } $this->isempty = false; } /** * Get a attribute value * * @param DOMElement $nod * @param string $name * @param string $ns * @return string */ public function get_attr_value(&$nod, $name, $ns=null) { if (is_null($ns)) { return ($nod->hasAttribute($name) ? $nod->getAttribute($name) : null); } return ($nod->hasAttributeNS($ns, $name) ? $nod->getAttributeNS($ns, $name) : null); } /** * Process a resource * * @param string $manifestroot * @param string $fname * @param string $folder */ public function process_resource($manifestroot, &$fname, $folder) { $file = empty($folder) ? $manifestroot.'/'.$fname : $manifestroot.'/'.$folder.'/'.$fname; if (!file_exists($file) && $this->throwonerror) { throw new Exception('The file doesnt exist!'); } GetDepFiles($manifestroot, $fname, $this->folder, $this->files); array_unshift($this->files, $folder.$fname); $this->init_empty_new(); $this->href = $folder.$fname; $this->identifierref = $folder.$fname; $this->filename = $fname; $this->isempty = false; $this->folder = $folder; } public function adjust_path($mroot, $fname) { $result = null; if (file_exists($fname->filename)) { $result = pathDiff($fname->filename, $mroot); } else if (file_exists($mroot.$fname->filename) || file_exists($mroot.DIRECTORY_SEPARATOR.$fname->filename)) { $result = $fname->filename; toUrlPath($result); $result = trim($result, "/"); } return $result; } public function init_clean() { $this->identifier = null; $this->type = null; $this->href = null; $this->base = null; $this->metadata = array(); $this->dependency = array(); $this->identifierref = null; $this->persiststate = null; $this->filename = ''; $this->files = array(); $this->isempty = true; } public function init_empty_new() { $this->identifier = cc_helpers::uuidgen('I_', '_R'); $this->type = null; $this->href = null; $this->persiststate = null; $this->filename = null; $this->isempty = false; $this->identifierref = null; } public function get_manifestroot() { return $this->manifestroot; } }cc_lib/cc_converter_label.php000064400000002630152266437620012321 0ustar00. /** * @package backup-convert * @subpackage cc-library * @copyright 2012 Darko Miletic * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ require_once 'cc_converters.php'; require_once 'cc_general.php'; class cc_converter_label extends cc_converter { public function __construct(cc_i_item &$item, cc_i_manifest &$manifest, $rootpath, $path){ $this->defaultfile = 'label.xml'; parent::__construct($item, $manifest, $rootpath, $path); } public function convert($outdir) { $resitem = new cc_item(); $resitem->title = $this->doc->nodeValue('/activity/label/name'); $this->item->add_child_item($resitem); return true; } }cc_lib/cc_metadata.php000064400000015070152266437620010735 0ustar00. /** * @package backup-convert * @subpackage cc-library * @copyright 2011 Darko Miletic * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ /** Defined as specified in CC 1.1 */ class intended_user_role { const LEARNER = 'Learner'; const INSTRUCTOR = 'Instructor'; const MENTOR = 'Mentor'; } class technical_role { const AUTHOR = 'author'; const PUBLISHER = 'publisher'; const UNKNOWN = 'unknown'; const INITIATOR = 'initiator'; const TERMINATOR = 'terminator'; const VALIDATOR = 'validator'; const EDITOR = 'editor'; const GRAPHICAL_DESIGNER = 'graphical designer'; const TECHNICAL_IMPLEMENTER = 'technical implementer'; const CONTENT_PROVIDER = 'content provider'; const TECHNICAL_VALIDATOR = 'technical validator'; const EDUCATION_VALIDATOR = 'educational validator'; const SCRIPT_WRITER = 'script writer'; const INSTRUCTIONAL_DESIGNER= 'instructional designer'; const SUBJET_MATTER_EXPERT = 'subject matter expert'; } class rights_copyright { const YES = 'yes'; const NO = 'no'; } class rights_cost { const YES = 'yes'; const NO = 'no'; } // Language identifier (as defined in ISO 639-1, ISO 639-2, and ISO 3166-1) class language_lom { const US_ENGLISH = 'en-US'; const GB_ENGLISH = 'en-GB'; const AR_SPANISH = 'es-AR'; const GR_GREEK = 'el-GR'; } /** * Metadata Manifest * */ class cc_metadata_manifest implements cc_i_metadata_manifest { public $arraygeneral = array(); public $arraytech = array(); public $arrayrights = array(); public $arraylifecycle = array(); public function add_metadata_general($obj){ if (empty($obj)){ throw new Exception('Medatada Object given is invalid or null!'); } !is_null($obj->title)? $this->arraygeneral['title']=$obj->title:null; !is_null($obj->language)? $this->arraygeneral['language']=$obj->language:null; !is_null($obj->description)? $this->arraygeneral['description']=$obj->description:null; !is_null($obj->keyword)? $this->arraygeneral['keyword']=$obj->keyword:null; !is_null($obj->coverage)? $this->arraygeneral['coverage']=$obj->coverage:null; !is_null($obj->catalog)? $this->arraygeneral['catalog']=$obj->catalog:null; !is_null($obj->entry)? $this->arraygeneral['entry']=$obj->entry:null; } public function add_metadata_technical($obj){ if (empty($obj)){ throw new Exception('Medatada Object given is invalid or null!'); } !is_null($obj->format)? $this->arraytech['format']=$obj->format:null; } public function add_metadata_rights($obj){ if (empty($obj)){ throw new Exception('Medatada Object given is invalid or null!'); } !is_null($obj->copyright)? $this->arrayrights['copyrightAndOtherRestrictions']=$obj->copyright:null; !is_null($obj->description)? $this->arrayrights['description']=$obj->description:null; !is_null($obj->cost)? $this->arrayrights['cost']=$obj->cost:null; } public function add_metadata_lifecycle($obj){ if (empty($obj)){ throw new Exception('Medatada Object given is invalid or null!'); } !is_null($obj->role)? $this->arraylifecycle['role']=$obj->role:null; !is_null($obj->entity)? $this->arraylifecycle['entity']=$obj->entity:null; !is_null($obj->date)? $this->arraylifecycle['date']=$obj->date:null; } } /** * Metadata Lifecycle Type * */ class cc_metadata_lifecycle{ public $role = array(); public $entity = array(); public $date = array(); public function set_role($role){ $this->role[] = array($role); } public function set_entity($entity){ $this->entity[] = array($entity); } public function set_date($date){ $this->date[] = array($date); } } /** * Metadata Rights Type * */ class cc_metadata_rights { public $copyright = array(); public $description = array(); public $cost = array(); public function set_copyright($copy){ $this->copyright[] = array($copy); } public function set_description($des,$language){ $this->description[] = array($language,$des); } public function set_cost($cost){ $this->cost[] = array($cost); } } /** * Metadata Technical Type * */ class cc_metadata_technical { public $format = array(); public function set_format($format){ $this->format[] = array($format); } } /** * Metadata General Type * */ class cc_metadata_general { public $title = array(); public $language = array(); public $description = array(); public $keyword = array(); public $coverage = array(); public $catalog = array(); public $entry = array(); public function set_coverage($coverage,$language){ $this->coverage[] = array($language,$coverage); } public function set_description($description,$language){ $this->description[] = array($language,$description); } public function set_keyword($keyword,$language){ $this->keyword[] = array($language,$keyword); } public function set_language($language){ $this->language[] = array($language); } public function set_title($title,$language){ $this->title[] = array($language,$title); } public function set_catalog($cat){ $this->catalog[] = array($cat); } public function set_entry($entry){ $this->entry[] = array($entry); } }cc_lib/gral_lib/functions.php000064400000006071152266437620012274 0ustar00. /** * Librería de funciones básicas V1.0 (June, 16th 2009) * * * @author Daniel Mühlrad * @link daniel.muhlrad@uvcms.com * @version 1.0 * @copyright 2009 * */ /** * Make a Handler error with an exception msg error * * @param integer $errno * @param string $errstr * @param string $errfile * @param string $errline */ function errorHandler($errno, $errstr, $errfile, $errline) { // si deseas podes guardarlos en un archivo ($errfile);($errline); throw new Exception($errstr, $errno); } /** * Return de mime-type of a file * * @param string $file * @param string $default_type * */ function file_mime_type ($file, $default_type = 'application/octet-stream'){ $ftype = $default_type; $magic_path = __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'magic' . DIRECTORY_SEPARATOR . 'magic'; $finfo = @finfo_open(FILEINFO_MIME , $magic_path); if ($finfo !== false) { $fres = @finfo_file($finfo, $file); if ( is_string($fres) && !empty($fres) ) { $ftype = $fres; } @finfo_close($finfo); } return $ftype; } function array_remove_by_value($arr,$value) { return array_values(array_diff($arr,array($value))); } function array_remove_by_key($arr,$key) { return array_values(array_diff_key($arr,array($key))); } function cc_print_object($object) { echo '
' . htmlspecialchars(print_r($object,true), ENT_COMPAT) . '
'; } /** * IndexOf - first version of find an element in the Array given * returns the index of the *first* occurance * @param mixed $needle * @param array $haystack * @return mixed The element or false if the function didnt find it */ function indexOf($needle, $haystack) { for ($i = 0; $i < count($haystack) ; $i++) { if ($haystack[$i] == $needle) { return $i; } } return false; } /** * IndexOf2 - second version of find an element in the Array given * * @param mixed $needle * @param array $haystack * @return mixed The index of the element or false if the function didnt find it */ function indexOf2($needle, $haystack) { for($i = 0,$z = count($haystack); $i < $z; $i++){ if ($haystack[$i] == $needle) { //finds the needle return $i; } } return false; } cc_lib/gral_lib/cssparser.php000064400000020217152266437620012267 0ustar00. class cssparser { private $css; private $html; public function __construct($html = true) { // Register "destructor" core_shutdown_manager::register_function(array(&$this, "finalize")); $this->html = ($html != false); $this->Clear(); } /** * Old syntax of class constructor. Deprecated in PHP7. * * @deprecated since Moodle 3.1 */ public function cssparser($html = true) { debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER); self::__construct($html); } function finalize() { unset($this->css); } function Clear() { unset($this->css); $this->css = array(); if($this->html) { $this->Add("ADDRESS", ""); $this->Add("APPLET", ""); $this->Add("AREA", ""); $this->Add("A", "text-decoration : underline; color : Blue;"); $this->Add("A:visited", "color : Purple;"); $this->Add("BASE", ""); $this->Add("BASEFONT", ""); $this->Add("BIG", ""); $this->Add("BLOCKQUOTE", ""); $this->Add("BODY", ""); $this->Add("BR", ""); $this->Add("B", "font-weight: bold;"); $this->Add("CAPTION", ""); $this->Add("CENTER", ""); $this->Add("CITE", ""); $this->Add("CODE", ""); $this->Add("DD", ""); $this->Add("DFN", ""); $this->Add("DIR", ""); $this->Add("DIV", ""); $this->Add("DL", ""); $this->Add("DT", ""); $this->Add("EM", ""); $this->Add("FONT", ""); $this->Add("FORM", ""); $this->Add("H1", ""); $this->Add("H2", ""); $this->Add("H3", ""); $this->Add("H4", ""); $this->Add("H5", ""); $this->Add("H6", ""); $this->Add("HEAD", ""); $this->Add("HR", ""); $this->Add("HTML", ""); $this->Add("IMG", ""); $this->Add("INPUT", ""); $this->Add("ISINDEX", ""); $this->Add("I", "font-style: italic;"); $this->Add("KBD", ""); $this->Add("LINK", ""); $this->Add("LI", ""); $this->Add("MAP", ""); $this->Add("MENU", ""); $this->Add("META", ""); $this->Add("OL", ""); $this->Add("OPTION", ""); $this->Add("PARAM", ""); $this->Add("PRE", ""); $this->Add("P", ""); $this->Add("SAMP", ""); $this->Add("SCRIPT", ""); $this->Add("SELECT", ""); $this->Add("SMALL", ""); $this->Add("STRIKE", ""); $this->Add("STRONG", ""); $this->Add("STYLE", ""); $this->Add("SUB", ""); $this->Add("SUP", ""); $this->Add("TABLE", ""); $this->Add("TD", ""); $this->Add("TEXTAREA", ""); $this->Add("TH", ""); $this->Add("TITLE", ""); $this->Add("TR", ""); $this->Add("TT", ""); $this->Add("UL", ""); $this->Add("U", "text-decoration : underline;"); $this->Add("VAR", ""); } } function SetHTML($html) { $this->html = ($html != false); } function Add($key, $codestr) { $key = strtolower($key); $codestr = strtolower($codestr); if(!isset($this->css[$key])) { $this->css[$key] = array(); } $codes = explode(";",$codestr); if(count($codes) > 0) { $codekey=''; $codevalue=''; foreach($codes as $code) { $code = trim($code); $this->assignValues(explode(":",$code),$codekey,$codevalue); if(strlen($codekey) > 0) { $this->css[$key][trim($codekey)] = trim($codevalue); } } } } private function assignValues($arr,&$val1,&$val2) { $n = count($arr); if ($n > 0) { $val1=$arr[0]; $val2=($n > 1) ? $arr[1] : ''; } } function Get($key, $property) { $key = strtolower($key); $property = strtolower($property); $tag='';$subtag='';$class='';$id=''; $this->assignValues(explode(":",$key),$tag,$subtag); $this->assignValues(explode(".",$tag),$tag,$class); $this->assignValues(explode("#",$tag),$tag,$id); $result = ""; $_subtag=''; $_class=''; $_id=''; foreach($this->css as $_tag => $value) { $this->assignValues(explode(":",$_tag),$_tag,$_subtag); $this->assignValues(explode(".",$_tag),$_tag,$_class); $this->assignValues(explode("#",$_tag),$_tag,$_id); $tagmatch = (strcmp($tag, $_tag) == 0) | (strlen($_tag) == 0); $subtagmatch = (strcmp($subtag, $_subtag) == 0) | (strlen($_subtag) == 0); $classmatch = (strcmp($class, $_class) == 0) | (strlen($_class) == 0); $idmatch = (strcmp($id, $_id) == 0); if($tagmatch & $subtagmatch & $classmatch & $idmatch) { $temp = $_tag; if((strlen($temp) > 0) & (strlen($_class) > 0)) { $temp .= ".".$_class; } elseif(strlen($temp) == 0) { $temp = ".".$_class; } if((strlen($temp) > 0) & (strlen($_subtag) > 0)) { $temp .= ":".$_subtag; } elseif(strlen($temp) == 0) { $temp = ":".$_subtag; } if(isset($this->css[$temp][$property])) { $result = $this->css[$temp][$property]; } } } return $result; } function GetSection($key) { $key = strtolower($key); $tag='';$subtag='';$class='';$id=''; $_subtag=''; $_class=''; $_id=''; $this->assignValues(explode(":",$key),$tag,$subtag); $this->assignValues(explode(".",$tag),$tag,$class); $this->assignValues(explode("#",$tag),$tag,$id); $result = array(); foreach($this->css as $_tag => $value) { $this->assignValues(explode(":",$_tag),$_tag,$_subtag); $this->assignValues(explode(".",$_tag),$_tag,$_class); $this->assignValues(explode("#",$_tag),$_tag,$_id); $tagmatch = (strcmp($tag, $_tag) == 0) | (strlen($_tag) == 0); $subtagmatch = (strcmp($subtag, $_subtag) == 0) | (strlen($_subtag) == 0); $classmatch = (strcmp($class, $_class) == 0) | (strlen($_class) == 0); $idmatch = (strcmp($id, $_id) == 0); if($tagmatch & $subtagmatch & $classmatch & $idmatch) { $temp = $_tag; if((strlen($temp) > 0) & (strlen($_class) > 0)) { $temp .= ".".$_class; } elseif(strlen($temp) == 0) { $temp = ".".$_class; } if((strlen($temp) > 0) & (strlen($_subtag) > 0)) { $temp .= ":".$_subtag; } elseif(strlen($temp) == 0) { $temp = ":".$_subtag; } foreach($this->css[$temp] as $property => $value) { $result[$property] = $value; } } } return $result; } function ParseStr($str) { $this->Clear(); // Remove comments $str = preg_replace("/\/\*(.*)?\*\//Usi", "", $str); // Parse this damn csscode $parts = explode("}",$str); if(count($parts) > 0) { foreach($parts as $part) { $keystr='';$codestr=''; $this->assignValues(explode("{",$part),$keystr,$codestr); $keys = explode(",",trim($keystr)); if(count($keys) > 0) { foreach($keys as $key) { if(strlen($key) > 0) { $key = str_replace("\n", "", $key); $key = str_replace("\\", "", $key); $this->Add($key, trim($codestr)); } } } } } // return (count($this->css) > 0); } function Parse($filename) { $this->Clear(); if(file_exists($filename)) { return $this->ParseStr(file_get_contents($filename)); } else { return false; } } function GetCSS() { $result = ""; foreach($this->css as $key => $values) { $result .= $key." {\n"; foreach($values as $key => $value) { $result .= " $key: $value;\n"; } $result .= "}\n\n"; } return $result; } } cc_lib/gral_lib/ccdependencyparser.php000064400000011552152266437620014125 0ustar00. require_once(__DIR__ .'/../xmlbase.php'); require_once('cssparser.php'); require_once('pathutils.php'); /** * * Older version better suited for PHP < 5.2 * @deprecated * @param mixed $url * @return boolean */ function is_url_deprecated($url) { if ( !preg_match('#^http\\:\\/\\/[a-z0-9\-]+\.([a-z0-9\-]+\.)?[a-z]+#i', $url) && !preg_match('#^https\\:\\/\\/[a-z0-9\-]+\.([a-z0-9\-]+\.)?[a-z]+#i', $url) && !preg_match('#^ftp\\:\\/\\/[a-z0-9\-]+\.([a-z0-9\-]+\.)?[a-z]+#i', $url) ) { $status = false; } else { $status = true; } return $status; } /** * * validates URL * @param string $url * @return boolean */ function is_url($url) { $result = filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED) !== false; return $result; } function GetDepFiles($manifestroot, $fname, $folder, &$filenames) { static $types = array('xhtml' => true, 'html' => true, 'htm' => true); $extension = strtolower(trim(pathinfo($fname, PATHINFO_EXTENSION))); $filenames = array(); if (isset($types[$extension])) { $dcx = new XMLGenericDocument(); $filename = $manifestroot.$folder.$fname; if (!file_exists($filename)) { $filename = $manifestroot.DIRECTORY_SEPARATOR.$folder.DIRECTORY_SEPARATOR.$fname; } if (file_exists($filename)) { $res = $dcx->loadHTMLFile($filename); if ($res) { GetDepFilesHTML($manifestroot, $fname, $filenames, $dcx, $folder); } } } } function GetDepFilesHTML($manifestroot, $fname, &$filenames, &$dcx, $folder) { $dcx->resetXpath(); $nlist = $dcx->nodeList("//img/@src | //link/@href | //script/@src | //a[not(starts-with(@href,'#'))]/@href"); $css_obj_array = array(); foreach ($nlist as $nl) { $item = $folder.$nl->nodeValue; $path_parts = pathinfo($item); $fname = $path_parts['basename']; $ext = array_key_exists('extension', $path_parts) ? $path_parts['extension'] : ''; if (!is_url($folder.$nl->nodeValue) && !is_url($nl->nodeValue)) { $path = $folder.$nl->nodeValue; $file = fullPath($path, "/"); toNativePath($file); if (file_exists($manifestroot.DIRECTORY_SEPARATOR.$file)) { $filenames[$file] = $file; } } if ($ext == 'css') { $css = new cssparser(); $css->Parse($dcx->filePath().$nl->nodeValue); $css_obj_array[$item] = $css; } } $nlist = $dcx->nodeList("//*/@class"); foreach ($nlist as $nl) { $item = $folder.$nl->nodeValue; foreach ($css_obj_array as $csskey => $cssobj) { $bimg = $cssobj->Get($item, "background-image"); $limg = $cssobj->Get($item, "list-style-image"); $npath = pathinfo($csskey); if ((!empty($bimg)) && ($bimg != 'none')) { $value = stripUrl($bimg, $npath['dirname'].'/'); $filenames[$value] = $value; } else if ((!empty($limg)) && ($limg != 'none')) { $value = stripUrl($limg, $npath['dirname'].'/'); $filenames[$value] = $value; } } } $elems_to_check = array("body", "p", "ul", "h4", "a", "th"); $do_we_have_it = array(); foreach ($elems_to_check as $elem) { $do_we_have_it[$elem] = ($dcx->nodeList("//".$elem)->length > 0); } foreach ($elems_to_check as $elem) { if ($do_we_have_it[$elem]) { foreach ($css_obj_array as $csskey => $cssobj) { $sb = $cssobj->Get($elem, "background-image"); $sbl = $cssobj->Get($elem, "list-style-image"); $npath = pathinfo($csskey); if ((!empty($sb)) && ($sb != 'none')) { $value = stripUrl($sb, $npath['dirname'].'/'); $filenames[$value] = $value; } else if ((!empty($sbl)) && ($sbl != 'none')) { $value = stripUrl($sbl, $npath['dirname'].'/'); $filenames[$value] = $value; } } } } }cc_lib/gral_lib/parser.php000064400000013537152266437620011565 0ustar00. require_once $CFG->dirroot .'/backup/cc/cc_lib/xmlbase.php'; require_once 'cssparser.php'; require_once 'pathutils.php'; function is_url($url) { if ( !preg_match('#^http\\:\\/\\/[a-z0-9\-]+\.([a-z0-9\-]+\.)?[a-z]+#i', $url) && !preg_match('#^https\\:\\/\\/[a-z0-9\-]+\.([a-z0-9\-]+\.)?[a-z]+#i', $url) && !preg_match('#^ftp\\:\\/\\/[a-z0-9\-]+\.([a-z0-9\-]+\.)?[a-z]+#i', $url) ) { $status = false; } else { $status = true; } return $status; } function GetDepFiles($manifestroot, $fname,$folder,&$filenames) { $extension = end(explode('.',$fname)); $filenames = array(); $dcx = new XMLGenericDocument(); $result = true; switch ($extension){ case 'xml': $result = @$dcx->loadXMLFile($manifestroot.$folder.$fname); if (!$result) { $result = @$dcx->loadXMLFile($manifestroot.DIRECTORY_SEPARATOR.$folder.DIRECTORY_SEPARATOR.$fname); } GetDepFilesXML($manifestroot, $fname,$filenames,$dcx, $folder); break; case 'html': case 'htm': $result = @$dcx->loadHTMLFile($manifestroot.$folder.$fname); if (!$result) { $result = @$dcx->loadHTMLFile($manifestroot.DIRECTORY_SEPARATOR.$folder.DIRECTORY_SEPARATOR.$fname); } GetDepFilesHTML($manifestroot, $fname,$filenames,$dcx, $folder); break; } return $result; } function GetDepFilesXML ($manifestroot, $fname,&$filenames,&$dcx, $folder){ $nlist = $dcx->nodeList("//img/@src | //attachments/attachment/@href | //link/@href | //script/@src"); $css_obj_array = array(); foreach ($nlist as $nl) { $item = $nl->nodeValue; $path_parts = pathinfo($item); $fname = $path_parts['basename']; $ext = array_key_exists('extension',$path_parts) ? $path_parts['extension'] : ''; if (!is_url($nl->nodeValue)) { //$file = $folder.$nl->nodeValue; // DEPENDERA SI SE QUIERE Q SEA RELATIVO O ABSOLUTO $file = $nl->nodeValue; toNativePath($file); $filenames[]=$file; } } $dcx->registerNS('qti','http://www.imsglobal.org/xsd/imscc/ims_qtiasiv1p2.xsd'); $dcx->resetXpath(); $nlist = $dcx->nodeList("//qti:mattext | //text"); $dcx2 = new XMLGenericDocument(); foreach ($nlist as $nl) { if ($dcx2->loadString($nl->nodeValue)){ GetDepFilesHTML($manifestroot,$fname,$filenames,$dcx2,$folder); } } } function GetDepFilesHTML ($manifestroot, $fname,&$filenames,&$dcx, $folder){ $dcx->resetXpath(); $nlist = $dcx->nodeList("//img/@src | //link/@href | //script/@src | //a[not(starts-with(@href,'#'))]/@href"); $css_obj_array=array(); foreach ($nlist as $nl) { $item = $nl->nodeValue; $path_parts = pathinfo($item); $fname = $path_parts['basename']; $ext = array_key_exists('extension',$path_parts) ? $path_parts['extension'] : ''; if (!is_url($folder.$nl->nodeValue) && !is_url($nl->nodeValue)) { $path = $nl->nodeValue; //$file = fullPath($path,"/"); toNativePath($path); $filenames[]= $path; } if ($ext == 'css') { $css = new cssparser(); $css->Parse($dcx->filePath().$nl->nodeValue); $css_obj_array[$item]=$css; } } $nlist = $dcx->nodeList("//*/@class"); foreach ($nlist as $nl) { $item = $nl->nodeValue; foreach ($css_obj_array as $csskey => $cssobj) { $bimg = $cssobj->Get($item,"background-image"); $limg = $cssobj->Get($item,"list-style-image"); $npath = pathinfo($csskey); if ((!empty($bimg))&& ($bimg != 'none')) { $filenames[] = stripUrl($bimg,$npath['dirname'].'/'); } else if ((!empty($limg))&& ($limg != 'none')) { $filenames[] = stripUrl($limg,$npath['dirname'].'/'); } } } $elems_to_check = array("body","p","ul","h4","a","th"); $do_we_have_it = array(); foreach ($elems_to_check as $elem) { $do_we_have_it[$elem]=($dcx->nodeList("//".$elem)->length > 0); } foreach ($elems_to_check as $elem) { if ($do_we_have_it[$elem]) { foreach ($css_obj_array as $csskey => $cssobj) { $sb = $cssobj->Get($elem, "background-image"); $sbl = $cssobj->Get($elem,"list-style-image"); $npath = pathinfo($csskey); if ((!empty($sb)) && ($sb != 'none')) { $filenames[] = stripUrl($sb,$npath['dirname'].'/'); } else if ((!empty($sbl)) && ($sbl != 'none')) { $filenames[] = stripUrl($sbl,$npath['dirname'].'/'); } } } } }cc_lib/gral_lib/pathutils.php000064400000030143152266437620012276 0ustar00. /** * Function expands all relative parts of supplied path string thus * removing things like ../../ or ./../. * * @param string $path * @param string $dirsep Character that represents directory separator should be * specified here. Default is DIRECTORY_SEPARATOR. * @return string */ function fullPath($path,$dirsep=DIRECTORY_SEPARATOR) { $token = '$IMS-CC-FILEBASE$'; $path = str_replace($token,'',$path); if ( is_string($path) && ($path != '') ) { $sep = $dirsep; $dotDir= '.'; $upDir = '..'; $length= strlen($path); $rtemp= trim($path); $start = strrpos($path, $sep); $canContinue = ($start !== false); $result= $canContinue ? '': $path; $rcount=0; while ($canContinue) { $dirPart = ($start !== false) ? substr($rtemp,$start+1,$length-$start) : $rtemp; $canContinue = ($dirPart !== false); if ($canContinue) { if ($dirPart != $dotDir) { if ($dirPart == $upDir) { $rcount++; } else { if ($rcount > 0) { $rcount--; } else { $result = ($result == '') ? $dirPart : $dirPart.$sep.$result; } } } $rtemp = substr($path,0,$start); $start = strrpos($rtemp, $sep); $canContinue = (($start !== false) || (strlen($rtemp) > 0)); } } //end while } return $result; } /** * Function strips url part from css link * * @param string $path * @param string $rootDir * @return string */ function stripUrl($path, $rootDir='') { $result = $path; if ( is_string($path) && ($path != '') ) { $start=strpos($path,'(')+1; $length=strpos($path,')')-$start; $rut = $rootDir.substr($path,$start,$length); $result=fullPath($rut,'/'); } return $result; } /** * Converts direcotry separator in given path to / to validate in CC * Value is passed byref hence variable itself is changed * * @param string $path */ function toNativePath(&$path) { for ($count = 0 ; $count < strlen($path); ++$count) { $chr = $path[$count]; if (($chr == '\\') || ($chr == '/')) { $path[$count] = '/'; } } } /** * Converts direcotry separator in given path to the one on the server platform * Value is passed byref hence variable itself is changed * * @param string $path */ function toNativePath2(&$path) { for ($count = 0 ; $count < strlen($path); ++$count) { $chr = $path[$count]; if (($chr == '\\') || ($chr == '/')) { $path[$count] = DIRECTORY_SEPARATOR; } } } /** * Converts \ Directory separator to the / more suitable for URL * * @param string $path */ function toUrlPath(&$path) { for ($count = 0 ; $count < strlen($path); ++$count) { $chr = $path[$count]; if (($chr == '\\')) { $path[$count] = '/'; } } } /** * Returns relative path from two directories with full path * * @param string $path1 * @param string $path2 * @return string */ function pathDiff($path1, $path2) { toUrlPath($path1); toUrlPath($path2); $result = ""; $bl2 = strlen($path2); $a = strpos($path1,$path2); if ($a !== false) { $result = trim(substr($path1,$bl2+$a),'/'); } return $result; } /** * Copy a file, or recursively copy a folder and its contents * * @author Aidan Lister * @version 1.0.1 * @link http://aidanlister.com/repos/v/function.copyr.php * @param string $source Source path * @param string $dest Destination path * @return bool Returns TRUE on success, FALSE on failure */ function copyr($source, $dest) { global $CFG; // Simple copy for a file if (is_file($source)) { return copy($source, $dest); } // Make destination directory if (!is_dir($dest)) { mkdir($dest, $CFG->directorypermissions, true); } // Loop through the folder $dir = dir($source); while (false !== $entry = $dir->read()) { // Skip pointers if ($entry == '.' || $entry == '..') { continue; } // Deep copy directories if ($dest !== "$source/$entry") { copyr("$source/$entry", "$dest/$entry"); } } // Clean up $dir->close(); return true; } /** * Function returns array with directories contained in folder (only first level) * * @param string $rootDir directory to look into * @param string $contains which string to look for * @param array $excludeitems array of names to be excluded * @param bool $startswith should the $contains value be searched only from * beginning * @return array Returns array of sub-directories. In case $rootDir path is * invalid it returns FALSE. */ function getDirectories($rootDir, $contains, $excludeitems = null, $startswith = true) { $result = is_dir($rootDir); if ($result) { $dirlist = dir($rootDir); $entry = null; $result = array(); while(false !== ($entry = $dirlist->read())) { $currdir = $rootDir.$entry; if (is_dir($currdir)) { $bret = strpos($entry,$contains); if (($bret !== false)) { if (($startswith && ($bret == 0)) || !$startswith) { if (!( is_array($excludeitems) && in_array($entry,$excludeitems) )) { $result[] = $entry; } } } } } } return $result; } function getFilesOnly($rootDir, $contains, $excludeitems = null, $startswith = true,$extension=null) { $result = is_dir($rootDir); if ($result) { $filelist = dir($rootDir); $entry = null; $result = array(); while(false !== ($entry = $filelist->read())) { $curritem = $rootDir.$entry; $pinfo = pathinfo($entry); $ext = array_key_exists('extension',$pinfo) ? $pinfo['extension'] : null; if (is_file($curritem) && (is_null($extension) || ($ext == $extension) )) { $bret = strpos($entry,$contains); if (($bret !== false)) { if (($startswith && ($bret == 0)) || !$startswith) { if (!( is_array($excludeitems) && in_array($entry,$excludeitems) )) { $result[] = $entry; } } } } } } natcasesort($result); return $result; } /** * Search an identifier in array * * @param array $array * @param string $name * */ function search_ident_by_name($array,$name){ if (empty($array)){ throw new Exception('The array given is null'); } $ident = null; foreach ($array as $k => $v){ ($k); if ($v[1] == $name){ $ident = $v[0]; break; } } return $ident; } /** * Function returns files recursivly with appeneded relative path * * @param string $startDir * @param string $rootDir * @param array $excludedirs * @param array $excludefileext * @return array */ function getRawFiles($startDir, &$fhandle, $rootDir='', $excludedirs = null, $excludefileext = null) { $result = is_dir($startDir); if ($result) { $dirlist = dir($startDir); $entry = null; while(false !== ($entry = $dirlist->read())) { $curritem = $startDir.$entry; if (($entry=='.') || ($entry =='..')) { continue; } if (is_dir($curritem)) { if (!( is_array($excludedirs) && in_array($entry,$excludedirs) )) { getRawFiles($startDir.$entry."/",$fhandle,$rootDir.$entry."/",$excludedirs,$excludefileext); } continue; } if (is_file($curritem)){ $pinfo = pathinfo($entry); $ext = array_key_exists('extension',$pinfo) ? $pinfo['extension'] : ''; if (!is_array($excludefileext) || (is_array($excludefileext) && !in_array($ext,$excludefileext))) { fwrite($fhandle,$rootDir.$entry."\n"); } } } } return $result; } function getRawFiles2($startDir,&$arr, $rootDir='', $excludedirs = null, $excludefileext = null) { $result = is_dir($startDir); if ($result) { $dirlist = dir($startDir); $entry = null; while(false !== ($entry = $dirlist->read())) { $curritem = $startDir.$entry; if (($entry=='.') || ($entry =='..')) { continue; } if (is_dir($curritem)) { if (!( is_array($excludedirs) && in_array($entry,$excludedirs) )) { getRawFiles2($startDir.$entry."/",$arr,$rootDir.$entry."/",$excludedirs,$excludefileext); } continue; } if (is_file($curritem)){ $pinfo = pathinfo($entry); $ext = array_key_exists('extension',$pinfo) ? $pinfo['extension'] : ''; if (!is_array($excludefileext) || (is_array($excludefileext) && !in_array($ext,$excludefileext))) { array_push($arr,$rootDir.$entry); // fwrite($fhandle,$rootDir.$entry."\n"); } } } } return $result; } function GetFiles($startDir, $outfile, $rootDir='', $excludedirs = null, $excludefileext = null) { $fh = @fopen($outfile,"w+"); if ($fh !== FALSE) { getRawFiles($startDir,$fh,$rootDir,$excludedirs,$excludefileext); @fclose($fh); @chmod($outfile,0777); } } /** * Function to get an array with all files in a directory and subdirectories * * @param string $startDir * @param string $rootDir * @param string $excludedirs * @param string $excludefileext * @return array */ function GetFilesArray($startDir, $rootDir='', $excludedirs = null, $excludefileext = null) { $arr = array(); getRawFiles2($startDir,$arr,$rootDir,$excludedirs,$excludefileext); return $arr; } /** * Function returns array with directories contained in folder (only first level) * simmilar to getDirectories but returned items are naturally sorted. * * @param string $rootDir * @param string $contains * @param array $excludeitems * @param bool $startswith * @return array */ function getCourseDirs ($rootDir, $contains, $excludeitems=null, $startswith=true) { $result = getDirectories($rootDir,$contains,$excludeitems,$startswith); if ($result !== false) { natcasesort($result); $result = array_values($result); } return $result; } /** * Delete a directory recursive with files inside * * @param string $dirname * @return bool */ function rmdirr($dirname) { if (!file_exists($dirname)) { return false; } if (is_file($dirname) || is_link($dirname)) { return unlink($dirname); } $dir = dir($dirname); while (false !== $entry = $dir->read()) { if ($entry == '.' || $entry == '..') { continue; } rmdirr($dirname . DIRECTORY_SEPARATOR . $entry); } $dir->close(); return rmdir($dirname); } cc_lib/cc_asssesment.php000064400000270024152266437620011344 0ustar00. /** * @package backup-convert * @copyright 2011 Darko Miletic * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.'); require_once('cc_utils.php'); require_once('cc_general.php'); abstract class cc_xml_namespace { const xml = 'http://www.w3.org/XML/1998/namespace'; } abstract class cc_qti_metadata { // Assessment. const qmd_assessmenttype = 'qmd_assessmenttype'; const qmd_scoretype = 'qmd_scoretype'; const qmd_feedbackpermitted = 'qmd_feedbackpermitted'; const qmd_hintspermitted = 'qmd_hintspermitted'; const qmd_solutionspermitted = 'qmd_solutionspermitted'; const qmd_timelimit = 'qmd_timelimit'; const cc_allow_late_submission = 'cc_allow_late_submission'; const cc_maxattempts = 'cc_maxattempts'; const cc_profile = 'cc_profile'; // Items. const cc_weighting = 'cc_weighting'; const qmd_scoringpermitted = 'qmd_scoringpermitted'; const qmd_computerscored = 'qmd_computerscored'; const cc_question_category = 'cc_question_category'; } abstract class cc_qti_profiletype { const multiple_choice = 'cc.multiple_choice.v0p1'; const multiple_response = 'cc.multiple_response.v0p1'; const true_false = 'cc.true_false.v0p1'; const field_entry = 'cc.fib.v0p1'; const pattern_match = 'cc.pattern_match.v0p1'; const essay = 'cc.essay.v0p1'; /** * * validates a profile value * @param string $value * @return boolean */ public static function valid($value) { static $verification_values = array( self::essay, self::field_entry, self::multiple_choice, self::multiple_response, self::pattern_match, self::true_false ); return in_array($value, $verification_values); } } abstract class cc_qti_values { const exam_profile = 'cc.exam.v0p1'; const Yes = 'Yes'; const No = 'No'; const Response = 'Response'; const Solution = 'Solution'; const Hint = 'Hint'; const Examination = 'Examination'; const Percentage = 'Percentage'; const unlimited = 'unlimited'; const Single = 'Single'; const Multiple = 'Multiple'; const Ordered = 'Ordered'; const Asterisk = 'Asterisk'; const Box = 'Box'; const Dashline = 'Dashline'; const Underline = 'Underline'; const Decimal = 'Decimal'; const Integer = 'Integer'; const Scientific = 'Scientific'; const String = 'String'; const SCORE = 'SCORE'; const Set = 'Set'; const Complete = 'Complete'; const texttype = 'text/plain'; const htmltype = 'text/html'; } abstract class cc_qti_tags { const questestinterop = 'questestinterop'; const assessment = 'assessment'; const qtimetadata = 'qtimetadata'; const qtimetadatafield = 'qtimetadatafield'; const fieldlabel = 'fieldlabel'; const fieldentry = 'fieldentry'; const section = 'section'; const ident = 'ident'; const item = 'item'; const title = 'title'; const itemmetadata = 'itemmetadata'; const presentation = 'presentation'; const material = 'material'; const mattext = 'mattext'; const matref = 'matref'; const matbreak = 'matbreak'; const texttype = 'texttype'; const response_lid = 'response_lid'; const render_choice = 'render_choice'; const response_label = 'response_label'; const resprocessing = 'resprocessing'; const outcomes = 'outcomes'; const decvar = 'decvar'; const respcondition = 'respcondition'; const conditionvar = 'conditionvar'; const other = 'other'; const displayfeedback = 'displayfeedback'; const maxvalue = 'maxvalue'; const minvalue = 'minvalue'; const varname = 'varname'; const vartype = 'vartype'; const continue_ = 'continue'; const feedbacktype = 'feedbacktype'; const linkrefid = 'linkrefid'; const varequal = 'varequal'; const respident = 'respident'; const itemfeedback = 'itemfeedback'; const flow_mat = 'flow_mat'; const rcardinality = 'rcardinality'; const charset = 'charset'; const label = 'label'; const uri = 'uri'; const width = 'width'; const height = 'height'; const x0 = 'x0'; const y0 = 'y0'; const xml_lang = 'lang'; const xml_space = 'space'; const rubric = 'rubric'; const altmaterial = 'altmaterial'; const presentation_material = 'presentation_material'; const t_class = 'class'; const material_ref = 'material_ref'; const rtiming = 'rtiming'; const render_fib = 'render_fib'; const shuffle = 'shuffle'; const minnumber = 'minnumber'; const maxnumber = 'maxnumber'; const encoding = 'encoding'; const maxchars = 'maxchars'; const prompt = 'prompt'; const fibtype = 'fibtype'; const rows = 'rows'; const columns = 'columns'; const labelrefid = 'labelrefid'; const rshuffle = 'rshuffle'; const match_group = 'match_group'; const match_max = 'match_max'; const flow = 'flow'; const response_str = 'response_str'; const flow_label = 'flow_label'; const setvar = 'setvar'; const action = 'action'; const and_ = 'and'; const not_ = 'not'; const case_ = 'case'; const varsubstring = 'varsubstring'; const hint = 'hint'; const solution = 'solution'; const feedbackstyle = 'feedbackstyle'; const solutionmaterial = 'solutionmaterial'; const hintmaterial = 'hintmaterial'; } class cc_question_metadata_base { /** * @var array */ protected $metadata = array(); /** * @param string $setting * @param mixed $value */ protected function set_setting($setting, $value = null) { $this->metadata[$setting] = $value; } /** * @param string $setting * @return mixed */ protected function get_setting($setting) { $result = null; if (array_key_exists($setting, $this->metadata)) { $result = $this->metadata[$setting]; } return $result; } /** * @param string $setting * @param string $namespace * @param string $value */ protected function set_setting_wns($setting, $namespace, $value = null) { $this->metadata[$setting] = array($namespace => $value); } /** * @param string $setting * @param boolean $value */ protected function enable_setting_yesno($setting, $value = true) { $svalue = $value ? cc_qti_values::Yes : cc_qti_values::No; $this->set_setting($setting, $svalue); } /** * @param XMLGenericDocument $doc * @param DOMNode $item * @param string $namespace */ public function generate_attributes(XMLGenericDocument &$doc, DOMNode &$item, $namespace) { foreach ($this->metadata as $attribute => $value) { if (!is_null($value)) { if (!is_array($value)) { $doc->append_new_attribute_ns($item, $namespace, $attribute, $value); } else { $ns = key($value); $nval = current($value); if (!is_null($nval)) { $doc->append_new_attribute_ns($item, $ns, $attribute, $nval); } } } } } /** * @param XMLGenericDocument $doc * @param DOMNode $item * @param string $namespace */ public function generate(XMLGenericDocument &$doc, DOMNode &$item, $namespace) { $qtimetadata = $doc->append_new_element_ns($item, $namespace, cc_qti_tags::qtimetadata); foreach ($this->metadata as $label => $entry) { if (!is_null($entry)) { $qtimetadatafield = $doc->append_new_element_ns($qtimetadata, $namespace, cc_qti_tags::qtimetadatafield); $doc->append_new_element_ns($qtimetadatafield, $namespace, cc_qti_tags::fieldlabel, $label); $doc->append_new_element_ns($qtimetadatafield, $namespace, cc_qti_tags::fieldentry, $entry); } } } } class cc_question_metadata extends cc_question_metadata_base { public function set_category($value) { $this->set_setting(cc_qti_metadata::cc_question_category, $value); } public function set_weighting($value) { $this->set_setting(cc_qti_metadata::cc_weighting, $value); } public function enable_scoringpermitted($value = true) { $this->enable_setting_yesno(cc_qti_metadata::qmd_scoringpermitted, $value); } public function enable_computerscored($value = true) { $this->enable_setting_yesno(cc_qti_metadata::qmd_computerscored, $value); } /** * * Constructs metadata * @param string $profile * @throws InvalidArgumentException */ public function __construct($profile) { if (!cc_qti_profiletype::valid($profile)) { throw new InvalidArgumentException('Invalid profile type!'); } $this->set_setting(cc_qti_metadata::cc_profile, $profile); $this->set_setting(cc_qti_metadata::cc_question_category); $this->set_setting(cc_qti_metadata::cc_weighting ); $this->set_setting(cc_qti_metadata::qmd_scoringpermitted); $this->set_setting(cc_qti_metadata::qmd_computerscored ); } } class cc_assesment_metadata extends cc_question_metadata_base { public function enable_hints($value = true) { $this->enable_setting_yesno(cc_qti_metadata::qmd_hintspermitted, $value); } public function enable_solutions($value = true) { $this->enable_setting_yesno(cc_qti_metadata::qmd_solutionspermitted, $value); } public function enable_latesubmissions($value = true) { $this->enable_setting_yesno(cc_qti_metadata::cc_allow_late_submission, $value); } public function enable_feedback($value = true) { $this->enable_setting_yesno(cc_qti_metadata::qmd_feedbackpermitted, $value); } public function set_timelimit($value) { $ivalue = (int)$value; if (($ivalue < 0) || ($ivalue > 527401)) { throw new OutOfRangeException('Time limit value out of permitted range!'); } $this->set_setting(cc_qti_metadata::qmd_timelimit, $value); } public function set_maxattempts($value) { $valid_values = array(cc_qti_values::Examination, cc_qti_values::unlimited, 1, 2, 3, 4, 5); if (!in_array($value, $valid_values)) { throw new OutOfRangeException('Max attempts has invalid value'); } $this->set_setting(cc_qti_metadata::cc_maxattempts, $value); } public function __construct() { //prepared default values $this->set_setting(cc_qti_metadata::cc_profile , cc_qti_values::exam_profile); $this->set_setting(cc_qti_metadata::qmd_assessmenttype, cc_qti_values::Examination ); $this->set_setting(cc_qti_metadata::qmd_scoretype , cc_qti_values::Percentage ); //optional empty values $this->set_setting(cc_qti_metadata::qmd_feedbackpermitted ); $this->set_setting(cc_qti_metadata::qmd_hintspermitted ); $this->set_setting(cc_qti_metadata::qmd_solutionspermitted ); $this->set_setting(cc_qti_metadata::qmd_timelimit ); $this->set_setting(cc_qti_metadata::cc_allow_late_submission); $this->set_setting(cc_qti_metadata::cc_maxattempts ); } } class cc_assesment_mattext extends cc_question_metadata_base { protected $value = null; public function __construct($value = null) { $this->set_setting(cc_qti_tags::texttype, cc_qti_values::texttype); $this->set_setting(cc_qti_tags::charset);//, 'ascii-us'); $this->set_setting(cc_qti_tags::label); $this->set_setting(cc_qti_tags::uri); $this->set_setting(cc_qti_tags::width); $this->set_setting(cc_qti_tags::height); $this->set_setting(cc_qti_tags::x0); $this->set_setting(cc_qti_tags::y0); $this->set_setting_wns(cc_qti_tags::xml_lang , cc_xml_namespace::xml); $this->set_setting_wns(cc_qti_tags::xml_space, cc_xml_namespace::xml);//, 'default'); $this->value = $value; } public function set_label($value) { $this->set_setting(cc_qti_tags::label, $value); } public function set_uri($value) { $this->set_setting(cc_qti_tags::uri, $value); } public function set_width_height($width = null, $height = null) { $this->set_setting(cc_qti_tags::width, $width); $this->set_setting(cc_qti_tags::height, $height); } public function set_coor($x = null, $y = null) { $this->set_setting(cc_qti_tags::x0, $x); $this->set_setting(cc_qti_tags::y0, $y); } public function set_lang($lang = null) { $this->set_setting_wns(cc_qti_tags::xml_lang , cc_xml_namespace::xml, $lang); } public function set_content($content, $type = cc_qti_values::texttype, $charset = null) { $this->value = $content; $this->set_setting(cc_qti_tags::texttype, $type); $this->set_setting(cc_qti_tags::charset, $charset); } public function generate(XMLGenericDocument &$doc, DOMNode &$item, $namespace) { $mattext = $doc->append_new_element_ns_cdata($item, $namespace, cc_qti_tags::mattext, $this->value); $this->generate_attributes($doc, $mattext, $namespace); } } class cc_assesment_matref { protected $linkref = null; public function __construct($linkref) { $this->linkref = $linkref; } public function generate(XMLGenericDocument &$doc, DOMNode &$item, $namespace) { $doc->append_new_element_ns($item, $namespace, cc_qti_tags::matref, $this->linkref); $doc->append_new_attribute_ns($node, $namespace, cc_qti_tags::linkrefid, $this->linkref); } } class cc_assesment_response_matref extends cc_assesment_matref { public function generate(XMLGenericDocument &$doc, DOMNode &$item, $namespace) { $node = $doc->append_new_element_ns($item, $namespace, cc_qti_tags::material_ref); $doc->append_new_attribute_ns($node, $namespace, cc_qti_tags::linkrefid, $this->linkref); } } class cc_assesment_matbreak { public function generate(XMLGenericDocument &$doc, DOMNode &$item, $namespace) { $doc->append_new_element_ns($item, $namespace, cc_qti_tags::matbreak); } } abstract class cc_assesment_material_base extends cc_question_metadata_base { /** * @var mixed */ protected $mattag = null; protected $tagname = null; protected function set_tag_value($object) { $this->mattag = $object; } public function set_mattext(cc_assesment_mattext $object) { $this->set_tag_value($object); } public function set_matref(cc_assesment_matref $object) { $this->set_tag_value($object); } public function set_matbreak(cc_assesment_matbreak $object) { $this->set_tag_value($object); } public function set_lang($value) { $this->set_setting_wns(cc_qti_tags::xml_lang , cc_xml_namespace::xml, $value); } public function generate(XMLGenericDocument &$doc, DOMNode &$item, $namespace) { $material = $doc->append_new_element_ns($item, $namespace, $this->tagname); $this->generate_attributes($doc, $material, $namespace); if (!empty($this->mattag)) { $this->mattag->generate($doc, $material, $namespace); } return $material; } } class cc_assesment_altmaterial extends cc_assesment_material_base { public function __construct($value = null) { $this->set_setting_wns(cc_qti_tags::xml_lang , cc_xml_namespace::xml); $this->tagname = cc_qti_tags::altmaterial; } } class cc_assesment_material extends cc_assesment_material_base { protected $altmaterial = null; public function __construct($value = null) { $this->set_setting(cc_qti_tags::label); $this->set_setting_wns(cc_qti_tags::xml_lang , cc_xml_namespace::xml); $this->tagname = cc_qti_tags::material; } public function set_label($value) { $this->set_setting(cc_qti_tags::label, $value); } public function set_altmaterial(cc_assesment_altmaterial $object) { $this->altmaterial = $object; } public function generate(XMLGenericDocument &$doc, DOMNode &$item, $namespace) { $material = parent::generate($doc, $item, $namespace); if (!empty($this->altmaterial)) { $this->altmaterial->generate($doc, $material, $namespace); } } } class cc_assesment_rubric_base extends cc_question_metadata_base { protected $material = null; public function set_material($object) { $this->material = $object; } public function generate(XMLGenericDocument &$doc, DOMNode &$item, $namespace) { $rubric = $doc->append_new_element_ns($item, $namespace, cc_qti_tags::rubric); if (!empty($this->material)) { $this->material->generate($doc, $rubric, $namespace); } } } class cc_assesment_presentation_material_base extends cc_question_metadata_base { protected $flowmats = array(); public function add_flow_mat($object) { $this->flowmats[] = $object; } public function generate(XMLGenericDocument &$doc, DOMNode &$item, $namespace) { $node = $doc->append_new_element_ns($item, $namespace, cc_qti_tags::presentation_material); if (!empty($this->flowmats)) { foreach ($this->flowmats as $flow_mat) { $flow_mat->generate($doc, $node, $namespace); } } } } class cc_assesment_flow_mat_base extends cc_question_metadata_base { protected $mattag = null; protected function set_tag_value($object) { $this->mattag = $object; } public function set_flow_mat(cc_assesment_flow_mat_base $object) { $this->set_tag_value($object); } public function set_material(cc_assesment_material $object) { $this->set_tag_value($object); } public function set_material_ref(cc_assesment_matref $object) { $this->set_tag_value($object); } public function __construct($value = null) { $this->set_setting(cc_qti_tags::t_class); } public function set_class($value) { $this->set_setting(cc_qti_tags::t_class, $value); } public function generate(XMLGenericDocument &$doc, DOMNode &$item, $namespace) { $node = $doc->append_new_element_ns($item, $namespace, cc_qti_tags::flow_mat); $this->generate_attributes($doc, $node, $namespace); if (!empty($this->mattag)) { $this->mattag->generate($doc, $node, $namespace); } } } class cc_assesment_section extends cc_question_metadata_base { /** * @var array */ protected $items = array(); public function __construct() { $this->set_setting(cc_qti_tags::ident, cc_helpers::uuidgen('I_')); $this->set_setting(cc_qti_tags::title); $this->set_setting_wns(cc_qti_tags::xml_lang, cc_xml_namespace::xml); } public function set_ident($value) { $this->set_setting(cc_qti_tags::ident, $value); } public function set_title($value) { $this->set_setting(cc_qti_tags::title, $value); } public function set_lang($value) { $this->set_setting_wns(cc_qti_tags::xml_lang, cc_xml_namespace::xml, $value); } public function add_item(cc_assesment_section_item $object) { $this->items[] = $object; } public function generate(XMLGenericDocument &$doc, DOMNode &$item, $namespace) { $node = $doc->append_new_element_ns($item, $namespace, cc_qti_tags::section); $this->generate_attributes($doc, $node, $namespace); if (!empty($this->items)) { foreach ($this->items as $item) { $item->generate($doc, $node, $namespace); } } } } class cc_assesment_itemmetadata extends cc_question_metadata_base { public function add_metadata($object) { $this->metadata[] = $object; } public function generate(XMLGenericDocument &$doc, DOMNode &$item, $namespace) { $node = $doc->append_new_element_ns($item, $namespace, cc_qti_tags::itemmetadata); if (!empty($this->metadata)) { foreach ($this->metadata as $metaitem) { $metaitem->generate($doc, $node, $namespace); } } } } class cc_assesment_decvartype extends cc_question_metadata_base { public function __construct() { $this->set_setting(cc_qti_tags::varname, cc_qti_values::SCORE); $this->set_setting(cc_qti_tags::vartype, cc_qti_values::Integer); $this->set_setting(cc_qti_tags::minvalue); $this->set_setting(cc_qti_tags::maxvalue); } public function set_vartype($value) { $this->set_setting(cc_qti_tags::vartype, $value); } public function set_limits($min = null, $max = null) { $this->set_setting(cc_qti_tags::minvalue, $min); $this->set_setting(cc_qti_tags::maxvalue, $max); } public function generate(XMLGenericDocument &$doc, DOMNode &$item, $namespace) { $node = $doc->append_new_element_ns($item, $namespace, cc_qti_tags::decvar); $this->generate_attributes($doc, $node, $namespace); } } class cc_assignment_conditionvar_othertype extends cc_question_metadata_base { public function generate(XMLGenericDocument &$doc, DOMNode &$item, $namespace) { $doc->append_new_element_ns($item, $namespace, cc_qti_tags::other); } } class cc_assignment_conditionvar_varequaltype extends cc_question_metadata_base { protected $tagname = null; protected $answerid = null; public function __construct($value = null) { if (is_null($value)) { throw new InvalidArgumentException('Must not pass null!'); } $this->answerid = $value; $this->set_setting(cc_qti_tags::respident); $this->set_setting(cc_qti_tags::case_);//, cc_qti_values::No ); $this->tagname = cc_qti_tags::varequal; } public function set_respident($value) { $this->set_setting(cc_qti_tags::respident, $value); } public function enable_case($value = true) { $this->enable_setting_yesno(cc_qti_tags::case_, $value); } public function generate(XMLGenericDocument &$doc, DOMNode &$item, $namespace) { $node = $doc->append_new_element_ns($item, $namespace, $this->tagname, $this->answerid); $this->generate_attributes($doc, $node, $namespace); } } class cc_assignment_conditionvar_varsubstringtype extends cc_assignment_conditionvar_varequaltype { public function __construct($value) { parent::__construct($value); $this->tagname = cc_qti_tags::varsubstring; } } class cc_assignment_conditionvar_andtype extends cc_question_metadata_base { protected $nots = array(); protected $varequals = array(); public function set_not(cc_assignment_conditionvar_varequaltype $object) { $this->nots[] = $object; } public function set_varequal(cc_assignment_conditionvar_varequaltype $object) { $this->varequals[] = $object; } public function generate(XMLGenericDocument &$doc, DOMNode &$item, $namespace) { $node = $doc->append_new_element_ns($item, $namespace, cc_qti_tags::and_); if (!empty($this->nots)) { foreach ($this->nots as $notv) { $not = $doc->append_new_element_ns($node, $namespace, cc_qti_tags::not_); $notv->generate($doc, $not, $namespace); } } if (!empty($this->varequals)) { foreach ($this->varequals as $varequal) { $varequal->generate($doc, $node, $namespace); } } } } class cc_assignment_conditionvar extends cc_question_metadata_base { /** * @var cc_assignment_conditionvar_andtype */ protected $and = null; /** * @var cc_assignment_conditionvar_othertype */ protected $other = null; /** * @var array */ protected $varequal = array(); /** * @var cc_assignment_conditionvar_varsubstringtype */ protected $varsubstring = null; public function set_and(cc_assignment_conditionvar_andtype $object) { $this->and = $object; } public function set_other(cc_assignment_conditionvar_othertype $object) { $this->other = $object; } public function set_varequal(cc_assignment_conditionvar_varequaltype $object) { $this->varequal[] = $object; } public function set_varsubstring(cc_assignment_conditionvar_varsubstringtype $object) { $this->varsubstring = $object; } public function generate(XMLGenericDocument &$doc, DOMNode &$item, $namespace) { $node = $doc->append_new_element_ns($item, $namespace, cc_qti_tags::conditionvar); if (!empty($this->and)) { $this->and->generate($doc, $node, $namespace); } if (!empty($this->other)) { $this->other->generate($doc, $node, $namespace); } if (!empty($this->varequal)) { foreach ($this->varequal as $varequal) { $varequal->generate($doc, $node, $namespace); } } if (!empty($this->varsubstring)) { $this->varsubstring->generate($doc, $node, $namespace); } } } class cc_assignment_displayfeedbacktype extends cc_question_metadata_base { public function __construct() { $this->set_setting(cc_qti_tags::feedbacktype); $this->set_setting(cc_qti_tags::linkrefid); } public function set_feedbacktype($value) { $this->set_setting(cc_qti_tags::feedbacktype, $value); } public function set_linkrefid($value) { $this->set_setting(cc_qti_tags::linkrefid, $value); } public function generate(XMLGenericDocument &$doc, DOMNode &$item, $namespace) { $node = $doc->append_new_element_ns($item, $namespace, cc_qti_tags::displayfeedback); $this->generate_attributes($doc, $node, $namespace); } } class cc_assignment_setvartype extends cc_question_metadata_base { /** * @var integer */ protected $tagvalue = null; public function __construct($tagvalue = 100) { $this->set_setting(cc_qti_tags::varname, cc_qti_values::SCORE); $this->set_setting(cc_qti_tags::action , cc_qti_values::Set ); $this->tagvalue = $tagvalue; } public function set_varname($value) { $this->set_setting(cc_qti_tags::varname, $value); } public function generate(XMLGenericDocument &$doc, DOMNode &$item, $namespace) { $node = $doc->append_new_element_ns($item, $namespace, cc_qti_tags::setvar, $this->tagvalue); $this->generate_attributes($doc, $node, $namespace); } } class cc_assesment_respconditiontype extends cc_question_metadata_base { /** * @var cc_assignment_conditionvar */ protected $conditionvar = null; protected $setvar = array(); protected $displayfeedback = array(); public function __construct() { $this->set_setting(cc_qti_tags::title); $this->set_setting(cc_qti_tags::continue_, cc_qti_values::No); } public function set_title($value) { $this->set_setting(cc_qti_tags::title, $value); } public function enable_continue($value = true) { $this->enable_setting_yesno(cc_qti_tags::continue_, $value); } public function set_conditionvar(cc_assignment_conditionvar $object) { $this->conditionvar = $object; } public function add_setvar(cc_assignment_setvartype $object) { $this->setvar[] = $object; } public function add_displayfeedback(cc_assignment_displayfeedbacktype $object) { $this->displayfeedback[] = $object; } public function generate(XMLGenericDocument &$doc, DOMNode &$item, $namespace) { $node = $doc->append_new_element_ns($item, $namespace, cc_qti_tags::respcondition); $this->generate_attributes($doc, $node, $namespace); if (!empty($this->conditionvar)) { $this->conditionvar->generate($doc, $node, $namespace); } if (!empty($this->setvar)) { foreach ($this->setvar as $setvar) { $setvar->generate($doc, $node, $namespace); } } if (!empty($this->displayfeedback)) { foreach ($this->displayfeedback as $displayfeedback) { $displayfeedback->generate($doc, $node, $namespace); } } } } class cc_assesment_resprocessingtype extends cc_question_metadata_base { /** * @var cc_assesment_decvartype */ protected $decvar = null; /** * @var array */ protected $respconditions = array(); public function set_decvar(cc_assesment_decvartype $object) { $this->decvar = $object; } public function add_respcondition(cc_assesment_respconditiontype $object) { $this->respconditions[] = $object; } public function generate(XMLGenericDocument &$doc, DOMNode &$item, $namespace) { $node = $doc->append_new_element_ns($item, $namespace, cc_qti_tags::resprocessing); $outcomes = $doc->append_new_element_ns($node, $namespace, cc_qti_tags::outcomes); if (!empty($this->decvar)) { $this->decvar->generate($doc, $outcomes, $namespace); } if (!empty($this->respconditions)) { foreach ($this->respconditions as $rcond) { $rcond->generate($doc, $node, $namespace); } } } } class cc_assesment_itemfeedback_shintmaterial_base extends cc_question_metadata_base { /** * @var string */ protected $tagname = null; /** * @var array */ protected $flow_mats = array(); /** * @var array */ protected $materials = array(); /** * @param cc_assesment_flow_mattype $object */ public function add_flow_mat(cc_assesment_flow_mattype $object) { $this->flow_mats[] = $object; } /** * @param cc_assesment_material $object */ public function add_material(cc_assesment_material $object) { $this->materials[] = $object; } public function generate(XMLGenericDocument &$doc, DOMNode &$item, $namespace) { $node = $doc->append_new_element_ns($item, $namespace, $this->tagname); if (!empty($this->flow_mats)) { foreach ($this->flow_mats as $flow_mat) { $flow_mat->generate($doc, $node, $namespace); } } if (!empty($this->materials)) { foreach ($this->materials as $material) { $material->generate($doc, $node, $namespace); } } } } class cc_assesment_itemfeedback_hintmaterial extends cc_assesment_itemfeedback_shintmaterial_base { public function __construct() { $this->tagname = cc_qti_tags::hint; } } class cc_assesment_itemfeedback_solutionmaterial extends cc_assesment_itemfeedback_shintmaterial_base { public function __construct() { $this->tagname = cc_qti_tags::solutionmaterial; } } class cc_assesment_itemfeedback_shintype_base extends cc_question_metadata_base { /** * @var string */ protected $tagname = null; /** * @var array */ protected $items = array(); public function __construct() { $this->set_setting(cc_qti_tags::feedbackstyle, cc_qti_values::Complete); } public function generate(XMLGenericDocument &$doc, DOMNode &$item, $namespace) { $node = $doc->append_new_element_ns($item, $namespace, $this->tagname); $this->generate_attributes($doc, $node, $namespace); if (!empty($this->items)) { foreach ($this->items as $telement) { $telement->generate($doc, $node, $namespace); } } } } class cc_assesment_itemfeedback_solutiontype extends cc_assesment_itemfeedback_shintype_base { public function __construct() { parent::__construct(); $this->tagname = cc_qti_tags::solution; } /** * @param cc_assesment_itemfeedback_solutionmaterial $object */ public function add_solutionmaterial(cc_assesment_itemfeedback_solutionmaterial $object) { $this->items[] = $object; } } class cc_assesment_itemfeedbac_hinttype extends cc_assesment_itemfeedback_shintype_base { public function __construct() { parent::__construct(); $this->tagname = cc_qti_tags::hint; } /** * @param cc_assesment_itemfeedback_hintmaterial $object */ public function add_hintmaterial(cc_assesment_itemfeedback_hintmaterial $object) { $this->items[] = $object; } } class cc_assesment_itemfeedbacktype extends cc_question_metadata_base { /** * @var cc_assesment_flow_mattype */ protected $flow_mat = null; /** * @var cc_assesment_material */ protected $material = null; /** * @var cc_assesment_itemfeedback_solutiontype */ protected $solution = null; protected $hint = null; /** @var cc_assignment_displayfeedbacktype item feedback. */ protected $itemfeedback; public function __construct() { $this->set_setting(cc_qti_tags::ident, cc_helpers::uuidgen('I_')); $this->set_setting(cc_qti_tags::title); } /** * @param string $value */ public function set_ident($value) { $this->set_setting(cc_qti_tags::ident, $value); } /** * @param string $value */ public function set_title($value) { $this->set_setting(cc_qti_tags::title, $value); } /** * @param cc_assesment_flow_mattype $object */ public function set_flow_mat(cc_assesment_flow_mattype $object) { $this->flow_mat = $object; } /** * @param cc_assesment_material $object */ public function set_material(cc_assesment_material $object) { $this->material = $object; } /** * @param cc_assesment_itemfeedback_solutiontype $object */ public function set_solution(cc_assesment_itemfeedback_solutiontype $object) { $this->solution = $object; } public function set_hint($object) { $this->hint = $object; } public function generate(XMLGenericDocument &$doc, DOMNode &$item, $namespace) { $node = $doc->append_new_element_ns($item, $namespace, cc_qti_tags::itemfeedback); $this->generate_attributes($doc, $node, $namespace); if (!empty($this->flow_mat) && empty($this->material)) { $this->flow_mat->generate($doc, $node, $namespace); } if (!empty($this->material) && empty($this->flow_mat)) { $this->material->generate($doc, $node, $namespace); } if (!empty($this->solution)) { $this->solution->generate($doc, $node, $namespace); } if (!empty($this->itemfeedback)) { $this->itemfeedback->generate($doc, $node, $namespace); } } } class cc_assesment_section_item extends cc_assesment_section { /** * @var cc_assesment_itemmetadata */ protected $itemmetadata = null; /** * @var cc_assesment_presentation */ protected $presentation = null; protected $resprocessing = array(); protected $itemfeedback = array(); public function set_itemmetadata(cc_assesment_itemmetadata $object) { $this->itemmetadata = $object; } public function set_presentation(cc_assesment_presentation $object) { $this->presentation = $object; } public function add_resprocessing(cc_assesment_resprocessingtype $object) { $this->resprocessing[] = $object; } public function add_itemfeedback(cc_assesment_itemfeedbacktype $object) { $this->itemfeedback[] = $object; } public function generate(XMLGenericDocument &$doc, DOMNode &$item, $namespace) { $node = $doc->append_new_element_ns($item, $namespace, cc_qti_tags::item); $this->generate_attributes($doc, $node, $namespace); if (!empty($this->itemmetadata)) { $this->itemmetadata->generate($doc, $node, $namespace); } if (!empty($this->presentation)) { $this->presentation->generate($doc, $node, $namespace); } if (!empty($this->resprocessing)) { foreach ($this->resprocessing as $resprocessing) { $resprocessing->generate($doc, $node, $namespace); } } if (!empty($this->itemfeedback)) { foreach ($this->itemfeedback as $itemfeedback) { $itemfeedback->generate($doc, $node, $namespace); } } } } class cc_assesment_render_choicetype extends cc_question_metadata_base { /** * @var array */ protected $materials = array(); /** * @var array */ protected $material_refs = array(); /** * @var array */ protected $response_labels = array(); /** * @var array */ protected $flow_labels = array(); public function __construct() { $this->set_setting(cc_qti_tags::shuffle, cc_qti_values::No); $this->set_setting(cc_qti_tags::minnumber); $this->set_setting(cc_qti_tags::maxnumber); } public function add_material(cc_assesment_material $object) { $this->materials[] = $object; } public function add_material_ref(cc_assesment_response_matref $object) { $this->material_refs[] = $object; } public function add_response_label(cc_assesment_response_labeltype $object) { $this->response_labels[] = $object; } public function add_flow_label($object) { $this->flow_labels[] = $object; } public function enable_shuffle($value = true) { $this->enable_setting_yesno(cc_qti_tags::shuffle, $value); } public function set_limits($min = null, $max = null) { $this->set_setting(cc_qti_tags::minnumber, $min); $this->set_setting(cc_qti_tags::maxnumber, $max); } public function generate(XMLGenericDocument &$doc, DOMNode &$item, $namespace) { $node = $doc->append_new_element_ns($item, $namespace, cc_qti_tags::render_choice); $this->generate_attributes($doc, $node, $namespace); if (!empty($this->materials)) { foreach ($this->materials as $mattag) { $mattag->generate($doc, $node, $namespace); } } if (!empty($this->material_refs)) { foreach ($this->material_refs as $matreftag) { $matreftag->generate($doc, $node, $namespace); } } if (!empty($this->response_labels)) { foreach ($this->response_labels as $resplabtag) { $resplabtag->generate($doc, $node, $namespace); } } if (!empty($this->flow_labels)) { foreach ($this->flow_labels as $flowlabtag) { $flowlabtag->generate($doc, $node, $namespace); } } } } class cc_assesment_flow_mattype extends cc_question_metadata_base { /** * @var cc_assesment_material */ protected $material = null; /** * @var cc_assesment_response_matref */ protected $material_ref = null; /** * @var cc_assesment_flow_mattype */ protected $flow_mat = null; public function __construct() { $this->set_setting(cc_qti_tags::t_class); } public function set_class($value) { $this->set_setting(cc_qti_tags::t_class, $value); } public function set_material(cc_assesment_material $object) { $this->material = $object; } public function set_material_ref(cc_assesment_response_matref $object) { $this->material_ref = $object; } public function set_flow_mat(cc_assesment_flow_mattype $object) { $this->flow_mat = $object; } public function generate(XMLGenericDocument &$doc, DOMNode &$item, $namespace) { $node = $doc->append_new_element_ns($item, $namespace, cc_qti_tags::flow_mat); $this->generate_attributes($doc, $node, $namespace); if (!empty($this->flow_mat)) { $this->flow_mat->generate($doc, $node, $namespace); } if (!empty($this->material)) { $this->material->generate($doc, $node, $namespace); } if (!empty($this->material_ref)) { $this->material_ref->generate($doc, $node, $namespace); } } } class cc_assesment_response_labeltype extends cc_question_metadata_base { /** * @var cc_assesment_material */ protected $material = null; /** * @var cc_assesment_response_matref */ protected $material_ref = null; /** * @var cc_assesment_flow_mattype */ protected $flow_mat = null; public function __construct() { $this->set_setting(cc_qti_tags::ident, cc_helpers::uuidgen('I_')); $this->set_setting(cc_qti_tags::labelrefid); $this->set_setting(cc_qti_tags::rshuffle); $this->set_setting(cc_qti_tags::match_group); $this->set_setting(cc_qti_tags::match_max); } public function set_ident($value) { $this->set_setting(cc_qti_tags::ident, $value); } public function get_ident() { return $this->get_setting(cc_qti_tags::ident); } public function set_labelrefid($value) { $this->set_setting(cc_qti_tags::labelrefid, $value); } public function enable_rshuffle($value = true) { $this->enable_setting_yesno(cc_qti_tags::rshuffle, $value); } public function set_match_group($value) { $this->set_setting(cc_qti_tags::match_group, $value); } public function set_match_max($value) { $this->set_setting(cc_qti_tags::match_max, $value); } public function set_material(cc_assesment_material $object) { $this->material = $object; } public function set_material_ref(cc_assesment_response_matref $object) { $this->material_ref = $object; } public function set_flow_mat(cc_assesment_flow_mattype $object) { $this->flow_mat = $object; } public function generate(XMLGenericDocument &$doc, DOMNode &$item, $namespace) { $node = $doc->append_new_element_ns($item, $namespace, cc_qti_tags::response_label); $this->generate_attributes($doc, $node, $namespace); if (!empty($this->material)) { $this->material->generate($doc, $node, $namespace); } if (!empty($this->material_ref)) { $this->material_ref->generate($doc, $node, $namespace); } if (!empty($this->flow_mat)) { $this->flow_mat->generate($doc, $node, $namespace); } } } class cc_assesment_flow_labeltype extends cc_question_metadata_base { /** * @var cc_assesment_flow_labeltype */ protected $flow_label = null; /** * @var cc_assesment_response_labeltype */ protected $response_label = null; /** @var cc_assesment_material assesment material. */ protected $material; /** @var cc_assesment_response_matref assesment response material ref. */ protected $material_ref; public function __construct() { $this->set_setting(cc_qti_tags::t_class); } public function set_class($value) { $this->set_setting(cc_qti_tags::t_class, $value); } public function set_flow_label(cc_assesment_flow_labeltype $object) { $this->flow_label = $object; } public function set_response_label(cc_assesment_response_labeltype $object) { $this->response_label = $object; } public function generate(XMLGenericDocument &$doc, DOMNode &$item, $namespace) { $node = $doc->append_new_element_ns($item, $namespace, cc_qti_tags::flow_label); $this->generate_attributes($doc, $node, $namespace); if (!empty($this->material)) { $this->material->generate($doc, $node, $namespace); } if (!empty($this->material_ref)) { $this->material_ref->generate($doc, $node, $namespace); } if (!empty($this->response_label)) { $this->response_label->generate($doc, $node, $namespace); } if (!empty($this->flow_label)) { $this->flow_label->generate($doc, $node, $namespace); } } } class cc_assesment_render_fibtype extends cc_question_metadata_base { /** * @var cc_assesment_material */ protected $material = null; /** * @var cc_assesment_response_matref */ protected $material_ref = null; /** * @var cc_assesment_response_labeltype */ protected $response_label = null; /** * * Enter description here ... * @var unknown_type */ protected $flow_label = null; public function __construct() { $this->set_setting(cc_qti_tags::encoding ); $this->set_setting(cc_qti_tags::charset ); $this->set_setting(cc_qti_tags::rows ); $this->set_setting(cc_qti_tags::columns ); $this->set_setting(cc_qti_tags::maxchars ); $this->set_setting(cc_qti_tags::minnumber); $this->set_setting(cc_qti_tags::maxnumber); $this->set_setting(cc_qti_tags::prompt, cc_qti_values::Box); $this->set_setting(cc_qti_tags::fibtype, cc_qti_values::String); } public function set_encoding($value) { $this->set_setting(cc_qti_tags::encoding, $value); } public function set_charset($value) { $this->set_setting(cc_qti_tags::charset, $value); } public function set_rows($value) { $this->set_setting(cc_qti_tags::rows, $value); } public function set_columns($value) { $this->set_setting(cc_qti_tags::columns, $value); } public function set_maxchars($value) { $this->set_setting(cc_qti_tags::columns, $value); } public function set_limits($min = null, $max = null) { $this->set_setting(cc_qti_tags::minnumber, $min); $this->set_setting(cc_qti_tags::maxnumber, $max); } public function set_prompt($value) { $this->set_setting(cc_qti_tags::prompt, $value); } public function set_fibtype($value) { $this->set_setting(cc_qti_tags::fibtype, $value); } public function set_material(cc_assesment_material $object) { $this->material = $object; } public function set_material_ref(cc_assesment_response_matref $object) { $this->material_ref = $object; } public function set_response_label(cc_assesment_response_labeltype $object) { $this->response_label = $object; } public function set_flow_label($object) { $this->flow_label = $object; } public function generate(XMLGenericDocument &$doc, DOMNode &$item, $namespace) { $node = $doc->append_new_element_ns($item, $namespace, cc_qti_tags::render_fib); $this->generate_attributes($doc, $node, $namespace); if (!empty($this->material) && empty($this->material_ref)) { $this->material->generate($doc, $node, $namespace); } if (!empty($this->material_ref) && empty($this->material)) { $this->material_ref->generate($doc, $node, $namespace); } if (!empty($this->response_label)) { $this->response_label->generate($doc, $node, $namespace); } if (!empty($this->flow_label)) { $this->flow_label->generate($doc, $node, $namespace); } } } class cc_response_lidtype extends cc_question_metadata_base { /** * @var string */ protected $tagname = null; /** * @var cc_assesment_material */ protected $material = null; /** * @var cc_assesment_response_matref */ protected $material_ref = null; /** * @var cc_assesment_render_choicetype */ protected $render_choice = null; /** * @var cc_assesment_render_fibtype */ protected $render_fib = null; public function __construct() { $this->set_setting(cc_qti_tags::rcardinality, cc_qti_values::Single); $this->set_setting(cc_qti_tags::rtiming); $this->set_setting(cc_qti_tags::ident, cc_helpers::uuidgen('I_')); $this->tagname = cc_qti_tags::response_lid; } public function set_rcardinality($value) { $this->set_setting(cc_qti_tags::rcardinality, $value); } public function enable_rtiming($value = true) { $this->enable_setting_yesno(cc_qti_tags::rtiming, $value); } public function set_ident($value) { $this->set_setting(cc_qti_tags::ident, $value); } public function get_ident() { return $this->get_setting(cc_qti_tags::ident); } public function set_material_ref(cc_assesment_response_matref $object) { $this->material_ref = $object; } public function set_material(cc_assesment_material $object) { $this->material = $object; } public function set_render_choice(cc_assesment_render_choicetype $object) { $this->render_choice = $object; } public function set_render_fib(cc_assesment_render_fibtype $object) { $this->render_fib = $object; } public function generate(XMLGenericDocument &$doc, DOMNode &$item, $namespace) { $node = $doc->append_new_element_ns($item, $namespace, $this->tagname); $this->generate_attributes($doc, $node, $namespace); if (!empty($this->material) && empty($this->material_ref)) { $this->material->generate($doc, $node, $namespace); } if (!empty($this->material_ref) && empty($this->material)) { $this->material_ref->generate($doc, $node, $namespace); } if (!empty($this->render_choice) && empty($this->render_fib)) { $this->render_choice->generate($doc, $node, $namespace); } if (!empty($this->render_fib) && empty($this->render_choice)) { $this->render_fib->generate($doc, $node, $namespace); } } } class cc_assesment_response_strtype extends cc_response_lidtype { public function __construct() { $rtt = parent::__construct(); $this->tagname = cc_qti_tags::response_str; } } class cc_assesment_flowtype extends cc_question_metadata_base { /** * @var cc_assesment_flowtype */ protected $flow = null; /** * @var cc_assesment_material */ protected $material = null; /** * @var cc_assesment_response_matref */ protected $material_ref = null; /** * @var cc_response_lidtype */ protected $response_lid = null; /** * @var cc_assesment_response_strtype */ protected $response_str = null; public function __construct() { $this->set_setting(cc_qti_tags::t_class); } public function set_class($value) { $this->set_setting(cc_qti_tags::t_class, $value); } public function set_flow(cc_assesment_flowtype $object) { $this->flow = $object; } public function set_material(cc_assesment_material $object) { $this->material = $object; } public function set_material_ref(cc_assesment_response_matref $object) { $this->material_ref = $object; } public function set_response_lid(cc_response_lidtype $object) { $this->response_lid = $object; } public function set_response_str(cc_assesment_response_strtype $object) { $this->response_str = $object; } public function generate(XMLGenericDocument &$doc, DOMNode &$item, $namespace) { $node = $doc->append_new_element_ns($item, $namespace, cc_qti_tags::flow); $this->generate_attributes($doc, $node, $namespace); if (!empty($this->flow)) { $this->flow->generate($doc, $node, $namespace); } if (!empty($this->material)) { $this->material->generate($doc, $node, $namespace); } if (!empty($this->response_lid)) { $this->response_lid->generate($doc, $node, $namespace); } if (!empty($this->response_str)) { $this->response_str->generate($doc, $node, $namespace); } } } class cc_assesment_presentation extends cc_question_metadata_base { /** * @var cc_assesment_flowtype */ protected $flow = null; /** * @var cc_assesment_material */ protected $material = null; /** * @var cc_response_lidtype */ protected $response_lid = null; /** * @var cc_assesment_response_strtype */ protected $response_str = null; public function __construct() { $this->set_setting(cc_qti_tags::label); $this->set_setting_wns(cc_qti_tags::xml_lang , cc_xml_namespace::xml); $this->set_setting(cc_qti_tags::x0); $this->set_setting(cc_qti_tags::y0); $this->set_setting(cc_qti_tags::width); $this->set_setting(cc_qti_tags::height); } public function set_label($value) { $this->set_setting(cc_qti_tags::label, $value); } public function set_lang($value) { $this->set_setting_wns(cc_qti_tags::xml_lang , cc_xml_namespace::xml, $value); } public function set_coor($x = null, $y = null) { $this->set_setting(cc_qti_tags::x0, $x); $this->set_setting(cc_qti_tags::y0, $y); } public function set_size($width = null, $height = null) { $this->set_setting(cc_qti_tags::width, $width); $this->set_setting(cc_qti_tags::height, $height); } public function set_flow(cc_assesment_flowtype $object) { $this->flow = $object; } public function set_material(cc_assesment_material $object) { $this->material = $object; } public function set_response_lid(cc_response_lidtype $object) { $this->response_lid = $object; } public function set_response_str(cc_assesment_response_strtype $object) { $this->response_str = $object; } public function generate(XMLGenericDocument &$doc, DOMNode &$item, $namespace) { $node = $doc->append_new_element_ns($item, $namespace, cc_qti_tags::presentation); $this->generate_attributes($doc, $node, $namespace); if (!empty($this->flow)) { $this->flow->generate($doc, $node, $namespace); } if (!empty($this->material) && empty($this->flow)) { $this->material->generate($doc, $node, $namespace); } if (!empty($this->response_lid) && empty($this->flow)) { $this->response_lid->generate($doc, $node, $namespace); } if (!empty($this->response_str) && empty($this->flow)) { $this->response_str->generate($doc, $node, $namespace); } } } class assesment1_resurce_file extends general_cc_file { const deafultname = 'assesment.xml'; protected $rootns = 'xmlns'; protected $rootname = cc_qti_tags::questestinterop; protected $ccnamespaces = array('xmlns' => 'http://www.imsglobal.org/xsd/ims_qtiasiv1p2', 'xsi' => 'http://www.w3.org/2001/XMLSchema-instance'); protected $ccnsnames = array('xmlns' => 'http://www.imsglobal.org/profile/cc/ccv1p0/derived_schema/domainProfile_4/ims_qtiasiv1p2_localised.xsd'); /** * @var string */ protected $assessment_title = 'Untitled'; /** * @var cc_assesment_metadata */ protected $metadata = null; /** * @var cc_assesment_rubric_base */ protected $rubric = null; /** * @var cc_assesment_presentation_material_base */ protected $presentation_material = null; /** * @var cc_assesment_section */ protected $section = null; public function set_metadata(cc_assesment_metadata $object) { $this->metadata = $object; } public function set_rubric(cc_assesment_rubric_base $object) { $this->rubric = $object; } public function set_presentation_material(cc_assesment_presentation_material_base $object) { $this->presentation_material = $object; } public function set_section(cc_assesment_section $object) { $this->section = $object; } public function set_title($value) { $this->assessment_title = self::safexml($value); } protected function on_save() { $rns = $this->ccnamespaces[$this->rootns]; //root assesment element - required $assessment = $this->append_new_element_ns($this->root, $rns, cc_qti_tags::assessment); $this->append_new_attribute_ns($assessment, $rns, cc_qti_tags::ident, cc_helpers::uuidgen('QDB_')); $this->append_new_attribute_ns($assessment, $rns, cc_qti_tags::title, $this->assessment_title); //metadata - optional if (!empty($this->metadata)) { $this->metadata->generate($this, $assessment, $rns); } //rubric - optional if (!empty($this->rubric)) { $this->rubric->generate($this, $assessment, $rns); } //presentation_material - optional if (!empty($this->presentation_material)) { $this->presentation_material->generate($this, $assessment, $rns); } //section - required if (!empty($this->section)) { $this->section->generate($this, $assessment, $rns); } return true; } } class assesment11_resurce_file extends assesment1_resurce_file { protected $ccnsnames = array('xmlns' => 'http://www.imsglobal.org/profile/cc/ccv1p1/ccv1p1_qtiasiv1p2p1_v1p0.xsd'); } abstract class cc_assesment_helper { public static $correct_fb = null; public static $incorrect_fb = null; public static function add_feedback($qitem, $content, $content_type, $ident) { if (empty($content)) { return false; } $qitemfeedback = new cc_assesment_itemfeedbacktype(); $qitem->add_itemfeedback($qitemfeedback); if (!empty($ident)) { $qitemfeedback->set_ident($ident); } $qflowmat = new cc_assesment_flow_mattype(); $qitemfeedback->set_flow_mat($qflowmat); $qmaterialfb = new cc_assesment_material(); $qflowmat->set_material($qmaterialfb); $qmattext = new cc_assesment_mattext(); $qmaterialfb->set_mattext($qmattext); $qmattext->set_content($content, $content_type); return true; } public static function add_answer($qresponse_choice, $content, $content_type) { $qresponse_label = new cc_assesment_response_labeltype(); $qresponse_choice->add_response_label($qresponse_label); $qrespmaterial = new cc_assesment_material(); $qresponse_label->set_material($qrespmaterial); $qrespmattext = new cc_assesment_mattext(); $qrespmaterial->set_mattext($qrespmattext); $qrespmattext->set_content($content, $content_type); return $qresponse_label; } public static function add_response_condition($node, $title, $ident, $feedback_refid, $respident) { $qrespcondition = new cc_assesment_respconditiontype(); $node->add_respcondition($qrespcondition); //define rest of the conditions $qconditionvar = new cc_assignment_conditionvar(); $qrespcondition->set_conditionvar($qconditionvar); $qvarequal = new cc_assignment_conditionvar_varequaltype($ident); $qvarequal->enable_case(); $qconditionvar->set_varequal($qvarequal); $qvarequal->set_respident($respident); $qdisplayfeedback = new cc_assignment_displayfeedbacktype(); $qrespcondition->add_displayfeedback($qdisplayfeedback); $qdisplayfeedback->set_feedbacktype(cc_qti_values::Response); $qdisplayfeedback->set_linkrefid($feedback_refid); } public static function add_assesment_description($rt, $content, $contenttype) { if (empty($rt) || empty($content)) { return; } $activity_rubric = new cc_assesment_rubric_base(); $rubric_material = new cc_assesment_material(); $activity_rubric->set_material($rubric_material); $rubric_mattext = new cc_assesment_mattext(); $rubric_material->set_label('Summary'); $rubric_material->set_mattext($rubric_mattext); $rubric_mattext->set_content($content, $contenttype); $rt->set_rubric($activity_rubric); } public static function add_respcondition($node, $title, $feedback_refid, $grade_value = null, $continue = false ) { $qrespcondition = new cc_assesment_respconditiontype(); $qrespcondition->set_title($title); $node->add_respcondition($qrespcondition); $qrespcondition->enable_continue($continue); //Add setvar if grade present if ($grade_value !== null) { $qsetvar = new cc_assignment_setvartype($grade_value); $qrespcondition->add_setvar($qsetvar); } //define the condition for success $qconditionvar = new cc_assignment_conditionvar(); $qrespcondition->set_conditionvar($qconditionvar); $qother = new cc_assignment_conditionvar_othertype(); $qconditionvar->set_other($qother); $qdisplayfeedback = new cc_assignment_displayfeedbacktype(); $qrespcondition->add_displayfeedback($qdisplayfeedback); $qdisplayfeedback->set_feedbacktype(cc_qti_values::Response); $qdisplayfeedback->set_linkrefid($feedback_refid); } /** * * Enter description here ... * @param XMLGenericDocument $qdoc * @param unknown_type $manifest * @param cc_assesment_section $section * @param unknown_type $rootpath * @param unknown_type $contextid * @param unknown_type $outdir */ public static function process_questions(&$qdoc, &$manifest, cc_assesment_section &$section, $rootpath, $contextid, $outdir) { $question_file = $rootpath . DIRECTORY_SEPARATOR . 'questions.xml'; //load questions file $questions = new XMLGenericDocument(); if (!$questions->load($question_file)) { return false; } pkg_resource_dependencies::instance()->reset(); $questioncount = 0; $questionforexport = 0; $qids = $qdoc->nodeList('//question_instances//questionid'); foreach ($qids as $qid) { /** @var DOMNode $qid */ $value = $qid->nodeValue; if (intval($value) == 0) { continue; } $question_node = $questions->node("//question_category/questions/question[@id='{$value}']"); if (empty($question_node)) { continue; } ++$questionforexport; //process question //question type $qtype = $questions->nodeValue('qtype', $question_node); $question_processor = null; switch ($qtype) { case 'multichoice': $single_correct_answer = (int)$questions->nodeValue('plugin_qtype_multichoice_question/multichoice/single', $question_node) > 0; //TODO: Add checking for the nunmber of valid responses //If question is marked as multi response but contains only one valid answer it //should be handle as single response - classic multichoice if ($single_correct_answer) { $question_processor = new cc_assesment_question_multichoice($qdoc, $questions, $manifest, $section, $question_node, $rootpath, $contextid, $outdir); } else { $question_processor = new cc_assesment_question_multichoice_multiresponse($qdoc, $questions, $manifest, $section, $question_node, $rootpath, $contextid, $outdir); } $question_processor->generate(); ++$questioncount; break; case 'truefalse': $question_processor = new cc_assesment_question_truefalse($qdoc, $questions, $manifest, $section, $question_node, $rootpath, $contextid, $outdir); $question_processor->generate(); ++$questioncount; break; case 'essay': $question_processor = new cc_assesment_question_essay($qdoc, $questions, $manifest, $section, $question_node, $rootpath, $contextid, $outdir); $question_processor->generate(); ++$questioncount; break; case 'shortanswer': //This is rather ambiguos since shortanswer supports partial pattern match //In order to detect pattern match we need to scan for all the responses //if at least one of the responses uses wildcards it should be treated as //pattern match, otherwise it should be simple fill in the blank if (self::has_matching_element($questions, $question_node)) { //$question_processor = new cc_assesment_question_patternmatch($qdoc, $questions, $manifest, $section, $question_node, $rootpath, $contextid, $outdir); $questionforexport--; } else { $question_processor = new cc_assesment_question_sfib($qdoc, $questions, $manifest, $section, $question_node, $rootpath, $contextid, $outdir); } if (!empty($question_processor)) { $question_processor->generate(); ++$questioncount; } break; default: ; break; } } //return dependencies return ($questioncount == 0) || ($questioncount != $questionforexport)? false: pkg_resource_dependencies::instance()->get_deps(); } /** * * Checks if question has matching element * @param XMLGenericDocument $questions * @param object $question_node * @return bool */ public static function has_matching_element(XMLGenericDocument $questions, $question_node) { $answers = $questions->nodeList('plugin_qtype_shortanswer_question//answertext', $question_node); $result = false; foreach ($answers as $answer) { $prepare = str_replace('\*', '\#', $answer->nodeValue); $result = (strpos($prepare, '*') !== false); if ($result) { break; } } return $result; } } class cc_assesment_question_proc_base { /** * @var XMLGenericDocument */ protected $quiz = null; /** * @var XMLGenericDocument */ protected $questions = null; /** * @var cc_manifest */ protected $manifest = null; /** * @var cc_assesment_section */ protected $section = null; /** * @var DOMElement */ protected $question_node = null; /** * @var string */ protected $rootpath = null; /** * @var string */ protected $contextid = null; /** * @var string */ protected $outdir = null; /** * @var string */ protected $qtype = null; /** * @var cc_question_metadata */ protected $qmetadata = null; /** * @var cc_assesment_section_item */ protected $qitem = null; /** * @var cc_assesment_presentation */ protected $qpresentation = null; /** * @var cc_response_lidtype */ protected $qresponse_lid = null; protected $qresprocessing = null; protected $correct_grade_value = null; protected $correct_answer_node_id = null; protected $correct_answer_ident = null; protected $total_grade_value = null; protected $answerlist = null; protected $general_feedback = null; protected $correct_feedbacks = array(); protected $incorrect_feedbacks = array(); /** * @param XMLGenericDocument $questions * @param cc_manifest $manifest * @param cc_assesment_section $section * @param DOMElement $question_node * @param string $rootpath * @param string $contextid * @param string $outdir */ public function __construct(XMLGenericDocument &$quiz, XMLGenericDocument &$questions, cc_manifest &$manifest, cc_assesment_section &$section, &$question_node, $rootpath, $contextid, $outdir) { $this->quiz = $quiz; $this->questions = $questions; $this->manifest = $manifest; $this->section = $section; $this->question_node = $question_node; $this->rootpath = $rootpath; $this->contextid = $contextid; $this->outdir = $outdir; // $qitem = new cc_assesment_section_item(); $this->section->add_item($qitem); $qitem->set_title($this->questions->nodeValue('name', $this->question_node)); $this->qitem = $qitem; } public function on_generate_metadata() { if (empty($this->qmetadata)) { $this->qmetadata = new cc_question_metadata($this->qtype); //Get weighting value $weighting_value = (int)$this->questions->nodeValue('defaultmark', $this->question_node); if ($weighting_value > 1) { $this->qmetadata->set_weighting($weighting_value); } //Get category $question_category = $this->questions->nodeValue('../../name', $this->question_node); if (!empty($question_category)) { $this->qmetadata->set_category($question_category); } $rts = new cc_assesment_itemmetadata(); $rts->add_metadata($this->qmetadata); $this->qitem->set_itemmetadata($rts); } } public function on_generate_presentation() { if (empty($this->qpresentation)) { $qpresentation = new cc_assesment_presentation(); $this->qitem->set_presentation($qpresentation); //add question text $qmaterial = new cc_assesment_material(); $qmattext = new cc_assesment_mattext(); $question_text = $this->questions->nodeValue('questiontext', $this->question_node); $result = cc_helpers::process_linked_files( $question_text, $this->manifest, $this->rootpath, $this->contextid, $this->outdir); $qmattext->set_content($result[0], cc_qti_values::htmltype); $qmaterial->set_mattext($qmattext); $qpresentation->set_material($qmaterial); $this->qpresentation = $qpresentation; pkg_resource_dependencies::instance()->add($result[1]); } } public function on_generate_answers() {} public function on_generate_feedbacks() { $general_question_feedback = $this->questions->nodeValue('generalfeedback', $this->question_node); if (empty($general_question_feedback)) { return; } $name = 'general_fb'; //Add question general feedback - the one that should be always displayed $result = cc_helpers::process_linked_files( $general_question_feedback, $this->manifest, $this->rootpath, $this->contextid, $this->outdir); cc_assesment_helper::add_feedback($this->qitem, $result[0], cc_qti_values::htmltype, $name); pkg_resource_dependencies::instance()->add($result[1]); $this->general_feedback = $name; } public function on_generate_response_processing() { $qresprocessing = new cc_assesment_resprocessingtype(); $this->qitem->add_resprocessing($qresprocessing); $qdecvar = new cc_assesment_decvartype(); $qresprocessing->set_decvar($qdecvar); //according to the Common Cartridge 1.1 Profile: Implementation document //this should always be set to 0, 100 in case of question type that is not essay $qdecvar->set_limits(0,100); $qdecvar->set_vartype(cc_qti_values::Decimal); $this->qresprocessing = $qresprocessing; } public function generate() { $this->on_generate_metadata(); $this->on_generate_presentation(); $this->on_generate_answers(); $this->on_generate_feedbacks(); $this->on_generate_response_processing(); } } class cc_assesment_question_multichoice extends cc_assesment_question_proc_base { public function __construct($quiz, $questions, $manifest, $section, $question_node, $rootpath, $contextid, $outdir) { parent::__construct($quiz, $questions, $manifest, $section, $question_node, $rootpath, $contextid, $outdir); $this->qtype = cc_qti_profiletype::multiple_choice; /** * * What is needed is a maximum grade value taken from the answer fraction * It is supposed to always be between 1 and 0 in decimal representation, * however that is not always the case so a change in test was needed * but since we support here one correct answer type * correct answer would always have to be 1 */ $correct_answer_node = $this->questions->node("plugin_qtype_multichoice_question/answers/answer[fraction > 0]", $this->question_node); if (empty($correct_answer_node)) { throw new RuntimeException('No correct answer!'); } $this->correct_answer_node_id = $this->questions->nodeValue('@id', $correct_answer_node); $maximum_quiz_grade = (int)$this->quiz->nodeValue('/activity/quiz/grade'); $this->total_grade_value = ($maximum_quiz_grade + 1).'.0000000'; } public function on_generate_answers() { //add responses holder $qresponse_lid = new cc_response_lidtype(); $this->qresponse_lid = $qresponse_lid; $this->qpresentation->set_response_lid($qresponse_lid); $qresponse_choice = new cc_assesment_render_choicetype(); $qresponse_lid->set_render_choice($qresponse_choice); //Mark that question has only one correct answer - //which applies for multiple choice and yes/no questions $qresponse_lid->set_rcardinality(cc_qti_values::Single); //are we to shuffle the responses? $shuffle_answers = (int)$this->quiz->nodeValue('/activity/quiz/shuffleanswers') > 0; $qresponse_choice->enable_shuffle($shuffle_answers); $answerlist = array(); $qa_responses = $this->questions->nodeList('plugin_qtype_multichoice_question/answers/answer', $this->question_node); foreach ($qa_responses as $node) { $answer_content = $this->questions->nodeValue('answertext', $node); $id = ((int)$this->questions->nodeValue('@id', $node) == $this->correct_answer_node_id); $result = cc_helpers::process_linked_files( $answer_content, $this->manifest, $this->rootpath, $this->contextid, $this->outdir); $qresponse_label = cc_assesment_helper::add_answer( $qresponse_choice, $result[0], cc_qti_values::htmltype); pkg_resource_dependencies::instance()->add($result[1]); $answer_ident = $qresponse_label->get_ident(); $feedback_ident = $answer_ident.'_fb'; if (empty($this->correct_answer_ident) && $id) { $this->correct_answer_ident = $answer_ident; } //add answer specific feedbacks if not empty $content = $this->questions->nodeValue('feedback', $node); if (!empty($content)) { $result = cc_helpers::process_linked_files( $content, $this->manifest, $this->rootpath, $this->contextid, $this->outdir); cc_assesment_helper::add_feedback( $this->qitem, $result[0], cc_qti_values::htmltype, $feedback_ident); pkg_resource_dependencies::instance()->add($result[1]); $answerlist[$answer_ident] = $feedback_ident; } } $this->answerlist = $answerlist; } public function on_generate_feedbacks() { parent::on_generate_feedbacks(); //Question combined feedbacks $correct_question_fb = $this->questions->nodeValue('plugin_qtype_multichoice_question/multichoice/correctfeedback', $this->question_node); $incorrect_question_fb = $this->questions->nodeValue('plugin_qtype_multichoice_question/multichoice/incorrectfeedback', $this->question_node); $proc = array('correct_fb' => $correct_question_fb, 'general_incorrect_fb' => $incorrect_question_fb); foreach ($proc as $ident => $content) { if (empty($content)) { continue; } $result = cc_helpers::process_linked_files( $content, $this->manifest, $this->rootpath, $this->contextid, $this->outdir); cc_assesment_helper::add_feedback( $this->qitem, $result[0], cc_qti_values::htmltype, $ident); pkg_resource_dependencies::instance()->add($result[1]); if ($ident == 'correct_fb') { $this->correct_feedbacks[] = $ident; } else { $this->incorrect_feedbacks[] = $ident; } } } public function on_generate_response_processing() { parent::on_generate_response_processing(); //respconditions /** * General unconditional feedback must be added as a first respcondition * without any condition and just displayfeedback (if exists) */ if (!empty($this->general_feedback)) { $qrespcondition = new cc_assesment_respconditiontype(); $qrespcondition->set_title('General feedback'); $this->qresprocessing->add_respcondition($qrespcondition); $qrespcondition->enable_continue(); //define the condition for success $qconditionvar = new cc_assignment_conditionvar(); $qrespcondition->set_conditionvar($qconditionvar); $qother = new cc_assignment_conditionvar_othertype(); $qconditionvar->set_other($qother); $qdisplayfeedback = new cc_assignment_displayfeedbacktype(); $qrespcondition->add_displayfeedback($qdisplayfeedback); $qdisplayfeedback->set_feedbacktype(cc_qti_values::Response); $qdisplayfeedback->set_linkrefid('general_fb'); } //success condition /** * For all question types outside of the Essay question, scoring is done in a * single with a continue flag set to No. The outcome is always * a variable named SCORE which value must be set to 100 in case of correct answer. * Partial scores (not 0 or 100) are not supported. */ $qrespcondition = new cc_assesment_respconditiontype(); $qrespcondition->set_title('Correct'); $this->qresprocessing->add_respcondition($qrespcondition); $qrespcondition->enable_continue(false); $qsetvar = new cc_assignment_setvartype(100); $qrespcondition->add_setvar($qsetvar); //define the condition for success $qconditionvar = new cc_assignment_conditionvar(); $qrespcondition->set_conditionvar($qconditionvar); $qvarequal = new cc_assignment_conditionvar_varequaltype($this->correct_answer_ident); $qconditionvar->set_varequal($qvarequal); $qvarequal->set_respident($this->qresponse_lid->get_ident()); if (array_key_exists($this->correct_answer_ident, $this->answerlist)) { $qdisplayfeedback = new cc_assignment_displayfeedbacktype(); $qrespcondition->add_displayfeedback($qdisplayfeedback); $qdisplayfeedback->set_feedbacktype(cc_qti_values::Response); $qdisplayfeedback->set_linkrefid($this->answerlist[$this->correct_answer_ident]); } foreach ($this->correct_feedbacks as $ident) { $qdisplayfeedback = new cc_assignment_displayfeedbacktype(); $qrespcondition->add_displayfeedback($qdisplayfeedback); $qdisplayfeedback->set_feedbacktype(cc_qti_values::Response); $qdisplayfeedback->set_linkrefid($ident); } //rest of the conditions foreach ($this->answerlist as $ident => $refid) { if ($ident == $this->correct_answer_ident) { continue; } $qrespcondition = new cc_assesment_respconditiontype(); $this->qresprocessing->add_respcondition($qrespcondition); $qsetvar = new cc_assignment_setvartype(0); $qrespcondition->add_setvar($qsetvar); //define the condition for fail $qconditionvar = new cc_assignment_conditionvar(); $qrespcondition->set_conditionvar($qconditionvar); $qvarequal = new cc_assignment_conditionvar_varequaltype($ident); $qconditionvar->set_varequal($qvarequal); $qvarequal->set_respident($this->qresponse_lid->get_ident()); $qdisplayfeedback = new cc_assignment_displayfeedbacktype(); $qrespcondition->add_displayfeedback($qdisplayfeedback); $qdisplayfeedback->set_feedbacktype(cc_qti_values::Response); $qdisplayfeedback->set_linkrefid($refid); foreach ($this->incorrect_feedbacks as $ident) { $qdisplayfeedback = new cc_assignment_displayfeedbacktype(); $qrespcondition->add_displayfeedback($qdisplayfeedback); $qdisplayfeedback->set_feedbacktype(cc_qti_values::Response); $qdisplayfeedback->set_linkrefid($ident); } } } } class cc_assesment_question_multichoice_multiresponse extends cc_assesment_question_proc_base { /** * @var DOMNodeList */ protected $correct_answers = null; public function __construct($quiz, $questions, $manifest, $section, $question_node, $rootpath, $contextid, $outdir) { parent::__construct($quiz, $questions, $manifest, $section, $question_node, $rootpath, $contextid, $outdir); $this->qtype = cc_qti_profiletype::multiple_response; $correct_answer_nodes = $this->questions->nodeList("plugin_qtype_multichoice_question/answers/answer[fraction > 0]", $this->question_node); if ($correct_answer_nodes->length == 0) { throw new RuntimeException('No correct answer!'); } $this->correct_answers = $correct_answer_nodes; //$this->correct_answer_node_id = $this->questions->nodeValue('@id', $correct_answer_node); $maximum_quiz_grade = (int)$this->quiz->nodeValue('/activity/quiz/grade'); $this->total_grade_value = ($maximum_quiz_grade + 1).'.0000000'; } public function on_generate_answers() { //add responses holder $qresponse_lid = new cc_response_lidtype(); $this->qresponse_lid = $qresponse_lid; $this->qpresentation->set_response_lid($qresponse_lid); $qresponse_choice = new cc_assesment_render_choicetype(); $qresponse_lid->set_render_choice($qresponse_choice); //Mark that question has more than one correct answer $qresponse_lid->set_rcardinality(cc_qti_values::Multiple); //are we to shuffle the responses? $shuffle_answers = (int)$this->quiz->nodeValue('/activity/quiz/shuffleanswers') > 0; $qresponse_choice->enable_shuffle($shuffle_answers); $answerlist = array(); $qa_responses = $this->questions->nodeList('plugin_qtype_multichoice_question/answers/answer', $this->question_node); foreach ($qa_responses as $node) { $answer_content = $this->questions->nodeValue('answertext', $node); $answer_grade_fraction = (float)$this->questions->nodeValue('fraction', $node); $result = cc_helpers::process_linked_files( $answer_content, $this->manifest, $this->rootpath, $this->contextid, $this->outdir); $qresponse_label = cc_assesment_helper::add_answer( $qresponse_choice, $result[0], cc_qti_values::htmltype); pkg_resource_dependencies::instance()->add($result[1]); $answer_ident = $qresponse_label->get_ident(); $feedback_ident = $answer_ident.'_fb'; //add answer specific feedbacks if not empty $content = $this->questions->nodeValue('feedback', $node); if (!empty($content)) { $result = cc_helpers::process_linked_files( $content, $this->manifest, $this->rootpath, $this->contextid, $this->outdir); cc_assesment_helper::add_feedback( $this->qitem, $result[0], cc_qti_values::htmltype, $feedback_ident); pkg_resource_dependencies::instance()->add($result[1]); } $answerlist[$answer_ident] = array($feedback_ident, ($answer_grade_fraction > 0)); } $this->answerlist = $answerlist; } public function on_generate_feedbacks() { parent::on_generate_feedbacks(); //Question combined feedbacks $correct_question_fb = $this->questions->nodeValue('plugin_qtype_multichoice_question/multichoice/correctfeedback', $this->question_node); $incorrect_question_fb = $this->questions->nodeValue('plugin_qtype_multichoice_question/multichoice/incorrectfeedback', $this->question_node); if (empty($correct_question_fb)) { //Hardcode some text for now $correct_question_fb = 'Well done!'; } if (empty($incorrect_question_fb)) { //Hardcode some text for now $incorrect_question_fb = 'Better luck next time!'; } $proc = array('correct_fb' => $correct_question_fb, 'incorrect_fb' => $incorrect_question_fb); foreach ($proc as $ident => $content) { if (empty($content)) { continue; } $result = cc_helpers::process_linked_files( $content, $this->manifest, $this->rootpath, $this->contextid, $this->outdir); cc_assesment_helper::add_feedback( $this->qitem, $result[0], cc_qti_values::htmltype, $ident); pkg_resource_dependencies::instance()->add($result[1]); if ($ident == 'correct_fb') { $this->correct_feedbacks[$ident] = $ident; } else { $this->incorrect_feedbacks[$ident] = $ident; } } } public function on_generate_response_processing() { parent::on_generate_response_processing(); //respconditions /** * General unconditional feedback must be added as a first respcondition * without any condition and just displayfeedback (if exists) */ cc_assesment_helper::add_respcondition( $this->qresprocessing, 'General feedback', $this->general_feedback, null, true ); //success condition /** * For all question types outside of the Essay question, scoring is done in a * single with a continue flag set to No. The outcome is always * a variable named SCORE which value must be set to 100 in case of correct answer. * Partial scores (not 0 or 100) are not supported. */ $qrespcondition = new cc_assesment_respconditiontype(); $qrespcondition->set_title('Correct'); $this->qresprocessing->add_respcondition($qrespcondition); $qrespcondition->enable_continue(false); $qsetvar = new cc_assignment_setvartype(100); $qrespcondition->add_setvar($qsetvar); //define the condition for success $qconditionvar = new cc_assignment_conditionvar(); $qrespcondition->set_conditionvar($qconditionvar); //create root and condition $qandcondition = new cc_assignment_conditionvar_andtype(); $qconditionvar->set_and($qandcondition); foreach ($this->answerlist as $ident => $refid) { $qvarequal = new cc_assignment_conditionvar_varequaltype($ident); $qvarequal->enable_case(); if ($refid[1]) { $qandcondition->set_varequal($qvarequal); } else { $qandcondition->set_not($qvarequal); } $qvarequal->set_respident($this->qresponse_lid->get_ident()); } $qdisplayfeedback = new cc_assignment_displayfeedbacktype(); $qrespcondition->add_displayfeedback($qdisplayfeedback); $qdisplayfeedback->set_feedbacktype(cc_qti_values::Response); //TODO: this needs to be fixed reset($this->correct_feedbacks); $ident = key($this->correct_feedbacks); $qdisplayfeedback->set_linkrefid($ident); //rest of the conditions foreach ($this->answerlist as $ident => $refid) { cc_assesment_helper::add_response_condition( $this->qresprocessing, 'Incorrect feedback', $refid[0], $this->general_feedback, $this->qresponse_lid->get_ident() ); } //Final element for incorrect feedback reset($this->incorrect_feedbacks); $ident = key($this->incorrect_feedbacks); cc_assesment_helper::add_respcondition( $this->qresprocessing, 'Incorrect feedback', $ident, 0 ); } } cc_lib/cc_utils.php000064400000035761152266437620010326 0ustar00. /** * @package backup-convert * @subpackage cc-library * @copyright 2011 Darko Miletic * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ require_once('xmlbase.php'); /** * * Various helper utils * @author Darko Miletic dmiletic@moodlerooms.com * */ abstract class cc_helpers { /** * Checks extension of the supplied filename * * @param string $filename */ public static function is_html($filename) { $extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION)); return in_array($extension, array('htm', 'html')); } /** * Generates unique identifier * @param string $prefix * @param string $suffix * @return string */ public static function uuidgen($prefix = '', $suffix = '', $uppercase = true) { $uuid = trim(sprintf('%s%04x%04x%s', $prefix, mt_rand(0, 65535), mt_rand(0, 65535), $suffix)); $result = $uppercase ? strtoupper($uuid) : strtolower($uuid); return $result; } /** * Creates new folder with random name * @param string $where * @param string $prefix * @param string $suffix * @return mixed - directory short name or false in case of failure */ public static function randomdir($where, $prefix = '', $suffix = '') { global $CFG; $dirname = false; $randomname = self::uuidgen($prefix, $suffix, false); $newdirname = $where.DIRECTORY_SEPARATOR.$randomname; if (mkdir($newdirname)) { chmod($newdirname, $CFG->directorypermissions); $dirname = $randomname; } return $dirname; } public static function build_query($attributes, $search) { $result = ''; foreach ($attributes as $attribute) { if ($result != '') { $result .= ' | '; } $result .= "//*[starts-with(@{$attribute},'{$search}')]/@{$attribute}"; } return $result; } public static function process_embedded_files(&$doc, $attributes, $search, $customslash = null) { $result = array(); $query = self::build_query($attributes, $search); $list = $doc->nodeList($query); foreach ($list as $filelink) { $rvalue = str_replace($search, '', $filelink->nodeValue); if (!empty($customslash)) { $rvalue = str_replace($customslash, '/', $rvalue); } $result[] = rawurldecode($rvalue); } return $result; } /** * * Get list of embedded files * @param string $html * @return multitype:mixed */ public static function embedded_files($html) { $result = array(); $doc = new XMLGenericDocument(); $doc->doc->validateOnParse = false; $doc->doc->strictErrorChecking = false; if (!empty($html) && $doc->loadHTML($html)) { $attributes = array('src', 'href'); $result1 = self::process_embedded_files($doc, $attributes, '@@PLUGINFILE@@'); $result2 = self::process_embedded_files($doc, $attributes, '$@FILEPHP@$', '$@SLASH@$'); $result = array_merge($result1, $result2); } return $result; } public static function embedded_mapping($packageroot, $contextid = null) { $main_file = $packageroot . DIRECTORY_SEPARATOR . 'files.xml'; $mfile = new XMLGenericDocument(); if (!$mfile->load($main_file)) { return false; } $query = "/files/file[filename!='.']"; if (!empty($contextid)) { $query .= "[contextid='{$contextid}']"; } $files = $mfile->nodeList($query); $depfiles = array(); foreach ($files as $node) { $mainfile = intval($mfile->nodeValue('sortorder', $node)); $filename = $mfile->nodeValue('filename', $node); $filepath = $mfile->nodeValue('filepath', $node); $source = $mfile->nodeValue('source', $node); $author = $mfile->nodeValue('author', $node); $license = $mfile->nodeValue('license', $node); $hashedname = $mfile->nodeValue('contenthash', $node); $hashpart = substr($hashedname, 0, 2); $location = 'files'.DIRECTORY_SEPARATOR.$hashpart.DIRECTORY_SEPARATOR.$hashedname; $type = $mfile->nodeValue('mimetype', $node); $depfiles[$filepath.$filename] = array( $location, ($mainfile == 1), strtolower(str_replace(' ', '_', $filename)), $type, $source, $author, $license, strtolower(str_replace(' ', '_', $filepath))); } return $depfiles; } public static function add_files(cc_i_manifest &$manifest, $packageroot, $outdir, $allinone = true) { global $CFG; if (pkg_static_resources::instance()->finished) { return; } $files = cc_helpers::embedded_mapping($packageroot); $rdir = $allinone ? new cc_resource_location($outdir) : null; foreach ($files as $virtual => $values) { $clean_filename = $values[2]; if (!$allinone) { $rdir = new cc_resource_location($outdir); } $rtp = $rdir->fullpath().$values[7].$clean_filename; //Are there any relative virtual directories? //let us try to recreate them $justdir = $rdir->fullpath(false).$values[7]; if (!file_exists($justdir)) { if (!mkdir($justdir, $CFG->directorypermissions, true)) { throw new RuntimeException('Unable to create directories!'); } } $source = $packageroot.DIRECTORY_SEPARATOR.$values[0]; if (!copy($source, $rtp)) { throw new RuntimeException('Unable to copy files!'); } $resource = new cc_resource($rdir->rootdir(), $values[7].$clean_filename, $rdir->dirname(false)); $res = $manifest->add_resource($resource, null, cc_version11::webcontent); pkg_static_resources::instance()->add($virtual, $res[0], $rdir->dirname(false).$values[7].$clean_filename, $values[1], $resource); } pkg_static_resources::instance()->finished = true; } /** * * Excerpt from IMS CC 1.1 overview : * No spaces in filenames, directory and file references should * employ all lowercase or all uppercase - no mixed case * * @param cc_i_manifest $manifest * @param string $packageroot * @param integer $contextid * @param string $outdir * @param boolean $allinone * @throws RuntimeException */ public static function handle_static_content(cc_i_manifest &$manifest, $packageroot, $contextid, $outdir, $allinone = true) { self::add_files($manifest, $packageroot, $outdir, $allinone); return pkg_static_resources::instance()->get_values(); } public static function handle_resource_content(cc_i_manifest &$manifest, $packageroot, $contextid, $outdir, $allinone = true) { $result = array(); self::add_files($manifest, $packageroot, $outdir, $allinone); $files = self::embedded_mapping($packageroot, $contextid); $rootnode = null; $rootvals = null; $depfiles = array(); $depres = array(); $flocation = null; foreach ($files as $virtual => $values) { $vals = pkg_static_resources::instance()->get_identifier($virtual); $resource = $vals[3]; $identifier = $resource->identifier; $flocation = $vals[1]; if ($values[1]) { $rootnode = $resource; $rootvals = $flocation; continue; } $depres[] = $identifier; $depfiles[] = $vals[1]; $result[$virtual] = array($identifier, $flocation, false); } if (!empty($rootnode)) { $rootnode->files = array_merge($rootnode->files, $depfiles); $result[$virtual] = array($rootnode->identifier, $rootvals, true); } return $result; } public static function process_linked_files($content, cc_i_manifest &$manifest, $packageroot, $contextid, $outdir, $webcontent = false) { // Detect all embedded files // locate their physical counterparts in moodle 2 backup // copy all files in the cc package stripping any spaces and using only lowercase letters // add those files as resources of the type webcontent to the manifest // replace the links to the resource using $IMS-CC-FILEBASE$ and their new locations // cc_resource has array of files and array of dependencies // most likely we would need to add all files as independent resources and than // attach them all as dependencies to the forum tag. $lfiles = self::embedded_files($content); $text = $content; $deps = array(); if (!empty($lfiles)) { $files = self::handle_static_content($manifest, $packageroot, $contextid, $outdir); $replaceprefix = $webcontent ? '' : '$IMS-CC-FILEBASE$'; foreach ($lfiles as $lfile) { if (isset($files[$lfile])) { $filename = str_replace('%2F', '/', rawurlencode($lfile)); $content = str_replace('@@PLUGINFILE@@'.$filename, $replaceprefix.'../'.$files[$lfile][1], $content); // For the legacy stuff. $content = str_replace('$@FILEPHP@$'.str_replace('/', '$@SLASH@$', $filename), $replaceprefix.'../'.$files[$lfile][1], $content); $deps[] = $files[$lfile][0]; } } $text = $content; } return array($text, $deps); } public static function relative_location($originpath, $linkingpath) { return false; } } final class cc_resource_location { /** * * Root directory * @var string */ private $rootdir = null; /** * * new directory * @var string */ private $dir = null; /** * * Full precalculated path * @var string */ private $fullpath = null; /** * * ctor * @param string $rootdir - path to the containing directory * @throws InvalidArgumentException * @throws RuntimeException */ public function __construct($rootdir) { $rdir = realpath($rootdir); if (empty($rdir)) { throw new InvalidArgumentException('Invalid path!'); } $dir = cc_helpers::randomdir($rdir, 'i_'); if ($dir === false) { throw new RuntimeException('Unable to create directory!'); } $this->rootdir = $rdir; $this->dir = $dir; $this->fullpath = $rdir.DIRECTORY_SEPARATOR.$dir; } /** * * Newly created directory * @return string */ public function dirname($endseparator=false) { return $this->dir.($endseparator ? '/' : ''); } /** * * Full path to the new directory * @return string */ public function fullpath($endseparator=false) { return $this->fullpath.($endseparator ? DIRECTORY_SEPARATOR : ''); } /** * Returns containing dir * @return string */ public function rootdir($endseparator=false) { return $this->rootdir.($endseparator ? DIRECTORY_SEPARATOR : ''); } } class pkg_static_resources { /** * @var array */ private $values = array(); /** * @var boolean */ public $finished = false; /** * @var pkg_static_resources */ private static $instance = null; private function __clone() { } private function __construct() { } /** * @return pkg_static_resources */ public static function instance() { if (empty(self::$instance)) { $c = __CLASS__; self::$instance = new $c(); } return self::$instance; } /** * * add new element * @param string $identifier * @param string $file * @param boolean $main */ public function add($key, $identifier, $file, $main, $node = null) { $this->values[$key] = array($identifier, $file, $main, $node); } /** * @return array */ public function get_values() { return $this->values; } public function get_identifier($location) { return isset($this->values[$location]) ? $this->values[$location] : false; } public function reset() { $this->values = array(); $this->finished = false; } } class pkg_resource_dependencies { /** * @var array */ private $values = array(); /** * @var pkg_resource_dependencies */ private static $instance = null; private function __clone() { } private function __construct() { } /** * @return pkg_resource_dependencies */ public static function instance() { if (empty(self::$instance)) { $c = __CLASS__; self::$instance = new $c(); } return self::$instance; } /** * @param array $deps */ public function add(array $deps) { $this->values = array_merge($this->values, $deps); } public function reset() { $this->values = array(); } /** * @return array */ public function get_deps() { return $this->values; } } cc_lib/cc_converter_folder.php000064400000003307152266437620012517 0ustar00. /** * @package backup-convert * @subpackage cc-library * @copyright 2012 Darko Miletic * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ require_once('cc_converters.php'); require_once('cc_general.php'); class cc_converter_folder extends cc_converter { public function __construct(cc_i_item &$item, cc_i_manifest &$manifest, $rootpath, $path) { $this->defaultfile = 'folder.xml'; parent::__construct($item, $manifest, $rootpath, $path); } public function convert($outdir) { $resitem = new cc_item(); $resitem->title = $this->doc->nodeValue('/activity/folder/name'); $this->item->add_child_item($resitem); $contextid = $this->doc->nodeValue('/activity/@contextid'); cc_helpers::handle_static_content($this->manifest, $this->rootpath, $contextid, $outdir); return true; } } cc_lib/cc_assesment_sfib.php000064400000021163152266437620012162 0ustar00. /** * @package backup-convert * @copyright 2012 Darko Miletic * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.'); require_once('cc_asssesment.php'); class cc_assesment_question_sfib extends cc_assesment_question_proc_base { public function __construct($quiz, $questions, $manifest, $section, $question_node, $rootpath, $contextid, $outdir) { parent::__construct($quiz, $questions, $manifest, $section, $question_node, $rootpath, $contextid, $outdir); $this->qtype = cc_qti_profiletype::field_entry; $this->correct_answer_node_id = $this->questions->nodeValue( 'plugin_qtype_truefalse_question/truefalse/trueanswer', $this->question_node ); $maximum_quiz_grade = (int)$this->quiz->nodeValue('/activity/quiz/grade'); $this->total_grade_value = ($maximum_quiz_grade + 1).'.0000000'; } public function on_generate_metadata() { parent::on_generate_metadata(); $category = $this->questions->nodeValue('../../name', $this->question_node); if (!empty($category)) { $this->qmetadata->set_category($category); } } public function on_generate_presentation() { parent::on_generate_presentation(); $response_str = new cc_assesment_response_strtype(); $response_fib = new cc_assesment_render_fibtype(); // The standard requires that only rows attribute must be set, // the rest may or may not be configured. For the sake of brevity we leave it empty. $response_fib->set_rows(1); $response_str->set_render_fib($response_fib); $this->qpresentation->set_response_str($response_str); } public function on_generate_feedbacks() { parent::on_generate_feedbacks(); // Question combined feedback. $responsenodes = $this->questions->nodeList('plugin_qtype_shortanswer_question//answer', $this->question_node); $count = 0; foreach ($responsenodes as $respnode) { $content = $this->questions->nodeValue('feedback', $respnode); if (empty($content)) { continue; } $correct = (int)$this->questions->nodeValue('fraction', $respnode) == 1; $answerid = (int)$this->questions->nodeValue('@id', $respnode); $result = cc_helpers::process_linked_files( $content, $this->manifest, $this->rootpath, $this->contextid, $this->outdir); $ident = $correct ? 'correct' : 'incorrect'; $ident .= '_'.$count.'_fb'; cc_assesment_helper::add_feedback( $this->qitem, $result[0], cc_qti_values::htmltype, $ident); pkg_resource_dependencies::instance()->add($result[1]); if ($correct) { $this->correct_feedbacks[$answerid] = $ident; } else { $this->incorrect_feedbacks[$answerid] = $ident; } ++$count; } } public function on_generate_response_processing() { parent::on_generate_response_processing(); // General unconditional feedback must be added as a first respcondition // without any condition and just displayfeedback (if exists). if (!empty($this->general_feedback)) { $qrespcondition = new cc_assesment_respconditiontype(); $qrespcondition->set_title('General feedback'); $this->qresprocessing->add_respcondition($qrespcondition); $qrespcondition->enable_continue(); // Define the condition for success. $qconditionvar = new cc_assignment_conditionvar(); $qrespcondition->set_conditionvar($qconditionvar); $qother = new cc_assignment_conditionvar_othertype(); $qconditionvar->set_other($qother); $qdisplayfeedback = new cc_assignment_displayfeedbacktype(); $qrespcondition->add_displayfeedback($qdisplayfeedback); $qdisplayfeedback->set_feedbacktype(cc_qti_values::Response); $qdisplayfeedback->set_linkrefid('general_fb'); } // Answer separate conditions. $correct_responses = $this->questions->nodeList( 'plugin_qtype_shortanswer_question//answer[fraction=1]', $this->question_node); $incorrect_responses = $this->questions->nodeList( 'plugin_qtype_shortanswer_question//answer[fraction<1]', $this->question_node); $items = array( array($correct_responses, $this->correct_feedbacks), array($incorrect_responses, $this->incorrect_feedbacks) ); foreach ($items as $respfeed) { foreach ($respfeed[0] as $coresponse) { $qrespcondition = new cc_assesment_respconditiontype(); $qrespcondition->enable_continue(); $this->qresprocessing->add_respcondition($qrespcondition); $qconditionvar = new cc_assignment_conditionvar(); $qrespcondition->set_conditionvar($qconditionvar); $respc = $this->questions->nodeValue('answertext', $coresponse); $resid = $this->questions->nodeValue('@id', $coresponse); $qvarequal = new cc_assignment_conditionvar_varequaltype($respc); $qconditionvar->set_varequal($qvarequal); $qvarequal->set_respident('response'); $qvarequal->enable_case(false); if (!empty($respfeed[1][$resid])) { $qdisplayfeedback = new cc_assignment_displayfeedbacktype(); $qrespcondition->add_displayfeedback($qdisplayfeedback); $qdisplayfeedback->set_feedbacktype(cc_qti_values::Response); $qdisplayfeedback->set_linkrefid($respfeed[1][$resid]); } } } // Success condition. // For all question types outside of the Essay question, scoring is done in a // single with a continue flag set to No. The outcome is always // a variable named SCORE which value must be set to 100 in case of correct answer. // Partial scores (not 0 or 100) are not supported. $qrespcondition = new cc_assesment_respconditiontype(); $qrespcondition->set_title('Correct'); $this->qresprocessing->add_respcondition($qrespcondition); $qrespcondition->enable_continue(false); $qsetvar = new cc_assignment_setvartype(100); $qrespcondition->add_setvar($qsetvar); // Define the condition for success. $qconditionvar = new cc_assignment_conditionvar(); $qrespcondition->set_conditionvar($qconditionvar); foreach ($correct_responses as $coresponse) { $respc = $this->questions->nodeValue('answertext', $coresponse); $qvarequal = new cc_assignment_conditionvar_varequaltype($respc); $qconditionvar->set_varequal($qvarequal); $qvarequal->set_respident('response'); $qvarequal->enable_case(false); } // Add incorrect handling. $qrespcondition = new cc_assesment_respconditiontype(); $this->qresprocessing->add_respcondition($qrespcondition); $qrespcondition->enable_continue(false); // Define the condition for failure. $qconditionvar = new cc_assignment_conditionvar(); $qrespcondition->set_conditionvar($qconditionvar); $qother = new cc_assignment_conditionvar_othertype(); $qconditionvar->set_other($qother); $qsetvar = new cc_assignment_setvartype(0); $qrespcondition->add_setvar($qsetvar); } } cc_lib/cc_converter_lti.php000064400000004252152266437620012034 0ustar00. /** * @package backup-convert * @subpackage cc-library * @copyright 2011 Darko Miletic * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ require_once 'cc_converters.php'; require_once 'cc_general.php'; require_once 'cc_basiclti.php'; class cc_converter_lti extends cc_converter { public function __construct(cc_i_item &$item, cc_i_manifest &$manifest, $rootpath, $path){ $this->cc_type = cc_version11::basiclti; $this->defaultfile = 'lti.xml'; $this->defaultname = basicltil1_resurce_file::deafultname; parent::__construct($item, $manifest, $rootpath, $path); } public function convert($outdir) { $rt = new basicltil1_resurce_file(); $contextid = $this->doc->nodeValue('/activity/@contextid'); $title = $this->doc->nodeValue('/activity/lti/name'); $text = $this->doc->nodeValue('/activity/lti/intro'); $rt->set_title($title); $result = cc_helpers::process_linked_files($text, $this->manifest, $this->rootpath, $contextid, $outdir); $rt->set_description($result[0]); $rt->set_launch_url($this->doc->nodeValue('/activity/lti/toolurl')); $rt->set_launch_icon(''); $this->store($rt, $outdir, $title, $result[1]); return true; } } cc_lib/cc_builder_creator.php000064400000002515152266437620012322 0ustar00. /** * @package backup-convert * @subpackage cc-library * @copyright 2011 Darko Miletic * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ /** * Factory pattern class * Create the version class to use * */ class cc_builder_creator { public static function factory($version){ if (is_null($version)) { throw new Exception("Version is null!"); } if (include_once 'cc_version' . $version . '.php') { $classname = 'cc_version' . $version; return new $classname; } else { throw new Exception ("Dont find cc version class!"); } } }cc_lib/cc_converter_basiclti.php000064400000003741152266437620013040 0ustar00. /** * @package backup-convert * @subpackage cc-library * @copyright 2011 Darko Miletic * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ require_once 'cc_converters.php'; require_once 'cc_general.php'; require_once 'cc_basiclti.php'; class cc_converter_basiclti extends cc_converter { public function __construct(cc_i_item &$item, cc_i_manifest &$manifest, $rootpath, $path){ $this->cc_type = cc_version11::basiclti; $this->defaultfile = 'basiclti.xml'; $this->defaultname = basicltil1_resurce_file::deafultname; parent::__construct($item, $manifest, $rootpath, $path); } public function convert($outdir) { $rt = new basicltil1_resurce_file(); $title = $this->doc->nodeValue('/activity/basiclti/name'); $rt->set_title($title); $rt->set_launch_url($this->doc->nodeValue('/activity/basiclti/toolurl')); $rt->set_launch_icon(''); $rt->set_vendor_code($this->doc->nodeValue('/activity/basiclti/organizationid')); $rt->set_vendor_description($this->doc->nodeValue('/activity/basiclti/organizationdescr')); $rt->set_vendor_url($this->doc->nodeValue('/activity/basiclti/organizationurl')); $this->store($rt, $outdir, $title); return true; } } cc_lib/cc_interfaces.php000064400000005726152266437620011307 0ustar00. /** * @package backup-convert * @subpackage cc-library * @copyright 2011 Darko Miletic * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ /** * CC Manifest Interface */ interface cc_i_manifest { public function on_create(); public function on_load(); public function on_save(); public function add_new_organization(cc_i_organization &$org); public function get_resources(); public function get_resource_list(); public function add_resource(cc_i_resource $res, $identifier=null, $type='webcontent'); public function add_metadata_manifest(cc_i_metadata_manifest $met); public function add_metadata_resource(cc_i_metadata_resource $met,$identifier); public function add_metadata_file(cc_i_metadata_file $met,$identifier,$filename); public function put_nodes(); } /** * CC Organization Interface */ interface cc_i_organization { public function add_item(cc_i_item &$item); public function has_items(); public function attr_value(&$nod, $name, $ns=null); public function process_organization(&$node,&$doc); } /** * CC Item Interface */ interface cc_i_item { public function add_child_item(cc_i_item &$item); public function attach_resource($res); // can be object or value public function has_child_items(); public function attr_value(&$nod, $name, $ns=null); public function process_item(&$node,&$doc); } /** * CC Resource Interface */ interface cc_i_resource { public function get_attr_value(&$nod, $name, $ns=null); public function add_resource($fname, $location=''); public function import_resource(DOMElement &$node, cc_i_manifest &$doc); public function process_resource($manifestroot, &$fname,$folder); } /** * CC Metadata Manifest Interface */ interface cc_i_metadata_manifest { public function add_metadata_general($obj); public function add_metadata_technical($obj); public function add_metadata_rights($obj); public function add_metadata_lifecycle($obj); } /** * CC Metadata Resource Interface */ interface cc_i_metadata_resource { public function add_metadata_resource_educational($obj); } /** * CC Metadata File Interface */ interface cc_i_metadata_file { public function add_metadata_file_educational($obj); } cc_lib/cc_version_base.php000064400000010666152266437620011642 0ustar00. /** * @package backup-convert * @subpackage cc-library * @copyright 2011 Darko Miletic * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ require_once 'cc_organization.php'; /** * Abstract Version Base class * */ abstract class cc_version_base { protected $_generator = null; protected $ccnamespaces = array(); protected $isrootmanifest = false; protected $manifestID = null; protected $organizationid = null; public $resources = null; public $resources_ind = null; protected $metadata = null; public $organizations = null; protected $base = null; public $ccversion = null; public $camversion = null; abstract protected function on_create(DOMDocument &$doc, $rootmanifestnode = null, $nmanifestID = null); abstract protected function create_metadata_manifest(cc_i_metadata_manifest $met, DOMDocument &$doc, $xmlnode = null); abstract protected function create_metadata_resource(cc_i_metadata_resource $met, DOMDocument &$doc, $xmlnode = null); abstract protected function create_metadata_file(cc_i_metadata_file $met, DOMDocument &$doc, $xmlnode = null); abstract protected function create_resource(cc_i_resource &$res, DOMDocument &$doc, $xmlnode=null); abstract protected function create_organization(cc_i_organization &$org, DOMDocument &$doc, $xmlnode=null); public function get_cc_namespaces() { return $this->ccnamespaces; } public function create_manifest(DOMDocument &$doc, $rootmanifestnode = null) { return $this->on_create($doc, $rootmanifestnode); } public function create_resource_node(cc_i_resource &$res, DOMDocument &$doc, $xmlnode = null) { return $this->create_resource($res, $doc, $xmlnode); } public function create_metadata_node(&$met, DOMDocument &$doc, $xmlnode = null) { return $this->create_metadata_manifest($met, $doc, $xmlnode); } public function create_metadata_resource_node(&$met, DOMDocument &$doc, $xmlnode = null) { return $this->create_metadata_resource($met, $doc, $xmlnode); } public function create_metadata_file_node(&$met, DOMDocument &$doc, $xmlnode = null) { return $this->create_metadata_file($met, $doc, $xmlnode); } public function create_organization_node(cc_i_organization &$org, DOMDocument &$doc, $xmlnode = null) { return $this->create_organization($org, $doc, $xmlnode); } public function manifestID() { return $this->manifestID; } public function set_manifestID($id) { $this->manifestID = $id; } public function get_base() { return $this->base; } public function set_base($baseval) { $this->base = $baseval; } public function import_resources(DOMElement &$node, cc_i_manifest &$doc) { if (is_null($this->resources)) { $this->resources = array(); } $nlist = $node->getElementsByTagNameNS($this->ccnamespaces['imscc'], 'resource'); if (is_object($nlist)) { foreach ($nlist as $nd) { $sc = new cc_resource($doc, $nd); $this->resources[$sc->identifier] = $sc; } } } public function import_organization_items(DOMElement &$node, cc_i_manifest &$doc) { if (is_null($this->organizations)) { $this->organizations = array(); } $nlist = $node->getElementsByTagNameNS($this->ccnamespaces['imscc'], 'organization'); if (is_object($nlist)) { foreach ($nlist as $nd) { $sc = new cc_organization($nd, $doc); $this->organizations[$sc->identifier] = $sc; } } } public function set_generator($value) { $this->_generator = $value; } }cc_lib/cc_page.php000064400000011262152266437620010070 0ustar00. /** * @package backup-convert * @copyright 2011 Darko Miletic * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ require_once('cc_general.php'); class page11_resurce_file extends general_cc_file { protected $rootns = 'xmlns'; protected $rootname = 'html'; protected $ccnamespaces = array('xmlns' => 'http://www.w3.org/1999/xhtml'); protected $content = null; protected $title = null; protected $intro = null; public function set_content($value) { // We are not cleaning up this one on purpose. $this->content = $value; } public function set_title($value) { $this->title = self::safexml($value); } public function set_intro($value) { $this->intro = self::safexml(strip_tags($value)); } protected function on_create() { $impl = new DOMImplementation(); $dtd = $impl->createDocumentType( 'html', '-//W3C//DTD XHTML 1.0 Strict//EN', 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'); $doc = $impl->createDocument($this->ccnamespaces[$this->rootns], null, $dtd); $doc->formatOutput = true; $doc->preserveWhiteSpace = true; $this->doc = $doc; parent::on_create(); } public function on_save() { $rns = $this->ccnamespaces[$this->rootns]; // Add the basic tags. $head = $this->append_new_element_ns($this->root, $rns, 'head'); $this->append_new_attribute_ns($head, $rns, 'profile', 'http://dublincore.org/documents/dc-html/'); // Linking Dublin Core Metadata 1.1. $link_dc = $this->append_new_element_ns($head, $rns, 'link'); $this->append_new_attribute_ns($link_dc, $rns, 'rel', 'schema.DC'); $this->append_new_attribute_ns($link_dc, $rns, 'href', 'http://purl.org/dc/elements/1.1/'); $link_dcterms = $this->append_new_element_ns($head, $rns, 'link'); $this->append_new_attribute_ns($link_dcterms, $rns, 'rel', 'schema.DCTERMS'); $this->append_new_attribute_ns($link_dcterms, $rns, 'href', 'http://purl.org/dc/terms/'); // Content type. $meta_type = $this->append_new_element_ns($head, $rns, 'meta'); $this->append_new_attribute_ns($meta_type, $rns, 'name', 'DC.type'); $this->append_new_attribute_ns($meta_type, $rns, 'scheme', 'DCTERMS.DCMIType'); $this->append_new_attribute_ns($meta_type, $rns, 'content', 'Text'); // Content description. if (!empty($this->intro)) { $meta_description = $this->append_new_element_ns($head, $rns, 'meta'); $this->append_new_attribute_ns($meta_description, $rns, 'name', 'DC.description'); $this->append_new_attribute_ns($meta_description, $rns, 'content', $this->intro); } $meta = $this->append_new_element_ns($head, $rns, 'meta'); $this->append_new_attribute_ns($meta, $rns, 'http-equiv', 'Content-type'); $this->append_new_attribute_ns($meta, $rns, 'content', 'text/html; charset=UTF-8'); // Set the title. $title = $this->append_new_element_ns($head, $rns, 'title', $this->title); $body = $this->append_new_element_ns($this->root, $rns, 'body'); // We are unable to use DOM for embedding HTML due to numerous content errors. // Therefore we place a dummy tag that will be later replaced with the real content. $this->append_new_element_ns($body, $rns, 'div', '##REPLACE##'); return true; } public function saveTo($fname) { $result = $this->on_save(); if ($result) { $dret = str_replace(''."\n", '', $this->viewXML()); $dret = str_replace('
##REPLACE##
', $this->content, $dret); $result = (file_put_contents($fname, $dret) !== false); if ($result) { $this->filename = $fname; $this->processPath(); } } return $result; } }cc_lib/cc_convert_moodle2.php000064400000020476152266437620012264 0ustar00. /** * @package backup-convert * @subpackage cc-library * @copyright 2011 Darko Miletic * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ if (!extension_loaded('fileinfo')) { die('You must install fileinfo extension!'); } abstract class cc_convert_moodle2 { /** * * Enter description here ... * @param unknown_type $packagedir * @param unknown_type $outdir * @throws DOMException * @throws InvalidArgumentException */ public static function convert($packagedir, $outdir) { $dir = realpath($packagedir); if (empty($dir)) { throw new InvalidArgumentException('Directory does not exist!'); } $odir = realpath($outdir); if (empty($odir)) { throw new InvalidArgumentException('Directory does not exist!'); } $coursefile = $dir.DIRECTORY_SEPARATOR.'course'.DIRECTORY_SEPARATOR.'course.xml'; $doc = new XMLGenericDocument(); if ($doc->load($coursefile)) { $course_name = $doc->nodeValue('/course/fullname'); $course_desc = $doc->nodeValue('/course/summary'); $course_language = $doc->nodeValue('/course/lang'); $course_language = empty($course_language) ? 'en' : $course_language; $course_category = $doc->nodeValue('/course/category/name'); //Initialize the manifest metadata class $meta = new cc_metadata_manifest(); //Package metadata $metageneral = new cc_metadata_general(); $metageneral->set_language($course_language); $metageneral->set_title($course_name, $course_language); $metageneral->set_description($course_desc, $course_language); $metageneral->set_catalog('category'); $metageneral->set_entry($course_category); $meta->add_metadata_general($metageneral); // Create the manifest $manifest = new cc_manifest(cc_version::v11); $manifest->add_metadata_manifest($meta); $organization = null; //Package structure - default organization and resources //Get the course structure - this will be transformed into organization //Step 1 - Get the list and order of sections/topics $moodle_backup = $dir . DIRECTORY_SEPARATOR . 'moodle_backup.xml'; $secp = new XMLGenericDocument(); $docp = new XMLGenericDocument(); if ($docp->load($moodle_backup)) { //sections $sections = array(); $coursef = new XMLGenericDocument(); $course_file = $dir . DIRECTORY_SEPARATOR .'course' . DIRECTORY_SEPARATOR . 'course.xml'; $coursef->load($course_file); //$numsections = (int)$coursef->nodeValue('/course/numsections'); // TODO MDL-35781, this is commented because numsections is now optional attribute $section_list = $docp->nodeList('/moodle_backup/information/contents/sections/section'); if (!empty($section_list)) { $count = 0; foreach ($section_list as $node) { //if ($count > $numsections) { // break; //} $sectionid = $docp->nodeValue('sectionid', $node); $sectiontitle = $docp->nodeValue('title' , $node); $sectionpath = $docp->nodeValue('directory', $node); $sequence = array(); //Get section stuff $section_file = $dir . DIRECTORY_SEPARATOR . $sectionpath . DIRECTORY_SEPARATOR . 'section.xml'; if ($secp->load($section_file)) { $rawvalue = $secp->nodeValue('/section/sequence'); if ($rawvalue != '$@NULL@$') { $sequence = explode(',', $rawvalue); } } $sections[$sectionid] = array($sectiontitle, $sequence); $count++; } } //organization title $organization = new cc_organization(); //Add section/topic items foreach ($sections as $sectionid => $values) { $item = new cc_item(); $item->title = $values[0]; self::process_sequence($item, $manifest, $values[1], $dir, $odir); $organization->add_item($item); } $manifest->put_nodes(); } if (!empty($organization)) { $manifest->add_new_organization($organization); } $manifestpath = $outdir.DIRECTORY_SEPARATOR.'imsmanifest.xml'; $manifest->saveTo($manifestpath); } } /** * * Process the activites and create item structure * @param cc_i_item $item * @param array $sequence * @param string $packageroot - directory path * @throws DOMException */ protected static function process_sequence(cc_i_item &$item, cc_i_manifest &$manifest, array $sequence, $packageroot, $outdir) { $moodle_backup = $packageroot . DIRECTORY_SEPARATOR . 'moodle_backup.xml'; $doc = new XMLGenericDocument(); if(!$doc->load($moodle_backup)) { return; } $activities = $doc->nodeList('/moodle_backup/information/contents/activities/activity'); if (!empty($activities)) { $dpp = new XMLGenericDocument(); foreach ($activities as $activity) { $moduleid = $doc->nodeValue('moduleid', $activity); if (in_array($moduleid, $sequence)) { //detect activity type $directory = $doc->nodeValue('directory', $activity); $path = $packageroot . DIRECTORY_SEPARATOR . $directory; $module_file = $path . DIRECTORY_SEPARATOR . 'module.xml'; if ($dpp->load($module_file)) { $activity_type = $dpp->nodeValue('/module/modulename'); $activity_indentation = $dpp->nodeValue('/module/indent'); $aitem = self::item_indenter($item, $activity_indentation); $caller = "cc_converter_{$activity_type}"; if (class_exists($caller)) { $obj = new $caller($aitem, $manifest, $packageroot, $path); if (!$obj->convert($outdir)) { throw new RuntimeException("failed to convert {$activity_type}"); } } } } } } } protected static function item_indenter(cc_i_item &$item, $level = 0) { $indent = (int)$level; $indent = ($indent) <= 0 ? 0 : $indent; $nprev = null; $nfirst = null; for ($pos = 0, $size = $indent; $pos < $size; $pos++) { $nitem = new cc_item(); $nitem->title = ''; if (empty($nfirst)) { $nfirst = $nitem; } if (!empty($nprev)) { $nprev->add_child_item($nitem); } $nprev = $nitem; } $result = $item; if (!empty($nfirst)) { $item->add_child_item($nfirst); $result = $nprev; } return $result; } }cc_lib/cc_assesment_truefalse.php000064400000022132152266437620013226 0ustar00. /** * @package backup-convert * @copyright 2012 Darko Miletic * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.'); require_once('cc_asssesment.php'); class cc_assesment_question_truefalse extends cc_assesment_question_proc_base { public function __construct($quiz, $questions, $manifest, $section, $question_node, $rootpath, $contextid, $outdir) { parent::__construct($quiz, $questions, $manifest, $section, $question_node, $rootpath, $contextid, $outdir); $this->qtype = cc_qti_profiletype::true_false; // Determine the correct answer by finding out which answer has the non zero fraction... // This is because a true / false question type can have 'false' as the correct answer. $answers = $this->questions->nodeList('plugin_qtype_truefalse_question/answers/answer', $this->question_node); foreach ($answers as $answer) { $fraction = $this->questions->nodeValue('fraction', $answer); if ($fraction != 0) { $this->correct_answer_node_id = (int)$this->questions->nodeValue('@id', $answer); } } $maximum_quiz_grade = (int)$this->quiz->nodeValue('/activity/quiz/grade'); $this->total_grade_value = ($maximum_quiz_grade + 1).'.0000000'; } public function on_generate_answers() { // Add responses holder. $qresponse_lid = new cc_response_lidtype(); $this->qresponse_lid = $qresponse_lid; $this->qpresentation->set_response_lid($qresponse_lid); $qresponse_choice = new cc_assesment_render_choicetype(); $qresponse_lid->set_render_choice($qresponse_choice); // Mark that question has only one correct answer - // which applies for multiple choice and yes/no questions. $qresponse_lid->set_rcardinality(cc_qti_values::Single); // Are we to shuffle the responses? $shuffle_answers = (int)$this->quiz->nodeValue('/activity/quiz/shuffleanswers') > 0; $qresponse_choice->enable_shuffle($shuffle_answers); $answerlist = array(); $qa_responses = $this->questions->nodeList('plugin_qtype_truefalse_question/answers/answer', $this->question_node); foreach ($qa_responses as $node) { $answer_content = $this->questions->nodeValue('answertext', $node); $id = ((int)$this->questions->nodeValue('@id', $node) == $this->correct_answer_node_id); $qresponse_label = cc_assesment_helper::add_answer( $qresponse_choice, $answer_content, cc_qti_values::htmltype); $answer_ident = strtolower(trim($answer_content)); $qresponse_label->set_ident($answer_ident); $feedback_ident = ($id) ? 'correct_fb' : 'incorrect_fb'; if (empty($this->correct_answer_ident) && $id) { $this->correct_answer_ident = $answer_ident; } // Add answer specific feedback if not empty. $content = $this->questions->nodeValue('feedback', $node); if (!empty($content)) { $result = cc_helpers::process_linked_files( $content, $this->manifest, $this->rootpath, $this->contextid, $this->outdir); cc_assesment_helper::add_feedback( $this->qitem, $result[0], cc_qti_values::htmltype, $feedback_ident); pkg_resource_dependencies::instance()->add($result[1]); $answerlist[$answer_ident] = $feedback_ident; } } $this->answerlist = $answerlist; } public function on_generate_response_processing() { parent::on_generate_response_processing(); // Response conditions. // General unconditional feedback must be added as a first respcondition // without any condition and just displayfeedback (if exists). if (!empty($this->general_feedback)) { $qrespcondition = new cc_assesment_respconditiontype(); $qrespcondition->set_title('General feedback'); $this->qresprocessing->add_respcondition($qrespcondition); $qrespcondition->enable_continue(); // Define the condition for success. $qconditionvar = new cc_assignment_conditionvar(); $qrespcondition->set_conditionvar($qconditionvar); $qother = new cc_assignment_conditionvar_othertype(); $qconditionvar->set_other($qother); $qdisplayfeedback = new cc_assignment_displayfeedbacktype(); $qrespcondition->add_displayfeedback($qdisplayfeedback); $qdisplayfeedback->set_feedbacktype(cc_qti_values::Response); $qdisplayfeedback->set_linkrefid('general_fb'); } // Success condition. // For all question types outside of the Essay question, scoring is done in a // single with a continue flag set to No. The outcome is always // a variable named SCORE which value must be set to 100 in case of correct answer. // Partial scores (not 0 or 100) are not supported. $qrespcondition = new cc_assesment_respconditiontype(); $qrespcondition->set_title('Correct'); $this->qresprocessing->add_respcondition($qrespcondition); $qrespcondition->enable_continue(false); $qsetvar = new cc_assignment_setvartype(100); $qrespcondition->add_setvar($qsetvar); // Define the condition for success. $qconditionvar = new cc_assignment_conditionvar(); $qrespcondition->set_conditionvar($qconditionvar); // TODO: recheck this. $qvarequal = new cc_assignment_conditionvar_varequaltype($this->correct_answer_ident); $qconditionvar->set_varequal($qvarequal); $qvarequal->set_respident($this->qresponse_lid->get_ident()); if (array_key_exists($this->correct_answer_ident, $this->answerlist)) { $qdisplayfeedback = new cc_assignment_displayfeedbacktype(); $qrespcondition->add_displayfeedback($qdisplayfeedback); $qdisplayfeedback->set_feedbacktype(cc_qti_values::Response); $qdisplayfeedback->set_linkrefid($this->answerlist[$this->correct_answer_ident]); } foreach ($this->correct_feedbacks as $ident) { $qdisplayfeedback = new cc_assignment_displayfeedbacktype(); $qrespcondition->add_displayfeedback($qdisplayfeedback); $qdisplayfeedback->set_feedbacktype(cc_qti_values::Response); $qdisplayfeedback->set_linkrefid($ident); } // Rest of the conditions. foreach ($this->answerlist as $ident => $refid) { if ($ident == $this->correct_answer_ident) { continue; } $qrespcondition = new cc_assesment_respconditiontype(); $this->qresprocessing->add_respcondition($qrespcondition); $qsetvar = new cc_assignment_setvartype(0); $qrespcondition->add_setvar($qsetvar); // Define the condition for fail. $qconditionvar = new cc_assignment_conditionvar(); $qrespcondition->set_conditionvar($qconditionvar); $qvarequal = new cc_assignment_conditionvar_varequaltype($ident); $qconditionvar->set_varequal($qvarequal); $qvarequal->set_respident($this->qresponse_lid->get_ident()); $qdisplayfeedback = new cc_assignment_displayfeedbacktype(); $qrespcondition->add_displayfeedback($qdisplayfeedback); $qdisplayfeedback->set_feedbacktype(cc_qti_values::Response); $qdisplayfeedback->set_linkrefid($refid); foreach ($this->incorrect_feedbacks as $ident) { $qdisplayfeedback = new cc_assignment_displayfeedbacktype(); $qrespcondition->add_displayfeedback($qdisplayfeedback); $qdisplayfeedback->set_feedbacktype(cc_qti_values::Response); $qdisplayfeedback->set_linkrefid($ident); } } } } cc_lib/cc_metadata_file.php000064400000002757152266437620011744 0ustar00. /** * Metadata management * * @package backup-convert * @subpackage cc-library * @copyright 2011 Darko Miletic * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ /** * Metadata File Education Type * */ class cc_metadata_file_educational{ public $value = array(); public function set_value($value){ $arr = array($value); $this->value[] = $arr; } } /** * Metadata File * */ class cc_metadata_file implements cc_i_metadata_file { public $arrayeducational = array(); public function add_metadata_file_educational($obj){ if (empty($obj)){ throw new Exception('Medatada Object given is invalid or null!'); } !is_null($obj->value)? $this->arrayeducational['value']=$obj->value:null; } }cc_lib/xmlbase.php000064400000026633152266437620010152 0ustar00charset = $ch; $this->documentInit(); $this->doc->validateOnParse = $validatenow; } function __destruct() { $this->dxpath = null; $this->doc = null; } private function documentInit($withonCreate = true) { $hg = false; if ($this->isloaded) { $guardstate = $this->doc->validateOnParse; $hg = true; unset($this->dxpath); unset($this->doc); $this->isloaded = false; } $this->doc = new DOMDocument("1.0", $this->charset); $this->doc->strictErrorChecking = true; if ($hg) { $this->doc->validateOnParse = $guardstate; } $this->doc->formatOutput = true; $this->doc->preserveWhiteSpace = true; if ($withonCreate) { $this->on_create(); } } public function viewXML() { return $this->doc->saveXML(); } public function registerNS($prefix, $nsuri) { $this->arrayPrefixNS[$prefix] = $nsuri; } public function load($fname) { // Sine xml will remain loaded should the repeated load fail we should recreate document to be empty. $this->documentInit(false); $this->isloaded = $this->doc->load($fname); if ($this->isloaded) { $this->filename = $fname; $this->processPath(); $this->is_html = false; } return $this->on_load(); } public function loadUrl($url) { $this->documentInit(); $this->isloaded = true; $this->doc->loadXML( file_get_contents($url) ); $this->is_html = false; return $this->on_load(); } public function loadHTML($content) { $this->documentInit(); $this->doc->validateOnParse = false; $this->isloaded = true; $this->doc->loadHTML($content); $this->is_html = true; return $this->on_load(); } public function loadXML($content) { $this->documentInit(); $this->doc->validateOnParse = false; $this->isloaded = true; $this->doc->load($content); $this->is_html = true; return $this->on_load(); } public function loadHTMLFile($fname) { // Sine xml will remain loaded should the repeated load fail // we should recreate document to be empty. $this->documentInit(); $this->doc->validateOnParse = false; $this->isloaded = $this->doc->loadHTMLFile($fname); if ($this->isloaded) { $this->filename = $fname; $this->processPath(); $this->is_html=true; } return $this->on_load(); } public function loadXMLFile($fname) { // Sine xml will remain loaded should the repeated load fail // we should recreate document to be empty. $this->documentInit(); $this->doc->validateOnParse = false; $this->isloaded = $this->doc->load($fname); if ($this->isloaded) { $this->filename = $fname; $this->processPath(); $this->is_html = true; } return $this->on_load(); } public function loadString($content) { $this->doc = new DOMDocument("1.0", $this->charset); $content = ''.$content.''; $this->doc->loadXML($content); return true; } public function save() { $this->saveTo($this->filename); } public function saveTo($fname) { $status = false; if ($this->on_save()) { if ($this->is_html) { $this->doc->saveHTMLFile($fname); } else { $this->doc->save($fname); } $this->filename = $fname; $this->processPath(); $status = true; } return $status; } public function validate() { return $this->doc->validate(); } public function attributeValue($path, $attrname, $node = null) { $this->chkxpath(); $result = null; $resultlist = null; if (is_null($node)) { $resultlist = $this->dxpath->query($path); } else { $resultlist = $this->dxpath->query($path, $node); } if (is_object($resultlist) && ($resultlist->length > 0) && $resultlist->item(0)->hasAttribute($attrname)) { $result = $resultlist->item(0)->getAttribute($attrname); } return $result; } /** * * Get's text value of the node based on xpath query * @param string $path * @param DOMNode $node * @param int $count * @return string */ public function nodeValue($path, $node = null, $count = 1) { $nd = $this->node($path, $node, $count); return $this->nodeTextValue($nd); } /** * * Get's text value of the node * @param DOMNode $node * @return string */ public function nodeTextValue($node) { $result = ''; if (is_object($node)) { if ($node->hasChildNodes()) { $chnodesList = $node->childNodes; $types = array(XML_TEXT_NODE, XML_CDATA_SECTION_NODE); foreach ($chnodesList as $chnode) { if (in_array($chnode->nodeType, $types)) { $result .= $chnode->wholeText; } } } } return $result; } /** * * Enter description here ... * @param string $path * @param DOMNode $nd * @param int $count * @return DOMNode */ public function node($path, $nd = null, $count = 1) { $result = null; $resultlist = $this->nodeList($path,$nd); if (is_object($resultlist) && ($resultlist->length > 0)) { $result = $resultlist->item($count - 1); } return $result; } /** * * Enter description here ... * @param string $path * @param DOMNode $node * @return DOMNodeList */ public function nodeList($path, $node = null) { $this->chkxpath(); $resultlist = null; if (is_null($node)) { $resultlist = $this->dxpath->query($path); } else { $resultlist = $this->dxpath->query($path, $node); } return $resultlist; } /** * * Create new attribute * @param string $namespace * @param string $name * @param string $value * @return DOMAttr */ public function create_attribute_ns($namespace, $name, $value = null) { $result = $this->doc->createAttributeNS($namespace, $name); if (!is_null($value)) { $result->nodeValue = $value; } return $result; } /** * * Create new attribute * @param string $name * @param string $value * @return DOMAttr */ public function create_attribute($name, $value = null) { $result = $this->doc->createAttribute($name); if (!is_null($value)) { $result->nodeValue = $value; } return $result; } /** * * Adds new node * @param DOMNode $parentnode * @param string $namespace * @param string $name * @param string $value * @return DOMNode */ public function append_new_element_ns(DOMNode &$parentnode, $namespace, $name, $value = null) { $newnode = null; if (is_null($value)) { $newnode = $this->doc->createElementNS($namespace, $name); } else { $newnode = $this->doc->createElementNS($namespace, $name, $value); } return $parentnode->appendChild($newnode); } /** * * New node with CDATA content * @param DOMNode $parentnode * @param string $namespace * @param string $name * @param string $value */ public function append_new_element_ns_cdata(DOMNode &$parentnode, $namespace, $name, $value = null) { $newnode = $this->doc->createElementNS($namespace, $name); if (!is_null($value)) { $cdata = $this->doc->createCDATASection($value); $newnode->appendChild($cdata); } return $parentnode->appendChild($newnode); } /** * * Adds new node * @param DOMNode $parentnode * @param string $name * @param string $value * @return DOMNode */ public function append_new_element(DOMNode &$parentnode, $name, $value = null) { $newnode = null; if (is_null($value)) { $newnode = $this->doc->createElement($name); } else { $newnode = $this->doc->createElement($name, $value); } return $parentnode->appendChild($newnode); } /** * * Adds new attribute * @param DOMNode $node * @param string $name * @param string $value * @return DOMNode */ public function append_new_attribute(DOMNode &$node, $name, $value = null) { return $node->appendChild($this->create_attribute($name, $value)); } /** * * Adds new attribute * @param DOMNode $node * @param string $namespace * @param string $name * @param string $value * @return DOMNode */ public function append_new_attribute_ns(DOMNode &$node, $namespace, $name, $value = null) { return $node->appendChild($this->create_attribute_ns($namespace, $name, $value)); } public function fileName() { return $this->filename; } public function filePath() { return $this->filepath; } protected function on_load() { return $this->isloaded; } protected function on_save() { return true; } protected function on_create() { return true; } public function resetXpath() { $this->dxpath = null; $this->chkxpath(); } private function chkxpath() { if (!isset($this->dxpath) || is_null($this->dxpath)) { $this->dxpath = new DOMXPath($this->doc); foreach ($this->arrayPrefixNS as $nskey => $nsuri) { $this->dxpath->registerNamespace($nskey, $nsuri); } } } protected function processPath() { $path_parts = pathinfo($this->filename); $this->filepath = array_key_exists('dirname', $path_parts) ? $path_parts['dirname']."/" : ''; } } cc_lib/cc_converter_forum.php000064400000004521152266437620012373 0ustar00. /** * @package backup-convert * @subpackage cc-library * @copyright 2011 Darko Miletic * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ require_once 'cc_converters.php'; require_once 'cc_general.php'; require_once 'cc_forum.php'; class cc_converter_forum extends cc_converter { public function __construct(cc_i_item &$item, cc_i_manifest &$manifest, $rootpath, $path){ $this->cc_type = cc_version11::discussiontopic; $this->defaultfile = 'forum.xml'; $this->defaultname = 'discussion.xml'; parent::__construct($item, $manifest, $rootpath, $path); } public function convert($outdir) { $rt = new forum11_resurce_file(); $title = $this->doc->nodeValue('/activity/forum/name'); $rt->set_title($title); $text = $this->doc->nodeValue('/activity/forum/intro'); $deps = null; if (!empty($text)) { $textformat = intval($this->doc->nodeValue('/activity/forum/introformat')); $contextid = $this->doc->nodeValue('/activity/@contextid'); $result = cc_helpers::process_linked_files($text, $this->manifest, $this->rootpath, $contextid, $outdir); $textformat = ($textformat == 1) ? 'text/html' : 'text/plain'; $rt->set_text($result[0], $textformat); $deps = $result[1]; } $this->store($rt, $outdir, $title, $deps); return true; } } cc_lib/cc_forum.php000064400000007137152266437620010312 0ustar00. /** * @package backup-convert * @subpackage cc-library * @copyright 2011 Darko Miletic * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ require_once 'cc_general.php'; class forum1_resurce_file extends general_cc_file { const deafultname = 'discussion.xml'; protected $rootns = 'dt'; protected $rootname = 'dt:topic'; protected $ccnamespaces = array('dt' => 'http://www.imsglobal.org/xsd/imsdt_v1p0', 'xsi' => 'http://www.w3.org/2001/XMLSchema-instance'); protected $ccnsnames = array('dt' => 'http://www.imsglobal.org/profile/cc/ccv1p0/derived_schema/domainProfile_6/imsdt_v1p0_localised.xsd'); protected $title = null; protected $text_type = 'text/plain'; protected $text = null; protected $attachments = array(); public function set_title($title) { $this->title = self::safexml($title); } public function set_text($text, $type='text/plain') { $this->text = self::safexml($text); $this->text_type = $type; } public function set_attachments(array $attachments) { $this->attachments = $attachments; } protected function on_save() { $this->append_new_element($this->root, 'title', $this->title); $text = $this->append_new_element($this->root, 'text', $this->text); $this->append_new_attribute($text, 'texttype', $this->text_type); if (!empty($this->attachments)) { $attachments = $this->append_new_element($this->root, 'attachments'); foreach ($this->attachments as $value) { $att = $this->append_new_element($attachments, 'attachment'); $this->append_new_attribute($att, 'href', $value); } } return true; } } class forum11_resurce_file extends forum1_resurce_file { protected $rootns = 'dt'; protected $rootname = 'topic'; protected $ccnamespaces = array('dt' => 'http://www.imsglobal.org/xsd/imsccv1p1/imsdt_v1p1', 'xsi' => 'http://www.w3.org/2001/XMLSchema-instance'); protected $ccnsnames = array('dt' => 'http://www.imsglobal.org/profile/cc/ccv1p1/ccv1p1_imsdt_v1p1.xsd'); protected function on_save() { $rns = $this->ccnamespaces[$this->rootns]; $this->append_new_element_ns($this->root, $rns, 'title', $this->title); $text = $this->append_new_element_ns($this->root, $rns, 'text', $this->text); $this->append_new_attribute_ns($text, $rns, 'texttype', $this->text_type); if (!empty($this->attachments)) { $attachments = $this->append_new_element_ns($this->root, $rns, 'attachments'); foreach ($this->attachments as $value) { $att = $this->append_new_element_ns($attachments, $rns, 'attachment'); $this->append_new_attribute_ns($att, $rns, 'href', $value); } } return true; } } cc_lib/cc_converters.php000064400000010316152266437620011345 0ustar00. /** * @package backup-convert * @subpackage cc-library * @copyright 2011 Darko Miletic * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ require_once('cc_interfaces.php'); abstract class cc_converter { /** * * Enter description here ... * @var cc_item */ protected $item = null; /** * * Enter description here ... * @var cc_manifest */ protected $manifest = null; /** * * Enter description here ... * @var string */ protected $rootpath = null; /** * * Enter description here ... * @var string */ protected $path = null; /** * * Enter description here ... * @var string */ protected $defaultfile = null; /** * * Enter description here ... * @var string */ protected $defaultname = null; /** * * Enter description here ... * @var string */ protected $cc_type = null; /** * * Document * @var XMLGenericDocument */ protected $doc = null; /** * * ctor * @param cc_i_item $item * @param cc_i_manifest $manifest * @param string $rootpath * @param string $path * @throws InvalidArgumentException */ public function __construct(cc_i_item &$item, cc_i_manifest &$manifest, $rootpath, $path) { $rpath = realpath($rootpath); if (empty($rpath)) { throw new InvalidArgumentException('Invalid path!'); } $rpath2 = realpath($path); if (empty($rpath)) { throw new InvalidArgumentException('Invalid path!'); } $doc = new XMLGenericDocument(); if (!$doc->load($path . DIRECTORY_SEPARATOR . $this->defaultfile)) { throw new RuntimeException('File does not exist!'); } $this->doc = $doc; $this->item = $item; $this->manifest = $manifest; $this->rootpath = $rpath; $this->path = $rpath2; } /** * * performs conversion * @param string $outdir - root directory of common cartridge * @return boolean */ abstract public function convert($outdir); /** * * Is the element visible in the course? * @throws RuntimeException * @return bool */ protected function is_visible() { $tdoc = new XMLGenericDocument(); if (!$tdoc->load($this->path . DIRECTORY_SEPARATOR . 'module.xml')) { throw new RuntimeException('File does not exist!'); } $visible = (int)$tdoc->nodeValue('/module/visible'); return ($visible > 0); } /** * * Stores any files that need to be stored */ protected function store(general_cc_file $doc, $outdir, $title, $deps = null) { $rdir = new cc_resource_location($outdir); $rtp = $rdir->fullpath(true).$this->defaultname; if ( $doc->saveTo($rtp) ) { $resource = new cc_resource($rdir->rootdir(), $this->defaultname, $rdir->dirname(true)); $resource->dependency = empty($deps) ? array() : $deps; $resource->instructoronly = !$this->is_visible(); $res = $this->manifest->add_resource($resource, null, $this->cc_type); $resitem = new cc_item(); $resitem->attach_resource($res[0]); $resitem->title = $title; $this->item->add_child_item($resitem); } else { throw new RuntimeException("Unable to save file {$rtp}!"); } } } cc_lib/cc_assesment_essay.php000064400000006172152266437620012366 0ustar00. /** * @package backup-convert * @copyright 2012 Darko Miletic * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.'); class cc_assesment_question_essay extends cc_assesment_question_proc_base { public function __construct($quiz, $questions, $manifest, $section, $question_node, $rootpath, $contextid, $outdir) { parent::__construct($quiz, $questions, $manifest, $section, $question_node, $rootpath, $contextid, $outdir); $this->qtype = cc_qti_profiletype::essay; $maximum_quiz_grade = (int)$this->quiz->nodeValue('/activity/quiz/grade'); $this->total_grade_value = ($maximum_quiz_grade + 1).'.0000000'; } public function on_generate_metadata() { parent::on_generate_metadata(); // Mark essay for manual grading. $this->qmetadata->enable_scoringpermitted(); $this->qmetadata->enable_computerscored(false); } public function on_generate_presentation() { parent::on_generate_presentation(); $response_str = new cc_assesment_response_strtype(); $response_fib = new cc_assesment_render_fibtype(); $row_value = (int)$this->questions->nodeValue('plugin_qtype_essay_question//responsefieldlines', $this->question_node); $response_fib->set_rows($row_value); $response_str->set_render_fib($response_fib); $this->qpresentation->set_response_str($response_str); } public function on_generate_response_processing() { parent::on_generate_response_processing(); // Response conditions. if (!empty($this->general_feedback)) { $qrespcondition = new cc_assesment_respconditiontype(); $qrespcondition->set_title('General feedback'); $this->qresprocessing->add_respcondition($qrespcondition); // Define the condition for success. $qconditionvar = new cc_assignment_conditionvar(); $qrespcondition->set_conditionvar($qconditionvar); $qother = new cc_assignment_conditionvar_othertype(); $qconditionvar->set_other($qother); $qdisplayfeedback = new cc_assignment_displayfeedbacktype(); $qrespcondition->add_displayfeedback($qdisplayfeedback); $qdisplayfeedback->set_feedbacktype(cc_qti_values::Response); $qdisplayfeedback->set_linkrefid('general_fb'); } } } cc_lib/cc_metadata_resource.php000064400000003007152266437620012641 0ustar00. /** * Metadata managing * * @package backup-convert * @subpackage cc-library * @copyright 2011 Darko Miletic * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ /** * Metadata Resource Educational Type * */ class cc_metadata_resouce_educational{ public $value = array(); public function set_value($value){ $arr = array($value); $this->value[] = $arr; } } /** * Metadata Resource * */ class cc_metadata_resouce implements cc_i_metadata_resource { public $arrayeducational = array(); public function add_metadata_resource_educational($obj){ if (empty($obj)){ throw new Exception('Medatada Object given is invalid or null!'); } !is_null($obj->value)? $this->arrayeducational['value']=$obj->value:null; } }cc_lib/cc_converter_resource.php000064400000004261152266437620013073 0ustar00. /** * @package backup-convert * @subpackage cc-library * @copyright 2011 Darko Miletic * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ require_once('cc_converters.php'); require_once('cc_general.php'); class cc_converter_resource extends cc_converter { public function __construct(cc_i_item &$item, cc_i_manifest &$manifest, $rootpath, $path) { $this->cc_type = cc_version11::webcontent; $this->defaultfile = 'resource.xml'; parent::__construct($item, $manifest, $rootpath, $path); } public function convert($outdir) { $title = $this->doc->nodeValue('/activity/resource/name'); $contextid = $this->doc->nodeValue('/activity/@contextid'); $files = cc_helpers::handle_resource_content($this->manifest, $this->rootpath, $contextid, $outdir); $deps = null; $resvalue = null; foreach ($files as $values) { if ($values[2]) { $resvalue = $values[0]; break; } } $resitem = new cc_item(); $resitem->identifierref = $resvalue; $resitem->title = $title; $this->item->add_child_item($resitem); // Checking the visibility. $this->manifest->update_instructoronly($resvalue, !$this->is_visible()); return true; } } restore_cc.php000064400000010517152266437620007426 0ustar00. /** * @package moodlecore * @subpackage backup-imscc * @copyright 2009 Mauro Rondinelli (mauro.rondinelli [AT] uvcms.com) * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.'); require_once($CFG->dirroot . '/backup/cc/includes/constants.php'); require_once($CFG->dirroot . '/backup/cc/cc2moodle.php'); function cc_convert ($dir) { global $OUTPUT; $manifest_file = $dir . DIRECTORY_SEPARATOR . 'imsmanifest.xml'; $moodle_file = $dir . DIRECTORY_SEPARATOR . 'moodle.xml'; $schema_file = 'cc' . DIRECTORY_SEPARATOR . '' . DIRECTORY_SEPARATOR . 'schemas' . DIRECTORY_SEPARATOR . 'cclibxml2validator.xsd'; if (is_readable($manifest_file) && !is_readable($moodle_file)) { $is_cc = detect_cc_format($manifest_file); if ($is_cc) { $detected_requirements = detect_requirements(); if (!$detected_requirements["dom"]) { echo $OUTPUT->notification(get_string('cc_import_req_dom', 'imscc')); return false; } if (!$detected_requirements["libxml"]) { echo $OUTPUT->notification(get_string('cc_import_req_libxml', 'imscc')); return false; } if (!$detected_requirements["libxmlminversion"]) { echo $OUTPUT->notification(get_string('cc_import_req_libxmlminversion', 'imscc')); return false; } if (!$detected_requirements["xsl"]) { echo $OUTPUT->notification(get_string('cc_import_req_xsl', 'imscc')); return false; } echo get_string('cc2moodle_checking_schema', 'imscc') . '
'; $cc_manifest = new DOMDocument(); if ($cc_manifest->load($manifest_file)) { if ($cc_manifest->schemaValidate($schema_file)) { echo get_string('cc2moodle_valid_schema', 'imscc') . '
'; $cc2moodle = new cc2moodle($manifest_file); if (!$cc2moodle->is_auth()) { return $cc2moodle->generate_moodle_xml(); } else { echo $OUTPUT->notification(get_string('cc2moodle_req_auth', 'imscc')); return false; } } else { echo $OUTPUT->notification(get_string('cc2moodle_invalid_schema', 'imscc')); return false; } } else { echo $OUTPUT->notification(get_string('cc2moodle_manifest_dont_load', 'imscc')); return false; } } } return true; } function detect_requirements () { $detected["xsl"] = extension_loaded('xsl'); $detected['dom'] = extension_loaded('dom'); $detected['libxml'] = extension_loaded('libxml'); $detected['libxmlminversion'] = extension_loaded('libxml') && version_compare(LIBXML_DOTTED_VERSION, '2.6.30', '>='); return $detected; } function detect_cc_format ($xml_file) { $inpos = 0; $xml_snippet = file_get_contents($xml_file, 0, NULL, 0, 500); if (!empty($xml_snippet)) { $xml_snippet = strtolower($xml_snippet); $xml_snippet = preg_replace('/\s*/m', '', $xml_snippet); $xml_snippet = str_replace("'", '', $xml_snippet); $xml_snippet = str_replace('"', '', $xml_snippet); $search_string = "xmlns=" . NS_COMMON_CARTRIDGE; $inpos = strpos($xml_snippet, $search_string); if ($inpos) { return true; } else { return false; } } else { return false; } } entity11.forum.class.php000064400000014477152266437620011220 0ustar00. /** * @package moodlecore * @subpackage backup-imscc * @copyright 2011 Darko Miletic (dmiletic@moodlerooms.com) * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.'); class cc11_forum extends entities11 { public function full_path($path, $dir_sep = DIRECTORY_SEPARATOR) { $token = '$IMS-CC-FILEBASE$'; $path = str_replace($token, '', $path); if (is_string($path) && ($path != '')) { $dir_sep; $dot_dir = '.'; $up_dir = '..'; $length = strlen($path); $rtemp = trim($path); $start = strrpos($path, $dir_sep); $can_continue = ($start !== false); $result = $can_continue ? '' : $path; $rcount = 0; while ($can_continue) { $dir_part = ($start !== false) ? substr($rtemp, $start + 1, $length - $start) : $rtemp; $can_continue = ($dir_part !== false); if ($can_continue) { if ($dir_part != $dot_dir) { if ($dir_part == $up_dir) { $rcount++; } else { if ($rcount > 0) { $rcount --; } else { $result = ($result == '') ? $dir_part : $dir_part . $dir_sep . $result; } } } $rtemp = substr($path, 0, $start); $start = strrpos($rtemp, $dir_sep); $can_continue = (($start !== false) || (strlen($rtemp) > 0)); } } } return $result; } public function generate_node() { cc2moodle::log_action('Creating Forum mods'); $response = ''; if (!empty(cc2moodle::$instances['instances'][MOODLE_TYPE_FORUM])) { foreach (cc2moodle::$instances['instances'][MOODLE_TYPE_FORUM] as $instance) { $response .= $this->create_node_course_modules_mod_forum($instance); } } return $response; } private function create_node_course_modules_mod_forum($instance) { $sheet_mod_forum = cc112moodle::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_FORUM); $topic_data = $this->get_topic_data($instance); $result = ''; if (!empty($topic_data)) { $find_tags = array('[#mod_instance#]', '[#mod_forum_title#]', '[#mod_forum_intro#]', '[#date_now#]'); $replace_values = array($instance['instance'], //To be more true to the actual forum name we use only forum title self::safexml($topic_data['title']), self::safexml($topic_data['description']), time()); $result = str_replace($find_tags, $replace_values, $sheet_mod_forum); } return $result; } public function get_topic_data($instance) { $topic_data = array(); $topic_file = $this->get_external_xml($instance['resource_indentifier']); if (!empty($topic_file)) { $topic_file_path = cc2moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . $topic_file; $topic_file_dir = dirname($topic_file_path); $topic = $this->load_xml_resource($topic_file_path); if (!empty($topic)) { $xpath = cc2moodle::newx_path($topic, cc112moodle::$forumns); $topic_title = $xpath->query('/dt:topic/dt:title'); if ($topic_title->length > 0 && !empty($topic_title->item(0)->nodeValue)) { $topic_title = $topic_title->item(0)->nodeValue; } else { $topic_title = 'Untitled Topic'; } $topic_text = $xpath->query('/dt:topic/dt:text'); $topic_text = !empty($topic_text->item(0)->nodeValue) ? $this->update_sources($topic_text->item(0)->nodeValue, dirname($topic_file)) : ''; $topic_text = !empty($topic_text) ? str_replace("%24", "\$", $this->include_titles($topic_text)) : ''; if (!empty($topic_title)) { $topic_data['title'] = $topic_title; $topic_data['description'] = $topic_text; } } $topic_attachments = $xpath->query('/dt:topic/dt:attachments/dt:attachment/@href'); if ($topic_attachments->length > 0) { $attachment_html = ''; foreach ($topic_attachments as $file) { $attachment_html .= $this->generate_attachment_html($this->full_path($file->nodeValue,'/')); } $topic_data['description'] = !empty($attachment_html) ? $topic_text . '

Attachments:

' . $attachment_html : $topic_text; } } return $topic_data; } private function generate_attachment_html($filename) { $images_extensions = array('gif' , 'jpeg' , 'jpg' , 'jif' , 'jfif' , 'png' , 'bmp'); $fileinfo = pathinfo($filename); if (in_array($fileinfo['extension'], $images_extensions)) { return '' . $fileinfo['basename'] . '
'; } else { return '' . $fileinfo['basename'] . '
'; } return ''; } } entities11.class.php000064400000006255152266437620010374 0ustar00. /** * @package moodlecore * @subpackage backup-imscc * @copyright 2011 Darko Miletic (dmiletic@moodlerooms.com) * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.'); require_once($CFG->dirroot . '/backup/cc/entities.class.php'); class entities11 extends entities { public function get_external_xml($identifier) { $xpath = cc2moodle::newx_path(cc112moodle::$manifest, cc112moodle::$namespaces); $files = $xpath->query('/imscc:manifest/imscc:resources/imscc:resource[@identifier="' . $identifier . '"]/imscc:file/@href'); $response = empty($files) || ($files->length == 0) ? '' : $files->item(0)->nodeValue; return $response; } protected function get_all_files() { global $CFG; $all_files = array(); $xpath = cc2moodle::newx_path(cc112moodle::$manifest, cc112moodle::$namespaces); foreach (cc112moodle::$restypes as $type) { $files = $xpath->query('/imscc:manifest/imscc:resources/imscc:resource[@type="' . $type . '"]/imscc:file/@href'); if (empty($files) || ($files->length == 0)) { continue; } foreach ($files as $file) { //omit html files //this is a bit too simplistic $ext = strtolower(pathinfo($file->nodeValue, PATHINFO_EXTENSION)); if (in_array($ext, array('html', 'htm', 'xhtml'))) { continue; } $all_files[] = $file->nodeValue; } unset($files); } //are there any labels? $xquery = "//imscc:item/imscc:item/imscc:item[imscc:title][not(@identifierref)]"; $labels = $xpath->query($xquery); if (!empty($labels) && ($labels->length > 0)) { $tname = 'course_files'; $dpath = cc2moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . $tname; $rfpath = 'files.gif'; $fpath = $dpath . DIRECTORY_SEPARATOR . 'files.gif'; if (!file_exists($dpath)) { mkdir($dpath, $CFG->directorypermissions, true); } //copy the folder.gif file $folder_gif = "{$CFG->dirroot}/pix/i/files.gif"; copy($folder_gif, $fpath); $all_files[] = $rfpath; } $all_files = empty($all_files) ? '' : $all_files; return $all_files; } } validator.php000064400000015671152266437620007271 0ustar00. /** * Provides validation classes used by the imscc converters * * @package backup-convert * @copyright 2011 Darko Miletic * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ final class error_messages { /** * * @static error_messages */ private static $instance = null; private function __construct(){} private function __clone(){} /** * @return error_messages */ public static function instance() { if (empty(self::$instance)) { $c = __CLASS__; self::$instance = new $c(); } return self::$instance; } /** * @var array */ private $items = array(); /** * @param string $msg */ public function add($msg) { if (!empty($msg)) { $this->items[] = $msg; } } /** * @return array */ public function errors() { $this->items; } /** * Empties the error content */ public function reset() { $this->items = array(); } /** * @param boolean $web * @return string */ public function to_string($web = false) { $result = ''; if ($web) { $result .= '
    '.PHP_EOL; } foreach ($this->items as $error) { if ($web) { $result .= '
  1. '; } $result .= $error.PHP_EOL; if ($web) { $result .= '
  2. '.PHP_EOL; } } if ($web) { $result .= '
'.PHP_EOL; } return $result; } /** * Casting to string method * @return string */ public function __toString() { return $this->to_string(false); } } final class libxml_errors_mgr { /** * @var boolean */ private $previous = false; /** * @param boolean $reset */ public function __construct($reset=false){ if ($reset) { error_messages::instance()->reset(); } $this->previous = libxml_use_internal_errors(true); libxml_clear_errors(); } private function collect_errors($filename=''){ $errors = libxml_get_errors(); static $error_types = array( LIBXML_ERR_ERROR => 'Error' ,LIBXML_ERR_FATAL => 'Fatal Error' ,LIBXML_ERR_WARNING => 'Warning' ); $result = array(); foreach($errors as $error){ $add = ''; if (!empty($filename)) { $add = " in {$filename}"; } elseif (!empty($error->file)) { $add = " in {$error->file}"; } $line = ''; if (!empty($error->line)) { $line = " at line {$error->line}"; } $err = "{$error_types[$error->level]}{$add}: {$error->message}{$line}"; error_messages::instance()->add($err); } libxml_clear_errors(); return $result; } public function __destruct(){ $this->collect_errors(); if (!$this->previous) { libxml_use_internal_errors($this->previous); } } public function collect() { $this->collect_errors(); } } function validate_xml($xml, $schema){ $result = false; $manifest_file = realpath($xml); $schema_file = realpath($schema); if (empty($manifest_file) || empty($schema_file)) { return false; } $xml_error = new libxml_errors_mgr(); $manifest = new DOMDocument(); $doc->validateOnParse = false; $result = $manifest->load($manifest_file, LIBXML_NONET) && $manifest->schemaValidate($schema_file); return $result; } class cc_validate_type { const manifest_validator1 = 'cclibxml2validator.xsd' ; const assesment_validator1 = '/domainProfile_4/ims_qtiasiv1p2_localised.xsd'; const discussion_validator1 = '/domainProfile_6/imsdt_v1p0_localised.xsd' ; const weblink_validator1 = '/domainProfile_5/imswl_v1p0_localised.xsd' ; const manifest_validator11 = 'cc11libxml2validator.xsd' ; const blti_validator11 = 'imslticc_v1p0p1.xsd' ; const assesment_validator11 = 'ccv1p1_qtiasiv1p2p1_v1p0.xsd'; const discussion_validator11 = 'ccv1p1_imsdt_v1p1.xsd' ; const weblink_validator11 = 'ccv1p1_imswl_v1p1.xsd' ; /** * @var string */ protected $type = null; /** * @var string */ protected $location = null; public function __construct($type, $location){ $this->type = $type; $this->location = $location; } /** * Validates the item * @param string $element - File path for the xml * @return boolean */ public function validate($element) { $celement = realpath($element); $cvalidator = realpath($this->location.DIRECTORY_SEPARATOR.$this->type); $result = (empty($celement) || empty($cvalidator)); if (!$result) { $xml_error = new libxml_errors_mgr(); $doc = new DOMDocument(); $doc->validateOnParse = false; $result = $doc->load($celement, LIBXML_NONET) && $doc->schemaValidate($cvalidator); } return $result; } } class manifest_validator extends cc_validate_type { public function __construct($location){ parent::__construct(self::manifest_validator11, $location); } } class manifest10_validator extends cc_validate_type { public function __construct($location){ parent::__construct(self::manifest_validator1, $location); } } class blti_validator extends cc_validate_type { public function __construct($location){ parent::__construct(self::blti_validator11, $location); } } class assesment_validator extends cc_validate_type { public function __construct($location){ parent::__construct(self::assesment_validator11, $location); } } class discussion_validator extends cc_validate_type { public function __construct($location){ parent::__construct(self::discussion_validator11, $location); } } class weblink_validator extends cc_validate_type { public function __construct($location){ parent::__construct(self::weblink_validator11, $location); } } schemas/cclibxml2validator.xsd000064400000002471152266437620012515 0ustar00 schemas/imscp_v1p2_constraintsDocument.scmt000064400000027672152266437620015223 0ustar00 Assertion failed for pattern_2. If an item is invisible, its descendants must be invisible too.(#S02) Assertion failed for pattern_3. A Resource object which is a Learning Object associated resource may contain Dependency objects which reference Resource objects with Type 'webcontent'.(#S03) Assertion failed for pattern_4. An Item object which represents a folder is indicated by the absence of an IdentifierRef characteristic object. Folder Items support unlimited nesting of other folder Items and learning object link Items. Learning Application Resource Item objects may be nested by folder Item object but may not nest other folder or Learning Application resource Item objects.(#S04) Error: Assertion failed for pattern_5: If a cartridge web content or associated content resource is linked from a Learning Application Object link Item object it must have an Href characteristic object which represents the launchable resource.(#S05) Error: Assertion failed for pattern_5: For Discussion Topic Resources the Resource object must contain a single File object which references the Discussion Topic descriptor XML file which conforms to the http://www.imsglobal.org/xsd/imsdt_v1p0 schema. Discussion Topic resources must not contain href (#S06) Error: Assertion validation failed for pattern_7: For Web Link Resources the Resource object must contain a single File object which references the Web Link descriptor XML file which conforms to the http://www.imsglobal.org/xsd/imswl_v1p0 schema.It must contain neither Dependency objects nor an href attribute.(#S07) Error: Assertion validation failed for pattern_11a: For Assessment resources the Resource object must contain a single File object which references the QTI XML file. This file must conform to the IMS CC profile of QTI 1.2.1. The profile is contained in the package of this profile as imscc_q*.zip. The derived schema of this QTI profile is in the package of this profile with the name ims_qtiasiv1p2_localised.xsd. The resource must not have an href attribute(#S11a) Error: Assertion validation failed for pattern_11b1: For Question Bank resources the Resource object must contain a single File object which references the QTI XML file. (#S11b1) Error: Assertion validation failed for pattern_11b2: A Question Bank Resource must not have an href attribute. (#S11b2) Error: Assertion validation failed for pattern_11b3: A Question Bank Resource must not be referenced from an item. (#S11b3) Error: Assertion validation failed for pattern_11b4: There can be only one Questionbank Resource in a cartridge.(#S11b4) Assertion failed for pattern_12. A Resource object which is a Discussion Topic associated resource may contain Dependency objects which reference Resource objects with Type 'webcontent' or 'associatedcontent/imscc_xmlv1p0/learning-application-resource'.(#S12) Assertion failed for pattern_14. A Resource object which is an assessment may contain Dependency objects which reference Resource objects with Type 'webcontent' or 'associatedcontent/imscc_xmlv1p0/learning-application-resource'.(#S14) Assertion failed for pattern_15. A Resource object which is a Question Bank may contain Dependency objects which reference Resource objects with Type 'webcontent' or 'associatedcontent/imscc_xmlv1p0/learning-application-resource'.(#S15) schemas/domainProfile_2/anyElement_localised.xsd000064400000004714152266437620016063 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema definition provides the element group declaration and the attribute group declaration used for extension XML elements and attributes. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_2/dataTypes_localised.xsd000064400000013402152266437620015712 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema defintion defines global schema data type declarations for data types defined in the LOMv1.0 base schema. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_2/loose.xsd000064400000017633152266437620013070 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema definition provides attribute group declarations for LOM data elements to support schema-based validation of uniqueness constraints within a LOM XML instance where the exact set of attributes associated with each element has to be as specified by the LOM XML Schema binding (i.e., where extra attributes to enforce uniqueness have to be avoided). Duplicate declarations are included as comments for completeness. These declarations should remain commented out or they can be removed completely. NOTE: The absence of the enforcement of the uniqueness constraints does not relieve a particular LOM XML instance from satisfying the uniqueness constraints described in the LOMv1.0 base schema. Applications that require the use of the unique/loose.xsd component XSD have to enforce those uniqueness constraints by other means. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_2/unique/loose.xsd000064400000017543152266437620014376 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema definition provides attribute group declarations for LOM data elements to support schema-based validation of uniqueness constraints within a LOM XML instance where the exact set of attributes associated with each element has to be as specified by the LOM XML Schema binding (i.e., where extra attributes to enforce uniqueness have to be avoided). Duplicate declarations are included as comments for completeness. These declarations should remain commented out or they can be removed completely. NOTE: The absence of the enforcement of the uniqueness constraints does not relieve a particular LOM XML instance from satisfying the uniqueness constraints described in the LOMv1.0 base schema. Applications that require the use of the unique/loose.xsd component XSD have to enforce those uniqueness constraints by other means. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_2/rootElement_localised.xsd000064400000004661152266437620016260 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema defintion provides the element name declaration for the root element for all LOM XML instances. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_2/common/dataTypes.xsd000064400000012003152266437620015157 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema defintion defines global schema data type declarations for data types defined in the LOMv1.0 base schema. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_2/common/vocabValues.xsd000064400000023365152266437620015510 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema definition provides global type declarations for the standard LOMv1.0 vocabulary tokens for those LOM data elements whose values are taken from a Vocabulary data type. This component schema defintion defines the stanard vocabulary value declarations as defined in the LOMv1.0 base schema. These vocabulary value declarations are used in conjunction with both vocab/custom.xsd and vocab/loose.xsd. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_2/common/rootElement.xsd000064400000003541152266437620015525 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema defintion provides the element name declaration for the root element for all LOM XML instances. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_2/common/vocabTypes.xsd000064400000033062152266437620015350 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema defintion provides global type declarations for those LOM data elements whose values are taken from a Vocabulary data type. This component XSD requires schema components from other schemas that are defined in other namespaces. These statements import the appropriate components. The xsi:schemaLocation attribute is used to specify the location of the file that contains the schema that defines the namespace. The xsi:schemaLocation attribute is optional and is ommitted. By definition of the composite schemas the appropriate namespaces and related files where those namespaces are defined are brought into scope. Some XML parsers may require these import statements to contain the optional xsi:schemaLocation attribute. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_2/common/elementTypes.xsd000064400000062634152266437620015716 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema defintion defines global schema data type declarations for data elements defined in the LOMv1.0 base schema. This component XSD defines the aggregation relationship among the LOM data elements. These aggregation relationships enforce the LOMv1.0 base schema requirement that elements can only be present in a LOM XML instance as elements of the aggregate element to which they belong. Duplicate declarations are included as comments for completeness. These declarations should remain commented out or they can be removed completely. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_2/common/elementNames.xsd000064400000055243152266437620015653 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema defintion defines global element declarations for each of the data elements defined in the LOMv1.0 base schema. This component schema definition is used to check for the uniqueness of elements declared to be unique within their parent elements by the presence of the "uniqueElementName" attribute. The XML Schema constraint "unique" is used to enforce uniqueness constraints. Duplicate declarations are included as comments for completeness. These declarations should remain commented out or they can be removed completely. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_2/common/anyElement.xsd000064400000003426152266437620015333 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema definition provides the element group declaration and the attribute group declaration used for extension XML elements and attributes. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_2/vocabValues_localised.xsd000064400000024661152266437620016237 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema definition provides global type declarations for the standard LOMv1.0 vocabulary tokens for those LOM data elements whose values are taken from a Vocabulary data type. This component schema defintion defines the stanard vocabulary value declarations as defined in the LOMv1.0 base schema. These vocabulary value declarations are used in conjunction with both vocab/custom.xsd and vocab/loose.xsd. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_2/vocab/loose.xsd000064400000012021152266437620014144 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema definition provides simple type declarations for LOM data elements that are defined as Vocabulary data types. This component schema definition enforces that vocabulary sources and values are character strings, which simplifies the schema validation process for those applications that perform vocabulary source/value validation using post-schema-validation. This component schema definition relaxes the validation constraints by allowing both sources and values to be arbitrary character strings. NOTE: The absence of the enforcement of vocabulary values does not relieve a particular LOM XML instance from satisfying vocabulary requirements defined in the LOMv1.0 base schema. Applications that require the use of vocab/loose.xsd component XSD should enforce those vocabulary requirements by other means. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_2/vocabTypes_localised.xsd000064400000040305152266437620016075 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema defintion provides global type declarations for those LOM data elements whose values are taken from a Vocabulary data type. This component XSD requires schema components from other schemas that are defined in other namespaces. These statements import the appropriate components. The xsi:schemaLocation attribute is used to specify the location of the file that contains the schema that defines the namespace. The xsi:schemaLocation attribute is optional and is ommitted. By definition of the composite schemas the appropriate namespaces and related files where those namespaces are defined are brought into scope. Some XML parsers may require these import statements to contain the optional xsi:schemaLocation attribute. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" explanation: The vocabulary for intendedEndUserRole is 'IMSGLC_CC_Rolesv1p0'. explanation: The source for a context object is fixed to 'LOMv1.0' explanation: Possible intendedEndUserRoles are only 'Learner' and 'Instructor'. explanation: The value of context is fixed to 'higher education'. schemas/domainProfile_2/lomLoose.xsd000064400000010614152266437620013530 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This file represents a composite schema for validating LOM XML Instances. This file is built by default to represent a composite schema for validation of the following: 1) The use of LOMv1.0 base schema (i.e., 1484.12.1-2002) vocabulary source/value pairs only 2) Uniqueness constraints defined by LOMv1.0 base schema 3) No existenace of any defined extensions: LOMv1.0 base schema XML element extension, LOMv1.0 base schema XML attribute extension and LOMv1.0 base schema vocabulary data type extension Alternative composite schemas can be assembled by selecting from the various alternative component schema listed below. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_2/elementTypes_localised.xsd000064400000065764152266437620016454 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema defintion defines global schema data type declarations for data elements defined in the LOMv1.0 base schema. This component XSD defines the aggregation relationship among the LOM data elements. These aggregation relationships enforce the LOMv1.0 base schema requirement that elements can only be present in a LOM XML instance as elements of the aggregate element to which they belong. Duplicate declarations are included as comments for completeness. These declarations should remain commented out or they can be removed completely. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_2/extend/custom.xsd000064400000004260152266437620014540 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema defines the XML Schema content model groups customElements and customAttributes to support validation of extension XML elements and attributes. This component XSD should be used if extensions are to be supported in LOM XML instances. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_2/anyElement.xsd000064400000003423152266437620014040 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema definition provides the element group declaration and the attribute group declaration used for extension XML elements and attributes. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_2/imscc_mR_definition.xsd000064400000003242152266437620015702 0ustar00 schemas/domainProfile_2/elementNames_localised.xsd000064400000056522152266437620016403 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema defintion defines global element declarations for each of the data elements defined in the LOMv1.0 base schema. This component schema definition is used to check for the uniqueness of elements declared to be unique within their parent elements by the presence of the "uniqueElementName" attribute. The XML Schema constraint "unique" is used to enforce uniqueness constraints. Duplicate declarations are included as comments for completeness. These declarations should remain commented out or they can be removed completely. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_2/lomLoose_constraintsDocument.scmt000064400000020263152266437620020027 0ustar00 Assertion failed for pattern_1. An Item object which represents a folder is indicated by the absence of an IdentifierRef characteristic object. Folder Items support unlimited nesting of other folder Items and learning object link Items. Learning Application Resource Item objects may be nested by folder Item object but may not nest other folder or Learning Application resource Item objects.(#S04) Assertion failed for pattern_2. A Resource object which is a Learning Object Web Content may contain Dependency objects which reference Resource objects with Type 'webcontent'.(#S03) Assertion failed for pattern_3. If an item is invisible, its descendants must be invisible too.(#S02) Assertion failed for pattern_4. A Resource object which is a Discussion Topic associated resource may contain Dependency objects which reference Resource objects with Type 'webcontent' or 'associatedcontent/imscc_xmlv1p0/learning-application-resource'.(#S12) Assertion failed for pattern_5. The test was: . The context was: ims:resources/ims:resource/ims:dependency | ims:manifest/ims:resources/ims:resource/ims:dependency Assertion failed for pattern_6. A Resource object which is an assessment may contain Dependency objects which reference Resource objects with Type 'webcontent' or 'associatedcontent/imscc_xmlv1p0/learning-application-resource'.(#S14) Assertion failed for pattern_7. If a cartridge web content or associated content resource is linked from a Learning Application Object link Item object it must have an Href characteristic object which represents the launchable resource.(#S05) Assertion failed for pattern_8. For Discussion Topic Resources the Resource object must contain a single File object which references the Discussion Topic descriptor XML file which conforms to the http://www.imsglobal.org/xsd/imsdt_v1p0 schema. It must not have any href attribute.(#S06) Assertion failed for pattern_9. For Web Link Resources the Resource object must contain a single File object which references the Web Link descriptor XML file which conforms to the http://www.imsglobal.org/xsd/imswl_v1p0 schema. It must contain neither Dependency objects nor an href attribute.(#S07) Assertion failed for pattern_10. For Assessment or Question Bank Resources the Resource object must contain a single File object which references the QTI XML file. This file must conform to the IMS CC profile of QTI 1.2.1. The profile is contained in the package of this profile as imscc_q*.xdm. The derived schema of this QTI profile is in the package of this profile with the name ims_qtiasiv1p2_localised.xsd. The resource must not have an href attribute(#S11) schemas/domainProfile_2/lomLoose_localised.xsd000064400000012232152266437620015545 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This file represents a composite schema for validating LOM XML Instances. This file is built by default to represent a composite schema for validation of the following: 1) The use of LOMv1.0 base schema (i.e., 1484.12.1-2002) vocabulary source/value pairs only 2) Uniqueness constraints defined by LOMv1.0 base schema 3) No existenace of any defined extensions: LOMv1.0 base schema XML element extension, LOMv1.0 base schema XML attribute extension and LOMv1.0 base schema vocabulary data type extension Alternative composite schemas can be assembled by selecting from the various alternative component schema listed below. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_0/imsccauth_v1p0_localised.xsd000064400000016500152266437620016602 0ustar00 general: This specification defines the authorizations for Common Cartridges and the roles to be used for selective display of resources to Learner or Instructor. This group is defined exactly as in IMS Content Packaging v 1.2. Any namespaced element from any namespace may be included within an "any" element. The namespace for the imported element must be defined in the instance, and the schema must be imported. The extension has a definition of "strict" i.e. they must have their own namespace. schemas/domainProfile_0/imsccauth_v1p0.xsd000064400000014716152266437620014572 0ustar00 This group is defined exactly as in IMS Content Packaging v 1.2. Any namespaced element from any namespace may be included within an "any" element. The namespace for the imported element must be defined in the instance, and the schema must be imported. The extension has a definition of "strict" i.e. they must have their own namespace. schemas/domainProfile_0/imsccauth_v1p0_constraintsDocument.scmt000064400000020263152266437620021062 0ustar00 Assertion failed for pattern_1. An Item object which represents a folder is indicated by the absence of an IdentifierRef characteristic object. Folder Items support unlimited nesting of other folder Items and learning object link Items. Learning Application Resource Item objects may be nested by folder Item object but may not nest other folder or Learning Application resource Item objects.(#S04) Assertion failed for pattern_2. A Resource object which is a Learning Object Web Content may contain Dependency objects which reference Resource objects with Type 'webcontent'.(#S03) Assertion failed for pattern_3. If an item is invisible, its descendants must be invisible too.(#S02) Assertion failed for pattern_4. A Resource object which is a Discussion Topic associated resource may contain Dependency objects which reference Resource objects with Type 'webcontent' or 'associatedcontent/imscc_xmlv1p0/learning-application-resource'.(#S12) Assertion failed for pattern_5. The test was: . The context was: ims:resources/ims:resource/ims:dependency | ims:manifest/ims:resources/ims:resource/ims:dependency Assertion failed for pattern_6. A Resource object which is an assessment may contain Dependency objects which reference Resource objects with Type 'webcontent' or 'associatedcontent/imscc_xmlv1p0/learning-application-resource'.(#S14) Assertion failed for pattern_7. If a cartridge web content or associated content resource is linked from a Learning Application Object link Item object it must have an Href characteristic object which represents the launchable resource.(#S05) Assertion failed for pattern_8. For Discussion Topic Resources the Resource object must contain a single File object which references the Discussion Topic descriptor XML file which conforms to the http://www.imsglobal.org/xsd/imsdt_v1p0 schema. It must not have any href attribute.(#S06) Assertion failed for pattern_9. For Web Link Resources the Resource object must contain a single File object which references the Web Link descriptor XML file which conforms to the http://www.imsglobal.org/xsd/imswl_v1p0 schema. It must contain neither Dependency objects nor an href attribute.(#S07) Assertion failed for pattern_10. For Assessment or Question Bank Resources the Resource object must contain a single File object which references the QTI XML file. This file must conform to the IMS CC profile of QTI 1.2.1. The profile is contained in the package of this profile as imscc_q*.xdm. The derived schema of this QTI profile is in the package of this profile with the name ims_qtiasiv1p2_localised.xsd. The resource must not have an href attribute(#S11) schemas/domainProfile_1/anyElement_localised.xsd000064400000004727152266437620016066 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema definition provides the element group declaration and the attribute group declaration used for extension XML elements and attributes. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_1/dataTypes_localised.xsd000064400000013760152266437620015720 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema defintion defines global schema data type declarations for data types defined in the LOMv1.0 base schema. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" explanation: No custom elements are allowed. schemas/domainProfile_1/imscc_m_definition.xsd000064400000001613152266437620015557 0ustar00 schemas/domainProfile_1/loose.xsd000064400000017647152266437620013074 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema definition provides attribute group declarations for LOM data elements to support schema-based validation of uniqueness constraints within a LOM XML instance where the exact set of attributes associated with each element has to be as specified by the LOM XML Schema binding (i.e., where extra attributes to enforce uniqueness have to be avoided). Duplicate declarations are included as comments for completeness. These declarations should remain commented out or they can be removed completely. NOTE: The absence of the enforcement of the uniqueness constraints does not relieve a particular LOM XML instance from satisfying the uniqueness constraints described in the LOMv1.0 base schema. Applications that require the use of the unique/loose.xsd component XSD have to enforce those uniqueness constraints by other means. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_1/unique/loose.xsd000064400000017557152266437620014402 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema definition provides attribute group declarations for LOM data elements to support schema-based validation of uniqueness constraints within a LOM XML instance where the exact set of attributes associated with each element has to be as specified by the LOM XML Schema binding (i.e., where extra attributes to enforce uniqueness have to be avoided). Duplicate declarations are included as comments for completeness. These declarations should remain commented out or they can be removed completely. NOTE: The absence of the enforcement of the uniqueness constraints does not relieve a particular LOM XML instance from satisfying the uniqueness constraints described in the LOMv1.0 base schema. Applications that require the use of the unique/loose.xsd component XSD have to enforce those uniqueness constraints by other means. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_1/rootElement_localised.xsd000064400000004675152266437620016264 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema defintion provides the element name declaration for the root element for all LOM XML instances. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_1/common/dataTypes.xsd000064400000012044152266437620015163 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema defintion defines global schema data type declarations for data types defined in the LOMv1.0 base schema. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_1/common/vocabValues.xsd000064400000023401152266437620015476 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema definition provides global type declarations for the standard LOMv1.0 vocabulary tokens for those LOM data elements whose values are taken from a Vocabulary data type. This component schema defintion defines the stanard vocabulary value declarations as defined in the LOMv1.0 base schema. These vocabulary value declarations are used in conjunction with both vocab/custom.xsd and vocab/loose.xsd. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_1/common/rootElement.xsd000064400000003555152266437620015531 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema defintion provides the element name declaration for the root element for all LOM XML instances. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_1/common/vocabTypes.xsd000064400000033142152266437620015346 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema defintion provides global type declarations for those LOM data elements whose values are taken from a Vocabulary data type. This component XSD requires schema components from other schemas that are defined in other namespaces. These statements import the appropriate components. The xsi:schemaLocation attribute is used to specify the location of the file that contains the schema that defines the namespace. The xsi:schemaLocation attribute is optional and is ommitted. By definition of the composite schemas the appropriate namespaces and related files where those namespaces are defined are brought into scope. Some XML parsers may require these import statements to contain the optional xsi:schemaLocation attribute. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_1/common/elementTypes.xsd000064400000062700152266437620015707 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema defintion defines global schema data type declarations for data elements defined in the LOMv1.0 base schema. This component XSD defines the aggregation relationship among the LOM data elements. These aggregation relationships enforce the LOMv1.0 base schema requirement that elements can only be present in a LOM XML instance as elements of the aggregate element to which they belong. Duplicate declarations are included as comments for completeness. These declarations should remain commented out or they can be removed completely. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_1/common/elementNames.xsd000064400000055257152266437620015657 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema defintion defines global element declarations for each of the data elements defined in the LOMv1.0 base schema. This component schema definition is used to check for the uniqueness of elements declared to be unique within their parent elements by the presence of the "uniqueElementName" attribute. The XML Schema constraint "unique" is used to enforce uniqueness constraints. Duplicate declarations are included as comments for completeness. These declarations should remain commented out or they can be removed completely. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_1/common/anyElement.xsd000064400000003442152266437620015330 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema definition provides the element group declaration and the attribute group declaration used for extension XML elements and attributes. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_1/vocabValues_localised.xsd000064400000024675152266437620016243 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema definition provides global type declarations for the standard LOMv1.0 vocabulary tokens for those LOM data elements whose values are taken from a Vocabulary data type. This component schema defintion defines the stanard vocabulary value declarations as defined in the LOMv1.0 base schema. These vocabulary value declarations are used in conjunction with both vocab/custom.xsd and vocab/loose.xsd. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_1/vocab/loose.xsd000064400000012051152266437620014146 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema definition provides simple type declarations for LOM data elements that are defined as Vocabulary data types. This component schema definition enforces that vocabulary sources and values are character strings, which simplifies the schema validation process for those applications that perform vocabulary source/value validation using post-schema-validation. This component schema definition relaxes the validation constraints by allowing both sources and values to be arbitrary character strings. NOTE: The absence of the enforcement of vocabulary values does not relieve a particular LOM XML instance from satisfying vocabulary requirements defined in the LOMv1.0 base schema. Applications that require the use of vocab/loose.xsd component XSD should enforce those vocabulary requirements by other means. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_1/vocabTypes_localised.xsd000064400000036607152266437620016106 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema defintion provides global type declarations for those LOM data elements whose values are taken from a Vocabulary data type. This component XSD requires schema components from other schemas that are defined in other namespaces. These statements import the appropriate components. The xsi:schemaLocation attribute is used to specify the location of the file that contains the schema that defines the namespace. The xsi:schemaLocation attribute is optional and is ommitted. By definition of the composite schemas the appropriate namespaces and related files where those namespaces are defined are brought into scope. Some XML parsers may require these import statements to contain the optional xsi:schemaLocation attribute. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" explanation: learningResourceType must be 'IMS Common Cartridge' explanation: No custom elements are allowed. explanation: No custom elements are allowed. explanation: No custom elements are allowed. explanation: No custom elements are allowed. schemas/domainProfile_1/lomLoose.xsd000064400000010724152266437620013531 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This file represents a composite schema for validating LOM XML Instances. This file is built by default to represent a composite schema for validation of the following: 1) The use of LOMv1.0 base schema (i.e., 1484.12.1-2002) vocabulary source/value pairs only 2) Uniqueness constraints defined by LOMv1.0 base schema 3) No existenace of any defined extensions: LOMv1.0 base schema XML element extension, LOMv1.0 base schema XML attribute extension and LOMv1.0 base schema vocabulary data type extension Alternative composite schemas can be assembled by selecting from the various alternative component schema listed below. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_1/elementTypes_localised.xsd000064400000103562152266437620016440 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema defintion defines global schema data type declarations for data elements defined in the LOMv1.0 base schema. This component XSD defines the aggregation relationship among the LOM data elements. These aggregation relationships enforce the LOMv1.0 base schema requirement that elements can only be present in a LOM XML instance as elements of the aggregate element to which they belong. Duplicate declarations are included as comments for completeness. These declarations should remain commented out or they can be removed completely. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" explanation: metaMetadata is unused. explanation: lom.annotation is unused. explanation: No custom elements are allowed. explanation: General.structure is unused. explanation: General.aggregationLevel is unused. explanation: No custom elements are allowed. explanation: No custom elements are allowed. explanation: liveCycle.version is unused. explanation: lifeCycle.status is unused. explanation: No custom elements are allowed. explanation: No custom elements are allowed. explanation: technical.size is unused. explanation: technical.location is unused. explanation: technical.requirement is unused. explanation: technical.installationRemarks is unused. explanation: technical.otherPlatformRequirements is unused. explanation: technical.duration is unused. explanation: No custom elements are allowed. explanation: interactivityType is unused. explanation: interactivityLevel is unused. explanation: semanticDensity is unused. explanation: intendedEndUserRole is unused. explanation: Context is unused. explanation: typicalAgeRange is unused. explanation: difficulty is unused. explanation: typicalLearningTime is unused. explanation: description is unused in educational context. explanation: language unused in technical context, only in general context. explanation: No custom elements are allowed. explanation: No custom elements are allowed. explanation: No custom elements are allowed. explanation: No custom elements are allowed. explanation: No custom elements are allowed. explanation: No custom elements are allowed. explanation: No custom elements are allowed. explanation: No custom elements are allowed. schemas/domainProfile_1/extend/custom.xsd000064400000004310152266437620014533 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema defines the XML Schema content model groups customElements and customAttributes to support validation of extension XML elements and attributes. This component XSD should be used if extensions are to be supported in LOM XML instances. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_1/anyElement.xsd000064400000003437152266437620014044 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema definition provides the element group declaration and the attribute group declaration used for extension XML elements and attributes. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_1/elementNames_localised.xsd000064400000056536152266437620016407 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This component schema defintion defines global element declarations for each of the data elements defined in the LOMv1.0 base schema. This component schema definition is used to check for the uniqueness of elements declared to be unique within their parent elements by the presence of the "uniqueElementName" attribute. The XML Schema constraint "unique" is used to enforce uniqueness constraints. Duplicate declarations are included as comments for completeness. These declarations should remain commented out or they can be removed completely. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" schemas/domainProfile_1/lomLoose_constraintsDocument.scmt000064400000020263152266437620020026 0ustar00 Assertion failed for pattern_1. An Item object which represents a folder is indicated by the absence of an IdentifierRef characteristic object. Folder Items support unlimited nesting of other folder Items and learning object link Items. Learning Application Resource Item objects may be nested by folder Item object but may not nest other folder or Learning Application resource Item objects.(#S04) Assertion failed for pattern_2. A Resource object which is a Learning Object Web Content may contain Dependency objects which reference Resource objects with Type 'webcontent'.(#S03) Assertion failed for pattern_3. If an item is invisible, its descendants must be invisible too.(#S02) Assertion failed for pattern_4. A Resource object which is a Discussion Topic associated resource may contain Dependency objects which reference Resource objects with Type 'webcontent' or 'associatedcontent/imscc_xmlv1p0/learning-application-resource'.(#S12) Assertion failed for pattern_5. The test was: . The context was: ims:resources/ims:resource/ims:dependency | ims:manifest/ims:resources/ims:resource/ims:dependency Assertion failed for pattern_6. A Resource object which is an assessment may contain Dependency objects which reference Resource objects with Type 'webcontent' or 'associatedcontent/imscc_xmlv1p0/learning-application-resource'.(#S14) Assertion failed for pattern_7. If a cartridge web content or associated content resource is linked from a Learning Application Object link Item object it must have an Href characteristic object which represents the launchable resource.(#S05) Assertion failed for pattern_8. For Discussion Topic Resources the Resource object must contain a single File object which references the Discussion Topic descriptor XML file which conforms to the http://www.imsglobal.org/xsd/imsdt_v1p0 schema. It must not have any href attribute.(#S06) Assertion failed for pattern_9. For Web Link Resources the Resource object must contain a single File object which references the Web Link descriptor XML file which conforms to the http://www.imsglobal.org/xsd/imswl_v1p0 schema. It must contain neither Dependency objects nor an href attribute.(#S07) Assertion failed for pattern_10. For Assessment or Question Bank Resources the Resource object must contain a single File object which references the QTI XML file. This file must conform to the IMS CC profile of QTI 1.2.1. The profile is contained in the package of this profile as imscc_q*.xdm. The derived schema of this QTI profile is in the package of this profile with the name ims_qtiasiv1p2_localised.xsd. The resource must not have an href attribute(#S11) schemas/domainProfile_1/lomLoose_localised.xsd000064400000014350152266437620015547 0ustar00 This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, see the file license.txt, visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. This file represents a composite schema for validating LOM XML Instances. This file is built by default to represent a composite schema for validation of the following: 1) The use of LOMv1.0 base schema (i.e., 1484.12.1-2002) vocabulary source/value pairs only 2) Uniqueness constraints defined by LOMv1.0 base schema 3) No existenace of any defined extensions: LOMv1.0 base schema XML element extension, LOMv1.0 base schema XML attribute extension and LOMv1.0 base schema vocabulary data type extension Alternative composite schemas can be assembled by selecting from the various alternative component schema listed below. This file has been modified by the Knowledge Media Institute of the University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the following changes: 1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3) 2) In all component XSDs the schemaLocation attribute was amended to the xs:import and xs:include statements. This enables the usage of the schemas with tools which don't deal well with missing schemaLocation informations. This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose" conformance: This profile restricts 'IEEE LOM 1.0 loose' to the elements needed to cover unqualified Dublin Core. dc:contributor, dc:creator, dc:publisher map to lifeCycle.contribute.entity with appropriate value of lifeCycle.contribute.role, dc:coverage maps to general.coverage, dc:date maps to lifeCycle.contribute.date, dc:description maps to general.description, dc:format maps to technical.format, dc:identifier maps to general.identifier, dc:language maps to general.language, dc:relation maps to Relation, dc:rights maps to Rights, dc:source is not mapped, dc:subject maps to general.keyword (see also classification.keyword), dc:title maps to general.title dc:type maps to Educational.learningResourceType scope: This profile is used within the Common Cartridge specification. name: IMS Common Cartridge profile of IEEE LOM V1.0 loose for unqualified Dublin Core schemas/imscp_v1p2.xsd000064400000057547152266437620010731 0ustar00 XSD Data File Information ------------------------- Author: CP1.2 Project Team Date: 31st October, 2006 Version: 2.0 Status: CM/DN Release Description: This is a normative representation of the IMS CP 1.2 Information Model for binding purposes. Read the corresponding IMS CP Information Model for the Platform Independent Model representation. History: This is version 1 of the IMS CP v1.2 XSD. It directly supercedes IMS CP v1.1.4 XSD. Note that the target namespace has NOT been changed. Apart from the functional additions, the main structural changes are: (1) All of the elements and attributes are defined as local to their host object; (2) Comments have been added to the complexType definitions. Copyright: 2006 (c) IMS Global Learning Consortium Inc. All Rights Reserved. IMS Global Learning Consortium, Inc. (IMS/GLC) is publishing the information contained in this binding ("Specification") for purposes of scientific experimental and scholarly collaboration only. IMS/GLC makes no warranty or representation regarding the accuracy or completeness of the Specification. This material is provided on an "As Is" and "As Available basis". The Specification is at all times subject to change and revision without notice. It is your sole responsibility to evaluate the usefulness, accuracy and completeness of the Specification as it relates to you. IMS/GLC would appreciate receiving your comments and suggestions. Please contact IMS/GLC through our website at: http://www.imsglobal.org. Source XSLT File Information ---------------------------- XSL Generator: UMLtoXSDTransformv0p7.xsl XSLT Processor: Xalan Release: 1.0 Beta 1 Date: 30th November, 2005 Auto-generation Tool -------------------- This WSDL/XSD was auto-generated using the IMS WSDL/XSD auto-generation tool. While every attempt has been made to ensure that this tool auto-generates the XSDs correctly, users should be aware that this is an experimental tool. Permission is given to make use of this tool. IMS makes no claim on the materials created by third party users of this tool. Details on how to use this tool are contained in the IMS document: "IMS General Web Services: WSDL/XSD Binding Auto-generation" available at the IMS web-site. Tool Copyright: 2005 (c) IMS Global Learning Consortium Inc. All Rights Reserved. Any namespaced element from any namespace may be included within an "any" element. The namespace for the imported element must be defined in the instance, and the schema must be imported. The extension has a definition of "strict" i.e. they must have their own namespace. A manifest element is a container for data structures whose contents describe a semantically complete instance of the IMS Content Packaging Information Model. A manifest element may contain and reference child manifest elements in the same IMS Manifest document. The root manifest element defines an entire IMS Package. A child manifest element defines a semantically complete subset of that Package.

Represents a binding of the kinds of objects defined as children of ims-cp-imManifest : Manifest.[ ManifestMetadata, Organizations, Resources, Manifest, Extension ].

An instance of the metadata element contains data structures that declare descriptive information about a metadata element's parent only. One or more different metadata models may be declared as child extensions of a metadata element.

Represents a binding of the kinds of child objects defined for ims-cp-imMetadata: Metadata.[ Extension ].

The organizations element is a container for all data structures that describe the way or ways that information encapsulated by its parent manifest element is structured.

Represents of binding of the child objects of ims-cp-imOrganizations: Organizations.[ Organization, Extension ].

The Resources element is a container for data structures containing references to one or more assets. Asset references may be grouped within a containing resources element in whatever manner seems best. The scope of referenced assets is specific to a resources element's parent manifest element only.

Represents a binding of the kinds of child objects defined for ims-cp-imResources: Resources.[ Resource, Extension ].

An organization element is a container for all data structures relating to a particular way or view that information encapsulated by a grandparent manifest object is structured. Multiple organization elements within the same parent organizations element are equivalent in purpose: Each shows a different way for structuring the same information declared within a grandparent manifest object.

Represents a binding of the kinds of child objects defined for ims-cp-Organization: Organization[ Title, Item, Metadata, Extension ].

A resource element is a container for a particular asset or collection of assets. A resource may contain references to assets that are all of the same type or different types (i.e., file formats). The scope or boundary of an IMS Package is defined by the asset references collected into all resources containers associated with the root manifest element, whether as a child, direcdt descendant, or externally linked descendant.

Represents a binding of the kinds of child objects defined for ims-cp-imResource: Resource.[ Metadata, File, Dependency, Extension ].

An item element represents a structural node in a particular organization. An item element may be a parent or sibling of other Item elements, each one representing a unique structural node. An organization has no meaning unless it has at least one Item element.

Represents a binding of the kinds of child objects of ims-cp-imItem: Item.[ Title, Item, Metadata, Extension ].

A file element declares a reference to a single asset. The reference may be relative to the Package containing the file element or absolute (external to the Package). A file element may contain child extensions declaring alternative references to the same asset as that referenced by the file element's href attribute.

Represents a binding of the kinds of child objects defined for ims-cp-imFile: File.[ Metadata, Extension ].

A dependency element provides a way to associate another collection of asset references within the scope of the dependency element's parent resource element. This element allows the parsimonious declaration of asset references. Shared asset references can be declared once and associated many times through a Dependency element.

Represents a binding of the kinds of child objects defined for ims-cp-imDependency: Dependency.[ Extension ].

This metadata element contains data structures that declare descriptive information about an entire Package. One or more different metadata models may be declared as child extensions of a metadata element. The schema and schemaversion children define the kind or collection of metadata models being used.

Represents a binding of the kinds of child objects defined for ims-cp-imManifestMetadata: ManifestMetadata.[ Schema, SchemaVersion, MetadataModel ]..

schemas/xml.xsd000064400000021104152266437620007522 0ustar00

About the XML namespace

This schema document describes the XML namespace, in a form suitable for import by other schema documents.

See http://www.w3.org/XML/1998/namespace.html and http://www.w3.org/TR/REC-xml for information about this namespace.

Note that local names in this namespace are intended to be defined only by the World Wide Web Consortium or its subgroups. The names currently defined in this namespace are listed below. They should not be used with conflicting semantics by any Working Group, specification, or document instance.

See further below in this document for more information about how to refer to this schema document from your own XSD schema documents and about the namespace-versioning policy governing this schema document.

lang (as an attribute name)

denotes an attribute whose value is a language code for the natural language of the content of any element; its value is inherited. This name is reserved by virtue of its definition in the XML specification.

Notes

Attempting to install the relevant ISO 2- and 3-letter codes as the enumerated possible values is probably never going to be a realistic possibility.

See BCP 47 at http://www.rfc-editor.org/rfc/bcp/bcp47.txt and the IANA language subtag registry at http://www.iana.org/assignments/language-subtag-registry for further information.

The union allows for the 'un-declaration' of xml:lang with the empty string.

space (as an attribute name)

denotes an attribute whose value is a keyword indicating what whitespace processing discipline is intended for the content of the element; its value is inherited. This name is reserved by virtue of its definition in the XML specification.

base (as an attribute name)

denotes an attribute whose value provides a URI to be used as the base for interpreting any relative URIs in the scope of the element on which it appears; its value is inherited. This name is reserved by virtue of its definition in the XML Base specification.

See http://www.w3.org/TR/xmlbase/ for information about this attribute.

id (as an attribute name)

denotes an attribute whose value should be interpreted as if declared to be of type ID. This name is reserved by virtue of its definition in the xml:id specification.

See http://www.w3.org/TR/xml-id/ for information about this attribute.

Father (in any context at all)

denotes Jon Bosak, the chair of the original XML Working Group. This name is reserved by the following decision of the W3C XML Plenary and XML Coordination groups:

In appreciation for his vision, leadership and dedication the W3C XML Plenary on this 10th day of February, 2000, reserves for Jon Bosak in perpetuity the XML name "xml:Father".

About this schema document

This schema defines attributes and an attribute group suitable for use by schemas wishing to allow xml:base, xml:lang, xml:space or xml:id attributes on elements they define.

To enable this, such a schema must import this schema for the XML namespace, e.g. as follows:

          <schema . . .>
           . . .
           <import namespace="http://www.w3.org/XML/1998/namespace"
                      schemaLocation="http://www.w3.org/2001/xml.xsd"/>
     

or

           <import namespace="http://www.w3.org/XML/1998/namespace"
                      schemaLocation="http://www.w3.org/2009/01/xml.xsd"/>
     

Subsequently, qualified reference to any of the attributes or the group defined below will have the desired effect, e.g.

          <type . . .>
           . . .
           <attributeGroup ref="xml:specialAttrs"/>
     

will define a type which will schema-validate an instance element with any of those attributes.

Versioning policy for this schema document

In keeping with the XML Schema WG's standard versioning policy, this schema document will persist at http://www.w3.org/2009/01/xml.xsd.

At the date of issue it can also be found at http://www.w3.org/2001/xml.xsd.

The schema document at that URI may however change in the future, in order to remain compatible with the latest version of XML Schema itself, or with the XML namespace itself. In other words, if the XML Schema or XML namespaces change, the version of this document at http://www.w3.org/2001/xml.xsd will change accordingly; the version at http://www.w3.org/2009/01/xml.xsd will not change.

Previous dated (and unchanging) versions of this schema document are at:

schemas/domainProfile_5/imswl_v1p0.xsd000064400000012473152266437620013750 0ustar00 schemas/domainProfile_5/imswl_v1p0_localised.xsd000064400000014737152266437620015774 0ustar00 schemas/config.xml000064400000004116152266437620010175 0ustar00 http://www.imsglobal.org/xsd/imscc/imscp_v1p1 imscp_v1p2_localised.xsd http://www.imsglobal.org/xsd/imscp_v1p1 imscp_v1p2.xsd http://www.imsglobal.org/xsd/imsccauth_v1p0 domainProfile_0/imsccauth_v1p0_localised.xsd http://ltsc.ieee.org/xsd/imscc/LOM domainProfile_1/lomLoose_localised.xsd http://ltsc.ieee.org/xsd/imscc/LOM/unique domainProfile_1/loose.xsd http://ltsc.ieee.org/xsd/imscc/LOM/vocab domainProfile_1/vocab/loose.xsd http://ltsc.ieee.org/xsd/imscc/LOM/extend domainProfile_1/extend/custom.xsd http://ltsc.ieee.org/xsd/LOM domainProfile_2/lomLoose_localised.xsd http://ltsc.ieee.org/xsd/LOM/unique domainProfile_2/loose.xsd http://ltsc.ieee.org/xsd/LOM/vocab domainProfile_2/vocab/loose.xsd http://ltsc.ieee.org/xsd/LOM/extend domainProfile_2/extend/custom.xsd http://www.imsglobal.org/xsd/imscp_extensionv1p2 domainProfile_3/imscp_extensionv1p2_localised.xsd http://www.imsglobal.org/xsd/ims_qtiasiv1p2 domainProfile_4/ims_qtiasiv1p2_localised.xsd http://www.imsglobal.org/xsd/imswl_v1p0 domainProfile_5/imswl_v1p0_localised.xsd http://www.imsglobal.org/xsd/imsdt_v1p0 domainProfile_6/imsdt_v1p0_localised.xsd schemas/imscc_c1p2maeV0p15_definition.xsd000064400000006340152266437620014301 0ustar00 schemas/imscp_v1p2_localised.xsd000064400000073251152266437620012736 0ustar00 XSD Data File Information ------------------------- Author: CP1.2 Project Team Date: 31st October, 2006 Version: 2.0 Status: CM/DN Release Description: This is a normative representation of the IMS CP 1.2 Information Model for binding purposes. Read the corresponding IMS CP Information Model for the Platform Independent Model representation. History: This is version 1 of the IMS CP v1.2 XSD. It directly supercedes IMS CP v1.1.4 XSD. Note that the target namespace has NOT been changed. Apart from the functional additions, the main structural changes are: (1) All of the elements and attributes are defined as local to their host object; (2) Comments have been added to the complexType definitions. Copyright: 2006 (c) IMS Global Learning Consortium Inc. All Rights Reserved. IMS Global Learning Consortium, Inc. (IMS/GLC) is publishing the information contained in this binding ("Specification") for purposes of scientific experimental and scholarly collaboration only. IMS/GLC makes no warranty or representation regarding the accuracy or completeness of the Specification. This material is provided on an "As Is" and "As Available basis". The Specification is at all times subject to change and revision without notice. It is your sole responsibility to evaluate the usefulness, accuracy and completeness of the Specification as it relates to you. IMS/GLC would appreciate receiving your comments and suggestions. Please contact IMS/GLC through our website at: http://www.imsglobal.org. Source XSLT File Information ---------------------------- XSL Generator: UMLtoXSDTransformv0p7.xsl XSLT Processor: Xalan Release: 1.0 Beta 1 Date: 30th November, 2005 Auto-generation Tool -------------------- This WSDL/XSD was auto-generated using the IMS WSDL/XSD auto-generation tool. While every attempt has been made to ensure that this tool auto-generates the XSDs correctly, users should be aware that this is an experimental tool. Permission is given to make use of this tool. IMS makes no claim on the materials created by third party users of this tool. Details on how to use this tool are contained in the IMS document: "IMS General Web Services: WSDL/XSD Binding Auto-generation" available at the IMS web-site. Tool Copyright: 2005 (c) IMS Global Learning Consortium Inc. All Rights Reserved. Any namespaced element from any namespace may be included within an "any" element. The namespace for the imported element must be defined in the instance, and the schema must be imported. The extension has a definition of "strict" i.e. they must have their own namespace. Any namespaced element from any namespace may be included within an "any" element. The namespace for the imported element must be defined in the instance, and the schema must be imported. The extension has a definition of "strict" i.e. they must have their own namespace. Any namespaced element from any namespace may be included within an "any" element. The namespace for the imported element must be defined in the instance, and the schema must be imported. The extension has a definition of "strict" i.e. they must have their own namespace. Any namespaced element from any namespace may be included within an "any" element. The namespace for the imported element must be defined in the instance, and the schema must be imported. The extension has a definition of "strict" i.e. they must have their own namespace. A manifest element is a container for data structures whose contents describe a semantically complete instance of the IMS Content Packaging Information Model. A manifest element may contain and reference child manifest elements in the same IMS Manifest document. The root manifest element defines an entire IMS Package. A child manifest element defines a semantically complete subset of that Package.

Represents a binding of the kinds of objects defined as children of ims-cp-imManifest : Manifest.[ ManifestMetadata, Organizations, Resources, Manifest, Extension ].

An instance of the metadata element contains data structures that declare descriptive information about a metadata element's parent only. One or more different metadata models may be declared as child extensions of a metadata element.

Represents a binding of the kinds of child objects defined for ims-cp-imMetadata: Metadata.[ Extension ].

The organizations element is a container for all data structures that describe the way or ways that information encapsulated by its parent manifest element is structured.

Represents of binding of the child objects of ims-cp-imOrganizations: Organizations.[ Organization, Extension ].

The Resources element is a container for data structures containing references to one or more assets. Asset references may be grouped within a containing resources element in whatever manner seems best. The scope of referenced assets is specific to a resources element's parent manifest element only.

Represents a binding of the kinds of child objects defined for ims-cp-imResources: Resources.[ Resource, Extension ].

An organization element is a container for all data structures relating to a particular way or view that information encapsulated by a grandparent manifest object is structured. Multiple organization elements within the same parent organizations element are equivalent in purpose: Each shows a different way for structuring the same information declared within a grandparent manifest object.

Represents a binding of the kinds of child objects defined for ims-cp-Organization: Organization[ Title, Item, Metadata, Extension ].

A resource element is a container for a particular asset or collection of assets. A resource may contain references to assets that are all of the same type or different types (i.e., file formats). The scope or boundary of an IMS Package is defined by the asset references collected into all resources containers associated with the root manifest element, whether as a child, direcdt descendant, or externally linked descendant.

Represents a binding of the kinds of child objects defined for ims-cp-imResource: Resource.[ Metadata, File, Dependency, Extension ].

An item element represents a structural node in a particular organization. An item element may be a parent or sibling of other Item elements, each one representing a unique structural node. An organization has no meaning unless it has at least one Item element.

Represents a binding of the kinds of child objects of ims-cp-imItem: Item.[ Title, Item, Metadata, Extension ].

An item element represents a structural node in a particular organization. An item element may be a parent or sibling of other Item elements, each one representing a unique structural node. An organization has no meaning unless it has at least one Item element.

Represents a binding of the kinds of child objects of ims-cp-imItem: Item.[ Title, Item, Metadata, Extension ].

A file element declares a reference to a single asset. The reference may be relative to the Package containing the file element or absolute (external to the Package). A file element may contain child extensions declaring alternative references to the same asset as that referenced by the file element's href attribute.

Represents a binding of the kinds of child objects defined for ims-cp-imFile: File.[ Metadata, Extension ].

A dependency element provides a way to associate another collection of asset references within the scope of the dependency element's parent resource element. This element allows the parsimonious declaration of asset references. Shared asset references can be declared once and associated many times through a Dependency element.

Represents a binding of the kinds of child objects defined for ims-cp-imDependency: Dependency.[ Extension ].

This metadata element contains data structures that declare descriptive information about an entire Package. One or more different metadata models may be declared as child extensions of a metadata element. The schema and schemaversion children define the kind or collection of metadata models being used.

Represents a binding of the kinds of child objects defined for ims-cp-imManifestMetadata: ManifestMetadata.[ Schema, SchemaVersion, MetadataModel ]..

schemas/domainProfile_6/imsdt_v1p0_localised.xsd000064400000015051152266437620015750 0ustar00 schemas/domainProfile_6/imsdt_v1p0.xsd000064400000013674152266437620013742 0ustar00 schemas/domainProfile_4/xml.xsd000064400000013140152266437620012536 0ustar00 See http://www.w3.org/XML/1998/namespace.html and http://www.w3.org/TR/REC-xml for information about this namespace. This schema document describes the XML namespace, in a form suitable for import by other schema documents. Note that local names in this namespace are intended to be defined only by the World Wide Web Consortium or its subgroups. The following names are currently defined in this namespace and should not be used with conflicting semantics by any Working Group, specification, or document instance: base (as an attribute name): denotes an attribute whose value provides a URI to be used as the base for interpreting any relative URIs in the scope of the element on which it appears; its value is inherited. This name is reserved by virtue of its definition in the XML Base specification. id (as an attribute name): denotes an attribute whose value should be interpreted as if declared to be of type ID. This name is reserved by virtue of its definition in the xml:id specification. lang (as an attribute name): denotes an attribute whose value is a language code for the natural language of the content of any element; its value is inherited. This name is reserved by virtue of its definition in the XML specification. space (as an attribute name): denotes an attribute whose value is a keyword indicating what whitespace processing discipline is intended for the content of the element; its value is inherited. This name is reserved by virtue of its definition in the XML specification. Father (in any context at all): denotes Jon Bosak, the chair of the original XML Working Group. This name is reserved by the following decision of the W3C XML Plenary and XML Coordination groups: In appreciation for his vision, leadership and dedication the W3C XML Plenary on this 10th day of February, 2000 reserves for Jon Bosak in perpetuity the XML name xml:Father This schema defines attributes and an attribute group suitable for use by schemas wishing to allow xml:base, xml:lang, xml:space or xml:id attributes on elements they define. To enable this, such a schema must import this schema for the XML namespace, e.g. as follows: <schema . . .> . . . <import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/> Subsequently, qualified reference to any of the attributes or the group defined below will have the desired effect, e.g. <type . . .> . . . <attributeGroup ref="xml:specialAttrs"/> will define a type which will schema-validate an instance element with any of those attributes In keeping with the XML Schema WG's standard versioning policy, this schema document will persist at http://www.w3.org/2007/08/xml.xsd. At the date of issue it can also be found at http://www.w3.org/2001/xml.xsd. The schema document at that URI may however change in the future, in order to remain compatible with the latest version of XML Schema itself, or with the XML namespace itself. In other words, if the XML Schema or XML namespaces change, the version of this document at http://www.w3.org/2001/xml.xsd will change accordingly; the version at http://www.w3.org/2007/08/xml.xsd will not change. Attempting to install the relevant ISO 2- and 3-letter codes as the enumerated possible values is probably never going to be a realistic possibility. See RFC 3066 at http://www.ietf.org/rfc/rfc3066.txt and the IANA registry at http://www.iana.org/assignments/lang-tag-apps.htm for further information. The union allows for the 'un-declaration' of xml:lang with the empty string. See http://www.w3.org/TR/xmlbase/ for information about this attribute. See http://www.w3.org/TR/xml-id/ for information about this attribute. schemas/domainProfile_4/ims_qtiasiv1p2_def_copy.xsd000064400000275732152266437620016502 0ustar00 schemas/domainProfile_4/imscc_q_definition.xsd000064400000024157152266437620015576 0ustar00 schemas/domainProfile_4/ims_qtiasiv1p2.xsd000064400000261436152266437620014626 0ustar00 schemas/domainProfile_4/ims_qtiasiv1p2_localised.xsd000064400000265555152266437620016653 0ustar00 schemas/domainProfile_3/imscp_extensionv1p2.xsd000064400000036243152266437620015666 0ustar00 XSD Data File Information ------------------------- Author: Colin Smythe (IMS, UK) Date: 31st October, 2006 Version: 2.0 Status: Public Draft Description: This is a normative representation of the IMS Packaging Extension 1.0 Information Model for binding purposes. Read the corresponding IMS Content Packaging Information Model for the Platform Independent Model representation. History: Version 2 includes the modified definition of LingualTitle. Version 1 of the IMS Packaging Utility v1.2 XSD for public draft release. It has a target namespace of http://www.imsglobal.org/xsd/imscp_extensionv1p2. This Utility uses this general approach to modeling: (1) All of the elements and attributes are defined as local to their host object; (2) There are multiple host objects; (3) Comments have been added to the complexType definitions. Copyright: 2006 (c) IMS Global Learning Consortium Inc. All Rights Reserved. IMS Global Learning Consortium, Inc. (IMS/GLC) is publishing the information contained in this binding ("Specification") for purposes of scientific experimental and scholarly collaboration only. IMS/GLC makes no warranty or representation regarding the accuracy or completeness of the Specification. This material is provided on an "As Is" and "As Available basis". The Specification is at all times subject to change and revision without notice. It is your sole responsibility to evaluate the usefulness, accuracy and completeness of the Specification as it relates to you. IMS/GLC would appreciate receiving your comments and suggestions. Please contact IMS/GLC through our website at: http://www.imsglobal.org. Source XSLT File Information ---------------------------- XSL Generator: UMLtoXSDTransformv0p7.xsl XSLT Processor: Xalan Release: 1.0 Beta 1 Date: 30th November, 2005 Auto-generation Tool -------------------- This WSDL/XSD was auto-generated using the IMS WSDL/XSD auto-generation tool. While every attempt has been made to ensure that this tool auto-generates the XSDs correctly, users should be aware that this is an experimental tool. Permission is given to make use of this tool. IMS makes no claim on the materials created by third party users of this tool. Details on how to use this tool are contained in the IMS document: "IMS General Web Services: WSDL/XSD Binding Auto-generation" available at the IMS web-site. Tool Copyright: 2006 (c) IMS Global Learning Consortium Inc. All Rights Reserved. Any namespaced element from any namespace may be included within an "any" element. The namespace for the imported element must be defined in the instance, and the schema must be imported. The extension has a definition of "strict" i.e. they must have their own namespace. A bound instance of an IPointer object allows a packager to associate a specific XML node set in the same IMS Manifest Document that contains it or an XML node set in a different IMS Manifest Document instance with the parent object containing an IMS Pointer instance. A referenced node set must be a valid child of the referencing parent element, both as to kind and multiplicity in a referencing parent's context.

Represents a binding of the kinds of objects defined as children of ims-cp-imManifest : Manifest.[ ManifestMetadata, Organizations, Resources, Manifest, Extension ].

An instance of the metadata element contains data structures that declare descriptive information about a metadata element's parent only. One or more different metadata models may be declared as child extensions of a metadata element.

Represents a binding of the kinds of child objects defined for ims-cp-imMetadata: Metadata.[ Extension ].

A variant element is closely analogous to a resource element in the IMS Content Packaging Information Model. Variant is a container for a an alternative resource. A resource may contain references to assets that are all of the same type or different types (i.e., file formats). The Variant class points to the alternatibe resource. Metadata is used to describe the nature of a collection of alternative assets and their intended use. Examples include, but are not limited to, use as lingual variants, visual or auditory variants, remediation variants, or platform delivery variants. The scope of referenced assets is specific to a Variant object. Their use is in the context of the parent object containing a variant instance, typically a bound instance of a Resource object from the IMS CP namespace.

Represents a binding of the kinds of child objects defined for ims-cp-imResource: Resource.[ Metadata, File, Dependency, Extension ].

schemas/domainProfile_3/imscp_extensionv1p2_localised.xsd000064400000037633152266437620017711 0ustar00 XSD Data File Information ------------------------- Author: Colin Smythe (IMS, UK) Date: 31st October, 2006 Version: 2.0 Status: Public Draft Description: This is a normative representation of the IMS Packaging Extension 1.0 Information Model for binding purposes. Read the corresponding IMS Content Packaging Information Model for the Platform Independent Model representation. History: Version 2 includes the modified definition of LingualTitle. Version 1 of the IMS Packaging Utility v1.2 XSD for public draft release. It has a target namespace of http://www.imsglobal.org/xsd/imscp_extensionv1p2. This Utility uses this general approach to modeling: (1) All of the elements and attributes are defined as local to their host object; (2) There are multiple host objects; (3) Comments have been added to the complexType definitions. Copyright: 2006 (c) IMS Global Learning Consortium Inc. All Rights Reserved. IMS Global Learning Consortium, Inc. (IMS/GLC) is publishing the information contained in this binding ("Specification") for purposes of scientific experimental and scholarly collaboration only. IMS/GLC makes no warranty or representation regarding the accuracy or completeness of the Specification. This material is provided on an "As Is" and "As Available basis". The Specification is at all times subject to change and revision without notice. It is your sole responsibility to evaluate the usefulness, accuracy and completeness of the Specification as it relates to you. IMS/GLC would appreciate receiving your comments and suggestions. Please contact IMS/GLC through our website at: http://www.imsglobal.org. Source XSLT File Information ---------------------------- XSL Generator: UMLtoXSDTransformv0p7.xsl XSLT Processor: Xalan Release: 1.0 Beta 1 Date: 30th November, 2005 Auto-generation Tool -------------------- This WSDL/XSD was auto-generated using the IMS WSDL/XSD auto-generation tool. While every attempt has been made to ensure that this tool auto-generates the XSDs correctly, users should be aware that this is an experimental tool. Permission is given to make use of this tool. IMS makes no claim on the materials created by third party users of this tool. Details on how to use this tool are contained in the IMS document: "IMS General Web Services: WSDL/XSD Binding Auto-generation" available at the IMS web-site. Tool Copyright: 2006 (c) IMS Global Learning Consortium Inc. All Rights Reserved. general: This profile of the extension schema of IMS CP 1.2 restricts extensions to use the variant element only. Any namespaced element from any namespace may be included within an "any" element. The namespace for the imported element must be defined in the instance, and the schema must be imported. The extension has a definition of "strict" i.e. they must have their own namespace. A bound instance of an IPointer object allows a packager to associate a specific XML node set in the same IMS Manifest Document that contains it or an XML node set in a different IMS Manifest Document instance with the parent object containing an IMS Pointer instance. A referenced node set must be a valid child of the referencing parent element, both as to kind and multiplicity in a referencing parent's context.

Represents a binding of the kinds of objects defined as children of ims-cp-imManifest : Manifest.[ ManifestMetadata, Organizations, Resources, Manifest, Extension ].

An instance of the metadata element contains data structures that declare descriptive information about a metadata element's parent only. One or more different metadata models may be declared as child extensions of a metadata element.

Represents a binding of the kinds of child objects defined for ims-cp-imMetadata: Metadata.[ Extension ].

A variant element is closely analogous to a resource element in the IMS Content Packaging Information Model. Variant is a container for a an alternative resource. A resource may contain references to assets that are all of the same type or different types (i.e., file formats). The Variant class points to the alternatibe resource. Metadata is used to describe the nature of a collection of alternative assets and their intended use. Examples include, but are not limited to, use as lingual variants, visual or auditory variants, remediation variants, or platform delivery variants. The scope of referenced assets is specific to a Variant object. Their use is in the context of the parent object containing a variant instance, typically a bound instance of a Resource object from the IMS CP namespace.

Represents a binding of the kinds of child objects defined for ims-cp-imResource: Resource.[ Metadata, File, Dependency, Extension ].

schemas/domainProfile_3/imscp_extensionv1p2_constraintsDocument.scmt000064400000020263152266437620022157 0ustar00 Assertion failed for pattern_1. An Item object which represents a folder is indicated by the absence of an IdentifierRef characteristic object. Folder Items support unlimited nesting of other folder Items and learning object link Items. Learning Application Resource Item objects may be nested by folder Item object but may not nest other folder or Learning Application resource Item objects.(#S04) Assertion failed for pattern_2. A Resource object which is a Learning Object Web Content may contain Dependency objects which reference Resource objects with Type 'webcontent'.(#S03) Assertion failed for pattern_3. If an item is invisible, its descendants must be invisible too.(#S02) Assertion failed for pattern_4. A Resource object which is a Discussion Topic associated resource may contain Dependency objects which reference Resource objects with Type 'webcontent' or 'associatedcontent/imscc_xmlv1p0/learning-application-resource'.(#S12) Assertion failed for pattern_5. The test was: . The context was: ims:resources/ims:resource/ims:dependency | ims:manifest/ims:resources/ims:resource/ims:dependency Assertion failed for pattern_6. A Resource object which is an assessment may contain Dependency objects which reference Resource objects with Type 'webcontent' or 'associatedcontent/imscc_xmlv1p0/learning-application-resource'.(#S14) Assertion failed for pattern_7. If a cartridge web content or associated content resource is linked from a Learning Application Object link Item object it must have an Href characteristic object which represents the launchable resource.(#S05) Assertion failed for pattern_8. For Discussion Topic Resources the Resource object must contain a single File object which references the Discussion Topic descriptor XML file which conforms to the http://www.imsglobal.org/xsd/imsdt_v1p0 schema. It must not have any href attribute.(#S06) Assertion failed for pattern_9. For Web Link Resources the Resource object must contain a single File object which references the Web Link descriptor XML file which conforms to the http://www.imsglobal.org/xsd/imswl_v1p0 schema. It must contain neither Dependency objects nor an href attribute.(#S07) Assertion failed for pattern_10. For Assessment or Question Bank Resources the Resource object must contain a single File object which references the QTI XML file. This file must conform to the IMS CC profile of QTI 1.2.1. The profile is contained in the package of this profile as imscc_q*.xdm. The derived schema of this QTI profile is in the package of this profile with the name ims_qtiasiv1p2_localised.xsd. The resource must not have an href attribute(#S11) entity.resource.class.php000064400000020050152266437620011535 0ustar00. /** * @package moodlecore * @subpackage backup-imscc * @copyright 2009 Mauro Rondinelli (mauro.rondinelli [AT] uvcms.com) * @copyright 2011 Darko Miletic (dmiletic@moodlerooms.com) * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.'); class cc_resource extends entities { public function generate_node() { cc2moodle::log_action('Creating Resource mods'); $response = ''; $sheet_mod_resource = cc2moodle::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_RESOURCE); if (!empty(cc2moodle::$instances['instances'][MOODLE_TYPE_RESOURCE])) { foreach (cc2moodle::$instances['instances'][MOODLE_TYPE_RESOURCE] as $instance) { $response .= $this->create_node_course_modules_mod_resource($sheet_mod_resource, $instance); } } return $response; } private function create_node_course_modules_mod_resource($sheet_mod_resource, $instance) { global $CFG; require_once($CFG->libdir.'/validateurlsyntax.php'); $link = ''; $mod_alltext = ''; $mod_summary = ''; $xpath = cc2moodle::newx_path(cc2moodle::$manifest, cc2moodle::$namespaces); if ($instance['common_cartriedge_type'] == cc2moodle::CC_TYPE_WEBCONTENT || $instance['common_cartriedge_type'] == cc2moodle::CC_TYPE_ASSOCIATED_CONTENT) { $resource = $xpath->query('/imscc:manifest/imscc:resources/imscc:resource[@identifier="' . $instance['resource_indentifier'] . '"]/@href'); $resource = !empty($resource->item(0)->nodeValue) ? $resource->item(0)->nodeValue : ''; if (empty($resource)) { unset($resource); $resource = $xpath->query('/imscc:manifest/imscc:resources/imscc:resource[@identifier="' . $instance['resource_indentifier'] . '"]/imscc:file/@href'); $resource = !empty($resource->item(0)->nodeValue) ? $resource->item(0)->nodeValue : ''; } if (!empty($resource)) { $link = $resource; } } if ($instance['common_cartriedge_type'] == cc2moodle::CC_TYPE_WEBLINK) { $external_resource = $xpath->query('/imscc:manifest/imscc:resources/imscc:resource[@identifier="' . $instance['resource_indentifier'] . '"]/imscc:file/@href')->item(0)->nodeValue; if ($external_resource) { $resource = $this->load_xml_resource(cc2moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . $external_resource); if (!empty($resource)) { $xpath = cc2moodle::newx_path($resource, cc2moodle::getresourcens()); $resource = $xpath->query('//url/@href'); if ($resource->length > 0) { $rawlink = $resource->item(0)->nodeValue; if (!validateUrlSyntax($rawlink, 's+')) { $changed = rawurldecode($rawlink); if (validateUrlSyntax($changed, 's+')) { $link = $changed; } else { $link = 'http://invalidurldetected/'; } } else { $link = $rawlink; } } } } } $find_tags = array('[#mod_instance#]', '[#mod_name#]', '[#mod_type#]', '[#mod_reference#]', '[#mod_summary#]', '[#mod_alltext#]', '[#mod_options#]', '[#date_now#]'); $mod_type = 'file'; $mod_options = 'objectframe'; $mod_reference = $link; //detected if we are dealing with html file if (!empty($link) && ($instance['common_cartriedge_type'] == cc2moodle::CC_TYPE_WEBCONTENT)) { $ext = strtolower(pathinfo($link, PATHINFO_EXTENSION)); if (in_array($ext, array('html', 'htm', 'xhtml'))) { $mod_type = 'html'; //extract the content of the file $rootpath = realpath(cc112moodle::$path_to_manifest_folder); $htmlpath = realpath($rootpath . DIRECTORY_SEPARATOR . $link); $dirpath = dirname($htmlpath); if (file_exists($htmlpath)) { $fcontent = file_get_contents($htmlpath); $mod_alltext = clean_param($this->prepare_content($fcontent), PARAM_CLEANHTML); $mod_reference = ''; $mod_options = ''; //TODO: try to handle embedded resources /** * images, linked static resources, applets, videos */ $doc = new DOMDocument(); $cdir = getcwd(); chdir($dirpath); try { if (!empty($mod_alltext) && $doc->loadHTML($mod_alltext)) { $xpath = new DOMXPath($doc); $attributes = array('href', 'src', 'background', 'archive', 'code'); $qtemplate = "//*[@##][not(contains(@##,'://'))]/@##"; $query = ''; foreach ($attributes as $attrname) { if (!empty($query)) { $query .= " | "; } $query .= str_replace('##', $attrname, $qtemplate); } $list = $xpath->query($query); $searches = array(); $replaces = array(); foreach ($list as $resrc) { $rpath = $resrc->nodeValue; $rtp = realpath($rpath); if (($rtp !== false) && is_file($rtp)) { //file is there - we are in business $strip = str_replace("\\", "/", str_ireplace($rootpath, '', $rtp)); $encoded_file = '$@FILEPHP@$'.str_replace('/', '$@SLASH@$', $strip); $searches[] = $resrc->nodeValue; $replaces[] = $encoded_file; } } $mod_alltext = str_replace($searches, $replaces, $mod_alltext); } } catch (Exception $e) { //silence the complaints } chdir($cdir); $mod_alltext = self::safexml($mod_alltext); } } } $replace_values = array($instance['instance'], self::safexml($instance['title']), $mod_type, $mod_reference, '', $mod_alltext, $mod_options, time()); return str_replace($find_tags, $replace_values, $sheet_mod_resource); } } sheets/info_details_mod.xml000064400000000340152266437620012072 0ustar00 [#mod_type#] true false [#node_info_details_mod_instances_instance#] sheets/course_modules_mod_lti.xml000064400000001564152266437620013343 0ustar00 [#mod_instance#] lti [#mod_basiclti_name#] [#mod_basiclti_intro#] 1 [#mod_basiclti_timec#] [#mod_basiclti_timem#] 1 [#mod_basiclti_toolurl#] 1 0 1 1 $@NULL@$ 100.00000 0 [#mod_basiclti_icon#] sheets/moodle_blti_export.xml000064400000165014152266437620012477 0ustar00 backup-cf101-20110815-0949.zip 2007101591 1.9.10 (Build: 20101025) 2009111300 1.9.7 1313412551 http://localhost/mdl191 9d9e34b447116860361beeca0191299f internal
forum false false basiclti true false 2 Yeah2 true false false none false false false false false false false instances
3 Teacher editingteacher report/courseoverview:view 1 1311692228 0 moodle/user:viewhiddendetails 1 1311692105 0 moodle/user:viewdetails 1 1311692105 0 moodle/user:readuserposts 1 1311692108 0 moodle/user:readuserblogs 1 1311692109 0 moodle/tag:manage 1 1311692111 0 moodle/tag:editblocks 1 1311692112 0 moodle/site:viewreports 1 1311692104 0 moodle/site:viewfullnames 1 1311692104 0 moodle/site:trustcontent 1 1311692104 0 moodle/site:restore 1 1311692103 0 moodle/site:readallmessages 1 1311692103 0 moodle/site:manageblocks 1 1311692104 0 moodle/site:import 1 1311692103 0 moodle/site:doclinks 1 1311692110 0 moodle/site:backup 1 1311692103 0 moodle/site:accessallgroups 1 1311692104 0 moodle/role:viewhiddenassigns 1 1311692105 0 moodle/role:unassignself 1 1311692105 0 moodle/role:switchroles 1 1311692105 0 moodle/role:safeoverride 1 1311692105 0 moodle/role:assign 1 1311692105 0 moodle/question:viewmine 1 1311692109 0 moodle/question:viewall 1 1311692109 0 moodle/question:usemine 1 1311692109 0 moodle/question:useall 1 1311692109 0 moodle/question:movemine 1 1311692109 0 moodle/question:moveall 1 1311692109 0 moodle/question:managecategory 1 1311692109 0 moodle/question:editmine 1 1311692109 0 moodle/question:editall 1 1311692109 0 moodle/question:add 1 1311692109 0 moodle/notes:view 1 1311692111 0 moodle/notes:manage 1 1311692111 0 moodle/legacy:editingteacher 1 1311692103 0 moodle/grade:viewhidden 1 1311692110 0 moodle/grade:viewall 1 1311692110 0 moodle/grade:unlock 1 1311692111 0 moodle/grade:manageoutcomes 1 1311692110 0 moodle/grade:manageletters 1 1311692111 0 moodle/grade:manage 1 1311692110 0 moodle/grade:lock 1 1311692111 0 moodle/grade:import 1 1311692110 0 moodle/grade:hide 1 1311692111 0 moodle/grade:export 1 1311692110 0 moodle/grade:edit 1 1311692110 0 moodle/course:visibility 1 1311692106 0 moodle/course:viewscales 1 1311692107 0 moodle/course:viewparticipants 1 1311692107 0 moodle/course:viewhiddenuserfields 1 1311692106 0 moodle/course:viewhiddensections 1 1311692110 0 moodle/course:viewhiddencourses 1 1311692106 0 moodle/course:viewhiddenactivities 1 1311692106 0 moodle/course:view 1 1311692106 0 moodle/course:useremail 1 1311692110 0 moodle/course:update 1 1311692106 0 moodle/course:setcurrentsection 1 1311692110 0 moodle/course:sectionvisibility 1 1311692110 0 moodle/course:reset 1 1311692107 0 moodle/course:managescales 1 1311692107 0 moodle/course:managemetacourse 1 1311692106 0 moodle/course:managegroups 1 1311692107 0 moodle/course:managefiles 1 1311692106 0 moodle/course:manageactivities 1 1311692106 0 moodle/course:changesummary 1 1311692107 0 moodle/course:changeshortname 1 1311692107 0 moodle/course:changeidnumber 1 1311692107 0 moodle/course:changefullname 1 1311692107 0 moodle/course:changecategory 1 1311692107 0 moodle/course:bulkmessaging 1 1311692106 0 moodle/course:activityvisibility 1 1311692106 0 moodle/calendar:managegroupentries 1 1311692108 0 moodle/calendar:manageentries 1 1311692108 0 moodle/blog:view 1 1311692108 0 moodle/blog:manageentries 1 1311692108 0 moodle/block:view 1 1311692112 0 mod/workshop:manage 1 1311692191 0 mod/wiki:participate 1 1311692184 0 mod/wiki:overridelock 1 1311692185 0 mod/wiki:manage 1 1311692185 0 mod/scorm:viewscores 1 1311692177 0 mod/scorm:viewreport 1 1311692176 0 mod/scorm:savetrack 1 1311692176 0 mod/scorm:deleteresponses 1 1311692177 0 mod/quiz:viewreports 1 1311692167 0 mod/quiz:view 1 1311692167 0 mod/quiz:preview 1 1311692167 0 mod/quiz:manage 1 1311692167 0 mod/quiz:grade 1 1311692167 0 mod/quiz:deleteattempts 1 1311692167 0 mod/lesson:manage 1 1311692156 0 mod/lesson:edit 1 1311692155 0 mod/lams:manage 1 1311692150 0 mod/hotpot:viewreport 1 1311692147 0 mod/hotpot:grade 1 1311692147 0 mod/hotpot:deleteattempt 1 1311692148 0 mod/hotpot:attempt 1 1311692147 0 mod/glossary:write 1 1311692143 0 mod/glossary:viewrating 1 1311692144 0 mod/glossary:rate 1 1311692144 0 mod/glossary:manageentries 1 1311692143 0 mod/glossary:managecomments 1 1311692144 0 mod/glossary:managecategories 1 1311692143 0 mod/glossary:import 1 1311692144 0 mod/glossary:export 1 1311692144 0 mod/glossary:comment 1 1311692143 0 mod/glossary:approve 1 1311692144 0 mod/forum:viewsubscribers 1 1311692138 0 mod/forum:viewrating 1 1311692137 0 mod/forum:viewqandawithoutposting 1 1311692138 0 mod/forum:viewhiddentimedposts 1 1311692137 0 mod/forum:viewdiscussion 1 1311692137 0 mod/forum:viewanyrating 1 1311692137 0 mod/forum:startdiscussion 1 1311692137 0 mod/forum:splitdiscussions 1 1311692138 0 mod/forum:replypost 1 1311692137 0 mod/forum:replynews 1 1311692137 0 mod/forum:rate 1 1311692138 0 mod/forum:movediscussions 1 1311692138 0 mod/forum:managesubscriptions 1 1311692138 0 mod/forum:initialsubscriptions 1 1311692139 0 mod/forum:editanypost 1 1311692138 0 mod/forum:deleteownpost 1 1311692138 0 mod/forum:deleteanypost 1 1311692138 0 mod/forum:createattachment 1 1311692138 0 mod/forum:addnews 1 1311692137 0 mod/data:writeentry 1 1311692130 0 mod/data:viewrating 1 1311692131 0 mod/data:viewentry 1 1311692130 0 mod/data:viewalluserpresets 1 1311692131 0 mod/data:rate 1 1311692131 0 mod/data:managetemplates 1 1311692131 0 mod/data:manageentries 1 1311692131 0 mod/data:approve 1 1311692131 0 mod/choice:readresponses 1 1311692127 0 mod/choice:downloadresponses 1 1311692127 0 mod/choice:deleteresponses 1 1311692127 0 mod/choice:choose 1 1311692127 0 mod/assignment:view 1 1311692122 0 mod/assignment:grade 1 1311692122 0 mod/assess:viewreport 1 1311965861 2 mod/assess:manage 1 1311965861 2 gradereport/user:view 1 1311692221 0 gradereport/outcomes:view 1 1311692220 0 gradereport/grader:view 1 1311692220 0 gradeimport/xml:view 1 1311692217 0 gradeimport/csv:view 1 1311692216 0 gradeexport/xml:view 1 1311692213 0 gradeexport/xls:view 1 1311692213 0 gradeexport/txt:view 1 1311692212 0 gradeexport/ods:view 1 1311692212 0 coursereport/stats:view 1 1311692225 0 coursereport/participation:view 1 1311692225 0 coursereport/outline:view 1 1311692225 0 coursereport/log:viewtoday 1 1311692225 0 coursereport/log:viewlive 1 1311692225 0 coursereport/log:view 1 1311692224 0 block/rss_client:manageownfeeds 1 1311692204 0 block/rss_client:createsharedfeeds 1 1311692204 0 block/rss_client:createprivatefeeds 1 1311692204 0 block/online_users:viewlist 1 1311692203 0 block/homework:view -1 1312038862 2 block/email_list:sendmessage 1 1311965874 2 block/email_list:editsettings 1 1311965874 2 block/email_list:createfolder 1 1311965874 2 5 Student student moodle/user:viewdetails 1 1311692105 0 moodle/user:readuserposts 1 1311692108 0 moodle/user:readuserblogs 1 1311692109 0 moodle/legacy:student 1 1311692103 0 moodle/grade:view 1 1311692110 0 moodle/course:viewscales 1 1311692107 0 moodle/course:viewparticipants 1 1311692107 0 moodle/course:view 1 1311692106 0 moodle/blog:view 1 1311692108 0 moodle/block:view 1 1311692112 0 mod/workshop:participate 1 1311692191 0 mod/wiki:participate 1 1311692184 0 mod/scorm:viewscores 1 1311692176 0 mod/scorm:skipview 1 1311692176 0 mod/scorm:savetrack 1 1311692176 0 mod/quiz:view 1 1311692167 0 mod/quiz:reviewmyattempts 1 1311692167 0 mod/quiz:attempt 1 1311692167 0 mod/lams:participate 1 1311692150 0 mod/hotpot:attempt 1 1311692147 0 mod/glossary:write 1 1311692143 0 mod/glossary:comment 1 1311692143 0 mod/forum:viewrating 1 1311692137 0 mod/forum:viewdiscussion 1 1311692137 0 mod/forum:startdiscussion 1 1311692137 0 mod/forum:replypost 1 1311692137 0 mod/forum:initialsubscriptions 1 1311692139 0 mod/forum:deleteownpost 1 1311692138 0 mod/forum:createattachment 1 1311692138 0 mod/data:writeentry 1 1311692130 0 mod/data:viewentry 1 1311692130 0 mod/choice:choose 1 1311692127 0 mod/assignment:view 1 1311692122 0 mod/assignment:submit 1 1311692122 0 mod/assess:submit 1 1311965860 2 gradereport/user:view 1 1311692221 0 gradereport/overview:view 1 1311692220 0 block/online_users:viewlist 1 1311692203 0 block/homework:view 1 1312038862 2 block/email_list:sendmessage 1 1311965874 2 block/email_list:editsettings 1 1311965874 2 block/email_list:createfolder 1 1311965874 2
2 1 Category 1 Course Fullname 101 CF101 test weeks 1 5 Teacher Teachers Student Students 0 1311735600 10 83886080 0 0 0 0 USD 0 1 0 1311696225 1311702033 0 0 0 864000 1 0 0 0
7 participants 2 course-view l 0 1 Tjs= 8 activity_modules 2 course-view l 1 1 Tjs= 9 search_forums 2 course-view l 2 1 Tjs= 10 admin 2 course-view l 3 1 Tjs= 11 course_list 2 course-view l 4 1 Tjs= 12 news_items 2 course-view r 0 1 Tjs= 13 calendar_upcoming 2 course-view r 1 1 Tjs= 14 recent_activity 2 course-view r 2 1 Tjs= 18 email_list 2 course-view r 3 1 Tjs= 27 homework 2 course-view r 4 1 Tjs= 28 groups_list 2 course-view r 5 1 Tzo2OiJvYmplY3QiOjE6e3M6MjQ6ImJsb2NrX2dyb3Vwc19saXN0X2Zvb3RlciI7czoxMDM6IjxzdHJvbmc+PGZvbnQgY29sb3I9IiNmZjAwMDAiIGZhY2U9InZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhLHNhbnMtc2VyaWYiPlNvbWUgZHVtbXkgdGV4dDwvZm9udD48L3N0cm9uZz4iO30= 29 calendar_month 2 course-view r 6 1 Tjs=
1 0 $@NULL@$ 1
2 1 1 4 basiclti 2 1313173537 0 0 1 0 0 0
3 2 1
4 3 1
5 4 1
6 5 1
7 6 1
8 7 1
9 8 1
10 9 1
11 10 1
1 agroup a 0 0 1311696376 1312545299 2 bgroup b 0 0 1311696386 1312545319 3 cgroup c 0 0 1311696395 1311696404 5 egroup 0 0 1312547386 1312547508 6 fgroup 0 0 1312547420 1312547528 7 kgroup 0 0 1312547435 1312547546 8 ggroup g 0 0 1312838855 1312838870 1 $@NULL@$ ? 11 0 0 1 0 0 1313083852 1313083852 1 $@NULL@$ $@NULL@$ course $@NULL@$ 1 $@NULL@$ $@NULL@$ $@NULL@$ $@NULL@$ 1 100.00000 0.00000 $@NULL@$ $@NULL@$ 0.00000 1.00000 0.00000 0.00000 0 $@NULL@$ 0 0 0 0 1313083852 1313083852 2 Yeah2 dddd 1 1313173537 1 http://www.imsglobal.org/developers/BLTI/tool.php 1024 1 1 0 0 $@NULL@$ 0 100 4e457021202cb7.92784742 1313173537 $@NULL@$ lmsng.school.edu University of School (LMSng) 0 1 0 0
sheets/course_modules_mod_basiclti.xml000064400000002716152266437620014345 0ustar00 [#mod_instance#] basiclti [#mod_basiclti_name#] [#mod_basiclti_intro#] 1 [#mod_basiclti_timec#] [#mod_basiclti_timem#] 0 [#mod_basiclti_toolurl#] 0 0 0 0 0 $@NULL@$ 0 0 100 $@NULL@$ $@NULL@$ $@NULL@$ [#mod_basiclti_orgid#] [#mod_basiclti_orgurl#] [#mod_basiclti_orgdesc#] 0 0 0 0 sheets/course_modules_mod_forum.xml000064400000001323152266437620013674 0ustar00 [#mod_instance#] forum general [#mod_forum_title#] [#mod_forum_intro#] 0 0 0 0 1 1 1 0 0 [#date_now#] 0 0 0 sheets/course_question_categories_question_category_question_answer.xml000064400000000400152266437620023356 0ustar00 [#answer_id#] [#answer_text#] [#answer_score#] [#answer_feedback#] sheets/course_header.xml000064400000002752152266437620011414 0ustar00 1 1 Category 1 [#course_name#] [#course_short_name#] [#course_description#] topics 1 5 Teacher Teachers Student Students 0 [#date_now#] [#section_count#] 268435456 0 0 0 0 0 USD 0 1 0 [#date_now#] [#date_now#] 0 0 0 864000 1 0 0 0 sheets/course_question_categories_question_category_question_multiple_choice.xml000064400000001111152266437620025224 0ustar00 0 [#answer_string#] [#is_single#] 0 abc [#node_course_question_categories_question_category_question_answer#] sheets/base.xml000064400000002524152266437620007513 0ustar00 [#zip_filename#] 2007101540 1.9.4 (Build: 20090128) 2008030301 1.9.3 1244044665 [#www_root#] e9e0cd91fb39442e3baef853f645b2a3 internal
[#node_info_details_mod#] false none false false true false false false false instances
[#node_course_header#]
[#node_course_blocks_block#] [#node_course_sections_section#] [#node_course_question_categories#] [#node_course_modules#]
sheets/course_sections_section.xml000064400000000414152266437620013530 0ustar00
[#section_id#] [#section_number#] [#section_summary#] 1 [#node_course_sections_section_mods_mod#]
sheets/course_question_categories_question_category_question.xml000064400000001635152266437620022012 0ustar00 [#question_id#] 0 [#question_title#] [#question_text#] 1 [#question_general_feedback#] [#question_defaultgrade#] 0 [#question_type#] 1 [#question_stamp#] [#question_version#] 0 [#date_now#] [#date_now#] [#logged_user#] [#logged_user#] [#question_type_nodes#] sheets/course_question_categories_question_category_question_eesay.xml000064400000000201152266437620023164 0ustar00 [#node_course_question_categories_question_category_question_answer#] sheets/course_question_categories_question_category_question_shortanswer.xml000064400000000430152266437620024441 0ustar00 [#answers_string#] [#use_case#] [#node_course_question_categories_question_category_question_answer#] sheets/course_modules_mod_label.xml000064400000000333152266437620013623 0ustar00 [#mod_instance#] label [#mod_name#] [#mod_content#] [#date_now#] sheets/course_modules_mod_quiz_feedback.xml000064400000000322152266437620015336 0ustar00 1 1 0 11 sheets/course_question_categories.xml000064400000000161152266437620014230 0ustar00 [#node_course_question_categories_question_category#] sheets/course_modules_mod_resource.xml000064400000000637152266437620014402 0ustar00 [#mod_instance#] resource [#mod_name#] [#mod_type#] [#mod_reference#] [#mod_summary#] [#mod_alltext#] [#mod_options#] [#date_now#] sheets/course_question_categories_question_category_question_true_false.xml000064400000000451152266437620024216 0ustar00 [#true_answer_id#] [#false_answer_id#] [#node_course_question_categories_question_category_question_answer#] sheets/info_details_mod_instance.xml000064400000000307152266437620013761 0ustar00 [#mod_instance_id#] [#mod_name#] true false sheets/course_sections_section_mods_mod.xml000064400000001101152266437620015403 0ustar00 [#mod_id#] [#mod_type#] [#mod_instance_id#] [#date_now#] 0 [#mod_indent#] [#mod_visible#] 0 0 0 sheets/course_question_categories_question_category.xml000064400000000725152266437620020062 0ustar00 [#quiz_id#] Quiz Bank '[#quiz_name#]' Questions in quiz '[#quiz_name#]'. course [#quiz_stamp#] 0 999 [#node_course_question_categories_question_category_questions#] sheets/course_blocks_block.xml000064400000000634152266437620012610 0ustar00 [#block_id#] [#block_name#] 2 course-view [#block_position#] [#block_weight#] 1 Tjs= sheets/course_modules_mod_quiz.xml000064400000002617152266437620013543 0ustar00 [#mod_id#] quiz [#mod_name#] [#mod_intro#] 0 0 1 0 [#mod_max_attempts#] 0 1 0 0 30 0 0 [#question_string#] 4 10 [#date_now#] [#date_now#] [#mod_timelimit#] 0 0 0 [#node_question_instance#] [#node_questions_feedback#] sheets/course_modules_mod_quiz_question_instance.xml000064400000000246152266437620017352 0ustar00 [#instance_id#] [#question_id#] 1 entity.quiz.class.php000064400000125322152266437620010706 0ustar00. /** * @package moodlecore * @subpackage backup-imscc * @copyright 2009 Mauro Rondinelli (mauro.rondinelli [AT] uvcms.com) * @copyright 2011 Darko Miletic (dmiletic@moodlerooms.com) * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.'); class cc_quiz extends entities { public function generate_node_question_categories() { $instances = $this->generate_instances(); $node_course_question_categories = $this->create_node_course_question_categories($instances); $node_course_question_categories = empty($node_course_question_categories) ? '' : $node_course_question_categories; return $node_course_question_categories; } public function generate_node_course_modules_mod() { cc2moodle::log_action('Creating Quiz mods'); $node_course_modules_mod = ''; $instances = $this->generate_instances(); if (!empty($instances)) { foreach ($instances as $instance) { if ($instance['is_question_bank'] == 0) { $node_course_modules_mod .= $this->create_node_course_modules_mod($instance); } } } return $node_course_modules_mod; } private function create_node_course_modules_mod_quiz_feedback() { $sheet_question_mod_feedback = cc2moodle::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_QUIZ_FEEDBACK); return $sheet_question_mod_feedback; } private function generate_instances() { $last_instance_id = 0; $last_question_id = 0; $last_answer_id = 0; $instances = array(); $types = array(MOODLE_TYPE_QUIZ, MOODLE_TYPE_QUESTION_BANK); foreach ($types as $type) { if (!empty(cc2moodle::$instances['instances'][$type])) { foreach (cc2moodle::$instances['instances'][$type] as $instance) { if ($type == MOODLE_TYPE_QUIZ) { $is_question_bank = 0; } else { $is_question_bank = 1; } $assessment_file = $this->get_external_xml($instance['resource_indentifier']); if (!empty($assessment_file)) { $assessment = $this->load_xml_resource( cc2moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . $assessment_file ); if (!empty($assessment)) { $replace_values = array('unlimited' => 0); $questions = $this->get_questions( $assessment, $last_question_id, $last_answer_id, dirname($assessment_file), $is_question_bank ); $question_count = count($questions); if (!empty($question_count)) { $last_instance_id++; $instances[$instance['resource_indentifier']]['questions'] = $questions; $instances[$instance['resource_indentifier']]['id'] = $last_instance_id; $instances[$instance['resource_indentifier']]['title'] = $instance['title']; $instances[$instance['resource_indentifier']]['is_question_bank'] = $is_question_bank; $instances[$instance['resource_indentifier']]['options']['timelimit'] = $this->get_global_config($assessment, 'qmd_timelimit', 0); $instances[$instance['resource_indentifier']]['options']['max_attempts'] = $this->get_global_config($assessment, 'cc_maxattempts', 0, $replace_values); } } } } } } return $instances; } private function create_node_course_modules_mod($instance) { $sheet_question_mod = cc2moodle::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_QUIZ); $node_course_modules_quiz_question_instances = $this->create_node_course_modules_mod_quiz_question_instances($instance); $node_course_modules_quiz_feedback = $this->create_node_course_modules_mod_quiz_feedback($instance); $questions_strings = $this->get_questions_string($instance); $quiz_stamp = 'localhost+' . time() . '+' . $this->generate_random_string(6); $find_tags = array('[#mod_id#]', '[#mod_name#]', '[#mod_intro#]', '[#mod_stamp#]', '[#question_string#]', '[#date_now#]', '[#mod_max_attempts#]', '[#mod_timelimit#]', '[#node_question_instance#]', '[#node_questions_feedback#]'); $replace_values = array($instance['id'], self::safexml($instance['title']), self::safexml($instance['title']), self::safexml($quiz_stamp), self::safexml($questions_strings), time(), $instance['options']['max_attempts'], $instance['options']['timelimit'], $node_course_modules_quiz_question_instances, $node_course_modules_quiz_feedback); // This one has tags. $node_question_mod = str_replace($find_tags, $replace_values, $sheet_question_mod); return $node_question_mod; } private function get_global_config($assessment, $option, $default_value, $replace_values = '') { $xpath = cc2moodle::newx_path($assessment, cc2moodle::getquizns()); $metadata = $xpath->query('/xmlns:questestinterop/xmlns:assessment/xmlns:qtimetadata/xmlns:qtimetadatafield'); foreach ($metadata as $field) { $field_label = $xpath->query('xmlns:fieldlabel', $field); $field_label = !empty($field_label->item(0)->nodeValue) ? $field_label->item(0)->nodeValue : ''; if (strtolower($field_label) == strtolower($option)) { $field_entry = $xpath->query('xmlns:fieldentry', $field); $response = !empty($field_entry->item(0)->nodeValue) ? $field_entry->item(0)->nodeValue : ''; } } $response = !empty($response) ? trim($response) : ''; if (!empty($replace_values)) { foreach ($replace_values as $key => $value) { $response = ($key == $response) ? $value : $response; } } $response = empty($response) ? $default_value : $response; return $response; } private function create_node_course_modules_mod_quiz_question_instances($instance) { $node_course_module_mod_quiz_questions_instances = ''; $sheet_question_mod_instance = cc2moodle::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_QUIZ_QUESTION_INSTANCE); $find_tags = array('[#question_id#]' , '[#instance_id#]'); if (!empty($instance['questions'])) { foreach ($instance['questions'] as $question) { $replace_values = array($question['id'] , $question['id']); $node_course_module_mod_quiz_questions_instances .= str_replace( $find_tags, $replace_values, $sheet_question_mod_instance ); } $node_course_module_mod_quiz_questions_instances = str_replace( $find_tags, $replace_values, $node_course_module_mod_quiz_questions_instances ); } return $node_course_module_mod_quiz_questions_instances; } private function get_questions_string($instance) { $questions_string = ''; if (!empty($instance['questions'])) { foreach ($instance['questions'] as $question) { $questions_string .= $question['id'] . ','; } } $questions_string = !empty($questions_string) ? substr($questions_string, 0, strlen($questions_string) - 1) : ''; return $questions_string; } private function create_node_course_question_categories($instances) { $sheet_question_categories = cc2moodle::loadsheet(SHEET_COURSE_QUESTION_CATEGORIES); if (!empty($instances)) { $node_course_question_categories_question_category = ''; foreach ($instances as $instance) { $node_course_question_categories_question_category .= $this->create_node_course_question_categories_question_category($instance); } $find_tags = array('[#node_course_question_categories_question_category#]'); $replace_values = array($node_course_question_categories_question_category); $node_course_question_categories = str_replace($find_tags, $replace_values, $sheet_question_categories); } $node_course_question_categories = empty($node_course_question_categories) ? '' : $node_course_question_categories; return $node_course_question_categories; } private function create_node_course_question_categories_question_category($instance) { $sheet_question_categories_quetion_category = cc2moodle::loadsheet(SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY); $find_tags = array('[#quiz_id#]', '[#quiz_name#]', '[#quiz_stamp#]', '[#node_course_question_categories_question_category_questions#]'); $node_course_question_categories_questions = $this->create_node_course_question_categories_question_category_question($instance); $node_course_question_categories_questions = empty($node_course_question_categories_questions) ? '' : $node_course_question_categories_questions; $quiz_stamp = 'localhost+' . time() . '+' . $this->generate_random_string(6); $replace_values = array($instance['id'], self::safexml($instance['title']), $quiz_stamp, $node_course_question_categories_questions); $node_question_categories = str_replace($find_tags, $replace_values, $sheet_question_categories_quetion_category); return $node_question_categories; } private function create_node_course_question_categories_question_category_question($instance) { global $USER; $node_course_question_categories_question = ''; $find_tags = array('[#question_id#]', '[#question_title#]', '[#question_text#]', '[#question_type#]', '[#question_general_feedback#]', '[#question_defaultgrade#]', '[#date_now#]', '[#question_type_nodes#]', '[#question_stamp#]', '[#question_version#]', '[#logged_user#]'); $sheet_question_categories_question = cc2moodle::loadsheet(SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY_QUESTION); $questions = $instance['questions']; if (!empty($questions)) { foreach ($questions as $question) { $quiz_stamp = 'localhost+' . time() . '+' . $this->generate_random_string(6); $quiz_version = 'localhost+' . time() . '+' . $this->generate_random_string(6); $question_moodle_type = $question['moodle_type']; $question_cc_type = $question['cc_type']; $question_type_node = ''; $question_type_node = ($question_moodle_type == MOODLE_QUIZ_MULTIPLE_CHOICE) ? $this->create_node_course_question_categories_question_category_question_multiple_choice($question) : $question_type_node; $question_type_node = ($question_moodle_type == MOODLE_QUIZ_TRUE_FALSE) ? $this->create_node_course_question_categories_question_category_question_true_false($question) : $question_type_node; $question_type_node = ($question_moodle_type == MOODLE_QUIZ_ESSAY) ? $this->create_node_course_question_categories_question_category_question_eesay($question) : $question_type_node; $question_type_node = ($question_moodle_type == MOODLE_QUIZ_SHORTANSWER) ? $this->create_node_course_question_categories_question_category_question_shortanswer($question) : $question_type_node; $replace_values = array($question['id'], self::safexml($this->truncate_text($question['title'], 255, true)), self::safexml($question['title']), $question_moodle_type, self::safexml($question['feedback']), $question['defaultgrade'], //default grade time(), $question_type_node, $quiz_stamp, $quiz_version, $USER->id); $node_course_question_categories_question .= str_replace($find_tags, $replace_values, $sheet_question_categories_question); } } $node_course_question_categories_question = empty($node_course_question_categories_question) ? '' : $node_course_question_categories_question; return $node_course_question_categories_question; } private function get_questions($assessment, &$last_question_id, &$last_answer_id, $root_path, $is_question_bank) { $questions = array(); $xpath = cc2moodle::newx_path($assessment, cc2moodle::getquizns()); if (!$is_question_bank) { $questions_items = $xpath->query('/xmlns:questestinterop/xmlns:assessment/xmlns:section/xmlns:item'); } else { $questions_items = $xpath->query('/xmlns:questestinterop/xmlns:objectbank/xmlns:item'); } foreach ($questions_items as $question_item) { $count_questions = $xpath->evaluate('count(xmlns:presentation/xmlns:flow/xmlns:material/xmlns:mattext)', $question_item); if ($count_questions == 0) { $question_title = $xpath->query('xmlns:presentation/xmlns:material/xmlns:mattext', $question_item); } else { $question_title = $xpath->query('xmlns:presentation/xmlns:flow/xmlns:material/xmlns:mattext', $question_item); } $question_title = !empty($question_title->item(0)->nodeValue) ? $question_title->item(0)->nodeValue : ''; $question_identifier = $xpath->query('@ident', $question_item); $question_identifier = !empty($question_identifier->item(0)->nodeValue) ? $question_identifier->item(0)->nodeValue : ''; if (!empty($question_identifier)) { $question_type = $this->get_question_type($question_identifier, $assessment); if (!empty($question_type['moodle'])) { $last_question_id++; $questions[$question_identifier]['id'] = $last_question_id; $question_title = $this->update_sources($question_title, $root_path); $question_title = !empty($question_title) ? str_replace("%24", "\$", $this->include_titles($question_title)) : ''; $questions[$question_identifier]['title'] = $question_title; $questions[$question_identifier]['identifier'] = $question_identifier; $questions[$question_identifier]['moodle_type'] = $question_type['moodle']; $questions[$question_identifier]['cc_type'] = $question_type['cc']; $questions[$question_identifier]['feedback'] = $this->get_general_feedback($assessment, $question_identifier); $questions[$question_identifier]['defaultgrade'] = $this->get_defaultgrade($assessment, $question_identifier); $questions[$question_identifier]['answers'] = $this->get_answers($question_identifier, $assessment, $last_answer_id); } } } $questions = !empty($questions) ? $questions : ''; return $questions; } private function str_replace_once($search, $replace, $subject) { $first_char = strpos($subject, $search); if ($first_char !== false) { $before_str = substr($subject, 0, $first_char); $after_str = substr($subject, $first_char + strlen($search)); return $before_str . $replace . $after_str; } else { return $subject; } } private function get_defaultgrade($assessment, $question_identifier) { $result = 1; $xpath = cc2moodle::newx_path($assessment, cc2moodle::getquizns()); $query = '//xmlns:item[@ident="' . $question_identifier . '"]'; $query .= '//xmlns:qtimetadatafield[xmlns:fieldlabel="cc_weighting"]/xmlns:fieldentry'; $defgrade = $xpath->query($query); if (!empty($defgrade) && ($defgrade->length > 0)) { $resp = (int)$defgrade->item(0)->nodeValue; if ($resp >= 0 && $resp <= 99) { $result = $resp; } } return $result; } private function get_general_feedback($assessment, $question_identifier) { $xpath = cc2moodle::newx_path($assessment, cc2moodle::getquizns()); $respconditions = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:resprocessing/xmlns:respcondition'); if (!empty($respconditions)) { foreach ($respconditions as $respcondition) { $continue = $respcondition->getAttributeNode('continue'); $continue = !empty($continue->nodeValue) ? strtolower($continue->nodeValue) : ''; if ($continue == 'yes') { $display_feedback = $xpath->query('xmlns:displayfeedback', $respcondition); if (!empty($display_feedback)) { foreach ($display_feedback as $feedback) { $feedback_identifier = $feedback->getAttributeNode('linkrefid'); $feedback_identifier = !empty($feedback_identifier->nodeValue) ? $feedback_identifier->nodeValue : ''; if (!empty($feedback_identifier)) { $feedbacks_identifiers[] = $feedback_identifier; } } } } } } $feedback = ''; $feedbacks_identifiers = empty($feedbacks_identifiers) ? '' : $feedbacks_identifiers; if (!empty($feedbacks_identifiers)) { foreach ($feedbacks_identifiers as $feedback_identifier) { $feedbacks = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:itemfeedback[@ident="' . $feedback_identifier . '"]/xmlns:flow_mat/xmlns:material/xmlns:mattext'); $feedback .= !empty($feedbacks->item(0)->nodeValue) ? $feedbacks->item(0)->nodeValue . ' ' : ''; } } return $feedback; } private function get_feedback($assessment, $identifier, $item_identifier, $question_type) { $xpath = cc2moodle::newx_path($assessment, cc2moodle::getquizns()); $resource_processing = $xpath->query('//xmlns:item[@ident="' . $item_identifier . '"]/xmlns:resprocessing/xmlns:respcondition'); if (!empty($resource_processing)) { foreach ($resource_processing as $response) { $varequal = $xpath->query('xmlns:conditionvar/xmlns:varequal', $response); $varequal = !empty($varequal->item(0)->nodeValue) ? $varequal->item(0)->nodeValue : ''; if (strtolower($varequal) == strtolower($identifier) || ($question_type == CC_QUIZ_ESSAY)) { $display_feedback = $xpath->query('xmlns:displayfeedback', $response); if (!empty($display_feedback)) { foreach ($display_feedback as $feedback) { $feedback_identifier = $feedback->getAttributeNode('linkrefid'); $feedback_identifier = !empty($feedback_identifier->nodeValue) ? $feedback_identifier->nodeValue : ''; if (!empty($feedback_identifier)) { $feedbacks_identifiers[] = $feedback_identifier; } } } } } } $feedback = ''; $feedbacks_identifiers = empty($feedbacks_identifiers) ? '' : $feedbacks_identifiers; if (!empty($feedbacks_identifiers)) { foreach ($feedbacks_identifiers as $feedback_identifier) { $feedbacks = $xpath->query('//xmlns:item[@ident="' . $item_identifier . '"]/xmlns:itemfeedback[@ident="' . $feedback_identifier . '"]/xmlns:flow_mat/xmlns:material/xmlns:mattext'); $feedback .= !empty($feedbacks->item(0)->nodeValue) ? $feedbacks->item(0)->nodeValue . ' ' : ''; } } return $feedback; } private function get_answers_fib($question_identifier, $identifier, $assessment, &$last_answer_id) { $xpath = cc2moodle::newx_path($assessment, cc2moodle::getquizns()); $answers_fib = array(); $response_items = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:resprocessing/xmlns:respcondition'); foreach ($response_items as $response_item) { $setvar = $xpath->query('xmlns:setvar', $response_item); $setvar = is_object($setvar->item(0)) ? $setvar->item(0)->nodeValue : ''; if ($setvar != '') { $last_answer_id++; $answer_title = $xpath->query('xmlns:conditionvar/xmlns:varequal[@respident="' . $identifier . '"]', $response_item); $answer_title = !empty($answer_title->item(0)->nodeValue) ? $answer_title->item(0)->nodeValue : ''; $case = $xpath->query('xmlns:conditionvar/xmlns:varequal/@case', $response_item); $case = is_object($case->item(0)) ? $case->item(0)->nodeValue : 'no' ; $case = strtolower($case) == 'yes' ? 1 : 0; $display_feedback = $xpath->query('xmlns:displayfeedback', $response_item); unset($feedbacks_identifiers); if (!empty($display_feedback)) { foreach ($display_feedback as $feedback) { $feedback_identifier = $feedback->getAttributeNode('linkrefid'); $feedback_identifier = !empty($feedback_identifier->nodeValue) ? $feedback_identifier->nodeValue : ''; if (!empty($feedback_identifier)) { $feedbacks_identifiers[] = $feedback_identifier; } } } $feedback = ''; $feedbacks_identifiers = empty($feedbacks_identifiers) ? '' : $feedbacks_identifiers; if (!empty($feedbacks_identifiers)) { foreach ($feedbacks_identifiers as $feedback_identifier) { $feedbacks = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:itemfeedback[@ident="' . $feedback_identifier . '"]/xmlns:flow_mat/xmlns:material/xmlns:mattext'); $feedback .= !empty($feedbacks->item(0)->nodeValue) ? $feedbacks->item(0)->nodeValue . ' ' : ''; } } $answers_fib[] = array('id' => $last_answer_id, 'title' => $answer_title, 'score' => $setvar, 'feedback' => $feedback, 'case' => $case); } } $answers_fib = empty($answers_fib) ? '' : $answers_fib; return $answers_fib; } private function get_answers_pattern_match($question_identifier, $identifier, $assessment, &$last_answer_id) { $xpath = cc2moodle::newx_path($assessment, cc2moodle::getquizns()); $answers_fib = array(); $response_items = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:resprocessing/xmlns:respcondition'); foreach ($response_items as $response_item) { $setvar = $xpath->query('xmlns:setvar', $response_item); $setvar = is_object($setvar->item(0)) ? $setvar->item(0)->nodeValue : ''; if ($setvar != '') { $last_answer_id++; $answer_title = $xpath->query('xmlns:conditionvar/xmlns:varequal[@respident="' . $identifier . '"]', $response_item); $answer_title = !empty($answer_title->item(0)->nodeValue) ? $answer_title->item(0)->nodeValue : ''; if (empty($answer_title)) { $answer_title = $xpath->query('xmlns:conditionvar/xmlns:varsubstring[@respident="' . $identifier . '"]', $response_item); $answer_title = !empty($answer_title->item(0)->nodeValue) ? '*' . $answer_title->item(0)->nodeValue . '*' : ''; } if (empty($answer_title)) { $answer_title = '*'; } $case = $xpath->query('xmlns:conditionvar/xmlns:varequal/@case', $response_item); $case = is_object($case->item(0)) ? $case->item(0)->nodeValue : 'no' ; $case = strtolower($case) == 'yes' ? 1 : 0; $display_feedback = $xpath->query('xmlns:displayfeedback', $response_item); unset($feedbacks_identifiers); if (!empty($display_feedback)) { foreach ($display_feedback as $feedback) { $feedback_identifier = $feedback->getAttributeNode('linkrefid'); $feedback_identifier = !empty($feedback_identifier->nodeValue) ? $feedback_identifier->nodeValue : ''; if (!empty($feedback_identifier)) { $feedbacks_identifiers[] = $feedback_identifier; } } } $feedback = ''; $feedbacks_identifiers = empty($feedbacks_identifiers) ? '' : $feedbacks_identifiers; if (!empty($feedbacks_identifiers)) { foreach ($feedbacks_identifiers as $feedback_identifier) { $feedbacks = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:itemfeedback[@ident="' . $feedback_identifier . '"]/xmlns:flow_mat/xmlns:material/xmlns:mattext'); $feedback .= !empty($feedbacks->item(0)->nodeValue) ? $feedbacks->item(0)->nodeValue . ' ' : ''; } } $answers_fib[] = array('id' => $last_answer_id, 'title' => $answer_title, 'score' => $setvar, 'feedback' => $feedback, 'case' => $case); } } $answers_fib = empty($answers_fib) ? '' : $answers_fib; return $answers_fib; } private function get_answers($identifier, $assessment, &$last_answer_id) { $xpath = cc2moodle::newx_path($assessment, cc2moodle::getquizns()); $answers = array(); $question_cc_type = $this->get_question_type($identifier, $assessment); $question_cc_type = $question_cc_type['cc']; $is_multiresponse = ($question_cc_type == CC_QUIZ_MULTIPLE_RESPONSE); if ($question_cc_type == CC_QUIZ_MULTIPLE_CHOICE || $is_multiresponse || $question_cc_type == CC_QUIZ_TRUE_FALSE) { $query_answers = '//xmlns:item[@ident="' . $identifier . '"]/xmlns:presentation/xmlns:response_lid/xmlns:render_choice/xmlns:response_label'; $query_answers_with_flow = '//xmlns:item[@ident="' . $identifier . '"]/xmlns:presentation/xmlns:flow/xmlns:response_lid/xmlns:render_choice/xmlns:response_label'; $query_indentifer = '@ident'; $query_title = 'xmlns:material/xmlns:mattext'; } if ($question_cc_type == CC_QUIZ_ESSAY) { $query_answers = '//xmlns:item[@ident="' . $identifier . '"]/xmlns:presentation/xmlns:response_str'; $query_answers_with_flow = '//xmlns:item[@ident="' . $identifier . '"]/xmlns:presentation/xmlns:flow/xmlns:response_str'; $query_indentifer = '@ident'; $query_title = 'xmlns:render_fib'; } if ($question_cc_type == CC_QUIZ_FIB || $question_cc_type == CC_QUIZ_PATTERN_MACHT) { $xpath_query = '//xmlns:item[@ident="' . $identifier . '"]/xmlns:presentation/xmlns:response_str/@ident'; $xpath_query_with_flow = '//xmlns:item[@ident="' . $identifier . '"]/xmlns:presentation/xmlns:flow/xmlns:response_str/@ident'; $count_response = $xpath->evaluate('count(' . $xpath_query_with_flow . ')'); if ($count_response == 0) { $answer_identifier = $xpath->query($xpath_query); } else { $answer_identifier = $xpath->query($xpath_query_with_flow); } $answer_identifier = !empty($answer_identifier->item(0)->nodeValue) ? $answer_identifier->item(0)->nodeValue : ''; if ($question_cc_type == CC_QUIZ_FIB) { $answers = $this->get_answers_fib ($identifier, $answer_identifier, $assessment, $last_answer_id); } else { $answers = $this->get_answers_pattern_match ($identifier, $answer_identifier, $assessment, $last_answer_id); } } else { $count_response = $xpath->evaluate('count(' . $query_answers_with_flow . ')'); if ($count_response == 0) { $response_items = $xpath->query($query_answers); } else { $response_items = $xpath->query($query_answers_with_flow); } if (!empty($response_items)) { if ($is_multiresponse) { $correct_answer_score = 0; //get the correct answers count $canswers_query = "//xmlns:item[@ident='{$identifier}']//xmlns:setvar[@varname='SCORE'][.=100]/../xmlns:conditionvar//xmlns:varequal[@case='Yes'][not(parent::xmlns:not)]"; $canswers = $xpath->query($canswers_query); if ($canswers->length > 0) { $correct_answer_score = round(1.0 / (float)$canswers->length, 7); //weird $correct_answers_ident = array(); foreach ($canswers as $cnode) { $correct_answers_ident[$cnode->nodeValue] = true; } } } foreach ($response_items as $response_item) { $last_answer_id++; $answer_identifier = $xpath->query($query_indentifer, $response_item); $answer_identifier = !empty($answer_identifier->item(0)->nodeValue) ? $answer_identifier->item(0)->nodeValue : ''; $answer_title = $xpath->query($query_title, $response_item); $answer_title = !empty($answer_title->item(0)->nodeValue) ? $answer_title->item(0)->nodeValue : ''; $answer_feedback = $this->get_feedback($assessment, $answer_identifier, $identifier, $question_cc_type); $answer_score = $this->get_score($assessment, $answer_identifier, $identifier); if ($is_multiresponse && isset($correct_answers_ident[$answer_identifier])) { $answer_score = $correct_answer_score; } $answers[] = array('id' => $last_answer_id, 'title' => $answer_title, 'score' => $answer_score, 'identifier' => $answer_identifier, 'feedback' => $answer_feedback); } } } $answers = empty($answers) ? '' : $answers; return $answers; } private function get_score($assessment, $identifier, $question_identifier) { $xpath = cc2moodle::newx_path($assessment, cc2moodle::getquizns()); $resource_processing = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:resprocessing/xmlns:respcondition'); if (!empty($resource_processing)) { foreach ($resource_processing as $response) { $question_cc_type = $this->get_question_type($question_identifier, $assessment); $question_cc_type = $question_cc_type['cc']; $varequal = $xpath->query('xmlns:conditionvar/xmlns:varequal', $response); $varequal = !empty($varequal->item(0)->nodeValue) ? $varequal->item(0)->nodeValue : ''; if (strtolower($varequal) == strtolower($identifier)) { $score = $xpath->query('xmlns:setvar', $response); $score = !empty($score->item(0)->nodeValue) ? $score->item(0)->nodeValue : ''; } } } $score = empty($score) ? 0 : sprintf("%.7F", $score); return $score; } private function create_node_course_question_categories_question_category_question_multiple_choice($question) { $node_course_question_categories_question_answer = ''; $sheet_question_categories_question = cc2moodle::loadsheet(SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY_QUESTION_MULTIPLE_CHOICE); if (!empty($question['answers'])) { foreach ($question['answers'] as $answer) { $node_course_question_categories_question_answer .= $this->create_node_course_question_categories_question_category_question_answer($answer); } } $answer_string = $this->get_answers_string($question['answers']); $is_single = ($question['cc_type'] == CC_QUIZ_MULTIPLE_CHOICE) ? 1 : 0; $find_tags = array('[#node_course_question_categories_question_category_question_answer#]', '[#answer_string#]', '[#is_single#]'); $replace_values = array($node_course_question_categories_question_answer, self::safexml($answer_string), $is_single); $node_question_categories_question = str_replace($find_tags, $replace_values, $sheet_question_categories_question); return $node_question_categories_question; } private function create_node_course_question_categories_question_category_question_eesay($question) { $node_course_question_categories_question_answer = ''; $sheet_question_categories_question = cc2moodle::loadsheet(SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY_QUESTION_EESAY); if (!empty($question['answers'])) { foreach ($question['answers'] as $answer) { $node_course_question_categories_question_answer .= $this->create_node_course_question_categories_question_category_question_answer($answer); } } $find_tags = array('[#node_course_question_categories_question_category_question_answer#]'); $replace_values = array($node_course_question_categories_question_answer); $node_question_categories_question = str_replace($find_tags, $replace_values, $sheet_question_categories_question); return $node_question_categories_question; } private function create_node_course_question_categories_question_category_question_shortanswer($question) { //, &$fib_questions) { $sheet_question_categories_question = cc2moodle::loadsheet(SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY_QUESTION_SHORTANSWER); $node_course_question_categories_question_answer = ''; if (!empty($question['answers'])) { foreach ($question['answers'] as $answer) { $node_course_question_categories_question_answer .= $this->create_node_course_question_categories_question_category_question_answer($answer); } } $answers_string = $this->get_answers_string($question['answers']); $use_case = 0; foreach ($question['answers'] as $answer) { if ($answer['case'] == 1) { $use_case = 1; } } $find_tags = array('[#answers_string#]', '[#use_case#]', '[#node_course_question_categories_question_category_question_answer#]'); $replace_values = array(self::safexml($answers_string), self::safexml($use_case), $node_course_question_categories_question_answer); $node_question_categories_question = str_replace($find_tags, $replace_values, $sheet_question_categories_question); return $node_question_categories_question; } private function create_node_course_question_categories_question_category_question_true_false($question) { $node_course_question_categories_question_answer = ''; $sheet_question_categories_question = cc2moodle::loadsheet(SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY_QUESTION_TRUE_FALSE); $trueanswer = null; $falseanswer = null; if (!empty($question['answers'])) { // Identify the true and false answers. foreach ($question['answers'] as $answer) { if ($answer['identifier'] == 'true') { $trueanswer = $answer; } else if ($answer['identifier'] == 'false') { $falseanswer = $answer; } else { // Should not happen, but just in case. throw new coding_exception("Unknown answer identifier detected" . " in true/false quiz question with id {$question['id']}."); } $node_course_question_categories_question_answer .= $this->create_node_course_question_categories_question_category_question_answer($answer); } // Make sure the true and false answer was found. if (is_null($trueanswer) || is_null($falseanswer)) { throw new coding_exception("Unable to correctly identify the " . "true and false answers in the question with id {$question['id']}."); } } $find_tags = array('[#node_course_question_categories_question_category_question_answer#]', '[#true_answer_id#]', '[#false_answer_id#]'); $replace_values = array($node_course_question_categories_question_answer, $trueanswer['id'], $falseanswer['id']); $node_question_categories_question = str_replace($find_tags, $replace_values, $sheet_question_categories_question); return $node_question_categories_question; } private function get_answers_string($answers) { $answer_string = ''; if (!empty($answers)) { foreach ($answers as $answer) { $answer_string .= $answer['id'] . ','; } } $answer_string = !empty($answer_string) ? substr($answer_string, 0, strlen($answer_string) - 1) : ''; return $answer_string; } private function create_node_course_question_categories_question_category_question_answer($answer) { $sheet_question_categories_question_answer = cc2moodle::loadsheet(SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY_QUESTION_ANSWER); $find_tags = array('[#answer_id#]', '[#answer_text#]', '[#answer_score#]', '[#answer_feedback#]'); $replace_values = array($answer['id'], self::safexml($answer['title']), $answer['score'], self::safexml($answer['feedback'])); $node_question_categories_question_answer = str_replace($find_tags, $replace_values, $sheet_question_categories_question_answer); return $node_question_categories_question_answer; } private function get_question_type($identifier, $assessment) { $xpath = cc2moodle::newx_path($assessment, cc2moodle::getquizns()); $metadata = $xpath->query('//xmlns:item[@ident="' . $identifier . '"]/xmlns:itemmetadata/xmlns:qtimetadata/xmlns:qtimetadatafield'); foreach ($metadata as $field) { $field_label = $xpath->query('xmlns:fieldlabel', $field); $field_label = !empty($field_label->item(0)->nodeValue) ? $field_label->item(0)->nodeValue : ''; if ($field_label == 'cc_profile') { $field_entry = $xpath->query('xmlns:fieldentry', $field); $type = !empty($field_entry->item(0)->nodeValue) ? $field_entry->item(0)->nodeValue : ''; } } $return_type = array(); $return_type['moodle'] = ''; $return_type['cc'] = $type; if ($type == CC_QUIZ_MULTIPLE_CHOICE) { $return_type['moodle'] = MOODLE_QUIZ_MULTIPLE_CHOICE; } if ($type == CC_QUIZ_MULTIPLE_RESPONSE) { $return_type['moodle'] = MOODLE_QUIZ_MULTIPLE_CHOICE; } if ($type == CC_QUIZ_TRUE_FALSE) { $return_type['moodle'] = MOODLE_QUIZ_TRUE_FALSE; } if ($type == CC_QUIZ_ESSAY) { $return_type['moodle'] = MOODLE_QUIZ_ESSAY; } if ($type == CC_QUIZ_FIB) { $return_type['moodle'] = MOODLE_QUIZ_SHORTANSWER; } if ($type == CC_QUIZ_PATTERN_MACHT) { $return_type['moodle'] = MOODLE_QUIZ_SHORTANSWER; } return $return_type; } } cc_includes.php000064400000004557152266437620007560 0ustar00. /** * Main include for IMS Common Cartridge export classes * * @package backup-convert * @copyright 2011 Darko Miletic * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ require_once($CFG->dirroot .'/backup/cc/cc_lib/xmlbase.php'); require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_resources.php'); require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_builder_creator.php'); require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_manifest.php'); require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_metadata.php'); require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_metadata_resource.php'); require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_metadata_file.php'); require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_version11.php'); require_once($CFG->dirroot .'/backup/cc/cc_lib/gral_lib/pathutils.php'); require_once($CFG->dirroot .'/backup/cc/cc_lib/gral_lib/functions.php'); require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_organization.php'); require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_converter_basiclti.php'); require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_converter_lti.php'); require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_converter_forum.php'); require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_converter_url.php'); require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_converter_resource.php'); require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_converter_quiz.php'); require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_converter_page.php'); require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_converter_label.php'); require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_converter_folder.php'); require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_convert_moodle2.php'); entity11.basiclti.class.php000064400000011560152266437620011650 0ustar00. /** * @package moodlecore * @subpackage backup-imscc * @copyright 2011 Darko Miletic (dmiletic@moodlerooms.com) * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.'); class cc11_basiclti extends entities11 { public function generate_node() { cc2moodle::log_action('Creating BasicLTI mods'); $response = ''; if (!empty(cc2moodle::$instances['instances'][MOODLE_TYPE_BASICLTI])) { foreach (cc2moodle::$instances['instances'][MOODLE_TYPE_BASICLTI] as $instance) { $response .= $this->create_node_course_modules_mod_basiclti($instance); } } return $response; } private function create_node_course_modules_mod_basiclti($instance) { $sheet_mod_basiclti = cc112moodle::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_BASICLTI); $topic_data = $this->get_basiclti_data($instance); $result = ''; if (!empty($topic_data)) { $find_tags = array('[#mod_instance#]' , '[#mod_basiclti_name#]' , '[#mod_basiclti_intro#]' , '[#mod_basiclti_timec#]' , '[#mod_basiclti_timem#]' , '[#mod_basiclti_toolurl#]', '[#mod_basiclti_orgid#]' , '[#mod_basiclti_orgurl#]' , '[#mod_basiclti_orgdesc#]' ); $replace_values = array($instance['instance'], $topic_data['title'], $topic_data['description'], time(),time(), $topic_data['launchurl'], $topic_data['orgid'], $topic_data['orgurl'], $topic_data['orgdesc'] ); $result = str_replace($find_tags, $replace_values, $sheet_mod_basiclti); } return $result; } protected function getValue($node, $default = '') { $result = $default; if (is_object($node) && ($node->length > 0) && !empty($node->item(0)->nodeValue)) { $result = htmlspecialchars(trim($node->item(0)->nodeValue), ENT_COMPAT, 'UTF-8', false); } return $result; } public function get_basiclti_data($instance) { $topic_data = array(); $basiclti_file = $this->get_external_xml($instance['resource_indentifier']); if (!empty($basiclti_file)) { $basiclti_file_path = cc2moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . $basiclti_file; $basiclti_file_dir = dirname($basiclti_file_path); $basiclti = $this->load_xml_resource($basiclti_file_path); if (!empty($basiclti)) { $xpath = cc2moodle::newx_path($basiclti, cc112moodle::$basicltins); $topic_title = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:title'),'Untitled'); $blti_description = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:description')); $launch_url = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:launch_url')); $tool_raw = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:vendor/lticp:code'),null); $tool_url = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:vendor/lticp:url'),null); $tool_desc = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:vendor/lticp:description'),null); $topic_data['title' ] = $topic_title; $topic_data['description'] = $blti_description; $topic_data['launchurl' ] = $launch_url; $topic_data['orgid' ] = $tool_raw; $topic_data['orgurl' ] = $tool_url; $topic_data['orgdesc' ] = $tool_desc; } } return $topic_data; } } schemas11/imslticm_v1p0.xsd000064400000031125152266437620011557 0ustar00 XSD Data File Information ------------------------- Author: Chuck Severance (IMS GLC) and Colin Smythe (IMS GLC) Date: 30th April, 2010 Version: 1.0 Status: Final Release Description: This is the description of the Common Messaging objects in LTI. This version was created for the BasicLTI Final release. History: V1.0 - First final release. License: IPR, License and Distribution Notices This machine readable file is derived from IMS Global Learning Consortium (GLC) specification IMS Basic Learning Tools Interoperability Version 1.0 found at http://www.imsglobal.org/lti and the original IMS GLC schema binding or code base http://www.imsglobal.org/lti. Recipients of this document are requested to submit, with their comments, notification of any relevant patent claims or other intellectual property rights of which they may be aware that might be infringed by the schema binding contained in this document. IMS GLC takes no position regarding the validity or scope of any intellectual property or other rights that might be claimed to pertain to the implementation or use of the technology described in this document or the extent to which any license under such rights might or might not be available; neither does it represent that it has made any effort to identify any such rights. Information on IMS GLCs procedures with respect to rights in IMS GLC specifications can be found at the IMS GLC Intellectual Property Rights web page: http://www.imsglobal.org/ipr/imsipr_policyFinal.pdf. Copyright (c) IMS Global Learning Consortium 1999-2010. All Rights Reserved. License Notice for Users Users of products or services that include this document are hereby granted a worldwide, royalty-free, non-exclusive license to use this document. Distribution Notice for Developers Developers of products or services that are not original incorporators of this document and have not changed this document, that is, are distributing a software product that incorporates this document as is from a third-party source other than IMS, are hereby granted permission to copy, display and distribute the contents of this document in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof. Developers of products or services that are original incorporators of this document and wish to provide distribution of this document as is or with modifications and developers of products and services that are not original incorporators of this document and have changed this document, are required to register with the IMS GLC community on the IMS GLC website as described in the following two paragraphs:- * If you wish to distribute this document as is, with no modifications, you are hereby granted permission to copy, display and distribute the contents of this document in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof, that you make and you complete a valid license registration with IMS and receive an email from IMS granting the license. To register, follow the instructions on the IMS website: http://www.imsglobal.org/specificationdownload.cfm. Once registered you are granted permission to transfer unlimited distribution rights of this document for the purposes of third-party or other distribution of your product or service that incorporates this document as long as this IPR, License and Distribution notice remains in place in its entirety; * If you wish to create and distribute a derived work from this document, you are hereby granted permission to copy, display and distribute the contents of the derived work in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof, that you make and you complete a valid profile registration with IMS GLC and receive an email from IMS GLC granting the license. To register, follow the instructions on the IMS GLC website: http://www.imsglobal.org/profile/. Once registered you are granted permission to transfer unlimited distribution rights of the derived work for the purposes of third-party or other distribution of your product or service that incorporates the derived work as long as this IPR, License and Distribution notice remains in place in its entirety. The limited permissions granted above are perpetual and will not be revoked by IMS GLC or its successors or assigns. THIS SPECIFICATION IS BEING OFFERED WITHOUT ANY WARRANTY WHATSOEVER, AND IN PARTICULAR, ANY WARRANTY OF NONINFRINGEMENT IS EXPRESSLY DISCLAIMED. ANY USE OF THIS SPECIFICATION SHALL BE MADE ENTIRELY AT THE IMPLEMENTERS OWN RISK, AND NEITHER THE CONSORTIUM NOR ANY OF ITS MEMBERS OR SUBMITTERS, SHALL HAVE ANY LIABILITY WHATSOEVER TO ANY IMPLEMENTER OR THIRD PARTY FOR ANY DAMAGES OF ANY NATURE WHATSOEVER, DIRECTLY OR INDIRECTLY, ARISING FROM THE USE OF THIS SPECIFICATION. Source UML File Information --------------------------- The source file information must be supplied as an XMI file (without diagram layout information). The supported UML authoring tools are: (a) Poseidon – v6 (and later) Source XSLT File Information ---------------------------- XSL Generator: UMLtoXSDTransformv0p9.xsl XSLT Processor: Xalan Release: 1.0 Beta 3 Date: 31st May, 2009 IMS GLC Auto-generation Binding Tool-kit (I-BAT) ------------------------------------------------ This file was auto-generated using the IMS GLC Binding Auto-generation Tool-kit (I-BAT). While every attempt has been made to ensure that this tool auto-generates the files correctly, users should be aware that this is an experimental tool. Permission is given to make use of this tool. IMS GLC makes no claim on the materials created by third party users of this tool. Details on how to use this tool are contained in the IMS GLC "I-BAT" Documentation available at the IMS GLC web-site. Tool Copyright: 2005-2010 (c) IMS Global Learning Consortium Inc. All Rights Reserved. The PropertySet complexType is the container for the set of properties. The Platform complexType is the container for the set of properties for the platform. The Property complexType is the container for each property. schemas11/ccv1p1_lomresource_v1p0.xsd000064400000041757152266437620013466 0ustar00 XSD Data File Information ------------------------- Author: Colin Smythe Date: 31st January, 2011 Version: 1.1 Status: Final Description: This is the IMS GLC Meta-data v1.3 binding of the IEEE LOMv1.0 for the Common Cartridge v1.1 Resource Metadata. This is based on the LOM strict binding. The core changes are: a) General complexType removed; b) LifeCycle complexType removed; c) Metametadata complexType removed; d) Technical complexType removed; e) Rights complexType removed; f) Annotation complexType removed; g) Classification complexType removed; h) The educational element is required at least once in the metadata instance; i) For Educational the context is required once and intendedEndUserRole at least once; j) All order is now imposed using sequence; k) All vocabs are constrained as required for the context and intendedEndUserRole elements. History: Version 1.0 - the first release of this profile for the CC Resource metadata; Version 1.1 - the 'mentor' enumeration value is added and the 'school' enumeration value are added License: IPR, License and Distribution Notices This machine readable file is derived from IMS Global Learning Consortium (GLC) specification IMS Common Cartridge Version 1.1 found at http://www.imsglobal.org/cc and the original IMS GLC schema binding or code base http://www.imsglobal.org/cc. Recipients of this document are requested to submit, with their comments, notification of any relevant patent claims or other intellectual property rights of which they may be aware that might be infringed by the schema binding contained in this document. IMS GLC takes no position regarding the validity or scope of any intellectual property or other rights that might be claimed to pertain to the implementation or use of the technology described in this document or the extent to which any license under such rights might or might not be available; neither does it represent that it has made any effort to identify any such rights. Information on IMS GLCs procedures with respect to rights in IMS GLC specifications can be found at the IMS GLC Intellectual Property Rights web page: http://www.imsglobal.org/ipr/imsipr_policyFinal.pdf. Copyright (c) IMS Global Learning Consortium 1999-2011. All Rights Reserved. License Notice for Users Users of products or services that include this document are hereby granted a worldwide, royalty-free, non-exclusive license to use this document. Distribution Notice for Developers Developers of products or services that are not original incorporators of this document and have not changed this document, that is, are distributing a software product that incorporates this document as is from a third-party source other than IMS, are hereby granted permission to copy, display and distribute the contents of this document in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof. Developers of products or services that are original incorporators of this document and wish to provide distribution of this document as is or with modifications and developers of products and services that are not original incorporators of this document and have changed this document, are required to register with the IMS GLC community on the IMS GLC website as described in the following two paragraphs:- * If you wish to distribute this document as is, with no modifications, you are hereby granted permission to copy, display and distribute the contents of this document in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof, that you make and you complete a valid license registration with IMS and receive an email from IMS granting the license. To register, follow the instructions on the IMS website: http://www.imsglobal.org/specificationdownload.cfm. Once registered you are granted permission to transfer unlimited distribution rights of this document for the purposes of third-party or other distribution of your product or service that incorporates this document as long as this IPR, License and Distribution notice remains in place in its entirety; * If you wish to create and distribute a derived work from this document, you are hereby granted permission to copy, display and distribute the contents of the derived work in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof, that you make and you complete a valid profile registration with IMS GLC and receive an email from IMS GLC granting the license. To register, follow the instructions on the IMS GLC website: http://www.imsglobal.org/profile/. Once registered you are granted permission to transfer unlimited distribution rights of the derived work for the purposes of third-party or other distribution of your product or service that incorporates the derived work as long as this IPR, License and Distribution notice remains in place in its entirety. The limited permissions granted above are perpetual and will not be revoked by IMS GLC or its successors or assigns. THIS SPECIFICATION IS BEING OFFERED WITHOUT ANY WARRANTY WHATSOEVER, AND IN PARTICULAR, ANY WARRANTY OF NONINFRINGEMENT IS EXPRESSLY DISCLAIMED. ANY USE OF THIS SPECIFICATION SHALL BE MADE ENTIRELY AT THE IMPLEMENTERS OWN RISK, AND NEITHER THE CONSORTIUM NOR ANY OF ITS MEMBERS OR SUBMITTERS, SHALL HAVE ANY LIABILITY WHATSOEVER TO ANY IMPLEMENTER OR THIRD PARTY FOR ANY DAMAGES OF ANY NATURE WHATSOEVER, DIRECTLY OR INDIRECTLY, ARISING FROM THE USE OF THIS SPECIFICATION. Source UML File Information --------------------------- The source file information must be supplied as an XMI file (without diagram layout information). The supported UML authoring tools are: (a) Poseidon – v6 (and later) Source XSLT File Information ---------------------------- XSL Generator: UMLtoXSDTransformv0p9.xsl XSLT Processor: Xalan Release: 1.0 Beta 3 Date: 31st May, 2009 IMS GLC Auto-generation Binding Tool-kit (I-BAT) ------------------------------------------------ This file was auto-generated using the IMS GLC Binding Auto-generation Tool-kit (I-BAT). While every attempt has been made to ensure that this tool auto-generates the files correctly, users should be aware that this is an experimental tool. Permission is given to make use of this tool. IMS GLC makes no claim on the materials created by third party users of this tool. Details on how to use this tool are contained in the IMS GLC "I-BAT" Documentation available at the IMS GLC web-site. Tool Copyright: 2005-2011 (c) IMS Global Learning Consortium Inc. All Rights Reserved. The Context complexType is the container for the information about the principal environment within which the learning and use of this learning object is intended to take place. Suggested good practice is to use one of the values of the value space and to use an additional instance of this data element for further refinement. The Educational complexType is the container for the information that describes the key educational or pedagogic characteristics of this learning object. This is pedagogical informtion essential to those involved in achieving a quality learning experience. The audience for this metadata includes teachers, managers, authors and learners. CC Resource Profile: Only single context and intendedUserRole elements are permitted. The IntendedEndUserRole complexType is the container for the information about the principal user(s) for which this learning object was designed, most dominant first. For Strict LOM binding this has an enumerated vocabulary. The Classification element can be used to describe the role through the skills the user is intended to master, or the tasks he or she is intended to be able to accomplish. CC Resource Profile: Only the 'Instructor', 'Mentor' and 'Learner' vocab values are permitted. The LangString complexType is the container for a group of language specific characterstrings. The LOM complexType is the container for the metadata instance. CC Resource Profile - only a single Educational element is permitted. schemas11/ccv1p1_lommanifest_v1p0.xsd000064400000131654152266437620013441 0ustar00 XSD Data File Information ------------------------- Author: Colin Smythe Date: 31st January, 2011 Version: 1.1 Status: Final Description: This is the IMS GLC Meta-data v1.3 binding of the IEEE LOMv1.0 for the Common Cartridge v1.1 Manifest Metadata. This is based on the LOM Strict bindings. The core changes are: a) MetaMetadata complexType is removed; b) Annotation complexType is removed; c) In the Technical complexType only the format element is permitted; d) In the Educational complexType only the 'learningResourceType' element and 'intendedEndUserRole' are permitted; e) In the General complexType the 'structure' and 'aggregationLevel' elements are prohibited; f) Only the 'contribute' element in the 'LifeCycle' complexType are permitted; History: Version 1.1: The first usage of this XSD for the CC Manifest Profile. License: IPR, License and Distribution Notices This machine readable file is derived from IMS Global Learning Consortium (GLC) specification IMS Common Cartridge Version 1.1 found at http://www.imsglobal.org/cc and the original IMS GLC schema binding or code base http://www.imsglobal.org/cc. Recipients of this document are requested to submit, with their comments, notification of any relevant patent claims or other intellectual property rights of which they may be aware that might be infringed by the schema binding contained in this document. IMS GLC takes no position regarding the validity or scope of any intellectual property or other rights that might be claimed to pertain to the implementation or use of the technology described in this document or the extent to which any license under such rights might or might not be available; neither does it represent that it has made any effort to identify any such rights. Information on IMS GLCs procedures with respect to rights in IMS GLC specifications can be found at the IMS GLC Intellectual Property Rights web page: http://www.imsglobal.org/ipr/imsipr_policyFinal.pdf. Copyright (c) IMS Global Learning Consortium 1999-2011. All Rights Reserved. License Notice for Users Users of products or services that include this document are hereby granted a worldwide, royalty-free, non-exclusive license to use this document. Distribution Notice for Developers Developers of products or services that are not original incorporators of this document and have not changed this document, that is, are distributing a software product that incorporates this document as is from a third-party source other than IMS, are hereby granted permission to copy, display and distribute the contents of this document in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof. Developers of products or services that are original incorporators of this document and wish to provide distribution of this document as is or with modifications and developers of products and services that are not original incorporators of this document and have changed this document, are required to register with the IMS GLC community on the IMS GLC website as described in the following two paragraphs:- * If you wish to distribute this document as is, with no modifications, you are hereby granted permission to copy, display and distribute the contents of this document in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof, that you make and you complete a valid license registration with IMS and receive an email from IMS granting the license. To register, follow the instructions on the IMS website: http://www.imsglobal.org/specificationdownload.cfm. Once registered you are granted permission to transfer unlimited distribution rights of this document for the purposes of third-party or other distribution of your product or service that incorporates this document as long as this IPR, License and Distribution notice remains in place in its entirety; * If you wish to create and distribute a derived work from this document, you are hereby granted permission to copy, display and distribute the contents of the derived work in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof, that you make and you complete a valid profile registration with IMS GLC and receive an email from IMS GLC granting the license. To register, follow the instructions on the IMS GLC website: http://www.imsglobal.org/profile/. Once registered you are granted permission to transfer unlimited distribution rights of the derived work for the purposes of third-party or other distribution of your product or service that incorporates the derived work as long as this IPR, License and Distribution notice remains in place in its entirety. The limited permissions granted above are perpetual and will not be revoked by IMS GLC or its successors or assigns. THIS SPECIFICATION IS BEING OFFERED WITHOUT ANY WARRANTY WHATSOEVER, AND IN PARTICULAR, ANY WARRANTY OF NONINFRINGEMENT IS EXPRESSLY DISCLAIMED. ANY USE OF THIS SPECIFICATION SHALL BE MADE ENTIRELY AT THE IMPLEMENTERS OWN RISK, AND NEITHER THE CONSORTIUM NOR ANY OF ITS MEMBERS OR SUBMITTERS, SHALL HAVE ANY LIABILITY WHATSOEVER TO ANY IMPLEMENTER OR THIRD PARTY FOR ANY DAMAGES OF ANY NATURE WHATSOEVER, DIRECTLY OR INDIRECTLY, ARISING FROM THE USE OF THIS SPECIFICATION. Source UML File Information --------------------------- The source file information must be supplied as an XMI file (without diagram layout information). The supported UML authoring tools are: (a) Poseidon – v6 (and later) Source XSLT File Information ---------------------------- XSL Generator: UMLtoXSDTransformv0p9.xsl XSLT Processor: Xalan Release: 1.0 Beta 3 Date: 31st May, 2009 IMS GLC Auto-generation Binding Tool-kit (I-BAT) ------------------------------------------------ This file was auto-generated using the IMS GLC Binding Auto-generation Tool-kit (I-BAT). While every attempt has been made to ensure that this tool auto-generates the files correctly, users should be aware that this is an experimental tool. Permission is given to make use of this tool. IMS GLC makes no claim on the materials created by third party users of this tool. Details on how to use this tool are contained in the IMS GLC "I-BAT" Documentation available at the IMS GLC web-site. Tool Copyright: 2005-2011 (c) IMS Global Learning Consortium Inc. All Rights Reserved. Schematron Strict Selection Validation Rules -------------------------------------------- This is the set of Schematron rules that have been created to enforce the use of the "Unordered" stereotype. These rules ensure that the number of entries in an unordered complexType of an element obey the multiplicity constraints. This is required so that any-order/any-multiplicity complexTypes can be constructed and validated. Schematron validation rules for the enforcement of the Unordered stereotype. [RULESET] For the LOM.Type complexType. [RULE for Root Class Attribute 1] Invalid number of "general" elements: . [RULE for Root Class Attribute 2] Invalid number of "lifeCycle" elements: . [RULE for Root Class Attribute 3] Invalid number of "technical" elements: . [RULE for Root Class Attribute 5] Invalid number of "rights" elements: . [RULESET] For the Rights.Type complexType. [RULE for Local Attribute 1] Invalid number of "cost" elements: . [RULE for Local Attribute 2] Invalid number of "copyrightAndOtherRestrictions" elements: . [RULE for Local Attribute 3] Invalid number of "description" elements: . [RULESET] For the General.Type complexType. [RULE for Local Attribute 2] Invalid number of "title" elements: . [RULESET] For the ContributeLifeCycle.Type complexType. [RULE for Local Attribute 1] Invalid number of "role" elements: . [RULE for Local Attribute 3] Invalid number of "date" elements: . [RULESET] For the Relation.Type complexType. [RULE for Local Attribute 1] Invalid number of "kind" elements: . [RULE for Local Attribute 2] Invalid number of "resource" elements: . [RULESET] For the Resource.Type complexType. [RULESET] For the Classification.Type complexType. [RULE for Local Attribute 1] Invalid number of "purpose" elements: . [RULE for Local Attribute 3] Invalid number of "description" elements: . [RULESET] For the Taxon.Type complexType. [RULE for Local Attribute 1] Invalid number of "id" elements: . [RULE for Local Attribute 2] Invalid number of "entry" elements: . [RULESET] For the DateTime.Type complexType. [RULE for Local Attribute 1] Invalid number of "dateTime" elements: . [RULE for Local Attribute 2] Invalid number of "description" elements: . [RULESET] For the Identifier.Type complexType. [RULE for Local Attribute 1] Invalid number of "catalog" elements: . [RULE for Local Attribute 2] Invalid number of "entry" elements: . [RULE for Local Attribute 1] Invalid number of "catalog" elements: . [RULE for Local Attribute 2] Invalid number of "entry" elements: . The Classification complexType is the container for information which describes where this learning object falls within a particular classification system. To define multiple classifications, there may be multiple instances of this category. The Context complexType is the container for the information about the principal environment within which the learning and use of this learning object is intended to take place. Suggested good practice is to use one of the values of the value space and to use an additional instance of this data element for further refinement. The Contribute complexType is the container for the entities (i.e. people, organizations) that have contributed to the state of the learning object. The CopyrightAndOtherRestrictions complexType defines whether copyright or other restrictions apply to the use of this learning object. The Cost complexType is the container for whether use of this learning object requires payment. The DateTime abstract complexType is the container for the annotated date/time. An accuracy of at least one second is supported. The ISO 8601 format is used. An associated description is also provided. The Educational complexType is the container for the information that describes the key educational or pedagogic characteristics of this learning object. This is pedagogical informtion essential to those involved in achieving a quality learning experience. The audience for this metadata includes teachers, managers, authors and learners. CC MANIFEST PROFILE Only a single instance of the 'learningResourceType' and multple instances of the 'ntendedEnduserRole' are permitted. CC AMANIFEST PROFILE The 'structure' and aggregationLevel' elements are prohibited. The Identifier complexType is the container for the globally unique idenitifer that identifies the associated parent object. The IntendedEndUserRole complexType is the container for the information about the principal user(s) for which this learning object was designed, most dominant first. For Strict LOM binding this has an enumerated vocabulary. The Classification element can be used to describe the role through the skills the user is intended to master, or the tasks he or she is intended to be able to accomplish. CC Manifest Profile: Only the Iinstructor' 'Mentor' and 'Teacher' vocab values are permitted. The Kind complexType is the container for the nature of the relationship between this learning object and the target learning object, identified by information in the associated Resource complexType. In LOMv1.0 (Strict) this is an enumerated vocabulary. CC MANIFEST PROFILE Only the 'value' element is permitted. The LangString complexType is the container for a group of language specific characterstrings. The LearningResourceType complexType is the container for the information about the specific kind of learning object. The most dominant kind shall be first. The vocabulary terms are defined as in OED:1989 and as used by any educational communties of practice. CC MANIFEST PROFILE Only 'value' is permited and this is fixed as 'IMS Common Cartridge'. The LifeCycle complexType is the container for the history and current state of this learning object and those entities that have affected this learning object during its evolution. CC MANIFEST PROFILE Only the 'contribite' element is permitted. The LOM complexType is the container for the metadata instance. CC MANIFEST PROFILE The MetaMetadata and Annotation complexTypes are prohibited. The Purpose complexType is the container for the information on the purpose of classifying this learning obect. For the Strict LOM binding this is an enumerated vocabulary. The Relation complexType is the container for the information that defines the relationship between this learning object and other learning objects, if any. To define multiple relationships, there may be multiple instances of this category. If there is more than one target learning object the each object shall have a new relationship instance. The Resource complexType is the container for the information about the target learning object that this relationship references. The Rights complexType describes the intellectual property rights and conditions of use for this learning object. NOTE: The intent is to reuse results of ongoing work in the Intellectual Property Rights and e-commerce communities. This category currently provides the absolute minimum level of detail only. The Role complexType is the container for the kind of contribution. CC MANIFEST PROFILE Only the 'value' elemet is permitted. The Taxon complexType is the container for the information about a particular term within a taxonomy. A taxon is a node that has a defined label or term. A taxon may also have an alphanumeric designation or identifier for standardized reference. Either or both the label and the entry may be used to designate a particular taxon. An ordered list of taxons creates a taxonomic path i.e. 'taxononomic stairway': this is a path from a more general to more specific entry in a classification. The TaxonPath complexType is the container for the information about the taxonomic path in a specific classification system. Each succeeding level is a refinement in the definition of the preceding level. There may be different paths in the same or different classifications, which describe the same characteristic. The Technical complexType is the container for the information that describes the technical requirements and characteristics of this learning object. CC MANIFEST PROFILE Only the 'format' element is permitted. schemas11/imslticp_v1p0.xsd000064400000041141152266437620011561 0ustar00 XSD Data File Information ------------------------- Author: Chuck Severance (IMS GLC) and Colin Smythe (IMS GLC) Date: 30th April, 2010 Version: 1.0 Status: Final Release Description: This is the set of Common Profile objects used in LTI. This XSD was created as part of the BasicLTI Final Release. History: V1.0 - the first Final Release. License: IPR, License and Distribution Notices This machine readable file is derived from IMS Global Learning Consortium (GLC) specification IMS Basic Learning Tools Interoperability Version 1.0 found at http://www.imsglobal.org/lti and the original IMS GLC schema binding or code base http://www.imsglobal.org/lti. Recipients of this document are requested to submit, with their comments, notification of any relevant patent claims or other intellectual property rights of which they may be aware that might be infringed by the schema binding contained in this document. IMS GLC takes no position regarding the validity or scope of any intellectual property or other rights that might be claimed to pertain to the implementation or use of the technology described in this document or the extent to which any license under such rights might or might not be available; neither does it represent that it has made any effort to identify any such rights. Information on IMS GLCs procedures with respect to rights in IMS GLC specifications can be found at the IMS GLC Intellectual Property Rights web page: http://www.imsglobal.org/ipr/imsipr_policyFinal.pdf. Copyright (c) IMS Global Learning Consortium 1999-2010. All Rights Reserved. License Notice for Users Users of products or services that include this document are hereby granted a worldwide, royalty-free, non-exclusive license to use this document. Distribution Notice for Developers Developers of products or services that are not original incorporators of this document and have not changed this document, that is, are distributing a software product that incorporates this document as is from a third-party source other than IMS, are hereby granted permission to copy, display and distribute the contents of this document in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof. Developers of products or services that are original incorporators of this document and wish to provide distribution of this document as is or with modifications and developers of products and services that are not original incorporators of this document and have changed this document, are required to register with the IMS GLC community on the IMS GLC website as described in the following two paragraphs:- * If you wish to distribute this document as is, with no modifications, you are hereby granted permission to copy, display and distribute the contents of this document in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof, that you make and you complete a valid license registration with IMS and receive an email from IMS granting the license. To register, follow the instructions on the IMS website: http://www.imsglobal.org/specificationdownload.cfm. Once registered you are granted permission to transfer unlimited distribution rights of this document for the purposes of third-party or other distribution of your product or service that incorporates this document as long as this IPR, License and Distribution notice remains in place in its entirety; * If you wish to create and distribute a derived work from this document, you are hereby granted permission to copy, display and distribute the contents of the derived work in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof, that you make and you complete a valid profile registration with IMS GLC and receive an email from IMS GLC granting the license. To register, follow the instructions on the IMS GLC website: http://www.imsglobal.org/profile/. Once registered you are granted permission to transfer unlimited distribution rights of the derived work for the purposes of third-party or other distribution of your product or service that incorporates the derived work as long as this IPR, License and Distribution notice remains in place in its entirety. The limited permissions granted above are perpetual and will not be revoked by IMS GLC or its successors or assigns. THIS SPECIFICATION IS BEING OFFERED WITHOUT ANY WARRANTY WHATSOEVER, AND IN PARTICULAR, ANY WARRANTY OF NONINFRINGEMENT IS EXPRESSLY DISCLAIMED. ANY USE OF THIS SPECIFICATION SHALL BE MADE ENTIRELY AT THE IMPLEMENTERS OWN RISK, AND NEITHER THE CONSORTIUM NOR ANY OF ITS MEMBERS OR SUBMITTERS, SHALL HAVE ANY LIABILITY WHATSOEVER TO ANY IMPLEMENTER OR THIRD PARTY FOR ANY DAMAGES OF ANY NATURE WHATSOEVER, DIRECTLY OR INDIRECTLY, ARISING FROM THE USE OF THIS SPECIFICATION. Source UML File Information --------------------------- The source file information must be supplied as an XMI file (without diagram layout information). The supported UML authoring tools are: (a) Poseidon – v6 (and later) Source XSLT File Information ---------------------------- XSL Generator: UMLtoXSDTransformv0p9.xsl XSLT Processor: Xalan Release: 1.0 Beta 3 Date: 31st May, 2009 IMS GLC Auto-generation Binding Tool-kit (I-BAT) ------------------------------------------------ This file was auto-generated using the IMS GLC Binding Auto-generation Tool-kit (I-BAT). While every attempt has been made to ensure that this tool auto-generates the files correctly, users should be aware that this is an experimental tool. Permission is given to make use of this tool. IMS GLC makes no claim on the materials created by third party users of this tool. Details on how to use this tool are contained in the IMS GLC "I-BAT" Documentation available at the IMS GLC web-site. Tool Copyright: 2005-2010 (c) IMS Global Learning Consortium Inc. All Rights Reserved. Any namespaced element from any namespace may be included within an "any" element. The namespace for the imported element must be defined in the instance, and the schema must be imported. The extension has a definition of "strict" i.e. they must have their own namespace. The Vendor complexType is the container for the information about the vendor of the tool to be launched/used using BasicLTI. The Contact class is the container for the vendor contact information. The productInfo complexType is the container for the information about the tool itself. The ToolLocator complexType is the container for information about the electronic location of the tool. The Localized complexType is the container for localized string entries. The Icon complexType is the container for information about an icon to be used with the tool. schemas11/cc11libxml2validator.xsd000064400000002256152266437620013022 0ustar00 schemas11/xml.xsd000064400000013140152266437620007665 0ustar00 See http://www.w3.org/XML/1998/namespace.html and http://www.w3.org/TR/REC-xml for information about this namespace. This schema document describes the XML namespace, in a form suitable for import by other schema documents. Note that local names in this namespace are intended to be defined only by the World Wide Web Consortium or its subgroups. The following names are currently defined in this namespace and should not be used with conflicting semantics by any Working Group, specification, or document instance: base (as an attribute name): denotes an attribute whose value provides a URI to be used as the base for interpreting any relative URIs in the scope of the element on which it appears; its value is inherited. This name is reserved by virtue of its definition in the XML Base specification. id (as an attribute name): denotes an attribute whose value should be interpreted as if declared to be of type ID. This name is reserved by virtue of its definition in the xml:id specification. lang (as an attribute name): denotes an attribute whose value is a language code for the natural language of the content of any element; its value is inherited. This name is reserved by virtue of its definition in the XML specification. space (as an attribute name): denotes an attribute whose value is a keyword indicating what whitespace processing discipline is intended for the content of the element; its value is inherited. This name is reserved by virtue of its definition in the XML specification. Father (in any context at all): denotes Jon Bosak, the chair of the original XML Working Group. This name is reserved by the following decision of the W3C XML Plenary and XML Coordination groups: In appreciation for his vision, leadership and dedication the W3C XML Plenary on this 10th day of February, 2000 reserves for Jon Bosak in perpetuity the XML name xml:Father This schema defines attributes and an attribute group suitable for use by schemas wishing to allow xml:base, xml:lang, xml:space or xml:id attributes on elements they define. To enable this, such a schema must import this schema for the XML namespace, e.g. as follows: <schema . . .> . . . <import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/> Subsequently, qualified reference to any of the attributes or the group defined below will have the desired effect, e.g. <type . . .> . . . <attributeGroup ref="xml:specialAttrs"/> will define a type which will schema-validate an instance element with any of those attributes In keeping with the XML Schema WG's standard versioning policy, this schema document will persist at http://www.w3.org/2007/08/xml.xsd. At the date of issue it can also be found at http://www.w3.org/2001/xml.xsd. The schema document at that URI may however change in the future, in order to remain compatible with the latest version of XML Schema itself, or with the XML namespace itself. In other words, if the XML Schema or XML namespaces change, the version of this document at http://www.w3.org/2001/xml.xsd will change accordingly; the version at http://www.w3.org/2007/08/xml.xsd will not change. Attempting to install the relevant ISO 2- and 3-letter codes as the enumerated possible values is probably never going to be a realistic possibility. See RFC 3066 at http://www.ietf.org/rfc/rfc3066.txt and the IANA registry at http://www.iana.org/assignments/lang-tag-apps.htm for further information. The union allows for the 'un-declaration' of xml:lang with the empty string. See http://www.w3.org/TR/xmlbase/ for information about this attribute. See http://www.w3.org/TR/xml-id/ for information about this attribute. schemas11/imsbasiclti_v1p0p1.xsd000064400000031550152266437620012504 0ustar00 XSD Data File Information ------------------------- Author: Chuck Severance (IMS GLC) and Colin Smythe (IMS GLC) Date: 9th June, 2010 Version: 1.0.1 Status: Final Release Description: This is the description of the basicLTI link description. History: V1.0 - the first final release. V1.0.1 - the multiplicity for the extensions attribute has been changed from 0..1 to 0..*. License: IPR, License and Distribution Notices This machine readable file is derived from IMS Global Learning Consortium (GLC) specification IMS Basic Learning Tools Interoperability Version 1.0 found at http://www.imsglobal.org/lti and the original IMS GLC schema binding or code base http://www.imsglobal.org/lti. Recipients of this document are requested to submit, with their comments, notification of any relevant patent claims or other intellectual property rights of which they may be aware that might be infringed by the schema binding contained in this document. IMS GLC takes no position regarding the validity or scope of any intellectual property or other rights that might be claimed to pertain to the implementation or use of the technology described in this document or the extent to which any license under such rights might or might not be available; neither does it represent that it has made any effort to identify any such rights. Information on IMS GLCs procedures with respect to rights in IMS GLC specifications can be found at the IMS GLC Intellectual Property Rights web page: http://www.imsglobal.org/ipr/imsipr_policyFinal.pdf. Copyright (c) IMS Global Learning Consortium 1999-2010. All Rights Reserved. License Notice for Users Users of products or services that include this document are hereby granted a worldwide, royalty-free, non-exclusive license to use this document. Distribution Notice for Developers Developers of products or services that are not original incorporators of this document and have not changed this document, that is, are distributing a software product that incorporates this document as is from a third-party source other than IMS, are hereby granted permission to copy, display and distribute the contents of this document in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof. Developers of products or services that are original incorporators of this document and wish to provide distribution of this document as is or with modifications and developers of products and services that are not original incorporators of this document and have changed this document, are required to register with the IMS GLC community on the IMS GLC website as described in the following two paragraphs:- * If you wish to distribute this document as is, with no modifications, you are hereby granted permission to copy, display and distribute the contents of this document in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof, that you make and you complete a valid license registration with IMS and receive an email from IMS granting the license. To register, follow the instructions on the IMS website: http://www.imsglobal.org/specificationdownload.cfm. Once registered you are granted permission to transfer unlimited distribution rights of this document for the purposes of third-party or other distribution of your product or service that incorporates this document as long as this IPR, License and Distribution notice remains in place in its entirety; * If you wish to create and distribute a derived work from this document, you are hereby granted permission to copy, display and distribute the contents of the derived work in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof, that you make and you complete a valid profile registration with IMS GLC and receive an email from IMS GLC granting the license. To register, follow the instructions on the IMS GLC website: http://www.imsglobal.org/profile/. Once registered you are granted permission to transfer unlimited distribution rights of the derived work for the purposes of third-party or other distribution of your product or service that incorporates the derived work as long as this IPR, License and Distribution notice remains in place in its entirety. The limited permissions granted above are perpetual and will not be revoked by IMS GLC or its successors or assigns. THIS SPECIFICATION IS BEING OFFERED WITHOUT ANY WARRANTY WHATSOEVER, AND IN PARTICULAR, ANY WARRANTY OF NONINFRINGEMENT IS EXPRESSLY DISCLAIMED. ANY USE OF THIS SPECIFICATION SHALL BE MADE ENTIRELY AT THE IMPLEMENTERS OWN RISK, AND NEITHER THE CONSORTIUM NOR ANY OF ITS MEMBERS OR SUBMITTERS, SHALL HAVE ANY LIABILITY WHATSOEVER TO ANY IMPLEMENTER OR THIRD PARTY FOR ANY DAMAGES OF ANY NATURE WHATSOEVER, DIRECTLY OR INDIRECTLY, ARISING FROM THE USE OF THIS SPECIFICATION. Source UML File Information --------------------------- The source file information must be supplied as an XMI file (without diagram layout information). The supported UML authoring tools are: (a) Poseidon – v6 (and later) Source XSLT File Information ---------------------------- XSL Generator: UMLtoXSDTransformv0p9.xsl XSLT Processor: Xalan Release: 1.0 Beta 3 Date: 31st May, 2009 IMS GLC Auto-generation Binding Tool-kit (I-BAT) ------------------------------------------------ This file was auto-generated using the IMS GLC Binding Auto-generation Tool-kit (I-BAT). While every attempt has been made to ensure that this tool auto-generates the files correctly, users should be aware that this is an experimental tool. Permission is given to make use of this tool. IMS GLC makes no claim on the materials created by third party users of this tool. Details on how to use this tool are contained in the IMS GLC "I-BAT" Documentation available at the IMS GLC web-site. Tool Copyright: 2005-2010 (c) IMS Global Learning Consortium Inc. All Rights Reserved. The BasicLTILink class is the container for information required to use the BasicLTI mechanism. schemas11/ccv1p1_imscp_v1p2_v1p0.xsd000064400000174025152266437620013105 0ustar00 XSD Data File Information ------------------------- Author: Colin Smythe Date: 31st January, 2011 Version: 1.1 Status: Final Release Description: This model forms a part of the IMS GLC Common Catrtridge specification. This model is the profile of the IMS GLC Content Package Core specification (v1.2). The changes made to create the profile are: (a) The 'default' characteristic for the 'Organizations' class has been removed; (b) The 'isvisible' characteristic for the Item class has been removed; (c) The 'parameters' characteristic for the Item class has been removed; (d) The 'structure' characteristic for the Organization class has been fixed to 'rooted-hierarchy'; (e) The 'extension' and 'version' characteristics for the Manifest class have been removed; (f) The 'extension' attribute and 'extension' characteristic have been removed the Organizations class; (g) The 'extension' attribute and 'extension' characteristic have been removed the Organization class; (h) The 'extension' attribute and 'extension' characteristic have been removed from the Resources class; (i) The 'extension' attribute and the 'extension' characteristic have been removed from the Resource class; (j) The 'extension' attribute and 'extension' characteristic have been removed from the Item class; (k) The 'extension' attribute and the 'extension' characteristic have been removed from the File class; (l) The 'extension' attribute and 'extension' characteristic have been removed from the Dependency class; (m) The 'type' characteristic of the Resource class has a new enumerated list of 'PredfinedContentTypes'; (n) The 'title' attribute for the Item class has its multiplicity changed to '1' except for the top-level item attribute in the Orgaization class where it must not occur; (o) Manifests are NO longer allowed to contain sub-manifests; (p) The multiplicity of the Organization class in the Organizations class has been made '0..1'; (q) Only the metadata in the Manifest class is permitted to have the 'schema' and 'schemaversion' attributes; (r) The 'schema', 'schemaversion' and 'title' attributes are redefined directly as 'String' primitiveTypes; (s) The multiplicity of the 'item' attribute in the Organization class has been made '1'; (t) The value for the 'schema' attribute has been set as 'IMS Common Cartridge'; (u) The value for the 'schemaversion' attribute has been set to '1.1.0'; (v) The authorizations attribute has been added as an imported extension to the manifest; (w) The protect attribute has been added as an imported extension to the resource; (x) The IEEE LOM attribute has been added as an imported extension to the manifest metadata; (y) The 'intendeduse' attribute has been added to the ResourceType complexType. History: This profile is taken from the formal representation in UML of the IMS CP v1.2 core specification. This is the second version of the profile for the CCv1.1. The two changes are the addition of the ResourceMetadata class and the vocabulary for the permitted resource types. License: IPR, License and Distribution Notices This machine readable file is derived from IMS Global Learning Consortium (GLC) specification IMS Common Cartridge Version 1.1 found at http://www.imsglobal.org/cc and the original IMS GLC schema binding or code base http://www.imsglobal.org/cc. Recipients of this document are requested to submit, with their comments, notification of any relevant patent claims or other intellectual property rights of which they may be aware that might be infringed by the schema binding contained in this document. IMS GLC takes no position regarding the validity or scope of any intellectual property or other rights that might be claimed to pertain to the implementation or use of the technology described in this document or the extent to which any license under such rights might or might not be available; neither does it represent that it has made any effort to identify any such rights. Information on IMS GLCs procedures with respect to rights in IMS GLC specifications can be found at the IMS GLC Intellectual Property Rights web page: http://www.imsglobal.org/ipr/imsipr_policyFinal.pdf. Copyright (c) IMS Global Learning Consortium 1999-2011. All Rights Reserved. License Notice for Users Users of products or services that include this document are hereby granted a worldwide, royalty-free, non-exclusive license to use this document. Distribution Notice for Developers Developers of products or services that are not original incorporators of this document and have not changed this document, that is, are distributing a software product that incorporates this document as is from a third-party source other than IMS, are hereby granted permission to copy, display and distribute the contents of this document in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof. Developers of products or services that are original incorporators of this document and wish to provide distribution of this document as is or with modifications and developers of products and services that are not original incorporators of this document and have changed this document, are required to register with the IMS GLC community on the IMS GLC website as described in the following two paragraphs:- * If you wish to distribute this document as is, with no modifications, you are hereby granted permission to copy, display and distribute the contents of this document in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof, that you make and you complete a valid license registration with IMS and receive an email from IMS granting the license. To register, follow the instructions on the IMS website: http://www.imsglobal.org/specificationdownload.cfm. Once registered you are granted permission to transfer unlimited distribution rights of this document for the purposes of third-party or other distribution of your product or service that incorporates this document as long as this IPR, License and Distribution notice remains in place in its entirety; * If you wish to create and distribute a derived work from this document, you are hereby granted permission to copy, display and distribute the contents of the derived work in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof, that you make and you complete a valid profile registration with IMS GLC and receive an email from IMS GLC granting the license. To register, follow the instructions on the IMS GLC website: http://www.imsglobal.org/profile/. Once registered you are granted permission to transfer unlimited distribution rights of the derived work for the purposes of third-party or other distribution of your product or service that incorporates the derived work as long as this IPR, License and Distribution notice remains in place in its entirety. The limited permissions granted above are perpetual and will not be revoked by IMS GLC or its successors or assigns. THIS SPECIFICATION IS BEING OFFERED WITHOUT ANY WARRANTY WHATSOEVER, AND IN PARTICULAR, ANY WARRANTY OF NONINFRINGEMENT IS EXPRESSLY DISCLAIMED. ANY USE OF THIS SPECIFICATION SHALL BE MADE ENTIRELY AT THE IMPLEMENTERS OWN RISK, AND NEITHER THE CONSORTIUM NOR ANY OF ITS MEMBERS OR SUBMITTERS, SHALL HAVE ANY LIABILITY WHATSOEVER TO ANY IMPLEMENTER OR THIRD PARTY FOR ANY DAMAGES OF ANY NATURE WHATSOEVER, DIRECTLY OR INDIRECTLY, ARISING FROM THE USE OF THIS SPECIFICATION. Source UML File Information --------------------------- The source file information must be supplied as an XMI file (without diagram layout information). The supported UML authoring tools are: (a) Poseidon – v6 (and later) Source XSLT File Information ---------------------------- XSL Generator: UMLtoXSDTransformv0p9.xsl XSLT Processor: Xalan Release: 1.0 Beta 3 Date: 31st May, 2009 IMS GLC Auto-generation Binding Tool-kit (I-BAT) ------------------------------------------------ This file was auto-generated using the IMS GLC Binding Auto-generation Tool-kit (I-BAT). While every attempt has been made to ensure that this tool auto-generates the files correctly, users should be aware that this is an experimental tool. Permission is given to make use of this tool. IMS GLC makes no claim on the materials created by third party users of this tool. Details on how to use this tool are contained in the IMS GLC "I-BAT" Documentation available at the IMS GLC web-site. Tool Copyright: 2005-2011 (c) IMS Global Learning Consortium Inc. All Rights Reserved. Schematron Validation Rules Information --------------------------------------- Author: Colin Smythe Date: 29th November, 2010 Version: 1.1 Status: Final Release Description: This set of schematron rules have been created to increase the validation capability of the CPv1.2 XSD for CCv1.1. A total of 10 rule sets have been created to ensure that: [1] The set of rules to ensure that resources for Discussion Topics are correctly provided; [2] The set of rules to ensure that resources for Web Links are correctly provided; [3] The set of rules to ensure that resources for Assessments are correctly provided; [4] The set of rules to ensure that resources for Question Banks are correctly provided; [5] The set of rules to ensure that resources for Web Content are correctly provided; [6] The set of rules to ensure that resources for Associated Content are correctly provided; [7] The set of general rules to ensure that Dependencies are used correctly; [8] The set of general rules to ensure that Items are defined correctly; [9] The set of general rules to ensure that Files are used correctly; [10] The set of general rules to ensure that Resources are used correctly; [11] The set of rules to ensure that resources for BasicLTI are correctly provided. Rule Set: [1] The set of rules to ensure that resources for Discussion Topics are correctly provided. The rules are: (a) Detect for the Discussion Topic Resource when the required 'file' element is missing; (b) Detect for the Discussion Topic Resource when too many 'file' elements are declared; (c) Ensure for the Discussion Topic Resource that the 'href' attribute is not used on the 'resource' element; (d) Detect for the Discussion Topic Resource when it has a prohibited dependency on a Discussion Topic; (e) Detect for the Discussion Topic Resource when it has a prohibited dependency on a Web Link; (f) Detect for the Discussion Topic Resource when it has a prohibited dependency on an Assessment; (g) Detect for the Discussion Topic Resource when it has a prohibited dependency on a Question Bank; (h) Detect for the Discussion Topic Resource when it has a prohibited dependency on a BasicLTI link; [2] The set of rules to ensure that resources for Web Links are correctly provided. The rules are: (a) Detect for the Web Links Resource when the required 'file' element is missing; (b) Detect for the Web Links Resource when too many 'file' elements are declared; (c) Ensure for the Web Links Resource that the 'href' attribute is not used on the 'resource' element; (d) Ensure for the Web Links Resource that the 'dependency' element is not used; [3] The set of rules to ensure that resources for Assessments are correctly provided. The rules are: (a) Detect for the Assessment Resource when the required 'file' element is missing; (b) Detect for the Assessment Resource when too many 'file' elements are declared; (c) Ensure for the Assessment Resource that the 'href' attribute is not used on the 'resource' element; (d) Detect for the Assessment Resource when it has a prohibited dependency on a Discussion Topic; (e) Detect for the Assessment Resource when it has a prohibited dependency on a Web Link; (f) Detect for the Assessment Resource when it has a prohibited dependency on an Assessment; (g) Detect for the Assessment Resource when it has a prohibited dependency on a Question Bank; (h) Detect for the Assessment Resource when it has a prohibited dependency on a BasicLTI link; [4] The set of rules to ensure that resources for Question Banks are correctly provided. The rules are: (a) Ensure that no more than one Qestion Bank is defiend as a resource; (b) Detect for the Question Bank Resource when the required 'file' element is missing; (c) Detect for the Question Bank Resource when too many 'file' elements are declared; (d) Ensure for the Question Bank Resource that the 'href' attribute is not used on the 'resource' element; (e) Detect for the Question Bank Resource when it has a prohibited dependency on a Discussion Topic; (f) Detect for the Question Bank Resource when it has a prohibited dependency on a Web Link; (g) Detect for the Question Bank Resource when it has a prohibited dependency on an Assessment; (h) Detect for the Question Bank Resource when it has a prohibited dependency on a Question Bank; (i) Detect for the Question Bank Resource when it has a prohibited dependency on a BasicLTI link; [5] The set of rules to ensure that resources for Web Content are correctly provided. The rules are: (a) Detect for the Web Content Resource when it has a prohibited dependency on a Discussion Topic; (b) Detect for the Web Content Resource when it has a prohibited dependency on a Web Link; (c) Detect for the Web Content Resource when it has a prohibited dependency on an Assessment; (d) Detect for the Web Content Resource when it has a prohibited dependency on a Question Bank; (e) Detect for the Web Content Resource when it has a prohibited dependency on a Associated Content; (f) Detect for the Web Content Resource when it has a prohibited dependency on a BasicLTI link; (g) A Web Content Resource has a missing 'href' attribute (required because the resource is directly referenced by an Item). [TO BE VERIFIED] [6] The set of rules to ensure that resources for Associated Content are correctly provided. The rules are: (a) Detect for the Associated Content Resource when it has a prohibited dependency on a Discussion Topic; (b) Detect for the Associated Content Resource when it has a prohibited dependency on a Web Link; (c) Detect for the Associated Content Resource when it has a prohibited dependency on an Assessment; (d) Detect for the Associated Content Resource when it has a prohibited dependency on a Question Bank; (e) Detect for the Associated Content Resource when it has a prohibited dependency on a Associated Content; (f) Detect for the Associated Content Resource when it has a prohibited dependency on a BasicLTI link; (g) An Associated Content Resource has a missing 'href' attribute (required because the resource is directly referenced by an Item). [TO BE VERIFIED] [7] The set of general rules to ensure that Dependencies are used correctly. The rules are: (a) A 'dependency' element has a circular reference to its host 'resource' element with identifier; (b) In a 'resource' element at least two 'dependency' elements reference the same 'resource' element. [8] The set of general rules to ensure that Items are defined correctly. The rules are: (a) An Item has a prohibited reference(s) to a Question Bank Resource; (b) A Learning Object Item contains prohibited child Item(s). [9] The set of general rules to ensure that Files are used correctly. The rules are: (a) In a 'resource' element at least two 'file' elements have the same 'href' attribute; [10] The set of general rules to ensure that Resources are used correctly. The rules are: (a) For a 'resource' element with the 'href' attribute the 'file' element is missing; (b) For a 'resource' element with the 'href' attribute there is no 'file' element with the correct 'href' attribute. [11] The set of rules to ensure that resources for BasicLTI are correctly provided. The rules are: (a) Detect for the BasicLTI Resource when it has a prohibited dependency on a Discussion Topic; (b) Detect for the BasicLTI Resource when it has a prohibited dependency on a Web Link; (c) Detect for the BasicLTI Resource when it has a prohibited dependency on an Assessment; (d) Detect for the BasicLTI Resource when it has a prohibited dependency on a Question Bank; (e) Detect for the BasicLTI Resource when it has a prohibited dependency on a Web Content; (f) Detect for the BasicLTI Resource when it has a prohibited dependency on a BasicLTI link. Schematron validation rules for the Common Cartridge v1p1 profile of CP v1.1.4/1.2 RULE SET 1: The set of rules to ensure that resources for Discussion Topics are correctly provided [RULE 1a] For the Discussion Topic Resource the required 'file' element is missing. [RULE 1b] For the Discussion Topic Resource there are too many 'file' element references: . [RULE 1c] For the Discussion Topic Resource the 'href' attribute must not be used on the 'resource' element. [RULE 1d] The Discussion Topic Resource has a prohibited dependency on a Discussion Topic: [RULE 1e] The Discussion Topic Resource has a prohibited dependency on a Web Link: [RULE 1f] The Discussion Topic Resource has a prohibited dependency on an Assessment: [RULE 1g] The Discussion Topic Resource has a prohibited dependency on a Question Bank: [RULE 1h] The Discussion Topic Resource has a prohibited dependency on a BasicLTI: RULE SET 2: The set of rules to ensure that resources for Web Links are correctly provided [RULE 2a] For the Web Link Resource the required 'file' element is missing. [RULE 2b] For the Web Link Resource there are too many 'file' element references: . [RULE 2c] For the Web Link Resource the 'href' attribute must not be used on the 'resource' element. [RULE 2d] For the Web Link Resource the prohibited 'dependency' element is used: . RULE SET 3: The set of rules to ensure that resources for Assessments are correctly provided [RULE 3a] For the Assessments Resource the required 'file' element is missing. [RULE 3b] For the Assessments Resource there are too many 'file' element references: . [RULE 3c] For the Assessments Resource the 'href' attribute must not be used on the 'resource' element. [RULE 3d] The Assessment Resource has a prohibited dependency on a Discussion Topic: [RULE 3e] The Assessment Resource has a prohibited dependency on a Web Link: [RULE 3f] The Assessment Resource has a prohibited dependency on an Assessment: [RULE 3g] The Assessment Resource has a prohibited dependency on a Question Bank: [RULE 3h] The Assessment Resource has a prohibited dependency on a BasicLTI: RULE SET 4: The set of rules to ensure that resources for Question Banks are correctly provided [RULE 4a] The are too many Question Bank Resources (a maximum of one is permitted). Number of Question Bank Resources is: . [RULE 4b] For the Question Bank Resource the required 'file' element is missing. [RULE 4c] For the Question Bank Resource there are too many 'file' element references: . [RULE 4d] For the Question Bank Resource the 'href' attribute must not be used on the 'resource' element. [RULE 4e] The Question Bank Resource has a prohibited dependency on a Discussion Topic: [RULE 4f] The Question Bank Resource has a prohibited dependency on a Web Link: [RULE 4g] The Question Bank Resource has a prohibited dependency on an Assessment: [RULE 4h] The Question Bank Resource has a prohibited dependency on a Question Bank: [RULE 4i] The Question Bank Resource has a prohibited dependency on a BasicLTI: RULE SET 5: The set of rules to ensure that resources for Web Content are correctly provided [RULE 5a] The Web Content has a prohibited dependency on a Discussion Topic: . [RULE 5b] The Web Content has a prohibited dependency on a Web Link: . [RULE 5c] The Web Content has a prohibited dependency on an Assessment: . [RULE 5d] The Web Content has a prohibited dependency on a Question Bank: . [RULE 5e] The Web Content has a prohibited dependency on an Associated Content: . [RULE 5f] The Web Content has a prohibited dependency on a BasicLTI: . RULE SET 6: The set of rules to ensure that resources for Associated Content are correctly provided [RULE 6a] The Associated Content Resource has a prohibited dependency on a Discussion Topic: . [RULE 6b] The Associated Content Resource has a prohibited dependency on a Web Link: . [RULE 6c] The Associated Content Resource has a prohibited dependency on an Assessment: . [RULE 6d] The Associated Content Resource has a prohibited dependency on a Question Bank: . [RULE 6e] The Associated Content Resource has a prohibited dependency on an Associated Content: . [RULE 6f] The Associated Content Resource has a prohibited dependency on a BasicLTI: . RULE SET 7: The set of rules to ensure that Dependencies are used correctly. [RULE 7a] A 'dependency' element has a circular reference to its host 'resource' element with identifier: . [RULE 7b] In a 'resource' element at least two 'dependency' elements reference the same 'resource' element. . RULE SET 8: The set of rules to ensure that Items are defined correctly. [RULE 8a] An Item has a prohibited reference(s) to a Question Bank Resource: . [RULE 8b] A Learning Object Item contains prohibited child Item(s): . RULE SET 9: The set of rules to ensure that Files are used correctly. [RULE 9a] In a 'resource' element at least two 'file' elements have the same 'href' attribute: . RULE SET 10: The set of general rules to ensure that Resources are used correctly. [RULE 10a] For a 'resource' element with the 'href' attribute the 'file' element is missing: . [RULE 10b] For a 'resource' element with the 'href' attribute there is no 'file' element with the correct 'href' attribute: . RULE SET 11: The set of rules to ensure that resources for BasicLTI are correctly provided [RULE 11a] The BasicLTI has a prohibited dependency on a Discussion Topic: . [RULE 11b] The BasicLTI has a prohibited dependency on a Web Link: . [RULE 11c] The Web Content has a prohibited dependency on an Assessment: . [RULE 11d] The Web Content has a prohibited dependency on a Question Bank: . [RULE 11e] The Web Content has a prohibited dependency on an Associated Content: . [RULE 11f] The Web Content has a prohibited dependency on a BasicLTI: . Any namespaced element from any namespace may be included within an "any" element. The namespace for the imported element must be defined in the instance, and the schema must be imported. The extension has a definition of "strict" i.e. they must have their own namespace.

This identifies a resource whose files this resource depends upon. The reference to an identifier in the resources section is contained in the Identifierref attribute.

A listing of file that this resource is dependent on. The href attribute identifies the location of the file. This may have some meta-data.

This is the structure that describes the shape of the organization. It is used in a hierarchical organizational scheme by ordering and nesting. Each Item has an identifier that is unique within the Manifest file. Identifierref acts as a reference to an identifier in the resources section. An Item has a title and may have meta-data. The parameters and isvisible attributes have been removed for this profile.

This is the structure that describes the top-level shape of the organization and so only a single Item is permitted. The top-level has an identifier that is unique within the Manifest file. It may have meta-data but it has not title. It can contain any number of Items. The parameters and isvisible attributes have been removed for this profile

A reusable unit of instruction. It encapsulates meta-data, organizations, resource references and authorization.
It must have an identifier that is unique within the Manifest. The version and reference base is optional.
The base provides the relative path offset for the content file(s).

This is the meta-data describing the Manifest. The schema describes the schema that defines and controls the Manifest.
Schemaversion describes the version of the above schema (e.g., 1,0, 1.1). In Common Cartridge all of the meta-data is described
using the iEEE LOM standard format. CC manifest metadata is required.

This is the meta-data describing the associated class (but not the manifest which has its own meta-data structure).
In Common Cartridge all of the meta-data is described using the IEEE LOM standard format.

This is the meta-data describing the associated class (but not the manifest which has its own meta-data structure).
In Common Cartridge all of the meta-data is described using the IEEE LOM standard format.

This is the meta-data describing the associated class (but not the manifest which has its own meta-data structure).
In Common Cartridge all of the meta-data is described using the IEEE LOM standard format.

Describes a particular hierarchical organization in this profile; this is the only type of oranization that is permitted. The identifier, for the organization, that is unique within the Manifest file. The organization may have meta-data.

Describes zero or one structures or organizations for the Cartridge. Only one organization is permitted so the default attribute has been removed for this Profile.

A reference to a resource which consists of one or more physical files. The Identifer of the resource is unique within the scope of its containing Manifest file. The Type attribute indicates the type of resource - for the Cartridge this is an enumerated set. The resource may have meta-data, zero or more files references, and zero or more dependencies.

CCV1.1 PROFILE: The authorizations 'protected' attribute and the 'intendedUse' attribute are added.

This is the container for resource specific metadata..

A collection of references to resources. There is no assumption of order or hierarchy. The base attribute provides the relative path offset for the content file(s).

schemas11/ccv1p1_qtiasiv1p2p1_v1p0.xsd000064400000350457152266437620013373 0ustar00 XSD Data File Information ------------------------- Author: Colin Smythe Date: 31st October, 2010 Version: 1.1 Status: Final Release Description: This model forms part of the IMS Common Cartridge v1.1 specification. This model is the profile of the IMS QTI v1.2.1 specification. The changes made to the original specification to create this profile are: Root (a) Only one Assessment or one ObjectBank can be exchanged i.e. not Sections or Items; (b) The qticomment attribute has been removed. Assessment (a) Only a single Section must be contained in the Assessment; (b) The metadata is mandatory (see the specification for the fields that must be defined) with a multiplicity of 1; (c) All of the other Assessment fields have been removed apart from the optional PresentationMaterial; (d) The title attribute has been made mandatory. Object Bank (a) Only Items can be containd in the object bank; (b) The Qticomment structure has been removed. Section (a) All of the internal structure has been removed except the containment of Items (at least one is required); (b) The language attribute has been removed. Item (a) The deprecated attributes have been removed from the ItemMetadata class; (b) All qticomment attributes have been removed from various classes; (c) The Item pre and post condition attributes have been removed from the Item class; (d) The itemproc_extension structure has been removed from the Item class; (e) The reference structure has been removed from the Item class; (f) The objectives attribute has been removed from the Item class; (g) The itemcontrol attribute has been removed from the Item class; (h) The item rubric attribute and its associated classes have been removed from the Item class; (i) The duration attribute has been removed from the Item class; (j) The itemmetadata attribute has been made mandatory in the Item class; (k) The label, language and maxattempts attributes have been removed from the Item class; (l) The interpretvar attribute has been removed frm the Outcomes class; (m) The response_xy, response_num, response_grp and response_extension attributes have been removed from the Presentation class; (n) All extension attributes have been removed from various classes; (o) The ItemType, LevelofDifficulty, RenderingType, ResponseMultiplicity, Status and TypeofSolution have been deleted; (p) The ItemFeedback Class has been restructured as only flow_mat is used; (q) A single decvar is required i.e. for the default variable SCORE. Item-Response (a) The Rrange and Rarea attributes have been removed from the ResponseLabel Class. Item-Render (a) The render_hotspot attributes and the RenderHotspot class have been removed; (b) The render_slider attributes and the RenderSlider class have been removed; (c) The render_extension attribute has been removed from the ResponseType class; (d) The response_na attribute has been removed; (e) The qticomment attribute has been removed from the ResponseLabel class; Item-General (a) The Interpretvar class has been removed; (b) The DurationBase class has been removed and all derived attributes from the Conditionvar and CompositionLogic classes; (c) The var_extension attribute has been removed from the Conditionvar class; (d) The qticomment attributes have been removed from the Hint and Solution classes; (e) Setvar is restricted to the Set action; (f) Variable types are restricted to 'Integer' and 'Decimal'; (g) The defaultval and cutvalue, attributes for decvar have been removed; (h) Outcomes is limtied to a single decvar which must have only the variable "SCORE" declared; (i) The classes or, varlt, varlte, vargt, vargte, varinside, varsubset and unanswered have been removed; (j) The classes 'and', 'not' and 'conditionvar' have been significantly simplied i.e. see clause above for detail; (k) The feedbacktype attribute for the displayfeedback element is now mandatory with no default value. Selection and Ordering (a) The entire Selection and Ordering (Package) has been removed. Outcomes (a) The entire Outcomes Processing (Package) has been removed. Material (a) The Reference Class has been removed as this is not required; (b) All entityref attributes have been removed; (c) Extensions have been removed; (d) Only 'mattext', 'matref' and 'matbreak' are permitted as types of material. Common (a) The Rubric class has been removed Items and Sections and it is only permitted to contain a single instance of material; (b) The ContextControl class has been removed i.e. no Control switches required; (c) The QtiComment Class has been removed; (d) The MetadataRule Class has been removed; (e) the Parameterization Class has been removed; (f) The 'view' attribute has been removed; (g) The Vocabulary Class has been removed and its attribute in the QtiMetadata Class also removed. History: Version 1.0: This profile is taken from the UML description of the QTIv1.2.1 specification. Version 1.1: Material has been returned as an alternative to flow_mat in ItemFeedback, SolutionMaterial and HintMaterial. Also, Assessment Rubric has been permitted but it must only contain a single instance of material. License: IPR, License and Distribution Notices This machine readable file is derived from IMS Global Learning Consortium (GLC) specification IMS Common Cartridge Version 1.1 found at http://www.imsglobal.org/cc and the original IMS GLC schema binding or code base http://www.imsglobal.org/cc. Recipients of this document are requested to submit, with their comments, notification of any relevant patent claims or other intellectual property rights of which they may be aware that might be infringed by the schema binding contained in this document. IMS GLC takes no position regarding the validity or scope of any intellectual property or other rights that might be claimed to pertain to the implementation or use of the technology described in this document or the extent to which any license under such rights might or might not be available; neither does it represent that it has made any effort to identify any such rights. Information on IMS GLCs procedures with respect to rights in IMS GLC specifications can be found at the IMS GLC Intellectual Property Rights web page: http://www.imsglobal.org/ipr/imsipr_policyFinal.pdf. Copyright (c) IMS Global Learning Consortium 1999-2011. All Rights Reserved. License Notice for Users Users of products or services that include this document are hereby granted a worldwide, royalty-free, non-exclusive license to use this document. Distribution Notice for Developers Developers of products or services that are not original incorporators of this document and have not changed this document, that is, are distributing a software product that incorporates this document as is from a third-party source other than IMS, are hereby granted permission to copy, display and distribute the contents of this document in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof. Developers of products or services that are original incorporators of this document and wish to provide distribution of this document as is or with modifications and developers of products and services that are not original incorporators of this document and have changed this document, are required to register with the IMS GLC community on the IMS GLC website as described in the following two paragraphs:- * If you wish to distribute this document as is, with no modifications, you are hereby granted permission to copy, display and distribute the contents of this document in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof, that you make and you complete a valid license registration with IMS and receive an email from IMS granting the license. To register, follow the instructions on the IMS website: http://www.imsglobal.org/specificationdownload.cfm. Once registered you are granted permission to transfer unlimited distribution rights of this document for the purposes of third-party or other distribution of your product or service that incorporates this document as long as this IPR, License and Distribution notice remains in place in its entirety; * If you wish to create and distribute a derived work from this document, you are hereby granted permission to copy, display and distribute the contents of the derived work in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof, that you make and you complete a valid profile registration with IMS GLC and receive an email from IMS GLC granting the license. To register, follow the instructions on the IMS GLC website: http://www.imsglobal.org/profile/. Once registered you are granted permission to transfer unlimited distribution rights of the derived work for the purposes of third-party or other distribution of your product or service that incorporates the derived work as long as this IPR, License and Distribution notice remains in place in its entirety. The limited permissions granted above are perpetual and will not be revoked by IMS GLC or its successors or assigns. THIS SPECIFICATION IS BEING OFFERED WITHOUT ANY WARRANTY WHATSOEVER, AND IN PARTICULAR, ANY WARRANTY OF NONINFRINGEMENT IS EXPRESSLY DISCLAIMED. ANY USE OF THIS SPECIFICATION SHALL BE MADE ENTIRELY AT THE IMPLEMENTERS OWN RISK, AND NEITHER THE CONSORTIUM NOR ANY OF ITS MEMBERS OR SUBMITTERS, SHALL HAVE ANY LIABILITY WHATSOEVER TO ANY IMPLEMENTER OR THIRD PARTY FOR ANY DAMAGES OF ANY NATURE WHATSOEVER, DIRECTLY OR INDIRECTLY, ARISING FROM THE USE OF THIS SPECIFICATION. Source UML File Information --------------------------- The source file information must be supplied as an XMI file (without diagram layout information). The supported UML authoring tools are: (a) Poseidon – v6 (and later) Source XSLT File Information ---------------------------- XSL Generator: UMLtoXSDTransformv0p9.xsl XSLT Processor: Xalan Release: 1.0 Beta 3 Date: 31st May, 2009 IMS GLC Auto-generation Binding Tool-kit (I-BAT) ------------------------------------------------ This file was auto-generated using the IMS GLC Binding Auto-generation Tool-kit (I-BAT). While every attempt has been made to ensure that this tool auto-generates the files correctly, users should be aware that this is an experimental tool. Permission is given to make use of this tool. IMS GLC makes no claim on the materials created by third party users of this tool. Details on how to use this tool are contained in the IMS GLC "I-BAT" Documentation available at the IMS GLC web-site. Tool Copyright: 2005-2010 (c) IMS Global Learning Consortium Inc. All Rights Reserved. Schematron Validation Rules Information --------------------------------------- Author: Colin Smythe Date: 5th January, 2011 Version: 1.1 Status: Final Release Description: This set of schematron rules have been created to increase the validation capability of the QTIv1.2.1 XSD. A total of 12 rule sets have been created to ensure that: [1] Only valid Assessment metadata is defined; [2] Only valid Question types are defined in the Itemmetatadata fields; [3] The structure of a True/False question is correct; [4] The structure of a Multiple-Choice (Single Response) question is correct; [5] The structure of a Multiple-Choice (Multiple Response) question is correct; [6] The structure of a Fill In Blank question is correct; [7] The structure of a Pattern Match question is correct; [8] The structure of an Essay question is correct; [9] The structures of the response processing/response-label are correct; [10] The structure of a Hint in an Item is correct; [11] The structure of a Solution in an Item is correct; [12] The structure of the response processing feedback structure in an Item is correct; [13] Generic features of an Item are correctly implemented. Rule Set: [1] The set of rules to ensure that only valid Assessment metadata is defined. The rules are: (a) Only valid entries are defined for the Assessment metadata fieldlabel values; (b) Only valid entries are defined for the Assessment metadata fieldentry values for fieldlabel = 'qmd_assessmenttype'; (c) Only valid entries are defined for the Assessment metadata fieldentry values for fieldlabel = 'qmd_scoretype'; (d) Only valid entries are defined for the Assessment metadata fieldentry values for fieldlabel = 'qmd_feedbackpermitted'; (e) Only valid entries are defined for the Assessment metadata fieldentry values for fieldlabel = 'qmd_hintspermitted'; (f) Only valid entries are defined for the Assessment metadata fieldentry values for fieldlabel = 'qmd_solutionspermitted'; (g) Only valid entries are defined for the Assessment metadata fieldentry values for fieldlabel = 'qmd_timelimit'; (h) Only valid entries are defined for the Assessment metadata fieldentry values for fieldlabel = 'cc_allow_late_submission'; (i) Only valid entries are defined for the Assessment metadata fieldentry values for fieldlabel = 'cc_maxattempts'; (j) Only valid entries are defined for the Assessment metadata fieldentry values for fieldlabel = 'cc_profile'; (k) There must be no more than one Assessment metadata field with fieldlabel='cc_profile'; (l) There must be no more than one Assessment metadata field with fieldlabel='qmd_assessmenttype'; (m) There must be no more than one Assessment metadata field with fieldlabel='qmd_scoretype'; (n) There must be no more than one Assessment metadata field with fieldlabel='qmd_feedbackpermitted'; (o) There must be no more than one Assessment metadata field with fieldlabel='qmd_hintspermitted'; (p) There must be no more than one Assessment metadata field with fieldlabel='qmd_solutionspermitted'; (q) There must be no more than one Assessment metadata field with fieldlabel='qmd_timelimit'; (r) There must be no more than one Assessment metadata field with fieldlabel='cc_allow_late_submission'; (s) There must be no more than one Assessment metadata field with fieldlabel='cc_maxattempts'. [2] The set of rules to ensure that only valid Question types are defined in the Itemmetatadata fields. The rules are: (a) Only valid entries are defined for the Itemmetadata fieldlabel values; (b) Only valid entries are defined for the Itemmetadata fieldentry values for fieldlabel = 'cc_profile'; (c) Only valid entries are defined for the Itemmetadata fieldentry values for fieldlabel = 'cc_weighting'; (d) Only valid entries are defined for the Itemmetadata fieldentry values for fieldlabel = 'qmd_scoringpermitted'; (e) Only valid entries are defined for the Itemmetadata fieldentry values for fieldlabel = 'qmd_computerscored'; (f) The Item metadata field with fieldlabel='cc_profile' must be present; (g) There must only be one Item metadata fields with fieldlabel='cc_profile'for each Item; (h) There must be no more than one Item metadata field with fieldlabel='cc_weighting'for each Item; (i) There must be no more than one Item metadata field with fieldlabel='qmd_scoringpermitted' for each Item; (j) There must be no more than one Item metadata field with fieldlabel='qmd_computerscored'for each Item. [3] The set of rules to ensure that the structure of a True/False question is correct. The rules are: (a) That @rcardinality='Single'; (b) The element 'response_str' is not used; (c) The element 'render_fib' is not used; (d) That there are zero or two response labels; (e) That the response processing uses the correct identifiers i.e. varequal/@respident value is equal to the response_lid/@ident; (f) The varsubstring element must not be used. [4] The set of rules to ensure that the structure of a Multiple-Choice (Single Response) question is correct. The rules are: (a) That @rcardinality='Single'; (b) The element 'response_str' is not used; (c) The element 'render_fib' is not used; (d) That there are at least three response labels; (e) That the response processing uses the correct identifiers i.e. varequal/@respident value is equal to the response_lid/@ident; (f) The varsubstring element must not be used. [5] The set of rules to ensure that the structure of a Multiple-Choice (Multiple Response) question is correct. The rules are: (a) That @rcardinality='Multiple'; (b) The element 'response_str' is not used; (c) The element 'render_fib' is not used; (d) That there are at least two response labels; (e) That the response processing uses the correct identifiers i.e. varequal/@respident value is equal to the response_lid/@ident; (f) The varsubstring element must not be used.. [6] The set of rules to ensure that the structure of a Fill-in-Blank question is correct. The rules are: (a) The element 'response_lid' is not used; (b) The element 'render_choice' is not used; (c) That the response processing uses the correct identifiers i.e. varequal/@respident value is equal to the response_str/@ident; (d) There is no use of the 'varsubstring' element. [7] The set of rules to ensure that the structure of a Pattern Match question is correct. The rules are: (a) The element 'response_lid' is not used; (b) The element 'render_choice' is not used; (c) That the response processing uses the correct identifiers i.e. varequal/@respident value is equal to the response_str/@ident. [8] The set of rules to ensure that the structure of an Essay question is correct. The rules are: (a) The element 'response_lid' is not used; (b) The element 'render_choice' is not used; (c) There is no use of the 'varequal' element; (d) There is no use of the 'varsubstring' element; (e) No more than a single Solution feedback can be supplied; (f) The fieldentry Item metadata for an Essay question with the fieldlabel='qmd_computerscored' must be set as 'No'. [9] The set of rules to ensure that the Response Processing/Response-Label structures are valid. The rules are: (a) There are no invalid response labels used in the 'varequal' element for T/F and MC questions. [10] The set of rules to ensure that the structure of a Hint in an Item is correct. The rules are: (a) The element 'displayfeedback@feedbacktype=Hint' is accompanied by the @linkrefid='hint' attribute; (b) The element 'itemfeedback@ident=hint' is not followed by the 'solution' element; (c) The element 'itemfeedback@ident=hint' is not followed by the 'flow_mat' element; (d) If the element 'displayfeedback@feedbacktype=Hint' is used it must be accompanied by hint feedback. [11] The set of rules to ensure that the structure of a Solution in an Item is correct. The rules are: (a) The element 'displayfeedback@feedbacktype=Solution' is accompanied by the @linkrefid='solution' attribute; (b) The element 'itemfeedback@ident=solution' is not followed by the 'hint' element; (c) The element 'itemfeedback@ident=solution' is not followed by the 'flow_mat' element; (d) If the element 'displayfeedback@feedbacktype=Solution' is used it must be accompanied by solution feedback. [12] The set of rules to ensure that the general structure of the Response Processing in an Item is correct. The rules are: (a) The element 'displayfeedback@feedbacktype=Response' is not accompanied by the @linkrefid='solution' attribute; (b) The element 'displayfeedback@feedbacktype=Response' is not accompanied by the @linkrefid='hint' attribute; (c) To check that for each element 'displayfeedback@feedbacktype=Response' the corresponding 'itemfeedback' element exists; (d) To check that a given response processing itemfeedback identifier there is a corresponding displayfeedback trigger for that identifier. [13] The set of rules to ensure that the general features in an Item are correct. The rules are: (a) To ensure that each Item has a unique @ident attribute. Schematron validation rules for the Common Cartridge v1p1 profile of QTI v1.2.1 RULE SET 1: Ensure that only valid metadata is defined in the Assessment metadata fields [RULE 1a] Invalid Assessment metadata fieldlabel value: . [RULE 1b] Invalid fieldentry Assessment metadata for the fieldlabel='qmd_assessmenttype' value: . [RULE 1c] Invalid fieldentry Assessment metadata for the fieldlabel='qmd_scoretype' value: . [RULE 1d] Invalid fieldentry Assessment metadata for the fieldlabel='qmd_feedbackpermitted' value: . [RULE 1e] Invalid fieldentry Assessment metadata for the fieldlabel='qmd_hintspermitted' value: . [RULE 1f] Invalid fieldentry Assessment metadata for the fieldlabel='qmd_solutionspermitted' value: . [RULE 1g] Invalid fieldentry Assessment metadata for the fieldlabel='qmd_timelimit' i.e. not a valid integer with value: . [RULE 1h] Invalid fieldentry Assessment metadata for the fieldlabel='cc_allow_late_submission' value: . [RULE 1i] Invalid fieldentry Assessment metadata for the fieldlabel='cc_maxattempts' value: . [RULE 1j] Invalid fieldentry Assessment metadata for the fieldlabel='cc_profile' value: . [RULE 1k] There are repeated assessment metadata fields of fieldlabel='cc_profile' with count=. [RULE 1l] There are repeated assessment metadata fields of fieldlabel='qmd_assessmenttype' with count=. [RULE 1m] There are repeated assessment metadata fields of fieldlabel='qmd_scoretype' with count=. [RULE 1n] There are repeated assessment metadata fields of fieldlabel='qmd_feedbackpermitted' with count=. [RULE 1o] There are repeated assessment metadata fields of fieldlabel='qmd_hintspermitted' with count=. [RULE 1p] There are repeated assessment metadata fields of fieldlabel='qmd_solutionspermitted' with count=. [RULE 1q] There are repeated assessment metadata fields of fieldlabel='qmd_timelimit' with count=. [RULE 1r] There are repeated assessment metadata fields of fieldlabel='cc_allow_late_submission' with count=. [RULE 1s] There are repeated assessment metadata fields of fieldlabel='cc_maxattempts' with count=. RULE SET 2: Ensure that only valid metadata is defined in the Itemmetatadata fields [RULE 2a] Invalid Itemmetadata fieldlabel value: . [RULE 2b] Invalid fieldentry Question Type (fieldlabel='cc_profile') value: . [RULE 2c] Invalid fieldentry Item metadata weighting for the fieldlabel='cc_weighting' i.e. not an integer in the range 1..99, with value: . [RULE 2d] Invalid fieldentry Item metadata for the fieldlabel='qmd_scoringpermitted' with value: . [RULE 2e] Invalid fieldentry Item metadata for the fieldlabel='qmd_computerscored' with value: . [RULE 2f] The Item metadata field with fieldlabel='cc_profile' is missing. [RULE 2g] There are too many Item metadata fields with fieldlabel='cc_profile' i.e. count=. [RULE 2h] There are too many Item metadata fields with fieldlabel='cc_weighting' i.e. count=. [RULE 2i] There are too many Item metadata fields with fieldlabel='qmd_scoringpermitted' i.e. count=. [RULE 2j] There are too many Item metadata fields with fieldlabel='qmd_computerscored' i.e. count=. RULE SET 3: Ensure that the structure of a True/False question is correct [RULE 3a] Incorrect cardinality attribute value for the T/F question: [RULE 3b] The invalid 'response_str' element has been used for a T/F question. [RULE 3c] The invalid 'render_fib' element has been used for a T/F question. [RULE 3d] There are too many or too few response labels for the T/F question. [RULE 3e] The T/F response processing Varequal respident attribute () value is not equal to the corresonding Response_lid ident () attribute for the True/False question. [RULE 3f] There is an invalid use of the varsubstring element in a T/F question. RULE SET 4: Ensure that the structure of a MC-SR question is correct [RULE 4a] Incorrect cardinality attribute value for the MC-SR question: . [RULE 4b] The invalid 'response_str' element has been used for a MC-SR question. [RULE 4c] The invalid 'render_fib' element has been used for a MC-SR question. [RULE 4d] There are too too few response labels for the MC-SR question. [RULE 4e] The MC-SR response processing Varequal respident attribute () value is not equal to the corresonding Response_lid ident () attribute for the Multiple Choice single response question. [RULE 4f] There is an invalid use of the varsubstring element in a MC-SR question. RULE SET 5: Ensure that the structure of a MC-MR question is correct [RULE 5a] Incorrect cardinality attribute value for the MC-MR question: . [RULE 5b] The invalid 'response_str' element has been used for a MC-MR question. [RULE 5c] The invalid 'render_fib' element has been used for a MC-MR question. [RULE 5d] There are too too few response labels for the MC-MR question. [RULE 5e] The MC-MR response processing Varequal respident attribute () value is not equal to the corresonding Response_lid ident () attribute for the Multiple Choice multiple response question. [RULE 5f] There is an invalid use of the varsubstring element in a MC-MR question. RULE SET 6: Ensure that the structure of a FIB question is correct [RULE 6a] The invalid 'response_lid' element has been used for a FIB question. [RULE 6b] The invalid 'render_choice' element has been used for a FIB question. [RULE 6c] The FIB response processing Varequal respident attribute () value is not equal to the corresonding Response_str ident () attribute for the FIB question. [RULE 6d] There is an invalid use of the 'varsubstring' element in the FIB question. RULE SET 7: Ensure that the structure of a Pattern Match question is correct [RULE 7a] The invalid 'response_lid' element has been used for a Pattern Match question. [RULE 7b] The invalid 'render_choice' element has been used for a Pattern Match question. [RULE 7c] The FIB response processing Varequal respident attribute () value is not equal to the corresonding Response_str ident () attribute for the Pattern Match question. RULE SET 8: Ensure that the structure of a Essay question is correct [RULE 8a] The invalid 'response_lid' element has been used for an Essay question. [RULE 8b] The invalid 'render_choice' element has been used for an Essay question. [RULE 8c] There is an invalid use of the 'varequal' element in an Essay question. [RULE 8d] There is an invalid use of the 'varsubstring' element in an Essay question. [RULE 8e] Too many Solution feedback structures are supplied. [RULE 8f] Invalid fieldentry Item metadata for an Essay question with the fieldlabel='qmd_computerscored' with value: . RULE SET 10: Ensure that the structure of a Hint in an Item is correct [RULE 10a] The displayfeedback@feedbacktype='Solution' has been used to identify a Hint. [RULE 10b] The itemfeedback@ident='hint' has been used to identify a Solution. [RULE 10c] The itemfeedback@ident='hint' has been used to identify Response feedback. [RULE 10d] A displayfeedback[@feedbacktype='Hint'] trigger has no accompanying hint feedback. RULE SET 11: Ensure that the structure of a Solution in an Item is correct [RULE 11a] The displayfeedback@feedbacktype='Hint' has been used to identify a Solution. [RULE 11b] The itemfeedback@ident='solution' has been used to identify a Hint. [RULE 11c] The itemfeedback@ident='solution' has been used to identify Response feedback. [RULE 11d] A displayfeedback[@feedbacktype='Solution'] trigger has no accompanying solution feedback. RULE SET 12: Ensure that the structure of the response processing feedback structure in an Item is correct [RULE 12a] The displayfeedback@feedbacktype='Response' has been used to identify a Solution. [RULE 12b] The displayfeedback@feedbacktype='Response' has been used to identify a Hint. [RULE 12c] For the given displayfeedback identifier () there is no itemfeedback with the correct identifier (). [RULE 12d] For the given response processing itemfeedback identifier () there is no displayfeedback trigger with the correct identifier (). RULE SET 13: Ensure that the generic features of an Item are correct [RULE 13a] There are Items that have common identifiers: . The root structure can consist of either: * A single object bank; * An assessment; * A set of item(s); * A set of section(s); * Any combination of items and sections. As the root this is mandatory and can occur once. Common Cartridge Profile A Commn Cartridge is allowed to contain only an objectbank or an assessement. QTI General An Assessment object is the logical construction of the test. An Assessment must contain at least one Section which in turn will contain Items and/or Sections. An Assessment must eventually be constructed from a set of Items i.e. questions that are to be offered in the test. An Assessment object contains all of the information to make the use of individual Items meaningful i.e. apart from the Sections the object includes the relationships between the Sections, the group evaluation processing and the corresponding feedback. Common Cartridge Profile The Assessment must consist of only one Section. The only other permitted attributes are the mandatory identifier and title. Optional language, metadata, rubric and presentation_material is also supported. QTI General An object bank is an unordered set of items and sections. It is recommended that there is a metadata description for the object bank as a whole. The object bank should have a globally unique identifier. Common Cartridge Profile In the Common Cartridge the object-bank can only contain Items. Meta-data support is available but the profile has no mandated entries. QTI General A Section is the core grouping concept within QTI. A Section consists of one or more Items or Sections (or references to Items and Sections). In general, the objects contained within a Secton will have some relationship either in terms of content or content delivery. The Section data structure is used to define arbitrarily complex hierarchical section and item data structures. It may contain meta-data, objectives, rubric control switches, assessment-level processing, feedback and selection and sequencing information for sections and items. Common Cartridge Profile In Common Cartridge the Section can only contain a list of Items. No metadata is permitted. The identifier is mandatory but the title and language are optional. An Item the smallest exchangeable object within QTI-XML. An Item is more than a ‘Question’ in that it contains the ‘Question’, the presentation/rendering instructions, the response processing to be applied to the participant’s response(s), the feedback that may be presented (including hints and solutions) and the meta-data describing the Item. Contains all of the QTI-specific metada-data to be applied to the Item. This meta-data can consist of either entries defined using an external vocabulary or the individually named entries. Usage of the contained attributes are deprecated apart from the 'qtimetadata' attribute. Contains all of the instructions for the presentation of the question during an evaluation. This information includes the actual material to be presented. The labels for the possible responses are also identified and these are used by the response processing element defined elsewhere in the Item. This contains all of the instructions for the response processing. This includes the scoring variables to contain the associated scores and the set of response condition tests that are to be applied to the received user response. Contains all of the variable declarations that are to be made available to the scoring algorithm. Each variable is declared using the 'decvar' structure apart from the default variable called ‘SCORE’ that is an integer and has a default value of zero (0). Common Cartridge Profile A single variable is permitted. This is "SCORE". The container for the feedback that is to be presented as a result of the user’s responses. The feedback can include hints and solutions and both of these can be revealed in a variety of different ways. Contains the actual test to be applied to the user responses to determine their correctness or otherwise. Each 'respcondition' contains an actual test, the assignment of a value to the associate scoring variables and the identification of the feedback to be associated with the test. This is the information that is to be presented to set the context for the contained objects. This can be used to contain question-based material that is common to all of the child objects. This is used in Assessment and Section objects. This is the information that is used to describe the solution. This allows the materials to be displayed to the users to be grouped together using flows. The manner in which these flows are handled is dependent upon the display-engine. This is the container for any content that is to be displayed by the question-engine. The supported content types are text (emphasised or not), images, audio, video, application and applet. The content can be internally referenced to avoid the need for duplicate copies. Alternative information can be defined – this is used if the primary content cannot be displayed. Common Cartridge Profile Only the 'mattext', 'matref' and 'matbreak' types are permitted. This is the container for alternative content. This content is to be displayed if, for whatever reason, the primary content cannot be rendered. Alternative language implementations of the host 'material' element are also supported using this structure. This is the container for all of the instructions for the presentation with flow blocking of the question during a test. This information includes the actual material to be presented. The labels for the possible responses are also identified and these are used by the response processing element defined elsewhere in the Item. Contains the instructions for the question-engine to render the question using a classical multiple choice format. The number of possible responses is determined by the 'response_label' structures contained. Both flowed and non-flowed formats are supported Contains the instructions for the question-engine to render the question using a classical fill-in blank format. The number of possible responses is determined by the 'response_label' structures contained. Both flowed and non-flowed formats are supported. QTI General The QTI-specific meta-data assigned to the parent object i.e. Assessment, Section, Item or Object-bank. This approach requires that the approriate external vocabulary is defined and referenced in label/field tuple. Common Cartridge Profile The Vocabulary structure has been removed. The structure responsible for containing each of the QTI-specific meta-data fields. The label should appear in the vocabulary. If no vocabulary is used then external validation cannot take place. This is used to contain contextual information i.e. rubric that is important to the object e.g. it could contain standard data values that might or might not be useful for answering the question. Common Cartridge Profile This is used in assessments to provide instructions. Only a single mattext is permitted in the material. This contains the possible response choices that are presented to the user. This information includes the material to be shown to the user and the logical label that is associated with that response. The label is used in the response processing. Flow and non-flow approaches are supported. This is the blocking/paragraph equivalent to the 'response_label' structure. This structure shold always be used to encapsulate the 'response_label construct. QTI General This contains the instructions for the presentation of questions whose response will be either a 'response_lid' (logical identifier), 'response_xy' (xy-co-ordinate), 'response_str' (a string), 'response_num' (a number) and 'response_grp' ( a group of logical identifiers). The question can be rendered in a variety of ways depending on the way in which the material is to be presented to the participant. Common Cartridge Profile Only the response_lid and response_str response types are supported with render_choice and render_fib rendering. QTI General This contains the instructions for the presentation of questions whose response will be either a 'response_lid' (logical identifier), 'response_xy' (xy-co-ordinate), 'response_str' (a string), 'response_num' (a number) and 'response_grp' ( a group of logical identifiers). The question can be rendered in a variety of ways depending on the way in which the material is to be presented to the participant. Common Cartridge Profile Only the response_lid and response_str response types are supported with render_choice and render_fib rendering. QTI General Contains the solution(s) that are to be revealed to the participant. When these solutions are revealed is outside the scope of the specification. The information can be revealed in several manners. The default mode is to show the 'Complete' solution. Common Cartridge Profile The material is presented in the form of flow_mat only. The only form of feedback is 'Complete'. QTI General Contains the hints(s) that are to be revealed to the participant. When these hints are revealed is outside the scope of the specification. The information can be revealed in several manners. The default mode is to show the 'Complete' hint. Common Cartridge Profile The material is presented in the form of flow_mat only. The only form of feedback is 'Complete'. QTI General The conditional test that is to be applied to the user’s response. A wide range of separate and combinatorial tests can be applied. Common Cartridge Profile The extension has been removed. All of the conditions operating on duration have been removed. The only permited conditions are 'varequal', 'varsubstring', 'and', 'other'. This is the information that is used to describe the solution. This is the information that is presented as a hint. QTI General This defines the set of clauses that can be used within the logic statements of 'and', 'or' and 'not'. These logic statements enable the construction of complex conditional tests. Common Cartridge Profile The extension has been removed. All of the conditions operating on duration have been removed. The 'or' conditional has been removed and 'and' and 'not' have been considerably simplified. QTI General This defines the set of clauses that can be used within the logic statements of 'and', 'or' and 'not'. These logic statements enable the construction of complex conditional tests. Common Cartridge Profile The extension has been removed. All of the conditions operating on duration have been removed. The 'or' conditional has been removed and 'and' and 'not' have been considerably simplified. This is the container of any text that is to be displayed to the users. It is the base type for normal and emphasised text. This is used to contain a reference to the required full material block. This material will have had an identifier assigned to enable such a reference to be reconciled when the instance is parsed into the system. This is used to contain a reference to the required full material block. This material will have had an identifier assigned to enable such a reference to be reconciled when the instance is parsed into the system. QTI General This is used for the declaration of the scoring variables. The name of the variable that is to be declared. The default name is ‘SCORE’. All numeric variables have the associated ‘x.min’, ‘x.max’ and ‘x.normalised’ variables declared. Several of the optional attributes depend upon the type of variable that is declared. Common Cartridge Profile Only the variable types of decimal and integer are permitted. Only a single "SCORE" variable is permitted. QTI General This is responsible for changing the value of the scoring variable as a result of the associated response processing test. The default action is to 'Set' the 'SCORE' variable to the value given in the string. Common Cartridge Profile Only the actons Set, Add and Subtract are premitted. This is the test of equivalence. The data for the test is contained as a string. The accompanying attributes are the identifier for the associated 'response_label', the ordinal 'index' of the response and whether or not the value is case-sensitive when processing strings. This is used for assigning an associated feedback to the aggregated scoring if the ‘True’ state results. Feedback for hints, solutions and response processing are supported. The feedback is identified using the pointer 'linkrefid'. This is the test for a contained substring. The data for comparison is presented as a string. The associated attributes are the response label identifier, the ordinal index of the response and whether or not the value is case-sensitive when processing the strings. schemas11/imslticc_v1p0p1.xsd000064400000034304152266437620012010 0ustar00 XSD Data File Information ------------------------- Author: Chuck Severance (IMS GLC) and Colin Smythe (IMS GLC) Date: 9th June, 2010 Version: 1.0.1 Status: Final Release Description: This is the description of the resource linkfile that is to be placed inside a Common Cartridge. History: V1.0 - the first Final Release. V1.0.1 - changed to use the imsbasiclti_v1p0p1.xsd. License: IPR, License and Distribution Notices This machine readable file is derived from IMS Global Learning Consortium (GLC) specification IMS Common Cartridge Version 1.1 found at http://www.imsglobal.org/cc and the original IMS GLC schema binding or code base http://www.imsglobal.org/cc. Recipients of this document are requested to submit, with their comments, notification of any relevant patent claims or other intellectual property rights of which they may be aware that might be infringed by the schema binding contained in this document. IMS GLC takes no position regarding the validity or scope of any intellectual property or other rights that might be claimed to pertain to the implementation or use of the technology described in this document or the extent to which any license under such rights might or might not be available; neither does it represent that it has made any effort to identify any such rights. Information on IMS GLCs procedures with respect to rights in IMS GLC specifications can be found at the IMS GLC Intellectual Property Rights web page: http://www.imsglobal.org/ipr/imsipr_policyFinal.pdf. Copyright (c) IMS Global Learning Consortium 1999-2011. All Rights Reserved. License Notice for Users Users of products or services that include this document are hereby granted a worldwide, royalty-free, non-exclusive license to use this document. Distribution Notice for Developers Developers of products or services that are not original incorporators of this document and have not changed this document, that is, are distributing a software product that incorporates this document as is from a third-party source other than IMS, are hereby granted permission to copy, display and distribute the contents of this document in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof. Developers of products or services that are original incorporators of this document and wish to provide distribution of this document as is or with modifications and developers of products and services that are not original incorporators of this document and have changed this document, are required to register with the IMS GLC community on the IMS GLC website as described in the following two paragraphs:- * If you wish to distribute this document as is, with no modifications, you are hereby granted permission to copy, display and distribute the contents of this document in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof, that you make and you complete a valid license registration with IMS and receive an email from IMS granting the license. To register, follow the instructions on the IMS website: http://www.imsglobal.org/specificationdownload.cfm. Once registered you are granted permission to transfer unlimited distribution rights of this document for the purposes of third-party or other distribution of your product or service that incorporates this document as long as this IPR, License and Distribution notice remains in place in its entirety; * If you wish to create and distribute a derived work from this document, you are hereby granted permission to copy, display and distribute the contents of the derived work in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof, that you make and you complete a valid profile registration with IMS GLC and receive an email from IMS GLC granting the license. To register, follow the instructions on the IMS GLC website: http://www.imsglobal.org/profile/. Once registered you are granted permission to transfer unlimited distribution rights of the derived work for the purposes of third-party or other distribution of your product or service that incorporates the derived work as long as this IPR, License and Distribution notice remains in place in its entirety. The limited permissions granted above are perpetual and will not be revoked by IMS GLC or its successors or assigns. THIS SPECIFICATION IS BEING OFFERED WITHOUT ANY WARRANTY WHATSOEVER, AND IN PARTICULAR, ANY WARRANTY OF NONINFRINGEMENT IS EXPRESSLY DISCLAIMED. ANY USE OF THIS SPECIFICATION SHALL BE MADE ENTIRELY AT THE IMPLEMENTERS OWN RISK, AND NEITHER THE CONSORTIUM NOR ANY OF ITS MEMBERS OR SUBMITTERS, SHALL HAVE ANY LIABILITY WHATSOEVER TO ANY IMPLEMENTER OR THIRD PARTY FOR ANY DAMAGES OF ANY NATURE WHATSOEVER, DIRECTLY OR INDIRECTLY, ARISING FROM THE USE OF THIS SPECIFICATION. Source UML File Information --------------------------- The source file information must be supplied as an XMI file (without diagram layout information). The supported UML authoring tools are: (a) Poseidon – v6 (and later) Source XSLT File Information ---------------------------- XSL Generator: UMLtoXSDTransformv0p9.xsl XSLT Processor: Xalan Release: 1.0 Beta 3 Date: 31st May, 2009 IMS GLC Auto-generation Binding Tool-kit (I-BAT) ------------------------------------------------ This file was auto-generated using the IMS GLC Binding Auto-generation Tool-kit (I-BAT). While every attempt has been made to ensure that this tool auto-generates the files correctly, users should be aware that this is an experimental tool. Permission is given to make use of this tool. IMS GLC makes no claim on the materials created by third party users of this tool. Details on how to use this tool are contained in the IMS GLC "I-BAT" Documentation available at the IMS GLC web-site. Tool Copyright: 2005-2010 (c) IMS Global Learning Consortium Inc. All Rights Reserved. Any namespaced element from any namespace may be included within an "any" element. The namespace for the imported element must be defined in the instance, and the schema must be imported. The extension has a definition of "strict" i.e. they must have their own namespace. The CartridgeBasicLTILink class is the container for the information about the use of BasicLTI with a Common Cartridge. The ToolLocator complexType is the container for the tool locator information for the cartridge BasicLTI resource. The ResourceRef complexType is the container for the resource reference. schemas11/ccv1p1_imswl_v1p1.xsd000064400000031027152266437620012250 0ustar00 XSD Data File Information ------------------------- Author: Colin Smythe Date: 31st August, 2010 Version: 1.1 Status: Final Description: This is the IMS GLC Web Links Data Model for the Common Cartridge. History: Version 1.0 - the first release of this data model; Version 1.1 - updates made to the namespace. License: IPR, License and Distribution Notices This machine readable file is derived from IMS Global Learning Consortium (GLC) specification IMS Common Cartridge Version 1.1 found at http://www.imsglobal.org/cc and the original IMS GLC schema binding or code base http://www.imsglobal.org/cc. Recipients of this document are requested to submit, with their comments, notification of any relevant patent claims or other intellectual property rights of which they may be aware that might be infringed by the schema binding contained in this document. IMS GLC takes no position regarding the validity or scope of any intellectual property or other rights that might be claimed to pertain to the implementation or use of the technology described in this document or the extent to which any license under such rights might or might not be available; neither does it represent that it has made any effort to identify any such rights. Information on IMS GLCs procedures with respect to rights in IMS GLC specifications can be found at the IMS GLC Intellectual Property Rights web page: http://www.imsglobal.org/ipr/imsipr_policyFinal.pdf. Copyright (c) IMS Global Learning Consortium 1999-2011. All Rights Reserved. License Notice for Users Users of products or services that include this document are hereby granted a worldwide, royalty-free, non-exclusive license to use this document. Distribution Notice for Developers Developers of products or services that are not original incorporators of this document and have not changed this document, that is, are distributing a software product that incorporates this document as is from a third-party source other than IMS, are hereby granted permission to copy, display and distribute the contents of this document in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof. Developers of products or services that are original incorporators of this document and wish to provide distribution of this document as is or with modifications and developers of products and services that are not original incorporators of this document and have changed this document, are required to register with the IMS GLC community on the IMS GLC website as described in the following two paragraphs:- * If you wish to distribute this document as is, with no modifications, you are hereby granted permission to copy, display and distribute the contents of this document in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof, that you make and you complete a valid license registration with IMS and receive an email from IMS granting the license. To register, follow the instructions on the IMS website: http://www.imsglobal.org/specificationdownload.cfm. Once registered you are granted permission to transfer unlimited distribution rights of this document for the purposes of third-party or other distribution of your product or service that incorporates this document as long as this IPR, License and Distribution notice remains in place in its entirety; * If you wish to create and distribute a derived work from this document, you are hereby granted permission to copy, display and distribute the contents of the derived work in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof, that you make and you complete a valid profile registration with IMS GLC and receive an email from IMS GLC granting the license. To register, follow the instructions on the IMS GLC website: http://www.imsglobal.org/profile/. Once registered you are granted permission to transfer unlimited distribution rights of the derived work for the purposes of third-party or other distribution of your product or service that incorporates the derived work as long as this IPR, License and Distribution notice remains in place in its entirety. The limited permissions granted above are perpetual and will not be revoked by IMS GLC or its successors or assigns. THIS SPECIFICATION IS BEING OFFERED WITHOUT ANY WARRANTY WHATSOEVER, AND IN PARTICULAR, ANY WARRANTY OF NONINFRINGEMENT IS EXPRESSLY DISCLAIMED. ANY USE OF THIS SPECIFICATION SHALL BE MADE ENTIRELY AT THE IMPLEMENTERS OWN RISK, AND NEITHER THE CONSORTIUM NOR ANY OF ITS MEMBERS OR SUBMITTERS, SHALL HAVE ANY LIABILITY WHATSOEVER TO ANY IMPLEMENTER OR THIRD PARTY FOR ANY DAMAGES OF ANY NATURE WHATSOEVER, DIRECTLY OR INDIRECTLY, ARISING FROM THE USE OF THIS SPECIFICATION. Source UML File Information --------------------------- The source file information must be supplied as an XMI file (without diagram layout information). The supported UML authoring tools are: (a) Poseidon – v6 (and later) Source XSLT File Information ---------------------------- XSL Generator: UMLtoXSDTransformv0p9.xsl XSLT Processor: Xalan Release: 1.0 Beta 3 Date: 31st May, 2009 IMS GLC Auto-generation Binding Tool-kit (I-BAT) ------------------------------------------------ This file was auto-generated using the IMS GLC Binding Auto-generation Tool-kit (I-BAT). While every attempt has been made to ensure that this tool auto-generates the files correctly, users should be aware that this is an experimental tool. Permission is given to make use of this tool. IMS GLC makes no claim on the materials created by third party users of this tool. Details on how to use this tool are contained in the IMS GLC "I-BAT" Documentation available at the IMS GLC web-site. Tool Copyright: 2005-2010 (c) IMS Global Learning Consortium Inc. All Rights Reserved. Any namespaced element from any namespace may be included within an "any" element. The namespace for the imported element must be defined in the instance, and the schema must be imported. The extension has a definition of "strict" i.e. they must have their own namespace. The WebLink complexType for the associated object. The URL for the web link. schemas11/ccv1p1_imsccauth_v1p1.xsd000064400000031246152266437620013100 0ustar00 XSD Data File Information ------------------------- Author: Colin Smythe Date: 31st August, 2010 Version: 1.1 Status: Final Description: This is the IMS GLC Authorization Data Model for the Common Cartridge. History: Version 1.0 - the first release of this data model; Version 1.1 - updates made to the namespace. License: IPR, License and Distribution Notices This machine readable file is derived from IMS Global Learning Consortium (GLC) specification IMS Common Cartridge Version 1.1 found at http://www.imsglobal.org/cc and the original IMS GLC schema binding or code base http://www.imsglobal.org/cc. Recipients of this document are requested to submit, with their comments, notification of any relevant patent claims or other intellectual property rights of which they may be aware that might be infringed by the schema binding contained in this document. IMS GLC takes no position regarding the validity or scope of any intellectual property or other rights that might be claimed to pertain to the implementation or use of the technology described in this document or the extent to which any license under such rights might or might not be available; neither does it represent that it has made any effort to identify any such rights. Information on IMS GLCs procedures with respect to rights in IMS GLC specifications can be found at the IMS GLC Intellectual Property Rights web page: http://www.imsglobal.org/ipr/imsipr_policyFinal.pdf. Copyright (c) IMS Global Learning Consortium 1999-2011. All Rights Reserved. License Notice for Users Users of products or services that include this document are hereby granted a worldwide, royalty-free, non-exclusive license to use this document. Distribution Notice for Developers Developers of products or services that are not original incorporators of this document and have not changed this document, that is, are distributing a software product that incorporates this document as is from a third-party source other than IMS, are hereby granted permission to copy, display and distribute the contents of this document in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof. Developers of products or services that are original incorporators of this document and wish to provide distribution of this document as is or with modifications and developers of products and services that are not original incorporators of this document and have changed this document, are required to register with the IMS GLC community on the IMS GLC website as described in the following two paragraphs:- * If you wish to distribute this document as is, with no modifications, you are hereby granted permission to copy, display and distribute the contents of this document in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof, that you make and you complete a valid license registration with IMS and receive an email from IMS granting the license. To register, follow the instructions on the IMS website: http://www.imsglobal.org/specificationdownload.cfm. Once registered you are granted permission to transfer unlimited distribution rights of this document for the purposes of third-party or other distribution of your product or service that incorporates this document as long as this IPR, License and Distribution notice remains in place in its entirety; * If you wish to create and distribute a derived work from this document, you are hereby granted permission to copy, display and distribute the contents of the derived work in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof, that you make and you complete a valid profile registration with IMS GLC and receive an email from IMS GLC granting the license. To register, follow the instructions on the IMS GLC website: http://www.imsglobal.org/profile/. Once registered you are granted permission to transfer unlimited distribution rights of the derived work for the purposes of third-party or other distribution of your product or service that incorporates the derived work as long as this IPR, License and Distribution notice remains in place in its entirety. The limited permissions granted above are perpetual and will not be revoked by IMS GLC or its successors or assigns. THIS SPECIFICATION IS BEING OFFERED WITHOUT ANY WARRANTY WHATSOEVER, AND IN PARTICULAR, ANY WARRANTY OF NONINFRINGEMENT IS EXPRESSLY DISCLAIMED. ANY USE OF THIS SPECIFICATION SHALL BE MADE ENTIRELY AT THE IMPLEMENTERS OWN RISK, AND NEITHER THE CONSORTIUM NOR ANY OF ITS MEMBERS OR SUBMITTERS, SHALL HAVE ANY LIABILITY WHATSOEVER TO ANY IMPLEMENTER OR THIRD PARTY FOR ANY DAMAGES OF ANY NATURE WHATSOEVER, DIRECTLY OR INDIRECTLY, ARISING FROM THE USE OF THIS SPECIFICATION. Source UML File Information --------------------------- The source file information must be supplied as an XMI file (without diagram layout information). The supported UML authoring tools are: (a) Poseidon – v6 (and later) Source XSLT File Information ---------------------------- XSL Generator: UMLtoXSDTransformv0p9.xsl XSLT Processor: Xalan Release: 1.0 Beta 3 Date: 31st May, 2009 IMS GLC Auto-generation Binding Tool-kit (I-BAT) ------------------------------------------------ This file was auto-generated using the IMS GLC Binding Auto-generation Tool-kit (I-BAT). While every attempt has been made to ensure that this tool auto-generates the files correctly, users should be aware that this is an experimental tool. Permission is given to make use of this tool. IMS GLC makes no claim on the materials created by third party users of this tool. Details on how to use this tool are contained in the IMS GLC "I-BAT" Documentation available at the IMS GLC web-site. Tool Copyright: 2005-2010 (c) IMS Global Learning Consortium Inc. All Rights Reserved. Any namespaced element from any namespace may be included within an "any" element. The namespace for the imported element must be defined in the instance, and the schema must be imported. The extension has a definition of "strict" i.e. they must have their own namespace. The set of authorizations for the associated object. The authorization detail for the cartridge in terms of the web service. schemas11/ccv1p1_imsdt_v1p1.xsd000064400000032377152266437620012246 0ustar00 XSD Data File Information ------------------------- Author: Colin Smythe Date: 31st August, 2010 Version: 1.1 Status: Final Description: This is the IMS GLC Discussion Topics Data Model for the Common Cartridge. History: Version 1.0 - the first release of this data model; Version 1.1 - updates made to the namespace. License: IPR, License and Distribution Notices This machine readable file is derived from IMS Global Learning Consortium (GLC) specification IMS Common Cartridge Version 1.1 found at http://www.imsglobal.org/cc and the original IMS GLC schema binding or code base http://www.imsglobal.org/cc. Recipients of this document are requested to submit, with their comments, notification of any relevant patent claims or other intellectual property rights of which they may be aware that might be infringed by the schema binding contained in this document. IMS GLC takes no position regarding the validity or scope of any intellectual property or other rights that might be claimed to pertain to the implementation or use of the technology described in this document or the extent to which any license under such rights might or might not be available; neither does it represent that it has made any effort to identify any such rights. Information on IMS GLCs procedures with respect to rights in IMS GLC specifications can be found at the IMS GLC Intellectual Property Rights web page: http://www.imsglobal.org/ipr/imsipr_policyFinal.pdf. Copyright (c) IMS Global Learning Consortium 1999-2011. All Rights Reserved. License Notice for Users Users of products or services that include this document are hereby granted a worldwide, royalty-free, non-exclusive license to use this document. Distribution Notice for Developers Developers of products or services that are not original incorporators of this document and have not changed this document, that is, are distributing a software product that incorporates this document as is from a third-party source other than IMS, are hereby granted permission to copy, display and distribute the contents of this document in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof. Developers of products or services that are original incorporators of this document and wish to provide distribution of this document as is or with modifications and developers of products and services that are not original incorporators of this document and have changed this document, are required to register with the IMS GLC community on the IMS GLC website as described in the following two paragraphs:- * If you wish to distribute this document as is, with no modifications, you are hereby granted permission to copy, display and distribute the contents of this document in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof, that you make and you complete a valid license registration with IMS and receive an email from IMS granting the license. To register, follow the instructions on the IMS website: http://www.imsglobal.org/specificationdownload.cfm. Once registered you are granted permission to transfer unlimited distribution rights of this document for the purposes of third-party or other distribution of your product or service that incorporates this document as long as this IPR, License and Distribution notice remains in place in its entirety; * If you wish to create and distribute a derived work from this document, you are hereby granted permission to copy, display and distribute the contents of the derived work in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof, that you make and you complete a valid profile registration with IMS GLC and receive an email from IMS GLC granting the license. To register, follow the instructions on the IMS GLC website: http://www.imsglobal.org/profile/. Once registered you are granted permission to transfer unlimited distribution rights of the derived work for the purposes of third-party or other distribution of your product or service that incorporates the derived work as long as this IPR, License and Distribution notice remains in place in its entirety. The limited permissions granted above are perpetual and will not be revoked by IMS GLC or its successors or assigns. THIS SPECIFICATION IS BEING OFFERED WITHOUT ANY WARRANTY WHATSOEVER, AND IN PARTICULAR, ANY WARRANTY OF NONINFRINGEMENT IS EXPRESSLY DISCLAIMED. ANY USE OF THIS SPECIFICATION SHALL BE MADE ENTIRELY AT THE IMPLEMENTERS OWN RISK, AND NEITHER THE CONSORTIUM NOR ANY OF ITS MEMBERS OR SUBMITTERS, SHALL HAVE ANY LIABILITY WHATSOEVER TO ANY IMPLEMENTER OR THIRD PARTY FOR ANY DAMAGES OF ANY NATURE WHATSOEVER, DIRECTLY OR INDIRECTLY, ARISING FROM THE USE OF THIS SPECIFICATION. Source UML File Information --------------------------- The source file information must be supplied as an XMI file (without diagram layout information). The supported UML authoring tools are: (a) Poseidon – v6 (and later) Source XSLT File Information ---------------------------- XSL Generator: UMLtoXSDTransformv0p9.xsl XSLT Processor: Xalan Release: 1.0 Beta 3 Date: 31st May, 2009 IMS GLC Auto-generation Binding Tool-kit (I-BAT) ------------------------------------------------ This file was auto-generated using the IMS GLC Binding Auto-generation Tool-kit (I-BAT). While every attempt has been made to ensure that this tool auto-generates the files correctly, users should be aware that this is an experimental tool. Permission is given to make use of this tool. IMS GLC makes no claim on the materials created by third party users of this tool. Details on how to use this tool are contained in the IMS GLC "I-BAT" Documentation available at the IMS GLC web-site. Tool Copyright: 2005-2010 (c) IMS Global Learning Consortium Inc. All Rights Reserved. Any namespaced element from any namespace may be included within an "any" element. The namespace for the imported element must be defined in the instance, and the schema must be imported. The extension has a definition of "strict" i.e. they must have their own namespace. The Topic complexType for the discussion topic object. The Text for the discussion topic. entity.forum.class.php000064400000014506152266437620011047 0ustar00. /** * @package moodlecore * @subpackage backup-imscc * @copyright 2009 Mauro Rondinelli (mauro.rondinelli [AT] uvcms.com) * @copyright 2011 Darko Miletic (dmiletic@moodlerooms.com) * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.'); class cc_forum extends entities { public function full_path($path, $dir_sep = DIRECTORY_SEPARATOR) { $token = '$IMS-CC-FILEBASE$'; $path = str_replace($token, '', $path); if (is_string($path) && ($path != '')) { $dir_sep; $dot_dir = '.'; $up_dir = '..'; $length = strlen($path); $rtemp = trim($path); $start = strrpos($path, $dir_sep); $can_continue = ($start !== false); $result = $can_continue ? '' : $path; $rcount = 0; while ($can_continue) { $dir_part = ($start !== false) ? substr($rtemp, $start + 1, $length - $start) : $rtemp; $can_continue = ($dir_part !== false); if ($can_continue) { if ($dir_part != $dot_dir) { if ($dir_part == $up_dir) { $rcount++; } else { if ($rcount > 0) { $rcount --; } else { $result = ($result == '') ? $dir_part : $dir_part . $dir_sep . $result; } } } $rtemp = substr($path, 0, $start); $start = strrpos($rtemp, $dir_sep); $can_continue = (($start !== false) || (strlen($rtemp) > 0)); } } } return $result; } public function generate_node() { cc2moodle::log_action('Creating Forum mods'); $response = ''; if (!empty(cc2moodle::$instances['instances'][MOODLE_TYPE_FORUM])) { foreach (cc2moodle::$instances['instances'][MOODLE_TYPE_FORUM] as $instance) { $response .= $this->create_node_course_modules_mod_forum($instance); } } return $response; } private function create_node_course_modules_mod_forum($instance) { $sheet_mod_forum = cc2moodle::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_FORUM); $topic_data = $this->get_topic_data($instance); $result = ''; if (!empty($topic_data)) { $find_tags = array('[#mod_instance#]', '[#mod_forum_title#]', '[#mod_forum_intro#]', '[#date_now#]'); $replace_values = array($instance['instance'], //To be more true to the actual forum name we use only forum title self::safexml($topic_data['title']), self::safexml($topic_data['description']), time()); $result = str_replace($find_tags, $replace_values, $sheet_mod_forum); } return $result; } public function get_topic_data($instance) { $topic_data = array(); $topic_file = $this->get_external_xml($instance['resource_indentifier']); if (!empty($topic_file)) { $topic_file_path = cc2moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . $topic_file; $topic_file_dir = dirname($topic_file_path); $topic = $this->load_xml_resource($topic_file_path); if (!empty($topic)) { $xpath = cc2moodle::newx_path($topic, cc2moodle::getforumns()); $topic_title = $xpath->query('/dt:topic/title'); $topic_title = !empty($topic_title->item(0)->nodeValue) ? $topic_title->item(0)->nodeValue : 'Untitled Topic'; $topic_text = $xpath->query('/dt:topic/text'); $topic_text = !empty($topic_text->item(0)->nodeValue) ? $this->update_sources($topic_text->item(0)->nodeValue, dirname($topic_file)) : ''; $topic_text = !empty($topic_text) ? str_replace("%24", "\$", $this->include_titles($topic_text)) : ''; if (!empty($topic_title)) { $topic_data['title'] = $topic_title; $topic_data['description'] = $topic_text; } } $topic_attachments = $xpath->query('/dt:topic/attachments/attachment/@href'); if ($topic_attachments->length > 0) { $attachment_html = ''; foreach ($topic_attachments as $file) { $attachment_html .= $this->generate_attachment_html($this->full_path($file->nodeValue,'/')); } $topic_data['description'] = !empty($attachment_html) ? $topic_text . '

Attachments:

' . $attachment_html : $topic_text; } } return $topic_data; } private function generate_attachment_html($filename) { $images_extensions = array('gif' , 'jpeg' , 'jpg' , 'jif' , 'jfif' , 'png' , 'bmp'); $fileinfo = pathinfo($filename); if (in_array($fileinfo['extension'], $images_extensions)) { return '' . $fileinfo['basename'] . '
'; } else { return '' . $fileinfo['basename'] . '
'; } return ''; } } cc112moodle.php000064400000022404152266437620007305 0ustar00. /** * @package moodlecore * @subpackage backup-imscc * @copyright 2011 Darko Miletic (dmiletic@moodlerooms.com) * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.'); require_once($CFG->dirroot . '/backup/cc/cc2moodle.php'); require_once($CFG->dirroot . '/backup/cc/entities11.class.php'); require_once($CFG->dirroot . '/backup/cc/entity11.resource.class.php'); require_once($CFG->dirroot . '/backup/cc/entity11.forum.class.php'); require_once($CFG->dirroot . '/backup/cc/entity11.quiz.class.php'); require_once($CFG->dirroot . '/backup/cc/entity11.lti.class.php'); class cc112moodle extends cc2moodle { const CC_TYPE_FORUM = 'imsdt_xmlv1p1'; const CC_TYPE_QUIZ = 'imsqti_xmlv1p2/imscc_xmlv1p1/assessment'; const CC_TYPE_QUESTION_BANK = 'imsqti_xmlv1p2/imscc_xmlv1p1/question-bank'; const CC_TYPE_WEBLINK = 'imswl_xmlv1p1'; const CC_TYPE_ASSOCIATED_CONTENT = 'associatedcontent/imscc_xmlv1p1/learning-application-resource'; const CC_TYPE_BASICLTI = 'imsbasiclti_xmlv1p0'; public static $namespaces = array('imscc' => 'http://www.imsglobal.org/xsd/imsccv1p1/imscp_v1p1', 'lomimscc' => 'http://ltsc.ieee.org/xsd/imsccv1p1/LOM/manifest', 'lom' => 'http://ltsc.ieee.org/xsd/imsccv1p1/LOM/resource', 'xsi' => 'http://www.w3.org/2001/XMLSchema-instance', 'cc' => 'http://www.imsglobal.org/xsd/imsccv1p1/imsccauth_v1p1'); public static $restypes = array('associatedcontent/imscc_xmlv1p1/learning-application-resource', 'webcontent'); public static $forumns = array('dt' => 'http://www.imsglobal.org/xsd/imsccv1p1/imsdt_v1p1'); public static $quizns = array('xmlns' => 'http://www.imsglobal.org/xsd/ims_qtiasiv1p2'); public static $resourcens = array('wl' => 'http://www.imsglobal.org/xsd/imsccv1p1/imswl_v1p1'); public static $basicltins = array( 'xmlns' => 'http://www.imsglobal.org/xsd/imslticc_v1p0', 'blti' => 'http://www.imsglobal.org/xsd/imsbasiclti_v1p0', 'lticm' => 'http://www.imsglobal.org/xsd/imslticm_v1p0', 'lticp' => 'http://www.imsglobal.org/xsd/imslticp_v1p0' ); public function __construct($path_to_manifest) { parent::__construct($path_to_manifest); } public function generate_moodle_xml() { global $CFG; $cdir = static::$path_to_manifest_folder . DIRECTORY_SEPARATOR . 'course_files'; if (!file_exists($cdir)) { mkdir($cdir, $CFG->directorypermissions, true); } $sheet_base = static::loadsheet(SHEET_BASE); // MOODLE_BACKUP / INFO / DETAILS / MOD $node_info_details_mod = $this->create_code_info_details_mod(); // MOODLE_BACKUP / BLOCKS / BLOCK $node_course_blocks_block = $this->create_node_course_blocks_block(); // MOODLE_BACKUP / COURSES / SECTIONS / SECTION $node_course_sections_section = $this->create_node_course_sections_section(); // MOODLE_BACKUP / COURSES / QUESTION_CATEGORIES $node_course_question_categories = $this->create_node_question_categories(); // MOODLE_BACKUP / COURSES / MODULES / MOD $node_course_modules_mod = $this->create_node_course_modules_mod(); // MOODLE_BACKUP / COURSE / HEADER $node_course_header = $this->create_node_course_header(); // GENERAL INFO $filename = optional_param('file', 'not_available.zip', PARAM_RAW); $filename = basename($filename); $www_root = $CFG->wwwroot; $find_tags = array('[#zip_filename#]', '[#www_root#]', '[#node_course_header#]', '[#node_info_details_mod#]', '[#node_course_blocks_block#]', '[#node_course_sections_section#]', '[#node_course_question_categories#]', '[#node_course_modules#]'); $replace_values = array($filename, $www_root, $node_course_header, $node_info_details_mod, $node_course_blocks_block, $node_course_sections_section, $node_course_question_categories, $node_course_modules_mod); $result_xml = str_replace($find_tags, $replace_values, $sheet_base); // COPY RESOURSE FILES $entities = new entities11(); $entities->move_all_files(); if (array_key_exists("index", self::$instances)) { if (!file_put_contents(static::$path_to_manifest_folder . DIRECTORY_SEPARATOR . 'moodle.xml', $result_xml)) { static::log_action('Cannot save the moodle manifest file: ' . static::$path_to_manifest_folder . DIRECTORY_SEPARATOR . 'moodle.xml', true); } else { $status = true; } } else { $status = false; static::log_action('The course is empty', false); } return $status; } public function convert_to_moodle_type($cc_type) { $type = parent::convert_to_moodle_type($cc_type); if ($type == TYPE_UNKNOWN) { if ($cc_type == static::CC_TYPE_BASICLTI) { $type = MOODLE_TYPE_LTI; } } return $type; } protected function create_node_question_categories() { $quiz = new cc11_quiz(); static::log_action('Creating node: QUESTION_CATEGORIES'); $node_course_question_categories = $quiz->generate_node_question_categories(); return $node_course_question_categories; } protected function create_code_info_details_mod() { $result = parent::create_code_info_details_mod(); $count_blti = $this->count_instances(MOODLE_TYPE_LTI); $sheet_info_details_mod_instances_instance = static::loadsheet(SHEET_INFO_DETAILS_MOD_INSTANCE); $blti_mod = ''; if ($count_blti > 0) { $blti_instance = $this->create_mod_info_details_mod_instances_instance($sheet_info_details_mod_instances_instance, $count_blti, static::$instances['instances'][MOODLE_TYPE_LTI]); $blti_mod = $blti_instance ? $this->create_mod_info_details_mod(MOODLE_TYPE_LTI, $blti_instance) : ''; } return $result . $blti_mod; } /** * (non-PHPdoc) * @see cc2moodle::get_module_visible() */ protected function get_module_visible($identifier) { //Should item be hidden or not $mod_visible = 1; if (!empty($identifier)) { $xpath = static::newx_path(static::$manifest, static::$namespaces); $query = '/imscc:manifest/imscc:resources/imscc:resource[@identifier="' . $identifier . '"]'; $query .= '//lom:intendedEndUserRole/lom:value'; $intendeduserrole = $xpath->query($query); if (!empty($intendeduserrole) && ($intendeduserrole->length > 0)) { $role = trim($intendeduserrole->item(0)->nodeValue); if ((strcasecmp('Instructor', $role) === 0) || (strcasecmp('Mentor', $role) === 0)) { $mod_visible = 0; } } } return $mod_visible; } protected function create_node_course_modules_mod() { $labels = new cc_label(); $resources = new cc11_resource(); $forums = new cc11_forum(); $quiz = new cc11_quiz(); $basiclti = new cc11_lti(); static::log_action('Creating node: COURSE/MODULES/MOD'); // LABELS $node_course_modules_mod_label = $labels->generate_node(); // RESOURCES (WEB CONTENT AND WEB LINK) $node_course_modules_mod_resource = $resources->generate_node(); // FORUMS $node_course_modules_mod_forum = $forums->generate_node(); // QUIZ $node_course_modules_mod_quiz = $quiz->generate_node_course_modules_mod(); //BasicLTI $node_course_modules_mod_basiclti = $basiclti->generate_node(); $node_course_modules = $node_course_modules_mod_label. $node_course_modules_mod_resource . $node_course_modules_mod_forum . $node_course_modules_mod_quiz . $node_course_modules_mod_basiclti; return $node_course_modules; } } entity11.quiz.class.php000064400000130125152266437620011045 0ustar00. /** * @package moodlecore * @subpackage backup-imscc * @copyright 2009 Mauro Rondinelli (mauro.rondinelli [AT] uvcms.com) * @copyright 2011 Darko Miletic * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.'); class cc11_quiz extends entities11 { public function generate_node_question_categories() { $instances = $this->generate_instances(); $node_course_question_categories = $this->create_node_course_question_categories($instances); $node_course_question_categories = empty($node_course_question_categories) ? '' : $node_course_question_categories; return $node_course_question_categories; } public function generate_node_course_modules_mod() { cc112moodle::log_action('Creating Quiz mods'); $node_course_modules_mod = ''; $instances = $this->generate_instances(); if (!empty($instances)) { foreach ($instances as $instance) { if ($instance['is_question_bank'] == 0) { $node_course_modules_mod .= $this->create_node_course_modules_mod($instance); } } } return $node_course_modules_mod; } private function create_node_course_modules_mod_quiz_feedback() { $sheet_question_mod_feedback = cc112moodle::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_QUIZ_FEEDBACK); return $sheet_question_mod_feedback; } private function generate_instances() { $last_instance_id = 0; $last_question_id = 0; $last_answer_id = 0; $instances = array(); $types = array(MOODLE_TYPE_QUIZ, MOODLE_TYPE_QUESTION_BANK); foreach ($types as $type) { if (!empty(cc112moodle::$instances['instances'][$type])) { foreach (cc112moodle::$instances['instances'][$type] as $instance) { if ($type == MOODLE_TYPE_QUIZ) { $is_question_bank = 0; } else { $is_question_bank = 1; } $assessment_file = $this->get_external_xml($instance['resource_indentifier']); if (!empty($assessment_file)) { $assessment = $this->load_xml_resource(cc112moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . $assessment_file); if (!empty($assessment)) { $replace_values = array('unlimited' => 0); $questions = $this->get_questions($assessment, $last_question_id, $last_answer_id, dirname($assessment_file), $is_question_bank); $question_count = count($questions); if (!empty($question_count)) { $last_instance_id++; $instances[$instance['resource_indentifier']]['questions'] = $questions; $instances[$instance['resource_indentifier']]['id'] = $last_instance_id; $instances[$instance['resource_indentifier']]['title'] = $instance['title']; $instances[$instance['resource_indentifier']]['is_question_bank'] = $is_question_bank; $instances[$instance['resource_indentifier']]['options']['timelimit'] = $this->get_global_config($assessment, 'qmd_timelimit', 0); $instances[$instance['resource_indentifier']]['options']['max_attempts'] = $this->get_global_config($assessment, 'cc_maxattempts', 0, $replace_values); } } } } } } return $instances; } private function create_node_course_modules_mod($instance) { $sheet_question_mod = cc112moodle::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_QUIZ); $node_course_modules_quiz_question_instances = $this->create_node_course_modules_mod_quiz_question_instances($instance); $node_course_modules_quiz_feedback = $this->create_node_course_modules_mod_quiz_feedback($instance); $questions_strings = $this->get_questions_string($instance); $quiz_stamp = 'localhost+' . time() . '+' . $this->generate_random_string(6); $find_tags = array('[#mod_id#]', '[#mod_name#]', '[#mod_intro#]', '[#mod_stamp#]', '[#question_string#]', '[#date_now#]', '[#mod_max_attempts#]', '[#mod_timelimit#]', '[#node_question_instance#]', '[#node_questions_feedback#]'); $replace_values = array($instance['id'], self::safexml($instance['title']), self::safexml($instance['title']), self::safexml($quiz_stamp), self::safexml($questions_strings), time(), $instance['options']['max_attempts'], $instance['options']['timelimit'], $node_course_modules_quiz_question_instances, $node_course_modules_quiz_feedback); //this one has tags $node_question_mod = str_replace($find_tags, $replace_values, $sheet_question_mod); return $node_question_mod; } private function get_global_config($assessment, $option, $default_value, $replace_values = '') { $xpath = cc112moodle::newx_path($assessment, cc112moodle::getquizns()); $metadata = $xpath->query('/xmlns:questestinterop/xmlns:assessment/xmlns:qtimetadata/xmlns:qtimetadatafield'); foreach ($metadata as $field) { $field_label = $xpath->query('xmlns:fieldlabel', $field); $field_label = !empty($field_label->item(0)->nodeValue) ? $field_label->item(0)->nodeValue : ''; if (strtolower($field_label) == strtolower($option)) { $field_entry = $xpath->query('xmlns:fieldentry', $field); $response = !empty($field_entry->item(0)->nodeValue) ? $field_entry->item(0)->nodeValue : ''; } } $response = !empty($response) ? trim($response) : ''; if (!empty($replace_values)) { foreach ($replace_values as $key => $value) { $response = ($key == $response) ? $value : $response; } } $response = empty($response) ? $default_value : $response; return $response; } private function create_node_course_modules_mod_quiz_question_instances($instance) { $node_course_module_mod_quiz_questions_instances = ''; $sheet_question_mod_instance = cc112moodle::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_QUIZ_QUESTION_INSTANCE); $find_tags = array('[#question_id#]' , '[#instance_id#]'); if (!empty($instance['questions'])) { foreach ($instance['questions'] as $question) { $replace_values = array($question['id'] , $question['id']); $node_course_module_mod_quiz_questions_instances .= str_replace($find_tags, $replace_values, $sheet_question_mod_instance); } $node_course_module_mod_quiz_questions_instances = str_replace($find_tags, $replace_values, $node_course_module_mod_quiz_questions_instances); } return $node_course_module_mod_quiz_questions_instances; } private function get_questions_string($instance) { $questions_string = ''; if (!empty($instance['questions'])) { foreach ($instance['questions'] as $question) { $questions_string .= $question['id'] . ','; } } $questions_string = !empty($questions_string) ? substr($questions_string, 0, strlen($questions_string) - 1) : ''; return $questions_string; } private function create_node_course_question_categories($instances) { $sheet_question_categories = cc112moodle::loadsheet(SHEET_COURSE_QUESTION_CATEGORIES); if (!empty($instances)) { $node_course_question_categories_question_category = ''; foreach ($instances as $instance) { $node_course_question_categories_question_category .= $this->create_node_course_question_categories_question_category($instance); } $find_tags = array('[#node_course_question_categories_question_category#]'); $replace_values = array($node_course_question_categories_question_category); $node_course_question_categories = str_replace($find_tags, $replace_values, $sheet_question_categories); } $node_course_question_categories = empty($node_course_question_categories) ? '' : $node_course_question_categories; return $node_course_question_categories; } private function create_node_course_question_categories_question_category($instance) { $sheet_question_categories_quetion_category = cc112moodle::loadsheet(SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY); $find_tags = array('[#quiz_id#]', '[#quiz_name#]', '[#quiz_stamp#]', '[#node_course_question_categories_question_category_questions#]'); $node_course_question_categories_questions = $this->create_node_course_question_categories_question_category_question($instance); $node_course_question_categories_questions = empty($node_course_question_categories_questions) ? '' : $node_course_question_categories_questions; $quiz_stamp = 'localhost+' . time() . '+' . $this->generate_random_string(6); $replace_values = array($instance['id'], self::safexml($instance['title']), $quiz_stamp, $node_course_question_categories_questions); $node_question_categories = str_replace($find_tags, $replace_values, $sheet_question_categories_quetion_category); return $node_question_categories; } private function create_node_course_question_categories_question_category_question($instance) { global $USER; $node_course_question_categories_question = ''; $find_tags = array('[#question_id#]', '[#question_title#]', '[#question_text#]', '[#question_type#]', '[#question_general_feedback#]', '[#question_defaultgrade#]', '[#date_now#]', '[#question_type_nodes#]', '[#question_stamp#]', '[#question_version#]', '[#logged_user#]'); $sheet_question_categories_question = cc112moodle::loadsheet(SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY_QUESTION); $questions = $instance['questions']; if (!empty($questions)) { foreach ($questions as $question) { $quiz_stamp = 'localhost+' . time() . '+' . $this->generate_random_string(6); $quiz_version = 'localhost+' . time() . '+' . $this->generate_random_string(6); $question_moodle_type = $question['moodle_type']; $question_cc_type = $question['cc_type']; $question_type_node = ''; $question_type_node = ($question_moodle_type == MOODLE_QUIZ_MULTIPLE_CHOICE) ? $this->create_node_course_question_categories_question_category_question_multiple_choice($question) : $question_type_node; $question_type_node = ($question_moodle_type == MOODLE_QUIZ_TRUE_FALSE) ? $this->create_node_course_question_categories_question_category_question_true_false($question) : $question_type_node; $question_type_node = ($question_moodle_type == MOODLE_QUIZ_ESSAY) ? $this->create_node_course_question_categories_question_category_question_eesay($question) : $question_type_node; $question_type_node = ($question_moodle_type == MOODLE_QUIZ_SHORTANSWER) ? $this->create_node_course_question_categories_question_category_question_shortanswer($question) : $question_type_node; $questionname = !empty($question['name']) ? self::safexml($question['name']) : self::safexml($this->truncate_text($question['title'], 255, true)); $replace_values = array($question['id'], $questionname, self::safexml($question['title']), $question_moodle_type, self::safexml($question['feedback']), $question['defaultgrade'], time(), $question_type_node, $quiz_stamp, $quiz_version, $USER->id); $node_course_question_categories_question .= str_replace($find_tags, $replace_values, $sheet_question_categories_question); } } $node_course_question_categories_question = empty($node_course_question_categories_question) ? '' : $node_course_question_categories_question; return $node_course_question_categories_question; } private function get_questions($assessment, &$last_question_id, &$last_answer_id, $root_path, $is_question_bank) { $questions = array(); $xpath = cc112moodle::newx_path($assessment, cc112moodle::getquizns()); if (!$is_question_bank) { $questions_items = $xpath->query('/xmlns:questestinterop/xmlns:assessment/xmlns:section/xmlns:item'); } else { $questions_items = $xpath->query('/xmlns:questestinterop/xmlns:objectbank/xmlns:item'); } foreach ($questions_items as $question_item) { $count_questions = $xpath->evaluate('count(xmlns:presentation/xmlns:flow/xmlns:material/xmlns:mattext)', $question_item); if ($count_questions == 0) { $question_title = $xpath->query('xmlns:presentation/xmlns:material/xmlns:mattext', $question_item); } else { $question_title = $xpath->query('xmlns:presentation/xmlns:flow/xmlns:material/xmlns:mattext', $question_item); } $question_title = !empty($question_title->item(0)->nodeValue) ? $question_title->item(0)->nodeValue : ''; $question_identifier = $xpath->query('@ident', $question_item); $question_identifier = !empty($question_identifier->item(0)->nodeValue) ? $question_identifier->item(0)->nodeValue : ''; if (!empty($question_identifier)) { $question_type = $this->get_question_type($question_identifier, $assessment); if (!empty($question_type['moodle'])) { $last_question_id++; $questions[$question_identifier]['id'] = $last_question_id; $question_title = $this->update_sources($question_title, $root_path); $question_title = !empty($question_title) ? str_replace("%24", "\$", $this->include_titles($question_title)) : ''; // This attribute is not IMSCC spec, but it is included in Moodle 2.x export of IMS1.1 $questionname = $xpath->query('@title', $question_item); $questionname = !empty($questionname->item(0)->nodeValue) ? $questionname->item(0)->nodeValue : ''; $questions[$question_identifier]['title'] = $question_title; $questions[$question_identifier]['name'] = $questionname; $questions[$question_identifier]['identifier'] = $question_identifier; $questions[$question_identifier]['moodle_type'] = $question_type['moodle']; $questions[$question_identifier]['cc_type'] = $question_type['cc']; $questions[$question_identifier]['feedback'] = $this->get_general_feedback($assessment, $question_identifier); $questions[$question_identifier]['defaultgrade'] = $this->get_defaultgrade($assessment, $question_identifier); $questions[$question_identifier]['answers'] = $this->get_answers($question_identifier, $assessment, $last_answer_id); } } } $questions = !empty($questions) ? $questions : ''; return $questions; } private function str_replace_once($search, $replace, $subject) { $first_char = strpos($subject, $search); if ($first_char !== false) { $before_str = substr($subject, 0, $first_char); $after_str = substr($subject, $first_char + strlen($search)); return $before_str . $replace . $after_str; } else { return $subject; } } private function get_defaultgrade($assessment, $question_identifier) { $result = 1; $xpath = cc2moodle::newx_path($assessment, cc2moodle::getquizns()); $query = '//xmlns:item[@ident="' . $question_identifier . '"]'; $query .= '//xmlns:qtimetadatafield[xmlns:fieldlabel="cc_weighting"]/xmlns:fieldentry'; $defgrade = $xpath->query($query); if (!empty($defgrade) && ($defgrade->length > 0)) { $resp = (int)$defgrade->item(0)->nodeValue; if ($resp >= 0 && $resp <= 99) { $result = $resp; } } return $result; } private function get_general_feedback($assessment, $question_identifier) { $xpath = cc112moodle::newx_path($assessment, cc112moodle::getquizns()); $respconditions = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:resprocessing/xmlns:respcondition'); if (!empty($respconditions)) { foreach ($respconditions as $respcondition) { $continue = $respcondition->getAttributeNode('continue'); $continue = !empty($continue->nodeValue) ? strtolower($continue->nodeValue) : ''; if ($continue == 'yes') { $display_feedback = $xpath->query('xmlns:displayfeedback', $respcondition); if (!empty($display_feedback)) { foreach ($display_feedback as $feedback) { $feedback_identifier = $feedback->getAttributeNode('linkrefid'); $feedback_identifier = !empty($feedback_identifier->nodeValue) ? $feedback_identifier->nodeValue : ''; if (!empty($feedback_identifier)) { $feedbacks_identifiers[] = $feedback_identifier; } } } } } } $feedback = ''; $feedbacks_identifiers = empty($feedbacks_identifiers) ? '' : $feedbacks_identifiers; if (!empty($feedbacks_identifiers)) { foreach ($feedbacks_identifiers as $feedback_identifier) { $feedbacks = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:itemfeedback[@ident="' . $feedback_identifier . '"]/xmlns:flow_mat/xmlns:material/xmlns:mattext'); $feedback .= !empty($feedbacks->item(0)->nodeValue) ? $feedbacks->item(0)->nodeValue . ' ' : ''; } } return $feedback; } private function get_feedback($assessment, $identifier, $item_identifier, $question_type) { $xpath = cc112moodle::newx_path($assessment, cc112moodle::getquizns()); $resource_processing = $xpath->query('//xmlns:item[@ident="' . $item_identifier . '"]/xmlns:resprocessing/xmlns:respcondition'); if (!empty($resource_processing)) { foreach ($resource_processing as $response) { $varequal = $xpath->query('xmlns:conditionvar/xmlns:varequal', $response); $varequal = !empty($varequal->item(0)->nodeValue) ? $varequal->item(0)->nodeValue : ''; if (strtolower($varequal) == strtolower($identifier) || ($question_type == CC_QUIZ_ESSAY)) { $display_feedback = $xpath->query('xmlns:displayfeedback', $response); if (!empty($display_feedback)) { foreach ($display_feedback as $feedback) { $feedback_identifier = $feedback->getAttributeNode('linkrefid'); $feedback_identifier = !empty($feedback_identifier->nodeValue) ? $feedback_identifier->nodeValue : ''; if (!empty($feedback_identifier)) { $feedbacks_identifiers[] = $feedback_identifier; } } } } } } $feedback = ''; $feedbacks_identifiers = empty($feedbacks_identifiers) ? '' : $feedbacks_identifiers; if (!empty($feedbacks_identifiers)) { foreach ($feedbacks_identifiers as $feedback_identifier) { $feedbacks = $xpath->query('//xmlns:item[@ident="' . $item_identifier . '"]/xmlns:itemfeedback[@ident="' . $feedback_identifier . '"]/xmlns:flow_mat/xmlns:material/xmlns:mattext'); $feedback .= !empty($feedbacks->item(0)->nodeValue) ? $feedbacks->item(0)->nodeValue . ' ' : ''; } } return $feedback; } private function get_answers_fib($question_identifier, $identifier, $assessment, &$last_answer_id) { $xpath = cc112moodle::newx_path($assessment, cc112moodle::getquizns()); $correctanswersfib = array(); $incorrectanswersfib = array(); $response_items = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:resprocessing/xmlns:respcondition'); $correctrespcond = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:resprocessing/xmlns:respcondition/xmlns:setvar[text()="100"]/..'); $correctanswers = $xpath->query('xmlns:conditionvar/xmlns:varequal', $correctrespcond->item(0)); // Correct answers. foreach ($correctanswers as $correctans) { $answertitle = !empty($correctans->nodeValue) ? $correctans->nodeValue : ''; if (empty($answertitle)) { continue; } $last_answer_id++; $correctanswersfib[$answertitle] = array( 'id' => $last_answer_id, 'title' => $answertitle, 'score' => 1, 'feedback' => '', 'case' => 0); } // Handle incorrect answers and feedback for all items. foreach ($response_items as $response_item) { $setvar = $xpath->query('xmlns:setvar', $response_item); if (!empty($setvar->length) && $setvar->item(0)->nodeValue == '100') { // Skip the correct answer responsecondition. continue; } $varequal = $xpath->query('xmlns:conditionvar/xmlns:varequal', $response_item); if (empty($varequal->length)) { // Skip respcondition elements that don't have varequal containing an answer continue; } $answer_title = !empty($varequal->item(0)->nodeValue) ? $varequal->item(0)->nodeValue : ''; $display_feedback = $xpath->query('xmlns:displayfeedback', $response_item); unset($feedbacks_identifiers); if (!empty($display_feedback)) { foreach ($display_feedback as $feedback) { $feedback_identifier = $feedback->getAttributeNode('linkrefid'); $feedback_identifier = !empty($feedback_identifier->nodeValue) ? $feedback_identifier->nodeValue : ''; if (!empty($feedback_identifier)) { $feedbacks_identifiers[] = $feedback_identifier; } } } $feedback = ''; $feedbacks_identifiers = empty($feedbacks_identifiers) ? '' : $feedbacks_identifiers; if (!empty($feedbacks_identifiers)) { foreach ($feedbacks_identifiers as $feedback_identifier) { $feedbacks = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:itemfeedback[@ident="' . $feedback_identifier . '"]/xmlns:flow_mat/xmlns:material/xmlns:mattext'); $feedback .= !empty($feedbacks->item(0)->nodeValue) ? $feedbacks->item(0)->nodeValue . ' ' : ''; } } if (array_key_exists($answer_title, $correctanswersfib)) { // Already a correct answer, just need the feedback for the correct answer. $correctanswerfib[$answer_title]['feedback'] = $feedback; } else { // Need to add an incorrect answer. $last_answer_id++; $incorrectanswersfib[] = array( 'id' => $last_answer_id, 'title' => $answer_title, 'score' => 0, 'feedback' => $feedback, 'case' => 0); } } $answers_fib = array_merge($correctanswersfib, $incorrectanswersfib); $answers_fib = empty($answers_fib) ? '' : $answers_fib; return $answers_fib; } private function get_answers_pattern_match($question_identifier, $identifier, $assessment, &$last_answer_id) { $xpath = cc112moodle::newx_path($assessment, cc112moodle::getquizns()); $answers_fib = array(); $response_items = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:resprocessing/xmlns:respcondition'); foreach ($response_items as $response_item) { $setvar = $xpath->query('xmlns:setvar', $response_item); $setvar = is_object($setvar->item(0)) ? $setvar->item(0)->nodeValue : ''; if ($setvar != '') { $last_answer_id++; $answer_title = $xpath->query('xmlns:conditionvar/xmlns:varequal[@respident="' . $identifier . '"]', $response_item); $answer_title = !empty($answer_title->item(0)->nodeValue) ? $answer_title->item(0)->nodeValue : ''; if (empty($answer_title)) { $answer_title = $xpath->query('xmlns:conditionvar/xmlns:varsubstring[@respident="' . $identifier . '"]', $response_item); $answer_title = !empty($answer_title->item(0)->nodeValue) ? '*' . $answer_title->item(0)->nodeValue . '*' : ''; } if (empty($answer_title)) { $answer_title = '*'; } $case = $xpath->query('xmlns:conditionvar/xmlns:varequal/@case', $response_item); $case = is_object($case->item(0)) ? $case->item(0)->nodeValue : 'no' ; $case = strtolower($case) == 'yes' ? 1 : 0; $display_feedback = $xpath->query('xmlns:displayfeedback', $response_item); unset($feedbacks_identifiers); if (!empty($display_feedback)) { foreach ($display_feedback as $feedback) { $feedback_identifier = $feedback->getAttributeNode('linkrefid'); $feedback_identifier = !empty($feedback_identifier->nodeValue) ? $feedback_identifier->nodeValue : ''; if (!empty($feedback_identifier)) { $feedbacks_identifiers[] = $feedback_identifier; } } } $feedback = ''; $feedbacks_identifiers = empty($feedbacks_identifiers) ? '' : $feedbacks_identifiers; if (!empty($feedbacks_identifiers)) { foreach ($feedbacks_identifiers as $feedback_identifier) { $feedbacks = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:itemfeedback[@ident="' . $feedback_identifier . '"]/xmlns:flow_mat/xmlns:material/xmlns:mattext'); $feedback .= !empty($feedbacks->item(0)->nodeValue) ? $feedbacks->item(0)->nodeValue . ' ' : ''; } } $answers_fib[] = array('id' => $last_answer_id, 'title' => $answer_title, 'score' => $setvar, 'feedback' => $feedback, 'case' => $case); } } $answers_fib = empty($answers_fib) ? '' : $answers_fib; return $answers_fib; } private function get_answers($identifier, $assessment, &$last_answer_id) { $xpath = cc112moodle::newx_path($assessment, cc112moodle::getquizns()); $answers = array(); $question_cc_type = $this->get_question_type($identifier, $assessment); $question_cc_type = $question_cc_type['cc']; $is_multiresponse = ($question_cc_type == CC_QUIZ_MULTIPLE_RESPONSE); if ($question_cc_type == CC_QUIZ_MULTIPLE_CHOICE || $is_multiresponse || $question_cc_type == CC_QUIZ_TRUE_FALSE) { $query_answers = '//xmlns:item[@ident="' . $identifier . '"]/xmlns:presentation/xmlns:response_lid/xmlns:render_choice/xmlns:response_label'; $query_answers_with_flow = '//xmlns:item[@ident="' . $identifier . '"]/xmlns:presentation/xmlns:flow/xmlns:response_lid/xmlns:render_choice/xmlns:response_label'; $query_indentifer = '@ident'; $query_title = 'xmlns:material/xmlns:mattext'; } if ($question_cc_type == CC_QUIZ_ESSAY) { $query_answers = '//xmlns:item[@ident="' . $identifier . '"]/xmlns:presentation/xmlns:response_str'; $query_answers_with_flow = '//xmlns:item[@ident="' . $identifier . '"]/xmlns:presentation/xmlns:flow/xmlns:response_str'; $query_indentifer = '@ident'; $query_title = 'xmlns:render_fib'; } if ($question_cc_type == CC_QUIZ_FIB || $question_cc_type == CC_QUIZ_PATTERN_MACHT) { $xpath_query = '//xmlns:item[@ident="' . $identifier . '"]/xmlns:presentation/xmlns:response_str/@ident'; $xpath_query_with_flow = '//xmlns:item[@ident="' . $identifier . '"]/xmlns:presentation/xmlns:flow/xmlns:response_str/@ident'; $count_response = $xpath->evaluate('count(' . $xpath_query_with_flow . ')'); if ($count_response == 0) { $answer_identifier = $xpath->query($xpath_query); } else { $answer_identifier = $xpath->query($xpath_query_with_flow); } $answer_identifier = !empty($answer_identifier->item(0)->nodeValue) ? $answer_identifier->item(0)->nodeValue : ''; if ($question_cc_type == CC_QUIZ_FIB) { $answers = $this->get_answers_fib ($identifier, $answer_identifier, $assessment, $last_answer_id); } else { $answers = $this->get_answers_pattern_match ($identifier, $answer_identifier, $assessment, $last_answer_id); } } else { $count_response = $xpath->evaluate('count(' . $query_answers_with_flow . ')'); if ($count_response == 0) { $response_items = $xpath->query($query_answers); } else { $response_items = $xpath->query($query_answers_with_flow); } if (!empty($response_items)) { if ($is_multiresponse) { $correct_answer_score = 0; //get the correct answers count $canswers_query = "//xmlns:item[@ident='{$identifier}']//xmlns:setvar[@varname='SCORE'][.=100]/../xmlns:conditionvar//xmlns:varequal[@case='Yes'][not(parent::xmlns:not)]"; $canswers = $xpath->query($canswers_query); if ($canswers->length > 0) { $correct_answer_score = round(1.0 / (float)$canswers->length, 7); //weird $correct_answers_ident = array(); foreach ($canswers as $cnode) { $correct_answers_ident[$cnode->nodeValue] = true; } } } foreach ($response_items as $response_item) { $last_answer_id++; $answer_identifier = $xpath->query($query_indentifer, $response_item); $answer_identifier = !empty($answer_identifier->item(0)->nodeValue) ? $answer_identifier->item(0)->nodeValue : ''; $answer_title = $xpath->query($query_title, $response_item); $answer_title = !empty($answer_title->item(0)->nodeValue) ? $answer_title->item(0)->nodeValue : ''; $answer_feedback = $this->get_feedback($assessment, $answer_identifier, $identifier, $question_cc_type); $answer_score = $this->get_score($assessment, $answer_identifier, $identifier); if ($is_multiresponse && isset($correct_answers_ident[$answer_identifier])) { $answer_score = $correct_answer_score; } $answers[] = array('id' => $last_answer_id, 'title' => $answer_title, 'score' => $answer_score, 'identifier' => $answer_identifier, 'feedback' => $answer_feedback); } } } $answers = empty($answers) ? '' : $answers; return $answers; } private function get_score($assessment, $identifier, $question_identifier) { $xpath = cc112moodle::newx_path($assessment, cc112moodle::getquizns()); $resource_processing = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:resprocessing/xmlns:respcondition'); if (!empty($resource_processing)) { foreach ($resource_processing as $response) { $question_cc_type = $this->get_question_type($question_identifier, $assessment); $question_cc_type = $question_cc_type['cc']; $varequal = $xpath->query('xmlns:conditionvar/xmlns:varequal', $response); $varequal = !empty($varequal->item(0)->nodeValue) ? $varequal->item(0)->nodeValue : ''; if (strtolower($varequal) == strtolower($identifier)) { $score = $xpath->query('xmlns:setvar', $response); $score = !empty($score->item(0)->nodeValue) ? $score->item(0)->nodeValue : ''; } } } // This method (get_score) is only used by T/F & M/C questions in CC, therefore it's either 0 or 1 in Moodle. $score = empty($score) ? "0.0000000" : '1.0000000'; return $score; } private function create_node_course_question_categories_question_category_question_multiple_choice($question) { $node_course_question_categories_question_answer = ''; $sheet_question_categories_question = cc112moodle::loadsheet(SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY_QUESTION_MULTIPLE_CHOICE); if (!empty($question['answers'])) { foreach ($question['answers'] as $answer) { $node_course_question_categories_question_answer .= $this->create_node_course_question_categories_question_category_question_answer($answer); } } $answer_string = $this->get_answers_string($question['answers']); $is_single = ($question['cc_type'] == CC_QUIZ_MULTIPLE_CHOICE) ? 1 : 0; $find_tags = array('[#node_course_question_categories_question_category_question_answer#]', '[#answer_string#]', '[#is_single#]'); $replace_values = array($node_course_question_categories_question_answer, self::safexml($answer_string), $is_single); $node_question_categories_question = str_replace($find_tags, $replace_values, $sheet_question_categories_question); return $node_question_categories_question; } private function create_node_course_question_categories_question_category_question_eesay($question) { $node_course_question_categories_question_answer = ''; $sheet_question_categories_question = cc112moodle::loadsheet(SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY_QUESTION_EESAY); if (!empty($question['answers'])) { foreach ($question['answers'] as $answer) { $node_course_question_categories_question_answer .= $this->create_node_course_question_categories_question_category_question_answer($answer); } } $find_tags = array('[#node_course_question_categories_question_category_question_answer#]'); $replace_values = array($node_course_question_categories_question_answer); $node_question_categories_question = str_replace($find_tags, $replace_values, $sheet_question_categories_question); return $node_question_categories_question; } private function create_node_course_question_categories_question_category_question_shortanswer($question) { //, &$fib_questions) { $sheet_question_categories_question = cc112moodle::loadsheet(SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY_QUESTION_SHORTANSWER); $node_course_question_categories_question_answer = ''; if (!empty($question['answers'])) { foreach ($question['answers'] as $answer) { $node_course_question_categories_question_answer .= $this->create_node_course_question_categories_question_category_question_answer($answer); } } $answers_string = $this->get_answers_string($question['answers']); $use_case = 0; foreach ($question['answers'] as $answer) { if ($answer['case'] == 1) { $use_case = 1; } } $find_tags = array('[#answers_string#]', '[#use_case#]', '[#node_course_question_categories_question_category_question_answer#]'); $replace_values = array(self::safexml($answers_string), self::safexml($use_case), $node_course_question_categories_question_answer); $node_question_categories_question = str_replace($find_tags, $replace_values, $sheet_question_categories_question); return $node_question_categories_question; } private function create_node_course_question_categories_question_category_question_true_false($question) { $node_course_question_categories_question_answer = ''; $sheet_question_categories_question = cc112moodle::loadsheet(SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY_QUESTION_TRUE_FALSE); $trueanswer = null; $falseanswer = null; if (!empty($question['answers'])) { // Identify the true and false answers. foreach ($question['answers'] as $answer) { if ($answer['identifier'] == 'true') { $trueanswer = $answer; } else if ($answer['identifier'] == 'false') { $falseanswer = $answer; } else { // Should not happen, but just in case. throw new coding_exception("Unknown answer identifier detected " . "in true/false quiz question with id {$question['id']}."); } $node_course_question_categories_question_answer .= $this->create_node_course_question_categories_question_category_question_answer($answer); } // Make sure the true and false answer was found. if (is_null($trueanswer) || is_null($falseanswer)) { throw new coding_exception("Unable to correctly identify the " . "true and false answers in the question with id {$question['id']}."); } } $find_tags = array('[#node_course_question_categories_question_category_question_answer#]', '[#true_answer_id#]', '[#false_answer_id#]'); $replace_values = array($node_course_question_categories_question_answer, $trueanswer['id'], $falseanswer['id']); $node_question_categories_question = str_replace($find_tags, $replace_values, $sheet_question_categories_question); return $node_question_categories_question; } private function get_answers_string($answers) { $answer_string = ''; if (!empty($answers)) { foreach ($answers as $answer) { $answer_string .= $answer['id'] . ','; } } $answer_string = !empty($answer_string) ? substr($answer_string, 0, strlen($answer_string) - 1) : ''; return $answer_string; } private function create_node_course_question_categories_question_category_question_answer($answer) { $sheet_question_categories_question_answer = cc112moodle::loadsheet(SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY_QUESTION_ANSWER); $find_tags = array('[#answer_id#]', '[#answer_text#]', '[#answer_score#]', '[#answer_feedback#]'); $replace_values = array($answer['id'], self::safexml($answer['title']), $answer['score'], self::safexml($answer['feedback'])); $node_question_categories_question_answer = str_replace($find_tags, $replace_values, $sheet_question_categories_question_answer); return $node_question_categories_question_answer; } private function get_question_type($identifier, $assessment) { $xpath = cc112moodle::newx_path($assessment, cc112moodle::getquizns()); $metadata = $xpath->query('//xmlns:item[@ident="' . $identifier . '"]/xmlns:itemmetadata/xmlns:qtimetadata/xmlns:qtimetadatafield'); foreach ($metadata as $field) { $field_label = $xpath->query('xmlns:fieldlabel', $field); $field_label = !empty($field_label->item(0)->nodeValue) ? $field_label->item(0)->nodeValue : ''; if ($field_label == 'cc_profile') { $field_entry = $xpath->query('xmlns:fieldentry', $field); $type = !empty($field_entry->item(0)->nodeValue) ? $field_entry->item(0)->nodeValue : ''; } } $return_type = array(); $return_type['moodle'] = ''; $return_type['cc'] = $type; if ($type == CC_QUIZ_MULTIPLE_CHOICE) { $return_type['moodle'] = MOODLE_QUIZ_MULTIPLE_CHOICE; } if ($type == CC_QUIZ_MULTIPLE_RESPONSE) { $return_type['moodle'] = MOODLE_QUIZ_MULTIPLE_CHOICE; } if ($type == CC_QUIZ_TRUE_FALSE) { $return_type['moodle'] = MOODLE_QUIZ_TRUE_FALSE; } if ($type == CC_QUIZ_ESSAY) { $return_type['moodle'] = MOODLE_QUIZ_ESSAY; } if ($type == CC_QUIZ_FIB) { $return_type['moodle'] = MOODLE_QUIZ_SHORTANSWER; } if ($type == CC_QUIZ_PATTERN_MACHT) { $return_type['moodle'] = MOODLE_QUIZ_SHORTANSWER; } return $return_type; } } includes/constants.php000064400000014213152266437620011115 0ustar00. /** * @package moodlecore * @subpackage backup-imscc * @copyright 2009 Mauro Rondinelli (mauro.rondinelli [AT] uvcms.com) * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.'); // GENERAL PARAMETERS ************************************************************************************************* // define('ROOT_DEEP', 2); // PACKAGES FORMATS *************************************************************************************************** // define('FORMAT_UNKNOWN', 'NA'); define('FORMAT_COMMON_CARTRIDGE', 'CC'); define('FORMAT_BLACK_BOARD', 'BB'); // FORMATS NAMESPACES ************************************************************************************************* // define('NS_COMMON_CARTRIDGE', 'http://www.imsglobal.org/xsd/imscc/imscp_v1p1'); define('NS_BLACK_BOARD', 'http://www.blackboard.com/content-packaging'); // SHEET FILES ******************************************************************************************************** // define('SHEET_BASE', 'cc/sheets/base.xml'); define('SHEET_INFO_DETAILS_MOD', 'cc/sheets/info_details_mod.xml'); define('SHEET_INFO_DETAILS_MOD_INSTANCE', 'cc/sheets/info_details_mod_instance.xml'); define('SHEET_COURSE_BLOCKS_BLOCK', 'cc/sheets/course_blocks_block.xml'); define('SHEET_COURSE_HEADER', 'cc/sheets/course_header.xml'); define('SHEET_COURSE_SECTIONS_SECTION', 'cc/sheets/course_sections_section.xml'); define('SHEET_COURSE_SECTIONS_SECTION_MODS_MOD', 'cc/sheets/course_sections_section_mods_mod.xml'); define('SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_FORUM', 'cc/sheets/course_modules_mod_forum.xml'); define('SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_LABEL', 'cc/sheets/course_modules_mod_label.xml'); define('SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_RESOURCE', 'cc/sheets/course_modules_mod_resource.xml'); define('SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_QUIZ', 'cc/sheets/course_modules_mod_quiz.xml'); define('SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_QUIZ_QUESTION_INSTANCE', 'cc/sheets/course_modules_mod_quiz_question_instance.xml'); define('SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_QUIZ_FEEDBACK', 'cc/sheets/course_modules_mod_quiz_feedback.xml'); define('SHEET_COURSE_QUESTION_CATEGORIES', 'cc/sheets/course_question_categories.xml'); define('SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY', 'cc/sheets/course_question_categories_question_category.xml'); define('SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY_QUESTION', 'cc/sheets/course_question_categories_question_category_question.xml'); define('SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY_QUESTION_MULTIPLE_CHOICE', 'cc/sheets/course_question_categories_question_category_question_multiple_choice.xml'); define('SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY_QUESTION_TRUE_FALSE', 'cc/sheets/course_question_categories_question_category_question_true_false.xml'); define('SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY_QUESTION_EESAY', 'cc/sheets/course_question_categories_question_category_question_eesay.xml'); define('SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY_QUESTION_SHORTANSWER', 'cc/sheets/course_question_categories_question_category_question_shortanswer.xml'); define('SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY_QUESTION_ANSWER', 'cc/sheets/course_question_categories_question_category_question_answer.xml'); define('SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_BASICLTI', 'cc/sheets/course_modules_mod_basiclti.xml'); define('SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_LTI', 'cc/sheets/course_modules_mod_lti.xml'); // CC RESOURCES TYPE ************************************************************************************************** // define('CC_TYPE_FORUM', 'imsdt_xmlv1p0'); define('CC_TYPE_QUIZ', 'imsqti_xmlv1p2/imscc_xmlv1p0/assessment'); define('CC_TYPE_QUESTION_BANK', 'imsqti_xmlv1p2/imscc_xmlv1p0/question-bank'); define('CC_TYPE_WEBLINK', 'imswl_xmlv1p0'); define('CC_TYPE_WEBCONTENT', 'webcontent'); define('CC_TYPE_ASSOCIATED_CONTENT', 'associatedcontent/imscc_xmlv1p0/learning-application-resource'); define('CC_TYPE_EMPTY', ''); // MOODLE RESOURCES TYPE ********************************************************************************************** // define('MOODLE_TYPE_FORUM', 'forum'); define('MOODLE_TYPE_QUIZ', 'quiz'); define('MOODLE_TYPE_QUESTION_BANK', 'question_bank'); define('MOODLE_TYPE_RESOURCE', 'resource'); define('MOODLE_TYPE_LABEL', 'label'); define('MOODLE_TYPE_BASICLTI', 'basiclti'); define('MOODLE_TYPE_LTI', 'lti'); // UNKNOWN TYPE ******************************************************************************************************* // define('TYPE_UNKNOWN', '[UNKNOWN]'); // CC QUESTIONS TYPES ************************************************************************************************* // define('CC_QUIZ_MULTIPLE_CHOICE', 'cc.multiple_choice.v0p1'); define('CC_QUIZ_TRUE_FALSE', 'cc.true_false.v0p1'); define('CC_QUIZ_FIB', 'cc.fib.v0p1'); define('CC_QUIZ_MULTIPLE_RESPONSE', 'cc.multiple_response.v0p1'); define('CC_QUIZ_PATTERN_MACHT', 'cc.pattern_match.v0p1'); define('CC_QUIZ_ESSAY', 'cc.essay.v0p1'); //MOODLE QUESTIONS TYPES ********************************************************************************************** // define('MOODLE_QUIZ_MULTIPLE_CHOICE', 'multichoice'); define('MOODLE_QUIZ_TRUE_FALSE', 'truefalse'); define('MOODLE_QUIZ_MULTIANSWER', 'multianswer'); define('MOODLE_QUIZ_MULTIPLE_RESPONSE', 'multichoice'); define('MOODLE_QUIZ_MACHT', 'match'); define('MOODLE_QUIZ_ESSAY', 'essay'); define('MOODLE_QUIZ_SHORTANSWER', 'shortanswer'); cc2moodle.php000064400000072142152266437620007147 0ustar00. /** * @package moodlecore * @subpackage backup-imscc * @copyright 2009 Mauro Rondinelli (mauro.rondinelli [AT] uvcms.com) * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.'); require_once($CFG->dirroot . '/backup/cc/entities.class.php'); require_once($CFG->dirroot . '/backup/cc/entity.label.class.php'); require_once($CFG->dirroot . '/backup/cc/entity.resource.class.php'); require_once($CFG->dirroot . '/backup/cc/entity.forum.class.php'); require_once($CFG->dirroot . '/backup/cc/entity.quiz.class.php'); class cc2moodle { const CC_TYPE_FORUM = 'imsdt_xmlv1p0'; const CC_TYPE_QUIZ = 'imsqti_xmlv1p2/imscc_xmlv1p0/assessment'; const CC_TYPE_QUESTION_BANK = 'imsqti_xmlv1p2/imscc_xmlv1p0/question-bank'; const CC_TYPE_WEBLINK = 'imswl_xmlv1p0'; const CC_TYPE_WEBCONTENT = 'webcontent'; const CC_TYPE_ASSOCIATED_CONTENT = 'associatedcontent/imscc_xmlv1p0/learning-application-resource'; const CC_TYPE_EMPTY = ''; public static $restypes = array('associatedcontent/imscc_xmlv1p0/learning-application-resource', 'webcontent'); public static $forumns = array('dt' => 'http://www.imsglobal.org/xsd/imsdt_v1p0'); public static $quizns = array('xmlns' => 'http://www.imsglobal.org/xsd/ims_qtiasiv1p2'); public static $resourcens = array('wl' => 'http://www.imsglobal.org/xsd/imswl_v1p0'); /** * * @return array */ public static function getquizns() { return static::$quizns; } /** * * @return array */ public static function getforumns() { return static::$forumns; } /** * * @return array */ public static function getresourcens() { return static::$resourcens; } public static function get_manifest($folder) { if (!is_dir($folder)) { return false; } // Before iterate over directories, try to find one manifest at top level if (file_exists($folder . '/imsmanifest.xml')) { return $folder . '/imsmanifest.xml'; } $result = false; try { $dirIter = new RecursiveDirectoryIterator($folder, RecursiveDirectoryIterator::KEY_AS_PATHNAME); $recIter = new RecursiveIteratorIterator($dirIter, RecursiveIteratorIterator::CHILD_FIRST); foreach ($recIter as $info) { if ($info->isFile() && ($info->getFilename() == 'imsmanifest.xml')) { $result = $info->getPathname(); break; } } } catch (Exception $e) {} return $result; } public static $instances = array(); public static $manifest; public static $path_to_manifest_folder; public static $namespaces = array('imscc' => 'http://www.imsglobal.org/xsd/imscc/imscp_v1p1', 'lomimscc' => 'http://ltsc.ieee.org/xsd/imscc/LOM', 'lom' => 'http://ltsc.ieee.org/xsd/LOM', 'voc' => 'http://ltsc.ieee.org/xsd/LOM/vocab', 'xsi' => 'http://www.w3.org/2001/XMLSchema-instance', 'cc' => 'http://www.imsglobal.org/xsd/imsccauth_v1p0'); function __construct($path_to_manifest) { static::$manifest = new DOMDocument(); static::$manifest->validateOnParse = false; static::$path_to_manifest_folder = dirname($path_to_manifest); static::log_action('Proccess start'); static::log_action('Load the manifest file: ' . $path_to_manifest); if (!static::$manifest->load($path_to_manifest, LIBXML_NONET)) { static::log_action('Cannot load the manifest file: ' . $path_to_manifest, true); } } public function is_auth() { $xpath = static::newx_path(static::$manifest, static::$namespaces); $count_auth = $xpath->evaluate('count(/imscc:manifest/cc:authorizations)'); if ($count_auth > 0) { $response = true; } else { $response = false; } return $response; } protected function get_metadata($section, $key) { $xpath = static::newx_path(static::$manifest, static::$namespaces); $metadata = $xpath->query('/imscc:manifest/imscc:metadata/lomimscc:lom/lomimscc:' . $section . '/lomimscc:' . $key . '/lomimscc:string'); $value = !empty($metadata->item(0)->nodeValue) ? $metadata->item(0)->nodeValue : ''; return $value; } public function generate_moodle_xml() { global $CFG, $OUTPUT; $cdir = static::$path_to_manifest_folder . DIRECTORY_SEPARATOR . 'course_files'; if (!file_exists($cdir)) { mkdir($cdir, $CFG->directorypermissions, true); } $sheet_base = static::loadsheet(SHEET_BASE); // MOODLE_BACKUP / INFO / DETAILS / MOD $node_info_details_mod = $this->create_code_info_details_mod(); // MOODLE_BACKUP / BLOCKS / BLOCK $node_course_blocks_block = $this->create_node_course_blocks_block(); // MOODLE_BACKUP / COURSES / SECTIONS / SECTION $node_course_sections_section = $this->create_node_course_sections_section(); // MOODLE_BACKUP / COURSES / QUESTION_CATEGORIES $node_course_question_categories = $this->create_node_question_categories(); // MOODLE_BACKUP / COURSES / MODULES / MOD $node_course_modules_mod = $this->create_node_course_modules_mod(); // MOODLE_BACKUP / COURSE / HEADER $node_course_header = $this->create_node_course_header(); // GENERAL INFO $filename = optional_param('file', 'not_available.zip', PARAM_RAW); $filename = basename($filename); $www_root = $CFG->wwwroot; $find_tags = array('[#zip_filename#]', '[#www_root#]', '[#node_course_header#]', '[#node_info_details_mod#]', '[#node_course_blocks_block#]', '[#node_course_sections_section#]', '[#node_course_question_categories#]', '[#node_course_modules#]'); $replace_values = array($filename, $www_root, $node_course_header, $node_info_details_mod, $node_course_blocks_block, $node_course_sections_section, $node_course_question_categories, $node_course_modules_mod); $result_xml = str_replace($find_tags, $replace_values, $sheet_base); // COPY RESOURSE FILES $entities = new entities(); $entities->move_all_files(); if (array_key_exists("index", self::$instances)) { if (!file_put_contents(static::$path_to_manifest_folder . DIRECTORY_SEPARATOR . 'moodle.xml', $result_xml)) { static::log_action('Cannot save the moodle manifest file: ' . static::$path_to_manifest_folder . DIRECTORY_SEPARATOR . 'moodle.xml', true); } else { $status = true; } } else { $status = false; echo $OUTPUT->notification('The course is empty'); static::log_action('The course is empty', false); } return $status; } protected function get_sections_numbers($instances) { $count = 0; if (array_key_exists("index", $instances)) { foreach ($instances["index"] as $instance) { if ($instance["deep"] == ROOT_DEEP) { $count++; } } } return $count; } protected function create_node_course_header() { $node_course_header = ''; $sheet_course_header = static::loadsheet(SHEET_COURSE_HEADER); $course_title = trim($this->get_metadata('general', 'title')); $course_title = empty($course_title) ? 'Untitled Course' : $course_title; $course_description = $this->get_metadata('general', 'description'); $section_count = $this->get_sections_numbers(static::$instances) - 1; if ($section_count == -1) { $section_count = 0; } if (empty($course_title)) { $this->log_action('The course title not found', true); } $course_short_name = $this->create_course_code($course_title); $find_tags = array('[#course_name#]', '[#course_short_name#]', '[#course_description#]', '[#date_now#]', '[#section_count#]'); $replace_values = array(entities::safexml($course_title), entities::safexml($course_short_name), entities::safexml($course_description), time(), $section_count); $node_course_header = str_replace($find_tags, $replace_values, $sheet_course_header); return $node_course_header; } protected function create_node_question_categories() { $quiz = new cc_quiz(); static::log_action('Creating node: QUESTION_CATEGORIES'); $node_course_question_categories = $quiz->generate_node_question_categories(); return $node_course_question_categories; } protected function create_node_course_modules_mod() { $labels = new cc_label(); $resources = new cc_resource(); $forums = new cc_forum(); $quiz = new cc_quiz(); static::log_action('Creating node: COURSE/MODULES/MOD'); // LABELS $node_course_modules_mod_label = $labels->generate_node(); // RESOURCES (WEB CONTENT AND WEB LINK) $node_course_modules_mod_resource = $resources->generate_node(); // FORUMS $node_course_modules_mod_forum = $forums->generate_node(); // QUIZ $node_course_modules_mod_quiz = $quiz->generate_node_course_modules_mod(); //TODO: label $node_course_modules = $node_course_modules_mod_label . $node_course_modules_mod_resource . $node_course_modules_mod_forum . $node_course_modules_mod_quiz; return $node_course_modules; } protected function create_node_course_sections_section() { static::log_action('Creating node: COURSE/SECTIONS/SECTION'); $node_course_sections_section = ''; $sheet_course_sections_section = static::loadsheet(SHEET_COURSE_SECTIONS_SECTION); $topics = $this->get_nodes_by_criteria('deep', ROOT_DEEP); $i = 0; if (!empty($topics)) { foreach ($topics as $topic) { $i++; $node_node_course_sections_section_mods_mod = $this->create_node_course_sections_section_mods_mod($topic['index']); if ($topic['moodle_type'] == MOODLE_TYPE_LABEL) { $find_tags = array('[#section_id#]', '[#section_number#]', '[#section_summary#]', '[#node_course_sections_section_mods_mod#]'); $replace_values = array($i, $i - 1, entities::safexml($topic['title']), $node_node_course_sections_section_mods_mod); } else { $find_tags = array('[#section_id#]', '[#section_number#]', '[#section_summary#]', '[#node_course_sections_section_mods_mod#]'); $replace_values = array($i, $i - 1, '', $node_node_course_sections_section_mods_mod); } $node_course_sections_section .= str_replace($find_tags, $replace_values, $sheet_course_sections_section); } } return $node_course_sections_section; } protected function create_node_course_blocks_block() { global $CFG; static::log_action('Creating node: COURSE/BLOCKS/BLOCK'); $sheet_course_blocks_block = static::loadsheet(SHEET_COURSE_BLOCKS_BLOCK); $node_course_blocks_block = ''; $format_config = $CFG->dirroot . '/course/format/weeks/config.php'; if (@is_file($format_config) && is_readable($format_config)) { require ($format_config); } if (!empty($format['defaultblocks'])) { $blocknames = $format['defaultblocks']; } else { if (isset($CFG->defaultblocks)) { $blocknames = $CFG->defaultblocks; } else { $blocknames = 'activity_modules,search_forums,course_list:news_items,calendar_upcoming,recent_activity'; } } $blocknames = explode(':', $blocknames); $blocks_left = explode(',', $blocknames[0]); $blocks_right = explode(',', $blocknames[1]); $find_tags = array('[#block_id#]', '[#block_name#]', '[#block_position#]', '[#block_weight#]'); $i = 0; $weight = 0; foreach ($blocks_left as $block) { $i++; $weight++; $replace_values = array($i, $block, 'l', $weight); $node_course_blocks_block .= str_replace($find_tags, $replace_values, $sheet_course_blocks_block); } $weight = 0; foreach ($blocks_right as $block) { $i++; $weight ++; $replace_values = array($i, $block, 'r', $weight); $node_course_blocks_block .= str_replace($find_tags, $replace_values, $sheet_course_blocks_block); } return $node_course_blocks_block; } /** * * Is activity visible or not * @param string $identifier * @return number */ protected function get_module_visible($identifier) { //Should item be hidden or not $mod_visible = 1; if (!empty($identifier)) { $xpath = static::newx_path(static::$manifest, static::$namespaces); $query = '/imscc:manifest/imscc:resources/imscc:resource[@identifier="' . $identifier . '"]'; $query .= '//lom:intendedEndUserRole/voc:vocabulary/lom:value'; $intendeduserrole = $xpath->query($query); if (!empty($intendeduserrole) && ($intendeduserrole->length > 0)) { $role = trim($intendeduserrole->item(0)->nodeValue); if (strcasecmp('Instructor', $role) == 0) { $mod_visible = 0; } } } return $mod_visible; } protected function create_node_course_sections_section_mods_mod($root_parent) { $sheet_course_sections_section_mods_mod = static::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD); $childs = $this->get_nodes_by_criteria('root_parent', $root_parent); if ($childs) { $node_course_sections_section_mods_mod = ''; foreach ($childs as $child) { if ($child['moodle_type'] == MOODLE_TYPE_LABEL) { if ($child['index'] == $child['root_parent']) { $is_summary = true; } else { $is_summary = false; } } else { $is_summary = false; } if (!$is_summary) { $indent = $child['deep'] - ROOT_DEEP; if ($indent > 0) { $indent = $indent - 1; } $find_tags = array('[#mod_id#]', '[#mod_instance_id#]', '[#mod_type#]', '[#date_now#]', '[#mod_indent#]', '[#mod_visible#]'); $replace_values = array($child['index'], $child['instance'], $child['moodle_type'], time(), $indent, $this->get_module_visible($child['resource_indentifier'])); $node_course_sections_section_mods_mod .= str_replace($find_tags, $replace_values, $sheet_course_sections_section_mods_mod); } } $response = $node_course_sections_section_mods_mod; } else { $response = ''; } return $response; } public function get_nodes_by_criteria($key, $value) { $response = array(); if (array_key_exists('index', static::$instances)) { foreach (static::$instances['index'] as $item) { if ($item[$key] == $value) { $response[] = $item; } } } return $response; } //Modified here protected function create_code_info_details_mod() { static::log_action('Creating node: INFO/DETAILS/MOD'); $xpath = static::newx_path(static::$manifest, static::$namespaces); $items = $xpath->query('/imscc:manifest/imscc:organizations/imscc:organization/imscc:item | /imscc:manifest/imscc:resources/imscc:resource[@type="' . static::CC_TYPE_QUESTION_BANK . '"]'); $this->create_instances($items); $count_quiz = $this->count_instances(MOODLE_TYPE_QUIZ); $count_forum = $this->count_instances(MOODLE_TYPE_FORUM); $count_resource = $this->count_instances(MOODLE_TYPE_RESOURCE); $count_label = $this->count_instances(MOODLE_TYPE_LABEL); $sheet_info_details_mod_instances_instance = static::loadsheet(SHEET_INFO_DETAILS_MOD_INSTANCE); if ($count_resource > 0) { $resource_instance = $this->create_mod_info_details_mod_instances_instance($sheet_info_details_mod_instances_instance, $count_resource, static::$instances['instances'][MOODLE_TYPE_RESOURCE]); } if ($count_quiz > 0) { $quiz_instance = $this->create_mod_info_details_mod_instances_instance($sheet_info_details_mod_instances_instance, $count_quiz, static::$instances['instances'][MOODLE_TYPE_QUIZ]); } if ($count_forum > 0) { $forum_instance = $this->create_mod_info_details_mod_instances_instance($sheet_info_details_mod_instances_instance, $count_forum, static::$instances['instances'][MOODLE_TYPE_FORUM]); } if ($count_label > 0) { $label_instance = $this->create_mod_info_details_mod_instances_instance($sheet_info_details_mod_instances_instance, $count_label, static::$instances['instances'][MOODLE_TYPE_LABEL]); } $resource_mod = $count_resource ? $this->create_mod_info_details_mod(MOODLE_TYPE_RESOURCE, $resource_instance) : ''; $quiz_mod = $count_quiz ? $this->create_mod_info_details_mod(MOODLE_TYPE_QUIZ, $quiz_instance) : ''; $forum_mod = $count_forum ? $this->create_mod_info_details_mod(MOODLE_TYPE_FORUM, $forum_instance) : ''; $label_mod = $count_label ? $this->create_mod_info_details_mod(MOODLE_TYPE_LABEL, $label_instance) : ''; //TODO: label return $label_mod . $resource_mod . $quiz_mod . $forum_mod; } protected function create_mod_info_details_mod($mod_type, $node_info_details_mod_instances_instance) { $sheet_info_details_mod = static::loadsheet(SHEET_INFO_DETAILS_MOD); $find_tags = array('[#mod_type#]' ,'[#node_info_details_mod_instances_instance#]'); $replace_values = array($mod_type , $node_info_details_mod_instances_instance); return str_replace($find_tags, $replace_values, $sheet_info_details_mod); } protected function create_mod_info_details_mod_instances_instance($sheet, $instances_quantity, $instances) { $instance = ''; $find_tags = array('[#mod_instance_id#]', '[#mod_name#]', '[#mod_user_info#]'); for ($i = 1; $i <= $instances_quantity; $i++) { $user_info = ($instances[$i - 1]['common_cartriedge_type'] == static::CC_TYPE_FORUM) ? 'true' : 'false'; if ($instances[$i - 1]['common_cartriedge_type'] == static::CC_TYPE_EMPTY) { if ($instances[$i - 1]['deep'] <= ROOT_DEEP ) { continue; } } $replace_values = array($instances[$i - 1]['instance'], entities::safexml($instances[$i - 1]['title']), $user_info); $instance .= str_replace($find_tags, $replace_values, $sheet); } return $instance; } protected function create_instances($items, $level = 0, &$array_index = 0, $index_root = 0) { $level++; $i = 1; if ($items) { $xpath = self::newx_path(static::$manifest, static::$namespaces); foreach ($items as $item) { $array_index++; if ($item->nodeName == "item") { $identifierref = ''; if ($item->hasAttribute('identifierref')) { $identifierref = $item->getAttribute('identifierref'); } $title = ''; $titles = $xpath->query('imscc:title', $item); if ($titles->length > 0) { $title = $titles->item(0)->nodeValue; } $cc_type = $this->get_item_cc_type($identifierref); $moodle_type = $this->convert_to_moodle_type($cc_type); //Fix the label issue - MDL-33523 if (empty($identifierref) && empty($title)) { $moodle_type = TYPE_UNKNOWN; } } elseif ($item->nodeName == "resource") { $identifierref = $xpath->query('@identifier', $item); $identifierref = !empty($identifierref->item(0)->nodeValue) ? $identifierref->item(0)->nodeValue : ''; $cc_type = $this->get_item_cc_type($identifierref); $moodle_type = $this->convert_to_moodle_type($cc_type); $title = 'Quiz Bank ' . ($this->count_instances($moodle_type) + 1); } if ($level == ROOT_DEEP) { $index_root = $array_index; } static::$instances['index'][$array_index]['common_cartriedge_type'] = $cc_type; static::$instances['index'][$array_index]['moodle_type'] = $moodle_type; static::$instances['index'][$array_index]['title'] = $title ? $title : ''; static::$instances['index'][$array_index]['root_parent'] = $index_root; static::$instances['index'][$array_index]['index'] = $array_index; static::$instances['index'][$array_index]['deep'] = $level; static::$instances['index'][$array_index]['instance'] = $this->count_instances($moodle_type); static::$instances['index'][$array_index]['resource_indentifier'] = $identifierref; static::$instances['instances'][$moodle_type][] = array('title' => $title, 'instance' => static::$instances['index'][$array_index]['instance'], 'common_cartriedge_type' => $cc_type, 'resource_indentifier' => $identifierref, 'deep' => $level); $more_items = $xpath->query('imscc:item', $item); if ($more_items->length > 0) { $this->create_instances($more_items, $level, $array_index, $index_root); } $i++; } } } public function count_instances($type) { $quantity = 0; if (array_key_exists('index', static::$instances)) { if (static::$instances['index'] && $type) { foreach (static::$instances['index'] as $instance) { if (!empty($instance['moodle_type'])) { $types[] = $instance['moodle_type']; } } $quantity_instances = array_count_values($types); $quantity = array_key_exists($type, $quantity_instances) ? $quantity_instances[$type] : 0; } } return $quantity; } public function convert_to_moodle_type($cc_type) { $type = TYPE_UNKNOWN; if ($cc_type == static::CC_TYPE_FORUM) { $type = MOODLE_TYPE_FORUM; } if ($cc_type == static::CC_TYPE_QUIZ) { $type = MOODLE_TYPE_QUIZ; } if ($cc_type == static::CC_TYPE_WEBLINK) { $type = MOODLE_TYPE_RESOURCE; } if ($cc_type == static::CC_TYPE_WEBCONTENT) { $type = MOODLE_TYPE_RESOURCE; } if ($cc_type == static::CC_TYPE_ASSOCIATED_CONTENT) { $type = MOODLE_TYPE_RESOURCE; } if ($cc_type == static::CC_TYPE_QUESTION_BANK) { $type = MOODLE_TYPE_QUESTION_BANK; } //TODO: label if ($cc_type == static::CC_TYPE_EMPTY) { $type = MOODLE_TYPE_LABEL; } return $type; } public function get_item_cc_type($identifier) { $xpath = static::newx_path(static::$manifest, static::$namespaces); $nodes = $xpath->query('/imscc:manifest/imscc:resources/imscc:resource[@identifier="' . $identifier . '"]/@type'); if ($nodes && !empty($nodes->item(0)->nodeValue)) { return $nodes->item(0)->nodeValue; } else { return ''; } } public static function newx_path(DOMDocument $manifest, $namespaces = '') { $xpath = new DOMXPath($manifest); if (!empty($namespaces)) { foreach ($namespaces as $prefix => $ns) { if (!$xpath->registerNamespace($prefix, $ns)) { static::log_action('Cannot register the namespace: ' . $prefix . ':' . $ns, true); } } } return $xpath; } public static function loadsheet($file) { $content = (is_readable($file) && ($content = file_get_contents($file))) ? $content : false; static::log_action('Loading sheet: ' . $file); if (!$content) { static::log_action('Cannot load the xml sheet: ' . $file, true); } static::log_action('Load OK!'); return $content; } public static function log_file() { return static::$path_to_manifest_folder . DIRECTORY_SEPARATOR . 'cc2moodle.log'; } public static function log_action($text, $critical_error = false) { $full_message = strtoupper(date("j/n/Y g:i:s a")) . " - " . $text . "\r"; file_put_contents(static::log_file(), $full_message, FILE_APPEND); if ($critical_error) { static::critical_error($text); } } protected static function critical_error($text) { $path_to_log = static::log_file(); echo '


A critical error has been found!

' . $text . '

The process has been stopped. Please see the log file for more information.

Log: ' . $path_to_log . '


'; die(); } protected function create_course_code($title) { //Making sure that text of the short name does not go over the DB limit. //and leaving the space to add additional characters by the platform $code = substr(strtoupper(str_replace(' ', '', trim($title))),0,94); return $code; } } 36/5e01ef1e39b242d168473290e20cb3df0e069c339fcfe0dcb108ac505ca6000064400000004264152271355200015241 0ustar00 96794ab2a1159e3003692aef63fc9848a0c28a1f {"key":"make-fetch-happen:request-cache:https://registry.npmjs.org/quick-format-unescaped","integrity":"sha512-xtAA3nkCXKiKTF5OmwA/I/q98D1Y7md2qzqbU+Rx9YnITWxqbc1pXCr9Zn2TCeG0UpqVxdvjK4Xd5/0RzbBTxQ==","time":1735287911937,"size":19617,"metadata":{"time":1735287911933,"url":"https://registry.npmjs.org/quick-format-unescaped","reqHeaders":{"accept":"application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*"},"resHeaders":{"cache-control":"public, max-age=300","content-encoding":"gzip","content-type":"application/vnd.npm.install-v1+json","date":"Fri, 27 Dec 2024 08:25:11 GMT","etag":"W/\"eee049148383ef2d76a3586e7f65e538\"","last-modified":"Sat, 25 Jun 2022 07:06:46 GMT","vary":"accept-encoding, accept"},"options":{"compress":true}}} 50c23a9dcb5f442c5b306b6f242656b2dabaabf4 {"key":"make-fetch-happen:request-cache:https://registry.npmjs.org/quick-format-unescaped","integrity":"sha512-KcD8DuqcfNBe15DSBDtsaYxFsWbwNfP5zSpH6azfubRBz8u+1gMvbAc91lwtcG9jEGpwsf5kfHa/kBlNysX3Aw==","time":1776429292747,"size":36121,"metadata":{"time":1776429292665,"url":"https://registry.npmjs.org/quick-format-unescaped","reqHeaders":{"accept":"application/json"},"resHeaders":{"cache-control":"public, max-age=300","content-encoding":"gzip","content-type":"application/json","date":"Fri, 17 Apr 2026 12:34:53 GMT","etag":"W/\"fe2314d8f693db566c26c0a403205f24\"","last-modified":"Sat, 25 Jun 2022 07:06:46 GMT","vary":"accept-encoding, accept"},"options":{"compress":true}}} 52a74488ec20610caeb188cbb00925c326b474cf {"key":"make-fetch-happen:request-cache:https://registry.npmjs.org/quick-format-unescaped","integrity":"sha512-KcD8DuqcfNBe15DSBDtsaYxFsWbwNfP5zSpH6azfubRBz8u+1gMvbAc91lwtcG9jEGpwsf5kfHa/kBlNysX3Aw==","time":1776430474418,"size":36121,"metadata":{"time":1776430474418,"url":"https://registry.npmjs.org/quick-format-unescaped","reqHeaders":{"accept":"application/json"},"resHeaders":{"cache-control":"public, max-age=300","date":"Fri, 17 Apr 2026 12:54:35 GMT","etag":"\"fe2314d8f693db566c26c0a403205f24\"","last-modified":"Sat, 25 Jun 2022 07:06:46 GMT","vary":"Accept-Encoding","content-encoding":"gzip","content-type":"application/json"},"options":{"compress":true}}}usr/bin/cc000075500004127010152271403750006453 0ustar00ELF>X@H@8@#"@@@PPPNNPPP    x09IIppp00DD Stdppp00Ptd 4040QtdRtd HsHs/lib64/ld-linux-x86-64.so.2 GNUGNUno @GNUP>[ݣk`~ju)N<Ĺ@fUa9M> T m C6kF"JO {?*V;} u)P"  m, ["`z.'V# 69RZ Bg/x"ra?[j 31"}Ib xo'!@\0xPgN!*h\#@\P\<`\d0_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTable__pthread_key_create__cxa_finalizepthread_mutex_lockpthread_mutex_unlockgettextmallocmemmove__libc_start_mainfputcstrcmpfputsmemsetstrncmpmemchrpthread_cond_broadcastpthread_oncestrlenmemcmprealloc_dl_find_objectsyscallabortstderrioctlmemcpy__libc_single_threaded__errno_locationpthread_cond_waitfwrite__stack_chk_fail__cxa_atexit__tls_get_addrstrcatgetenvstrdupaccessvsprintfstrchrstrtoulrealpathcallocsbrk_obstack_beginstdin__fsetlockingstdoutsetlocalebindtextdomainnl_langinfostrcasecmpgetrlimitsetrlimitfopenfseekftellfreadfclosefflush_obstack_newchunkmmapmunmapputcharferrorfgetcstrstrobstack_alloc_failed_handlermkstempspipe2__environvforkexecvdup2execvpsleep_exitstrcpystrerrorfileno_unlockedisattypipestrtoull_obstack_freestrncpystrrchrputenvtimesnprintfsetenvstrtolstrtokstrnlenvfprintf__isoc99_sscanffcntlstrsignalfeoffstatgetpidkillunlinkfgets__ctype_b_locstrverscmpgettimeofdaygetpagesizelstatreadlinkdl_iterate_phdrwaitpidwait4fdopen_obstack_begin_1_obstack_allocated_p_obstack_memory_usedremovelibm.so.6libc.so.6ld-linux-x86-64.so.2GLIBC_2.3GLIBC_2.14GLIBC_2.3.2GLIBC_2.4GLIBC_2.35GLIBC_2.32GLIBC_2.33GLIBC_2.7GLIBC_2.11GLIBC_2.34GLIBC_2.9GLIBC_2.2.5_ITM_addUserCommitAction_ITM_memcpyRtWn_ITM_RU1_ZGTtdlPv_ITM_RU8_ITM_memcpyRnWt_ZGTtnam       ii  ri ii ii  ii (3ii >ui H Y  P  pY   (w i  m@  mP 3'` - J' W' ;' E' P' _' l' z'@ *P ' T  ' ' (w  m ' '0 '@ UP '` 'p ' ' ' ' l (w '  m@ iP [ ' ( ( ( $( /( (( 6(@ =(P K(` Y( ) `( s  m    0 d(` G p W' o( 9o < v( ( ( (@ (P (` (p  m ( ( ' ( : ( ( (0 (` (p ( z ( A ( y ' (@ (wP (` ( ) )   m ) ) ) !)0 .)` (wp ;)  m  H) I) N) M) ? W;0  m@ 6(` 'p ( ( R) p) W) _) g) [) l) t)@ =P ` pk = |) . 0 ) ) ) ) )0 )` (wp  ) h = ' ) k0 G @ #` )p ) )  m ) k G # W 0 )@ *P  m *  m  *  m * * h* "* )*0 /*@ 6*` ep ˀ <*  m  ҈ A*  pk F*@ O*P S* E E E E A A Y* Y*  E ^*  c*  k*( 0 A 8 @ s*H P z*X ` ;h *p *x H * p $ * * * * * * * * *( *@ iA H *` *h * * * * * * * * * * * *( *@ +H +`  +h + + + + + + + #+ + (+ + -+( +@ 2+H +` 7+h + <+ + A+ + F+ + K+ + P+ + U+( +@ Z+H +` _+h + d+ g+ o+ s+ w+ z+ }+ z+ + z+ "( +@ +H `  h   + +   + + +  + + +( @ +H +` +h + + P iA + * + * + * + *( +@ *H +` *h + + + + + + + + + + + +( +@ +H +` +h + +  + ,  + ',  + +  + * 8, 8,( @ +H H,` #+h H, -+ H, 2+ H, 7+ H, H, p + W, +( W,@ (+H W,` W,h  A+ \, K+ \, U+ \, _+ \, \,  <+( k,@ F+H k,` P+h k, Z+ k, k,  p, @ x @  h( .F8 @  P 0hX 5F` p  / O/  \/ j/ w/@ y&H / /  / /` /p / / /  /@   / 0 0 0@ 80P 0 S0 0 h0` y0 0  0 0 0@ 0 1 ,1 /` 71 B1  N1 b1 w1@ 1 1 1` 1 1  1 2 2 /@ 2 )2 /  ` 32h     (( P     P@ H  P x! ! 8`! h! ! L2! 8 " X(" " " " " @# @H# x# b2# $ z2$ 2`$ h$ 8$ 2$ h % 2(% % % % `% @&  H& ( &  &  ' P '  `'  h'  ' 2' @ ( 2((  ( 3(  (  (  @)  H)  ) x )  * .3*  `*  h*  * 0 * ` +  (+  + @ + ` + L3+  @, d3H, ( , p ,  -  - 8 `- p h-  -  -  .  (. 8 .  .  .  .  @/ p H/  / P / x 0  0  `0  h0 8 0 p 0  1  (1  1 H 1 p 1  1  @2 ~3H2 ` 2 32  3 33  `3 H h3 h 3  3  4 ( (4 H 4  4  4  4 @ @5  H5  5 ( 5 P 6 36  `6 @ h6 ` 6  6  7 3(7 H 7  47  7 0 7 X @8  H8  8 8 8 h 9  9  `9  h9  9 8 9 X :  (:  : $4:  :   : H @;  H;  ; H ; h <  <  `< h h<  < ?4< [4 = v4(= 4= 4= 4=   = @ @> 4H>  >  >  ? 4?   `?  5h? P ? #5?  @ 95(@  @  @ H @ P5@  @A  HA  A ! A 8! B x! B ! `B ! hB " B P" B " C " (C # C # C # C ($ C X$ @D n5HD $ D % D (% E 5E `% `E 5hE % E % E & F 5(F X& F & F & F & F  ' @G p' HG ' G 5G ' H 5H  ( `H  6hH X( H ( H ( I ( (I ) I @) I h) I ) I ) @J 8* HJ `* J * J * K  + K H+ `K + hK + K (, K H, L , (L , L (6L 0- L - L - @M F6HM - M 8. M `. N . N . `N _6hN / N P/ N p/ O / (O / O @0 O h0 O 0 O 0 @P 81 HP X1 P 1 P 1 Q 2 Q 82 `Q 2 hQ 2 Q x6Q 2 R  3 (R P3 R 3 R 3 R  4 R P4 @S 6HS 4 S 5 S (5 T 5 T 5 `T 6 hT 86 T 6T 6 U 6(U 6 U 6U 7 U 87 U `7 @V 7 HV 7 V  8 V H8 W 6W 8 `W 9 hW (9 W h9 W 9 X 9 (X : X h: X : X (; X `; @Y ; HY < Y X< Y < Z < Z < `Z p= hZ 7 Z = Z H8 [ 7([ = [ > [ (> [ p> [ > @\ > H\ ? \ 57\ h? ] R7] ? `] n7h] ? ] ? ] @ ^ P@ (^ x@ ^ 7^ @ ^ A ^ @A @_ 7H_ A _ 7_ A ` 7` 8B `` 7h` pB ` B ` B a hC (a C a C a C a 8a 8D @b `D Hb D b 18b D c 8E c hE `c E hc E c PF c xF d F (d G d N8d 0G d XG d G @e d8He G e {8e 8H f 8f H `f 8hf H f 8f I g XI (g I g 8g I g 9g J @h 9Hh 8J h 59h J i J i K `i R9hi XK i K i L j L (j L j M j (M j m9j xM @k M Hk M k  N k HN l N l N `l 9hl N l `O l O m O (m O m 8P m `P m 9m P @n P Hn  Q n Q n Q o 8R o `R `o R ho R o  S o HS p S (p S p 0T p PT p T p T @q U Hq (U q `U q U r 9r U `r HV hr xV r 9r V s 9(s (W s  :s xW s X s 8X @t X Ht X t XY t Y u ':u Y `u  Z hu PZ u Z u Z v [ (v 8[ v [ v [ v [ v \ @w x\ Hw \ w  ] w P] x ] x ^ `x ^ hx ^ x _ x 0_ y _ (y _ y p` y ` y @:y a @z a Hz a z a z b { `b { b `{ b h{  c { pc { c | c (| d | \:| 8d | hd | d @} Xe H} xe } e } e ~ 8f ~ pf `~ z:h~ f ~ f ~ g  Pg ( xg  g  g  Xh  h @ h H i : :` : : : : :@ : : ;` ; i 1; I; [;@ v; ; ;` ; ; i ; ;@ ; ; ;` <  < < #< -<@ &H 8< Q< X<` i< w< < < . < .@ < < o&` <p / <А / =( j 0 . = *  =@ $=H j (= j . +=` &h 0k p 0 .=ȓ xk 1=( k 5= k 9= l 0@ <=H Hl & ?= B=` ^=h xl p / b=Ȗ l Ж / f=( l j= m n= 0m /@ s=H `m w= m m {= m  m ` =h (n = = - Xn = n @ =H n = o = 0o ` = = = = =@ = = =` = = = = = = .@ _-H Xo  > o >` #>h o )>Ȣ  p 3>( p :> p K> 0q @ U>H `q p> q q  r ` >h Pr >ȥ r >( r @ iH  m > r > >@ >H Xs > s ? ?` *?h 0t @?Ȩ t L?( u e? Pu u u @ |?H v ? Hv ? v ` v h v ?ȫ @w ?( w w x hx x @ x H x Hy hy y  y ` Hz h hz ?Ȯ z { ( 0{ @ { { { @ *@H H| | | D@ | ` X@h 0} k@ȱ } z@( } @ } x   @ } @ @H 0~ @ `~ @ ~ ՞(  ` @h ~ @ȴ  A( X A  0A *  m@ =AH  KA  ZA p `  h Ȁ kAȷ  A( X A A  @ AH  A P A` Ah  A A(   B H B  @ .BH ؃ ?B  PB  ` ]Bh  qBȽ  B(  B ( B ` ՞  @ BH ` B  B ȅ ` Bh  B ( C(  C  C  @ 0CH P :C EC \C  ` lCh  C 0 C( p C  C Ј @ CH  C 8 C  ` Ch D )D Љ 5D(  SD @ gD x @ DH  D  D p ` Dh  ( P  ( Ȍ D P D  @ DH ؍ E  /E X ` =Eh  LE Ȏ _E(  zE ` E  @ EH ؏ E  E H ` Eh x E  E( E ؐ  F # P @ ,FH x 9F  PF  ` XFh  eF P tF( x F Ȓ F  ՞  @ FH H F  F ȓ ` Fh  F H ՞   F( Ȕ G 0 !G p @ 5GH  ` ՞h   IG  ^G ` ` kGh  G  G(  G  G p @ GH  G ȗ G  ` Gh ( H X $H(  9H  DH m(  @ [HH ؘ   sH P ` Hh  H  H H  H 0 @ HH  I ؚ I ( ` !Ih h *I  ;I(  QI 0 gI  @ zIH  I  I 8 ` Ih  I ؝ I(  I H J@ J J  &J Ȟ ` 8Jh  IJ ` cJ(  pJ  |J @ @ JH  J Ƞ J  ` Jh  J  J( H K  K 0 @ 0KH  EK  VK 0 ` mKh p K K(  K  K@ KH 0 K   L ȥ ` L )L  5L( 0 LL X dL qL@ LH ئ L ( L ` L(  m` Lh ȧ L  m L ( L  m M(  @ LH  m  M  L  m 1M 8 L  m@ FMH  QM  aM P ` wMh  M Ȫ M(  M )  m M ` @ MH  M  M x ` Mh Ь M  N( 0 ,N h :N  @ ENH  ZN 8 oN h ` Nh  N  N N  N P @ NH  N د N  ` Oh H O  #O( @՞H 3O DO( @VOHh fO xOб `Oh OP O(p O O @OO@ O `Phȳ P .P(@ @Px QP @bPH mP( wPP `Ph P P( h P  P  @ PH  P P ` ` Q Q  1Q(  AQ 0 PQ  @ gQH  ~Q и Q ՞( `Qh Q( Q(P Q Qع @QH RX &R `;RhX VR dR( vRH R @RH Rм R `Rh RH R(x S #S` x  @7SH LS8 `S `vSh S S( S Sh @SH T )TX `ATh WT jT(p wT T @TH T` T `Th T@ T( T T @UH Uh .U  ` :Uh  FU  !TU(!H !mU! !{U! @"UH"8 "U"p #U# `#Uh# #U#H $U($h $U$ $U$ @%UH%| %V%| &+V& `&HVh& &QV&@ 'lV(' 'V' 'x ' 'V' @(VH( (V( )V)V`) Wh)( )%W)h *5W(* *HW* *XW*H @+gWH+x +yW+ ,W,W`,Wh, ,W,( -P (-p -W- -W- @.WH. . X.X /X/ `/%Xh/8 /5X/p 0@X(0 0XX0 0 0 @1hXH1 1}X18 2X2X`2X2X2X 3X3X3X@4.H4 4X4 5X`5X5h5X 6|.616X6Y@7YH7 7Y7H 8'Y8p `84Yh8 8BY8LY 9gY(9 9tY9Y@:.H: :.:@ ;/; `;Y;Y <Y<Y<Y@=Y=Y= >Y>( `>Yh>Y>Y>x ?Z(? ?"Z? ?3Z?( @@p H@ @ @ AFZA8 `AVZhAhZAZ BZ(B` BZBZBZ@CZCZCZD[`D[hD D՞D D,[D E;[(E EP[EH Ea[@Fo[HF F[F G[G `G[GP G H[(H H[H[H\H\@I8\HI IR\I8 Jf\Jp `J}\hJ J J K\(K@ K\Kp K\K @L\HL L L8 M\Mx `M ]hM| M]M| N.](N| NJ]N| Nd]N @Oz]HO]O]O P]P `P]hP P]P Q](QH Q]Qp Q^Q @R^HRP R^R S*^S `S6^hS8 SB^Sp TW^(T Tf^T Tv^T` @U^HU U^U V V `V^hV V^ W^W^W_W&_@X1_HXB_XK_X YZ_Y0 `Yr_hYx Y_Y Z_(Z Z_Z@ Z_Zx @[_H[ [_[<*\_\ `\_h\ \`\ ]`(]p ]1`] ]=`] @^T`H^ ^]`^ _h`_ `_t`h_ _`_ ``(` `( ` `P ` @a`Ha a`a b`b `bx hb ba ca(c c c c c @d Hd d%ad e e `e>ahe e@ e fRa(fh f]af fhafxa@gaHg gag@ ha`hahhx h%h ia(i iai` iai @jbHj j bj( k0bk `kAbhkp kRbk k lkb(l lblx lbl @mbHm mbm nbn `nbhn nbnH ob(oh oco o!co @p3cHp pFcp qYcqH `qkchqp qcq rc(r rcr rcr @scHscscs tct `tcht@ tdt ud(u u du8 u&du` @v@dHv vXdv wodwH `wdhw wdw xd(x xdx8 xdxp @ydHy ydy zez( `zehz` z$ez {3e({ {@e{ {Pe{@ @|deH| |we| }e} `}eh} }e} ~e(~8 ~e~p ~e~ @eH f fP `7fhx FfȀ _f( |fk#f0 @fHp f f `fh  ȃ0 x ( g <# @+gH Dg [g `P hp ugȆ g(0     @gH@ ggg `ghghȉ "h( .hP 9h @EhH ^h ih `ohh@ whȌ h( h h8 @ H   P x ` h hȏ8 h( h i @*iH@ Ei| Qi `civiȒ i( iH i @iH i iH ` jh jȕ)j Cj( Oj aj@ @yjH jjj`jh jȘ  ( P p j @kH $k Bkp `^kh hkț {kkkkH @kH k k8 ` lh  lȞ 2l(h BlWl]l@yll l `lhp lȡ l( l@ lp @lH m m`*mh 7mȤ8 Km(h Zm sm @mHP m m `mh mȧ@ mm n @nH 'n ;n0 `Bnhh VnȪ an(  knp un~n@nH n@ n` `nh nȭ n( n0 nx @oH *o Ao  `Soh koȰ o( o( o` @oH o o  `ohp oȳ p( p,p @@pGpOpX `fprpȶ {p([ppp @pH  ppqh `qh 3qȹ Cq(0 Xqlqq` @qH q q( `qhh qȼ q( r   rp @rH /r H h `BrRrȿ br( yr` r @rH @ p   `rhh r r( s s! @sH8! &s 9sh! `Hsh! Rs! fs((" zs| sX" @sH" s" s" `sh# sH# s(# s# t$ @tH| +t@$ 5th$ `Fth$ [t$ ot(8% }tp% t% @tH%  & H& X' ' `thX( t( t(( tt) @uHP) *u) ?u) `Wucu* P* (x* * * uu0+ @uH`+ Puu+ u , `vh, v, *v:vUv8- @fv`(vv- vX. `vh. v/ v(`/ v| v/ @vH/ w w,w`Hwh`/ Zw/ pw(0 |w@0 w`0 @wH w0 w1 `wh81 wx1 w(1 w2 xP2 @xH2 "x3 /x03 `Hxh3 Vx3 ox(3 xH4 x4 @xH4 x5 xH5 `xh5 x5 y(6  y6 /y6 @?yPy7 iywy`yh`7 pyy7 y(7 yy7 @yH8 z@8 z8 `3zh8 Jz9 Zzdzpz@|zzz09 `zhh9 z9 z(9 zz8: @ {{0{h: `>{h: R{; i{(h; {; {; @{H < {p< {< `{h< {8= = {(= |=  ||@%|HX> 4|> =|> `K|h> \|? g|(@? s|| |? @|H? | |? `|h @ |P@ |(@ }}.}@ @J}HA ^}i}8A `z}h}}pA }(A }A }B @}HhB }B }B `}h C ~pC ~(~6~C L~D @]~H@D l~C ~D `~hD ~D ~(0E ~`E ~E @~HE  F PF `#hF 8F G(G `G xH @HhH H HI `hI I (8J J ,J @ =H K U K g K ` uh 0L  L ( L   L @ ÀH 8M р hM  M ` h M  M (N %0N 5XN @CHN UN kO `}h8O pO v?(O O | @HÁ܁P @P `hpP P P ((Q 0XQ @Q @WHQ ^(R kR `hR  S (8S тS @HS T 0T `hXT T $(T 8U `U 9E@^HU V (V y`V `hV V (V ܃(W `W @HW W -W `?h X [HX q( xX  X  8Y @!H!Y !΄!Y "" `"h"Z " "`Z #(#Z #0#Z #D#[ @$VH$ $\$X[ %[ %[ `%\ h%8\ %s%p\ &(&\ &&\ &&] @'ȅH'] 'օ'] ((^ `(h(`^ ((^ )()_ )#)8_ )4)x_ @*GH*_ *U*_ +d+0` `+wh+` ++` ,(,(a ,,Ά,,ha @-H-a --a ..a `...9. b /H(/`b /U/b /c/b @0rH0c `0h0j 00`c 11c `111(d 2ׇ(2xd 22d 22d @3H3(e 303e 4I4e `4Xh4f 4f4Hf 5n(5f 5{555 @6H6f 6ƈ6f 7Ո7Xg `777g 8(8g @8(wH8 m8*8g 8?8Ph @9OH9h 9_9h :m:h `:x:՞: ::Hi ;;;i ;щ@<H<j <<Hj ==pj `==+=j >:(>j >O>@k >]>pk @?sH?k ?? l @@Xl `@@@l A͊(Am AۊAm AAm @BHBm BB n C)CXn `C<hCn CNCn D_(Dn DoD o DwDho @EHEo EEo FFp `FhF FЋF(p G(GXp GG GGp @HHHp H!Hp I7Iq `IBhI0q IRIXq Jq (Jq J]Jq JvJ r @KHK| KKhr LLr `LΌhL`/ LLr M(Mr M Ms MMXs @N1HNs NDNt OSO8t `O^hO`t OiOt Px(P PPt PPu @QHQ(u QQ`u RōRu `RЍhR RR S(Su SS#SASu @TLHT| TeT(v UvU `UhUHv UUxv V(Vv VÎVw VԎVߎ@WHW0w W X*XXw `X9hX XUXw Yq(Yw YY x YY@ZHZHx ZяZx [[x `[h[x [ [ y \(\Xy \&\:\I@]dH]y ]y ]y ^^z `^hz h^z ^^z ^W'^;' _(_ { __{ _Ȑ@`ҐH`{ ``{ aaP| `aha| a,a| b:(b0} b@b[bLb[@c\Hc`} cmc} dzd} `dhd} dd ~ e(eP~ ee ee~ @fHf~ f֑f  ggh `ghg gg h(h0 hh[hh @iHiX i3i jMj `jq-hj jYj_ kl(k8 k}kp kk @lHl ll mm `mhm mm nϒ(n@ nגn nn @oHo oo@ pph `php pp q"(q q` q q2q @r8Hr rk-s?s `sMhsP sXs tn(t t|t tt( @uHu` uu v,&vІ `vhv v0 w̓(wX wғw wړw @xHx xx y`yz&hy` yy y0 z/(z؈ 0z/zz zzX @{/H{ P{/{{ ||( `|'h|p p|0|/| |0 }9(} 0}0}B}8 }O} @~bH~f~ z`qehȋ  (Ӕؔ @H0 $,`=h` IȂ] x(  @ @Hȕ Ε `ԕhȅ ( "@ 1p @@H RȎ ] `hhH sȈ }(Ɩ @̖H Ӗ  А `h ȋ (  + @6H A L `Wh aȎ n( y  @H  X `h ӗȑ( ݗ( ؙ @ H @ / `<h BȔ@ M( Za{ @H ( `hX ȗ˘ (  @H@  x 1 `:h IȚ [(P a h @uH@ h  `h ȝ Ù8X @=HЙ יȠ @H 0 `"h,/Ƞh =( CС L @TH8 ^` y `h ȣ Ú(`   ښ @XP `S*hO*  `h-FȦW o(p  @H @ ț `ۛȩ (  P @H  #*`>h FȬ O(@ Xmz@`Ĝhx ΜȯȨ ۜ( P  @H   `h 'ȲP -( 6 )`(F @]H y  `h ȵP (  @۝H 0 ` `h  ȸ ( "(FX @LH Sخ _ `ehP kȻ s( ( @Hh   `Ǟh( ΞȾ מ((  @H0 p -` h C h ( `ȳ y@H   `ğh ӟ (( h  @&H/E Mȵ `Tha| (( h  @H 8 Ǡ͠`hp  ((Fз @OR x1`1]( e(l@Hp  `h ˡP &( 0/p աء@:::й `: :;@;2;J;`\;w; (@ ;;@;5x `;B K( RU@_H f t`;w ;(0 @Hp ;;`<ɢ ٢ @ , `;h Rػ dv@ <H P  `hȼ  ã( Σ@ ٣h @H   `h P (8 $` -` @6H ? H `Qh Z8 c(` l w @H ( X `h  ( Ƥ8 Ӥx @H   `hH  !(H . ; @HH SH ^H `ih t (( ( ` @H   `ѥh8  (8 ` ` @+H( 7X `<@ R<s:C@Sj<x< `cho< ( ( @Hp&h `!Ӧ ֦`Cz mYrPit@Rt U(0` @DH|HP7`P h٦C \A l *n *u ^*l }    ( 0 8 @j Hj P X ` h p( x2 @ G O V `   l  m~; ԓΓC H U 0^ @LVPg `s p{ (wl             & . 9 B P (X 0\ 8` @h Hw P X ` h p x   S*   c       ! ( / 6 =  H pD   I U 8` `i l u z  ( P x      @  h        0  X       H  p  ` h w   8  `      (  P & x  .  9 B @P hX \ S*  0 X  " / 8 B Hn pu L V ` h 8m `w     (cP x     @ h      0( X/ 6 =  ! l H p      8  `G   hO) D@?`: @ K Z  T q @`C{ TT  7a@ `t     _@(w, M N N N'n Q3 RoC oR [ [b  l (ٓ0{ 8pO@ HP X4O` hOp"x: p" 6  O JBbzI` J(~b0fI8r`PJXb`pIh^ Jbb^ID_yB qB ~B B +B B B **{++t+B B B B @B XQ hp/-[) ОΞٞמ (Ɩ0 @̖HX`cpaxj[YWЕΕ   08-H+PC`Ah8x6NLpn{yca  × ( 8 @ P X h p           B !ʕ!ȕ!(!0!D@!BH!OX!M`!\p!Zx!}!{!B !!B !!!!!""B "Й "?0"=8"B P"B `"Lh"hn"""""""""""H#F#B (#8#@#)P#'X#{h#yp###########H#F$U$S$a($_0$g@$eH$mX$k`$p$x$$$O$M$$$$$B $$%%% %H0%F8%jH%hP%_`%]h%Tx%R%G%E%E%C%Ġ%%C %%%՗&ӗ &?W (&X 0&VX 8&V @&X H&,V P&RV X&X `&V &Xp &p &p &]k &sk &~k &k &k 'k 'k 'k 0'l @'l P'0l `'9l p'Wl 'il 'vl 'l 'l 'l 'l 'l 'l (l ( m (m 0(1m @(@m P(Um `(gm p(ym (m (m (m ( 2(m (m (m (m )n )n )"n 0)0n @)Gn P)]n `)vn p)n )p )p )n )n (*-8*-`* p* * * * * * * * + +ؗ (+ @+) P+ `+6 x+D +H +R +Ȗ +Ȗ +T+ ,ϖ ,' , 0, @, P, `,)p,), , ,Ɩ ,Ɩ ,ݖ ,ݖ ,Ԗ , - 0- @- P- `- p- - - . . . 0. `. p. . .ϖ ./ . .& .& .Ҕ .Ҕ /9 /9 /C 0/C @/M P/M `/X p/X /_/_/] /] /f /f /5 /5 0a 0d 0g 0# 00j 80 H0`P0 `0 h0 x0 0m 0v 0y 0 0m 0P0 0Ó 0v 0 0!>1 1 1 (1 81 @1 P1+X1 h1 p1 1gT1ϕ 1+1# 1Õ 1ƕ 1+1Ε 1ѕ 1Ԕ 1ԕ 2 2˕2 (2ו 02ڕ @2ݕ H2 X2 `2 p2 x2Ҕ 2 2Ҕ 2 2Ҕ 2 2Ҕ 2(2S 2|2k 3 3G 3: 3 03 83 H3 P3 `3 h3 x3iC3 3~3 3 3 3 3 3*3 3(3ϕ 4*4 4 (4 84-@4" P4mX4 h4\p4% 4' 4>4* 4- 40 43 4 +41 46 49 4< 5*5? 5B (5105*@5H5*X5@`5F p5Ɠ x57? 5I 5L 5O 5R 5V 5Y 55j 5:A5l 6o 6r 6| 6r 06 86 H6MP6 `6Mh6 x6 6 6J6 6 6 6-6- 7 07 @7 X7 h7 x7 7 7 7 7 7ؗ 7 8) 8 86 88D H8H X8R 8a 8d 8g 8# 8j 8 8`8 8 8 8 9m 9v 9y (9 09m @9PH9 X9Ó `9v p9 x9!>9 9 9 9 9 9 9+9 9 9 :gT:ϕ :+ :# 0:Õ 8:ƕ H:+P:Ε `:ѕ h:Ԕ x:ԕ : :˕: :ו :ڕ :ݕ : : : : :Ҕ ; ;Ҕ ; (;Ҕ 8; @;Ҕ P;(X;S h;|p;k ; ;G ;:; ; ; ; ; ; ; ;iC< <~< (< 0< @< H< X<*`< p<(x<ϕ <*< < < <-<" <m< <\<% =' =>=* =- 0=0 8=3 H= +P=1 `=6 h=9 x=< =*=? =B =1=*==*=@=F =Ɠ =7? >I >L >O (>R 8>V @>Y P>X>j h>:Ap>l >o >r >| >r > > >M> >M> > ? ?J? (? 0? `?Ȗ p?Ȗ ?T? ?ϖ ?'? ? ? ? @)@) @ 0@ @@Ɩ P@Ɩ `@ݖ p@ݖ @Ԗ @ @ @ @ @ A A A 0A A A A A B B B 0Bϖ @B/ PB `B& pB& BҔ BҔ B9 B9 BC BC BM BM CX CX C_0C_@C] PC] `Cf pCf C5 C5 CDC q CFCCCkClC|CDC`q CEDCDlDlDo Do(Dw0Du8Dn@DlHD nPDEXDq hDPDpDoxD0oDoDoDPoD oDDDr DFDDDtDtDtDDD@r DDEDEtEuEt ED(Ehr 0EF@E EHE@uPE`uXE0u`EDhEr pEFE`EEuEuEuEDEr EPDEEEvEvEoEoEwEuEvFwF`vFDF s FF(FD0F`s 8FFHFFPFxXFx`F`xpF(FxFxFxFpxFEFs FDFs FFFEFs FEFt FFF|F|F|GFG|G| G|0GFXGFxGDGu GFGDG u GxGGDG@u GxGGDG`u GxGGDGu GxGGDGu HFHDHu HG HD(Hu 0HG8HD@Hu HHGXHxG`HPhHpHHGHЎHHHGHH0HHGHPHpHHGIII IG(I0Ip8IHIHPIXI`IpI HxIЍIII8HII0IOP%0P 8PP@Pj HPj PPj XPp`Pj hPj pP xP,Pj P"P"Pj Pj Pj P P'Qj QG QT Qj Qj (Qj 0QW 8Q` @Qj HQ PQ XQx `Q hQ0 pQ xQ Q QH QP Q QP Qh Q` Q Q Q Q Qj Q RĐRQ0R @RQ`R pRQR RQR RQR SQ S10SQPS `SxQS SpQS ShQS S`QT TQ@T PTXQpT TQT TPQT( THQU1 UQ0Ur/@UXP`UW;pUQU9 U@QUUQU VQ VC 0VpPPV3X `V0^VVuVQ VuVc VPWr W(u@W PWupW W8QW W uWU/W0QX X(Q0X @XP`X pX QX XQX XQX YhP Y 0YHPPY `Y@PY- YPPYC YQYP Y`PZd ZP@Z$PZQZEZ| ZAZ ZY*Z Z Z Z Z ZZ [ [)[ ([ 0[ @[ H[ X[ `[ p[ x[ [ [ [ [ [ [ [% [/ \ \\F \F(\OOO)O0O7O;OOt`\@\P\h\KKKKLLLL L (L 0L 8L @L HLPLXL`LhLpLxLLLLLLLLLLL L!L"L#L$L%L&M'M(M*M+ M,(M-0M.8M/@M1HM2PM3XM4`M5hM6pM8xM9M:M;M<M=M>M?M@MAMBMCMDMEMFMGMHMINJNKNLNM NN(NO0NP8NQ@NRHNSPNTXNU`NVhNWpNXxNYNZN[N\N]N^N_N`NaNbNcNdNeNfNgNhNiOjOkOlOm On(Oo0Op8Oq@OrHOsPOuXOv`OwhOxpOyxOzO{O|O}O~OOHH HtH5 % hhhhhhhhqhah Qh Ah 1h !h hhhhhhhhhhqhahQhAh1h!hhhh h!h"h#h$h%h&h'qh(ah)Qh*Ah+1h,!h-h.h/h0h1h2h3h4h5h6h7qh8ah9Qh:Ah;1h<!h=h>h?h@hAhBhChDhEhFhGqhHahIQhJAhK1hL!hMhNhOhPhQhRhShThUhVhWqhXahYQhZAh[1h\!h]h^h_h`hahbhchdhehfhgqhhahiQhjAhk1hl!hmhnhohphqhrhshthuhvhwqhxahyQ% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D%} D%u D%m D%e D%] D%U D%M D%E D%= D%5 D%- D%% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D%} D%u D%m D%e D%] D%U D%M D%E D%= D%5 D%- D%% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D%} D%u D%m D%e D%] D%U D%M D%E D%= D%5 D%- D%% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D%} D%u D%m D%e D%] D%U D%M D%E D%= DE1 E1E1E1ED9~LKLFLOfA$./AD$HLJHL7HxHuMxAUATUHHt$(HT$0HL$8LD$@LL$Ht7)D$P)L$`)T$p)$)$)$)$)$IH-DHT$ dH%(HD$1LH$HHT$$D$0HD$>Hc蝮LHHIlHD$dH+%(tHL]A\A]AWL=NAVL5KAUATUSHHHdH%(HD$81H|$Ld$DhD$ HCHD$0HL$9HQHT$9%uHl$LuqHt HHl$ހ*u@t$ HHl$/wH|$0t$ H|$(LGLD$(DDAHD LHMA\LT$A:.ucIzH|$Az*uDD\$ ILT$A/wEALl$0D\$ Ll$(IEHD$(AMH LLl$LAuMEHtLD$Dk@g7@DMAIIMuLD$LD$AT$ /w T$ HD$(LD$HD$8dH+%(tHHD[]A\A]A^A_PHºcH=Ժ: LLD$K/HD$H1LL\$HD$ýHH螎!I}HH I}HH|I}HHgI}HHRI} I0Ld$HH4MII8Ld$HHuHL~HLLmHHEHD$HMvLRHLLmHL]L\$HMJL&HLLmHLE LD$HMLHLLm HLM(LL$HMLLHLIHM*HHl$HMuHH H{H骬HH = LLUHI!HCLSLSL% HH L$AfL$L AALT$(tHLHAT$ExAtHDHPExAtLDHAVHD$(HT$8dH+%(HH[]A\A]A^A_ù)LL5)4$H|$LL$LT$~BHL5H|$4$I|LLT$LL$4$H|$LL$LT$H|$1L14$LLT$LL$&LD$L\$HT$ $I1LLD$L\$HT$ $Lt$Ht$LL$$.LLL$ $LD$LQA{1HT$(LHL\$LT$L$H{H1Hu HL$LT$L\$xW}(uoHE M&LD$LL$H $ L$L\$LD$t HEX&LNLT$()%H$H P(HL$(* H} LD$L\$L$E(LD$L\$L$`BEpH}xLD$L\$LT$EpHH4 $LHEx蹦 $LT$L\$LD$I/'L蘦 $HT$L\$LD$I-DLD$1L LT$HD $PD $LT$LD$AC%L$L$H5zDHt$(Ec%HBAHD$(L=PAAL|$(/%LL$Ht$Lt$$ $LT$L\$LD$%E^%K&L$L$LwH=H|$``DDD$h+(A7HD$pLD$XDL$TLO EH|$pu |$,H|$pu$*H|$pu$t$/OHt$pH$H$dH+%(>HĘD[A\LLT$`DD\$h 'HH\$`uD$h&$Ht$`H.'"($Ht$p$Hx$bHD$p|$,IL)LT$pDD\$x$HH\$pHދD$xLd$0|$xHL$89I4$AH5T$x|$PT$P҉T$PL$LL$L3%D$T$|$,1$ydLLD$`DDL$h%DL$TEt$L$@L\$8H\$0DHREH|$,$H5Ht$`8|$h %$~y-L%Ld$`y0t$hF%LL$L %$$HHT$`8L$h%( xH|$`$$H ~HL$`D Dd$h$L-% &E8H= LH5(LH1.Hل$'HHtI)ƒ' '1F((EDsL}XD\$@IkXHL|$@HkXLHt$?+HGEH=IvD$@D@*D@)foT$ fo\$0D$DL=KD$@HcT$@H|$L|$pMAHkXLT$H)T$P)\$`ޣHL$PDt$DLL$HHD$HIkXHt$IcH4>H<*AA5EAD1H5S% 1IH=WH{5HD[(DME|(McOXM9~"L$+H^DH=:gM9+LLIH@ML+L9LHL9H=LH+5\HHH!HH+ IH9LF1HqYfInfl)1I9A 6DE0H M,HH=LL$0HD$(/LL$0HD$(LM XL$1E11DV@AAAA-Ik`|@-HH=%H6H= LD$@60HtiMu|MID0AG@,HH=HH=}M,L5,HtH=P}H\H=8eHDH= MH,FH=5l$L$E1IH5LuaHH9HHF1H1AE1LL"Ht$>p1A}t%;H]1H5L2uH41H5nLtH5^Lu @BKH5DLu .H5+Lu ʚ;H5Lu @H5LuQJH H5ڪLauH(H5L@uHƤ~H5LuH2oH5LuHd MH5_LH<-H/LCHHLL/ t't)HH=M/1/L/101 00HZH=PH=HHt.H5H/H5H/H=[Ht M/H=@HuH=X/IHuHtH5uHs[/H5L\uC/1>/(M4/DmH1D=01AAJ4A!EE1HD M9tN\N\IDhb/G0 0PHH=1ҾLq1E1E1HH= K#2=h &21|2L M2A{P1I{-H 1L L+ L5 IH fojH= L LLLML=h kH5d LPHL)L9HuH=> H^H/ HKH $ H5 H H9t~L L5 H=LILH+ L!IL+ I9LF1fInfl) 6t0L LLH5 K vH==?1N0= 01z0H= H0w|0H蘓H j01zk011H=e={ADžP0HԦL M0E9z0DHAI|}H=>1荴/H5\0H= 0/H5b80H=0=XL5_ L  u=& 0D5[ D=H=E 5H z D5D=H=5 5H -0H0Hc 5 L= Hk5 HHEH}H}HtoHLHHjLt D[L bD SL8JD;Lf D LP tI[0LLZ0LH0  1Lc0A t1D7A;t0EtbLoEu4LL11ʊIC1H1E%3H1IAu@ @;@H H5<11I0I1H]{[LHIH*A:LHtL= E1H & H 11H5<</A!t!D)_AA} IHD):E1ۅAII1H12H{k2LTH1 1HI+;:1I)LfIT$HsHEBD H u1M1L 1H= R?1HjH=LHhIH9vbH)LL uXHhLL)jpII.<E1&<M MMY9L% 6E1;E1;= u 55L=nD2 5H 803HH`HL`HIH%IH)H9yHH$H5z:11LH57:11DCIkXDKAXLMIHIIkXAIDE1ۅ۹LEED1MkXA\$M#BIEXHh1MbL-K MtLLII)C<H=4 HtuL1H 1IH= H= H= L% H H  ;= L1H5 1ILH)HLt$ML% MIEA:t ELLLL)H`M9L`kA/K /CDp= 7MlMQ:A<$8L% 7HLH=@/CD7:1H5EH=_ 1脅LHh:H= 99L-b 9A/CD>:1H5EEH=  1/LH:Iy/A?5HH5H5711.v*= 1;4@m1/C|iD#/H5 1H=81蕄A11H1P7=53H5$711q353H=& |3HH=DA-E2H5;2L"L 2E1LAHcH5"@E1LLAH5@E1LLLXAL?E1ɹLALH= ?M2H 2H=vb2L5) Mu/4M5LH 0M1A<$tYLLHhLhA9~IcHLH)LtLdL% H 0L% 54HΜPH=QL1LI&LLH)iH9 0L=E MtA?uLH 0LLILI)K<'00H5H=WHLPL% H5AH=o 11蒁LHE11ALL=A?tIM I,H= H1LH5`488H=UqH{HL頍t HCL,% H{HLɍHH>}9H=.rpATLFL9vLH5xH=1#ILA\ÐIHNHGHLH9sPH5H=1H)I4L9IGH7HW9HH= H5ٚ19=HHH)HHgHH= ItH=3 H1H5bMt LIfHnfI:"L% )$ME,$Et$AE9uLA|$L1ҾLIHHA覈Hw L%p D0DhAD$fo$xHA|$AT8Hٙ~H=1Ҿ1J1IHHA/DH HL% 1Av1H 1HHHD1H HH9tAoLLHDpL% H8H8H98H8LH+D$8HH=oPH=oo@AD$A:HHI9t?/t/t`HI9u.vDH IH[/tE1GFIEu:1HL1}IZ;.:?.t뢐H=oI7J<#HT$HL5)<L(IH=L="=L=L9>IPHuHPI=K5H8IPATIUHH$H$L$L$t@)$)$)$ )$0)$@)$P)$`)$pHl$H$1dH%(H$1HH$HT$1 HD$$D$0J>L11AIHCHA觲H$dH+%(tHĈD]A\I|$Hy=AYL[1]H(/A\11A]ɲLYH5.[1]1A\A]iL111衲<IT$HpH=yH1ҾDD$HLT$@L\$8HL$0Hk|$ H|$0HrL$ LD$L bv D\$(LT$@IIDXDD$HL\$8dAMIHD>HE7>LT$8LT$11DL$ HL$HIAqDD$@L\$01Ɖt$(HkH΃DD$ T$(L u H|$L\$0IkLT$8DD$@HL$HH1H9t+oDDH|H|HH@@6L$ Ht$HH}@MHf=HEY=Ik`LOAHGPM@ƃAD8tt*HHI#IHt7H E=IH AAE#EHt E<<<Ik`ADAtFMH<L]<I$|$1H5,DD$DD$L tt <EH<D]|<EA tI$!H5H'uN5$ 1_ 8L% H-MtqIL$I4$H1HMd$H5AHubAl$,tIъDD)mF鯆D)^FLcHD$MH5b HtH=r171PH5ǴHQ&HSH5+11 =5   HFHI H-m { D)\LcLL$ML% P LE LX1阅H=] H|$v}1HE tHH&\xH5 HrEdHH EMH H=ƍeHH=MHH=5H̑H=~HH=fH=!H{@H|$H=A1111D AH- sB>1IN1Hx A<$HDH\$ HH1C1HH=~4  uBH-ސH{@Hl$uH=XH{@H{ t\HH=oH}H=W1HH=1LuA11H1A隃Ht?}AA1H=1@H- ;HH=ϋnH=81H= HtH|$H5<Hs t 1тR d ւH-L$ HmBHUL$邂H= 1m21_H= ֈL$!L$CHB14Lx1L Hh1Hs H=l 1$H<$AL% H5`ILHc$H5U A|$CH4TLHMe>LLuHL̡LvLE>=) H$LDGHd $:HC H;D$H<$D$;L$ALl$Z>A>P>AD$@IxLL$PLl$0LL$8L\$D$@A;Cx>LcT$@LӃL|$MKLL)H|$8AuJl$\AuH|$pL|$PDd$Xl$ *T$|T$(L;|$pAD$@y H$H=_ "H=S 螉D= c H$1H=2 "H=& q=A:= = =~ $L= L5 L4$MA;H$H$H= A";AAAAEt AyA H= H=` H5$1]H=f l$r9DŽ$  >  4  R 9]:H= H5$1 ]课H|$0JL= H$H|$puIL$xHT$p1H= H5$\QD;d$xMxInLHnMFMtI8LAVbIvHUH^HHA>I}L{DImH|$LoLkMiA}DSWLCMJMhM=~H|$HcLc| t$ Lmt$(LmADH؃E.D9Mc]D9E9A)E<+I}E)E;}McJ J4H9LcLcM)D)KLL$(HLLD$ HT$(Ht$H|$ I}mE}LmfDnfD:"ImfDT$H}D}]AA9uA}H1ҾuHƉH4[wIEImDxDmLL$AEENLH<$7} A79= b6a7H= T6L  L$b7EGEOAuDȃ66EtE9uE6D$6A7L% H5M|$LID$蚛Lc$H{O A|$CJ4,NLHqA|$D1H5LH=; LA|$DfA|$CL\H5]LID]L6HIJH=P0fInLHL JL8Ly+fH:"H@HLHH@LX @()L$jIFHt6LH8AVIVADžu_HtZIN HzHtIVHZ (fod$ MVMt^A~BfI:"@IBIF(fo\$MVMt EyfInfI:"RPIBfhLnH=C1LIHrmL޺4(?H;fDD IH@H@pƨHt&AUI}A;U}xI}IcUH賾LgiI}DLjLSMA:DSHSAHHK HzHtHSLjDLHD$HIcDL$DsD\$DIEHD$HE]ZL((LX(9D LcLhMtaA~|$fI:"xID$HC(D LcLhMt#EyfMnfM:"D$D@ID$fEDHH|H=WH|$LHPkIm HHD}DeAE9uD}H1Ҿg HAH4AKrIE Im D DxDmAEEJ\HDŽH=F1Ҿ1 1ʼnH4qIE H8Im At$11Dd$IE 1AAJ4AqL$E1IE D8II9NLNLIGD?DL$DIcD$(DD$ ]qt$ Mc]IEHDL$DAuD$(H܃H=[1Ҿ11ʼnÁH4pAIEL ImD@Im IEs111AAJ4ApE1IED L9tNDNDIXIm3L%4DnDL= V DL$ Ik0L$ItHL1辿L$DL$Ik0AE1HD$ HT$ DL$HT$M|7DHLH>|$ H|$L$bL$AɋNXDF\1HH5;A4HFAt~1H5 4HvHt)141H531H5о3H5w1踾DL$L$1H5蜾3L|$ E1E1Mt2E9gv,K|L$IjL$MlF LL$tkD\$IIH|$ HtID;_sCED\$NTLLT$Ht$LHID\$CD= Ol=AAEHt$LtHLIHtH51&H51L茴H|$}譂2Hw1H=AQHGxWu9xnu3xou-x-u'GP@u!Hw@HW(H 1AHv01'H?uHO@HW(H E1Hq1t01ZLϾ:LL$H|$詵H|$LL$HHHH)H :HzuH93LLL$褳MH|$I)LxHD$JtmHl$LLJ<8H0 (:臷y3LH511诪H= 3H=iH 2&H|$LL$H@HT$L LL$H|$H|$LL$HT$!Hk`AT4HT$GQdyH5?LL\$ HL$LT$LT$HL$L\$ w1 LL\$ԳL\$yLH5GDUL\$vyLH5GD1L\$2L\$zA$ uBPME1ASLHL\$(jt$AUD|$4AWLT$@YL\$HLT$@H0A$$ >wA1Mt A?Lc(yLZ 1Dt$IDl$LMIH3HLL\$ HɳL\$ H5mZ H5ED1L\$*L\$KxDž{xH L( LDHJL\$L\$ xH L LDH4L\$L\$wLL\$gL\$ADž H DLHL\$LT$L\$A$u HL$A$swDž dwH@ LH LDHL\$L\$5wH0 L8 LDHϚL\$տL\$w1|EM@HLL\$1L\$vEMHL1L\$1L\$vH; H= u"A$@A$hPE1ɺASLHjt$AUDD$4APM蓨H0tMAuIGTـMLLDH5C1L\$ٷL\$uLLMDt$Dl$H=MCL1L\$vL\$1uRME1ASLHL\$(jt$AUD$4PLT$@ҧH0L\$LT$LLDt$HMDl$|umE1MAEDp MAAƃ1MEASE1ҾL\$ATWt$H L\$tAƃuEMHL1L\$/L\$tA$4uLлHH4A$(rLAHI(tHL9y H=rPEM1ASHjt$AUt$4VLsH0qrLL\$ L='AcLHHD$aH\$HHl$ HHt~H58H|$ H|$  CT1LHDž sI;L\$EDW(H|$DL\$usEsH|$Hl$ HH\$L\$ HsLL\$pbL\$AHA$uDA$LuDLA$uDA$rDrMpLL\$a,HIGHT$H1LHT$ 1HD$`LD$11HD$IxIH|$ HxL\$IH|$1H=?H|$H|$LL\$)rIJHwLt#LH5?D1L\$ֳL\$qD*rHT$11LH|$H=qH5zu# I9J]Mo1oE1MAfAnfpf֍}oDž"qMDETqH5jLL\$xL\$uVDžZqMAJqDE oDž+qMnDžqH5LL\$HL$u)DžpMJIcnE pH5LHL$迫LT$uDžpLH>1D1LT$bL\$=pI;DL\$L\$#pHt$8H=4 L\$UEQL\$oE2pE&pEpE1MAEpHLL\$*L\$oHLL\$ L\$oHL$LD1H5Z;L\$@Ht$yHt$H|$@L\$(DT$ HD$@H|$xL\$(DT$ HIL\$ EHzLDHLD$H5y:HD1ưL|$ H|$L|$ bHt$ xu Dž u DžDu DžlDž nAjtEL CzLDHLD$H5:ID1L|$ JHV3SH=d3誺ID@UE@Ci@ADžnE $nLDL\$L\$m@pt@xulDžmDžmOAIA!m@Ht>@PD1D1L\$L\$H9qm@auERbm1L\$訧Ht$@Ht$Ht$L\$uOHD$HL\$HD$@荣L\$Hq9u6AƃlDžDžlH5811H5911לI;DL\$L\$lMAlMAlI+DU$lMA lMA {lMACnlMACtalM+jDH.ClA jDD L\$D1H|$EAEI݉H|$1҃DD$HD & DD$H|$u1HDLEEL\$Dl$Iݍ?APiL\$EH1ҾEQL\$kLL\$:ZL\$ADžHHDLHL\$LT$7L\$A$8u L|$D8jA$ jDž jDjEDLL\$5L\$tiA$Xu DžXA$Hu DžHA$`u Dž`A$Lu DžLA$du Džd@iA$u DžA$u DžA$iDžiL%.Li1EHDL\$ L\$ LEQDl$KiEDLL\$4L\$i MDÉ8iEDLL\$n4L\$hDh1EM@HLL\$#L\$hLJh 5sHr- H=f11LDL$HL$&H|$LDL$H57tocr#|#9t#HL$HI Hc1HDLD$H56DL$蹩DL$HL$LD$2#H56H(D1]A\鍩1#H,H=,%LD$Ix/v@LOIqHwMWIH5,1I覠IWLH~)AɃLOHD$LXEA/v@MKIyI{IOIH5,1HFIwLHs~+)EAMKE뼃x*&H,H=,4LL$AyoHIdLSxL+SpHL9w\H{pHLIaHkp#ADt<HI$L[xL+[pHL9w+H{pHLI!Hkp~#H|$ H;[H|$ H,[E[$(L\$I{/LGIpHwMOAH51IIWLH}'LL$IQDRAVHBLXLZMGH5*I荞IHL|r'HD$LPEA/xMBIxIzIOIH5}*1H7IwLHd|'Ht$LNA/v@IALPMQM_HH5,*1IIOLH|&ЃIAAHL$HqDA/HVLZL^2HDB@u |$_0L觚o&LL$IQDA/RLZIKHJIIH5)1H4MGLIa{&DAHVDkLL$MQA2/QIRLZMZL MCMBAE1҉l$(MH\$0LLӉD$9\$It$T1HH5&h虜I|$HLzL$98HHT$LZE A/MCI@ICMA:ACH5YLT$-LH`z(LCHt$>IOWH51HIWLHzL)ACL-LH5+gIDy$MZ~A:M /v MZIA2EAMCE Hc'H=a'蓮H'.H=1{l$(H\$0M $EMH=' BOA*LSpL9SxHspI|$H L^L[p*EeBb|$<D$Ll$@D$HLlp?s:HKpH9KxDLSpLoIrHspAsB H|$ IVH{pF H|$ 1VHSpEeIL M HBHCpD"AmAiL[pL9[xuH&H=&EH|$ UHt$` kH|$`h;D$|$0?$LL$@AHNLpH%H=%ά@sGH|%H=z%謬Hd%H=b%蔬H|$H|$ UH|$H.%H=,%^H%H=%FH$H=$.EAMBEH|$LGA0/v@MHIQIPIGIH5$H1蛘MWLIv!AMHA0AȃLG\DAHBDR@t$nHt$nLD$o+!H!$H=$QEALZDLD$MHA /IQHzIyH2LI ET LL$IQ /LRIzHzM_AH5#1IgIwLHuL ʃIQA hL,a LTHD$L@EA/IPHJIHMWHH5=#1IIHLuLT$MZA3/v@ICL@MCMOHH5"1I萖IOLHtuICA3DAIPEZHT$HzDA/v@L_IsHwIGIH5"H1MGLIJtEAL_DAʃLR aHD$LHA/vXMQIJIIM_IH5!1I諕IHLsH! H=!¨A҃MQALT$IzDA/LGIpHwIGIH5!H1.MOLI[sHT$LRA /vSMZI{IzMGIH5=`1IݔIwLH sEALGDhA˃MZA H|$ tPEH H= 辧LCxL+CpL%_I H|$ *P LSpL9SxtL[pIICHCpA%8H|$ OH|$ HHD$(OLD$(+HsxH+spL%`_H[H|$ OGHH=H|$ |OLT$IRDA/HBL@LBMOHH51IMIHLzq2EJH9IzBHA*AzsLd$MT$DeJ|pLA /MJMAMBEH9IzHwIrLEIcLLT$L\$ILLqHVH=蹥 Ht$`HT$`AÀ:sHD$LPA /rσIzA mH+H=)[HH=C΃IrA DH9tHH=DAHBDTHH=LLT$(L\$H|$ _MLHrH=p袤HZH=X芤HBH=@rH|$ LIEu/AnH|$ LHSxhHH=LHt$` ILd$`A<$$u.|$0Md$u:l$D$<D$l$H:H{H=y諣HcH=a蓣HKH=I{H|$ LHH=OHH=7H|$ HKH- H|$ LKH- HAu11AH4AHE1HD L9tLLLLHDhD$gE1vH|$юLɎH|$@L5ͩ 踎L=I L|$@H|$HD$蘎L萎H|$@膎HD$H|$H肎HD$PQH|$nHD$(HL$ LE1H|$H1H5g1X>HD$HH|$H5荐ueHD$_LT$PHt$HLIRLHAHu.LL$hHt$@LIQLHAHuT\H|$1H51=L1HHD$H1=H|$@1HI1=HD$@TUHSH HHt$KHt$HH;HtCH9tHHH[]HHt$Ht$uHC݃HsI<,HcsL_4_Ay t4IA\IA9@!*!H)H5#1H1I H> L-ہ A IEEu I9s y y  H~5Ǐ H=ȏ )$D^IcHEfo $Hc H HH H| 1y H5S#112HT$H511LH5"11H)IMEUIA tEuH5MqHeuD[A A H5cH4uD{A A H5_Hu-C< t< u!L{A t I!H)H5!11H,H D;HA tA tA<A}>AEH޹H=V Q DHHE1HHDHA tA tAutAEH= H޺ HHt{D1skH)H5l 11HSWH5p^t2L:@ts@N@u]HH)H5- 11HSLH5N 11H)= H= HH51-&@ t@ tH)H5 11蹀AHZE)DD$D A tA uHBNtIEEt#B^@uIH)H511H[M9u$AL-k L,$Mt&t$A9u t/MmI)H5h11LLH5R 11 I}L uHLH<$t!L$HI8tHL $MQL$؃=g uJIEDHH0A}%uNI}H HAE%HT$IL1H5kH= HL1H5A$IUH:҇AWAVAUATUHSHHHH?dH%(HD$8HF HD$AD`t NHBAAw&LcE@AHH=H=HL$DsHL$HtH;tyHtE19owyAD$ AH,$Ht$E1~|$ H=rDT$ DHD$HAowxAME)L}EADMEtUtLALHDL$ AMAsD!DeDL$ AEt>HHHIEt#AHDɾ H=d 1轃T EuEut$ AH.. H<"HݕHEuEH`L-IEH= PM1WH;L@E1H5<n}Dd$ZYtEH;H5$1H,$mH;LL- L= K<艄Lce@L IK4L=6MHt%AyCL=*QAELMDIHm(}Tu1u1H|$1|WD$L$(MPEXMhtMdETMdU`HHuXLMLHHH=1kHI袄HD$8dH+%(tH;HHL[]A\A]A^A_LIA8 uHH1A銈fo|$@fol$P)|$ )l$0H\$0#XHH=迗HH=觗foL$@fot$P)L$ fo)t$0H\$0WLgH5L)tTLH5{11{HBH9W1 LG@HW(H 1IpAH5R11zAWIH5AVIAUATAUSHHL$ xC}HHNHDL-ʝ HMtMH5LXtbAt0t$ DLLaAEt>H*H HIEt#AH D H= 1 HILH[H ]1A\H=eA]A^A_AUATUHHHt$(HT$0HL$8LD$@LL$Ht7)D$P)L$`)T$p)$)$)$)$)$dH%(HD$1IHT$ HLH$HT$$D$0HD$tHc7LHHI袁HD$dH+%(t݃HL]A\A]s(s8 LJ L9K L 6 ML-MQL! A- } EA.tECDeIH=1MXMH1Ҿx'1L5eH=̹11LH= 1Ҿ11Lp%H=E <u6MIM)I|$IHII)L9tHH$I$AL)M>H|$LLHB H1H5cH1AA> IEnMf`LH= ;$$Ax1I|Tq^1'L11H5LvE1x'DH=)1MWH= Mv;H= L_L D/s A%A~OE.MfDH= ;JL M)HMGMLIHL)H9HH$D9st H[ H;LHI}HuڀUAE A9{ uÀIDDEMLD8 H)Hu:H|$LLHB H|H=aH1UHL4H H € BEH=ΰ ƅu= uƅIAE IAIcD[ HNHIHII)L90HH$Mn ` R D 6 ( AHt@HȰ HLHHMIIL)H9tHH$ƅAL)MH|$HHHH5l HHDRƅDDIcLLILLH)HHtIAHLI LH= L~D=Ů H.= V H= rrLc-k LT L+E H~ M9rH5n H=' LGL-  t ID3AL)MuBH|$HHHu5H5 HHcD~DJL H5} DH~HDHNj I@JLH5ϭ HD0~De U H=R H0D}H0H95q DmH8H9 ^ YLH= 6zH5| HDH}HDHH.HH=O L5LL5 Hc IMH* H+ HL MfA.ok H L%ӓ MLxL5Ӓ L+5Ē HL9"H= HL|L5 H H M LxL II)L9H=c LLM}|L%N 0H=% 4"M= MHt1EA.tEBZI[ M=/ 0L֑ LH+=đ =) uJHz HqH9H5z H= H{H = L 7Lc5 L+c M9H5 H=L Ll{L5= H5> L5/ IM)= D%i D+%^ IcH+5 H9H= Hc5= HMH5( {HԐ > H=m 11MHrH==LLH=k 2iL H L5i L%Z M)LLM)GvHL9HHLMFzH =y L5@H0DLyDH@}L yDaH H+ HH= MH/dev/nulHGlب H` ʨ 8H=Bl 11yM=~ L % LH+  =x uJL5#x MI9H5:x H= LyL5Ԏ =9 L Ύ Hc L+ L9w`H5 H= HxH = H  MQHdH=m; HH=+ 0H]w ML++ HbL9wcH5Fw H= H/xH kLH=ٍ D0L I)Iv.HЍ f.g@kH >HH= 0댾H= /HH=t /L%p MZA%PA~OyI<HH=3 /L5' L5[v LH+) MI9w;H5Dv H= L-wL5 HH=׌ B/CFLH= )/5 MH H9 tQL MIzH= A%vHH511iMڥ CH=8 .  MM9tIt$MH5 A$.H= Q.L% 1HBVH=11HH= 1Ҿ11HL1H=1DA!DIA~OoEfIFHA.AwEL-SLEc'| MH= MOAF<{LH{}uHI~E1L)L5 IME;fDLItsAHH=t ,L% H5Y HHA11H5gHH511gMcDI|$L\&LLIHH$sMLDfA$.oAD$lbCHA11H51,gH= 51ҾH= L5S11L H=y 1Ҿ H=N Ht 1Ҿ 11L HM 1H5t1eHIv:L $ fA.gAAkH5 H HH= N+H=͈ 8+LInLQLn  H= +LnEt#AMHT$@11H5eIED$.YFH|$InGHş HtQLMtIA8tCIIxLDT$HM)DL$0LLD$mDL$0DT$HuH|$B|'ADL$g#FH  HtCILHDT$0M)HL$LlE1DT$0uHt$B<&AD\$gEE1HH511dH|$Ht H$H9uwLT$HHcL)DT$TH)DL$PH#T$HDL$PHD$DT$THM9A?\IE?HD}IA}tKI:Dt$TDT$PDL$HT$lt$TDT$PDL$HT$XICHT$@H511dEL|$HIHnI1ACIGLE1YlEH<$KlEH|$HE19luE1E1[CH>H$Ht$H|$kLJEtt$DJ.JA}#JLD$A|JHH=MHI|$XH[]A\A]A^&XHL]A\VHH=\a WHHt/11H=H<Lc L K,FZH[1H=] CH= {'w O ; ?JHL9uJ LAhE9|Il$BLLL#'I}HLMeE@J^JE1A9} HA,|L$pL|$ H W(]CY[x$lL$c L pL$ L(f$lDnD9D LeAL$EL:i !9j$ $DZ,fEnfE:"fDD$D;$l#Hr0DT$(PDT$(HHD$H$H$ZH$LL$DT$hD H$LL$DT$(gL$(H|$Ɖ hHDT$hHHD$( C9ub{D$1ҾH߉L$x·HAIk(DD$hH t$hDL$xH$pD$DH0HT$LD$%H$pL\$(CHk(DHH$PDKH$H|3LL$L$DŽ$Ƅ$u"DT$(D|$D|$l$x LcnH$ d$lL|$h$l$9kt$A9w  A$tQAW;$LLnA7LmH$|cLj$I(낾 L mL$ LBc$lDiD9|!Du LcAL,L,mD$L$9L$(DL$x1D|$HLt$HMME9]Lk(B|3HAW;$|GLLmm$KtEIwH$CLiM_D$HH='UxA7LSlH&H='0xH$PH$pA 1Ҿ1DT$xH$pH\$hĴH|$hHk(HӁHADT$xH$pL DdLr0azLA #+L kL$ LaaD$lE`D9|4DLAAr0:aF,SLr0!a#L*DMMLt$31ҍp1D$xHDŽ$p1AIk(D\$hHL$xDT$h1H$pALk(IDD$L9H|Ht H(J|bA^HaH=sZvHH=%Bv L`[Hc|H=%vH$ _L$NAA E)E9EOG D9bC<'D)9S))$l?DŽ$l/A$JtEH$1H ;$hB.H߃C_H|H=$@uH{H=$(uH(\$81|$8$u 1A9V \$8ELD9rA;T wxDo$Do$D)$pD)$$$$$Hl$PHH H1H=#wt1L$PE1MtjE;ZsdEMk8ME}E9E;| MMH$L$D$H$pL$xL$D$41H$XHtV;osQHLL1JI$A;trSA;t wLfDo$fDo$D)$pD)$HOH="ysA tH+H="Ps$;L\$ LL$b"LL$L\$ kG&H|$`tELt$`A~H|$ DH|$H|$(mfDoBfE8=fD~$hHl$ DHl$Hl$(8H;XH="rFDF\ E9w:BtB;twFA9sYAID9HMH=!PrHHH=!8rHIH=! rHKH=!rHsBH=v!qAOd" IOHJ\1HRH'H=C!qH|$`ItaH$`DKH|$ fּ$$Aqit$XH|$xK~$HII $t9HC A$p)A<$}HcHqH9s0A9HcIcDLIH$HH$L$HuHmLHH$$H$L$L[ L;[09LS$D$Cs H{k(KDK K,]C()CH$XHH=pHwH=pHl$}x\Hl$1ҾD$H訬HAÉH4D$$$HD$p87r$11U1AD$J4?T$$E1ہIȉI9'J|J|IHH=,oHH=oHmH=nH{H46L$L$H$D$$$H$L$L$HCL$LC0H$D$$D$vHGH=]nHHH=EnHkH=-nD@HD$LT$ABG D@pZIH$I9tKHl LH}NZH $H9MtCI9HhLO HT)H=plH<)H=XlH$)H=@l[]A\þH G !HH5,11OH/s IHcSHj HtH;'\H[HL [HD$dH+%(uGH([]A\A]I<$Ht bI|$Ht 8bILL$$/,U?/::AYM[LHH ]1A\H5YA]1ҾL3.H)H=fH5W116JH H= ufH} H= ]fHe H=m EfPHw :H=v ,fHU HHt9H3E12H511IH=U H3E1R3H.1H5N3H5a3PH9 H= ePQH=4 Z;Is4E5Dt$E5øH HÐHG 8L$;H=PH1NH=PH1NH=R U@9LH511H1H5H={G F b8H G 8Hd #H=dHL #H=dH5HS7H=R 8E1L%H-D9-k 8MC<+tMLHH% HBHt8*t1H5 11JL覃H= 1JG,IHH$L-dK C7DLhH5IK DHHt^HIc1H<0IL=!K L?,DcI|,IHHDх=t @E@t ;.H EXH MH=I HM^M"fI*p*I^HfH*IFXH$fH*I^^HGfH*Xf(Xf.%)zQH5 JLeL-5*I$HOIEEAIހ:wHH@LzCJ@I<|ud~u9LEIO$8DH= HL1J=F ̃uHuIJ>UDH5 1HH1< tAH9]o4HH=` XHU1HMLH5_ 11~<LM/MaI<$EHHxH5 CLMI̓fIL H*XLAfHI I*XIfIL H*XIfIL H*XMAfIM I*XHڃfHH H*XLAfHI I*XI̓fIL H*XH5F CHEH=AE H5+xEHPH=F ExHuH=oF L1-GHULbIHH JF H=FM$$A$H5$F t-"<:wIILبuA<$IBÿ"B낿\BH5E HuH@EtHm4HB4H[]A\BPH5 119L-E MtA}uL-E MtA}uL-!v L}H51LDBDv BL9-E L1L1JHE5HUH5 11m9LH=PNC6HUH5 11A9H5z 1119HUH5 119L\D]AD]6먀=D ZHuQHHWIH9s(SHH)@H<.?HHtH)HH[LH;IH[6E1LH5L1>H}69\$~ MT Q6~6ËB Ã=m H PHD717\ @HPHD7\ HPAID7Gy9MgMIwI<$HtMG I|$MtAID$ ME1M]Mt.MOI;MtAM]MW I{MtAM]Mc MIEHt-MwH8MtAIEI_ HxHtIEL` IMu (LDOMtMuMf(L!OHDž(x8ATSHH=R{DL%PZ uH=>H;LH1'H;X[A\>HHXH=RH@H=RLG0HGHEtKIM L LG0HGH :Hw0HHEA I7Lo@Hw8IEtAHLo@Hw87HWHH0H8H EH HSHH{06HfHnfI:"o86HGHAHo0I-L Et=L HGHHo06HWHH0H,H EH HSHH{0v6H-HGHHo0d6LO0LWHEtKAII>LO0LWH5H&H w0H wH5HW0HHEtTAI2L L HS0H{H5HHg8Hp@ I!I HO@LW0L_H~5HHc8Ip@H!L HK@HS0H{HG5LOHALW0I1M Et:M LOHLW05L_0HoHEtfA I0M L L_0HoH4I1LOHLW04HI!Lo0Hp@H Hc8HK@@ HsH4I0H0L_0HoH4HKHLC0H/H Et>I HKHLC0j4LWHAL_0I.M EM LWHL_0<4I/HKHLC0*4HO@LG8H EtL L_HHo0,Lo0HwHE H@@I H Lo0HwHr,HL_HHo0`,HW0HGHEtKI@L L HW0HGH6,H0LCHE H@H I H{0LCH,HH Hg8HO@HW0HGH+Hw0HHEtKAI$L L Hs0H{H+LWHAL_0I#M EM LWHL_0+IH L!H Hs0H{H_+HW0HGHEtKI@L L HW0HGH5+HW0HGHE H@H H HW0HGH+激@HW0HGH*Hw0HHHEt@HH{HHs0*LOHLG0IEILOHLG0*HH{HHs0*LG0LOHEtCI M M LG0LOHb*HOHLW0H@Et I@HOHLW0<*AAɀLG0LOH'*HKHLC0H)H Et>I HKHLC0)L_HALO0I(M E|M L_HLO0)I)HKHLC0)HW@Hw8ʀEtQ@΀HW@I@Hw8L g0L gH)H0LCHEEI@@L M H{0LCH])@fHnfH:"8D)ELg0E1LWHI5sMIAI)rI)E1I4Hk@s IIAHK8LHH pPI!H ꃣM HM H@ L I Lc0HK8L[HHS@(LCHLK0H I EI LCHLK0q(HzH= ALW@HO8IEtWHLW@I@HO8L _0L _H%(Ho@Lo8HEt=IHo@H@Lo8H w0H wH'HfLnfM:"DW8'IfMnfL:"D_8'Ho@Lo8HEt8IHo@Lo8'HW@HG8΀ÈHW@HG8q'IfMnfL:"D8T'HW0HwHEtKI@L L HW0HwH*'H0LCHEPI@L M H{0LCH&HHHW0HwH&HoHLo0HEt8IHoHLo0&HW@HG8EqHW@HG8&IHoHLo0&11HA~VD1H5K4L&11HzACD1H54&H( D=%Do_@Dog0fDdfD%kD_@Dg0%HS@H8HEt+HHS@H{8%H'H'Hw0HGH%HfLnfL:"Dk8v%H*HWHHG0d%I(L_HLO0R%LoHHW0H"I EtAH LoHHW0)%HG8HO@Etr@@H2HG8H w0H wHHO@$H"LoHHW0$I%LWHL_0$fHnfH:"G8$I#LWHL_0$H%H@ fHnfH:"O8$HW0HHEtKI @L L HS0H{H^$LO0LWHEI@M M LO0LWH0$HH HS0H{H$HO@HG8Et<HO@HG8#A#DH5 11ǃ#fHnfH:"w8#I!LCHLK0#I LCHLK0#I HM!H Lo0HwHg#IILO0LWHL#fHnfH:"g84#fHnfH:"o8#ILOHLG0#HW0HwHEtKI@L L HW0HwH"H0LCHEI@L M H{0LCH"HHHW0HwH"L_@Ho8IEtIHAL_@IsAڽdA<CH=a-H}<H=I-~H Hs@HEsH9Z[]HH=-t 9w~+HLEL9E rHLE\AH=G@YHkH.?H= -HrH={,A9{ HnH=Z,1 HZH=;,1[]A\ÐxHI!G=! L !ATAIUHH$L$L$t@)$)$)$ )$0)$@)$P)$`)$pdH%(H$1Hl$ H5EH$H$H$HT$DHD$D$0AL11AIH艏HAH$dH+%(tHĈD]A\UHSHHHT$`HL$hLD$pLL$xt@)$)$)$)$)$)$)$)$dH%(HD$H1HT$PH$ D$0HT$@D$40HD$8<Hl$Hk$HߋHC$Ht$0Ht$Ht$L$nHVHk$HD$HdH+%(t H[]HHT$0HL$8LD$@LL$Ht7)D$P)L$`)T$p)$)$)$)$)$HT$ 1AIdH%(HD$1H HT$H$ $D$0HD$裍HD$dH+%(t9HÐ}x7HBfDmAH4HA"HD DhDmH1De1AAJ4AEE1HD M9tN\N\IDhPHH=\(1HH+SH _t&t(ywDAAw N[77777777777777ÉH5͜HAH֋NHH A)AAȋN ADD)ÉH5HHƍGVDHыN AH )A)H:.uz.u z/uHHx.t1x/uH8.t@t.D @4L HEAA8AEu Ax/tII9wLGVH)HuH)Ht@@D?AECD H_G HLG Ð1ÐHWHH9sH8wHHWH(HdH%(HD$1HGHfHnHHfH:")$H$HT$HL$dH+ %(tBH(Ð)HATUHHSH dH%(HD$H8 IHGRH$HT$H$Ht)H;bH{HtHRHLH$H|$uHD$dH+%(tH}H []A\HW UHS1QHH}Ht2;_sH|HtHQ܀y GZ[]X[]AWAVAUATI UHSHHdH%(H$811LI11HA1D H$D Ht$ H$H;\$Hu}Ht]ALDLLL IcIH9uOILHt$ I9u4Ht$LLu L)LDQ J LD6 / 1H$8dH+%(tHH[]A\A]A^A_AVIAUIATEUSHHdH%(HD$1t/HH5H HH  HHAH3E1@MHKMVHAHAHDHD$PB_AXIHt-4$HLH=0H5HD11HT$H1>tL$t 1ۃH覘HD$dH+%(tH[]A\A]A^U1U ]AUATUSQL.HLbtHHuF= t*L HxLH5vIH1) _LH511H H}I MI|IHǀ;tH\HCGHuE1ZL[]A\A]u#SH>H?/t1{uH[11u%SH>H?/uNuHHC[Gw3USHQH>?/uuHC 1uHCZ[]1tPH511=< yH5 1H=1铻1PH=l H1H=~i H1H= 1ZAVAUE1ATUSH dH%(HD$1fIHHvE1HE111LHD$L%H$MD$aw1E1E11H5LHwH% HtmHL%u% HL Ht A|/uDH59% Ht1LH1uI1LH1aIH& HE1E11LLvHs1ɺH=J ՌHHtH;11I-HsL1ɺ詌IHtH;H11IL4$MtI>I^ LI HD$dH+%(t H L[]A\A]A^AWAVAUATUSH|$t$ T$4L$L$DL$dH%(H$1Ix`uH $HA`H$HxXu6ӸH$HBXt$\$ E1E1HD$E1ہ t$$\$0HF |$CM.L$MLLHH)I<1~ACDL- LHD$@Lk0MAU(L$I}Ht$@9RH|$@uH=HD$@L$LHL$@HwH)I<1hCAt?IH=pL$HL$(jLI?HT$(LI<1#L$LAH5MI|1nL$Dk0fAwSLS MuLL$LT$(LMcHL$(H5& Ik`I<1HH5SfAu(L$LoH[ignoredLH8f@]SH$t$~!H=^L$RLHg!L$uH==/LHDDC\At;KXLl$H1HL\H1L1LHALDD$HEIEhEA9ACA)D9L$sE1ɉD9vT1E>EtGA9w9u>pA t/AA-u'A< ttEHsB@EÉMADҾH=S1HL$(KHL$(AMA9 u)t E1MDA|$HLu%L4$Ed$DMfXA<$tA$AAl$(l$1VIHxML$(t+A?EoLD9AyAu1A1E1E1LE1E11H|$(L$8QH|$(DT$8IHHHtDWD\$8DT$(耺t$8T$(P0Et%EE1IM9tCDBDIDhDxAOIIljHAoMgIAAHD$H`H|$Euel$1L5V L-u!H=P{H1LHH tCtM$LPHLL1`EuH=-H1CH5 L% 1yL|$H<$LWXA<*I<$HH=AE1H1DHI\$H3HtdHHt$IAv5E|D;|$Ht$wH=Z1(H=1AH3H=41ErAH=!H$LBXA(HI0H6L|$1L5u L-L%MA;ospLHLLcKMk`KH$H4$H1E1H{Ht%D;WsD1D$HtLD$AH=jAy AGL?H$dH+%(tH[]A\A]A^A_AWAVAUATUSHHdH%(HD$8HL 1/IIHAMąu%Ht)HH5H8uA/MWLHt$HD$D$(D$H|$u d1 HHLEL= I7HHt$OHt$LHH$+u%H$A (tuHtH `IH= L9uHuHKH=o 1EILLH53HtH11L%HIDHT$8dH+%(tHH[]A\A]A^A_x@"t@\tZLH#ULHHH5H7H5H&H5HLHHH\XH["]A\A]A^A_H ATWUSHHHG(fG4G 輧Hł1HD$ L5Lck0HC[]A\ÐUHH}H]UHH8]UH3H]ATUSHPL%- H dH%(HD$H1HH+HD$HLHI$RHҿHZH5S H=- HtHQHl- HD$HdH+%(tHP[]A\UHHdH%(H$1Ht$Rx6D$ %=u&Hvy=K( tHH=F1H$dH+%(tpHĠ]UHAWAVAUATSHxHH=i( dH%(HE1HJL=1L*3E11IHEN N,MtkH5LA}-uA}ouAMc0H5=LtH5%Lu IzA 1AT$IHHcHLMZLMIIM)L9tHH$AL)MtJL$HLd$IHIHHE@HILO4DdK LOT KT IM+LxA}uO|4 L5M3E1H L-H/LJ/1AJ4JDHLAlH u IIuHHuH=, H51NHHtHLH5HpkH51LHhUILHhLHtFtLH=`LLE LHHhLL1ADžH5FkE1LLƺDLJHI4HhHHYHDHLhLID9dH5DD1ALLxLH<LIHpKDcu+H=K LH51jLHDžLL#MtLLxHL9uHEdH+%(tHe[A\A]A^A_]AVAUIATIUSHH/dH%(HD$1Hu!HHH}LIbH$HHNJtF,uLoLHHxtL,$L Hw\uS,uHHÉʈHH$8t HH5tI,$HD$dH+%(tH[]A\A]A^ u LuLuuuuuut&u LJu LJududu4u4@u@huhuu LJ(u(uu,u,AWL='AVE1AUIATIUHMSHXHL$LD$ dH%(HD$H1'LHHD$Gl$8HHD$@Ll$HD$(H0Ht$( H|$@AHŀ?ADt"|$8HL$L1H5MRRMt.E $El$LAE9A|$yAu11E1 LE11H|$0w?H|$0AA1J4HtGD$L9D#HCH$A.~-A^tuA[uVL5 L9\H|$ A#E\$A H5fALcI>AA*A\ A?A{WA|3H)HD$HMtIMtIMIHjHHH9HGH$]H$H:H9u H$HH$H)HH9r%H)HD$HMtIMtIMtIE H~ME1E11A+H A?@A H9uEt3H$)D HpA*uHAA+tA?tH$EL$HH$L)HH9s^HFHLH9HGH$9H$HI9tL)HD$HMIEEA)HAfDUBHHLH9HGH$H$HI9u!L$IH$M)IL9rL)HD$HM`IXHHI~LIL)vM)AAfEnH$IH$I)IL9sWHAHHL9IGH$H$HH9tH)MIHI~LHL)fAAFE1'IL$IH$M)IL9s^H_HLH9HGH$RH$H/I9tL)HD$HMqIiEHHAHLL9IGH$H$HI9u!L$HH$L)H"H9rL)HD$HMtIMtIIL$HH$L)HH9s_HSAHLL9IGH$EH$H"I9tL)HD$HMI{^Le@ƃ@u{^u HH$H$H|$pH$MH$I)IL9s^HHHH9HGH$H$HtH9tH)HD$IMI1I|$AA$ MT$1L$L$LT$0Hl$0Lt$xEH$L=L9LhL$]u+H|$pHI9Lt$xL$L$hDXt-u{A]t -ukHpLWL9rx[tULPH AI9r x[ux^t9A]t31H$IDAH2#A"DHA-uQx]L=M9H1IH$AHH$1t[HA:L=M9HXH$L91D+L{A:u{]t/LmM9t#<wD >Ƅ$1L$ƄA:5{]+L$H5LLH5D$8LH5D$DLH5D$HLH5D$LLH5,D$PLH5LD$TLH5?D$XLH52D$\zLH5[D$`gLH5%D$dTLH5D$hA|$hA|$DD$lAE!Ѓ|$X@A!|$PAE!ȃ|$8AE!؃|$lA!ȃ|$dA!Ѓ|$\A!|$`@A!|$TAE!|$LAEt |$HLM9H[H$L91E1A|$8u6H8uD|$Du!LfA u+|$HuLAu|$Lu(HtDDEADT5|$PuLfAuH|$TuH8f<x2|$XuLfAu|$\u.{LfA @tDDE@DAFD|$`uFHuJ|$du1H8f u2|$huLfA u|$lu.LfAtDDE@DAFDAHA1ˀt@DM)@tL$AL$ A:1AL$A=L=M9HH$L91D(HpA=ux]t0HiH9t$wDAƄ$4DH$BƄA=uUx]uO$tD LL9HAH$ȃADL=E1ˀtADL)EtH$AL$ A=1AL$ A.HI9HH$H9_1D0LXA.ux]t/L=EM9t#xD&Ƅ$DL$BƄ,A.uXx]uR@$@tELM9HADH$ADL=ZE1ˀtAI)EtL$AL$ A.AL$@ ӉADAFl5D1OA<,uA<$A,$H@uHl$0HH9Hs[H$A܀B N<6 5' s@ 0DD9L$D$HI > b W`# w IH$T$D$9T$@u$d$@|$@Hk(H|$vHD$HVH$DT$E1Lt$Ik(HD$I)L0Mt MI)IDL$IL@I)LxDH AILxH$IH$I)IL9sSH AHHL9IGH$H$H H9tH)HMtIDl$EHEDmD$E1E1E1Hl$ML$HH$L)HH9sbH& HLH9HGH$H$H I9tL)HD$HIMtIMtIHEHL)AfAw|$L$ L$D|$Ik(HD$E1L0L@MLt$MtO|LpX E1MցDd$LhA)G$*L$IH$M)IL9s`H" AHLL9IGH$H$H I9tL)HD$HMtIMtIEE1H]DeRH AHLL9IGH$H$Hz I9u!L$HH$L)HH9r%L)HD$HMtIMtIMtIHt$HH+T$LmH~GH|$LT$+l$DEfEBMtMAM)AfEOMH$LH$H)HH9sRH HHH9HGH$H$H H9tH)IMtIIoE1E1Hl$H;H90A@0HNЀ w8AAuE1Ak DFLL%L9uL$EqH$E@,u`1ALL9t3@0HD^A w*AAuE1Ak @DD гt LH$AuAEAE9@D^@}TMKA>EH$HH$H)HH9s^H$ HHH9HGH$H$HH9tH)HD$HM I HI~HLL)E1IA M)AfE^<tq0A>!tGA<t7At'A=>u7EyLZExESAMAE ,AA!AD0D &LH5v11 1EtL|$JD=u1H([]A\A]A^A_StH(H=|HH6H=" JHHuH;11Y1[tPH(H='H>VtH(H=H=ʂڼ1H=YH1vAVAUATUSH dH%(HD$1tH51H=UH1dH-Ϫ11HdH HtPPtIH5HL,Lt E1= L|I1H=c=} 1H=yc11HdH HtquH#)H=ڌyH||HI |H5HlH=+1HH1uHIk= L L-G LcO41H=1H${Aƅy:H|$1HD$ALiT$HIIL$sHcH3$ HDsH$HtH5QL19= t,LE1HLH=!1tLHI@t h E1HD$dH+%(tH L[]A\A]A^SHdH%(HD$1tH5ڱ1蓻H HH;H $H9 uH *H=Hc` H9HHNHT$dH+%(t0H[Éу~(?v._v&PHCH=R#G 1Ҹ#1>NUSHVFw7wy$w-ivCG`HHUHcH>%LMc M>AH ea5: SH$/CHCH؀G HЀG HƀGHGHG HH wHBHKLhHL_yLYHLWbH5JHفHsKH;HHS4H=,HʁH{H-HHoH5HqHwG$HtCH"HHitCHCHH HHOvLHL_bLHuLWNL vHLO:H=jHH{&L^HxLGGH~1Z[]Ã@ѺHHЃ AWAVAUATUSHHt$(dH%(H$1XH.H5ŠHD$tH5Hs'HT$(H5wHZHStH5jNH@D$3D$3W1HDŽ$$$t\$A…!L _L=d}DŽ$Let׸A ADAAD$A|$ Dl$@tPЉƃu 1A@lj|$ D$E1%=D$DD$DE1D$As DŽ$As$As$As$AsH$H$/AsH$H$3As$EAt $At $At$ A s$@As $As $tH$H$>A sH$H$.AsH$H$:Et $AsH$H$EAsH$H$QEtEAs $A s $@AsH$H$1DŽ$At At*ADŽ$DŽ$DŽ$DŽ$DŽ$AuDŽ$xAwDŽ$bA/vAOwDŽ$ FAwDŽ$ 0D$A rH$H$SwuApA {DŽ$ DŽ$ AwDŽ$ A/vDŽ$H$H$,HHu̺-HHugDŽ$Aw DŽ$IEPAv A`AOw DŽ$($uH$H$NtuDŽ$Ah|$CenttM|$Cyrit0|$GeodtDŽ$A7DŽ$A$DŽ$ADŽ$A$vHH=T$vHH=2D$$|$D$DD$D$L$AUt EMAwrHD$pH-D$xADAtH|$pDD$ ܚDD$ T$pDΉDD$ }MDD$ HEH-AHD$PD$XHD$`D$hHD$pD$xAE1AL|$`LL$pH|$PDDʼnƃt uh^ttIuLMMAډ AAASA fnfA:"fAAvAw H-|$@Ń|$!Ÿǃ$DT$8$D\$<L $$DD$@DD$4Dl$DA11҃%1틜t$ |$ t$  w6 :wA E fA AAM!fAIc4L>.A@AAA@AAA@AA A@AAA@AAA@AAA@AAA@AAfA AAMA AA4A AAA AAA AAA@A A EA@AAA@AAA@AA|A@AAcA@AA JA@AA1A@AAA@AAA@AAA@AAA AAA AAA AAA AAlA@AAVA@AA@A@AA*A AAA@AATHH3 tDt$hD|$dDd$`tD\$XDT$TDD$P$$$$DD$4Dl$DDT$8DD$@D\$ u LIL=( I_H A H= IHpH H+ H9vLCIH= H5] LL-Ѧ MeL%Ʀ AEL L M9u ߦ H L L H- IHML+5k I!ML+^ M9MFfInfl)-O H[]A\A]A^A_AWAVAUAATI8USHHHt$艝H1HHHT$H5f4 HcZ@L4LHwH!sH=}|菟A|:ItHrH=Z|lA| tHrH=:|LLABD8HڜHIHzLH5HHBM$MxILKL9K u H|GLSMZL[AILygIHLLH5;rHI<$lHD$DLH@pDA$IHt2LHHHHH5]/L{M$MtHH|$wDLAIHt2辛LIH^HLH5qL&H= HgK t.H= HuHJqH=z踝HvH= HH- 7H5/qHHHH@H O Ic$L K HLHHpH5pHT$Lz(ΚHH5uHHH@HD$E1Hl$(DA;oHcHI\7~ I_HH\3D3EyL.AMkMhhEuHB$tL HHIAA9s!AvH=D sHA!E43H=薅3H=HD$8D$48H HD$t$t$ ęI1LLQDLH5VPLHLD$8E9t#Ett$4L\H5oLHD;t$t&H|$tt$ L/H5]oLHrH{HtPHSIHt4HT$LHHHH5L*HT$tLmH|$L~(AxHl$(uL\$Ms0M)1蚘LsH HH5omLHIH@Hl$M_xLA;_xLcÃOL INL8M!L\$ .I1LL軍A4$HH5nLH5At$HH5nLHMT$LT$ƗHt$IHdLH5sLLLGL\$ (IHl$8xI1LLIct*PH5YG LH0HH5PHXlLH5NmHZIHt3M$Mt&LAHHHH5mC[H]A\A]A^A_HH[]A\A]A^A_H?AWAVAUATIULSHHWH)I9v H='LILIL)HMŽH $H I9tInH9I,1ILI)M9w+IM9w#IuI9vRLLHLD$VLD$8MtM9tJt%J|-L3MLLHMtM9tJt%J|-LM9snIO/M9rLLHܖRM9wH4$LHL9M)LHL谖LJt-J|%L)MLLL]MI^LAH[]A\A]A^A_ÐATIUHHPȃHULAYHI]1A\?U1SHHH5dH%(H$1Hl$HH1H5@AH$lH%jH$dH+%(t蝅H[]ÐH8IfHnLdH%(HD$(1IA(fH:"Ht9HZH9t-LD$LIH pD$HG)$ЋD$H5y1HT$(dH+%(tH8LǃH5ySHIH11C[LGHGLHVH9WrHH9r0w)HNH9OrwHvHLF8L9G8|HH9r1H9v"HHLI9Pw I9P wHHHE1LHH9rwN9O|AWAVAUIATUSARLV HtfMtaLHLFIM1I9vJI2HHkLH9(w H9hs HrIH9huHI9tHH9Hr HH9hv1CLxMILLHLbu$MAHLHAԅuIH;A_AZ[]A\A]A^A_AWIAVIAUATUHSHH(H"HE1HIHBT%B MBL%B IM9uNT=E1AL\$LHLD$LT$ALT$LD$L\$~/IM9t'L1IH@<E HD A<HI9uIML9uMu-HLLL&I}HIL)IHL$LE1IHL=BtFLFDB4II9uO\-I9rHsLLLL)HH([]A\A]A^A_ATHAԾUHqzSHHLLOdH%(H$1HD+OH|H{0DHS(H$dH+%(teH[]A\ATSHQHGH9wH)HwAHG#Dg8Eu1H5yLC8E1DZ[A\SH_A1Et[USHQHoA1Et { fEtZ[]USHQHoSA1Et%MEU{ t   Z[]USHQHo A1Et { EtZ[]USHQHoA1Et { HEtHZ[]ÅtPZAPt(tu%+uY`1H5x1ZSHcILHHPdH%(HD$H1MHGpLT$`LH\$hH9v1H5GtLA1MH(LVxL)L$(L\$H|$LH|$H|$HD$ LL$0LT$8D$@#HHT$HdH+%(tHP[AWAVE1AUL-wATE1U1SHQHL{t:E??wLHI Eu1LHAExE1ZL[]A\A]A^A_AWE1AVL5qsAUATIU1S1QLMl$tUEm?wLHH Eu1LLAYExA@t?w HHH H1Z[]A\A]A^A_ATUSHPdH%(HD$HALT$pHl$xt tIPHUM@HMIIMIHKxMI9v1H5rLA1pHC0L%vL)T$(Ld$Ld$HD$LLHD$HL$ LL$0LT$8D$@H9Chw1H5\rLI1 HC HEHT$HdH+%(t|HP[]A\AWMAVMAUAATIUSHH$H$H$H$H|$HD$L$HT$H$HL$ H$dH%(H$1AAMA LD$@uMGA LD$HtV*LT$@AV0IvHIARDLU]A[ZuL\$HAV0IvHIASDLU3AYAZAHT$@tHT$HH$dH+%(H|$ H $IIHt$HD$H$HL$HH|$H$HĘ[]A\A]A^A_A0(A~(MG('It$`L9w1H5stHM|$HxtL)Dl$hHT$HAHt$`H\$pHl$xDŽ$L|$PML|$XM߃$Av0H|$HH|$(Av0H|$(ILH hEF0At1AtAt.At"&IuIIt M9tItL $IVt$(Ht$(K9H|$IH HD$ L_AXDEO4L\$0EtA~,HHHLMFPM$M9w1H5LsH1M\$@H=QsM)Dl$hH|$HL\$PML\$XLT$`H\$pHl$xDŽ$EtIAv,H|$HM$IFPL9r1H5nH11IT$@I)L|$`HHT$XEMLd$HLF<H tLcI>ALL\$0IDASAV0ILUIvH>A\ZuLLT$8IDARAV0ILUIvH AZA[gLH|$@IDAV0IvHWIULAXAY3H $H$HL$@HT$8L`LL$@LDIvHAV0AQIUI^_L-H$HT$@H LLHD$(H$HT$0H HT$(kAv0LHD$0Av0LAv0LHD$(H $HT$(H$H&Av0LLHD$(HT$(H$H IPIt$(Ht$(H|$Ld$ AZYLH5p1 1$H$dH+%(t0wHĘ[]A\A]A^A_SIMuLHW0HLZHZE1M9K HHkHHxH9wHxH9w`LAIH0H?Ht;L_H_E1M9vKHHkHHHH9wHHH9wLBIE111L[AHHL@LH[AHIAV1IAUIATUHSH xy,vt u A%HLAAAĉǺ1w[D]A\A]A^UHSHQpAEyuH5WH1Z[]IHϋ Aw2ILE1H)H~ 0HAIH L H2DHII1E1H9s.EHD߃HcI Ex HMÃ?u1I9w&HH9s9AAA4HAHMIMHLA A3ʉ A9sAAE1A)AD)fA )A)AfADAWIAVMAUMATE1USHLL$HMLHAHt$LH<$[D9H<$Ht$XuˉH[])A\A]A^A_ÃAWMAVHIAUH%IATALUHHh SDLL$@LD$8LD$8LL$@ALLHHH j LLD$8LL$@t#AAHHH=l ZAöHHEHDHT ,A46HHEHDHTAQLMLMDuZ[]A\A]A^A_AWIIϹAVAUATU1SHdH%(H$1L$HHD$L1A)v1;fTu flTxflTXDTTXH\$fB,SE)fBl\XE$)HfBdH9u1L1AH\$xAtPHJEAA9uE܉tS AMcE1L9vbLAAA IwfCAIAIAIAIAIAIAIfAIACfDILT$HM M)ډT$1I9v#MILHHH;0rvIKM1H5MZPLA1ZHH9r'wHVH9WrwHNHH1H?`ÃUHSPH_HwH]HHpZHE[]AWAHAVEAUL-$\ATUSHLd$PHl$XD$H\$`W,w P+IcLL>=`w=S= \=!|DHC H<$ H<$mDLckAƸLsOHC6 -HHCAA  H<$DظL[ HCDH<$dI9D$hH<$w1H5X1ID$ HCjDH<$I9$H<$w1H5SM1;ID$8HC"HC <$DHCDиLSDȸLKǸH{HCu;HC\H|$#H|$H!u1H5RD121 DHCH<$HH<$H[]A\A]A^A_kHC UHCH5(YLcI>Ac$^qHCX*t/wt!)A&+uMzHC YHC kHCHs }HC dHCD>HCHu g ZDH<$HtH9H<$w1H5T91*HEXHCH5T11H[]A\A]A^A_AWAVAUMATUHSHdH%(H$HFH9wHHHvH)H9r1H5[PLE1IHH=hTH H)MG8H|$HH|$HAHL$XLD$PHD$`T$hHl$pLl$xDŽ$H|$HHuH|$1H5PE1+H{pLHIHgMO8H$HD$8MHD$(IHLL$L$M9\$+H $HIMD$HL$IpAxK,APDK0DC(UAwt$(HT$(&H HT$IT$2Gw tntH t@H|$(LL$(s,HK@IAAQMAVH|$ ^_uhoH|$0HK@s,MHD$0AIWAVH|$ ZYt HT$0Ht'1I1MMHHLJHtHD$(H$E1Ld$(H$dH+%(t_XHĘL[]A\A]A^A_ËIMÃ1tGu^z tXP9uHQuHQ& u1HQMRIr0Iz(HHtH+PMLLAY1Z1AWIAVEAUATIUSHH$H$(H|$H$H$0Ht$ LL$(H$ HD$L$HT$0HspHL$8dH%(H$1Ht$HH|$@INL.HH:HL$H|$HL HHu1H|$8t D@LL$8EH$1WE1ҹD$D$Ll$PMD$pD$`L9mLLHHHEHL$XHpK,xAPDK0DC(t$Ht$8AT:H H}LT$XB<UtJw(tZwv.strHt$@H$e}D$At A L$LK8}$D$L$pu}uo$D$T$`X}uR$ uHH$Hs@:}u4$ u*L$L[H}u$ u H$HSPIm|$Ll$Pu |$ta2L[Xs,HK@LASMDt$L$^_uHS`HK@s,MRLDt$LD$pZYut.uPLEt$0DLt$AUSAPIL$AQL$HT$PH|$HH0N}t }  $uR$t$tE…ttLSIzIZH{R@t-t)LCMHIXLKLEIXIhH]M$LSMZIZL[LUMjIjLmM$[]A\A]A^AVAAUATIUSH?/I,$DuAT$AŅH]HH]H3DAT$uEy)HKHkHMI$y H{u H{uLsHkLuI$DAyLCIpIXHs>E…ttLSIzIZH{R@t-t)LCMHIXLKLEIXIhH]M$ LSMZIZL[LUMjIjLmM$[]A\A]A^AWAVL5AUIATIUHSQD(M9LAVu tHI9uE~"HMEHL)+HH9|HLHHM,I9t;A~t HHMKI9t; u HHIiX[]A\A]A^A_ATIUHQGDt!tt$ILt$H5DHALL$0DIXZEAMtH|$tHT$LHH$dH+%(t+JHD[]A\A]A^A_AWAVAUATUSHH$ H|$0LL$HD$dH%(H$1Hw D$D IIH5FI̺LMID$DuA~uAFD$CuI~|A;FufC|>YZuC|>uT$CC8T>uIwCD>CL>I<6Cl>H$  IoHH C|>GL>GT>G\>AD AD D 9HS H9HH)Ht$8L>H4$HD$8HL$8HH$EDEu%LL$HD$D$DIH AH|$8H$H$LHH$L^H$LFL$H<$MQILL$H)LT$HL\$CTCtCCL  9IL$L9H$H|$0LLHt$(HD$HH|$(Hl$LLLD$LL$lnLEI9H|$0tHD$ H Ef HDŽ$ N,I] I9 An @< HDŽ$A@@t7H$H$LLHDŽ$i L$HDŽ$@y3H$H$LLL$%_ L$@M MZL9@ C<!5 C|) C|( IRI9 IZHLcM9 IuI~ AtEADELA D D 9 H$$1D$hD$TD$PHD$HH|$M9DŽ$I\$DŽ$G,&EAtAvHt$HEx\A3 ML$M9% AGl&HJL(M$ M9 L1L9\$(H|$HK4Il$I9ACL&EGT&AGD&AKTHcHcHNDAv\A.Il$}D$h,v D$h-D$T v D$T DDL$TDd$PDL$PAv 3Av-WE1$LT$ fCjII67u$L]M9AT.A\.K AAD.HL$XH<>AL$hAl.D+d$PH|$xAL$T¸AL$$DD$lHD$HD$pHt$LL$XL;$aLl$L9l$xQ,$\$LL+\$H#\$lL$L$LL$M+LHHT$ :D$LL$LLLAMHHT$ 4$LL$MLLLHHT$ $LL$MLLLHHT$ $tO$LL$MLLLHHT$ yD$t$D$A$Dfnf:"$f֌$+MLLLL$HLHT$ X<$v $ $$ALLH$L$$M1H$t$L$AUHT$0rAYAZŃwPMLM°HHT$ VLt$ _AXw $AăA v$LD$E1AAE1ALDAE1DA؉$A)$DAH|$`LL$HT$`H$HLHT$ H$L$DAH$XE9wD$ADIED$ E9sMH$LLAH$$$)$!ƍ\X։$LE1AE1LT$ ALHt$`MH$L$K DLL$DAHt$`XAAuEIED$D<$$t$AعLLL$AUHT$0L$=A[[D$HL$H+L$HAZH9L\$I H9T$(EuLd$H|$HT$CDLn9r(Hl$H\$H|$H|$HT$L)Ht+BLL$LD$t0$LOG9GH)LIt1A)LMLD$1H|$tLT$L\$CTL$PLD$L+D$HL#D$pI$H|$ HcIIi<$L7lw1PLLt$ LL$L$yZYD$1AYH9\$rHl$Ld$L)Al,LMAMAELL$LE!H$C*L$Ht$`HLHt$`tEAE!vMIL\$L9\$(.HT$HD$<$Bv<$ w ,$,$$LD$LLL\$H$H$L$L=LHHI9|$Cte|$Cta|$CHkI9H|$ETE\E$EtHAAE AE E D9t AHI9r8L$HSH$III9uHHH$H9\$8tHT$(Ht$H|$09D$D/<$w $ $ $ NH$dH+%(t;D$DH[]A\A]A^A_AWAVAUIHATUHSHHH$Ht$(LD$PLL$8HD$@dH%(HD$x1EHt$HtOHM0HU(LE1H4UIHE1HHCCDIL9t$wE1HܻHD$Hu$HT$8Hl$@AHHE"Ht$HM0LE1HU(HHt$0HHL$(H$IHD$ H8Ll$HL$HHD$`Ll$PE11H9\$AN,A|VH1LD$pAPLL$8LD$hEF(AqEMt$`H A H|$Xtt;rHt$(LT$`IN@IAv,ARu0H|$XLM(һZYu>|$hu2L\$pM;](r1H5/HH$Ll$·IE0NI)I~ IM97L$XMHASAUHT$0Ht$$,^_H$1M1HL$OL|$0L$0IMLM$.Mt Ht$HH,tfHt$HH,HLFRAUHT$0Ht$$LL$H薾ZYLL$8IL,Mt L,8L,H HH hRIULD$hH\$PH-V,I(vD$`E1E1D$8D$0D$HD$$ptH$XLLDL$yDL$E/EL|$0m|$8|$`|$EH$1L$OB<#HH H uH|$1ۃ$$LLtAMAAME1D$MAE1E1AA$PH$8LLDL$>DL$$0H$LLD$EH$LLE1$H$LLm$jH$LL蛬R$OH$xLLu7$4H$LLO$pH$XLL)}LLH H|$0 HLLME1&$xhA$LLu4HD$D$gE1䃼$LML|$0# DŽ$D$Et`D$L$XHL$HD$1Hyt D$LH)H9E1HxHyt MI)LL@H H H9L$(uAH$O1Dd$01H$0Hl$IHl$ HT$8LT$8K<"J$HHuLLLHH% N$H v}A;ZLIButE11CL HIH IuLLHLL\$XHD$HHH H|$XLD$HHuHHD$HH LD$XHt$HLD$XuE11LT$ HT$8J$8A:N"BDŽ$@t*B$H$tLLLHl$ EI HD$ I D\$0Hl$L$D\$ LMLL$M}HuLLLHH H|$HEv_8uZHpLLLHD$0tHH LD$0Ht$HHD$IxM@HtHL$0H|$Hq11|$ H}HuE L$HD$H I H9l$(Dd$ HtHLC|$u)At#D$pEtH$XLLE1\E1L$J8N0JXOIIHuH$(1$@1H$XH$|$0H$DT$0H5 HL$pHL$HH$HDŽ$HH$@HDŽ$H$H$H$ H$(D$0L$@DŽ$HHD$8HD$HDd$L$8L|$MMD$HH$(DL$|$L$ H$HL$衛D$XALT$(I9uH講D$XHD$(L$H$PHLHt$(LH$h`H軚DfAnf:"\$XDL$ Af֜$Av$H߃H5SMDd$L|$莙|$ ~HBƒD$xD$xH|$LLL$@IHUH|$LLHH4HD$H|$ I$~H$P輙DDD$Wt$XHkpH$PcpH$}L$HCpHCxL$hL9r!MDd$L|$1H5ZLA|$0H _I)1L$L$IH$H$$LL$L$L$L$DŽ$LКHtL$LH貚L謘L袚LHt蕚!uL聚맃$HIH|$LLILHCxIH1LLHkpH$HD$`$_L H$HhLE1LH$ߗL؉$H$HH趙HHtHI裙!uHMuL臙LLH|$LLHHL$ILGLHAL%y 9L#MtZ/TL$@Hv HcL1C L%Q HL$HLLLHL$谛…y>|$HAAmH3Ht LAw1H5f LAfL %E11LLL$@HE1jjjjjL\$dASLT$hL\$XARL|$xLT$XAWAUAVD$lHPT$Ht$(HD$ u!Cu C81C8Ht$pHt$HH\$HLt$P$H=Ll$XL|$`HD$hLd$x{tl|$8LC(H HK({LSMtzL=(M9tn{uoLS1{8uHT$H4$MLHSE(Q|$8t LVL[(4H{(u-L bLK( 1L%SM sLT$@LSLSkH$dH+%(tH[]A\A]A^A_ATUHSHH dH%(HD$HGz8Ht8uC8Lc08tHRHsԙC8LeHSHL$ HsL<DžxZjLME1LjjjjHT$0RH;s HL$HQ1ssHPt|$tHs(H{LD$LHD$dH+%(tH 1[]A\UHHfHnSMLfH:"HH\$0HsHt4LkLO\IsH9t LNI9uI9kuH9s5IC/LIؾ)$@1Ht( $HhHCH[]UHHfHnSMLfH:"HH\$0HsHt4LkLO\IsH9t LNI9uI9kuH9s5IC/LIؾ)$1Ht( $HhHCH[]AWAVIAUATUSHHH$ H$(HL$XHN8LD$L$LL$ L$HD$(HT$HdH%(H$1HL$H|$Ht$H~H|$>HHH{pLLHHx.uALL$HLL$@H|$LL(IH 1LD$PLD$(D$PE1LD$@H$1D$THD$0L\$0L9]{LT$0K,DK0DC(ILT$8LUIrAzARL\$xASAvt$0HT$0H }uaLEHt$8A<0uQT$pu HL$xHL$X<u7HD$XS0HsHMPAAWL$H|$(AXAYw|$PHT$8HU:Uw3w}1GjYtpw XtYn ?|$p4Ht$ LD$xL;F8rH|$1H5PHT$ HB@J IL$|$pH|$xA|$|$THL$pMMHL育HI$I<$s,HK@ATMAWAH|$(L$莌^_up$LL$hHK@s,HD$hAQAMAWH|$(L$NZYLT$hMt"D\$PM$D\$TH$Ht$psHD$0v|$PI<$tl$u$tX$tNH5_t$@AIVAWAUATVL$APL$IHt$HH|$8誌H0u1H|$(L D$P} |$PHT$Xu:t$HHLHt$0AWAULL$@LD$0H|$([H Hl$p1LHUHHt$0AWAULL$@LD$0H|$(H H$iH|$ILL`HtXH@fvH|$H:t8Hl$pH$H ̧HHL$Il$ML$ 1LT$HLET$(LT$@6H$dH+%(tH[]A\A]A^A_AWAVAUIATUSHXH$Ht$HT$HL$0LD$8LL$HD$PdH%(H$H1HL$HT$PHA HtYH|$tQHqLD$1H9sAH,HHkHL9w L9Gs;H]HLL9_rHLT$L9Ww)H9uL|$P1AeLL$L9OuHLgHD$H|$(Lt$(Ld$ I$L|$ HL$AUL9qs.I9Fw(I9Fv"tIHuM~IIA}Lt$(L|$ tIH 1Ht$(H|$`L$Hl$HD$xLLfLMD$8M9rH|$L\$81H5A HD$HT$8M)1Ht$H$LL$LX@DHL$H$L$ML$D$H$DŽ$NH9u H߽bHH$谄DG$AvH5H襃?tET$0D$7HLHDD$8tH5]HZL$H$LHLHLH$蕃HӃ$DD$~ H调H$ 螃HH$;E1ɅtD HD$nHDD$ZHDH$AwD$H$ $L$L$HDŽ$(MH$(H^M9v#A>tLLL)SH$(MtH$H$LH4H$(ٴH$0HgMt$`L0L$A;t>$>L$0HL$0III HHuH܁L$H$HDŽ$8LL9vcA?t]HLL)eAM|C|yIMϺA|yHI׸A|yHH$8IH$8H$LH$HuH$8H裳H$@H1Md$XL$L L$$A8_L財IHLA>/tH;$(L$0I HuL$@M4(HHL$@pLHeH$H$LHtIҲHt$@HcL$@HH/H|LIL$I+1H5L$LH?L7APLMLH$8QHt$ HL$8xAYAZQMHLH$HWHt$ LL$HD^_$H$8wL :LL$HL$@MzL|$HD$@11MLd$HH$L$LbD$D9rFD)1D$ $Ë$A1D$D\$@A1HʼnAtKLLI~<t>w'<<$LHA<L谀,L;IHmL菀LI脀L|A<$/EL;$(sxL$0OLLT$XLIH$H$LItIZHL$XHHHLLB8/J|8IMImL1H5EM}IuH$v};ʀ EL DOcM>ALL$`HLLAQ$L$DD$PHt$ EXZH$PD$ 1HË$HI1HHIH$D$@L$L~H;$8r1H5LM|H$@L$J1ҋ$ D)$1Ë$1HʼnH$1|HH$j~L$ E,ELAB~D$@Ld$H11MH|$hHt$`E11H|$pLHE1HD$h譗H$L茕E1$MuH|$xtH\$`HL$HT$8LIؾfHtHHLH@H@:YH\$`Hl$xH UxHHDyHD$(A}HpL$1E1LL|$HT$L/Hl$@LLVHL$ALB8L$HHD$8H|$L$L$L$$H$H$DŽ$H$jI|$HHl$@HL$HT$8ML,HfvH@M|$MUH$LdM$$H LLxH$L譓AA}u#LL$ IMMI1Ht$ HLD$ MHD$ LLd$ I$Hu2EH$HdH+%(E111XHtHl$(E1HEHl$HI9SM< IIkHH9*w3H9jwMOLJLJMLLt$1"LI<HLkMM92wM9rsH_I9wIHt$I9ruIM9M*M9jrzILd$M9bvIjHT$0$L$HL$H|$L$L$HuLE$H$Ht$H|$HD$0vH$HdH+%(rE1LHt$H|$HD$0HX[]A\A]A^A_Hxhu}L`XMtgA<$/t`Lx`MtWLLHyHL$HT$8LHtIHiHLLLB0/J|0HKILl$(MUMbhH$HdH+%(L\$(1MCIPhE1,HL$LMATM1HATLt$(t$PHt$0L$GH RHHl$@'M&IvIFLI6Mt IFE1E1H$HdH+%(tHX[]A\A]A^A_AWAVIAUIATMUHSHH(dH%(HD$1uKHw L|$Ht~WMMHAWLHHt$>AXAY|$HT$t1vH2Hw L|$H6Ht0PHLMAWMHHt$ZYu>|$uHt$HD$dH+%(u0H(LLH[E1]1A\1A]A^A_HT$dH+%(tH([]A\A]A^A_IHHL9t7AHHJIH:EA HtD<>B A AAI9vDSHt AHcHcLDHt ADۃ DۃD I19v[UIHAWAVAUATSH(HLdH%(HE1L_ HIH9tHH$H0HL$(@1E1AL5' LLl$IAX8AX8L9t D"Au3AH8ʃA D AH8EEbAKDMHAH54Jc H>HBAH81rLE1A3rHAAAIcD$ AsAHDJE1AD)AIcIOI<;rHAAAIcD$ ArAHE1C<uC IIuM1A<tAHHu1L߰AS A@@uAS LE1A@8jLE1zBHcHD2t uD`HAAIcHD8ETArI9DDDBEDbrHBAAIcH<H}L9D9u~(D$J DeIHHHHI)L9tHH$H)HtHL Ld$LIHL]MHMEAKLAH8}sBzEHBQHBH1HUdH+%(t8He[A\A]A^A_]AWAVIAUATIUHSHdH%(HD$HIHH$H$L9sN DBZHH$AAxL<$IcIt>uILLu1I<?H<$u&DGwLOL $AAMcB<tH<$H<$LD_GAAMcILutL<$=HHULLL1mHT$dH+%(tH[]A\A]A^A_ATUHSHHdH%(HD$HHxH<$E1ۀH MDNc I>AD`HHUNLA)@u ǃ A)ucmhxx^HcLDL$DLPL$DXpAAu6H<$D`@ADHIL$ HDt L$ALE1HD$dH+%(tHD[]A\ATUHSHHdH%(HD$1H<$IH$H9s3:uBJHHtH4$HHLuHT$dH+%(tOH[]A\ATUSHH1PIHm I$脜HH Hs0SIl$H{@~CID$HK$It$01I|$@LIL$$AT$ID$8fAD$fA~D$((H{8Ht HSID$8L[]A\HAHfHnfH:"1w^(wDAHI Luu DVAL FOcM>AAILuQILu,mÑweHu. u 4tEHt>Hu7Hu1Ht,W(1;W,}"HcHHG H@W(D@1ËO(;O,|1HcHHG H@O(Ht~H@HpPËW(1;W,}"HcHHG H@W('HpHWH1_uHƸHs[HW RtOu3GHRu A A H‰GH1HWHDUHHGSH_tnuy1HK9_uHHK[HG8TuGHSHHGHcЅy1*K(;K,}HcHHC H@K(HP[1HG8_uVHPUSHHWx_u HHGH1x~ ~Hs>_u HHs[]øUHH SHRHtzCr4d3C΃PwVHclLCA8u\HsH4HsH4 H[H[X[]HSH7HH@Hǃ[USHRHuHHPH@,@X[]ATIUH,SHH9t3LH[]A\HyÃ8/utH@Hu1H@H Ht HPvHzLJ01AVL5AUIATAUHSH3HtZMw IcL>5w)LHHu5u(HLyHt8/uHuLHuHm1[]A\A]A^1Ht?/uHtHË18u.HGHH1H1>duVЃLcHsHSD AEtE>HHS)HHDHHL[A;E IL[A<$EuILcH[]A\AVAUATUHSHGLu []A\A]A^Tu []A\A]A^LsDHArHPTHWHtK9/~AC7w7HHt&ET1HHuIƀ>EuHHu H IHH}IĀ?IuHLHHILLH5ApHHG1ɾLHH fuxxpHXH_xTu HHG1DE(D;E,IcHAHH] HCDE(HCQЀ vouNxnHHGHHH&Hu>IHHھHH4ittuXxluRHE1HEtu HIHM9yEHL1HHuu-HHHEHI`L?HHH IHtZDA2u?LpH59AFM.EHLzu4HL7HHHA4wA3t,1eA^tHt'DhAtEu1L6HAu1\AMpt mA:MHU:_H1HUL]1A;_uIþEHL]rH"HMH…tHѾ9HHHѾ7LHMI|$t HI@gu~su @su~ru HRI3H LEIA8IuHLHHILL9HL8H$H5L(tH5lLu HEMAfu,H; HHHIHAn~EUAwt Aaj_H~HHL]IAAH wU{HHHuFu1oHH]H$IĀ;I2}PHj1TXH= IHHHHL@H$EPLMDUHIHLM1ɾ(HH2H$H-H$H"H$IqHuAI_tX0 w/HULBLEDRA0A vD)HIHu&iD}LELHD}LIHuHE1L]A;_u;IHL]L*HHo;IHLMIHu1 HmHHtL+H2H$}8;}<LE0HcIȉ}8HD}(Du8DmHLMHA9Iu'MKU8;U<?HE0HcL$U8\H]D}(Du8DmH7EQEZA vA_t AAAwB1HH]H$IĀ;I$HmHLHTH$HUH$H8IHLM<1ɾ$HHH$IHLM1ɾ"HHH$`IHLM1ɾ#HHH$6IHLM1ɾ%HHH$ IHLM1ɾ&HH_H$IHLML}H$IA?IuH4LHHH$H$H.!HHHH${MqLuAyIMiLmAQF4T"(L=nMc4M>A]LELH]L1ɾDHHH$HHE8u H$HxH}8EuHe1ɾLHH0H$H5`HH$H5z HH$H5< H5S HH$HpDNDMHuH5O H5f H5} H5 H5 붋u(;u,BLcILe ID$u(A$,EIL$$A0A fA|$wHH[ID$HHyHMDEt LALEDAs@DfE\$Ay_u$IDmLELHLM8DmLI HIMt3HU:_u'HHHUL-HHIE1L$$ H5 L,$MU8;U<Hu0LcN,U8H$ % HT$dH+%(tH[]A\A]A^A_USHQHGt HPHWH{@7@HwHs@7vucn@ H=S(H;S,HcHHC H@S(H@H@3hHxcuI@vuC1Ƀ{LkPHKPx1Ƀ{PHt5H= 4H.kP{AH1ALj D)ALcIkLHU8 u6@8ru0D[(D;[,}7IcAHHC H@D[(2HhxD9tA1Z[]USHHdH%(HD$1H$HHSAAAAAAHDe(HED;e,{IcAHH] HCDe(HXHCDSH{?Lu&HHGHHt+HUu@x@lt@t1 L@LExlHHHEIHLMA9EIHLMDU(D;U,IcAHH] HCDU(GLcCjLXL]xtuZHHHEjxFU(;U,}>HcHHH] HCU(HCE8I;E<}Hu0HcHΉE81HM9BuHH[]A\wH[]A\AVE1AUIATL%USIE!U.BDKA  LKIcS%D@LAATu HrHhLHMtp[LHMuFI]MLH(LYHMt_HLIEMtLLGHStMUA:Et@tHt!E]8E;]<}IE0McAJ E]8lE1[L]A\A]A^AWAVIAUAATIUSHHHGDUMT$D}L$ LSL"IrHsAruCH t$ 1AVuCH t$1AKuCHD1AzuE1IzH{ABA_HHHu+EHL HH1ɾHH1ɾHH1ɾHH1ɾHHe1ɾ0HHpHux,HxH}D@ATtv3AAtUARHUHHHھH&AVt ArtvH!1ɾH1H(1ɾH1xHt"LHLMxnu1ɾKH1ɾJHHRHM9ELaLe9_4XE1E$E!A$unAt$@St@_t@$ /.}(1;},}!HcHHU HB}(BrHMLaLeHuPAED9~C IQ<$t tIDLHD)LMLMHMHbMtHѾALHHH>~I1ɾ@gAsHHEt{EuuH43N5wHH2H[#H4LCMEAI5HHIAMPLSHM@1@@EH4H؋t/wuiH@Hu^5wVIIMAtGH@LHMt1EAwAwAAwMI1A5@ 11HHHEu;u 8)uH@Hھ[H]A\H[]A\AUATUHSHdH%(HD$HGUNtSpZtkfHHHGIHt`1HH#IEHt@Ht L$H$L[HE8Eu&HL$$HE(H1HGcIHuE1 HM9EuHYH]@q@su0HHHM0tɺH5HI@duHHHMlÅxHIHutX8GtHu\DE(D;E,}.McAILM IADE(MaMAHAYE1A}uMUA:)uIBHD$dH+%(LLHD$dH+%(H[]A\A]xtt1GI=HHGH5HILHEH1IHU:Iuvu%MW}8;}<KLU0LcO$ʉ}8HbHHD$dH+%(uBLH[HuIĀ>IuHH[]A\A]HD$dH+%(tHL[]A\A]SHGuWX1wY‰WXHC8Ft1>HHHKxYuHHCH{HHHs>EuHHsCuKX[AUATUHSHdH%(HD$1HGH$@80u3HHGHD$dH+%(H11Ҿ.[]A\A]!AHDmLELHnDmLHHu1/1ɾ.HHHtHUHXD8"uHH$HUHT$dH+%(tJH[]A\A]AUIATIUSHQHBHjRLDI9vNuqHuI9vHH;H#HuH;vWHCC.HHk{u!H{LH;LH+LHkELcX[]A\A]ATIHUHP'YHL]HA\|ATH5)UHH8dH%(HD$(1Ld$LULHHD$(dH+%(t%H8]A\AWAVAUATUHSHdH%(H$1HD0E! IԃQH8Hc4H>H$dH+%(t褿IcT$It$Hĸ[]A\A]A^A_IT$ @ H5HIT$ @H H$dH+%(tDH~AH5wLHH[H DAH[;HuH[DHI4IHILAH 5wVMIMAtG`D(H(HH D)BD(HHBH D)JHX@HxH[fLn׃;fL:"uID)$L IT$ @Hx;u?L$$L 2E~MIB|<0u HJT<( @H1 EuL(LpIT$ @LpL(HLJ(u H">HL(Lp_8tIH5O#H$dH+%(tIt$HĸH[]A\A]A^A_oL0HH8/u<HHH|L  @HM]L L H5H$dH+%(tbIT$HĸH @[]A\A]A^A_H$dH+%(t'IT$Hĸ @[]A\A]A^A_Z~H$dH+%(tIT$HĸH @[]A\A]A^A_H5H$dH+%(t螺IT$HĸH @[]A\A]A^A_H5H$dH+%(tWIT$HĸH @[]A\A]A^A_H5jIT$ @HiH5eHnH$dH+%(tIT$HĸH @[]A\A]A^A_H5 'H$dH+%(t訹IT$HĸH @[]A\A]A^A_H5H$dH+%(taIT$HĸH @[]A\A]A^A_H5H$dH+%(tIT$HĸH @[]A\A]A^A_JH5}RH$dH+%(tӸIT$HĸH @[]A\A]A^A_H5: H$dH+%(t茸IT$HĸH @[]A\A]A^A_H5H$dH+%(tEIT$HĸH @[]A\A]A^A_uH5}H$dH+%(tIT$HĸH @[]A\A]A^A_.H56H$dH+%(t跷IT$HĸH @[]A\A]A^A_H5oH$dH+%(tpIT$HĸH @[]A\A]A^A_H5?H$dH+%(t)IT$HĸH @[]A\A]A^A_YH5aIT$ @H;H5H@H$dH+%(tIT$HĸH @[]A\A]A^A_H5H$dH+%(tzIT$HĸH @[]A\A]A^A_H5H$dH+%(t3IT$HĸH @[]A\A]A^A_cH5DkH$dH+%(tIT$HĸH @[]A\A]A^A_H$dH+%(t豵IcT$It$Hĸ[]A\A]A^A_H(HtaDjEuSHzD@Ai9u;H$dH+%(tLIT$HĸH @[]A\A]A^A_|HE1I|$D8EDXE1E9~AMIILPI;;uHHHHL>I9tTM9uH9uJHvD;\j IcL AHHPDXHHxMZHHHHHt8/u+<tHHuE H  E1D7D9tA#t1A$uHW E11I1~(L ID$L(fI:"LT$)4$HuIT$ @H|$uL @HL$$L(EH M\$H$dH+%(taIcSI3Hĸ[]A\A]A^A_KH$dH+%(t,IT$Hĸ @[]A\A]A^A__~(IT$fI:"HtOIL ),$ @L(D$LL$L$|$L( HpH$dH+%(t茲H(LH @Hĸ[]A\A]A^A_L(HL$ L D$0fInL\$8fI:"H(L)T$ Ht[HW2wMuB AL(IB)\< gNt< B)d<0IL(GH?IT$ @H|$0L(tC @HHHHT(H(L @H@IIT$~( @L(L fI:"D$LT$) $t|$uL @HZL$$L(#fA|$t H5@LIT$LY L9Bt @H HfA|$t8H$dH+%(t蘰HĸHH5[]A\A]A^A_H$dH+%(t`HĸHH5[]A\A]A^A_IT$Ht @I|$IHvHH5nHcIT$H @L@L/L9@HL9HHIT$I\$Ht @{HUHھ @HH$dH+%(taHĸH}[]A\A]A^A_M|$H5EwIwaw HIwMcB|. uAH$dH+%(tHĸIcH[]A\A]A^A_H5<(H$dH+%(t詮IT$HĸH @[]A\A]A^A_H5LpMt~ IL fI:")$IT$:t+ @HHpUH$H EHR @H^Hpt L$L u Hs>HfH$dH+%(t}IT$Hĸ @[]A\A]A^A_M|$Md$A72IOH5L1LAuA<$uMl$A}u I|$?)MDA<$9uKIT$ @HH$dH+%(tݬHĸLH @[]A\A]A^A_"H5L转uWLHHH$dH+%(t|HĸH[]A\A]A^A_4E1H5zLSÅunA<$/u4MD$Mt*A8LuIpHHMd$MuH$dH+%(tHĸH[]A\A]A^A_ZL @H%Mu2(wIWH @ )HYH5L艫u9H$dH+%(t]HĸLH @[]A\A]A^A_ H5L=uS(HL @H_ H$dH+%(tHĸH)[]A\A]A^A_H$dH+%(t辪HĸLH @[]A\A]A^A_ MD$A89YML$IyLʾ @H<H'ID$ @HHP H5HIT$ @HHRs H$dH+%(tHĸH)[]A\A]A^A_鶿L @H` L @H  MT$A:2u!MZA{uIC8>u (HZIT$L=LHZH;胩It$u0HN9u'LqA>)t Dž0HQ @H: HVH @' Ml$H5I}HHu2H[ɾML$H @IQ: ]H覾5LHݨtL @HMD$ @HIP Md$A<$2 MT$Az MZA;> H$dH+%(t]HĸH)[]A\A]A^A_ I\$;;tDž0O LkA}u -H4IT$ @HAAqHJc4H>H$dH+%(tHĸHu[]A\A]A^A_ͻH$dH+%(tHĸHl[]A\A]A^A_闻H$dH+%(t賥HĸHH5d[]A\A]A^A_H$dH+%(t{HĸHH5S[]A\A]A^A_H$dH+%(tCHĸHH5/r[]A\A]A^A_ML$A9Ay=MQEA0tA1t:sH$dH+%(tӤHĸHH5T[]A\A]A^A_H$dH+%(t蛤HĸHH5"[]A\A]A^A_E1(H7IT$ @H)HA<$>u -HAu [HIT$ @HfA2H$dH+%(tHĸH][]A\A]A^A_韹IT$ @(H胹IT$ @HH$dH+%(t荣HĸH)[]A\A]A^A_;H$dH+%(tWAt$Hĸ[]A\A]A^A_H5H$dH+%(tIT$HĸH @[]A\A]A^A_HIT$ @9H$dH+%(t΢IT$HĸH @[]A\A]A^A_H$dH+%(t蓢At$Hĸ[]A\A]A^A_CH5IT$ @HH$dH+%(tAHĸH)[]A\A]A^A_Md$L萸HHuHL @HH$dH+%(tHĸHH5g[]A\A]A^A_-ʸL5$A9D<L @HKD9~ LHAI\$Hu5H$dH+%(t^HĸH5[]A\A]A^A_H5HH$dH+%(tHĸH}[]A\A]A^A_H5PH$dH+%(tѠIT$HĸH @[]A\A]A^A_H5 H$dH+%(t芠IT$HĸH @[]A\A]A^A_H5^8IT$H @8H5=HAt$HH$dH+%(tHĸH}[]A\A]A^A_鵵H5DIt$HYH$dH+%(t趟HĸH}[]A\A]A^A_dIT$ @H5HIT$ @HH$dH+%(tPHĸH][]A\A]A^A_MkH L Ah;lMpLcIL`hMwL8LM_H$dH+%(t连Hĸ[]A\A]A^A_USHH(dH%(HD$1HtHՋR 4=~ ǃ0MH @UfHnHfH:"H4HH)$Ht$HHM4HD$dH+%(t H([]ATIUHS 1wHHt(H1蘳L @Hu[H)]A\s[]A\AUIATUHHSQ貴IAIIHPLiLaH{iu.H' [HL @H{Xu&H5HIT$ @HhMd${it ]HɲLtL @H4"=H虲L @HZ[]A\A]ATIUHAR%8OHSHc H>H5H5AYH]A\H5H5H5I|$u H5I|$(HܱIT$ ȱIT$* 誱& 薱H5#QH5EH59(t _IT$ @HH5HR3H5IT$ @H)AXH]A\ LYH @]A\~X]A\AVAUIATUHSHu HҰmIHȋXu(HPE1:*t,H5HA8HHuE11L @HNEt )Hgu[HVIUHt @H[H]]A\A]A^+AVAAUATI4UHSHHz0m}ZHUEuH5wLH@7HuEL H )uHM @HL *uHM @HL L(HR @HHǃ(L(H5HHULbA<$Hu3H5hHAl$HߍuH5WHMd$I4A $5w MIAuL @HAL $Md$Ⱦ @H!L Hm}[]A\A]A^AVIAAUH"ATIUHSH1HMt_AzuXIR +wMIIuIuMԊ<(t t H (HAE1L(1LHHǃ( @Et )H軭(H训HUHt @HH߾)苭LH߹ @KL([]A\A]A^Ã:2uHBHcPHp鋭 @HBHHH1>fDAVE1AUATUSHRHLbLjA<$<ubLXEIM9sOD`I~At$A6HЎHU2HzHBH蹎LUIzIBtHkHU:LuLmHH+ML9HAM~LJDL5* DHuELFLUAL}EL;`LG`M9vMHuN$O MbJL9t HMJAH9E HEH]H9tHx HEt LxA A@DD9σ@DB4 @A}EHHHIMD$tM)K@H IT$L)HRtHs AHH}I@IHxtbH9uH9} H}H]HHIA1DHHPLxE82u7H9}H}H]HHIH9tDHHPE8uރ}H}LL9_ALHHEH9uH9EHEH]HMHELAA@u'HxtHx< u T< LAt*HxD tHxB<u%E}MM9CLIHEA0MM9)CLIHUE`CD<uDHhH}LLLE荗LEEXGTAA GTLEHJ4Md5HuHA$tH=a H9HDA $AHH@HAdE`IJIPHMDEcEHNKLLUItH5 H9HDH8!IJM9t"E`AEMtI|$CDuIAAEHIPCDt L;\H9hOMPLUA@<w <w1< u1 1@<t$1AHAxMHMP@MELUHcHEHE8xAp@8pILuIL@HLEDPPHEDUMT$MЈM)K @HqtHLLMAxEPHJ4EHAI<1H@E9xL8H@KJ9wHuJIҁH)HtHLHT$HHHHDAE)L;sJ(D< HJMHHIIL)H9tHH$HILډtDȍyqM IEC@E1M9DD'DFDeHAGTGtEIcHHK APHuH H4H9 LUM I9 LMIMEMIM9uMLEIMIPH}L9uH9}n H}LeHLH}L)L)HcH9OHxt@1LHH;t$A|EHHx@<:B8<t I\HcLLLLHDLaLDHLL HcII݃}t ELH9rA HH;]t stH}G8 z { tEo H9PuLEA@8@R HuLMA9 A; AE/ HMy8 H;]ush H9PV EPA@IPLMD$tAM)EK@HAE)I9s}(D< IJ<MHHIIM)L9tHH$H)HtHL<L|$HILLDxtLMILAvDIMcEAID'LI("fA@EPAPAEIPHHuH9hv.>uH>uDfFDELcIuEMD$tLM)K@HAE)I9s}(OD< IJ<MHHIIM)L9tHH$H)HtHL<L|$HILLDxtLMILDAvANMIMcEAID'LIAHA@I@HLJL9hvDAz@w HrHHrH9hv:tHcHHEH9hVD AtLUAz8yxA ur JPu8H$%DRAxDA9s)΃@DBtA@x@u6xB92@u:z1A9~'t @tDPE9~_DLAAuQH9tBF@u@JE1DA9}DHE9}B|B"|I@tA9tP9uA A8tA PAVENIcKc MEVH9w-EvDHK4M LH4M HEEA@APHITAL)MtJLLT$LIHLMDAE)I9sI( HLIIILHH)H9tHH$鉕tLMLLUDAvANIItHH1DAD&HIAL)MtJLLD$HLILMDщD)H9sI(4 HLIIIMIL)H9tHH$鉍tLMLLUAvDIEAD'HIEPA@AAEZAIPfEPqEHApIPAAVAfEHA@APIPHILHMA@AxHMaH;]H9PsDCHEH5 B<AHH9 H=ծ <AE8BH;]8H9P+sCHuH= <AHH9DLm C<A8BH9PH}HuDHH9BD L$ C<H;]ssA<0q(dH;]ZDCH5˭ B<CH9PLUIL9H <u HEH9uH9EHEH]HELEHuA IL9teH5H <}ujMM9rbCLIHEH9uH9EHEH]HELUHuA IL9u %  H=ڬ <tW}tHEMM9rCLIuH}$MH}LEMMLEMHEEAVEVM EFAvOc$KMcIMIEMANM9w3A~EvLUIOAH}KDIOJIHtH9hvW<w <w< t G<uC@1LJLMBDBDHLTLU@t A:u3A:)HuHHDHHuEm,2gHUdH+%(tyHe[A\A]A^A_]OPfHnLOHfI:"G8.HWHtH9rHRH92rHHGE1HtHH)H@ILAWAAVAUATAUSHHcw09wPHH@HIIi/HC@tHcs0H{HHO/HCHHckPAIHD9[0~VHHKHH@ HtH HS@Hs8D\$ ME4.HWHAVAXAYD\$ DHHAD[PHD[]A\A]A^A_ATIUHSH dH%(HD$1H@u1HL$ HT$t1HcE09})I<1HcH]0HcHu@LHHT$dH+%(t"wH []A\UHSH(wdH%(HD$1~ HPu,~ HHSH}`HtYwH}hHtKwH}@ueHL$ HT$H}(t H} tH}8tH}@tH}Hs}p~-1HUxH.D^AC<wHVDAHwHA_tA_tA0A H:.u#@z0@ wHD A0A wHHL)]LOHeI_{ _LLu{ ZtLqoLLHHS 1LHFH‹L1HIHHoLILLA;uMu%DuDžDL'1LqHLPWLHܯLHDžPƅXHDžpHDžxHEH`HhHEHEHE)M…}ELcmEAHHEHAEMNIELHH)H9tHH$AL)MtJL,IINHHHHI)L9tHH$%H)HtHLL @LLMHe1LHo1}HUdH+%(toHe[A\A]A^A_]AWH( AVAUIATAUH-+@SHXH; HD‰t$$EH5|HEDD$ HD$(Hl$0A}[,LnIHD$M)Hu LlIM Hl$(Hl$II6HM;~u{LL2oul|$ EntVAu+u|$$H5*1SuAuA~u Av~zE rAE!gI jD$ID|$@Dd$DHL$L!MuLD$AxtuH|$t|$ u_LJIHM)MIMHD;T$LT$Hs8HLQML\$HD9r#t$@LLM;D$s Hl$8MD$HD$ UDd$DMtHt$8LM;D$rU|$tNH EtH >tH zMt3PMEH5~AVHT$@1|$4sZY,u9H HT$0|$$MEH5~1sH|$t!Ll$IE1uH >HXD[]A\A]A^A_UHH$H$H$L$L$t@)$)$)$ )$0)$@)$P)$`)$pdH%(H$1H5Hl$H$H$HT$H1HD$l $D$01HAIH 03H4y#H="}AWAVAUATIUSHHHhdH%(HD$X1Lt$6iLHT$PLl$8L|$@♃T$P_H|$(At/1ۅt)Hl$DEA tA u |$PHMu1lD$PuLDL$ 3uDL$ u޽@uMA9E1DLLDL$ DL$ tM@A9D$PuLcՅtayLE1ۅAHE1M1MЉMt-9~-EICA|uA8IA|=u9)݉DCMtAA|)@'D$PHT$XdH+%(tiHh[]A\A]A^A_UHHjHPdH%(HD$H1H|$HH$HHt HHHT$HdH+%(tsiHP]ATIUHSHHw{t4&gHHL HHuLHiu'CHL$0M~.Ht'IT$fnInLhH(f:"Hf@IT$[]A\A]A^HЃtDUuLFBLÃHvH=/zH2HzËuLF@L@ÃuHvH=zHpHxÃuOHN@@ HHDAtA uHV@0HP(A uLVLyLR(LZ0HIHLLASLD$LL$HuAAAZH<2L9v1H5wL1IAHIQAAIZSHVHHrHSHH)H3H{HCuH[t0Hrt+Hrt PHvrH=9vHOrAHEu 1H#AVAUAdATAH+rUHHdH%(H$81Hl$ Lt$pH_DdLHv1L$g_DdLHq1N_1L1LHH$8dH+%(tdHH]A\A]A^AALIIHAHIAɺAAATHHRqIUH5YqH-ZqLqqRH7qjP1WRHLEVUVHH=H5_I HIH|LPXP'|HpyH5F HHG HH賊PXP{H[yH5F HHG HH~PYYP YEHCPtqHIL1L艁LcHsHLLtudH-F L1LHYtN;{H|HHHF HHˉHpHٱԱHLJEXHHHuY/HHPH H=sH]H3H[H3 "Z]WL Z{ְAH3HH{LH{LL{HLr{HH$HzH;=N t"HN HJ8tBHJwL1̈H萰HXHЌLHHL8H0L(H LHPLH@LHpLH`LH萍LH耍LHLHLHPLH@LxHpLhH`LXH萋LHH耋L8H<$H9tuH"H<$H9tuH % H% H% H% H% H% H% H% H% H% `U[UVUQULUGUBU=U8U3U.U)UP#UPUUUU UPUTTTTTTTTTTATIHUHS>] u"EtLHHt(9]wE IT$ID$HEH*u[H]A\Mff.fU1HSHH7Hu)H]Ht@HH[tVH]HuH[]Off.fHH= H=  H@AVH5# H=7AUATL%ULH-S  H 1U0HY ,g1f H@ HfH,@AʼnHDtMLEXHLs0Dk(HH f1fɿ H@ Hfp,H-AHDt=MfLWHwDk(0HLsHI TfE1fҿ H@ HfDH,PAAIBlHHjWHHkLH5 H=|-Dk(HH SL%bK H #K HLK H5K H=J L5/K L%K LJ HJ H K L J L-J HK LK H-J H5L LJ L%kJ H=,L H UJ HJ L5GL LpL HL L L L-L LM H-=M LfM L%M H M HAK HjJ HI H=I L5EJ L6J HM HH L V HM L-n Lm H=N H-H Lm L58N L%m H zI LSN HTm H5I HnN HOI L N L-N LN H- O L4O L%]O H O HO H5hM HO H5H L5H HH L-H H-H H5O L%H H=9H L5"P LH L G HmP LG [L-P LwH H H H- Q HZH ]L%ZQ H=O A\LO A]L QP A^LP LQ H ZQ HQ þTHfTH${qTH!-:@HfH H )‡ )ˇ VPH߇ HtHˇ HH@HH H H1L AA)D<HHE9L9wk9trDDLIC<H9wG9tTAELIGL9w19t8AA)AA HHE I9r2fDȉщB9lAIGI9ZfщB9Fff.@USHHtHHtHRHt H[]þRHuZZAUATUHSHHt$(HT$0HL$8LD$@LL$Ht7)D$P)L$`)T$p)$)$)$)$)$dH%(HD$1HT$ H$$D$0HD$HT$HIH.OI|$$HHOI|$$HHt}NI|$$ HHtdNI|$ $(HHtKNI|$($0HHt2N4$HÃ/rLd$I<$Ml$Ll$H\YfHALELLgMIHL$LT$ L$D$0LL$LT$H*NHHtM HË$/wBHl$Hm$HuHD$dH+%(HL[]A\A]@LD$M(IhHl$MtLMHHH@LmHLl$LmMXvf.HuLCIH3HH|L)H)HH|IIIL]MUMIMAL9MItlItYItFIt3It It HUIPH| I<HHt I4HLl M,HLT MHL\ MHHT IHL9`H| I<Ht ItLl MlLT MTL\ M\ HT (IT(H| 0I|0Ht 8It8H@L9IUHkHHI|H|HH)I)HIIIr'HIMALHIHMAI9Hl$%EUDHl$E\fD\Hl$hJIHH$H\$ $D$0HL$H\$A$K~<$I<4HgD]DTTlflEMD ALLHl$_2MMItrIt^ItJIt6It"ItMUALUKTJTIK|J|IODNDIOLNLIKLJLIOTNTII9KTJTK|J|ODNDOLNLKL JL OT(NT(KT0JT0K|8J|8I@I96CUCUHUHEHHHHV]fUSHHIHhHHHUIHHHr)HH HHBIHH9rFI8HE1@t A@tBfBIt B<B<HL[]HHtgHtUHtCHt1HtHt HsIpL ;M 8HL;M8HL;M8HH;I8HH ;I 8HH4;I48HH9/L ;LT;L\;HD;HL; Ht;(M 8MT8LL;0LT;8M\8ID8IL8 It8(ML80MT88H@H9f.gPfHnfI:"G8fDATLbUHSHHu AHH3HC8Lc0CPHH9Hu^H@K H T}FHSHJt HHCH!H{ HkHkH@cPH8[]A\HaH3NL HHHCI!LKLKH0Hs H@cPHHC8Lc0CP\SL/L9tHH\SH38Sff.fHuHLJ HUSff.UHHEHuHbEHt]HIHZ]ZAWAVE1AUAATUH-SHH(4$LL)HK .HIHILHHH1Q4HDxMLL)HvfO,>HIIk`HV4H6HDx MMMLL)Hv*O<.HIMk`II4$AT$4HPDyMAMk`HIMEAU4IpHT$ DuELL$AEH=WgH=41H=wH=fv\H-gH=wLíMc M>AHh|DH|H0HV|H {H=;fH=wPH=T'H=dLL$1E1k,xHA K<uD)}H- HL -McM>AH=9g|H=8@|H=9H=!|QAH={f.ATfHnIUflDSHHH )D$y;fHnfI:") $>fo$fo\$k@HC0CCD[ H []A\fHk`HD@@sHO@HW(H AHq1IfAWAVAAUATIUSHHhLzH H$DD$ L$H$H$LRHdH%(HD$X1Hz@L|$8HEHc,=Y== u=L=%= =!ދ= Lk`H]FDBfAIʁ] ~fm HT$XdH+%( Hh[]A\A]A^A_DAeH=&Nc I>A뤁w(N=׋= DAfH5HJcH>=t =H LSH=o ~T=0=Ӎ H5Hc=yMACD tY=eHN6!&sEMHL1L\$ L\$H{@H LSH鳑HgA?@fAnfpf֝Eu0DDHL\$ HL$LT$2L\$ HL$LT$uDuE1EADEZpH5LL$uۋt$8tAFH\$I9^)L$0ǑE|$0IX11HDt$0LDt$0o%L$0Ll$8A}}M}uj=@ E1E1Ls@ fAID9%a@ ~)K 2ytA1DIAD;%8@ |A}},D$8AIA< \< TA=? M}IYD$0MHyLA}*IAA:!I1Ht$gDT$H1DT$H1IE1E1LcLl$8E1H-N? AHD95E? LmLLL"uC|%u̓DtEDD$D$8IDD$/D$D$.HD$ HD$ID|$8AD |$5A|&EE DT$.l$/@l$HL$ Lt$@|$T1Ll$XL)HD$HHL$0L$P)HkH5B> Dl$0L>LLL!t$H9-&> ADt$TLl$XL|$HPt$PDtH|$H1K/^DHU $ݳسӳγɳij鿳麳鵳DAWH)AVAAUATUSH(DE=H= Dt$AAL5%= AHOHIcHL$HcމD$E1H$DAID9=< ~:M.HHL t6IvHtA}@Dt@Uu@:}uK1H([]A\A]A^A_EuA|ut$DKtATIHUHH7!AL$(HTvHHL]A\fDAWAVAUIATUSHHHoDEuHwIHG(jMLI)I}IM McH)I9˵IscAMtDDAMeE~#AVL|; HI9uH[]A\A]A^A_H3HWIHH7JD#JD'H)I)LHHHrI?L@AHIH:AI9hMIthItVItDIt2It ItMOALJONIK4J4IKJIONIK<J<IO N II9ONKtJtKDJDODNDK| J| OL(NL(O\0N\0Kt8Jt8I@I9DDFL#FL'jF\#fF\'YW$uf@D ucAD HHt$Ht$HAD$@Il$A|$(郳DžHL9uvVf.@SHGHHHwH9wMH9w CHwǀ[DAW@AVAUATUSHHD$T$D$ D$ D$   !,I fDIAuH= Ifwun@A$IrMI)܀|$ )D8 EA|$ H-s8 :K[L|f.HI9t7LuLHLuC<&uڀ}u|$tEHL9uɀ|$AUAEI]|&:<;kLKKM<}i<%i;B:CLK}%|<;KLC<}{<% ;CLK}g%)<;KLC<}R<%;CLK}1%V<;NKH{<}<%tK;tFCLC}%t-<;t)LA@I}%uLIbILÄtLKfLˀ;t {;)HH[]A\A]A^A_KHS ( HL<{A<L@IBDA} 1Lk`IMQPAAAHcL9AA1BDAx!O$tDYLGIcHE9vIDAHWhIk4AO$AMkF uEyLGLc_(LIMAA9rACA9rnN1@9sTDAEIG;r`D9saB HE9wA9v%D1ADHE;r1D9wf.LcىO(IMLDAAsDՋO$Afx"O$tLcILGA90É%HkHWh2HLHHcxLp LHK<9DQA9uH9WwAA)Avd<AO@C9w HcD)΃v?4AO[C9w!D<AO[C9v)σwLIHKHvAWAVAUATUSHhdH%(HD$X1HD$ ZHHH=7F cL%*F E1M$I|$H:HIXM9uMDALcM;w8MWPMEZEMg@IdM9Ikd1II9HkHkMl2M;t*MUM]M9IfInfI:"AW0ILd$0Ll$(@LLLM9w8rHt$ LLHT$0HD$ HL$XdH+ %(8Hh[]A\A]A^A_A$MIXM9MMuMM)L|$ Lt$0H5WHIHH=D L=tD E'IGXIIt'HHXH9tHHA9DBA;sIHuII_HtIPfMwIG8AG(HtGAH=~E'LnEH DL$ADL$LOMcMkML\$Ol+EfA5AtZAt*I}Dt$HrHW)III}Dt$HHH-III}Dt$HHIIAI}MvMeLt$MDt$HjHI}IIDt$HHtfHD$I|$Ml$LpDt$H~Hct9Ht$Ml$LvI}Dt$HIH.B\$9\$INH|$Hk4`H|$01ɺLcL$8MO@AGHM9w\DEMkOl M;ubAC1 fAO0bL:}Ap8| AL$HkMl:fff.AWAVAUATIUSHH8Ho(Ht$dH%(HD$(1H^H;o THG0HUH9CHH)]Ls M,L. IHFCHH{Hha (LLC0L)L;C(!LK8Ht$H{@IL.fInLK8fI:"L9rL9s9H?H+kHk0I $HT$(dH+%(u{H8[]A\A]A^A_HL$L+{)D$Ht$H{PL|$  HL$HdwE1M9sHL$L+{LL$LD$H4 Hk(HC0HH)v -AUfHnATfH:"IUHH@dH%(H$81H|$HHH $H)D$HD$ HwUHw7Ht$HHH$8dH+%(H@]A\A]HLD$0HLH{IL9d$ rfETHOHM|E\ZL-# LL$E1H-=H# H=MkL MA{ ID9- H# HD=X! E H=(! HH0! Ht =!  =!  =! =! ^= $  T$=! =" X = - D D;" H=y rIcAxHc= H%! `=a" H$D= E119 ~uL= HHIM/LKIWLH輾HNx8Et H9 L H AID(fAD(H냀= u= t=! t ALt$1H D- A9L%@ I-? IMI<$A|$H  L H5 I IT$I<$ܽH IHHx?#b= PH D BD:E H H2 EtH=P H$LW ID(H= A%L$IHDŽ$Ht$3bl$HMpH$HT$L:$LL$@H54LLL$ H1HHD$0H\$ILLt$0EIHH|$011I~آHL$0LHHD$8~HI9YHT$8L ]2IAeAA@uH|$8L$H$>HxeH\$`E1E1HD$1E1D$ D$Dd$XMHl$PLDl$\EL|$hAL8#\$ L]]9H$|$E1HT$IE A\m EA'A" D HHADE7AAr@tD D L$uEtH$E1E1HH|$HMLD$pLL$LIIDG"H$:H|$Hl$PLd$Dl$\Dd$XH\$`L|$hAH9l$@uNJDMcIHuJ<àHD$I IIFH}HHuIHl$L\$E1IK<J4uH|Ht$M$HcL$,HItH螣|$,HHtD)HHcJd$ Hct$ LHL[IIL$A)p@蛟D$ LZI H=4 1ɺH5[lHH8H5nH= H%L11LHߠL%h L+%Y IHH fo%tCPER=#L/ L-h M{LL= L`H L)I9BLH= LH= L% I9L L  MILH+ M!ML+ I9MFfInfl)- Q'L M (MQMA:*HLu M (MQMuLt$E~6HR |$ H A9tHxuHpHt>*tH8˹H=; uD- I6H$zH= t+舓= AL$H$H$LǾH$hdH+%(u%HxD[]A\A]A^A_H5٭11?:H5[ HW1H=E葾m H=) = QHS H=hL$H pH-pHH1H=BpH=DH1L% H=1DLHLq=* H5 H= wH= HmE1L$A}LۡL11H蜝H% H+ HH= H51H L H A;]L9pL@L H= L L9?L H MIIL+=y M!ML+-l M9IFfHnfl)] NL5 MH= 1ɺHgHHuH=~ L$cH- L=pHH= LHE1H111H5=H=D /H=I`LH1s1H5H= H=I*LL$H15I3L腴H  HJ49HH1蔻M|L9HHLH  'H= H+= IH9oH= LLL L; L xH L@L 'EMAA9EtH$|$H1׺^HE\ H'HH wH5doH,H1LǒHp HL= H-H=v HH=bE1L$^ IAP LH艞L- HpDH;= cH= H5n D5  H= H~H D5  vD= D% H   D= E1D% H H5 HH;=t pL$H;fL)$/^D$AABL$H=t LL$RD$AA6L$L$M9H Ld$E1III<$11Ņ.J,E11AJ,HD$ HD$ H+IIIuLd$L$LH$LLAƅLLH$Ht H$AM P EuOEH5 HtH HH=31E1L$NE1H;lH= H UH L L9 t}L= IWH A H=N?!H=hHHHD$PL\$wH9HZ .H vHqHE1L$hH5=11H==1AHHl"H=sH=D H L$AH|$0HD$:Ht$H|$87$HD$H%IkD E1HVAKHHH5I<11L$HMM9gHDŽ$IL$HUH= H5)1vHUH= H5)1xvA'1A"zE1yH5 11N{HHH5T H=5<1莴H$AHH5 H;H5$IHtsH= H5#IHLLAA9AuE1L&LCH5 H=;1QHH5 H=;1dz=` )A[H;H=8 H% I}H }H H5& 1AH=g;ZOH5 H=;1A:'LH5 1LHH=$;Ld$A L$MLLd$AH5 H=;1AͲL% H=HL1H-Y H=HH L-; H=\(HLH H=(HHL% H=(HLH- H=(mHHL- H=)OHLt=- L% H=)$HLIH-z H=)HH+L-\ H=)HL H> H=)HHL% H=)*HLH- H=c*HHL- H=*pHLH H=*RHHwL% H=*4HLYH- H=k+HH;L-l H=+HLHN H=,HHL%0 H=A,HLH- H=k,HHL- H=,HLH H=,bHHL% H=-DHLiH- H=C-&HHKL-| H=e-HL-H^ H=-HHL%@ H=-HLH-" H=-HHL- H=-HLH H=_.rHHL% H=.THLyH- H=.6HH[L- H=.HL=Hn H=/HHL%P H=y/HLH-2 H=/HHL- H=/HLH H=0HHL% H=I0dHLH- H=s0FHHkL- H=0(HLMH~ H=0 HH/L%` H=1HLH-B H=31HHL-d H=M2HL1= tnH5 IH= aL A;tzH= HYH=MH H=Q$A tA;tyEIMH]+@;@pETHۋT$LLYAH]븉D|$H\$Lt'AD)5uOuTD|$H\$LMH5> L9v EA:tAI*1&;@uA tLI1LH= 1rHt$LH$QL$A;tEtiIEuA uHL$0LHH)H9HLt$,HHLA uI}DA;EHu H511Eu HbH|$Ld$H_BIA,$@ tc@;t]@HT$ H511Eu.L5 MEH5 E MHSMH|$8I)IcDT$,HD$0#E1@ IIVI@!u,3@ @;p@@!u%HH5 @H5 U@H5 ɹA t)u,A>H5 1EFIEu@H5 ff.SfHnƉfH:"H)$fo $fHXH s @H@ HP(@0H@H@PH@h@pH@xHHǀHP8PXH[ff.UHPSPHr H |HHRH]H1HE0HE8HE@HEHEHE E(Z[]:f.IATL%UHIiXL܇P1H52 HH1I IM1IǁAǁAƁLLLOAYLHLp]11A\4@AWIIMAVAUMATAUHSHHHXdH%(HD$81L$HH} ]]"EAM EDM,AHAMEtDMPHDLAPLE1H|$8WHAQAAUAVPAH0l\FEL1L$HLD$Ht$0L\$AV(LD$T$0Dt$4L$L\$UE/LD1L$LD$LHL\$AVLD$AmL$L\$MLmLD$L\$LT$ $M1, $LT$HL\$LD$ItmEEpH}xLD$L\$LT$EpHH4 $誂 $LT$L\$LD$HExLHc}pHUxLlILm M(LE0H}8E0HH4THc]0HE8Dd1^ff.H ):HQ@uHHATSHH$H$H$HL$ H|$LD$DL$,HD$0HT$8dH%(H$1D$TD$TL$TtH$1H5` AD$P|$Ht$X\$(D$LDD$LAe5Aą<HD$`Dd$TEt $!H|$`u |$,H|$`u$H|$`u$H|$`u$H|$`uL|$AH|$X|$(Ht$ H<$HqLDLLT$`D\$ht$TH|$H_HH޿HH5}HrL$$H LLHSH5^H :Ld$`H LZLHH5#H |$hH %H|$hILHH5vH H xt$|$FFE$-Y_HHHD$`T$hfxM\#H=< AVAUATUHSH=71H H= ILHH=HHHH=HH=36HH=6HH=5HIHLxIzLHANHD/Hf  L-[ HLRHIGIcAHH| ezLIHI4I|fccFH5I|HzLDǃOo=[L]A\A]A^H-eff.@UHSHPHHkHC@C Z[]ff.@USHRo(kX[]@SHHHPH]Cx[@ATIHHuHu HLA\þH|$4H|$LDLJLJ AWHcAAVAUATIUHSHfHn˻HHT$HtHL$fHnH fH:"dH%(HD$xH#|$@HkX)L$0fH:")D$ TxM$HD$HH@L@L@H@@L@ H@(H@0H@8H@H@P9ADkO4A>-u]A~tVD9vH5L yH5LEoEIkXAHt$EK<EAMkXLl$IEIEMuMuIE@Mu IE(IE0IE8IEHAEP"Ld$Hl$EE1LL$IkX1LeE9vMMDl$@L :lH1Ma@ڹLփHkXHDIXA9ABPM2AE D@AvAvDHk`LϋO8xG>@uxHkXILHXA9fBPuH=wAIk`I< Do8ExG>@uHHk`AD8A999tA< yA9t뙀@D9uD\$@EH|$~HHkXyHT$LD$HAHD$xdH+%(uHĈ[]A\A]A^A_fAWL=whAVE1AUAATE1USHHXH<$dH%(HD$HHHD$(HHHD$0xD$HHAAA HHk`H.jL< AG@MHk`E1DL$EaH4:~HL^vFAEEDD$O4AxMAHk`DL20fAM IMk`N<:fA0mHk`HLE(H} M7H@MIk`H֋F<|$*Mk`BD@D$umEdMIk`LTMIk`LD @kE1HH $ML H<źHHIUH|$0,aHH|$(HpWHHD$05tH|$0HD$(VLL$(HeIVMk`B|<;L$1E1U H e<9@wt$EAI/MoDT$HLl$ӹMHD$XL$E_HHT$I8AE茸HT$D$E1H,$AN\MVMwL\$8LD$LHT$Lt$ MH|$H@HT$HxHD$AHT$A)IcH)LoHLL$LD$Ht$ LT$8IfAI2LM)L\$IIHLI{rH|$H诸AI oEDI4Mk0HWLl$0E1MNTLT$(EIL|$(I7HLƺtALl$0McoHt$@HD$@H|$(LLD$0H|$@?L$L$E1O4I4H|ADOH9|$wEMIk`D2AMIMIAʹAH $HD$DH96D$t$r*H$L HD$@A8ZLHt$@LD$(ƒ|$@LD$(I#Mcw\ALH= sL H$D$A1LHLCLkHkPHCD$AE1AtfDH@1!uøt^ff.@Hk`AWAVL5aAUIATLIUSHHH(HfAK0Mu#fHnLC@fI:"S H[]A\A]A^A_Mk`ME~EE>ELA uEGHD)A uILiAAM)LEEMA;EMEEA;tA tEIA!ID1D)LuHsAuÅEELvADDA? uIMaEt!}t}A>.EEUM$M9A>:M~t(MDLD)ur1ҋuDDiLA:gHDI9wA:IMEM)IL]IMLHBD(H I9TL L%h MtMtH5oLHEdH+%(uzHe[A\A]A^A_]MuDA A .HsH= )HH1U9HJL 1=1UHAWAVIAUATSH=pHdH%(HE1 H=50 H  L \H Ht uIVXHhHIHXHyg9rL=H= H5*pH5 HHkkI~H5pHXAH5 pI~HoH AH5 H HtH=o11UHf1A+IMHt+HHtAIXA9rЅL-U ML L% = Mu M LR8 R q LLH= 谣II9=Y BL% L5 MM= H=ʤ L5] MtLL7u@L#AE1E11ҹLH=- E1E11ҹLH=a A<$Ml$lLLILLH)1=[ H IH= Hu|1H5L1IILL% ǜ 肙D AAD y E1D D ( H5SH=d1HsL1OIH=p IsH`IHH`H5c`H?H9H9vHH9rHX鈨HHH9]AUATIHUHSHPAD$LID$IHsID$I$L*LHL<HSH3LMZL[]A\A]fUHGSHHHt$H9eH9T$v7Ht$HHSH3HHHRHHL$H+HKH[]ÐfDAVAUATUHSH=g = u!=P HH[]A\A]A^fH=_ HH5`1~2ff.AWHAVAUATUSHHHOHH9mIH7E,$H)Ht$L4H<H)H9r>HH0D&IHt5HLH.ILH)HH[]A\A]A^A_HHk`ISI8H x@ILIPHI@|$tIL1H==]1;B1HHI1)BLILvIMk`MAD$AIJEHH{t{Mk`Cl9L%  L$$= D EAAD$Ez=f DQ E$dfD1AVDAUIATIԉUHSAHHc H IHkHH+Mu6HCMcAMkD\ L@fDp@[]A\A]A^J,H09Hc5) HMHCLkL IxHM $LMPD H ID*sR t-;˝ tXH= x HHk;H XZ 8H XAWAVAUATUSH8dH%(HD$(1A,HAAID1A HT$(dH+%(uH8[]A\A]A^A_,ff.HdH%(HD$1HH=E H$4HD$dH+%(uHڃf.UHSHP2Hcs HHH H(HXU Z[]fRݲ t ;7 tXŲ 77H XH= Hc Hc:Ht Xf.?-AW=AVAUATUHSH(lHHu H蜀H\H9rH([]A\A]A^A_þ,H6HILDI9LGMI)MoL6HLHIB8H5LH衂I  H5JL~L ML5 E1LIl$@fDUHAUATISHdH%(HE1HPHcHHHHH)H9tHH$H)HLl$HcLIL/t/Hf.HGtA}/uL)I}HH tZH@LE1҅yAHUdH+%(uoHe[A\A]]DXAA@AHL ZI}H5I}uA}/uI}H5^q}thӀAWL=OAVAUATUS1H-g L- D$ L5y A9~5HHI|Ht7?*tMt-Lu!HD$ D$ H[]A\A]A^A_Ã|$ uDd$ ff.ATIUH(AWu9u ǁA<$b ǁH(]A\AvA@UH1SHP HHuBHJHtZ[]AUAATUHSH8dH%(HD$(1>/taIHߌHH4$HD$|ILHcH ND$D$Dl$ HT$(dH+%(u?H8[]A\A]ÉHHD$(dH+%(uH8H[]A\A]2~ff.fAWIAVAUATUSHxH_Ht$HSxdH%(H$h1HHCXH+KpHD$ HH{pHkhHH9\HIL+K`<LLd$L]D$<HHL\$H!D$0IL+C`D$M9HFH|$p1E1fHnflChM,$LUHAUu8HKpH9KxLSpA}IMZL[pA:AUQ%uAm@>@<U@=HSpH9Sx9LCpM`LcpAA;LKhHkpL9HKxHT$DMeHE^L0HH+s`D\$(HHH!IL+S`I9HFfHnflKhL EmChDL$A|$<DL$HD$0|$XL$H|p0|$(LT$LI4Ht$@HtpL[pL9[xHCpA$LLhLkpMl$Au{LrH@.A}HKxH{pH9LWLSpL[hLcpM9HHSxLD$@DL$HIHHH+k`I!DL$LH+C`H9IFAfHnflShM@R!@Q@m@} @' @@%HKxH;KpLkpIuHspAEA; HkhHCpH9HLCxDEvH|$LT$ L-k-HHML+c`H!IL+K`M9LFfInfl[hH,1JDLM_$IG$L\$AJTpHu`I8Ht L/LAUHDH\$AG@I_$AG H$hdH+%(?Hx[]A\A]A^A_D$_L1E1E11A2@qm@+p@l@#|$_toAGCH5m @|$OLDL$HDD$@L$@w[1EUIG0H%VAARHT$oRLWLHt$8H @|$_t.ACL bH5cBLIDUH5l LULCpL9CxHKpNdpHyH{pHshLSpI9LHCxMIIL+K`M!LH+S`L9IFƒfHnflchI4$EHL$HqDA/EALVDIGAH5pH1vM_LI5TLD$|$_Ip[/sAƒLVI2HLrM$|$_D$_Il1ACL%H{pLHHkpH-j HtLKxL+KpIL9YH{pHLILcpFH-ij HtIHCxH+CpI96H{pHLH5ӭLcpACLcpHHmtHSxIL)H9H{pHLILCpDt$(L/jt.IuHEdH+%(He[A\A]A^A_]HL5II|E1H}qgLILhHuFLESgHIIGLKt HHHH)H9tHH$HxA룁H)HtHLLl$ILLLhHuHLSiL;IHLM)L`LLHLLHuhAT1USHpdH%(HD$h111H=J VH m HkHQHt(H HH)HHHHHthHtTHt@Ht,HtH ;H-HHHHHH9BLBL¨BHA@0IP0A@HIPHA@`IP`A@xIPx}AIgIH9oL h Mt EQEu0HD$hdH+%(iHp[]A\ËHAzHHHh L{tLIHKHxHsHsHT$~LHL$H-O(誡LHe ;dLӯH "HD$(H](fInL ^HD$0D$8fH:"HT$@D$H LL$PD$X)D$H|$9l$w)c$Lc~ MkL%~ I$AIkXHH7HwHwHw%Ht$HHrueff.fUHHHHT$0HL$8LD$@LL$Ht7)D$P)L$`)T$p)$)$)$)$)$dH%(HD$1HT$ H$$HT$D$0HD$aHHHfbHD$dH+%(u H]dAUIATIPlLL1ƕ      Hm HA@ DZA\A]He Ht@He HtBfUHAWAAVAUATSHHHHfHndH%(HEHfH:")D+LcIDEHHDH A{ H9 B{ LQML&{ D) E.MfDE]Eu< t@~:<%EFMnDA|H AHc< u< M    n< 0 L5d Mt6ENEt-AqI|HH5bu= A^DKHc HzNi<$<\:<| Ly L9y Hy ML@Ly |! ڒ EHUdH+%( He[A\A]A^A_]L5IHK.?= MH=EA.EBWHDžMM)EA%=p L=ob =L V IcLEEDLMAuAjAH&(DDEMLDH IHۑ HP HEcu,DLLKLHUHL@ I;DEC 誘HIH% ]LHDž McACHL]LH w H+ w IcYH9IqH=w H ې H`w BA>ADDE1D< tADM\=AuEFD5Ox H@x GLADE扵IA*HDL)I!ILLH[rAID9LDuLt H)uAHH_ E)McH[HD9c uH;LL7[uLk11LI}[A>iI1AMAt<%uLH: H=R 11+MH1Lt IHj=v L% Lu L+yu M9H=iu H5 LMĎ L%Iu +MA|MA H=4 M9H=u FH=u H=u tE1ҾH=L%"?11LH=u 1Ҿ11L=] H=wu foH1L5AIL%O HDž LLfDž()\H O H=eH9HZLI1HLH MHa HzHuH=P 11&MEnA{=Z I~ 0=D I MaDH=nP 11MH=M 11zML $L1ҾH ?MH=M LHDž fDž(L-[ MEeAV{UI~4.IHLT[ M$ApA9uH=ʋ MB6\H=6N 11M<1I*tH<;tDE _A^AGT= tIE1D95r ~KL LHIMQMtA:*t%LE M9YuI911HL DI묀=R Mx4InXL[fAVAUATUSHLgAo$fofH:fm) $M9$QILm1ۉItHt L4HUI$I9l$`0I9l$x%fo$AT$hH[]A\A]A^D=5 uUSQHo H9o sH o HQHo H-o Ho H9]H5o H=uo HHIL+ Mo H!IL+@o M9HF= fHnfl)*o u<=  5 HW=t l X[]HJHff.@(3ff.fATAUH=ɇ H|$Ht$uH=>X D uH]A\H=X H|$?-t D0FԾ=H<$TH<$HtHHD$HfATUSLgMu[]A\ËG$Hu+@o u)o LSH{L[C@ƃu$UH1ҾSHPwHHuBHJHtZ[]ff.AULcATUHSHHLID$ I+D$I9I|$HLE1Ml$B| t&DEQDID9H[]A\A]E1fAWAVAUATUHcSHHkHL%n LEuwH[]A\A]A^A_à HMD)AgAeAO9AWu~LyHL$H5%LHcaQD5m LD$u HA9~=LkO E:*uAznuAzouAz-uIzLTuAmtE,DAWAVIAUATUSH1HH|$0H?dH%(H$x1HGHGHD$HI>L{(A~tk@AwjaA9-HT$0AT$L$fHnfH:"D )$u911L#AOPfo$A_Xfo$AghAGTAowXDH$L)$Aoh)$ZRLl$0$DŽ$IuL$DfCH5kDH5lDH$ H5nDH$(H5dDH$0EH=>L/`IDH$81A A E  HDŽ$PAwH$@D$Jf$H$KtH$PQHDŽ$XAwx HDŽ$`AwtH$`QHDŽ$hE1Lt$E;oLt$1MgxA;_xH$XH_L$`Mt A{H$PHDŽ$pHQsH$pH|$ bQfn$H|$ LE1fpf֔$RHtGD;ksADHk8HًQAfDnfD:"9H|$ LAfD֌$R1H)L$pMAmvI}H RSCA}H$`IuAH|$`,RH$`E;esRHUKDHE|D;z!B $JLL8M9ED D9.AHrDSE1EbAIA9H|$ QDcEAt$fEfnl fA8=f~RAfDnfD~$h(H$D$hD E9~E`kxD$hDŽ$lti$H$;IHHtJHD$Q LƉ\MA9#Et$JAB 9~HD$0H$@D$8MH\$pL$`Mtl$8A;n!H|$`PH$XH H$PHt(L$9L|$0Ht$HI?hH$xdH+%(Ll$0I}HĈ[]A\A]A^A_McIAK\73H=L$H1LHʼnAH 1H$HHD$ 311L$ LLT$H$H9$H;${L\$LL$ H;$ L$PLD$`Mt AxfHsH|$LL$(H$Ht$8Lދ HL$QLHD$[H$pHt$( \$ -LLT$LH$@A LD$HfDnd$ $x$fDn$LDd$@D$fD:"$`fDn$|fDn$fE:"fDT$(fD:"$fD:"$fDd$PfD\$fDl$ 9$$Dt$XL|t$XL}Dd$@1ҾH$P^KHD$(LT$L$PHT$ EHIk8EYEXIL0ID!Ld$8Y H\$PHALQHYHQ Eh0M`8AL|$0A \$8WAD EtHD$PLt$@H\$@H9\$P} D$8{HL$@H$ΉL$X6fLnHD$(IA)D$H+L$1L$XLLD$AML$Dt$DLIML$LE$J<|$XE1LD$hA)E9 LAEHH|$ PH$H$l$(HD$H|$D$hH\$xH$XH D$lH|$l$(D$8 11LL0PHl$1HHD$@zH53L1rMt$H|$(4LL$fo\$HA H$DŽ$$)$xD$l$A9A9L$D$L$D$L$EE$HtCH$LE11H+$VAt$(M_AXLKH$LD$wGDA HEA A tD$|$DL$t8H;$;H$3HC܋$pLMrAWT$L$LMH$PE1HAIHXqD9LA{AA;EC D9/I8A99$\$ED[T$(9(w9h  DHD;L$(| ADL$(AH8A9uҾ L,MH$ B$lD|$hD|$Ld$_Dd$ LJH$ B;\$(}^PDAt$ELKZYtD$LDDD$iL$HcD$u}H$~(BLD|$hLd$DL$IGH$PE1HDŽ$pHD9PEIk8HHz8HAЃOL$AT|H$AL$H$@I}"t$h;sL$hHlHuH}PNT$XHt$xHWNH\$ uH,uL,$H|$pV$|ND$@uHD$DD$D$^,uLS,HD$D$$|$x H$pD$-ADUÍPD9Ut+HT$$H$ $@H|$pM$Dufn$@fn$f:"$$f:"Lfofl)$+HL$$$H$ u@LL$uH}A BuDD9uLD$(+Ht$D$H$ $AS @D$H|$ A9AM‰M~$pH|$f~HHUH]8fּ$H$H$RLD$fo$~$HH$A  fS$H$$HCHL^Hs K,L[0AH|$C(H1Ҿ1b1A‰$J4I$HD$ALHt$FDPDVH\H$XD$hA;mAO|IwI K;]ANdMhA4$Le)It$I|$D$JA~<AAt$L5)D$E9DH|$ LD$D$CB;]!LlMtI}?8LOLcӃOLI)Lu(L$L;$uBuL(L;$u-H$X1bIL$XEXAsApKl1AH$ hH$XHHT$z.H|$|>LD$Ax L1XFD|$(l$L|$A;_AKlEP9UH$PD}DM t$(HOHt3;ws.DT$D;uD;yuDD$D;A u D;IH8LLDDL$xQFLBLt$hMIl$xLl$XA݋$9}1DLl$XLMLt$hLBH} H$-:D[D$AxAIWAȉ$AA9[Wg$H\; ~;C];C>EoE9/T$XH$LmGL$LLl$hAH|$+nDH$+ :LE1|AIOH$B4)I9M_IM9rH|$hFAH$YL$XH$PH|$`H} DLL\DL@HuH$nL@E($+DB ?L$(9L$AMˉL$(*UH|$ D‰F~$p=DAWH AVAUATUSHHHMn Ht$0HT$8"Qu<_@<-@@H<(uω)H{E1HIA(IE $EA)uEDL53 I)蘦H=II~IHHဿ[HD$dH+%(u7H]À+-H=6 H521 37UHAWAVAUATSHHH}udH%(HE1H=8 tkD=8 L5}8 E1LceE9|$1HUdH+%( He[A\A]A^A_]ËEA9FuI6H}L3uAILO 1MIAEt <;uLcHIkHHHHH)H9tHH$H)HYLl$M1IHcHkLA>tkL6MEA tEIMIM)L~MD^A;tt ILHL)F;uIDN ED,7 E1McIkDN MkHN HEH6 DUOdD;}}8Cu(L3Lh3LHcHL9t;A(HAHE1D9-6 LL56 L%x) HH]IA<$A<$ IMc~LHUHuLH1B4;H=4H~A$tsLt @uI~Ly2uMtH53kLa2HL[]A\A]A^A_Ld$&L/H9sHLH)L"2t+I L9w:M<$LL2uLL1uIL$9@uE1Ly1)E1zfUHSRH7HuHH3H@XH[] ff.@AUIHATL%kI UHSH8dH%(HD$(1T$Ld$D$.HVI H+GI H9H=7I HHH(I H;)I HI H I 1LH L@LH LD$=莼L H L9 H LH MZLH AL-H H-H L9KHH L%H HHLH+=wH H!HH+jH H9LFfInfl)[H HD$(dH+%(uH8L[]A\A](0UHSRH=7_ -HH _ [/HHH` -` ` HHH9t08.tHHHH)ډ` Hy` {` X[]H=f.AWAVAUATUSHHt$dH%(H$1H?aHL5jE1B>HHHD$ HD$#H;LLAI`AM&LAAA~Ht-AF>tHt$D HD$ IHuiH|$EFDH i1Ik0Ht9H4$L$AIK4 HV1L13H;LIH2L+뾃xt1‰D$L1It1H;LHH$H<$+D$A;ErH|$'H;LLL 8L1L1L\$H;HHH$H<$L+L\$I MMA{uAuHH|$ Hl$L%JLd$ L$`H$dH+%(uHĘ[]A\A]A^A_F-fDATUHSHH~t1u H1[]A\À{ u$L#ID$I9D$ IL$HQIT$:L#H}*It$ I+t$H9I|$HHID$C fAT1USAąH- Ht&CtH5jH|H|,H- Hz[]A\ff.AWAVAUATUSH8H|$dH%(HD$(1HHHlHHF<%x=@HzL5H|$M@H|$Ht$ HD$ Ht$LLH$(t'I M9tdMnL){@IyA~uIVJL=H5L Hu H8HM1IxE1Ht$H|$HD$ e듺H5(H'tHD$(dH+%(u=H8[]A\A]A^A_H|$x=HD$ /Ht$H|$@ *UH/H[]ff.fATIUHH$H$H$L$L$t@)$)$ )$0)$@)$P)$`)$p)$dH%(H$1Hl$ H5H$H$HT$1HC* HD$$D$0誙1AILHH TH$dH+%(u HĘ]A\q)AUATUSHH(dH%(HD$HG(ILHHHHfHnHfH:")$DL$$Hk(M,H|$ HtH}&0H5Lk0MtI}j&0L5HHH;I&HD$dH+%(uH(H߾0[]A\A]5(ff.fAUHH51ATL%UHSASH.H5m1HHH5j1HuH5H1dH5ZH1S1H5 HB1AHuHcٺ$L-( LH9HFLO$A|AZL[HH ]H5A\A]f.HcAVH8@ AUATUSHkDuYu,1H=,`H@ 1ҾH<H? HlL% HuJ11LH ? D[]A\A]A^11LH=W u1ҾLHLmMuLa$CAMA6@//@.uA1ҾLUA.H=jW 1Ҿ>ff.SHdH%(HD$1H HH;+%H $H9 Hcw? H9H3HNHT$dH+%(uH[%HW H8wHHHH9rfff.fAUATUSH(dH%(HD$1HD$t,TtqHD$HT$dH+%(H([]A\A]H. Ld$L(Hl$HLHH(HD$L9uHLHHT$Ha Ld$LpHl$H LHHHL$L9uV$f.AWAVAUATUSH8H|$HIH^H|$E14HD$ D$HAI$HtxD9xvrDLtMLHIH)HHHH9sHt$HHH|$9rt$H|$DL9sLl$(Lt$ {H|$ t&Ht$(HHA1A9sH8[]A\A]A^A_1HED$ ff.ATL%U1SHHt);ks$1ҾH|<11L0[]A\fHU ff.AUfATUSH(L# H-# dH%(HD$1)$HD$M H# HE1HHuHc-S H-S MbH5`# HHc5|S H=iS HceS IHÃ=Q HHo"LA]1H=HI1IcLH}tLHT$0H5Lr~H|$LUL轄H$LH5HHL$8>~Ht$8HLzLHLwH|$8mH|$0cLD$8. f.AWAVAUATUH-H= L; - H-- EL- H=, II9L- L-, MILH+, M!LH+, H9MFfInfl) , H[]A\A]A^A_{EuI9z L , Hz, L+ s, I H b, H'-dumpdiHL- Ar' 'H?, 'LzL53, L+5$, IHLIL9H=+ LLL%+ L;%+ L%+ L+ A'L + H+ UHAWAVAUATSHhdH%(HEȋHD EH=%B L= L- 1AL53I|LCAHMtA9_wMcIIMHMIM)L9tHH$AL)M^H\$HuLHEHHuH]胼L5 H=dA IvMnfHnfI:")u'1ɺH=  HIFL5 EE1L-D%EK|HLID]DMtE9~w̓=@ =@ HB H5d* H= tBL}E1IL}IOM'A1LHPuI9@1D;uE1E1 HCZYHAINJL =@ XHEE1Lp= IL%L=%:vLH1HHH 3 HuAD;mu+Hο wH= =x 8HEDUH~H5\HMEDHDH11ff.@ATAUS~HÅt0H-B Hud1fHnfH:"B HB H-) Eu[]A\HfHnfH:" ( H( HuH Hmzf.=@ @ UHAWAVAUATSHHdH%(HE1=U@ NH A@ HtwXtpSHH4HHHHH)H9tjHH$LH}111=0 H}@ƉuHEdH+%(HHe[A\A]A^A_]ÁH)HLd$I= LeH=2FHELu1H=U1LPH5XLHE- L- HLIIuIHp}I!AEMLMM)MMADDBS@":wLHLDl IAuM9aL A tHEHL4 Kjff.SHD& H[fAWAVL5AUL-KATIUS1H|$L?ITHcIH :-uXzluRzLRE1LLLL1輺HL9tL| I;\$|HL[]A\A]A^A_HHT$L^ Ht$H=Ht HT$뭐>  H= t=:  SHHH= 诌HHD[fDUH.H5jH H5H H5UH H5MH H5PH tLH54H H5H HL% HHE]-% H]HD% HA]ID$ HA]ID1$ ]ATAIUHH$H$L$L$t@)$)$ )$0)$@)$P)$`)$p)$dH%(H$1H5.xHl$ H$H$HT$HDHD$ $D$0z1HAILeHH=HTff.fAWAVAUATUHSRHHHtH; HuGH}PKH}HEPHH}1L(HEMX[]A\A]A^A_HkSXHH9; tJH{HXHt HCH{Ht HCH{PHt/HksXH{H@H5; <<ÐAWAVAUIHATEUHHLSHx$Lt$H$ML$D$ dH %(HL$h1D!qDLHPST$RLAWD$D$xH HD$hdH+%(uHx[]A\A]A^A_>ff.7f7fu 1u 1҅‰Pu udÐH QH9D$EDX f.AUATUSVHLbHH-H=wHHHc H>Z[]A\A]ff.fAWAVAAUL-LATAUDSLk`HhHT$H$KtH$H$DL$HD$DN0HT$ L$HL$(dH%(HT$X1fA vMtDLEu#HD$XdH+%(Hh[]A\A]A^A_AMk`Kt%NHtuH|$Mk`MAC>@dHD$APLAWjt$0UAVDL$DHL$8Ht$XH|$PH0cAVAUATUSH;wHAԃ{HGPLcAJ Etou-HtW{DH{PB4Lcs`H{XEFMcIk H脼Mk HCXLD(hD`C`[]A\A]A^D!D7fAWAVAUIATIUSH(dH%(HD$1HHHMH-sLt$ LL|$#E$IT$ADDMIHHuHD$dH+%(uH(LLL[]A\A]A^A_2mHATASQHtZ[A\H?6 DH50H=HAUATAAQH?AAXDHDA\A]RfHHHHHHXBHBBBHBBHBH9uH 5 Xff.fUSHQHH{HS H9S(u'HHҽH{HEH2Hk HHCH{(HKH)H{~H{HlHk(HZ[]ff.AVAUATIUSH/HHDmDuAE9t+D]oIkAsuHAHkHi[]A\A]A^À}H1ҾnPHHkIAHRI$I,$D0Dh1Ҿ13P1HHkHI$HI,$UUfHnSflH8dH%(HD$(1)L$D$)$H)HcHT$HH+|$uD$HT$(dH+%(uH8[]bfHwDOHHGLF t=AUATUSHMHLAHAFL []DIA\A]HD_LGHGDșAA)G DDWfSoHHoNыV vOH8C [@AUATUSHQH/HtTM+M9u7Hu>1L#NLIHk8AH{DHHX[]A\A]Å부}UHQNDmHk8IHAH1HD Dh볐@AUATUSHQH/HtVM+M9tX[]A\A]Hu81L#MAʼnLH4AöDHH0뿅봀} HMDmAH4HAHD DhwAWAVAAUATAUSQHlEEx]AAAADHDHHH9Htx}ow*AZD[]A\A]A^A_AMkLchE$$DH DHA A8uDHH DHHAA;A돐f.UH1ҾSHPKHHuBHJHtZ[]fH)HuGNH)Hu@@D?@SHH?HtuH[ff.E1 AuDfQHc~6T7Hу t tLcBTу  tZÅuZff.G 9uÃUSSHu$Mk H5HcX[]HHw0H:HL LcSL(I)K4}C؋AYH[H]Hs(HH;AZ[]HHs H8A[[]LHsI8AX[]HHsH:Y[]ff.UHSHHHT$`HL$hLD$pLL$xt@)$)$)$)$)$)$)$)$dH%(HD$H1HT$PH$ D$0HT$@D$40HD$8Ht$0HH$Ht$HL$|HҢHD$HdH+%(u H[]fATADUSHH9\$(8u1H]L9$$u 9\$HT$HdH+%(u HP[]A\1ff.fnf:"f9Ã9ZÐATAIUHH$H$L$L$t@)$)$ )$0)$@)$P)$`)$p)$dH%(H$1Hl$ H5dH$H$HT$HD҃ HD$$D$0f1AILHUkHmH$dH+%(u HĘ]A\@H1H@9P~9tw;t w 1Hff.UHSQyHkH_hHt?HLHAHIHƉ]uIAE+CT9Z[]7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f  uMUSHHH% 8u 1u.H[]fD1Ét9u +u/E11H޿11tÐH1[]Ãtuf.fHu 8tf1u@H1H% 8tfuÐH1H HHfUHH]5DH HHf.HSHEHHHt[HHf.H] HH fUHH]DAWAVAAUIATIUSLH(LIt$HL$`HT$hI9t@EHA*tmLHT$HL$LL$D$"D$LL$HL$HT$u:HDrML1H9DBH(1[]A\A]A^A_H9t;H}ILHHT$hDHL$`LH@8H([]A\A]A^A_f.IqI9t.A*tLHT$HL$L $kL $HL$HT$uDr hI^BRf.UHSHH(I9tH{HHH@@H([]DHHqH9t,?*tLD$HL$HT$HT$HL$LD$uH([]f.AUIATIUHSHHu%H{LLHHH@0H[]A\A]DH[]A\A]f.f.1f1fUHH]DHHvH9t1?*tHHf.DUHAUATIHHHHPHXL`Lht#)p)M)U)])e)m)u)}dH%(H81LHHHHH%H)HH9tHH$H9uH)HumLl$HELDž IH H(H@LH0Dž$0 LIQLH&鳌HLI鵌f.UIHATSHH)HĀfodH%(HE1HEH/): )pfoHEH)EfozHH%H)H)Efon)Efor)Efov)EH9tHH$H9uH)HutHEfoUHLLd$fo]foeIfomfoufopID$`I|$hA)T$A) $A)\$ A)d$0A)l$@A)t$PADhL蠉HLf.@UHHAUATISHHdH%(HEHH9tHH$H9uH HL$L IL\$IMSLאHHIHHH4HH)AHHH wI)MI9w/M)LLIsDHUdH+%(uHe[A\A]]ø,f.fAVIAUATLd7USAL9(HIH#DEHHtsL9<%uC @ATIUH- HHID$L% H5 H9HBHHMu 4HrMt*I $LMd$H9wHH)Hw*H LHLbH5HL]A\fH LaHH9Hf.H=u Ht HH\ Hf.DUHHHt4HxHLHH@xH)1HL]HHu! H HǀH9vH H9sHgHf f.HpHt3IIxL1IHI@hH)pHLHÿp IHu f.DH% H9v H! H9sHHfD[f.f.He HHfH@H@UHH]eDUHH]EDf.UHH]Df.UHH]Df.'f.ATIHUHSHHdH%(HD$HH$HPt H$HH$I$HHLP tH$HHT$dH+%(u H[]A\@IIH@PtI< *HHcH>HHFHtpLDL@x I@HBHHHIDHIfHFHFHcHFHHFzH11fDHMAIL ExEfDH11ɐDHMAIL Ex?A@IIL f.@HDG(dH%(HD$1AD<tkvAHH<uJHwHWHD_H$HT$dH+%(uGHfDu=HH<tkH6H1Ff.AUHATUHSHHLoHT$Ld$I@11@AUIHЃHH ƄxHt%HLHH tH[]A\A]H1[]A\A]f.@tMHp0tKw u?a@u#`fDs~`k~ Pu1`G~fDAU1ATIUHSHHHt`HA<$Ml$@u~HCAEIu1C(@HD$`H9wL9$2D$ to@L|$xHunMtDl$ AuaHt$HT$pH$H$HH$wH$HCH|$w>DH$LD8M4MxD$ D$0H|$ H \$ Hl$8MIL|$ LE11UHHЃHI DŽx?w@tHHI HE11D2HHHI @x?w@tHHI MthmT$0D$ t ML11HH$@2HHHH @xHtJMNl5DH|$(LHHtMtHT$PLtMHl$8ML|$ D$ &D$0u H|$OEVHT$PH|$(LL[D$ MHl$8ML|$ @L|$ Hl$8;H* (D$ D$ NH|$=fDH$HC tHCHD$PH@\HwAVAUATUSHH@dH%(HD$81x)HCH{LkkHD$LcHPwf.DPXHwHwHHtH HfH)H} HÐPXHHfPXHf.DHHtH HfHH HÐPXHHfUw(nuHFHn HtHH]@]H~DSHGHwHWtHCHCH++CCUNGHCHHCHC[AUIATIUH)LLH@Hh`H4YHl'U(H8@Ht2HԼHOPHHv HHoPH@`H'3H_(HtHWpf.fHH ÐH @ATUSHdH%(HD$1=  +(HHh1HL$}*D$11HHi$0H H=IIH T$H3t;HH H=D$.u!ufLfDHA -H=HtH H=|H[fDHGH?ATUSH7HGH9HHH9wWH~HXH]IL@@HtHt}LHuHIL;%l ~[L]A\fDHH9HBHS9HvCH9s>HH?H)H9HGH{ffEAD$HHEmI$ADsH=oDH UHHHHGHxH;= u H]@Hy :tPJH׺P@UHH]f.H HHifUHH]f.H HH)fUHH]Jf.Hu HHfUHH] f.H UHHHHGHxH;=c u H]H9 :tPJH׺P@UHH]f.H HHifUHH]Jf.H HH)fUHH] f.Hm HHfUHH]f.HU HHfUHH]f.ATUHHHk HHHPHxxH;=׿ u%HEH]A\Ð1HEH]A\DH :t @fDHHIpf.SHcH HH[SHCH HH[SH#H HH[SHH HH[ATUHHH# HHHPHxxH;=Ǿ u%HEH]A\Ð1HEH]A\DH :t @fDHHIof.SHcH HH[SHCHķ HH[SH#H̷ HH[H?SH9wtHH9vHH6H9HBHC9H=vGH9sB%HH)H?H9HGH{ fDHHX@[HHyhH=bjUSHHLGH7HLUHHL@HtHt(LHsdHIH;-/ u HL[]CH;- EHtELHUDH[]f.ATH)IUH1SHHL@Ht,LHLH; Iu#[L]A\f.A$H; CtCLH+D+[]A\H97tSSHVHH~HFx$H H9uxHHzH9u,H3H[1HH DH 8t$BHJHt$]Ht$fDB@H 9t Fsgf.DH;= ufHi 8tGPWfG@Hų SHHHHFPHxxH;=, uHC[@1HC[H :t @fDHHfDATHvIHjLA\@H5 HHHFHGHo HHFfDHWHJyBHNyyAHHHVf.fH SHHHHFPHxxH;=, uHC[@1HC[H :t @fDHHfDATHvIHjLA\@H HHHFHGHo HHFfDHWHJyBHNyyAHHHVf.fATIUHH HHHtGHH4HtH9tH2ID$H]A\DH HID$H]A\H=dHiSHsHd HH[SHSHl HH[SH3Ht HH[SHH| HH[ATIUHH HHHtGHH4HtH9tH2ID$H]A\DH HID$H]A\H=cHiSHsH, HH[SHSH4 HH[SH3H< HH[H6HVLH% HHf.SHHPHxxH;=+ uH[@1H[@H :t @fDHHfDSHHHH9tHt H[fDH HH[H=bf.fSHHPHxxH;={ uH[@1H[@HA :t @fDHHfDATH6ILA\fHHxH;= uH :tPJHZf.P@HHH HHHHJyBHyyAHHATIHdH%(HD$1HHPH4$LHVJH$HxH;=3 u!HD$dH+%(uEHLA\H :tPJHjP?I fAUIATAUHSH^HIJ<#suI|$IT$@HXHHPHHLpI]H[]A\A]HeD7'HH=|HHPf.HGHGAUIH5ATIUH dH%(HD$1HHKHLLHLLHHD$dH+%(u H ]A\A]IdfAUIH5"ATIUH dH%(HD$1HHHL+LLIHLLHRHD$dH+%(u H ]A\A]#I_dHHHgUHH]*f.HcHHAUIH5"ATIUH dH%(HD$1HH;HL+LHLL%HHD$dH+%(u H ]A\A].IzcfAUIH5ATIUH dH%(HD$1HHHL蛾L3LIhHLLHBHD$dH+%(u H ]A\A]蓾IbHHHUHH]隻f.AUIH5ATIUH dH%(HD$1HHHL軽LHLLHHD$dH+%(u H ]A\A]辽I*bfAUIH5"ATIUH dH%(HD$1HH[HL+LLIHLLHHD$dH+%(u H ]A\A]#IaHHHgUHH]*f.AUIH5BATIUH dH%(HD$1HHHLKL#HLLEH}HD$dH+%(u H ]A\A]NI`fAUIH5ATIUH dH%(HD$1HH HL軻LSLIHLLHHD$dH+%(u H ]A\A]賻IO`H3HHUHH]麸f.AUIH5ATIUH dH%(HD$1HHKHLۺLHLLHMHD$dH+%(u H ]A\A]޺I_fAUIH5BATIUH dH%(HD$1HHHLKLLIHLL:HHD$dH+%(u H ]A\A]CI^HHHUHH]Jf.AUIH5bATIUH dH%(HD$1HHHLkLSHLLeH]HD$dH+%(u H ]A\A]nI:^fAUIH5ATIUH dH%(HD$1HHkHL۸LsLIHLLHHD$dH+%(u H ]A\A]ӸI]HcHHUHH]ڵf.H#HHAUIH5ATIUH dH%(HD$1HHHL۷LHLLHMHD$dH+%(u H ]A\A]޷I\fAUIH5BATIUH dH%(HD$1HH[HLKLLI(HLL:HHD$dH+%(u H ]A\A]CI?\HHHUHH]Jf.AUIH5bATIUH dH%(HD$1HHHLkLSHLLeHHD$dH+%(u H ]A\A]nIz[fAUIH5ATIUH dH%(HD$1HH HL۵LsLIHLLHHD$dH+%(u H ]A\A]ӵIZHcHHUHH]ڲf.AUIH5ATIUH dH%(HD$1HHKHLLHLLHHD$dH+%(u H ]A\A]I*ZfAUIH5bATIUH dH%(HD$1HHHLkLLIHHLLZHRHD$dH+%(u H ]A\A]cIYHHHUHH]jf.PX1IHHщHH=ͮ8HH7HDHH@HHH@@HHHHJH9rRH=H1H?HHH+pH9rPHRfHH@H)H9HGf.HAH9w H@H9ADf.DHtHu鋴fHtHufIHtHuDL}DDH)HtHuDf.H)HtHuDf.H)HtHuD鳳f.H)HtHuD郳f.H)HHMf.H @H HHf.HHH HHHHH HHHHH@@HHHRHf.@HHHfHHH@@HHHRHf.@HHHfHH@@HH@@H?ÐHH@@HHxHH9pr HHH TH^H=DHHPH9sHPH=$1 f.HHxtÐHH 9H>VH=bmf.HHBHtHDf.HH HlH=f.IHATII1LfL9w8I)I9LGMtHItL襰LA\LA\LLH5L1H=fHPy@HJyBHHATILA\f.fATILA\f.fHHHAWAVAUATUSHL/IEHIH9vsIILI|H)HL$I9wYL)HHtID>IDHHt+LLHtOHD$H{H)I9wHHuIHL[]A\A]A^A_DH9ILCL)IH6HNAUIATIHUH親LHL]HA\A]ATISHHHCH9s H)H<@H/HH)HLEHL[A\AUATIUSHL/IEH9w>H)HHH9HFIHt&K|%HH觬tID$MtIHuHL[]A\A]IH6HNpAUIATIHUH薩LHL]HA\A]@HHHyHtHHH9HF@84tHsf.HtcAVAUATIUHSL/HMuDAtHLצHu"HI9w[H]A\A]A^fH[]A\A]A^Hf.fH6HNpAUIATIHUH薨LHL]HA\A]@@AUATUSHL/MeMtNHHtFIHI9LG fDIrCt%HHHtHL[]A\A]fDHI[L]A\A]H6HNpAUIATIHUHƧLHL]HA\A]@@#AVAUATUSL/MuL9sHIHHHu'HL9t'AtHL&HuH[]A\A]A^D[H]A\A]A^H6HNAUIATIHUHLHL]HA\A]PHHHH9rfDHH9t@84tHDHAUATIUSHL/IEHt5HHHH9HFIHtCt%HH5HtIsHL[]A\A]f.fH6HNAUIATIHUHLHL]HA\A]PHHHyHt%HHH9HFfHr@84tUSHH?H6H_HnHH9HFHt Du H)HHMH[]fUSHH?H_H9wVH)LH9HGIhHH9HFHtHLϧu H)HHMH[]HHH51H=^艹fUISHH?H_H9weH1HnI9wtL)H9HGL)L9IGHH9HFHtLL-u H)HHMH[]HHH5D1H=HLH5)1H≠f.fAUATIUSHL/HI]HH9HHFHtLL胦u H)HHMH[]A\A]@AVAUATIUSL7I^H9w`H)HIH9HGpH9HHHFHtK<&Lu H)HHM[]A\A]A^HHH51H=躷f.UISHH?H_H9wRH)LH9HGLL9HFHtLHpu H)HHMH[]HHH51H=*f.H% @GDGG@G@H;= ufGH7D7HGH?SH9wzHH9vDH6H9HBHC9H=vMH9vH%HH)H?H9HGH{fHHX@[f.HHyhAH=i8CfDHuH L@LATU1SH0IL@Ht#L@HdIL;% u[L]A\@hf.AD$I$ADf.SHH11\H[SHHH:H[D@#׽H;=M ufH) 8tGPWfG@HdH%(HD$HHxH;= uHD$dH+%(u>HDH :tPJHHt$MPUSHHdH%(HD$H@H~8H-1 HxH9uPHEHHD$dH+%(umH[]f.HPH;- t@H@H :tPJHHt$P?f.DAWHIAVI)AUIH 0ATUHSHH(dH%(HT$HLbHrMI)I9wRHHpLt$LH $LnHH $IL@t1H3L@H LHHL$H$IHL$L $IMuHHH- HxH9LI9HD$dH+%(=H([]A\A]A^A_fH J|-HLILLD$L $ǡLD$L $@LMt%I9t II4K<(ILLH-$ MHI9bA@MxC8Ef.AAMKfDH :tLPJHLLD$L $jLD$L $@H-~ LMHPf.DHHPH;v t5HH=Ү1H5"@H+7@IHILHLH)L9IGL9wHUPLH5Ӷ1H=q蜧f.fAUIATIUHHƒLLHH]A\A]HHJHHpHtH1ɺHH yHH=f.H;== u HGfDH 8t GfDGfUISHHHwH?HLHHL@HtHt)LHsHIH;- u!HL[]@CH;- EHtELHUDH[]USHH(H?dH%(HD$1HGH9w W~0H;HHl$HHH+H#HHzH;= u#HHD$dH+%(uLH([]fH م 9t$JqrHHD$jHD$Jf.DAUATIUSHHLhMtHHHHhLH;hvHHLI<$H3HItTL|I$HPH;E u#HL[]A\A]D@@Hh(fGAVAUIATUSHL`L9I)II9LGMtPHHHhLH;hw@~ HLI>L+HIt*LL蟓IHPH;i u[L]A\A]A^AE@Hh(LH5H=1ףAUATIUSHHtvHIH?HXH)I9HLH;XH9w HPHH9vIHL>I<$HItOLHŒI$HPH; uTHL[]A\A]fDLHH)I<$HHIuEf@~Hg@HXH=ڲ0ATIHUHHHHL]HA\fATIHUHH跍HHL]HA\fAUATIUSHHtdHIH?HAH)H9wuH,H;iwA~ HLI<$HIt2L藊I$HPH; uHL[]A\A]@@Hh(H=.f.H?HH@H9w)H9wrfDH)1HH)PH=\r.1DAUATUSHHHLhMeL;`w@~ LHHHP@,HHPH;) uH[]A\A]@@L`BD(H[]A\A]@AUATIUSHHLhImH;hw@~ HLJI$HPI$HPH; uHL[]A\A]@HhBD(HL[]A\A]ÐUSHH(H?dH%(HD$1HGH9Gr G~)H;Hl$H1H)HHzH;=# u!HHD$dH+%(ueH([]H  9t$JqrHHD$rHD$JHt&qHD$dH+%(t$ HHKH H([]HeDHHf.@GxH;=6 uHG1fH~ 8t GfDGŐSHHdH%(HD$HPHxx(H;=~ u/HHD$dH+%(u>H[fDHt$1fHy~ :t @fDHHًfISHHIPHxxH;=E~ uH[fD1)H[@H ~ :t @fDHHf.@ATISHHdH%(HD$1H9t0CH{HSxCH H9I$HzH9u>I$HD$dH+%(HL[A\Ht$1lHH2 HI} 8tBHJHt$B@H } 9t Ch\rfH7AVAUIATIHUHHdH%(HD$111HT$I_LI$HEHpLLLLjHLHD$dH+%(uHL]A\A]A^軉HL,H4@ATI1UHS1HdH%(HD$1HT$LI$HEHpHvӾLFHL+HD$dH+%(u HL[]A\HLHATIUHHdH%(HD$HPHxx3H;=d{ u:I$HLHD$dH+%(u=HL]A\Ht$1$fH { :t @fDHHiHLHfH9tGATUHSH1H)HIL@Ht3LHHՉIL;%z u)[L]A\ÐHY L@LÐEAD$DAD$I$ADf.SHHHHZH[DH9tgATUHSH|H1H)H'IL@Ht*LHHIL;%y u0[L]A\EAD$DH L@LÐAD$I$ADH=̟y%f.DSHH>LGJ4L9wHH-H[LH5:H=ן1SHIHH>dH%(HD$1HOHH)L9IGHHH9w)LD$HLHHD$dH+%(uH[H5H=[膘1ATHL@L9wIfLA\LH5H=1HSHH>IHOHH)L9IGHHH9wHLH[H5+H=Ȟ1SHHHHH[DH9tgATUHSH|H1H)HIL@Ht*LHHIL;%w u0[L]A\EAD$DHi L@LÐAD$I$ADH=Y#f.DSHHH4H9H[@AVAUATUHSH0H7dH%(HD$(1LNL9H?MI)I9LGL)LI9rIH9v/HD$(dH+%(QH0LHL[]A\A]A^IL9wɋFHJ4H(H9JT%HH9rpH)LHL)LHLLLD$I}LD$I]HHIMtLdHD$(dH+%(H0L[]A\A]A^Lt$HLD$LLD$LHHLHD$ HH{H;=u ItHu 8t;CPSLLsHH)!DRCH=l["LHH5ZH=HH|$ /H7H LAH MLYMM)M9MGM9wLPLLH5H=s1蜔f.fAVIAUIATIUHHHHLLLHI]A\A]A^Nf.@H)H+71H H)H+7LAf.AUIATIHUHSHH>HLLH)I+$HIH[]A\A]fH)I)H+7f.@H)I)H+7f.@H)I)H+7nf.@H)I)H+7Nf.@H)H+71ATIUHHSHHt H[~HtLH+H[]A\SHHH4H H[@SHHHHH[DHH9fHH9fH6HVpH6HV`HddH%(HD$1Ht$ t%BtD$HT$dH+%(uHH= DHdH%(HD$1D$HcHL$st"sD$HT$dH+%(uHHt1H=$=f.AUIHATIUSHH|HH9HHFHtLLHu H)HHMH[]A\A]fATIUHSHHt H~L)Hwuf.DHdH%(HD$1D$HL$cs t"sD$HT$dH+%(uH1}f.AUHtATUHSHHHGGL&LnLL t,HLL E1L%V1uDA1L1~E)HEHEH[]A\A]GenutAuthƒt1tH@HHDHEHLL.tZHüLLtDHLL4HyLLH=q\@E11Genut Auth@HHEH=^fATHIUHSH0HHvdH%(HD$(1H8t 0 wYHHrH\$HrHH$zHLH<$H9t1HD$(dH+%(u4H0[]A\HD$(dH+%(uH0HL[]A\MzH$ f.fATHUHSH0dH%(HD$(1IH\$LH$LHH<$H9t聕HD$(dH+%(u H0[]A\SzHH?t&SHZuCH[f.f.DATIUSHdH%(HD$HGHt"HT$dH+%(u}H?H[]A\DHl$fDA|$HHv~,HHH)uD$HT$dH+%(u)H[]A\Du >y8tH=RHy7HdH%(HD$1H?tBx;1HT$R:tx&D$x f* fHD$dH+%(uHxfHGHGHGATUSHHHnH;L&LHtMtqHw4HtHuEHk/[]A\@A$HkC/[]A\HH>u:H}HkHHHLyH;Hk/[]A\H=gH=cHATIUHHHSHH}tHtsHw4HtHuFH][]A\@A$H]E[]A\HH>uu:H}讅HkHHHLYxH;Hk/[]A\H=H=ATILA\f.fLHI9tLHf.DHGHHHFH9t)HHVHWHVHHFHWFfDoFGDATISHHCHH6H?H9tpIL$HSH9tBI4$IL$IT$HSIT$Ht8H;HKHCLH[A\fI4$IT$HSIT$HHfDL9t;HSHtHtvHSI<$IT$H;뒐CHSI<$HyH7HwHHGHGHwHHw0HGH;ÐH?t@USHHHt$Hw6H?HHtHtE@H)oHD$H;HCH[]fHt$1DHHHD$HC@/HD$H;HCH[]fDd@HHHOHH9wVH=HH1ʅf.H?HH+wH9rPHf.fHGH)H9HGf.HAH9w HGH9ADf.DIHtHuDLmDDH)HtHuDctf.H)HtHuD3tf.H)HtHuDtf.H)HtHuDsf.H)HHMf.AVAUATUSHdH%(HD$1H9t2L/LwLfHHM9HWL9rXMu3LcCD%HD$dH+%(H[]A\A]A^HuIt^LLrL+fDHHL$$aH;II9t!H$L+HCMzafDAEL+Vp@UHHSHHHGII)t&Ht!HH?IHIt*LLoHCHH)HCH[]fDHCDHGHGHGHGHGHGHGHf.HGHHHFH9t)HHVHWHVHHFHWFfDoFGDHGHNHHHFH9t%HHVHOHWHHFFfDoFHOHFGFfDLHI9tLHf.DATIBLA\f.fHHHHG@HHG@HHVHHf.@HHVHHf.@HHHfHHHfHHHG@HHVHHf.@HHHfHGHGH?ÐHGH9t HGfDfAWAVAUATUSHLcHH?I9tGHkHCHwQHEHtSkL#H[]A\A]A^A_fH9vIIL&|L;IMtLLHnM9tLL+HkH[]A\A]A^A_f.HHsIHHSHLILLH)I)уK1҉уM L9r0C%D! STATTfATHHHu 'X[]A\A]A^A_HHf.@H3Hf.@HHGf.HH;wwHHHH HH=ZeDH;wwHHHH H>#H=%DHWH9sHHPH=t1]}f.HWH9sHHPH=D1-}f.HtHÐHH YH^[H=荶f.HtHÐHH H>fH=BMf.HGHtHHDf.HH ɅH&qH=f.HGHtHHDf.HH yH|H=譵f.AUHWATIUSHH_HLkH9tIHWI9w @,I$Ml$DHL[]A\A]A11HLKI$DfAUHWATAUSHHHoHLmH9tHHWI9wD$(HLkD(H[]A\A]@A11HHHfDfATILA\f.fATISHHCHH6H?H9tpIL$HSH9tBI4$IL$IT$HSIT$Ht8H;HKHCLH[A\fI4$IT$HSIT$HHfDL9t;HSHtHtiHSI<$IT$H;뒐CHSI<$HyHHOH9wOHHt6Hu H@H)H|$H9HFHD$Hf.HHw2HHH=f1H5yUHSHHH+H@HEHH[]fUHSHHHH)HOH9t!H)HHH[H]fHoHH[H]f.fHHwHtHH@H Hʒ^H=>IfH?AVAUIHATUSHOH)I9ILH?IH)ID$DHH9ID$H9rgJ2H)t%L9t LH4LHHeI<$MtLIt[@L`I<$I\$L[]A\A]A^fDLM1LI<$MtDjfD@/I<$I<$MtyH=HHwD1f.AHWH1EDHOH9w H1PHH=}1H5: wf.fUDHSH1HH+H:HEHH[]f.fLOILH)L9IGL9w EPHLH5ʅH=U}1~vf.@H)EH+7f.ATHWIDƹ1LA\f.UDHHSH1HH+H\HEHH[]f.@LOI9rv HHw0DHDL1L) f.f1DLNMI)I9LGHL9wHHW1EPLH51H=!|Luf.fIHWH1 f.IHWH1f.LOILH)L9IGL9wPHLH5H={1tfATIHWIH1LA\ATIUHHH_HUHLHI]1A\Lf.fIHOH9w H1&PHH= {1H5p-tf.HOLBL H9w L1PHH=z1H5,sfLALIHOHH)L9IGH9wLPHH=yz1H5ނsf.AUIATIHUH^IL$H9wLHL]IA\1A]4HH5H=z1HHuHHtHtM[뮐O(;O,}8HcHHG H@O(Ht~H@HpP1ff.fHOHH[HuH[]H[f.lfHsH4kHsH_4H[]ÐHs>u˃\ff.ffD?/utHHu1HGff.AUIATIUSHHHBHjRHDH9wH@Ht8/tf1[]A\A]A^D5wLHLu݃tHsL|HuH[Hu@I HtDHKH@H@xHuxH@Hx8/tnfDAdž0Z1ff.fHGI8TudHPHWP_t[ntNHcxAIS:_u8HISAS(A;S,}&HcƒHIC H@AS(HHÐ1DHP1AUH5<ATUHSH8dH%(HD$(1HHBHAHtrHL,(DHHHHDd DL9t=D#HuHƅHH@1HD$(dH+%(u H8[]A\A]`CI1~lIsIKHcH)H9|mHICACt8$tJ ~5H_GLOBAL_H9u&F$<;wHHr ~ Nt-DL(IC@HIC 1@ACH)AS(ACHA;S,}HcH wwHIC AS(H@HH@ff.fATUSHW:SukHBHHGBuh1C@utHSCFH tHD 8H8H9u@E1L[]A\DHBHGBPЀ wT<_tXH1Ҁ w5fD ҍL9wHStHBHC<_tCʍHЀ vэHw ҍL<_A19K8uHC0[]L$LA\DLB(C(s,Mt7DJ09HcȃHHK HAC(LADIHK@HJR SH9LcILc ID$C(A$IL$AT$HC8BHk@HHHC@LMHHIHC8BtHk@M|C8;C<pHS0HcȃL$ʉC8]HJRKE1z1)P[fDAWAVAUATUSHHHwdH%(HD$1HsDH H=HHt]aH! HHHЋS(;S,7LcHILc ID$S(ID$@A$'CHHs DfDE1HD$dH+%( HL[]A\A]A^A_H1H IHtHCH߀8Ft_I$HtQwH $HPHHI$H$I$L$$MrC8;C<fHS0HcȃL$ʉC8S fH(H$IĐM'C8;C<HS0HcȃL$L$$C8HHHs1ɾ"HH^H$IDHHHs1ɾ$HH.H$IrfHHkH$IĀ}ISCPMoC8;C<cHS0HcȃL$1ɉC8EPwHHHkHLHH$IDF0HHHs1ɾ&HHH$If.HH$I@HHHs1ɾ#HH6H$Izf.HHHs1ɾ%HHH$IBfLFLCF<_|0< LfDHHHC0 v)HLIHLCA<_ IHLCL*HHfH$If.HHHsIHHHHL+HH$ITkLCLHbkL1ɾDHHH$IHMHC8@HPHS8E/C(;C,LcILc ID$C(A$,FL$$0< fAD$wHHID$HHkHSt HBHCLcC(IHQLc I$AD$ID$AD$C(;C,LcILc ID$C(H A$'ID$CHC(;C,LcILc ID$C(H A$'ID$CH ~_PC(;C,fLcHILc ID$C(A$CHID$HC8_(HHHCL-HHH$IC(;C,LcILc ID$C(H A$'ID$CH C(;C,eLcILc ID$C(H A$'ID$CHvC(;C,hLcILc ID$C(H A$'ID$CH 3C(;C,LcILc ID$C(H A$'ID$CHC(;C,LcILc ID$C(H  A$'ID$CHH1ɾLHHH$ITC(;C,=LcILc ID$C(H A$'ID$CHDHHHs1ɾ(HHH$IfHH$IH8f.E1HHHC( LHH5IkLCLHkLIHsHEHD{(Ds8HCDkH HS:ItHkD{(Ds8DkHMDS8;S<8HK0HcL$S8HkLCLHHs kLIH5ff.@USHHOdH%(HD$1H$<.t:FCHCH ȀCqDtE1@HE1}HzC(H{;C,LcILc ID$C(HI$AD$AL$It$JH뛹딹덹놉E1@HBHGJlSHHWHSI H'EHBHCB<_@HCNHfDHBHCRZ$E1S)HLDHIHC)fHIHC HHs1HWfLXHM<IUI HЀSfDH€Et-@t'Mt*AE8A;E<} IM0HcL$AE8vE1[L]A\A]A^ÐLhHMIEILHMIUIMtHBIEZHfMtHLIUHLLIUI HЀSCBLD.DATUHSOHAGHHGT0GHHPHWx6HPHWPT*Vr HU:LJLM:_DPE1A<$AA@@L(Dž0H$dH+%(:H[]A\A]A^A_DH(1HD$HL$H(H Ld$D$ HD$(H;H=D\$ E(HD$H(EfH ZH(IT$HHDxEuHH qX/A9W/HHuIT$H(Ld$D$ HD$HD$H(H HD$(X<|$ .HD$H(IT$D8IEu E14H(Hσ#J(A9A($5HD$H|$H(H Ld$D$ HD$(IT$Ht ;I|$ LIl.HCA,L{4fLIHLDtDI9'D3IuƅHHAH@1fDIT$:H5AHjMt$A>H.H$dH+%($:HLH[]A\A]A^A_:IT$:')HBX"'c1HH=0HHHHD(ƅ(C:HH=0HPHD)ƅ)A<$>0X0H$dH+%(8IT$HH[]A\A]A^A_9IT$9H$dH+%(?9IT$HH[]A\A]A^A_9fA|$,IT$HiH9Bt7HV9HH=4HPHD ƅ fA|$?&H$dH+%(Y8HHH53A[]A\A]A^A_hLl$0Ld$8L(H L(LLt$0HD$HLD$@MuU$fDHEu=oڃH)D0oHHL0ILH()L@@HHtHPvIT$H28DD$@L(E$CHHIIUHI 8Z$H ?HAtLs.HHHDlDI9!D+HH=uHƅHH@1H>HAtLs 1fDHHHDlDI9 D+HH=uHƅHH@1H=HAcLs1fDHHHDlDL9 !D+HH=uHƅHH@1Hn=HAVLs1fDHHHDlDI9D+HH=uHƅHH@1H=HAvLs 1fDHHHDlDI9D+HH=uHƅHH@1HH=)HPHD~ƅ~H$dH+%(z4IT$HH[]A\A]A^A_4H$dH+%(3IT$H[]A\A]A^A_4IT$H=A Ls4H/@HHHDlDI9D+HH=uHƅHH@1Md$M!H$dH+%(P3HH5<[]A\A]A^A_vH;HATLs/@HHHDlDI9D+HH=uHƅHH@1H4;HATLs1fDHHHDlDI9D+HH=uHƅHH@1H:HAgLs1fDHHHDlDL9?D+HH=uHƅHH@1H:HAjLs1fDHHHDlDI9LD+HH=uHƅHH@1Hu9HAcLs1fDHHHDlDI9D+HH=uHƅHH@1H8HAvLs1fDHHHDlDI9D+HH=uHƅHH@1H_8HAnLs1fDHHHDlDI9D+HH=uHƅHH@1H7HAtLs1fDHHHDlDI9D+HH=uHƅHH@1IT$H(Ht[HD$HD$H(H Ld$HD$(D$ /HD$DT$ H(E H"HH="HPHD>ƅ>L(Hp8Mcl$I\$M%HI.HHHHDdDI9D#H=uHƅHH@1HK4HAhLs1fDHHHDlDI9nD+HH=uHƅHH@1He4HAgLs1fDHHHDlDL9D+HH=uHƅHH@1ID$89IT$HBHxcd#LHtHvLH L^ID$82 (H@L5>3LH8ML$u IA8p(IQHYFMl$H5IEL8L~'LLk(ID$HHP FID$82H@xH@8>H$dH+%()HH)[]A\A]A^A_鯴Ml$Md$AE214((~IUH))H`H$dH+%((HLH[]A\A]A^A_(EIT$i)HH=HPHD(ƅ(IT$H-)HH=HPHD)ƅ)hH$AT$1H5HHXH9HL,)fHHHHDdDI9D#HuHƅHH@1HA\$H=[HPH\HF0HAtLs.HHHDlDI9#D+HH=uHƅHH@1ID$8;H@8<LDLHHID$M|$H5/LhH@LpL`IGH8+%LHBLH;HLBH5e/HtH$dH+%(&HLH[]A\A]A^A_lB@H//HAjLs 1fDHHHDlDL9D+HH=uHƅHH@1H.HAoLs1fDHHHDlDI9>D+HH=uHƅHH@1H.HAoLs1fDHHHDlDI9!D+HH=uHƅHH@1Ml$Hz-HAoL{Mce0DHHHDtDI9 D3HH=uHƅHH@1IT$Md$Ht $HH=%HPHLHD{ƅ{]$HH=HPHD}ƅ}H$dH+%(c#IT$H[]A\A]A^A_7H},HAdLs 0DHHHDlDI9%D+HH=uHƅHH@1M|$E1L舯HuVfDE8/~HxsH@Et$HuHx+f.AE9}D<LH"E9~HH 3+A,(HHHHDDDH9tDH=uDD$HHH $ƅH@H $1DD$H*HAnLs2HHHDlDL9 D+HH=uHƅHH@1IT$H(A[Ls!H2HHHHDlDI9D+H=uHƅHH@1I\$L(HLJ(HLl$0H 11I4LHIDz@ HXqHx5I H(IT$H ;u HD$H ES A_HLCtDHCI9/ HËCuHH=$HPHHSHD ƅ !H,)HA{Ls5f.HHHDlDI9 D+HH=uHƅHH@1H(HAgLs1fDHHHDlDI9 D+HH=uHƅHH@1H4(HA{Ls 1fDHHHDlDI9D+HH=uHƅHH@1ID$LchHM%HI.HHHHDdDI9D#H=uHƅHH@1Mcl$I\$MHI0fHHHHDdDI9cD#H=uHƅHH@1IT$HHH= HPHD]ƅ]H$dH+%(zIT$HH[]A\A]A^A_EH$dH+%(EIT$HH[]A\A]A^A_ H$dH+%(IT$HH[]A\A]A^A_H$dH+%(IT$HH[]A\A]A^A_H$dH+%(=IT$HH[]A\A]A^A_]H$dH+%(IT$HH[]A\A]A^A_#H$dH+%(IT$HH[]A\A]A^A_H$dH+%({IT$HH[]A\A]A^A_IT$HH"LsA H*HHHHDlDI9t9D+H=uHƅHH@1H$dH+%(IT$HH[]A\A]A^A_H$dH+%(IT$HH[]A\A]A^A_H$dH+%(eIT$HH[]A\A]A^A_vH$dH+%( IT$HH[]A\A]A^A_<H$dH+%(IT$HH[]A\A]A^A_8IT$HH"A)Ls8H/HHHHDlDI9t9D+H=uHƅHH@1AT$H$H51H߃3HHHtoL,,fHHHHDdDI9t=D#HuHƅHH@1HHBHD}ƅ}H$dH+%(3IT$HH[]A\A]A^A_]IT$H$H51H߃,HHHdL,-fDHHHHDdDI91D#HuHƅHH@1HpHtH HD$HT$HT$H IT$: HsHpHD$H H$dH+%(IT$HH[]A\A]A^A_H$dH+%(IT$HH[]A\A]A^A_I] Q" Ml$B|# MEMHI0fHHHHDdDI9D#H=uHƅHH@1H$dH+%(IT$HH[]A\A]A^A_H$dH+%(IT$HH[]A\A]A^A_H$dH+%(mIT$HH[]A\A]A^A_IT$HHLsA-oH-fDHHHHDlDI9t9D+H=uHƅHH@1H$dH+%(CIT$HH[]A\A]A^A_H$dH+%(IT$HH[]A\A]A^A_IT$LH$dH+%(;IT$HH[]A\A]A^A_LLH&IT$HH@H9@{L9nIL^H[HJH A1LDE/EAIQMIT$|$@HDž(H(LHq$L(ID$xA=H@<0<1H$dH+%(kHH5p[]A\A]A^A_ifH$dH+%( HHH5[]A\A]A^A_)LHH8/ H HHH nH H5H$ΝDH1H5*HHHtcL,#HHHHDdDI9t:D#HuHƅHH@1HX HBHD}ƅ}IT$1H$H5#H߃iHHHL,*HHHHDdDI9D#HuHƅHH@11vHƅHH@1HƅHH@1HƅHH@1JHRHOHpt HD$H <* HH= HPHHD<ƅ HH=b HPHD>ƅ>IEHau{du{u A<$ A<$9 suv{Z7DCE)LHwHuHxtH@AHt8/tH$dH+%(NHHD[]A\A]A^A_鴜LH"guD{su>{u8H$dH+%( HLH[]A\A]A^A_s{t{(H.LHnH$dH+%( HH)[]A\A]A^A_s,{P"E1{tAMd$MA<$/ID$H8LuHpH1HuHxtH@Ht8/tAH= HPHD ƅ LH3"H5E1eH$dH+%( HH[]A\A]A^A_ BD-LHHE1H@HDž`HƇH@1|HƅHH@1=HƅHH@1HƅHH@1HƇH@1H5HH$kAFH5HߍP1HKIHtoHI*HHHHDdDI9t9D#H=uHƅHH@1H5WHŖMvaH(H[ H\DDAI4HHAHLLA5wfM=foH(HH )RfoXHBH )ZHX@H[HxH ADAA5vHD$H|$H H\${HƅHH@1B HٔHƅHH@1 H藔HƅHH@IT$1J[HPIT$H H$dH+%(4HH][]A\A]A^A_ -H9HƅHH@1ML$A1A>xLʾHKH:HcH>H$dH+%(HHH5q[]A\A]A^A_H$dH+%(bHHH57[]A\A]A^A_H$dH+%(0HHl[]A\A]A^A_ݒH$dH+%(HHu[]A\A]A^A_騒H$dH+%(HHH5[]A\A]A^A_AHv c<H<H@ID$HHPzH5HID$HHPUH$dH+%(HH)[]A\A]A^A_БXHPFHHDDHH9H;uHHHHu%fH9tL9tH@H H0H9uHHH$E1近H$HIA/m<L轏IHDHƅHH@1IQH$DH51HH}IH[HI'HHHHDdDL9(D#H=uHƅHH@1맋<H迎HHHƅHH@1}ƅHHH@1LH H$dH+%(HHH5B[]A\A]A^A_AH[H HAHHH$H AH 規H$HIH ƅHHH@1s HNƅHHH@1 H襎ƅHHH@I]1"IT$:4IL$9)LD#IT$H@H$dH+%(hHLH[]A\A]A^A_H9\HcH HHPXHHPHHchDlHH1L`L_hIHMYLH?LHDA9+HPzHR:>(HNID$H[7ID$HHPq]HLH?HP:)t Dž0HPHxH5 H蒍I}tHL H螌LHM?H$dH+%(HLH[]A\A]A^A_MH(H-+ML$tH(uE2-(#IT$L"{vH$dH+%(u'HH5[]A\A]A^A_A<72-(# UHSH(dH%(HD$1HtrBHӃg4YH$CHH4HHD$HHHHD$HHk4f.Dž0HD$dH+%(uH([]*f.AVAUATIUHSNwHHcH>L[H]A\A]A^HHA Lk1fDHHHDdDL9D#HH=uHƅHH@1HvHA Lk1fDHHHDdDI9D#HH=uHƅHH@1HHA Lk1fDHHHHDdDI9D#H=uHƅHH@1HHA Ls1fDHHHHDlDL9D+H=uHƅHH@1HHHBH Ƈ HHHBHD ƅ HH=%HPHD ƅ IT$O@IT$AfDHH=HPHD&ƅ&[]A\A]A^DHL%B&Ml$,fDHHIH\M9tA$H=uHƅHH@1DHHA Lk1fDHHHDdDI9/D#HH=uHƅHH@1HWHA Lk 1fDHHHDdDI9D#HH=uHƅHH@1맀(IT$HHLkA:`H2HHHHDdDL9 D#H=uHƅHH@1HGHA Ls 1fDHHHDlDI9uD+HH=uHƅHH@1HHA Lk1fDHHHDdDI9D#HH=uHƅHH@1HHA Ls-fDHHHDlDI9tAD+HH=uHƅHH@1@IT$HDH=HHHD(ƅ( DIT$H&HH=SHP[HD)ƅ)]A\A]A^HH=}HPHD ƅ >HH=zHPHD*ƅ*sHƅHH@IT$1 HƇH@1HƇH@1SƇHE H@fHƅHH@1HƅHH@1/HƇH@1ZHƇH@1]fDAUATIUHSHHHtXHȿHbIPu5HP +wHHHLHHuf.L(L1HHǃ(HHHBH(ƃ(HUHtH,HH=HPHHL)ƃ)NL(H[]A\A]@H aH=HPH1L(L(Hƃ(Hǃ(HH=8HPH)ƃ)HHƃH(ƃ(HUH@HǃHDЃ<( HH=HƃHH@1fHƃHH@1KH=|HPH Hƃ ufDHƃH)(ƃ(fHUH@HǃHƃHH H@AWAVAUATUSH8dH%(HD$(1HHHAI4V@IrDHKCL H )*tgHL HHt^0uTCuHSEuH5vHKCL H *uH HL DHD$(dH+%(H8[]A\A]A^A_H H}L L(HRHHDž(A:KL(L-HHM}(HHIHDtDM9t:EuH=uHƅHH@1HSLjAUHt>H4B5wHrLHL MmAUHzA{L{ 'HHHDtDL9t=D3HH=uHƅHH@1AEHH5HߍP1HrIHMtaI#HHHHDtDL9t9D3H=uHƅHH@1HA}L{'HHHHDtDI9t9D3H=uHƅHH@1MmAUDAWHAVAUIATIUSHHHt&PHHu1LHHH= HPH ƃ HHBH[ƃ[IUHtHYHH=HPH]ƃ]H[]A\A]A^A_ÐH@8*L1ɾHaHHhHƃH[ƃ[IUH@HǃHAWDHƃHH@1&H-HA L}-fDHHHHD4DL9t>DuH=uHƃHH@1@L1ɾH.HHtwHBH)ƃ)H=HƃH [ƃ[fIUH@HǃHƃHH)H@nfDAUATUHSH:2tH[]A\A]f.HBLchHXMtoHI&HHHHDdDL9t=D#H=uHƅHH@1@H[]A\A]DUHAWIAVAUATSHHHdH%(HE1?_H5oL1mDžD1EIGHL@LI DžHLDž,Dž(HDž0HDž8Dž@DžH HcHIHHHH)H9tHH$H9uH)HtHLHH|$IHHHIH%HII)IL9tHH$L9uAL)MHH CMg A _Lu A ZL牍HʸHDžHL$HL1&nLI[MLAMtDDžDLHTzIHA?_uHAZHuIGHHAGdtHD[]A\A]A^A_fDANHȃHԼHHv FfDH{HGSHcHKHԼHLHvMu;HL[@{ؾ)WH։S؃hI9tLCHLCL[@HH8Ht(HԼHWPHw7W(xtCtRW(HfDuHO Hf.HHPH\9@HW HPHHD9f.DHS@HfDH3@Hf.HfffdH%HHÐHfffdH%HHÐHHHt @Pu HHDHHpf.De_YSMGA;5/)# @HII@t u Ix81L'fDHtA<OH2HHAII4NAuH@H@tH9tA s$t>@:ttft H>HH:H|H| HzHH)H)HHe@1A@t AuIy8tOHÀ=INHD$A@tAƀHD$I@8>:tt I@8A@t Au MHI+Isff.S@MAIIApA0~wA@uJH@PuI@HHHI[f M@`M1@PufDAPtLDII@HtAIDH@yHI[@AI@fDIcI@II@fDAI@L11ɐHIAIL ڄx?s@jIIL ]L11fHIAIL ڄx'H@AWAVAUATUSHHL$H91II׻L5H-L-QHwрB<KHHcH>fDLGHw ?aKHcHLDI9wFKHcHDH[]A\A]A^A_ow#O(AJA<&JHcDH>fD11DHLǃHH Ex?wA@t HHH pJHcALMA@t Au cJMIfDwHWHL$LLD$HDI|HLtiJ{QHcHcLDLLIH ?HcH>f/v DBLuIDII LtAIHcLD#iI]IIcL>(AIHWHcH|qHH@E11HHЃHI x?@|HHI jf.E11HHЃHI x9fHKSCHcHcHH|LLLDLLLDH|HRHCHLDf1HCHLDHHDCWHwHH9GH)LDuDLGHwbfDGHwRfLGHwBfDGHw2fLcGHw#DGHwqGSCHcHH|HLH|HHL11@HHЃHH DŽxGHcAD=MA@tA?<FMH11@>HHHH @xE11>HHHI @x?w@t HHI oFHcADMA@t Au <EFMMP.FHcADMA@ADHGH|GHw<$<lEQH_HgL1҉II&MM ȉMȉDɉIDɉIDɉIM1ȉM9ȉAEM9ȉAEM9ȉAEM9ȉAELHII|M)ȉrM!ȉhM9ȉAEVM9ȉAEDE)$)$)$)$)$ooo)$)$)$s $u H|$hII@I!HD$L$$tAƇIG8<uSHBHlHL\0H\$$@t u BMLMP<XH11DHHЃHH ƄxHT$0H1_IHHD$HD$0ML%1HD$L5[w~IcL>@H|11HHЃHH ƄxHT$HLA<$vAfHDLA<$AAƄIHIHfHt$HH?tHH?IH([]A\A]A^A_H|11HHЃHH ƄxHT$HLH<$gfHDLH<$IAƄ;HTHc€uH<$HD0@@Ht$HD0$@@H= Ie@HD$($@tƄ$HD$(HD$h?@ff.HǁHH9 UHHAWE1AVL5HAUIATSHH(LI?LLM9sIHP΃@@t"@td@t>/?Ic L>?HLHL9rHe[A\A]A^A_]@ȃ??<wlƄ HAHHE1A??1DHLʃHI ExIIAwƄ3LvfDHhH11ƃfDDHLƃHH ExH,HMH}HUH}HPHLHPHLHPHLHM[LMooKHoS P o[0X0oc@`@okPhPos`p`o{pxpooooHHHHHo #ohkop s ox0{0o@@C@oHPKPoP`S`oXp[pooooHHLIHeE112HHHI @xIw BƄJ11fDDHLƃHH ExHH11DDHLƒHH ExE11DHLƒHI ExHƄ3L H11fDHLƒHH ExE11DHLƒHI Ex?wA@DIIH'Ƅ3L E11ɐ2HHHI @xL1E1f2HHHI @x?w@t HHI IƃJHHH11fDDHLƒHH ExE11DHLƒHI ExIIH+IƄ3L H11DHLƒHH ExE11DHLƒHI ExIIHƄ3L H11DHLƒHH ExE11DHLƒHI Ex?wA@tHHI sE11f.2HHHI @xIw BƄJ11fDDHLƃHH ExHE112HHHI @xLHE11f2HHHI @x?w@t HHI IJHHDHE11@0HHHI @xIBƄHE11D0HHHI @xHE110HHHI @xIBƄH11fDDHLƒHH ExE11DHLƒHI ExE11f2HHHI @xLHE11ɐ2HHHI @xL1E1f2HHHI @xLHƃE11f.2HHHI @xLHƃoHHI $HH9tHH$H9uHH$HD$HtHǁHH9J UHHAWE1AVL5AUIATSHH(LI?LLM9sQHP΃@@t"@tl@tF/;6Ic L>?HHLHL9rHe[A\A]A^A_]@ȃ??<wlƄ HAHHE1A??1DHLʃHI ExLAwƄ3LuDHhH11ƃfDDHLƃHH ExH,HMH}pHUH}HPHHLHPHHLHPHHLHMkLMooKHoS P o[0X0oc@`@okPhPos`p`o{pxpooooHHHHHo #ohkop s ox0{0o@@C@oHPKPoP`S`oXp[pooooHHLIHME112HHHI @xIw BƄJ11fDDHLƃHH ExHH11DDHLƒHH ExE11DHLƒHI ExHƄ3L H11fDHLƒHH ExE11DHLƒHI Ex?wA@DLHƄ3L E112HHHI @xL1E1f2HHHI @x?w@t HHI ƃLHLxH11fDHLƒHH ExE11DHLƒHI ExLHIƄ3L H11DHLƒHH ExE11DHLƒHI ExLHƄ3L H11f.DHLƒHH ExE11DHLƒHI Ex?wA@yHHI gE11fD2HHHI @xIw BƄJ11fDDHLƃHH ExHE112HHHI @xLHvE11f2HHHI @x?@HHI HE11f0HHHI @xIBƄHE11D0HHHI @xHE110HHHI @xIBƄ}H11fDDHLƒHH ExE11DHLƒHI ExE11f.2HHHI @xLHE11ɐ2HHHI @xL1E1f2HHHI @xLHƃE11f.2HHHI @xLHƃGHHI HH9tHH$H9uHH$HD$HdAWH1AVAUIHATUSH(HIDžIDžIHIIIH?H|<HHILuI$HcEI)MF LL$L$A~ eIDAv@Z11fD8HHHH @xI$E11I8HHHI @x?w@t HHI M$11@D0HHHH @xI$E1AƄ$AzlIL%Bw9IcL>@HA$AIuMuIDM<ALLLItIu H@AA$< <<A$HA$E11f:HHHI @xN4@ELLLI$HtuI$1H([]A\A]A^A_fDA~ hHMF HI$D1fD0HHHI @xAƄ$IAPIHIT8IA@IHA$AP/^0HPHL$LLD$L $HT$L $LLD$I$AI fAƄ$AIf<)LLHhH`HHHt,HH=vHH-H=wHHHtHEHL HUH]LeLmLuL}HmHYHGHHtfff.@UHAWAVIAUIHuATLSHHHHU|fLHAօALHHE1Ҁ`t=HH H H@t u HHxLH{ADžpgAHD[A\A]A^A_]f.fHJH9Nwf.~Hc1HHHFHtpLDL@x I@HBHHHIDHIfHFHFHcHFHHFzH11fDHMAIL ExEfDH11ɐDHMAIL Ex?A@IIL ff.AWAVLqAULjMATE1USHhHBH|$HD$@D$ HD$PHt$Ll$HHD$(H|$(1HD$ L|$01E11L$PH$XLl$ ELt$8IEHD|$ H|$ HE)A9DGDHH|$HD$DAWHDL$PH< fDHIH0HH҃DPL9H9uEAENPD9t$ qL|$0Ll$ ALt$8HD$(1HPHI9u1LEAHÐl$ H|$HHD$D)9GDITDIADf.IIHTPrtPIDIA9uAD;d$ rAAA@tMNM~(AF@LL|$0M`AjA1 L<$1LHD$0IIH<$HT$8Ht$0 Lt$8,Et$LA &H<$HT$8Ht$0ILd$0Lt$8LH<$1/A|$IHHAAD)։pDt&ƒHHRIoJIHR HQ9uET$IAE1ANLPIFuE1AHD9EAL98rD9vcLT$(D)LL$ DD$IH $HIH‰IHHxHHLLLLcLT$(LL$ DD$ $DIHNT0OL5ANL9w LLLL$0L $L$$LEhAE11E1ҽfDUHSH_ HH`MHD} ztE1HD[]fDHxxfDHHxxf.HxxH] fHxxU Hl$Ru'JfDLt BSHHRt%Pu8HPH1HRuDH[]DfDHBy8AxHfDAWIAVAULoATILUSH(M4$MLLLAV ID$HD$f.A^tIV1 H9tL;:wAIMMeLHA|$ A9D$?CLSHHNL2A9FvHNd0AAA9D$#LωL$MeLL$L$LL$Aq AAAT$ɍ< 9ANP1tCfƒH IHRAAI IoQRHI HJ A;t$uANsHHHJ|0؃HJ|09؃HHL@oHHBD69uANAD$ HD$HH\$ID$L#uLLL$*H"Hl$If.AF $Av`IV1H9IH HzHI9s92I9)HMd P9ЃH@I @oYHHIXHyHx 9uAvHdH(L[]A\A]A^A_fHMLB-DMf(MMLLL$LL$f9ǍJ)t0Aʍ9ORHROIAorrMR LR sAIL$A)D҅t)AӃHO[OAo{yM[ LY9uEQA|$A|$AAHNlHHLL$Nl3KM9LL$L5Hl$IAM\$A)AB<EAo3IH@IpMkLh 9uIL$DD9t-DAÃHO[OAo{yM[ LY9uAyA|$D)A|$ ID$LhLLMbMt%pHHAo AHH9uIL$to ƒHHBL29uA~AA HD$HH\$IAL uLAD$ HHt$ID$L&uLƒHHAABoL!BL A;t$uEAo#ȃIHBd9uM\$DD9IHBol!Ak9uAyA|$D)vt&fDAʍIHCod"Bd"sAM\$A)D҅:fуIHBol Ak9ufDHE1$AF t:HH IL(Ao AIt ItHL9uIL$0DoHHRIZHqHr 9uLE1vAAVAUIATLdUHSH.fvf0uQIuDHHHI9tSL3IcFI~H)IVfDH(1[]A\A]A^A_MOMEhLHL$HSAD\$L $DHL$1HƒL $D\$fDHL$HS1L$WDHL$1HƒBL,$1E1@LOgE1AR1cff.HtuHHVHNH~HF HtuHHFHFH~HF uDUH0rHHHHH@H@HhH@ ]cHHVHNH~HF HD$`HHH@L+>HD$HD$hHtH@C L{D$IHLLL$`Hl$MLIfDHHII$HuHl$MHEHD$L9l$~D$H|$H5IufC H5HHEL|$HHLLB>HCHEHC HkH$$H$HC HKHL$aH\$0HD$ MLsLcLpL LL$`LHLHEHD$ L-ufC L-HLEHL$L}HHx1Hl$Ld$ẢELLHsHl$Ld$T$Hc…Ld$IHHILIT$ALHIL$1ITLHHLLd$H4HD$ LcM_LsL LpfD$GD~HL$P1H"%C @uoX@tgfHL$X1qHT$XpL 1LL$`P1LL7HD$` H%1n;HH-+ #0hlLhash_table_higher_prime_index../../gcc/hash-table.c. !m64 !m32;m64 m64;/usr/lib/gcc/init_options_struct../../gcc/opts.c/usr/share/locale`utf-8utf8‘’GCC_EXTRA_DIAGNOSTIC_OUTPUTfixits-v1fixits-v2atexit failedCOLLECT_AS_OPTIONS=lto-wrapperOFFLOAD_TARGET_NAMES=OFFLOAD_TARGET_DEFAULT=1get_completions../../gcc/opt-suggestions.cinstall: %s%s programs: %s libraries: %s Usage: %s [options] file... Options: %s. %s %s%s (C)no input filesdo_spec_on_infiles../../gcc/gcc.ccomparing final insns dumpsopen temporary output fileclosing pipeline input fileopen temporary filepipeline already completeXXXXXXopen error filevforkdup2execvpexecv: error trying to exec '': TMPDIRTMPTEMP/tmp-fno-diagnostics-show-caret-fdiagnostics-color=never-fdiagnostics-urls=never--param-fdiagnostics-plain-outputprune_options../../gcc/opts-common.cdecode_cmdline_option-Werror=generate_canonical_optionkBKiBKBMBMiBGBGiBTBTiBPBPiBEBcolorize_init../../gcc/diagnostic-color.cdumbCOLORTERMxfce4-terminalgnome-terminalGCC_URLSTERM_URLSxtermdetermine_url_formatcalculate_allocation_1../../gcc/vec.cx86_64-redhat-linux%{fgnu-tm: -pthread}GCCBINUTILS/usr/lib/self_spec%:compare-debug-self-opt()GCC_EXEC_PREFIX/usr/libexec/gcc//usr/bin/GCC_EXEC_PREFIX=COMPILER_PATHLIBRARY_PATHLPATHnvptx-none/dev/nullprocess_command.exeGCC_COMPARE_DEBUG../../../../bin-fcompare-debug=help-dummyenv_manager::xput (%s) xputsaving old value: %s generate_option@/usr_ROOTread_cmdline_option-fcompare-debug=-gtoggledriver_handle_option*%s: %s *link_command: %s 11.5.0--version--help--target-helplibgcc.a.bfd.gold%lluSOURCE_DATE_EPOCH-L-Fcwdobj-o [CWE-%iget_or_insert_file../../gcc/edit-context.capply_fixitmissing argument to %qsdisablepreinitunlimitedvery-cheapglobal-dynamicinitial-execlocal-dynamiclocal-execgnu2internalprotectedsomebyte_looplibcallrep_4byterep_8byterep_byteunrolled_loopvector_looplibc++named_varsbig-endianlittle-endiannativesimplestcprefer-atomicsinglemultithreadedparallel-runsserial256ts-18661-3guideddecomposeparloopsilp32lp641to1balancedmaxdynnolto-relunknowninline-cloneinline-only-staticacmlsvmlcachelinepackagepublicmixedCBprioritynop5keepthunkthunk-externthunk-inlineindirect-jmp-infsnanswap387+sse387,ssebothsse+387sse,387standardlegacy-firstrangerranger-debugranger-firstranger-traceminimaldisplayevery-lineonceinline-eventsseparate-eventsnfcnfkcanyunpairedzlibzlib-gnukernellargemediumsmallfullsysvsafeonlyattintelnotetunetune_32tune_64cpu_32cpu_64%{!march=*:-march=%(VALUE)}arch_32arch_64.m#Objective-C.mi.mm#Objective-C++.M.mii#C++.cxx.cpp.cp.c++.C.CPP.ii.ads#Ada.adb.f#Fortran.F.for.FOR.ftn.FTN.fpp.FPP.f90.F90.f95.F95.f03.F03.f08.F08.r#Ratfor.go#Go.d#D.dd.di@c@c-header.i@cpp-output.s@assembler.sx@assembler-with-cpp.S@c++.H@c++-header.hpp.hp.hxx.h++.HPP.tcc.hh-D_GNU_SOURCE %(cpp)@c++-system-header@c++-user-header@c++-cpp-output@f77-cpp-input@f77@f95-cpp-input@f95@ltounknown evrp mode %qsValid arguments to -mfpmath=:Unrecognized option: %qsunknown IRA algorithm %qsunknown IRA region %qsunknown linker output %qsunknown offload ABI %qsunknown Stack Reuse Level %qsunknown TLS model %qs-Wno--W-fno--f-gno--g--debug=--machine---machine-no---machine=--machine=no---machine--optimize=-O--std=--std--warn---warn-no---no--###--all-warnings--ansi--assemble--assertassertion missing after %qs--assert=--comments--comments-in-macros--compile--completion=--coverage--debug--define-macromacro name missing after %qs--define-macro=--dependencies--dump--dump=--dumpbase--dumpbase-ext--dumpdir--entry--entry=--extra-warnings--for-assembler--for-assembler=--for-linker--for-linker=--force-link--force-link=Display this information.--help=--imacrosmissing filename after %qs--imacros=--include--include-barrier--include-directorymissing path after %qs--include-directory-after--include-directory-after=--include-directory=--include-prefix--include-prefix=--include-with-prefix--include-with-prefix-after--include-with-prefix-after=--include-with-prefix-before--include-with-prefix-before=--include-with-prefix=--include=--language--language=--library-directory--library-directory=--no-canonical-prefixes--no-integrated-cpp--no-line-commands--no-standard-includes--no-standard-libraries--no-sysroot-suffix--no-warnings--optimize--output--output-pch=--output=--param=align-threshold=--param=asan-globals=--param=asan-memintrin=--param=asan-stack=Enable asan stack protection.--param=avg-loop-niter=--param=avoid-fma-max-bits=--param=dse-max-object-size=--param=early-inlining-insns=--param=evrp-mode=--param=fsm-scale-path-stmts=--param=ggc-min-expand=--param=ggc-min-heapsize=--param=inline-min-speedup=--param=inline-unit-growth=--param=integer-share-limit=--param=ipa-cp-unit-growth=--param=ipa-max-aa-steps=--param=ipa-max-agg-items=--param=ira-max-loops-num=--param=l1-cache-line-size=The size of L1 cache line.--param=l1-cache-size=The size of L1 cache.--param=l2-cache-size=The size of L2 cache.--param=large-function-insns=--param=large-stack-frame=--param=large-unit-insns=--param=lazy-modules=--param=lim-expensive=--param=loop-block-tile-size=--param=lto-max-partition=--param=lto-min-partition=--param=lto-partitions=--param=max-combine-insns=--param=max-crossjump-edges=--param=max-cse-insns=--param=max-cse-path-length=--param=max-fsm-thread-paths=--param=max-gcse-memory=--param=max-hoist-depth=--param=max-isl-operations=--param=max-last-value-rtl=--param=max-peel-branches=--param=max-peel-times=--param=max-peeled-insns=--param=max-pow-sqrt-depth=--param=max-slsr-cand-scan=--param=max-stores-to-merge=--param=max-stores-to-sink=--param=max-stores-to-track=--param=max-tracked-strlens=--param=max-unroll-times=--param=max-unrolled-insns=--param=max-unswitch-insns=--param=max-unswitch-level=--param=max-vartrack-size=--param=min-crossjump-insns=--param=min-pagesize=--param=min-spec-prob=--param=min-vect-loop-bound=--param=modref-max-accesses=--param=modref-max-bases=--param=modref-max-depth=--param=modref-max-refs=--param=modref-max-tests=--param=openacc-kernels=--param=parloops-chunk-size=--param=parloops-schedule=--param=prefetch-latency=--param=ranger-logical-depth=--param=scev-max-expr-size=--param=sms-dfa-history=--param=sms-max-ii-factor=--param=sms-min-sc=--param=sra-max-propagations=--param=ssp-buffer-size=--param=tree-reassoc-width=--param=uninlined-thunk-time=--param=use-canonical-types=--pass-exit-codes--pedantic--pedantic-errors--pie--pipe--prefix--prefix=--preprocess--print-file-name--print-file-name=--print-libgcc-file-name--print-multi-directory--print-multi-lib--print-multi-os-directory--print-multiarch--print-prog-name--print-prog-name=--print-search-dirs--print-sysroot--profile--save-temps--shared--specs--specs=--static--static-pie--symbolic--sysroot--sysroot=Alias for --help=target.--time--trace-includes--traditional--traditional-cpp--trigraphs--undefine-macro--undefine-macro=--user-dependencies--verbose--write-dependencies--write-user-dependencies-A-BDo not discard comments.-CC-D-E-H-Hd-Hf-I-J-MGenerate make dependencies.-MD-MF-MG-MM-MMD-MP-MQ-MT-Mmodules-Mno-modules-N-Ofast-Og-Os-P-Q-Qn-Qy-R-S-T-Tbss-Tbss=-Tdata-Tdata=-Ttext-Ttext=-U-U Undefine .-WNSObject-attribute-Wa,-Wabi-Wabi-tag-Wabi=-Wabsolute-value-Waddress-Waddress-of-packed-member-Waggregate-return-Waliasing-Walign-commons-Waligned-new-Waligned-new=-WallEnable most warning messages.-Walloc-size-larger-than=-Walloc-zero-WallocaWarn on any use of alloca.-Walloca-larger-than=-Wampersand-Wanalyzer-double-fclose-Wanalyzer-double-free-Wanalyzer-file-leak-Wanalyzer-free-of-non-heap-Wanalyzer-malloc-leak-Wanalyzer-null-argument-Wanalyzer-null-dereference-Wanalyzer-too-complex-Wanalyzer-use-after-free-Wanalyzer-write-to-const-Wargument-mismatch-Warith-conversion-Warray-bounds-Warray-bounds=-Warray-parameter-Warray-parameter=-Warray-temporaries-Wassign-intercept-Wattribute-alias-Wattribute-alias=-Wattribute-warning-Wattributes-Wbad-function-cast-Wbidi-chars-Wbidi-chars=-Wbool-compare-Wbool-operation-Wbuiltin-macro-redefined-Wc++-compat-Wc++0x-compat-Wc++11-compat-Wc++14-compat-Wc++17-compat-Wc++1z-compat-Wc++20-compat-Wc++2a-compat-Wc-binding-type-Wc11-c2x-compat-Wc90-c99-compat-Wc99-c11-compat-Wcannot-profile-Wcast-align-Wcast-align=strict-Wcast-function-type-Wcast-qual-Wcast-result-Wcatch-value-Wcatch-value=-Wchar-subscripts-Wcharacter-truncation-Wchkp-Wclass-conversion-Wclass-memaccess-Wclobbered-Wcomma-subscript-Wcomment-WcommentsSynonym for -Wcomment.-Wcompare-reals-Wconditionally-supported-Wconversion-Wconversion-extra-Wconversion-null-Wcoverage-mismatch-Wcpp-Wctad-maybe-unsupported-Wctor-dtor-privacy-Wdangling-elseWarn about dangling else.-Wdate-time-Wdeclaration-after-statement-Wdelete-incomplete-Wdelete-non-virtual-dtor-Wdeprecated-Wdeprecated-copy-Wdeprecated-copy-dtor-Wdeprecated-declarations-Wdesignated-init-Wdisabled-optimization-Wdiscarded-array-qualifiers-Wdiscarded-qualifiers-Wdiv-by-zero-Wdo-subscript-Wdouble-promotion-Wduplicate-decl-specifier-Wduplicated-branches-Wduplicated-cond-Weffc++-Wempty-body-Wendif-labels-Wenum-compare-Wenum-conversion-WerrorTreat all warnings as errors.implicit-function-declaration-Wexceptions-Wexpansion-to-defined-Wextra-Wextra-semi-Wfatal-errors-Wfloat-conversion-Wfloat-equal-Wformat-Wformat-contains-nul-Wformat-diag-Wformat-extra-args-Wformat-nonliteral-Wformat-overflow-Wformat-overflow=-Wformat-security-Wformat-signedness-Wformat-truncation-Wformat-truncation=-Wformat-y2k-Wformat-zero-length-Wformat=-Wframe-address-Wframe-larger-than=-Wfree-nonheap-object-Wfrontend-loop-interchange-Wfunction-elimination-Whsa-Wif-not-aligned-Wignored-attributes-Wignored-qualifiers-Wimplicit-Wimplicit-fallthrough-Wimplicit-fallthrough=-Wimplicit-int-Wimplicit-interface-Wimplicit-procedure-Wimport-Winaccessible-base-Wincompatible-pointer-types-Winherited-variadic-ctor-Winit-list-lifetime-Winit-self-Winline-Wint-conversion-Wint-in-bool-context-Wint-to-pointer-cast-Winteger-division-Wintrinsic-shadow-Wintrinsics-std-Winvalid-imported-macros-Winvalid-memory-model-Winvalid-offsetof-Winvalid-pch-Wjump-misses-init-Wl,-Wlarger-than--Wlarger-than=-Wline-truncation-Wliteral-suffix-Wlogical-not-parentheses-Wlogical-op-Wlong-long-Wlto-type-mismatch-Wmain-Wmaybe-uninitialized-Wmemset-elt-size-Wmemset-transposed-args-Wmisleading-indentation-Wmismatched-dealloc-Wmismatched-new-delete-Wmismatched-tags-Wmissing-attributes-Wmissing-braces-Wmissing-declarations-Wmissing-field-initializers-Wmissing-format-attribute-Wmissing-include-dirs-Wmissing-index-Wmissing-noreturn-Wmissing-parameter-type-Wmissing-profile-Wmissing-prototypes-Wmudflap-Wmultichar-Wmultiple-inheritance-Wmultistatement-macros-WnamespacesWarn on namespace definition.-Wnarrowing-Wnested-externs-Wno-alloc-size-larger-than18446744073709551615EiB-Wno-alloca-larger-than-Wno-frame-larger-than-Wno-larger-than-Wno-stack-usage-Wno-vla-larger-than-Wnoexcept-Wnoexcept-type-Wnon-template-friend-Wnon-virtual-dtor-Wnonnull-Wnonnull-compare-Wnormalized-Wnormalized=-Wnull-dereference-Wobjc-root-class-Wodr-Wold-style-cast-Wold-style-declaration-Wold-style-definition-Wopenmp-simd-Woverflow-Woverlength-strings-Woverloaded-virtual-Woverride-init-Woverride-init-side-effects-Woverwrite-recursive-Wp,-Wpacked-Wpacked-bitfield-compat-Wpacked-not-aligned-Wpadded-Wparentheses-Wpedantic-Wpessimizing-move-Wplacement-new-Wplacement-new=-Wpmf-conversions-Wpointer-arith-Wpointer-compare-Wpointer-sign-Wpointer-to-int-cast-Wpragmas-Wprio-ctor-dtor-Wproperty-assign-default-Wprotocol-Wpsabi-Wrange-loop-construct-Wreal-q-constant-Wrealloc-lhs-Wrealloc-lhs-all-Wredundant-decls-Wredundant-move-Wredundant-tags-Wregister-Wreorder-Wrestrict-Wreturn-local-addr-Wreturn-type-Wscalar-storage-order-Wselector-Wsequence-point-Wshadow-Wshadow-compatible-local-Wshadow-ivar-Wshadow-local-Wshadow=compatible-local-Wshadow=global-Wshadow=local-Wshift-count-negative-Wshift-count-overflow-Wshift-negative-value-Wshift-overflow-Wshift-overflow=-Wsign-compare-Wsign-conversion-Wsign-promo-Wsized-deallocation-Wsizeof-array-argument-Wsizeof-array-div-Wsizeof-pointer-div-Wsizeof-pointer-memaccess-Wspeculative-Wstack-protector-Wstack-usage=-Wstrict-aliasing-Wstrict-aliasing=-Wstrict-null-sentinel-Wstrict-overflow-Wstrict-overflow=-Wstrict-prototypes-Wstrict-selector-match-Wstring-compare-Wstringop-overflow-Wstringop-overflow=-Wstringop-overread-Wstringop-truncation-Wsubobject-linkage-Wsuggest-attribute=cold-Wsuggest-attribute=const-Wsuggest-attribute=format-Wsuggest-attribute=malloc-Wsuggest-attribute=noreturn-Wsuggest-attribute=pure-Wsuggest-final-methods-Wsuggest-final-types-Wsuggest-override-Wsurprising-Wswitch-Wswitch-bool-Wswitch-default-Wswitch-enum-Wswitch-outside-range-Wswitch-unreachable-Wsync-nand-Wsynth-Wsystem-headers-Wtabs-Wtarget-lifetime-Wtautological-compare-Wtemplates-Wterminate-Wtraditional-Wtraditional-conversion-Wtrampolines-Wtrigraphs-Wtsan-Wtype-limits-Wundeclared-selector-Wundef-Wundefined-do-loop-Wunderflow-Wuninitialized-Wunknown-pragmas-Wunreachable-code-Wunsafe-loop-optimizations-Wunsuffixed-float-constants-Wunused-Wunused-but-set-parameter-Wunused-but-set-variable-Wunused-const-variable-Wunused-const-variable=-Wunused-dummy-argument-Wunused-function-Wunused-labelWarn when a label is unused.-Wunused-local-typedefs-Wunused-macros-Wunused-parameter-Wunused-result-Wunused-value-Wunused-variable-Wuse-without-only-Wuseless-castWarn about useless casts.-Wvarargs-Wvariadic-macros-Wvexing-parse-Wvirtual-inheritance-Wvirtual-move-assign-Wvla-Wvla-larger-than=-Wvla-parameter-Wvolatile-Wvolatile-register-var-Wwrite-strings-Wzero-length-bounds-Wzerotrip-XGenerate JSON file.-Xassembler-Xf-Xlinker-Xpreprocessor-Z-aux-info-aux-info=-cDump the symtab callgraph.Enable preprocessing.-cpp=-d-debuglib=-defaultlib=-defined-only-demangleDump the demangled output.-dstartfiles-dump-body=-dump-level=-dumpfullversion-dumpmachine-dumpspecs-dumpversion-e-export-dynamic-fPIC-fPIE-fRTS=Select the runtime.-fabi-compat-version=-fabi-version=-faccess-control-fada-spec-parent=-falign-commons-falign-functionsAlign the start of functions.-falign-functions=-falign-jumps-falign-jumps=-falign-labelsAlign all labels.-falign-labels=-falign-loopsAlign the start of loops.-falign-loops=-faligned-new-faligned-new=-fall-instantiations-fall-intrinsics-fall-virtual-fallocation-dce-fallow-argument-mismatch-fallow-invalid-boz-fallow-leading-underscore-fallow-store-data-races-falt-external-templatesNo longer supported.-fanalyzerEnable static analysis pass.-fanalyzer-call-summaries-fanalyzer-checker=-fanalyzer-feasibility-fanalyzer-fine-grained-fanalyzer-state-merge-fanalyzer-state-purge-fanalyzer-transitivity-fanalyzer-verbose-edges-fanalyzer-verbosity=-fargument-alias-fargument-noalias-fargument-noalias-anything-fargument-noalias-global-fasan-shadow-offset=-fasmRecognize the "asm" keyword.-fassert-fassociative-math-fassume-phsa-fasynchronous-unwind-tables-fauto-inc-dec-fauto-profile-fauto-profile=-fautomatic-fbackslash-fbacktrace-fbit-tests-fblas-matmul-limit=-fbounds-check-fbounds-check=-fbranch-count-reg-fbranch-probabilities-fbranch-target-load-optimize-fbtr-bb-exclusive-fbuilding-libgcc-fbuilding-libphobos-tests-fbuiltinRecognize built-in functions.-fbuiltin--fbuiltin-printfIgnored.-fc-prototypes-fc-prototypes-external-fcall-saved--fcall-used--fcaller-saves-fcallgraph-info-fcallgraph-info=-fcanonical-system-headers-fcf-protection-fcf-protection=-fchar8_t-fcheck-array-temporaries-fcheck-data-deps-fcheck-new-fcheck-pointer-bounds-fcheck=-fchecking-fchecking=-fchkp-check-incomplete-type-fchkp-check-read-fchkp-check-write-fchkp-instrument-calls-fchkp-instrument-marked-only-fchkp-narrow-bounds-fchkp-optimize-fchkp-store-bounds-fchkp-use-static-bounds-fchkp-use-wrappers-fcilkplus-fcoarray=-fcode-hoistingEnable code hoisting.-fcombine-stack-adjustments-fcommon-fcompare-debug-fcompare-debug-second-fcompare-elim-fconcepts-fconcepts-diagnostics-depth=-fconcepts-ts-fcond-mismatch-fconserve-space-fconserve-stack-fconstant-string-class=-fconstexpr-cache-depth=-fconstexpr-depth=-fconstexpr-loop-limit=-fconstexpr-ops-limit=-fconvert=-fcoroutines-fcprop-registers-fcray-pointer-fcrossjumping-fcse-follow-jumps-fcse-skip-blocks-fcx-fortran-rules-fcx-limited-range-fd-lines-as-code-fd-lines-as-comments-fdata-sections-fdbg-cnt-list-fdbg-cnt=-fdce-fdebugCompile in debug code.-fdebug-aux-vars-fdebug-cpp-fdebug-prefix-map=-fdebug-types-section-fdebug=-fdec-fdec-add-missing-indexes-fdec-blank-format-item-fdec-char-conversions-fdec-duplicates-fdec-format-defaults-fdec-include-fdec-intrinsic-ints-fdec-math-fdec-non-integer-index-fdec-non-logical-if-fdec-old-init-fdec-override-kind-fdec-promotion-fdec-sequence-fdec-static-fdec-structure-fdeclone-ctor-dtor-fdeduce-init-list-fdefault-double-8-fdefault-inline-fdefault-integer-8-fdefault-real-10-fdefault-real-16-fdefault-real-8-fdefer-pop-fdelayed-branch-fdelete-dead-exceptions-fdelete-null-pointer-checks-fdevirtualize-fdevirtualize-at-ltrans-fdevirtualize-speculatively-fdiagnostics-color-fdiagnostics-color=-fdiagnostics-column-origin=-fdiagnostics-column-unit=-fdiagnostics-format=-fdiagnostics-generate-patch-fdiagnostics-path-format=-fdiagnostics-show-caret-fdiagnostics-show-cwe-fdiagnostics-show-labels-fdiagnostics-show-location=-fdiagnostics-show-option-fdiagnostics-urls=-fdirectives-onlyPreprocess directives only.-fdisable--fdocGenerate documentation.-fdoc-dir=-fdoc-file=-fdoc-inc=-fdollar-ok-fdollars-in-identifiers-fdruntime-fdse-fdump--fdump-ada-spec-fdump-ada-spec-slim-fdump-analyzer-fdump-analyzer-callgraph-fdump-analyzer-feasibility-fdump-analyzer-json-fdump-analyzer-state-purge-fdump-analyzer-stderr-fdump-analyzer-supergraph-fdump-core-fdump-d-original-fdump-final-insns-fdump-final-insns=-fdump-fortran-global-fdump-fortran-optimized-fdump-fortran-original-fdump-go-spec=-fdump-internal-locations-fdump-noaddr-fdump-parse-tree-fdump-passesDump optimization passes.-fdump-scos-fdump-unnumbered-fdump-unnumbered-links-fdwarf2-cfi-asm-fearly-inliningPerform early inlining.-felide-constructors-felide-type-feliminate-dwarf2-dups-femit-class-debug-always-femit-struct-debug-baseonly-femit-struct-debug-detailed=-femit-struct-debug-reduced-fenable--fenforce-eh-specs-fenum-int-equiv-fexceptionsEnable exception handling.-fexcess-precision=-fexec-charset=-fexpensive-optimizations-fext-numeric-literals-fextended-identifiers-fextern-tls-init-fexternal-blas-fexternal-templates-ff2cUse f2c calling convention.-ffast-math-ffat-lto-objects-ffile-prefix-map=-ffinite-loops-ffinite-math-only-ffixed--ffixed-form-ffixed-line-length--ffixed-line-length-none-ffloat-store-ffor-scope-fforce-addr-fforward-propagate-ffp-contract=-ffp-int-builtin-inexact-ffpe-summary=-ffpe-trap=-ffree-form-ffree-line-length--ffree-line-length-none-ffreestanding-ffriend-injection-ffrontend-loop-interchange-ffrontend-optimize-ffunction-cse-ffunction-sections-fgcse-fgcse-after-reload-fgcse-las-fgcse-lm-fgcse-sm-fgimpleEnable parsing GIMPLE.-fgnat-encodings=-fgnu-keywords-fgnu-runtime-fgnu-tm-fgnu-unique-fgnu89-inline-fgo-c-header=-fgo-check-divide-overflow-fgo-check-divide-zero-fgo-compiling-runtime-fgo-debug-escape-fgo-debug-escape-hash=-fgo-debug-optimization-fgo-dump--fgo-embedcfg=-fgo-optimize--fgo-pkgpath=-fgo-prefix=-fgo-relative-import-path=-fgraphite-fgraphite-identity-fguess-branch-probability-fguiding-decls-fhandle-exceptions-fhelp-fhelp=-fhoist-adjacent-loads-fhonor-std-fhosted-fhuge-objects-fidentProcess #ident directives.-fif-conversion-fif-conversion2-fignore-unknown-pragmasIgnore unsupported pragmas.-fimplement-inlines-fimplicit-inline-templates-fimplicit-none-fimplicit-templates-findirect-inliningPerform indirect inlining.-finhibit-size-directive-finit-character=-finit-derived-finit-integer=-finit-local-zero-finit-logical=-finit-real=-finline-finline-arg-packing-finline-atomics-finline-functions-finline-limit--finline-limit=-finline-matmul-limit=-finline-small-functions-finput-charset=-finstrument-functions-finteger-4-integer-8-fintrinsic-modules-path-fintrinsic-modules-path=-finvariants-fipa-bit-cp-fipa-cp-fipa-cp-alignment-fipa-cp-clone-fipa-icf-fipa-icf-functions-fipa-icf-variables-fipa-matrix-reorg-fipa-modref-fipa-profile-fipa-pta-fipa-pure-const-fipa-ra-fipa-reference-fipa-reference-addressable-fipa-sra-fipa-stack-alignment-fipa-struct-reorg-fipa-vrp-fira-algorithm=-fira-hoist-pressure-fira-loop-pressure-fira-region=-fira-share-save-slots-fira-share-spill-slots-fira-verbose=-fivar-visibility=-fivopts-fjump-tables-fkeep-gc-roots-live-fkeep-inline-dllexport-fkeep-inline-functions-fkeep-static-consts-fkeep-static-functions-flabels-ok-flang-info-include-translatemissing header name-flang-info-module-cmi-flang-info-module-cmi=missing module name-flarge-source-files-flax-vector-conversions-fleading-underscore-flifetime-dse-flifetime-dse=-flimit-function-alignment-flinker-output=-flive-patching-flive-patching=-flive-range-shrinkage-flocal-ivars-flogical-as-integer-floop-block-floop-flatten-floop-interchange-floop-nest-optimize-floop-optimize-floop-parallelize-allMark all loops as parallel.-floop-strip-mine-floop-unroll-and-jam-flra-remat-flto-flto-compression-level=-flto-odr-type-merging-flto-partition=-flto-report-flto-report-wpa-flto=-fltrans-fltrans-output-list=-fmacro-prefix-map=-fmain-fmath-errno-fmax-array-constructor=-fmax-errors=-fmax-identifier-length=-fmax-include-depth=-fmax-stack-var-size=-fmax-subrecord-length=-fmem-report-fmem-report-wpa-fmerge-all-constants-fmerge-constants-fmerge-debug-strings-fmessage-length=-fmodule-file=-fmodule-header-fmodule-header=-fmodule-implicit-inline-fmodule-lazyEnable lazy module importing.-fmodule-mapper=missing mapper-fmodule-only-fmodule-private-fmodule-version-ignore-fmoduleinfo-fmodules-ts-fmodulo-sched-fmodulo-sched-allow-regmoves-fmove-loop-invariants-fms-extensions-fmudflap-fmudflapir-fmudflapth-fname-mangling-version--fnew-abi-fnew-inheriting-ctors-fnew-ttp-matching-fnext-runtime-fnil-receivers-fno-modules-fnon-call-exceptions-fnonansi-builtins-fnonnull-objects-fnothrow-opt-fobjc-abi-version=-fobjc-call-cxx-cdtors-fobjc-direct-dispatch-fobjc-exceptions-fobjc-gc-fobjc-nilcheck-fobjc-sjlj-exceptions-fobjc-std=objc1-foffload-abi=-foffload=-fomit-frame-pointer-fonly=-fopenaccEnable OpenACC.-fopenacc-dim=-fopenmp-fopenmp-simd-foperator-names-fopt-info-fopt-info--foptimize-register-move-foptimize-sibling-calls-foptimize-strlen-foptional-diags-fpack-derived-fpack-struct-fpack-struct=-fpad-source-fpartial-inliningPerform partial inlining.-fpatchable-function-entry=-fpcc-struct-return-fpch-deps-fpch-preprocess-fpeel-loopsPerform loop peeling.-fpeephole-fpeephole2-fpermissive-fpermitted-flt-eval-methods=-fpic-fpie-fplan9-extensions-fplt-fplugin-arg--fplugin=Specify a plugin to load.-fpost-ipa-mem-report-fpostconditions-fpre-include=-fpre-ipa-mem-report-fpreconditions-fpredictive-commoning-fprefetch-loop-arrays-fpreprocessed-fpretty-templates-fprintf-return-value-fprofile-fprofile-abs-path-fprofile-arcs-fprofile-correction-fprofile-dir=-fprofile-exclude-files=-fprofile-filter-files=-fprofile-generate-fprofile-generate=-fprofile-info-section-fprofile-info-section=-fprofile-note=-fprofile-partial-training-fprofile-prefix-path=-fprofile-reorder-functions-fprofile-report-fprofile-reproducible=-fprofile-update=-fprofile-use-fprofile-use=-fprofile-values-fprotect-parens-frandom-seed-frandom-seed=-frange-check-freal-4-real-10-freal-4-real-16-freal-4-real-8-freal-8-real-10-freal-8-real-16-freal-8-real-4-frealloc-lhs-freciprocal-math-frecord-gcc-switches-frecord-marker=4-frecord-marker=8-frecursive-freg-struct-return-fregmove-freleaseCompile release version.-frename-registers-freorder-blocks-freorder-blocks-algorithm=-freorder-functions-frepack-arrays-freplace-objc-classes-frepo-freport-bug-frequire-return-statement-frerun-cse-after-loop-frerun-loop-opt-fresolution=The resolution file.-frounding-math-frtti-fsanitize-coverage=-fsanitize-recover-fsanitize-recover=-fsanitize-sections=-fsanitize=Select what to sanitize.-fsave-optimization-record-fsched-dep-count-heuristic-fsched-group-heuristic-fsched-interblock-fsched-last-insn-heuristic-fsched-pressure-fsched-rank-heuristic-fsched-spec-fsched-spec-insn-heuristic-fsched-spec-load-fsched-spec-load-dangerous-fsched-stalled-insns-fsched-stalled-insns-dep-fsched-stalled-insns-dep=-fsched-stalled-insns=-fsched-verbose=-fsched2-use-superblocks-fsched2-use-traces-fschedule-fusion-fschedule-insns-fschedule-insns2-fsecond-underscore-fsection-anchors-fsee-fsel-sched-pipelining-fselective-scheduling-fselective-scheduling2-fself-test=-fsemantic-interposition-fshort-enums-fshort-wchar-fshow-column-fshrink-wrap-fshrink-wrap-separate-fsign-zero-fsignaling-nans-fsigned-bitfields-fsigned-char-fsigned-zeros-fsimd-cost-model=-fsingle-precision-constant-fsized-deallocation-fsplit-ivs-in-unroller-fsplit-loopsPerform loop splitting.-fsplit-paths-fsplit-stack-fsplit-wide-types-fsplit-wide-types-early-fsquangle-fssa-backprop-fssa-phiopt-fsso-struct=-fstack-arrays-fstack-checkspecific-fstack-check=-fstack-clash-protection-fstack-limit-fstack-limit-register=-fstack-limit-symbol=-fstack-protector-fstack-protector-all-fstack-protector-explicit-fstack-protector-strong-fstack-reuse=-fstack-usage-fstats-fstdarg-opt-fstore-mergingMerge adjacent stores.-fstrength-reduce-fstrict-aliasing-fstrict-enums-fstrict-overflow-fstrict-prototype-fstrict-volatile-bitfields-fstrong-eval-order-fstrong-eval-order=-fswitch-errors-fsync-libcalls-fsyntax-only-ftabstop=-ftail-call-workaround-ftail-call-workaround=-ftarget-help-ftemplate-backtrace-limit=-ftemplate-depth--ftemplate-depth=-ftest-coverage-ftest-forall-temp-fthis-is-variable-fthread-jumps-fthreadsafe-statics-ftime-report-ftime-report-details-ftls-model=-ftoplevel-reorder-ftracer-ftrack-macro-expansion-ftrack-macro-expansion=-ftrampolines-ftransition=all-ftransition=complex-ftransition=dip1000-ftransition=dip25-ftransition=field-ftransition=nogc-ftransition=tls-ftrapping-math-ftrapv-ftree-bit-ccp-ftree-builtin-call-dce-ftree-ccp-ftree-ch-ftree-coalesce-inlined-vars-ftree-coalesce-vars-ftree-copy-prop-ftree-copyrename-ftree-cselim-ftree-dce-ftree-dominator-opts-ftree-dse-ftree-forwprop-ftree-fre-ftree-loop-distribution-ftree-loop-if-convert-ftree-loop-if-convert-stores-ftree-loop-im-ftree-loop-ivcanon-ftree-loop-linear-ftree-loop-optimize-ftree-loop-vectorize-ftree-lrs-ftree-parallelize-loops=-ftree-partial-pre-ftree-phiprop-ftree-pre-ftree-pta-ftree-reassoc-ftree-salias-ftree-scev-cprop-ftree-sink-ftree-slp-vectorize-ftree-slsr-ftree-sra-ftree-store-ccp-ftree-store-copy-prop-ftree-switch-conversion-ftree-tail-mergeEnable tail merging on trees.-ftree-ter-ftree-vect-loop-version-ftree-vectorize-ftree-vectorizer-verbose=-ftree-vrp-funconstrained-commons-funderscoring-funit-at-a-time-funittestCompile in unittest code.-funroll-all-loops-funroll-completely-grow-size-funroll-loops-funsafe-loop-optimizations-funsafe-math-optimizations-funsigned-bitfields-funsigned-char-funswitch-loopsPerform loop unswitching.-funwind-tables-fuse-cxa-atexit-fuse-cxa-get-exception-ptr-fuse-ld=bfd-fuse-ld=gold-fuse-ld=lld-fuse-linker-plugin-fvar-trackingPerform variable tracking.-fvar-tracking-assignments-fvar-tracking-uninit-fvect-cost-model-fvect-cost-model=-fverbose-asm-fversion-fversion-loops-for-strides-fversion=-fvisibility-inlines-hidden-fvisibility-ms-compat-fvisibility=-fvpt-fvtable-gc-fvtable-thunks-fvtable-verify=-fvtv-counts-fvtv-debug-fweak-fweak-templates-fweb-fwhole-file-fwhole-program-fwide-exec-charset=-fworking-directory-fwpa-fwpa=-fwrapv-fwrapv-pointer-fxref-fzee-fzero-call-used-regs=-fzero-initialized-in-bss-fzero-link-gantCatch typos.-gas-loc-support-gas-locview-support-gcoff-gcoff1-gcoff2-gcoff3-gcolumn-info-gdescribe-dies-gdwarf-gdwarf--gdwarf32-gdwarf64-gen-decls-ggdb-ggnu-pubnames-gimple-stats-ginline-points-gnat-gnatO-gno-pubnames-gpubnames-grecord-gcc-switches-gsplit-dwarf-gstabs-gstabs+-gstatement-frontiers-gstrict-dwarf-gvariable-location-views-gvms-gxcoff-gxcoff+-gz-gz=-h-idirafter-imultiarch-imultilib-iplugindir=-iprefix-iquote-isysroot-isystem-iwithprefix-iwithprefixbefore-k8Synonym of -gnatk8.-lang-asm-m128bit-long-doublesizeof(long double) is 16.-m16Generate 16bit i386 code.-m32Generate 32bit i386 code.-m3dnow-m3dnowa-m64Generate 64bit x86-64 code.-m80387Use hardware fp.-m8bit-idiv-m96bit-long-doublesizeof(long double) is 12.-mabi=-mabm-maccumulate-outgoing-args-maddress-mode=Use given address mode.-madx-maes-malign-data=Use the given data alignment.-malign-double-malign-functions=-malign-jumps=-malign-loops=-malign-stringops-mamx-bf16-mamx-int8-mamx-tile-mandroid-march=Generate code for given CPU.-masm=Use given assembler dialect.-mavx-mavx2-mavx256-split-unaligned-load-mavx5124fmaps-mavx5124vnniw-mavx512bf16-mavx512bitalg-mavx512bw-mavx512cd-mavx512dq-mavx512er-mavx512f-mavx512ifma-mavx512pf-mavx512vbmi-mavx512vbmi2-mavx512vl-mavx512vnni-mavx512vp2intersect-mavx512vpopcntdq-mavxvnni-mbionicUse Bionic C library.-mbmi-mbmi2-mbranch-cost=-mcall-ms2sysv-xlogues-mcet-switch-mcld-mcldemote-mclflushopt-mclwbSupport CLWB instruction.-mclzero-mcmodel=Use given x86-64 code model.-mcpu=-mcrc32-mcx16-mdaz-ftzSet the FTZ and DAZ Flags.-mdispatch-scheduler-mdump-tune-features-menqcmd-mf16c-mfancy-math-387-mfentry-mfentry-name=-mfentry-section=-mfma-mfma4-mforce-drap-mforce-indirect-call-mfp-ret-in-387-mfpmath=-mfsgsbase-mfunction-return=-mfused-madd-mfxsr-mgather^use_gather-mgeneral-regs-only-mgfni-mglibcUse GNU C library.-mhard-float-mharden-sls=-mhle-mhreset-miamcu-mieee-fp-mincoming-stack-boundary=-mindirect-branch-cs-prefix-mindirect-branch-register-mindirect-branch=-minline-all-stringops-minstrument-return=-mintel-syntax-mkl-mlarge-data-threshold=-mlong-double-128Use 128-bit long double.-mlong-double-64Use 64-bit long double.-mlong-double-80Use 80-bit long double.-mlwp-mlzcnt-mmanual-endbr-mmemcpy-strategy=-mmemset-strategy=-mmitigate-rop-mmmx-mmovbe-mmovdir64b-mmovdiri-mmpx-mms-bitfields-mmuslUse musl C library.-mmwait-mmwaitx-mneeded-mno-align-stringops-mno-defaultClear all tune features.-mno-fancy-math-387-mno-push-args-mno-red-zone-mno-sse4-mnop-mcount-momit-leaf-frame-pointer-mpc32-mpc64-mpc80-mpclmul-mpcommit-mpconfig-mpku-mpopcnt-mprefer-avx128-mprefer-vector-width=-mpreferred-stack-boundary=-mprefetchwt1-mprfchw-mptwrite-mpush-args-mrdpid-mrdrnd-mrdseedSupport RDSEED instruction.-mrecip-mrecip=-mrecord-mcount-mrecord-return-mred-zone-mregparm=-mrtdAlternate calling convention.-mrtm-msahf-mserialize-msgx-msha-mshstk-mskip-rax-setup-msoft-floatDo not use hardware fp.-msse-msse2-msse2avx-msse3-msse4-msse4.1-msse4.2-msse4a-msse5%<-msse5%> was removed-msseregparm-mssse3-mstack-arg-probeEnable stack probing.-mstack-protector-guard-reg=-mstack-protector-guard=-mstackrealignRealign stack in prologue.-mstringop-strategy=-mstv-mtbm-mtls-dialect=-mtls-direct-seg-refs-mtsxldtrk-mtune-ctrl=-mtune=Schedule code for given CPU.-muclibcUse uClibc C library.-muintr-mvaes-mveclibabi=Vector library ABI to use.-mvect8-ret-in-mem-mvpclmulqdq-mvzeroupper-mwaitpkg-mwbnoinvd-mwidekl-mx32Generate 32bit x86-64 code.-mxop-mxsave-mxsavecSupport XSAVEC instructions.-mxsaveoptSupport XSAVEOPT instruction.-mxsaves-n-name-sort-no-pie-nocppDisable preprocessing.-nodefaultlibs-nolibc-nophoboslib-nostartfiles-nostdinc-nostdinc++-nostdlib-pEnable function profiling.-pg-posix-print-objc-runtime-info-print-sysroot-headers-suffix-print-value-pthread-quiet-r-rdynamic-remap-reverse-sort-s-save-temps=Create a shared library.-shared-libgcc-shared-libphobos-size-sort-static-libasan-static-libgcc-static-libgfortran-static-libgo-static-libhwasan-static-liblsan-static-libmpx-static-libmpxwrappers-static-libphobos-static-libstdc++-static-libtsan-static-libubsan-std=c++03-std=c++0x-std=c++11-std=c++14-std=c++17-std=c++1y-std=c++1z-std=c++20-std=c++23-std=c++2a-std=c++2b-std=c++98-std=c11-std=c17-std=c18-std=c1x-std=c2x-std=c89-std=c90-std=c99-std=c9x-std=f2003-std=f2008-std=f2008ts-std=f2018-std=f95-std=gnu-std=gnu++03-std=gnu++0x-std=gnu++11-std=gnu++14-std=gnu++17-std=gnu++1y-std=gnu++1z-std=gnu++20-std=gnu++23-std=gnu++2a-std=gnu++2b-std=gnu++98-std=gnu11-std=gnu17-std=gnu18-std=gnu1x-std=gnu2x-std=gnu89-std=gnu90-std=gnu99-std=gnu9x-std=iso9899:1990-std=iso9899:199409-std=iso9899:1999-std=iso9899:199x-std=iso9899:2011-std=iso9899:2017-std=iso9899:2018-std=legacy-stdlib=-t-tno-android-cc-tno-android-ld-tree-statsDump the statistics of trees.-type-stats-u-undef-vEnable verbose output.-wSuppress warnings.-x-zm32 m32;64:../lib64 m64 !m32;32:../lib !m64 m32;startfilehttps://cwe.mitre.org/data/definitions/%i.html%s: error: too many @-files encountered %s: error: @-file refers to a directory unrecognized command-line option %<-%s%>; did you mean %<-%s%>?unrecognized command-line option %<-%s%>multilib select %qs is invalidmultilib exclusion %qs is invalidnot configured with sysroot headers suffix -pass-exit-codes Exit with highest error code from a phase. --help Display this information. --target-help Display target specific command line options. --help={common|optimizers|params|target|warnings|[^]{joined|separate|undocumented}}[,...]. Display specific types of command line options. (Use '-v --help' to display command line options of sub-processes). --version Display compiler version information. -dumpspecs Display all of the built in spec strings. -dumpversion Display the version of the compiler. -dumpmachine Display the compiler's target processor. -print-search-dirs Display the directories in the compiler's search path. -print-libgcc-file-name Display the name of the compiler's companion library. -print-file-name= Display the full path to library . -print-prog-name= Display the full path to compiler component . -print-multiarch Display the target's normalized GNU triplet, used as a component in the library path. -print-multi-directory Display the root directory for versions of libgcc. -print-multi-lib Display the mapping between command line options and multiple library search directories. -print-multi-os-directory Display the relative path to OS libraries. -print-sysroot Display the target libraries directory. -print-sysroot-headers-suffix Display the sysroot suffix used to find headers. -Wa, Pass comma-separated on to the assembler. -Wp, Pass comma-separated on to the preprocessor. -Wl, Pass comma-separated on to the linker. -Xassembler Pass on to the assembler. -Xpreprocessor Pass on to the preprocessor. -Xlinker Pass on to the linker. -save-temps Do not delete intermediate files. -save-temps= Do not delete intermediate files. -no-canonical-prefixes Do not canonicalize paths when building relative prefixes to other gcc components. -pipe Use pipes rather than intermediate files. -time Time the execution of each subprocess. -specs= Override built-in specs with the contents of . -std= Assume that the input sources are for . --sysroot= Use as the root directory for headers and libraries. -B Add to the compiler's search paths. -v Display the programs invoked by the compiler. -### Like -v but options quoted and commands not executed. -E Preprocess only; do not compile, assemble or link. -S Compile only; do not assemble or link. -c Compile and assemble, but do not link. -o Place the output into . -pie Create a dynamically linked position independent executable. -shared Create a shared library. -x Specify the language of the following input files. Permissible languages include: c c++ assembler none 'none' means revert to the default behavior of guessing the language based on the file's extension. Options starting with -g, -f, -m, -O, -W, or --param are automatically passed on to the various sub-processes invoked by %s. In order to pass other options on to these processes the -W options must be used. For bug reporting instructions, please see: Copyright %s 2021 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. cannot specify %<-o%> with %<-c%>, %<-S%> or %<-E%> with multiple files%s: %s compiler not installed on this systemrecompiling with %<-fcompare-debug%>during %<-fcompare-debug%> recompilation%s: could not determine length of compare-debug file %s%s: %<-fcompare-debug%> failure (length)%s: could not open compare-debug file %s%s: %<-fcompare-debug%> failure For bug reporting instructions, please see:could not create temporary filePEX_STDERR_TO_PIPE used in the middle of pipelineCannot create temporary file in %s: %s -fno-diagnostics-show-line-numbers-fdiagnostics-path-format=separate-events%{fdump-final-insns:-fdump-final-insns=.} %spec failure: more than one argument to %multilib exclusions %qs is invalidmultilib select %qs %qs is invalidinput file %qs is the same as output fileoutput filename may not be empty%<-pipe%> ignored because %<-save-temps%> specified%<-x %s%> after last input file has no effectenv_manager::getenv (%s) -> %s unrecognized command-line option %qsswitch %qs is no longer supportedargument to %qs is bigger than %d%qs is an unknown %<-save-temps%> optionInternal compiler error: Error reporting routines re-entered. compilation terminated due to -fmax-errors=%u. %s:%d: confused by earlier errors, bailing out command-line option %qs is not supported by this configurationargument to %qs should be a non-negative integer optionally followed by a size unitargument to %qs should be a non-negative integerargument to %qs is not between %d and %dunrecognized argument in option %qsvalid arguments to %qs are: %s; did you mean %qs?valid arguments to %qs are: %sGCC is not configured to support %s as offload target%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S: %(linker) %{!fno-use-linker-plugin:%{!fno-lto: -plugin %(linker_plugin_file) -plugin-opt=%(lto_wrapper) -plugin-opt=-fresolution=%u.res %{flinker-output=*:-plugin-opt=-linker-output-known} %{!nostdlib:%{!nodefaultlibs:%:pass-through-libs(%(link_gcc_c_sequence))}} }}%{flto|flto=*:% not recognizedargument %qs to %<-Wnormalized%> not recognizedunknown excess precision style %qsunknown floating point contraction style %qsUnrecognized option to endianness value: %qsUnrecognized option to floating-point init value: %qsKnown choices for mitigation against straight line speculation with -mharden-sls=:Known indirect branch choices (for use with the -mindirect-branch=/-mfunction-return= options):Known choices for return instrumentation with -minstrument-return=:unrecognized ivar visibility value %qsKnown data alignment choices (for use with the -malign-data= option):Known vectorization library ABIs (for use with the -mveclibabi= option):unknown Live-Patching Level %qsunknown LTO partitioning model %qsunknown specification for the set of FLT_EVAL_METHOD values to permit %qsKnown address mode (for use with the -maddress-mode= option):Known preferred register vector length (to use with the -mprefer-vector-width= option):unknown profile reproducibility method %qsunknown profile update method %qsunknown basic block reordering algorithm %qsunrecognized scalar storage order value %qsKnown stack protector guard (for use with the -mstack-protector-guard= option):Valid arguments to -mstringop-strategy=:unrecognized visibility value %qsKnown TLS dialects (for use with the -mtls-dialect= option):unknown vectorizer cost model %qsunknown vtable verify initialization priority %qsargument %qs to %<-Waligned-new%> not recognizedProvide bash completion for options starting with provided string.--help= Display descriptions of a specific class of options. is one or more of optimizers, target, warnings, undocumented, params.--param=align-loop-iterations=Loops iterating at least selected number of iterations will get loop alignment.Select fraction of the maximal frequency of executions of basic block in function given basic block get alignment.--param=analyzer-bb-explosion-factor=The maximum number of 'after supernode' exploded nodes within the analyzer per supernode, before terminating analysis.--param=analyzer-max-constraints=The maximum number of constraints per state.--param=analyzer-max-enodes-for-full-dump=The maximum depth of exploded nodes that should appear in a dot dump before switching to a less verbose format.--param=analyzer-max-enodes-per-program-point=The maximum number of exploded nodes per program point within the analyzer, before terminating analysis of that point.--param=analyzer-max-infeasible-edges=The maximum number of infeasible edges to reject before declaring a diagnostic as infeasible.--param=analyzer-max-recursion-depth=The maximum number of times a callsite can appear in a call stack within the analyzer, before terminating analysis of a call that would recurse deeper.--param=analyzer-max-svalue-depth=The maximum depth of a symbolic value, before approximating the value as unknown.--param=analyzer-min-snodes-for-call-summary=The minimum number of supernodes within a function for the analyzer to consider summarizing its effects at call sites.Enable asan globals protection.--param=asan-instrument-allocas=Enable asan allocas/VLAs protection.--param=asan-instrument-reads=Enable asan load operations protection.--param=asan-instrument-writes=Enable asan store operations protection.--param=asan-instrumentation-with-call-threshold=Use callbacks instead of inline code if number of accesses in function becomes greater or equal to this number.Enable asan builtin functions protection.--param=asan-use-after-return=Enable asan detection of use-after-return bugs.Average number of iterations of a loop.Maximum number of bits for which we avoid creating FMAs.--param=builtin-expect-probability=Set the estimated probability in percentage for builtin expect. The default value is 90% probability.--param=builtin-string-cmp-inline-length=The maximum length of a constant string for a builtin string cmp call eligible for inlining. The default value is 3.--param=case-values-threshold=The smallest number of different values for which it is best to use a jump-table instead of a tree of conditional branches, if 0, use the default for the machine.--param=comdat-sharing-probability=Probability that COMDAT function will be shared with different compilation unit.--param=cxx-max-namespaces-for-diagnostic-help=Maximum number of namespaces to search for alternatives when name lookup fails.--param=dse-max-alias-queries-per-store=Maximum number of queries into the alias oracle per store.Maximum size (in bytes) of objects tracked bytewise by dead store elimination.Maximal estimated growth of function body caused by early inlining of single call.--param=evrp-mode=[legacy|ranger|legacy-first|ranger-first|ranger-trace|ranger-debug|trace|debug] Specifies the mode Early VRP should operate in.--param=evrp-sparse-threshold=Maximum number of basic blocks before EVRP uses a sparse cache.--param=fsm-maximum-phi-arguments=Maximum number of arguments a PHI may have before the FSM threader will not try to thread through its block.--param=fsm-scale-path-blocks=Scale factor to apply to the number of blocks in a threading path when comparing to the number of (scaled) statements.Scale factor to apply to the number of statements in a threading path when comparing to the number of (scaled) blocks.--param=gcse-after-reload-critical-fraction=The threshold ratio of critical edges execution count that permit performing redundancy elimination after reload.--param=gcse-after-reload-partial-fraction=The threshold ratio for performing partial redundancy elimination after reload.--param=gcse-cost-distance-ratio=Scaling factor in calculation of maximum distance an expression can be moved by GCSE optimizations.--param=gcse-unrestricted-cost=Cost at which GCSE optimizations will not constraint the distance an expression can travel.Minimum heap expansion to trigger garbage collection, as a percentage of the total size of the heap.Minimum heap size before we start collecting garbage, in kilobytes.--param=gimple-fe-computed-hot-bb-threshold=The number of executions of a basic block which is considered hot. The parameter is used only in GIMPLE FE.--param=graphite-allow-codegen-errors=Whether codegen errors should be ICEs when -fchecking.--param=graphite-max-arrays-per-scop=Maximum number of arrays per SCoP.--param=graphite-max-nb-scop-params=Maximum number of parameters in a SCoP.--param=hash-table-verification-limit=The number of elements for which hash table verification is done for each searched element.--param=hot-bb-count-fraction=The denominator n of fraction 1/n of the maximal execution count of a basic block in the entire program that a basic block needs to at least have in order to be considered hot (used in non-LTO mode).--param=hot-bb-count-ws-permille=The number of most executed permilles of the profiled execution of the entire program to which the execution count of a basic block must be part of in order to be considered hot (used in LTO mode).--param=hot-bb-frequency-fraction=The denominator n of fraction 1/n of the execution frequency of the entry block of a function that a basic block of this function needs to at least have in order to be considered hot.--param=hwasan-instrument-allocas=Enable hwasan instrumentation of allocas/VLAs.--param=hwasan-instrument-mem-intrinsics=Enable hwasan instrumentation of builtin functions.--param=hwasan-instrument-reads=Enable hwasan instrumentation of load operations.--param=hwasan-instrument-stack=Enable hwasan instrumentation of statically sized stack-allocated variables.--param=hwasan-instrument-writes=Enable hwasan instrumentation of store operations.--param=hwasan-random-frame-tag=Use random base tag for each frame, as opposed to base always zero.--param=inline-heuristics-hint-percent=The scale (in percents) applied to inline-insns-single and auto limits when heuristics hints that inlining is very profitable.The minimal estimated speedup allowing inliner to ignore inline-insns-single and inline-insns-auto.How much can given compilation unit grow because of the inlining (in percent).The upper bound for sharing integer constants.--param=ipa-cp-eval-threshold=Threshold ipa-cp opportunity evaluation that is still considered beneficial to clone.--param=ipa-cp-large-unit-insns=The size of translation unit that IPA-CP pass considers large.--param=ipa-cp-loop-hint-bonus=Compile-time bonus IPA-CP assigns to candidates which make loop bounds or strides known.--param=ipa-cp-max-recursive-depth=Maximum depth of recursive cloning for self-recursive function.--param=ipa-cp-min-recursive-probability=Recursive cloning only when the probability of call being executed exceeds the parameter.--param=ipa-cp-recursion-penalty=Percentage penalty the recursive functions will receive when they are evaluated for cloning.--param=ipa-cp-single-call-penalty=Percentage penalty functions containing a single call to another function will receive when they are evaluated for cloning.How much can given compilation unit grow because of the interprocedural constant propagation (in percent).--param=ipa-cp-value-list-size=Maximum size of a list of values associated with each parameter for interprocedural constant propagation.--param=ipa-jump-function-lookups=Maximum number of statements visited during jump function offset discovery.Maximum number of statements that will be visited by IPA formal parameter analysis based on alias analysis in any given function.Maximum number of aggregate content items for a parameter in jump functions and lattices.--param=ipa-max-loop-predicates=Maximum number of different predicates used to track properties of loops in IPA analysis.--param=ipa-max-param-expr-ops=Maximum number of operations in a parameter expression that can be handled by IPA analysis.--param=ipa-max-switch-predicate-bounds=Maximal number of boundary endpoints of case ranges of switch statement used during IPA function summary generation.--param=ipa-sra-max-replacements=Maximum pieces that IPA-SRA tracks per formal parameter, as a consequence, also the maximum number of replacements of a formal parameter.--param=ipa-sra-ptr-growth-factor=Maximum allowed growth of number and total size of new parameters that ipa-sra replaces a pointer to an aggregate with.--param=ira-loop-reserved-regs=The number of registers in each class kept unused by loop invariant motion.--param=ira-max-conflict-table-size=Max size of conflict table in MB.Max loops number for regional RA.--param=iv-always-prune-cand-set-bound=If number of candidates in the set is smaller, we always try to remove unused ivs during its optimization.--param=iv-consider-all-candidates-bound=Bound on number of candidates below that all candidates are considered in iv optimizations.--param=iv-max-considered-uses=Bound on number of iv uses in loop optimized in iv optimizations.--param=jump-table-max-growth-ratio-for-size=The maximum code size growth ratio when expanding into a jump table (in percent). The parameter is used when optimizing for size.--param=jump-table-max-growth-ratio-for-speed=The maximum code size growth ratio when expanding into a jump table (in percent). The parameter is used when optimizing for speed.--param=large-function-growth=Maximal growth due to inlining of large function (in percent).The size of function body to be considered large.--param=large-stack-frame-growth=Maximal stack frame growth due to inlining (in percent).The size of stack frame to be considered large.The size of translation unit to be considered large.Maximum number of concurrently open C++ module files when lazy loading.The minimum cost of an expensive expression in the loop invariant motion.--param=logical-op-non-short-circuit=True if a non-short-circuit operation is optimal.Size of tiles for loop blocking.--param=loop-interchange-max-num-stmts=The maximum number of stmts in loop nest for loop interchange.--param=loop-interchange-stride-ratio=The minimum stride ratio for loop interchange to be profitable.--param=loop-invariant-max-bbs-in-loop=Max basic blocks number in loop for loop invariant motion.--param=loop-max-datarefs-for-datadeps=Maximum number of datarefs in loop for building loop data dependencies.--param=loop-versioning-max-inner-insns=The maximum number of instructions in an inner loop that is being considered for versioning.--param=loop-versioning-max-outer-insns=The maximum number of instructions in an outer loop that is being considered for versioning, on top of the instructions in inner loops.--param=lra-inheritance-ebb-probability-cutoff=Minimal fall-through edge probability in percentage used to add BB to inheritance EBB in LRA.--param=lra-max-considered-reload-pseudos=The max number of reload pseudos which are considered during spilling a non-reload pseudo.Maximal size of a partition for LTO (in estimated instructions).--param=lto-max-streaming-parallelism=maximal number of LTO partitions streamed in parallel.Minimal size of a partition for LTO (in estimated instructions).Number of partitions the program should be split to.--param=max-average-unrolled-insns=The maximum number of instructions to consider to unroll in a loop on average.The maximum number of insns combine tries to combine.--param=max-completely-peel-loop-nest-depth=The maximum depth of a loop nest we completely peel.--param=max-completely-peel-times=The maximum number of peelings of a single loop that is peeled completely.--param=max-completely-peeled-insns=The maximum number of insns of a completely peeled loop.The maximum number of incoming edges to consider for crossjumping.The maximum instructions CSE process before flushing.The maximum length of path considered in cse.--param=max-cselib-memory-locations=The maximum memory locations recorded by cselib.--param=max-debug-marker-count=Max. count of debug markers to expand or inline.--param=max-delay-slot-insn-search=The maximum number of instructions to consider to fill a delay slot.--param=max-delay-slot-live-search=The maximum number of instructions to consider to find accurate live register information.--param=max-dse-active-local-stores=Maximum number of active local stores in RTL dead store elimination.--param=max-early-inliner-iterations=The maximum number of nested indirect inlining performed by early inliner.--param=max-fields-for-field-sensitive=Maximum number of fields in a structure before pointer analysis treats the structure as a single variable.--param=max-find-base-term-values=Maximum number of VALUEs handled during a single find_base_term call.--param=max-fsm-thread-length=Maximum number of basic blocks on a finite state automaton jump thread path.--param=max-fsm-thread-path-insns=Maximum number of instructions to copy when duplicating blocks on a finite state automaton jump thread path.Maximum number of new jump thread paths to create for a finite state automaton.--param=max-gcse-insertion-ratio=The maximum ratio of insertions to deletions of expressions in GCSE.The maximum amount of memory to be allocated by GCSE, in kilobytes.--param=max-goto-duplication-insns=The maximum number of insns to duplicate when unfactoring computed gotos.--param=max-grow-copy-bb-insns=The maximum expansion factor when copying basic blocks.Maximum depth of search in the dominator tree for expressions to hoist.--param=max-inline-insns-auto=The maximum number of instructions when automatically inlining.--param=max-inline-insns-recursive-auto=The maximum number of instructions non-inline function can grow to via recursive inlining.--param=max-inline-insns-recursive=The maximum number of instructions inline function can grow to via recursive inlining.--param=max-inline-insns-single=The maximum number of instructions in a single function eligible for inlining.--param=max-inline-insns-size=The maximum number of instructions when inlining for size.--param=max-inline-insns-small=The maximum number of instructions when automatically inlining small functions.--param=max-inline-recursive-depth-auto=The maximum depth of recursive inlining for non-inline functions.--param=max-inline-recursive-depth=The maximum depth of recursive inlining for inline functions.Maximum number of isl operations, 0 means unlimited.--param=max-iterations-computation-cost=Bound on the cost of an expression to compute the number of iterations.--param=max-iterations-to-track=Bound on the number of iterations the brute force # of iterations analysis algorithm evaluates.--param=max-jump-thread-duplication-stmts=Maximum number of statements allowed in a block that needs to be duplicated when threading jumps.The maximum number of RTL nodes that can be recorded as combiner's last value.--param=max-loop-header-insns=The maximum number of insns in loop header duplicated by the copy loop headers pass.--param=max-modulo-backtrack-attempts=The maximum number of backtrack attempts the scheduler should make when modulo scheduling a loop.--param=max-partial-antic-length=Maximum length of partial antic set when performing tree pre optimization.The maximum number of branches on the path through the peeled sequence.The maximum number of peelings of a single loop.The maximum number of insns of a peeled loop.--param=max-pending-list-length=The maximum length of scheduling's pending operations list.--param=max-pipeline-region-blocks=The maximum number of blocks in a region to be considered for interblock scheduling.--param=max-pipeline-region-insns=The maximum number of insns in a region to be considered for interblock scheduling.Maximum depth of sqrt chains to use when synthesizing exponentiation by a real constant.--param=max-predicted-iterations=The maximum number of loop iterations we predict statically.--param=max-reload-search-insns=The maximum number of instructions to search backward when looking for equivalent reload.--param=max-rtl-if-conversion-insns=Maximum number of insns in a basic block to consider for RTL if-conversion.--param=max-rtl-if-conversion-predictable-cost=Maximum permissible cost for the sequence that would be generated by the RTL if-conversion pass for a branch that is considered predictable.--param=max-rtl-if-conversion-unpredictable-cost=Maximum permissible cost for the sequence that would be generated by the RTL if-conversion pass for a branch that is considered unpredictable.--param=max-sched-extend-regions-iters=The maximum number of iterations through CFG to extend regions.--param=max-sched-insn-conflict-delay=The maximum conflict delay for an insn to be considered for speculative motion.--param=max-sched-ready-insns=The maximum number of instructions ready to be issued to be considered by the scheduler during the first scheduling pass.--param=max-sched-region-blocks=--param=max-sched-region-insns=Maximum length of candidate scans for straight-line strength reduction.--param=max-speculative-devirt-maydefs=Maximum number of may-defs visited when devirtualizing speculatively.--param=max-ssa-name-query-depth=Maximum recursion depth allowed when querying a property of an SSA name.--param=max-store-chains-to-track=Maximum number of store chains to track at the same time in the store merging pass.Maximum number of constant stores to merge in the store merging pass.Maximum number of conditional store pairs that can be sunk.--param=max-tail-merge-comparisons=Maximum amount of similar bbs to compare a bb with.--param=max-tail-merge-iterations=Maximum amount of iterations of the pass over a function.Maximum number of strings for which strlen optimization pass will track string lengths.--param=max-tree-if-conversion-phi-args=Maximum number of arguments in a PHI supported by TREE if-conversion unless the loop is marked with simd pragma.The maximum number of unrollings of a single loop.The maximum number of instructions to consider to unroll in a loop.The maximum number of insns of an unswitched loop.The maximum number of unswitchings in a single loop.--param=max-variable-expansions-in-unroller=If -fvariable-expansion-in-unroller is used, the maximum number of times that an individual variable will be expanded during loop unrolling.--param=max-vartrack-expr-depth=Max. recursion depth for expanding var tracking expressions.--param=max-vartrack-reverse-op-size=Max. size of loc list for which reverse ops should be added.Max. size of var tracking hash tables.--param=max-vrp-switch-assertions=Maximum number of assertions to add along the default edge of a switch statement during VRP.The minimum number of matching instructions to consider for crossjumping.--param=min-inline-recursive-probability=Inline recursively only when the probability of call being executed exceeds the parameter.--param=min-insn-to-prefetch-ratio=Min. ratio of insns to prefetches to enable prefetching for a loop with an unknown trip count.--param=min-loop-cond-split-prob=The minimum threshold for probability of semi-invariant condition statement to trigger loop split.--param=min-nondebug-insn-uid=The minimum UID to be used for a nondebug insn.Minimum page size for warning purposes.--param=min-size-for-stack-sharing=The minimum size of variables taking part in stack slot sharing when not optimizing.The minimum probability of reaching a source block for interblock speculative scheduling.If -ftree-vectorize is used, the minimal loop bound of a loop to be considered for vectorization.Maximum number of accesses stored in each modref reference.Maximum number of bases stored in each modref tree.Maximum depth of DFS walk used by modref escape analysis.--param=modref-max-escape-points=Maximum number of escape points tracked by modref per SSA-name.Maximum number of references stored in each modref base.Maximum number of tests performed by modref query.--param=openacc-kernels=[decompose|parloops] Specify mode of OpenACC 'kernels' constructs handling.Chunk size of omp schedule for loops parallelized by parloops.--param=parloops-min-per-thread=Minimum number of iterations per thread of an innermost parallelized loop.--param=parloops-schedule=[static|dynamic|guided|auto|runtime] Schedule type of omp schedule for loops parallelized by parloops.--param=partial-inlining-entry-probability=Maximum probability of the entry BB of split region (in percent relative to entry BB of the function) to make partial inlining happen.--param=predictable-branch-outcome=Maximal estimated outcome of branch considered predictable.--param=prefetch-dynamic-strides=Whether software prefetch hints should be issued for non-constant strides.The number of insns executed before prefetch is completed.--param=prefetch-min-insn-to-mem-ratio=Min. ratio of insns to mem ops to enable prefetching in a loop.--param=prefetch-minimum-stride=The minimum constant stride beyond which we should use prefetch hints for.--param=profile-func-internal-id=Use internal function id in profile lookup.Maximum depth of logical expression evaluation ranger will look through when evaluating outgoing edge ranges.--param=rpo-vn-max-loop-depth=Maximum depth of a loop nest to fully value-number optimistically.--param=sccvn-max-alias-queries-per-access=Maximum number of disambiguations to perform per memory access.--param=scev-max-expr-complexity=Bound on the complexity of the expressions in the scalar evolutions analyzer.Bound on size of expressions used in the scalar evolutions analyzer.--param=sched-autopref-queue-depth=Hardware autoprefetcher scheduler model control flag. Number of lookahead cycles the model looks into, at '0' only enable instruction sorting heuristic. Disabled by default.--param=sched-mem-true-dep-cost=Minimal distance between possibly conflicting store and load.--param=sched-pressure-algorithm=Which -fsched-pressure algorithm to apply.--param=sched-spec-prob-cutoff=The minimal probability of speculation success (in percents), so that speculative insn will be scheduled.--param=sched-state-edge-prob-cutoff=The minimum probability an edge must have for the scheduler to save its state across it.--param=selsched-insns-to-rename=Maximum number of instructions in the ready list that are considered eligible for renaming.--param=selsched-max-lookahead=The maximum size of the lookahead window of selective scheduling.--param=selsched-max-sched-times=Maximum number of times that an insn could be scheduled.--param=simultaneous-prefetches=The number of prefetches that can run at the same time.--param=sink-frequency-threshold=Target block's relative execution frequency (as a percentage) required to sink a statement.The number of cycles the swing modulo scheduler considers when checking conflicts using DFA.--param=sms-loop-average-count-threshold=A threshold on the average loop count considered by the swing modulo scheduler.A factor for tuning the upper bound that swing modulo scheduler uses for scheduling a loop.The minimum value of stage count that swing modulo scheduler will generate.Maximum number of artificial accesses to enable forward propagation that Scalar Replacement of Aggregates will keep for one local variable.--param=sra-max-scalarization-size-Osize=Maximum size, in storage units, of an aggregate which should be considered for scalarization when compiling for size.--param=sra-max-scalarization-size-Ospeed=Maximum size, in storage units, of an aggregate which should be considered for scalarization when compiling for speed.--param=ssa-name-def-chain-limit=The maximum number of SSA_NAME assignments to follow in determining a value.The lower bound for a buffer to be considered for stack smashing protection.--param=stack-clash-protection-guard-size=Size of the stack guard expressed as a power of two in bytes.--param=stack-clash-protection-probe-interval=Interval in which to probe the stack expressed as a power of two in bytes.--param=store-merging-allow-unaligned=Allow the store merging pass to introduce unaligned stores if it is legal to do so.--param=store-merging-max-size=Maximum size of a single store merging region in bytes.--param=switch-conversion-max-branch-ratio=The maximum ratio between array size and switch branches for a switch conversion to take place.--param=tm-max-aggregate-size=Size in bytes after which thread-local aggregates should be instrumented with the logging functions instead of save/restore pairs.--param=tracer-dynamic-coverage-feedback=The percentage of function, weighted by execution frequency, that must be covered by trace formation. Used when profile feedback is available.--param=tracer-dynamic-coverage=The percentage of function, weighted by execution frequency, that must be covered by trace formation. Used when profile feedback is not available.--param=tracer-max-code-growth=Maximal code growth caused by tail duplication (in percent).--param=tracer-min-branch-probability-feedback=Stop forward growth if the probability of best edge is less than this threshold (in percent). Used when profile feedback is available.--param=tracer-min-branch-probability=Stop forward growth if the probability of best edge is less than this threshold (in percent). Used when profile feedback is not available.--param=tracer-min-branch-ratio=Stop reverse growth if the reverse probability of best edge is less than this threshold (in percent).Set the maximum number of instructions executed in parallel in reassociated tree. If 0, use the target dependent heuristic.--param=tsan-distinguish-volatile=Emit special instrumentation for accesses to volatiles.--param=tsan-instrument-func-entry-exit=Emit instrumentation calls to __tsan_func_entry() and __tsan_func_exit().--param=uninit-control-dep-attempts=Maximum number of nested calls to search for control dependencies during uninitialized variable analysis.--param=uninlined-function-insns=Instruction accounted for function prologue, epilogue and other overhead.--param=uninlined-function-time=Time accounted for function prologue, epilogue and other overhead.--param=uninlined-thunk-insns=Instruction accounted for function thunk overhead.Time accounted for function thunk overhead.--param=unlikely-bb-count-fraction=The denominator n of fraction 1/n of the number of profiled runs of the entire program below which the execution count of a basic block must be in order for the basic block to be considered unlikely.--param=unroll-jam-max-unroll=Maximum unroll factor for the unroll-and-jam transformation.--param=unroll-jam-min-percent=Minimum percentage of memrefs that must go away for unroll-and-jam to be considered profitable.--param=use-after-scope-direct-emission-threshold=Use direct poisoning/unpoisoning instructions for variables smaller or equal to this number.Whether to use canonical types.--param=vect-epilogues-nomask=Enable loop epilogue vectorization using smaller vector size.--param=vect-max-peeling-for-alignment=Maximum number of loop peels to enhance alignment of data references in a loop.--param=vect-max-version-for-alias-checks=Bound on number of runtime checks inserted by the vectorizer's loop versioning for alias check.--param=vect-max-version-for-alignment-checks=Bound on number of runtime checks inserted by the vectorizer's loop versioning for alignment check.--param=vect-partial-vector-usage=Controls how loop vectorizer uses partial vectors. 0 means never, 1 means only for loops whose need to iterate can be removed, 2 means for all loops. The default value is 2.--print-missing-file-dependencies--print-sysroot-headers-suffix-A= Assert the to . Putting '-' before disables the to .Do not discard comments in macro expansions.-D[=] Define a with as its value. If just is given, is taken to be 1.-F Add to the end of the main framework include path.Print the name of header files as they are used.-Hd Write D interface files to directory .-Hf Write D interface to .-I Add to the end of the main include path.-J Put MODULE files in 'directory'.Generate make dependencies and compile.-MF Write dependency output to the given file.Treat missing header files as generated files.Like -M but ignore system header files.Like -MD but ignore system header files.Generate phony targets for all headers.-MQ Add a target that may require quoting.missing makefile target after %qs-MT Add a target that does not require quoting.Generate C++ Module dependency information.-O Set optimization level to .Optimize for speed disregarding exact standards compliance.Optimize for debugging experience rather than speed or size.Optimize for space rather than speed.Do not generate #line directives.This switch is deprecated; use -Wextra instead.Warn if the NSObject attribute is applied to a non-typedef.Warn about things that will change when compiling with an ABI-compliant compiler.Warn if a subobject has an abi_tag attribute that the complete object type does not have.Warn about things that change between the current -fabi-version and the specified version.Warn on suspicious calls of standard functions computing absolute values.Warn about suspicious uses of memory addresses.Warn when the address of packed member of struct or union is taken.Warn about returning structures, unions or arrays.-Waggressive-loop-optimizationsWarn if a loop with constant number of iterations triggers undefined behavior.Warn about possible aliasing of dummy arguments.Warn about alignment of COMMON blocks.Warn about 'new' of type with extended alignment without -faligned-new.-Waligned-new=[none|global|all] Warn even if 'new' uses a class member allocation function.-Walloc-size-larger-than= Warn for calls to allocation functions that attempt to allocate objects larger than the specified number of bytes.Warn for calls to allocation functions that specify zero bytes.-Walloca-larger-than= Warn on unbounded uses of alloca, and on bounded uses of alloca whose bound can be larger than bytes.Warn about missing ampersand in continued character constants.Warn about code paths in which a stdio FILE can be closed more than once.Warn about code paths in which a pointer can be freed more than once.-Wanalyzer-exposure-through-output-fileWarn about code paths in which sensitive data is written to a file.Warn about code paths in which a stdio FILE is not closed.Warn about code paths in which a non-heap pointer is freed.Warn about code paths in which a heap-allocated pointer leaks.-Wanalyzer-mismatching-deallocationWarn about code paths in which the wrong deallocation function is called.Warn about code paths in which NULL is passed to a must-not-be-NULL function argument.Warn about code paths in which a NULL pointer is dereferenced.-Wanalyzer-possible-null-argumentWarn about code paths in which a possibly-NULL value is passed to a must-not-be-NULL function argument.-Wanalyzer-possible-null-dereferenceWarn about code paths in which a possibly-NULL pointer is dereferenced.-Wanalyzer-shift-count-negativeWarn about code paths in which a shift with negative count is attempted.-Wanalyzer-shift-count-overflowWarn about code paths in which a shift with count >= width of type is attempted.-Wanalyzer-stale-setjmp-bufferWarn about code paths in which a longjmp rewinds to a jmp_buf saved in a stack frame that has returned.-Wanalyzer-tainted-array-indexWarn about code paths in which an unsanitized value is used as an array index.Warn if the code is too complicated for the analyzer to fully explore.-Wanalyzer-unsafe-call-within-signal-handlerWarn about code paths in which an async-signal-unsafe function is called from a signal handler.Warn about code paths in which a freed value is used.-Wanalyzer-use-of-pointer-in-stale-stack-frameWarn about code paths in which a pointer to a stale stack frame is used.Warn about code paths which attempt to write to a const object.-Wanalyzer-write-to-string-literalWarn about code paths which attempt to write to a string literal.Does nothing. Preserved for backward compatibility.Warn if conversion of the result of arithmetic might change the value even though converting the operands cannot.Warn if an array is accessed out of bounds.Warn about mismatched declarations of array parameters and unsafe accesses to them.Warn about creation of array temporaries.Warn whenever an Objective-C assignment is being intercepted by the garbage collector.Warn about type safety and similar errors and mismatches in declarations with alias attributes.Warn about uses of __attribute__((warning)) declarations.Warn about inappropriate attribute usage.Warn about casting functions to incompatible types.-Wbidi-chars=[none|unpaired|any] Warn about UTF-8 bidirectional control characters.Warn about boolean expression compared with an integer value different from true/false.Warn about certain operations on boolean expressions.-Wbuiltin-declaration-mismatchWarn when a built-in function is declared with the wrong signature.Warn when a built-in preprocessor macro is undefined or redefined.Warn about C constructs that are not in the common subset of C and C++.Warn about C++ constructs whose meaning differs between ISO C++ 1998 and ISO C++ 2011.Warn about C++ constructs whose meaning differs between ISO C++ 2011 and ISO C++ 2014.Warn about C++ constructs whose meaning differs between ISO C++ 2014 and ISO C++ 2017.Warn about C++ constructs whose meaning differs between ISO C++ 2017 and ISO C++ 2020.Warn if the type of a variable might be not interoperable with C.Warn about features not present in ISO C11, but present in ISO C2X.Warn about features not present in ISO C90, but present in ISO C99.Warn about features not present in ISO C99, but present in ISO C11.Warn when profiling instrumentation was requested, but could not be applied to a certain function.Warn about pointer casts which increase alignment.Warn about casts between incompatible function types.Warn about casts which discard qualifiers.Warn about casts that will produce a null result.Warn about catch handlers of non-reference type.Warn about subscripts whose type is "char".Warn about truncated character expressions.Removed in GCC 9. This switch has no effect.Warn when a conversion function will never be called due to the type it converts to.Warn for unsafe raw memory writes to objects of class types.Warn about variables that might be changed by "longjmp" or "vfork".Warn about uses of a comma operator within a subscripting expression.Warn about possibly nested block comments, and C++ comments spanning more than one physical line.Warn about equality comparisons involving REAL or COMPLEX expressions.Warn for conditionally-supported constructs.Warn for implicit type conversions that may change a value.Warn about most implicit conversions.Warn for converting NULL from/to a non-pointer type.Warn in case profiles in -fprofile-use do not match.Warn when a #warning directive is encountered.Warn when performing class template argument deduction on a type with no deduction guides.Warn when all constructors and destructors are private.Warn about __TIME__, __DATE__ and __TIMESTAMP__ usage.Warn when a declaration is found after a statement.Warn when deleting a pointer to incomplete type.Warn about deleting polymorphic objects with non-virtual destructors.Warn if a deprecated compiler feature, class, method, or field is used.Mark implicitly-declared copy operations as deprecated if the class has a user-provided copy operation.Mark implicitly-declared copy operations as deprecated if the class has a user-provided copy operation or destructor.Warn about uses of __attribute__((deprecated)) declarations.-Wdeprecated-enum-enum-conversionWarn about deprecated arithmetic conversions on operands of enumeration types.-Wdeprecated-enum-float-conversionWarn about deprecated arithmetic conversions on operands where one is of enumeration type and the other is of a floating-point type.Warn about positional initialization of structs requiring designated initializers.Warn when an optimization pass is disabled.Warn if qualifiers on arrays which are pointer targets are discarded.Warn if type qualifiers on pointers are discarded.Warn about compile-time integer division by zero.Warn about possibly incorrect subscripts in do loops.Warn about implicit conversions from "float" to "double".Warn when a declaration has duplicate const, volatile, restrict or _Atomic specifier.Warn about duplicated branches in if-else statements.Warn about duplicated conditions in an if-else-if chain.Warn about violations of Effective C++ style rules.Warn about an empty body in an if or else statement.Warn about stray tokens after #else and #endif.Warn about comparison of different enum types.Warn about implicit conversion of enum types.-Werror-implicit-function-declarationThis switch is deprecated; use -Werror=implicit-function-declaration instead.Treat specified warning as error.Warn when an exception handler is shadowed by another handler.Warn if "defined" is used outside #if.Print extra (possibly unwanted) warnings.Warn about semicolon after in-class function definition.Exit on the first error occurred.Warn for implicit type conversions that cause loss of floating point precision.Warn if testing floating point numbers for equality.Warn about printf/scanf/strftime/strfmon format string anomalies.Warn about format strings that contain NUL bytes.Warn about GCC format strings with strings unsuitable for diagnostics.Warn if passing too many arguments to a function for its format string.Warn about format strings that are not literals.Warn about function calls with format strings that write past the end of the destination region. Same as -Wformat-overflow=1.Warn about function calls with format strings that write past the end of the destination region.Warn about possible security problems with format functions.Warn about sign differences with format functions.Warn about calls to snprintf and similar functions that truncate output. Same as -Wformat-truncation=1.Warn about calls to snprintf and similar functions that truncate output.Warn about strftime formats yielding 2-digit years.Warn about zero-length formats.Warn when __builtin_frame_address or __builtin_return_address is used unsafely.-Wframe-larger-than= Warn if a function's stack frame requires in excess of .Warn when attempting to free a non-heap object.Warn if loops have been interchanged.Warn about function call elimination.Does nothing. Preserved for backward compatibility.Warn when the field in a struct is not aligned.Warn whenever attributes are ignored.Warn whenever type qualifiers are ignored.Warn about implicit declarations.Warn when a switch case falls through.-Wimplicit-function-declarationWarn about implicit function declarations.Warn when a declaration does not specify a type.Warn about calls with implicit interface.Warn about called procedures not explicitly declared.Warn when a base is inaccessible in derived due to ambiguity.Warn when there is a conversion between pointers that have incompatible types.Warn about C++11 inheriting constructors when the base has a variadic constructor.Warn about uses of std::initializer_list that can result in dangling pointers.Warn about variables which are initialized to themselves.Warn when an inlined function cannot be inlined.Warn about incompatible integer to pointer and pointer to integer conversions.Warn for suspicious integer expressions in boolean context.Warn when there is a cast to a pointer from an integer of a different size.Warn about constant integer divisions with truncated results.Warn if a user-procedure has the same name as an intrinsic.Warn on intrinsics not part of the selected standard.Warn about macros that have conflicting header units definitions.Warn when an atomic memory model parameter is known to be outside the valid range.Warn about invalid uses of the "offsetof" macro.Warn about PCH files that are found but not used.Warn when a jump misses a variable initialization.-Wlarger-than= Warn if an object's size exceeds .Warn about truncated source lines.Warn when a string or character literal is followed by a ud-suffix which does not begin with an underscore.Warn when logical not is used on the left hand side operand of a comparison.Warn when a logical operator is suspiciously always evaluating to true or false.Do not warn about using "long long" when -pedantic.During link time optimization warn about mismatched types of global declarations.Warn about suspicious declarations of "main".Warn about maybe uninitialized automatic variables.Warn about suspicious calls to memset where the third argument contains the number of elements not multiplied by the element size.Warn about suspicious calls to memset where the third argument is constant literal zero and the second is not.Warn when the indentation of the code does not reflect the block structure.Warn for deallocation calls with arguments returned from mismatched allocation functions.Warn for mismatches between calls to operator new or delete and the corresponding call to the allocation or deallocation function.Warn when a class is redeclared or referenced using a mismatched class-key.Warn about declarations of entities that may be missing attributes that related entities have been declared with.Warn about possibly missing braces around initializers.Warn about global functions without previous declarations.Warn about missing fields in struct initializers.Warn about user-specified include directories that do not exist.Warn that the lower bound of a missing index will be used.Warn about function parameters declared without a type specifier in K&R-style functions.Warn in case profiles in -fprofile-use do not exist.Warn about global functions without prototypes.Warn about use of multi-character character constants.Warn on direct multiple inheritance.Warn about unsafe macros expanding to multiple statements used as a body of a clause such as if, else, while, switch, or for.Warn about narrowing conversions within { } that are ill-formed in C++11.Warn about "extern" declarations not at file scope.Disable Walloc-size-larger-than= warning. Equivalent to Walloc-size-larger-than= or larger.Disable Walloca-larger-than= warning. Equivalent to Walloca-larger-than= or larger.Disable -Wframe-larger-than= warning. Equivalent to -Wframe-larger-than= or larger.Disable -Wlarger-than= warning. Equivalent to -Wlarger-than= or larger.Disable Wstack-usage= warning. Equivalent to Wstack-usage= or larger.Disable Wvla-larger-than= warning. Equivalent to Wvla-larger-than= or larger.Warn when a noexcept expression evaluates to false even though the expression can't actually throw.Warn if C++17 noexcept function type will change the mangled name of a symbol.Warn when non-templatized friend functions are declared within a template.Warn about non-virtual destructors.Warn about NULL being passed to argument slots marked as requiring non-NULL.Warn if comparing pointer parameter with nonnull attribute with NULL.-Wnormalized=[none|id|nfc|nfkc] Warn about non-normalized Unicode strings.Warn if dereferencing a NULL pointer may lead to erroneous or undefined behavior.Warn if a class interface has no superclass. Root classes may use an attribute to suppress this warning.Warn about some C++ One Definition Rule violations during link time optimization.Warn if a C-style cast is used in a program.Warn for obsolescent usage in a declaration.Warn if an old-style parameter definition is used.Warn if a simd directive is overridden by the vectorizer cost model.Warn about overflow in arithmetic expressions.Warn if a string is longer than the maximum portable length specified by the standard.Warn about overloaded virtual function names.Warn about overriding initializers without side effects.Warn about overriding initializers with side effects.Warn that -fno-automatic may break recursion.Warn when the packed attribute has no effect on struct layout.Warn about packed bit-fields whose offset changed in GCC 4.4.Warn when fields in a struct with the packed attribute are misaligned.Warn when padding is required to align structure members.Warn about possibly missing parentheses.Issue warnings needed for strict compliance to the standard.Warn about calling std::move on a local object in a return statement preventing copy elision.Warn for placement new expressions with undefined behavior.Warn when converting the type of pointers to member functions.Warn about function pointer arithmetic.Warn when a pointer is compared with a zero character constant.Warn when a pointer differs in signedness in an assignment.Warn when a pointer is cast to an integer of a different size.Warn about misuses of pragmas.Warn if constructor or destructors with priorities from 0 to 100 are used.Warn if a property for an Objective-C object has no assign semantics specified.Warn if inherited methods are unimplemented.Warn when a range-based for-loop is creating unnecessary copies.Warn about real-literal-constants with 'q' exponent-letter.Warn when a left-hand-side array variable is reallocated.Warn when a left-hand-side variable is reallocated.Warn about multiple declarations of the same object.Warn about redundant calls to std::move.Warn when a class or enumerated type is referenced using a redundant class-key.Warn about uses of register storage specifier.Warn when the compiler reorders code.Warn when an argument passed to a restrict-qualified parameter aliases with another argument.Warn about returning a pointer/reference to a local or temporary variable.Warn whenever a function's return type defaults to "int" (C), or about inconsistent return types (C++).Warn on suspicious constructs involving reverse scalar storage order.Warn if a selector has multiple methods.Warn about possible violations of sequence point rules.Warn when one variable shadows another. Same as -Wshadow=global.Warn if a local declaration hides an instance variable.Warn when one local variable shadows another local variable or parameter of compatible type.Warn when one variable shadows another (globally).Warn when one local variable shadows another local variable or parameter.Warn if shift count is negative.Warn if shift count >= width of type.Warn if left shifting a negative value.Warn if left shift of a signed value overflows.Warn about signed-unsigned comparisons.Warn for implicit type conversions between signed and unsigned integers.Warn when overload promotes from unsigned to signed.Warn about missing sized deallocation functions.Warn when sizeof is applied on a parameter declared as an array.Warn about divisions of two sizeof operators when the first one is applied to an array and the divisor does not equal the size of the array element.Warn about suspicious divisions of two sizeof expressions that don't work correctly with pointers.Warn about suspicious length parameters to certain string functions if the argument uses sizeof.Warn from speculative compiles such as __traits(compiles).Warn when not issuing stack smashing protection for some reason.-Wstack-usage= Warn if stack usage might exceed .Warn about code which might break strict aliasing rules.Warn about uncasted NULL used as sentinel.Warn about optimizations that assume that signed overflow is undefined.Warn about unprototyped function declarations.Warn if type signatures of candidate methods do not match exactly.Warn about calls to strcmp and strncmp used in equality expressions that are necessarily true or false due to the length of one and size of the other argument.Warn about buffer overflow in string manipulation functions like memcpy and strcpy.Under the control of Object Size type, warn about buffer overflow in string manipulation functions like memcpy and strcpy.Warn about reading past the end of a source array in string manipulation functions like memchr and memcpy.Warn about truncation in string manipulation functions like strncat and strncpy.Warn if a class type has a base or a field whose type uses the anonymous namespace or depends on a type with no linkage.Warn about functions which might be candidates for __attribute__((cold)).Warn about functions which might be candidates for __attribute__((const)).Warn about functions which might be candidates for format attributes.Warn about functions which might be candidates for __attribute__((malloc)).Warn about functions which might be candidates for __attribute__((noreturn)).Warn about functions which might be candidates for __attribute__((pure)).Warn about C++ virtual methods where adding final keyword would improve code quality.Warn about C++ polymorphic types where adding final keyword would improve code quality.Suggest that the override keyword be used when the declaration of a virtual function overrides another.Warn about "suspicious" constructs.Warn about enumerated switches, with no default, missing a case.Warn about switches with boolean controlling expression.Warn about enumerated switches missing a "default:" statement.Warn about all enumerated switches missing a specific case.Warn about switch values that are outside of the switch's type range.Warn about statements between switch's controlling expression and the first case.Warn when __sync_fetch_and_nand and __sync_nand_and_fetch built-in functions are used.Deprecated. This switch has no effect.Do not suppress warnings from system headers.Permit nonconforming uses of the tab character.Warn if the pointer in a pointer assignment might outlive its target.Warn if a comparison always evaluates to true or false.Warn on primary template declaration.Warn if a throw expression will always result in a call to terminate().Warn about features not present in traditional C.Warn of prototypes causing type conversions different from what would happen in the absence of prototype.Warn whenever a trampoline is generated.Warn if trigraphs are encountered that might affect the meaning of the program.Warn about unsupported features in ThreadSanitizer.Warn if a comparison is always true or always false due to the limited range of the data type.Warn about @selector()s without previously declared methods.Warn if an undefined macro is used in an #if directive.Warn about an invalid DO loop.Warn about underflow of numerical constant expressions.Warn about uninitialized automatic variables.Warn about unrecognized pragmas.Warn about unsuffixed float constants.Enable all -Wunused- warnings.Warn when a function parameter is only set, otherwise unused.Warn when a variable is only set, otherwise unused.Warn when a const variable is unused.Warn about unused dummy arguments.Warn when a function is unused.Warn when typedefs locally defined in a function are not used.Warn about macros defined in the main file that are not used.Warn when a function parameter is unused.Warn if a caller of a function, marked with attribute warn_unused_result, does not use its return value.Warn when an expression value is unused.Warn when a variable is unused.Warn about USE statements that have no ONLY qualifier.Warn about questionable usage of the macros used to retrieve variable arguments.Warn about using variadic macros.-Wvector-operation-performanceWarn when a vector operation is compiled outside the SIMD.Warn about the most vexing parse syntactic ambiguity.Warn on direct virtual inheritance.Warn if a virtual base has a non-trivial move assignment operator.Warn if a variable length array is used.-Wvla-larger-than= Warn on unbounded uses of variable-length arrays, and on bounded uses of variable-length arrays whose bound can be larger than bytes.Warn about mismatched declarations of VLA parameters.Warn about deprecated uses of volatile qualifier.Warn when a register variable is declared volatile.In C++, nonzero means warn about deprecated conversion from string literals to 'char *'. In C, similar warning, except that the conversion is of course not deprecated by the ISO C standard.-Wzero-as-null-pointer-constantWarn when a literal '0' is used as null pointer.Warn about accesses to interior zero-length array members.Warn about zero-trip DO loops.-Xf Write JSON output to the given .A synonym for -std=c89 (for C) or -std=c++98 (for C++).-aux-info Emit declaration information into .-d Enable dumps from specific passes of the compiler.Debug library to use instead of phobos.Default library to use instead of phobos.Dump only the defined symbols.Do link the standard D startup files in the compilation.-dumpbase Set the file basename to be used for dumps.-dumpbase-ext . Drop a trailing . from the dump basename to name auxiliary output files.-dumpdir Set the directory name to be used for dumps.Generate position-independent code if possible (large mode).Generate position-independent code for executables if possible (large mode).The version of the C++ ABI used for -Wabi warnings and link compatibility aliases.The version of the C++ ABI in use.Enforce class member access control semantics.-fada-spec-parent=unit Dump Ada specs as child units of given parent.-faggressive-function-eliminationEliminate multiple function invocations also for impure functions.-faggressive-loop-optimizationsAggressively optimize loops using language constraints.Enable alignment of COMMON blocks.Align labels which are only reached by jumping.Support C++17 allocation of over-aligned types.-faligned-new= Use C++17 over-aligned type allocation for alignments greater than N.Generate code for all template instantiations.All intrinsics procedures are available regardless of selected standard.Tell DCE to remove unused C++ allocations.Accept argument mismatches in procedure calls.Allow a BOZ literal constant to appear in an invalid context and with X instead of Z.-fallow-parameterless-variadic-functionsAllow variadic functions without named parameter.Allow the compiler to introduce new data races on stores.Approximate the effect of function calls to simplify analysis.Restrict the analyzer to run just the named checker.Verify that paths are feasible when emitting diagnostics.Avoid combining multiple statements into one exploded edge.-fanalyzer-show-duplicate-countIssue a note when diagnostics are deduplicated.Merge similar-enough states during analysis.Purge unneeded state during analysis.Enable transitivity of constraints during analysis.Emit more verbose descriptions of control flow in diagnostics.-fanalyzer-verbose-state-changesEmit more verbose descriptions of state changes in diagnostics.Control which events are displayed in diagnostic paths.-fasan-shadow-offset= Use custom shadow memory offset.Generate code for assert contracts.Allow optimization for floating-point arithmetic which may change the result of the operation due to rounding.Assume we are finalizing for phsa and its libhsail-rt. Enables additional phsa-specific optimizations (default).Generate unwind tables that are exact at each instruction boundary.Generate auto-inc/dec instructions.Use sample profile information for call graph node weights. The default profile file is fbdata.afdo in 'pwd'.Use sample profile information for call graph node weights. The profile file is specified in the argument.Do not treat local variables and COMMON blocks as if they were named in SAVE statements.Specify that backslash in string introduces an escape character.Produce a backtrace when a runtime error is encountered.Use bit tests for sufficiently large switch statements.-fblas-matmul-limit= Size of the smallest matrix for which matmul will use BLAS.Generate code to check bounds before indexing arrays.-fbounds-check=[on|safeonly|off] Turn array bounds checks on, in @safe code only, or off.Replace add, compare, branch with branch on count register.Use profiling information for branch probabilities.-fbranch-target-load-optimize2Generate C prototypes from BIND(C) declarations.Generate C prototypes from non-BIND(C) external procedure definitions.-fcall-saved- Mark as being preserved across functions.-fcall-used- Mark as being corrupted by function calls.Save registers around function calls.Output callgraph information on a per-file basis.Output callgraph information on a per-file basis with decorations.Where shorter, use canonicalized paths to systems headers.-fcf-protection=[full|branch|return|none|check] Instrument functions with checks to verify jump/call/return control-flow transfer instructions have valid targets.Enable the char8_t fundamental type and use it as the type for UTF-8 string and character literals.Produce a warning at runtime if a array temporary has been created for a procedure argument.This switch is deprecated; do not use.Check the return value of new in C++.-fcheck=[...] Specify which runtime checks are to be performed.Perform internal consistency checkings.-fchkp-first-field-has-own-bounds-fchkp-flexible-struct-trailing-arrays-fchkp-narrow-to-innermost-array-fchkp-treat-zero-dynamic-size-as-infinite-fchkp-use-fast-string-functions-fchkp-use-nochk-string-functions-fchkp-use-static-const-bounds-fchkp-zero-input-bounds-for-mainRemoved in GCC 8. This switch has no effect.-fcoarray= Specify which coarray parallelization should be used.Looks for opportunities to reduce stack adjustments and stack references.Put uninitialized globals in the common section.Run only the second compilation of -fcompare-debug.-fcompare-debug[=] Compile with and without e.g. -gtoggle, and compare the final-insns dump.Perform comparison elimination after register allocation has finished.Enable support for C++ concepts.Specify maximum error replay depth during recursive diagnosis of a constraint satisfaction failure.Enable certain features present in the Concepts TS.Allow the arguments of the '?' operator to have different types.Do not perform optimizations increasing noticeably stack usage.-fconst-string-class= Use class for constant strings.no class name specified with %qs-fconstexpr-cache-depth= Specify maximum constexpr recursion cache depth.-fconstexpr-depth= Specify maximum constexpr recursion depth.-fconstexpr-loop-limit= Specify maximum constexpr loop iteration count.-fconstexpr-ops-limit= Specify maximum number of constexpr operations during a single constexpr evaluation.-fconvert= The endianness used for unformatted files.Enable C++ coroutines (experimental).Perform a register copy-propagation optimization pass.Use the Cray Pointer extension.Perform cross-jumping optimization.When running CSE, follow jumps to their targets.Complex multiplication and division follow Fortran rules.Omit range reduction step when performing complex division.Ignore 'D' in column one in fixed form.Treat lines with 'D' in column one as comments.Place data items into their own section.List all available debugging counters with their limits and counts.-fdbg-cnt=[:-][:-:...][,:...] Set the debug counter limit.Use the RTL dead code elimination pass.Issue debug information for compiler-generated auxiliary variables.Emit debug annotations during preprocessing.-fdebug-prefix-map== Map one directory name to another in debug information.Output .debug_types section when using DWARF v4 debuginfo.-fdebug= Compile in debug code, code <= , or code identified by .Enable all DEC language extensions.Enable the addition of missing indexes using their lower bounds.Enable the use of blank format items in format strings.Enable the use of character literals in assignments and data statements for non-character variables.Allow varibles to be duplicated in the type specification matches.Enable default widths for i, f and g format specifiers.Enable legacy parsing of INCLUDE as statement.Enable kind-specific variants of integer intrinsic functions.Enable legacy math intrinsics for compatibility.Enable support for non-integer substring indexes.Enable support for non-logical expressions in if statements.Enable support for old style initializers in derived types.Enable support for per variable kind specification.Add support for type promotion in intrinsic arguments.Add the SEQUENCE attribute by default if it's not present.Enable DEC-style STATIC and AUTOMATIC attributes.Enable support for DEC STRUCTURE/RECORD.Factor complex constructors and destructors to favor space over speed.Set the default double precision kind to an 8 byte wide type.Set the default integer kind to an 8 byte wide type.Set the default real kind to an 10 byte wide type.Set the default real kind to an 16 byte wide type.Set the default real kind to an 8 byte wide type.Defer popping functions args from stack until later.Attempt to fill delay slots of branch instructions.Delete dead instructions that may throw exceptions.Delete useless null pointer checks.Try to convert virtual calls to direct ones.Stream extra data to support more aggressive devirtualization in LTO local transformation mode.Perform speculative devirtualization.-fdiagnostics-color=[never|always|auto] Colorize diagnostics.-fdiagnostics-column-origin= Set the number of the first column. The default is 1-based as per GNU style, but some utilities may expect 0-based, for example.-fdiagnostics-column-unit=[display|byte] Select whether column numbers are output as display columns (default) or raw bytes.-fdiagnostics-format=[text|json] Select output format.Print fix-it hints to stderr in unified diff format.-fdiagnostics-minimum-margin-width=Set minimum width of left margin of source code when showing source.-fdiagnostics-parseable-fixitsPrint fix-it hints in machine-readable form.Specify how to print any control-flow path associated with a diagnostic.Turn off any diagnostics features that complicate the output, such as line numbers, color, and warning URLs.Show the source line with a caret indicating the column.Print CWE identifiers for diagnostic messages, where available.Show labels annotating ranges of source code when showing source.-fdiagnostics-show-line-numbersShow line numbers in the left margin when showing source.-fdiagnostics-show-location=[once|every-line] How often to emit source location at the beginning of line-wrapped diagnostics.Amend appropriate diagnostic messages with the command line option that controls them.-fdiagnostics-show-path-depthsShow stack depths of events in paths.-fdiagnostics-show-template-treePrint hierarchical comparisons when template types are mismatched.-fdiagnostics-urls=[never|always|auto] Embed URLs in diagnostics.-fdisable-[tree|rtl|ipa]-=range1+range2 Disable an optimization pass.-fdoc-dir= Write documentation file to directory .-fdoc-file= Write documentation to .-fdoc-inc= Include a Ddoc macro .Allow dollar signs in entity names.Permit '$' as an identifier character.Assume that standard D runtime libraries and "D main" exist.Use the RTL dead store elimination pass.-fdump- Dump various compiler internals to a file.Write all declarations as Ada code transitively.Write all declarations as Ada code for the given file only.Dump various analyzer internals to SRCFILE.analyzer.txt.Dump analyzer-specific call graph information to a SRCFILE.callgraph.dot file.-fdump-analyzer-exploded-graphDump the analyzer exploded graph to a SRCFILE.eg.dot file.-fdump-analyzer-exploded-nodesEmit diagnostics showing the location of nodes in the exploded graph.-fdump-analyzer-exploded-nodes-2Dump a textual representation of the exploded graph to SRCFILE.eg.txt.-fdump-analyzer-exploded-nodes-3Dump a textual representation of the exploded graph to SRCFILE.eg-ID.txt.Dump various analyzer internals to SRCFILE.*.fg.dot and SRCFILE.*.tg.dot.Dump analyzer-specific data to a SRCFILE.analyzer.json.gz file.Dump state-purging information to a SRCFILE.state-purge.dot file.Dump various analyzer internals to stderr.Dump the analyzer supergraph to a SRCFILE.supergraph.dot file.Display the frontend AST after parsing and semantic passes.-fdump-final-insns=filename Dump to filename the insns at the end of translation.Display the global symbol table after parsing.Display the code tree after front end optimization.Display the code tree after parsing.-fdump-go-spec=filename Write all declarations to file as Go code.Dump detailed information on GCC's internal representation of source code locations.Suppress output of addresses in debugging dumps.Display the code tree after parsing; deprecated option.Dump Source Coverage Obligations.Suppress output of instruction numbers, line number notes and addresses in debugging dumps.Suppress output of previous and next insn numbers in debugging dumps.Enable CFI tables via GAS assembler directives.Do not elide common elements in template comparisons.-feliminate-unused-debug-symbolsPerform unused symbol elimination in debug info.-feliminate-unused-debug-typesPerform unused type elimination in debug info.Do not suppress C++ class debug information.-femit-struct-debug-baseonly Aggressive reduced debug info for structs.-femit-struct-debug-detailed= Detailed reduced debug info for structs.-femit-struct-debug-reduced Conservative reduced debug info for structs.-fenable-[tree|rtl|ipa]-=range1+range2 Enable an optimization pass.Generate code to check exception specifications.-fexcess-precision=[fast|standard] Specify handling of excess floating-point precision.-fexec-charset= Convert all strings and character constants to character set .Perform a number of minor, expensive optimizations.Interpret imaginary, fixed-point, or other gnu number suffix as the corresponding number literal rather than a user-defined number literal.Permit universal character names (\u and \U) in identifiers.Support dynamic initialization of thread-local variables in a different translation unit.Specify that an external BLAS library should be used for matmul calls on large-size arrays.Output lto objects containing both the intermediate language and binary output.-ffile-prefix-map== Map one directory name to another in compilation result.Assume that loops with an exit will terminate and not loop indefinitely.Assume no NaNs or infinities are generated.-ffixed- Mark as being unavailable to the compiler.Assume that the source file is fixed form.-ffixed-line-length- Use n as character line width in fixed mode.Allow arbitrary character line width in fixed mode.Don't allocate floats and doubles in extended-precision registers.Perform a forward propagation pass on RTL.-ffp-contract=[off|on|fast] Perform floating-point expression contraction.Allow built-in functions ceil, floor, round, trunc to raise "inexact" exceptions.-ffpe-summary=[...] Print summary of floating point exceptions.-ffpe-trap=[...] Stop on following floating point exceptions.Assume that the source file is free form.-ffree-line-length- Use n as character line width in free mode.Allow arbitrary character line width in free mode.Do not assume that standard C libraries and "main" exist.Try to interchange loops if profitable.Enable front end optimization.Allow function addresses to be held in registers.Place each function into its own section.Perform global common subexpression elimination.Perform global common subexpression elimination after register allocation has finished.Perform redundant load after store elimination in global common subexpression elimination.Perform enhanced load motion during global common subexpression elimination.Perform store motion after global common subexpression elimination.-fgnat-encodings=[all|gdb|minimal] Select the balance between GNAT encodings and standard DWARF emitted in the debug information.Recognize GNU-defined keywords.Generate code for GNU runtime environment.Enable support for GNU transactional memory.Use STB_GNU_UNIQUE if supported by the assembler.Use traditional GNU semantics for inline functions.-fgo-c-header= Write Go struct definitions to file as C code.Add explicit checks for division overflow in INT_MIN / -1.Add explicit checks for division by zero.Apply special rules for compiling runtime package.Emit debugging information related to the escape analysis pass when run with -fgo-optimize-allocs.-fgo-debug-escape-hash= Hash value to debug escape analysis.Emit optimization diagnostics.-fgo-dump- Dump Go frontend internal information.-fgo-embedcfg= List embedded files via go:embed.-fgo-optimize- Turn on optimization passes in the frontend.-fgo-pkgpath= Set Go package path.-fgo-prefix= Set package-specific prefix for exported Go names.-fgo-relative-import-path= Treat a relative import as relative to path.Enable in and out of Graphite representation.Enable Graphite Identity transformation.Enable guessing of branch probabilities.%<-fhandle-exceptions%> has been renamed %<-fexceptions%> (and is now on by default)Enable hoisting adjacent loads to encourage generating conditional move instructions.Assume normal C execution environment.Perform conversion of conditional jumps to branchless equivalents.Perform conversion of conditional jumps to conditional execution.Export functions even if they can be inlined.Emit implicit instantiations of inline templates.Specify that no implicit typing is allowed, unless overridden by explicit IMPLICIT statements.Emit implicit instantiations of templates.Do not generate .size directives.-finit-character= Initialize local character variables to ASCII value n.Initialize components of derived type variables according to other init flags.-finit-integer= Initialize local integer variables to n.Initialize local variables to zero (from g77).-finit-logical= Initialize local logical variables.-finit-real= Initialize local real variables.Enable inlining of function declared "inline", disabling disables all inlining.-finline-arg-packing Perform argument packing inline.Inline __atomic operations when a lock free instruction sequence is available.Integrate functions not declared "inline" into their callers when profitable.-finline-functions-called-onceIntegrate functions only required by their single caller.-finline-limit= Limit the size of inlined functions to .-finline-matmul-limit= Specify the size of the largest matrix for which matmul will be inlined.Integrate functions into their callers when code size is known not to grow.-finput-charset= Specify the default character set for source files.Instrument function entry and exit with profiling calls.-finstrument-functions-exclude-file-list=-finstrument-functions-exclude-file-list=filename,... Do not instrument functions listed in files.-finstrument-functions-exclude-function-list=-finstrument-functions-exclude-function-list=name,... Do not instrument listed functions.Interpret any INTEGER(4) as an INTEGER(8).Specify where to find the compiled intrinsic modules.Generate code for class invariant contracts.Perform interprocedural bitwise constant propagation.Perform interprocedural constant propagation.Perform cloning to make Interprocedural constant propagation stronger.Perform Identical Code Folding for functions and read-only variables.Perform Identical Code Folding for functions.Perform Identical Code Folding for variables.Perform interprocedural modref analysis.Perform interprocedural profile propagation.Perform interprocedural points-to analysis.Discover pure and const functions.Use caller save register across calls if possible.Discover read-only and non addressable static variables.Discover read-only, write-only and non-addressable static variables.Perform interprocedural reduction of aggregates.Reduce stack alignment on call sites if possible.Perform IPA Value Range Propagation.-fira-algorithm=[CB|priority] Set the used IRA algorithm.Use IRA based register pressure calculation in RTL hoist optimizations.Use IRA based register pressure calculation in RTL loop optimizations.-fira-region=[one|all|mixed] Set regions for IRA.Share slots for saving different hard registers.Share stack slots for spilled pseudo-registers.-fira-verbose= Control IRA's level of diagnostic messages.-fisolate-erroneous-paths-attributeDetect paths that trigger erroneous or undefined behavior due to a null value being used in a way forbidden by a returns_nonnull or nonnull attribute. Isolate those paths from the main control flow and turn the statement with erroneous or undefined behavior into a trap.-fisolate-erroneous-paths-dereferenceDetect paths that trigger erroneous or undefined behavior due to dereferencing a null pointer. Isolate those paths from the main control flow and turn the statement with erroneous or undefined behavior into a trap.-fvisibility=[private|protected|public|package] Set the default symbol visibility.Optimize induction variables on trees.Use jump tables for sufficiently large switch statements.Don't emit dllexported inline functions unless needed.Generate code for functions even if they are fully inlined.Emit static const variables even if they are not used.Generate code for static functions even if they are never called.Note #include directives translated to import declarations.-flang-info-include-translate-notNote #include directives not translated to import declarations, and not known to be textual.-flang-info-include-translate=Note a #include translation of a specific header.Note Compiled Module Interface pathnames.Note Compiled Module Interface pathname of a specific module or header-unit.Improve GCC's ability to track column numbers in large source files, at the expense of slower compilation.Allow implicit conversions between vectors with differing numbers of subparts and/or differing element types.Give external symbols a leading underscore.Tell DSE that the storage for a C++ object is dead when the constructor starts and when the destructor finishes.Set linker output type (used internally during LTO optimization).-flive-patching=[inline-only-static|inline-clone] Control IPA optimizations to provide a safe compilation for live-patching. At the same time, provides multiple-level control on the enabled IPA optimizations.Relief of register pressure through live range shrinkage.Allow access to instance variables as if they were local declarations within instance method implementations.Convert from integer to logical or logical to integer for arithmetic operations.Enable loop nest transforms. Same as -floop-nest-optimize.Enable loop interchange on trees.Enable the loop nest optimizer.Perform unroll-and-jam on loops.Do CFG-sensitive rematerialization in LRA.Enable link-time optimization.-flto-compression-level= Use zlib/zstd compression level for IL.Specify the algorithm to partition symbols and vars at linktime.Report various link-time optimization statistics.Report various link-time optimization statistics for WPA only.Link-time optimization with number of parallel jobs or jobserver.Run the link-time optimizer in local transformation (LTRANS) mode.Specify a file to which a list of files output by LTRANS is written.-fmacro-prefix-map== Map one directory name to another in __FILE__, __BASE_FILE__, and __builtin_FILE().Generate a default D main() function when compiling.Set errno after built-in math functions.-fmax-array-constructor= Maximum number of objects in an array constructor.-fmax-errors= Maximum number of errors to report.-fmax-identifier-length= Maximum identifier length.fmax-include-depth= Set the maximum depth of the nested #include.-fmax-stack-var-size= Size in bytes of the largest array that will be put on the stack.-fmax-subrecord-length= Maximum length for subrecords.Report on permanent memory allocation.Report on permanent memory allocation in WPA only.Attempt to merge identical constants and constant variables.Attempt to merge identical constants across compilation units.Attempt to merge identical debug strings across compilation units.-fmessage-length= Limit diagnostics to characters per line. 0 suppresses line-wrapping.-fmodule-file== use as source file for .Enable C++ header module (experimental).Member functions defined within their class are inline in module purview.Mapper for module to CMI files.Only emit Compiled Module Interface.Set default accessibility of module entities to PRIVATE.Generate ModuleInfo struct for output module.Enable C++ modules-ts (experimental).Perform SMS based modulo scheduling before the first scheduling pass.Perform SMS based modulo scheduling with register moves allowed.Move loop invariant computations out of loops.Don't warn about uses of Microsoft extensions.Implement C++17 inheriting constructor semantics.Implement resolution of DR 150 for matching of template template arguments.Generate code for NeXT (Apple Mac OS X) runtime environment.Assume that receivers of Objective-C messages may be nil.Support synchronous non-call exceptions.Treat a throw() exception specification as noexcept to improve code size.Specify which ABI to use for Objective-C family code and meta-data generation.Generate special Objective-C methods to initialize/destroy non-POD C++ ivars, if needed.Allow fast jumps to the message dispatcher.Enable Objective-C exception and synchronization syntax.Enable garbage collection (GC) in Objective-C/Objective-C++ programs.Enable inline checks for nil receivers with the NeXT runtime and ABI version 2.Enable Objective-C setjmp exception handling runtime.Conform to the Objective-C 1.0 language as implemented in GCC 4.0.-foffload-abi=[lp64|ilp32] Set the ABI to use in an offload compiler.-foffload== Specify offloading targets and options for them.options or targets missing after %qsWhen possible do not generate stack frames.Process all modules specified on the command line, but only generate code for the module specified by the argument.Specify default OpenACC compute dimensions.Enable OpenMP (implies -frecursive in Fortran).Enable OpenMP's SIMD directives.Recognize C++ keywords like "compl" and "xor".Enable all optimization info dumps on stderr.-fopt-info[-=filename] Dump compiler optimization details.Optimize sibling and tail recursive calls.Enable string length optimizations on trees.Try to lay out derived types as compactly as possible.Pack structure members together without holes.-fpack-struct= Set initial maximum structure member alignment.Pad shorter fixed form lines to line width with spaces.Insert NOP instructions at each function entry.Return small aggregates in memory, not registers.Look for and use PCH files even when preprocessing.Enable machine specific peephole optimizations.Enable an RTL peephole pass before sched2.Downgrade conformance errors to warnings.-fpermitted-flt-eval-methods=[c11|ts-18661] Specify which values of FLT_EVAL_METHOD are permitted.Generate position-independent code if possible (small mode).Generate position-independent code for executables if possible (small mode).Enable Plan 9 language extensions.Use PLT for PIC calls (-fno-plt: load the address from GOT at call site).-fplugin-arg--[=] Specify argument = for plugin .Report on memory allocation before interprocedural optimization.Generate code for postcondition contracts.Path to header file that should be pre-included before each compilation unit.Generate code for precondition contracts.Run predictive commoning optimization.Generate prefetch instructions, if available, for arrays in loops.Treat the input file as already preprocessed.Do not pretty-print template specializations as the template signature followed by the arguments.Treat known sprintf return values as constants.Enable basic program profiling code.Generate absolute source path names for gcov.Insert arc-based program profiling code.Enable correction of flow inconsistent profile data input.Set the top-level directory for storing the profile data. The default is 'pwd'.Instrument only functions from files whose name does not match any of the regular expressions (separated by semi-colons).Instrument only functions from files whose name matches any of the regular expressions (separated by semi-colons).Enable common options for generating profile info for profile feedback directed optimizations.Enable common options for generating profile info for profile feedback directed optimizations, and set -fprofile-dir=.Register the profile information in the .gcov_info section instead of using a constructor/destructor.Register the profile information in the specified section instead of using a constructor/destructor.Select the name for storing the profile note file.Do not assume that functions never executed during the train run are cold.Remove prefix from absolute path before mangling name for -fprofile-generate= and -fprofile-use=.Enable function reordering that improves code placement.Report on consistency of profile.-fprofile-reproducible=[serial|parallel-runs|multithreaded] Control level of reproducibility of profile gathered by -fprofile-generate.-fprofile-update=[single|atomic|prefer-atomic] Set the profile update method.Enable common options for performing profile feedback directed optimizations.Enable common options for performing profile feedback directed optimizations, and set -fprofile-dir=.Insert code to profile values of expressions.Protect parentheses in expressions.-frandom-seed= Make compile reproducible using .Enable range checking during compilation.Interpret any REAL(4) as a REAL(10).Interpret any REAL(4) as a REAL(16).Interpret any REAL(4) as a REAL(8).Interpret any REAL(8) as a REAL(10).Interpret any REAL(8) as a REAL(16).Interpret any REAL(8) as a REAL(4).Reallocate the LHS in assignments.Same as -fassociative-math for expressions which include division.Record gcc command line switches in the object file.Use a 4-byte record marker for unformatted files.Use an 8-byte record marker for unformatted files.Allocate local variables on the stack to allow indirect recursion.Turn on Redundant Extensions Elimination pass.Return small aggregates in registers.Perform a register renaming optimization pass.Reorder basic blocks to improve code placement.-freorder-blocks-algorithm=[simple|stc] Set the used basic block reordering algorithm.-freorder-blocks-and-partitionReorder basic blocks and partition into hot and cold sections.Reorder functions to improve code placement.Copy array sections into a contiguous block on procedure entry.Used in Fix-and-Continue mode to indicate that object files may be swapped in at runtime.Removed in GCC 10. This switch has no effect.Collect and dump debug information into temporary file if ICE in C/C++ compiler occurred.Functions which return values must end with return statements.Add a common subexpression elimination pass after loop optimizations.-freschedule-modulo-scheduled-loopsEnable/Disable the traditional scheduling in loops that already passed modulo scheduling.Disable optimizations that assume default FP rounding behavior.Generate run time type descriptor information.-fsanitize-address-use-after-scopeSelect type of coverage sanitization.This switch is deprecated; use -fsanitize-recover= instead.After diagnosing undefined behavior attempt to continue execution.-fsanitize-sections= Sanitize global variables in user-defined sections.-fsanitize-undefined-trap-on-errorUse trap instead of a library function for undefined behavior sanitization.Write a SRCFILE.opt-record.json file detailing what optimizations were performed.-fsched-critical-path-heuristicEnable the critical path heuristic in the scheduler.Enable the dependent count heuristic in the scheduler.Enable the group heuristic in the scheduler.Enable scheduling across basic blocks.Enable the last instruction heuristic in the scheduler.Enable register pressure sensitive insn scheduling.Enable the rank heuristic in the scheduler.Allow speculative motion of non-loads.Enable the speculative instruction heuristic in the scheduler.Allow speculative motion of some loads.Allow speculative motion of more loads.Allow premature scheduling of queued insns.Set dependence distance checking in premature scheduling of queued insns.-fsched-stalled-insns-dep= Set dependence distance checking in premature scheduling of queued insns.-fsched-stalled-insns= Set number of queued insns that can be prematurely scheduled.-fsched-verbose= Set the verbosity level of the scheduler.If scheduling post reload, do superblock scheduling.Perform a target dependent instruction fusion optimization pass.Reschedule instructions before register allocation.Reschedule instructions after register allocation.Append a second underscore if the name already contains an underscore.Access data in the same section from shared anchor points.Perform software pipelining of inner loops during selective scheduling.-fsel-sched-pipelining-outer-loopsPerform software pipelining of outer loops during selective scheduling.-fsel-sched-reschedule-pipelinedReschedule pipelined regions without pipelining.Schedule instructions using selective scheduling algorithm.Run selective scheduling after reload.Run self-tests, using the given path to locate test files.Allow interposing function (or variables) by ones with different semantics (or initializer) respectively by dynamic linker.Use the narrowest integer type possible for enumeration types.Force the underlying type for "wchar_t" to be "unsigned short".Show column numbers in diagnostics, when available. Default on.Emit function prologues only before parts of the function that need it, rather than at the top of the function.Shrink-wrap parts of the prologue and epilogue separately.Apply negative sign to zero values.Disable optimizations observable by IEEE signaling NaNs.When "signed" or "unsigned" is not given make the bitfield signed.Make "char" signed by default.Disable floating point optimizations that ignore the IEEE signedness of zero.-fsimd-cost-model=[unlimited|dynamic|cheap|very-cheap] Specifies the vectorization cost model for code marked with a simd directive.Convert floating point constants to single precision constants.Enable C++14 sized deallocation support.Split lifetimes of induction variables when loops are unrolled.Split paths leading to loop backedges.Generate discontiguous stack frames.Split wide types into independent registers.Split wide types into independent registers earlier.Enable backward propagation of use properties at the SSA level.Optimize conditional patterns using SSA PHI nodes.-fsso-struct=[big-endian|little-endian|native] Set the default scalar storage order.Put all local arrays on stack.Insert stack checking code into the program. Same as -fstack-check=specific.-fstack-check=[no|generic|specific] Insert stack checking code into the program.Insert code to probe each page of stack space as it is allocated to protect from stack-clash style attacks.-fstack-limit-register= Trap if the stack goes past .-fstack-limit-symbol= Trap if the stack goes past symbol .Use propolice as a stack protection method.Use a stack protection method for every function.Use stack protection method only for functions with the stack_protect attribute.Use a smart stack protection method for certain functions.-fstack-reuse=[all|named_vars|none] Set stack reuse level for local variables.Output stack usage information on a per-function basis.Display statistics accumulated during compilation.Optimize amount of stdarg registers saved to stack at start of function.Assume strict aliasing rules apply.Assume that values of enumeration type are always within the minimum range of that type.Treat signed overflow as undefined. Negated as -fwrapv -fwrapv-pointer.Force bitfield accesses to match their type width.Follow the C++17 evaluation order requirements for assignment expressions, shift, member function calls, etc.Generate code for switches without a default case.Implement __atomic operations via libcalls to legacy __sync functions.Check for syntax errors, then stop.-ftabstop= Distance between tab stops for column reporting.Disallow tail call optimization when a calling routine may have omitted character lengths.Set the maximum number of template instantiation notes for a single warning or error.-ftemplate-depth= Specify maximum template instantiation depth.Create data files needed by "gcov".Force creation of temporary to test infrequently-executed forall code.Perform jump threading optimizations.-fno-threadsafe-statics Do not generate thread-safe code for initializing local statics.Report the time taken by each compiler pass.Record times taken by sub-phases separately.-ftls-model=[global-dynamic|local-dynamic|initial-exec|local-exec] Set the default thread-local storage code generation model.Reorder top level functions, variables, and asms.Perform superblock formation via tail duplication.-ftrack-macro-expansion=<0|1|2> Track locations of tokens coming from macro expansion and display them in error messages.For targets that normally need trampolines for nested functions, always generate them instead of using descriptors.List information on all language changes.List all usages of complex or imaginary types.Implement DIP1000: Scoped pointers (experimental).Implement DIP25: Sealed references (experimental).List all non-mutable fields which occupy an object instance.List all hidden GC allocations.List all variables going into thread local storage.Assume floating-point operations can trap.Trap for signed overflow in addition, subtraction and multiplication.Enable SSA-BIT-CCP optimization on trees.Enable conditional dead code elimination for builtin calls.Enable SSA-CCP optimization on trees.Enable loop header copying on trees.Enable SSA coalescing of user variables.Enable copy propagation on trees.Transform condition stores into unconditional ones.Enable SSA dead code elimination optimization on trees.Enable dominator optimizations.Enable dead store elimination.Enable forward propagation on trees.Enable Full Redundancy Elimination (FRE) on trees.-ftree-loop-distribute-patternsEnable loop distribution for patterns transformed into a library call.Enable loop distribution on trees.Convert conditional jumps in innermost loops to branchless equivalents.Enable loop invariant motion on trees.Create canonical induction variables in loops.Enable loop optimizations on tree level.Enable loop vectorization on trees.Perform live range splitting during the SSA->normal pass.-ftree-parallelize-loops= Enable automatic parallelization of loops.In SSA-PRE optimization on trees, enable partial-partial redundancy elimination.Enable hoisting loads from conditional pointers.Enable SSA-PRE optimization on trees.Perform function-local points-to analysis on trees.Enable reassociation on tree level.Enable copy propagation of scalar-evolution information.Enable SSA code sinking on trees.Enable basic block vectorization (SLP) on trees.Perform straight-line strength reduction.Perform scalar replacement of aggregates.Perform conversions of switch initializations.Replace temporary expressions in the SSA->normal pass.Enable vectorization on trees.Perform Value Range Propagation on trees.Assume common declarations may be overridden with ones with a larger trailing array.Append underscores to externally visible names.Compile whole compilation unit at a time.Perform loop unrolling for all loops.Perform loop unrolling when iteration count is known.Allow math optimizations that may violate IEEE or ISO standards.When "signed" or "unsigned" is not given make the bitfield unsigned.Make "char" unsigned by default.Just generate unwind tables for exception handling.Use __cxa_atexit to register destructors.Use __cxa_get_exception_ptr in exception handling.Use the bfd linker instead of the default linker.Use the gold linker instead of the default linker.Use the lld LLVM linker instead of the default linker.Perform variable tracking by annotating assignments.-fvar-tracking-assignments-toggleToggle -fvar-tracking-assignments.Perform variable tracking and also tag variables that are uninitialized.-fvariable-expansion-in-unrollerApply variable expansion when loops are unrolled.Enables the dynamic vectorizer cost model. Preserved for backward compatibility.-fvect-cost-model=[unlimited|dynamic|cheap|very-cheap] Specifies the cost model for vectorization.Add extra commentary to assembler output.Version loops based on whether indices have a stride of one.-fversion= Compile in version code >= or identified by .Marks all inlined functions and methods as having hidden visibility.Changes visibility to match Microsoft Visual Studio by default.-fvisibility=[default|internal|hidden|protected] Set the default symbol visibility.Use expression value profiles in optimizations.Validate vtable pointers before using them.Output vtable verification counters.Output vtable verification pointer sets information.Emit common-like symbols as weak symbols.Emit template instantiations as weak symbols.Construct webs and split unrelated uses of single variable.Perform whole program optimizations.-fwide-exec-charset= Convert all wide strings and character constants to character set .Generate a #line directive pointing at the current working directory.Run the link-time optimizer in whole program analysis (WPA) mode.Whole program analysis (WPA) mode with number of parallel jobs specified.Assume signed arithmetic overflow wraps around.Assume pointer overflow wraps around.Clear call-used registers upon function return.Put zero initialized data in the bss section.Generate lazy class lookup (via objc_getClass()) for use in Zero-Link mode.Generate debug information in default format.Assume assembler support for (DWARF2+) .loc directives.Assume assembler support for view in (DWARF2+) .loc directives.Record DW_AT_decl_column and DW_AT_call_column in DWARF.Add description attributes to some DWARF DIEs that have no name attribute.Generate debug information in default version of DWARF format.Generate debug information in DWARF v2 (or later) format.Use 32-bit DWARF format when emitting DWARF debug information.Use 64-bit DWARF format when emitting DWARF debug information.Dump declarations to a .decl file.Generate debug information in default extended format.Generate DWARF pubnames and pubtypes sections with GNU extensions.Dump the statistics of gimple statements.Generate extended entry point information for inlined functions.-ginternal-reset-location-viewsCompute locview reset points based on insn length estimates.-gnat Specify options to GNAT.Set name of output ALI file (internal switch).Don't generate DWARF pubnames and pubtypes sections.Generate DWARF pubnames and pubtypes sections.Record gcc command line switches in DWARF DW_AT_producer.Generate debug information in separate .dwo files.Generate debug information in STABS format.Generate debug information in extended STABS format.Emit progressive recommended breakpoint locations.Don't emit DWARF additions beyond selected version.Toggle debug information generation.Augment variable location lists with progressive views.-gvariable-location-views=incompat5Generate debug information in VMS format.Generate debug information in XCOFF format.Generate debug information in extended XCOFF format.Generate compressed debug sections.-gz= Generate compressed debug sections in format .Dump the dump tool command line options.-idirafter Add to the end of the system include path.-imacros Accept definition of macros in .-imultiarch Set to be the multiarch include subdirectory.-imultilib Set to be the multilib include subdirectory.-include Include the contents of before other files.-iplugindir= Set to be the default plugin directory.-iprefix Specify as a prefix for next two options.-iquote Add to the end of the quote include path.-isysroot Set to be the system root directory.-isystem Add to the start of the system include path.-iwithprefix Add to the end of the system include path.-iwithprefixbefore Add to the end of the main include path.Call the dump function for variables and function in IL.Support 3DNow! built-in functions.Support Athlon 3Dnow! built-in functions.Expand 32bit/64bit integer divide into 8bit unsigned integer divide with run-time check.Generate code that conforms to the given ABI.Support code generation of Advanced Bit Manipulation (ABM) instructions.Reserve space for outgoing arguments in the function prologue.Support flag-preserving add-carry instructions.Support AES built-in functions and code generation.Align some doubles on dword boundary.Function starts are aligned to this power of 2.Jump targets are aligned to this power of 2.Loop code aligned to this power of 2.Align destination of the string operations.Support AMX-BF16 built-in functions and code generation.Support AMX-INT8 built-in functions and code generation.Support AMX-TILE built-in functions and code generation.Generate code for the Android platform.Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2 and AVX built-in functions and code generation.Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX and AVX2 built-in functions and code generation.Split 32-byte AVX unaligned load.-mavx256-split-unaligned-storeSplit 32-byte AVX unaligned store.Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2, AVX512F and AVX5124FMAPS built-in functions and code generation.Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2, AVX512F and AVX5124VNNIW built-in functions and code generation.Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2, AVX512F and AVX512BF16 built-in functions and code generation.Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2, AVX512F and AVX512BITALG built-in functions and code generation.Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2 and AVX512F and AVX512BW built-in functions and code generation.Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2 and AVX512F and AVX512CD built-in functions and code generation.Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2 and AVX512F and AVX512DQ built-in functions and code generation.Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2 and AVX512F and AVX512ER built-in functions and code generation.Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2 and AVX512F built-in functions and code generation.Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2 and AVX512F and AVX512IFMA built-in functions and code generation.Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2 and AVX512F and AVX512PF built-in functions and code generation.Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2 and AVX512F and AVX512VBMI built-in functions and code generation.Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2, AVX512F and AVX512VBMI2 built-in functions and code generation.Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2 and AVX512F and AVX512VL built-in functions and code generation.Support AVX512VNNI built-in functions and code generation.Support AVX512VP2INTERSECT built-in functions and code generation.Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2, AVX512F and AVX512VPOPCNTDQ built-in functions and code generation.Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2, and AVXVNNI built-in functions and code generation.Support BMI built-in functions and code generation.Support BMI2 built-in functions and code generation.Branches are this expensive (arbitrary units).Use libgcc stubs to save and restore registers clobbered by 64-bit Microsoft to System V ABI calls.Turn on CET instrumentation for switch statements that use a jump table and an indirect jump.Generate cld instruction in the function prologue.Support CLDEMOTE built-in functions and code generation.Support CLFLUSHOPT instructions.Support CLZERO built-in functions and code generation.%<-mcpu=%> is deprecated; use %<-mtune=%> or %<-march=%> insteadSupport code generation of crc32 instruction.Support code generation of cmpxchg16b instruction.Do dispatch scheduling if processor is bdver1, bdver2, bdver3, bdver4 or znver1 and Haifa scheduling is selected.Support ENQCMD built-in functions and code generation.Support F16C built-in functions and code generation.Generate sin, cos, sqrt for FPU.Emit profiling counter call at function entry before prologue.Set name of __fentry__ symbol called at function entry.Set name of section to record mrecord-mcount calls.Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX and FMA built-in functions and code generation.Support FMA4 built-in functions and code generation.Always use Dynamic Realigned Argument Pointer (DRAP) to realign stack.Make all function calls indirect.Return values of functions in FPU registers.Generate floating point mathematics using given instruction set.Support FSGSBASE built-in functions and code generation.Convert function return to call and return thunk.%<-mfused-madd%> is deprecated; use %<-ffp-contract=%> insteadSupport FXSAVE and FXRSTOR instructions.Enable vectorization for gather instruction.Generate code which uses only the general registers.Support GFNI built-in functions and code generation.Generate code to mitigate against straight line speculation.Support Hardware Lock Elision prefixes.Support HRESET built-in functions and code generation.Generate code that conforms to Intel MCU psABI.Use IEEE math for fp comparisons.Assume incoming stack aligned to this power of 2.Add CS prefix to call and jmp to indirect thunk with branch target in r8-r15 registers.Force indirect call and jump via register.Convert indirect call and jump to call and return thunks.Inline all known string operations.-minline-stringops-dynamicallyInline memset/memcpy string operations, but perform inline version only for small blocks.Instrument function exit in instrumented functions with __fentry__.%<-mintel-syntax%> and %<-mno-intel-syntax%> are deprecated; use %<-masm=intel%> and %<-masm=att%> insteadSupport KL built-in functions and code generation.-mlarge-data-threshold= Data greater than given threshold will go into .ldata section in x86-64 medium model.Support LWP built-in functions and code generation.Support LZCNT built-in function and code generation.Insert ENDBR instruction at function entry only via cf_check attribute for CET instrumentation.Specify memcpy expansion strategy when expected size is known.Specify memset expansion strategy when expected size is known.Support MMX built-in functions.Support code generation of movbe instruction.Support MOVDIR64B built-in functions and code generation.Support MOVDIRI built-in functions and code generation.Use native (MS) bitfield layout.Support MWAIT and MONITOR built-in functions and code generation.Support MWAITX and MONITORX built-in functions and code generation.Emit GNU_PROPERTY_X86_ISA_1_NEEDED GNU property.Do not support SSE4.1 and SSE4.2 built-in functions and code generation.Generate mcount/__fentry__ calls as nops. To activate they need to be patched in.Omit the frame pointer in leaf functions.Set 80387 floating-point precision to 32-bit.Set 80387 floating-point precision to 64-bit.Set 80387 floating-point precision to 80-bit.Support PCLMUL built-in functions and code generation.Support PCONFIG built-in functions and code generation.Support PKU built-in functions and code generation.Support code generation of popcnt instruction.Use 128-bit AVX instructions instead of 256-bit AVX instructions in the auto-vectorizer.Use given register vector width instructions instead of maximum register width in the auto-vectorizer.Attempt to keep stack aligned to this power of 2.Support PREFETCHWT1 built-in functions and code generation.Support PREFETCHW instruction.Support PTWRITE built-in functions and code generation.Use push instructions to save outgoing arguments.Support RDPID built-in functions and code generation.Support RDRND built-in functions and code generation.Generate reciprocals instead of divss and sqrtss.Control generation of reciprocal estimates.Generate __mcount_loc section with all mcount or __fentry__ calls.Generate a __return_loc section pointing to all return instrumentation code.Use red-zone in the x86-64 code.Number of registers used to pass integer arguments.Support RTM built-in functions and code generation.Support code generation of sahf instruction in 64bit x86-64 code.Support SERIALIZE built-in functions and code generation.Support SGX built-in functions and code generation.Support SHA1 and SHA256 built-in functions and code generation.Enable shadow stack built-in functions from Control-flow Enforcement Technology (CET).Skip setting up RAX register when passing variable arguments.Support MMX and SSE built-in functions and code generation.Support MMX, SSE and SSE2 built-in functions and code generation.Encode SSE instructions with VEX prefix.Support MMX, SSE, SSE2 and SSE3 built-in functions and code generation.Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1 and SSE4.2 built-in functions and code generation.Support MMX, SSE, SSE2, SSE3, SSSE3 and SSE4.1 built-in functions and code generation.Support MMX, SSE, SSE2, SSE3 and SSE4A built-in functions and code generation.Use SSE register passing conventions for SF and DF mode.Support MMX, SSE, SSE2, SSE3 and SSSE3 built-in functions and code generation.-mstack-protector-guard-offset=Use the given offset for addressing the stack-protector guard.Use the given base register for addressing the stack-protector guard.-mstack-protector-guard-symbol=Use the given symbol for addressing the stack-protector guard.Use given stack-protector guard.Chose strategy to generate stringop using.Disable Scalar to Vector optimization pass transforming 64-bit integer computations into a vector ones.Support TBM built-in functions and code generation.Use given thread-local storage dialect.Use direct references against %gs when accessing tls data.Support TSXLDTRK built-in functions and code generation.Fine grain control of tune features.Support UINTR built-in functions and code generation.Support VAES built-in functions and code generation.Return 8-byte vectors in memory.Support VPCLMULQDQ built-in functions and code generation.Generate vzeroupper instruction before a transfer of control flow out of the function.Support WAITPKG built-in functions and code generation.Support WBNOINVD built-in functions and code generation.Support WIDEKL built-in functions and code generation.Support XOP built-in functions and code generation.Support XSAVE and XRSTOR instructions.Support XSAVES and XRSTORS instructions.Sort the symbols alphabetically.Don't create a dynamically linked position independent executable.Do not link the standard D library in the compilation.Do not search standard system include directories (those specified with -isystem will still be used).Do not search standard system include directories for C++.Do not look for object files in standard path.-o Place output into .Dump the details of LTO objects.Like -pedantic but issue them as errors.Create a dynamically linked position independent executable.Generate C header of platform-specific features.Print the initial values of the variables.Do not display functions compiled or elapsed time.Remap file names when including files.Display the symbols in reverse order.Link the standard D library dynamically in the compilation.Sort the symbols according to size.Statically link the GNU Fortran helper library (libgfortran).Link the standard D library statically in the compilation.Create a static position independent executable.Conform to the ISO 1998 C++ standard revised by the 2003 technical corrigendum.Deprecated in favor of -std=c++11.Conform to the ISO 2011 C++ standard.Conform to the ISO 2014 C++ standard.Conform to the ISO 2017 C++ standard.Deprecated in favor of -std=c++14.Deprecated in favor of -std=c++17.Conform to the ISO 2020 C++ standard (experimental and incomplete support).Conform to the ISO 2023 C++ draft standard (experimental and incomplete support).Conform to the ISO 2011 C standard.Conform to the ISO 2017 C standard (published in 2018).Deprecated in favor of -std=c11.Conform to the ISO 202X C standard draft (experimental and incomplete support).Conform to the ISO 1990 C standard.Conform to the ISO 1999 C standard.Deprecated in favor of -std=c99.Conform to the ISO Fortran 2003 standard.Conform to the ISO Fortran 2008 standard.Conform to the ISO Fortran 2008 standard including TS 29113.Conform to the ISO Fortran 2018 standard.Conform to the ISO Fortran 95 standard.Conform to nothing in particular.Conform to the ISO 1998 C++ standard revised by the 2003 technical corrigendum with GNU extensions.Deprecated in favor of -std=gnu++11.Conform to the ISO 2011 C++ standard with GNU extensions.Conform to the ISO 2014 C++ standard with GNU extensions.Conform to the ISO 2017 C++ standard with GNU extensions.Deprecated in favor of -std=gnu++14.Deprecated in favor of -std=gnu++17.Conform to the ISO 2020 C++ standard with GNU extensions (experimental and incomplete support).Conform to the ISO 2023 C++ draft standard with GNU extensions (experimental and incomplete support).Conform to the ISO 2011 C standard with GNU extensions.Conform to the ISO 2017 C standard (published in 2018) with GNU extensions.Deprecated in favor of -std=gnu11.Conform to the ISO 202X C standard draft with GNU extensions (experimental and incomplete support).Conform to the ISO 1990 C standard with GNU extensions.Conform to the ISO 1999 C standard with GNU extensions.Deprecated in favor of -std=gnu99.Conform to the ISO 1990 C standard as amended in 1994.Deprecated in favor of -std=iso9899:1999.Accept extensions to support legacy code.-stdlib=[libstdc++|libc++] The standard library to be used for C++ headers and runtime.Enable traditional preprocessing.-trigraphs Support ISO C trigraphs.Dump the statistics of tree types.Do not predefine system-specific and GCC-specific macros.Display the compiler's version.J SSSSSSSSSVSSSTSSSVSSSSSUSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSVQRRRRRRRRRR5VRRQRRRR$TRQQQQQRQQQQRRRRRRRRRpjR$TRRRZTRR$T$TRRRRR$T$TRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRQRRRRRRRRRRRRQT'OOOOOOOOOOOOOOOOOOCSgSMjfryx/  !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~/tmp/usr/tmp/var/tmpCBBBBQ00000000000000000000000000000000 Cd  X Z d  d '(>@( a d (,  @d '3@'d(@B 'Pd dM d2F0W '(d d dd (d d22@@ '2 2   ( @dF d( 2K   _KdP2  H 11.5.0 20240719 (Red Hat 11.5.0-14)(GCC) %I$ <;G]tB{= 0$~`2fCOmA oE!a  0P AA ?  &*"@ `0PHX? "A!)?COLLECT_LTO_WRAP%(sysroot_spec) common_handle_optionset_Wstrict_aliasingsu.gcov_infojobservercommon_handle_option_autooptions.cpp_format../../gcc/pretty-print.cqwl+#%ld%lld%lo%llo%p%lu%u%f%#lx%x%lx%llxone_basedReading specs from %s cannot read spec file %qs: %m%include%include_noerrcould not find specs file %s %renamerename spec %s to %s *link_command:%d:%d, locus%s%s %r%s%s%Rdiagnostic_build_prefix../../gcc/diagnostic.c%s %s%s%s%(VALUE)linemap_expand_location../../libcpp/line-map.c%s%s%s:%s.ospec %qs invaliddo_spec_1.gkinclude-fixedpp_output_formatted_text--script--sysroot=%R%Dcollect2m64/m32-lgccx86-64x86-64-v2asm_debugasm_debug_optionasm_finalasm_optionsinvoke_ascpp_optionscpp_debug_optionscpp_unique_optionstrad_capable_cppcc1cc1_optionscc1pluslink_gcc_c_sequencelink_sspendfilelink_gompcross_compilemultilib_defaultsmultilib_extramultilib_matchesmultilib_exclusionsmultilib_optionsmultilib_reuselinker_plugin_filelto_wrapperlto_gccpost_linklink_libgccmd_exec_prefixmd_startfile_prefixmd_startfile_prefix_1startfile_prefix_specsysroot_specsysroot_suffix_specsysroot_hdrs_suffix_spec fromIn file included from included fromIn moduleof moduleIn module imported atfatal error: internal compiler error: sorry, unimplemented: warning: anachronism: note: debug: path: pedwarn: permerror: must-not-happenrange1range2fixit-insertfixit-deletediff-filenamediff-hunkdiff-deletediff-inserttype-diffdwarf-2skipused-gpr-argused-gprused-argall-gpr-argall-gprall-arg%<-W%serror=%s%>: no option %<-%s%>; did you mean %<-%s%>?%<-W%serror=%s%>: no option %<-%s%>%<-Werror=%s%>: %<-%s%> is not an option that controls warningsgetting core file size maximum limit: %msetting core file size limit to maximum: %munrecognized gcc debugging option: %c%<-foffload-abi%> option can be specified only for offload compilerstructure alignment must be a small power of two, not %wuinvalid arguments for %<-fpatchable-function-entry%>unrecognized argument to %<-fzero-call-used-regs=%>: %qsunknown stack check parameter %qs%<-gdwarf%s%> is ambiguous; use %<-gdwarf-%s%> for DWARF version or %<-gdwarf%> %<-g%s%> for debug leveldwarf version %wu is not supportedunrecognized argument to %<-flto=%> option: %qsdebug format %qs conflicts with prior selectionunrecognized debug output level %qsdebug output level %qs is too high../../gcc/diagnostic-event-id.hspecs %%include syntax malformed after %ld charactersspecs %%rename syntax malformed after %ld characters%s: attempt to rename spec %qs to already defined spec %qsspecs unknown %% command after %ld charactersspecs file malformed after %ld charactersspec file has no spec for linkingspecs %s spec was not found to be renamedswitch %qs does not start with %<-%>spec-generated switch is just %<-%>spec %qs has invalid %<%%0%c%>spec %qs has invalid %<%%W%c%>spec %qs has invalid %<%%@%c%>spec %qs has invalid %<%%x%c%>spec failure: %<%%*%> has not been initialized by pattern matchspec failure: unrecognized spec option %qcbraced spec %qs ends in escapebraced spec body %qs is invalidbraced spec %qs is invalid at %qcunable to locate default linker script %qs in the library search paths%{fstack-protector|fstack-protector-all|fstack-protector-strong|fstack-protector-explicit:}%{static|static-pie:--start-group} %G %{!nolibc:%L} %{static|static-pie:--end-group}%{!static:%{!static-pie:%G}}%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}} %{!iplugindir*:%{fplugin*:%:find-plugindir()}} %1 %{!Q:-quiet} %(cpp_debug_options) %{m*} %{aux-info*} %{g*} %{O*} %{W*&pedantic*} %{w} %{std*&ansi&trigraphs} %{v:-version} %{pg:-p} %{p} %{f*} %{undef} %{Qn:-fno-ident} %{Qy:} %{-help:--help} %{-target-help:--target-help} %{-version:--version} %{-help=*:--help=%*} %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %w%b.s}}} %{fsyntax-only:-o %j} %{-param*} %{coverage:-fprofile-arcs -ftest-coverage} %{fprofile-arcs|fprofile-generate*|coverage: %{!fprofile-update=single: %{pthread:-fprofile-update=prefer-atomic}}}cc1 -E %{traditional|traditional-cpp:-traditional-cpp}%{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %@{I*&F*} %{P} %I %{MD:-MD %{!o:%b.d}%{o*:%.d%*}} %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}} %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*} %{Mmodules} %{Mno-modules} %{!E:%{!M:%{!MM:%{!MT:%{!MQ:%{MD|MMD:%{o*:-MQ %*}}}}}}} %{remap} %{%:debug-level-gt(2):-dD} %{!iplugindir*:%{fplugin*:%:find-plugindir()}} %{H} %C %{D*&U*&A*} %{i*} %Z %i %{E|M|MM:%W{o*}}% file descriptorsjobserver is not available: fno-use-linker-pluginliblto_plugin.socannot execute %qs: %s: %mcannot execute %qs: %sexecuteinsert_wrapper "" |failed to get exit status: %m# %s %.2f %.2f %g %g ".args.%d-plugin-opt=-pass-through=-l-plugin-opt=-pass-through=kernel-addresskernel-hwaddressundefinedfatal_errortarget_handle_optionix86_handle_optioncontrol_warning_option\x%02xconvert_column_unitundocumented error #%dtotal_lines_num../../gcc/input.cread_line_numget_next_linenum_digitsbegin_statecontains_pointdebug pathcolumn_rangei386i486pentiumlakemontpentiumpropentium4noconacore2nehalemsandybridgehaswellbonnellsilvermontgoldmontgoldmont-plustremontknlknmskylakeskylake-avx512cannonlakeicelake-clienticelake-servercascadelaketigerlakecooperlakesapphirerapidsalderlakerocketlakegeodek6athlonamdfam10bdver1bdver2bdver3bdver4btver1btver2znver1znver2znver3znver4i586pentium-mmxwinchip-c6winchip2c3samuel-2c3-2nehemiahc7estheri686pentium2pentium3pentium3mpentium-mpentium4mprescottcorei7westmerecorei7-avxivybridgecore-avx-icore-avx2broadwellatomslmk6-2k6-3athlon-tbirdathlon-4athlon-xpathlon-mpx86-64-v3x86-64-v4eden-x2nanonano-1000nano-2000nano-3000nano-x2eden-x4nano-x4k8-sse3opteronopteron-sse3athlon64athlon64-sse3athlon-fxbarcelonaamdamdfam10hamdfam15hamdfam17hamdfam19hshanghaiistanbulpointer-subtractshiftshift-baseshift-exponentinteger-divide-by-zerovla-boundsigned-integer-overflowfloat-divide-by-zerofloat-cast-overflowbounds-strictreturns-nonnull-attributeobject-sizevptrpointer-overflowif-existsif-exists-elseif-exists-then-elsereplace-outfileremove-outfileversion-comparefind-filefind-plugindirprint-asm-headercompare-debug-dump-optcompare-debug-self-optpass-through-libsdebug-level-gtdwarf-version-gtfortran-preinclude-filelocal_cpu_detect../../gcc/diagnostic-show-locus.cerror in arguments to spec function %qsmalformed spec function argumentsno arguments for spec functionsystem path %qs is not absolutecompilation terminated due to -Wfatal-errors. Please submit a full bug report, with preprocessed source if appropriate. Please include the complete backtrace with any bug report. diagnostic_action_after_outputcannot use %<-%> as input filename for a precompiled headerSupported LTO compression algorithms: zlibgcc driver version %s %sexecuting gcc version %s wrong number of arguments to %%:debug-level-gtdebug_level_greater_than_spec_functoo many arguments for %%:dumps%> is not present in %% environment variable is unset%<-fuse-linker-plugin%>, but %s not found Linker options ============== Use "-Wl,OPTION" to pass "OPTION" to the linker. %s: linker input file unused because linking not done%s: linker input file not found: %mfailed to get process times: %m%s signal terminated program %scannot open nested response filecannot close nonexistent response filecould not open temporary response file %scould not close temporary response file %scould not write to temporary response file %s%s: all warnings being treated as errors%s: some warnings being treated as errors../../gcc/common/config/i386/i386-common.c%<-malign-loops%> is obsolete, use %<-falign-loops%>%<-malign-loops=%d%> is not between 0 and %d%<-malign-jumps%> is obsolete, use %<-falign-jumps%>%<-malign-jumps=%d%> is not between 0 and %d%<-malign-functions%> is obsolete, use %<-falign-functions%>%<-malign-functions=%d%> is not between 0 and %d%<-mbranch-cost=%d%> is not between 0 and 5get_line_bytes_without_trailing_whitespace2020202020|20202020 *20 2020202020 |R; d:T * $t20= 202020 f>y 2020Q 202020 20202020 20202020l202020 2020202020202020202020202020 20202020 ~20202020Tu202020` 2020202020203 202020202020}4 202020F020e20202020202020k2020g20S=k2020202020202020202020202020202020"20zA20(&77I7^777oJ_op/J#$'(-X[ 9 : ; < @ H L M P W a c  ; < @ B F H J M P Q o q t u  ; < > ? @ D L M T V a c   = @ E H I M T V a c  : < @ D L M a c 013:FN456789p~,0178:<>WY]`pt_\_14QSqs "&(128;UVW^_`abdlr|~345:;<ABjs+357  ) . _ d e o ##(#*#######%%&&G&S&~&&&&&&&&&&&&&&&&&&&&&&&&&&'' ' '''('K'L'M'N'R'U'V'W'''''''++O+P+T+U+,,~----.....////)0-0>0@000001/101111122Ƥnrs} $&+,èŨߨ%-FQ_|(.0246BCKL{|mo/RSfgk`uz      7 : > ?   # ' EP7F~&+,4rs.13457=>:<?@elot7?ADEF]^2:<=>@!%&+.78::<=>BC 28:>FGPVX[/67=>?069:;=>EFG/484jj/k6kNoOoooooooooՌORcgofirAD6:ltu!"$%*/6CJ;?HOQ_e ,56|}>?@A=JNOgyzO :;EFxyotwzݦ4?Jposix../configure --enable-bootstrap --enable-host-pie --enable-host-bind-now --enable-languages=c,c++,fortran,lto --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugs.almalinux.org/ --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-gcc-major-version-only --enable-plugin --enable-initfini-array --without-isl --enable-multilib --with-linker-hash-style=gnu --enable-offload-targets=nvptx-none --without-cuda-driver --enable-gnu-indirect-function --enable-cet --with-tune=generic --with-arch_64=x86-64-v2 --with-arch_32=x86-64 --build=x86_64-redhat-linux --with-build-config=bootstrap-lto --enable-link-serialization=1COLLECT_GCC_OPTIp@ .A/%s/usr/include/finclude/preincludeSame as %s%s.%s Same as %s.%s %s[available in [default]%llu bytes[enabled][disabled]<%d,%d> %-*.*s %.*s %s ???0x%lx %s %s:%d %s%s%s \"\n\b\f\r\t-frandom-seed=0-o-.errrb// //COLUMNSin %s, at %s:%dreplace_outfile_spec_functionremove_outfile_spec_functionalnumalphablankcntrllowerprintpunctxdigitcompare_version_stringsinvalid version number %qsversion_compare_spec_functioninclude_spec_functionfind_file_spec_functionfind_plugindir_spec_function%{fdump-final-insns=*:%*}%B.gkd} has_cpu_featurecpu_indicator_init -mno-print_escaped_string\\\%o%o%oprint_parseable_fixitsfix-it::{%i:%i-%i:%i}:internal_error%s%s: ../../gcc/json.ccdisplay-columnbyte-columnjson_from_expanded_locationGCC_COLORSoverwritediagnostic_output_format_initcc1_cpuUsing built-in specs. -lgcc_ehlibgcc.a%slibgcc_eh.a%sjson_end_diagnosticmessageoption_urlchildrencolumn-originstartfinishnextmetadatatoplev::mainexecute_one_passcompile_fileAdaSCILAdaWhyBRIGLTOLTODumpObjCObjC++cmov3dnowpcmpxchg16bcmpxchg8bfxsaveibtlahf_lmosxsaveaeskleenvironment variable %qs not definedtoo many arguments to %%:compare-debug-self-opt% option: %qsinvalid number of arguments for %<-falign-%s%> option: %qs%<-falign-%s%> is not between 0 and %d^([1-9][0-9]*|0)(\.([1-9][0-9]*|0))*$too few arguments to %%:version-comparetoo many arguments to %%:version-compareunknown operator %qs in %%:version-comparetoo many arguments to %%:compare-debug-dump-opt%{!save-temps*:%g.gkd}%{save-temps*:%B.gkd}compare_debug_dump_opt_spec_function%{!frandom-seed=*:-frandom-seed=wrong number of arguments to %%:dwarf-version-gtdwarf_version_greater_than_spec_func../../gcc/common/config/i386/cpuinfo.hThe following options are target specificThe following options control compiler warning messagesThe following options control optimizationsThe following options are language-independentThe following options control parametersThe following options are specific to just the language The following options are supported by the language The following options are not documentedThe following options take separate argumentsThe following options take joined argumentsunrecognized % passed to %The following options are language-related../../gcc/diagnostic-format-json.cc%{march=native:%>march=native %:local_cpu_detect(arch %{!m32:64;:32}) %{!mtune=*:%>mtune=native %:local_cpu_detect(tune %{!m32:64;:32})}} %{mtune=native:%>mtune=native %:local_cpu_detect(tune %{!m32:64;:32})}--no-add-needed %{!static|static-pie:--eh-frame-hdr} Q&@@@3,5%&@@()L[M[MDK[MDKDK@L)L[M[M[M[M[MnL)LK[M[MDK[MWKDK@LWK[M[M[M[M[M[ML[M[M[ML[ML[M[M[M[M[M[M[M[MDK[M[M[M[MjK[M[MLL[M[M[M[M[M[MK}K[M[M[M[M[MMM@L7M[M[M[M[M[M[M}K#M[M[M#M[M}KL@L[M[M[M[M[M[M@L@LWLIJIKKK`JKIJ`J2JIJKKKKKKKIXZZZ)Y9YYYZkZ3aGaGa2^GaGaGaGaGaGaGaK^GaGaGaGaGaGaGaGaGaGaGaGad^}^^^^`GaGa^^_,_E_GaGa^_w_GaGaGaGa_GaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGa_GaGaGaGaGa_a_GaGaGaGaGaGaGaGaGaGaGaGaGaGaGa_`3aa``/`GaH`a`Gaz``````../../gcc/diagnostic.cUses of this option are diagnosed.This option lacks documentation.--hash-style=  %{!r:--build-id}no debug info in ELF executableno symbol table in ELF executableDW_FORM_addrx value out of rangesigned LEB128 overflows uint64_tDW_FORM_strx value out of rangeDW_FORM_strx offset out of rangernglists index offset out of rangeDW_FORM_line_strp out of rangeDW_FORM_indirect to DW_FORM_implicit_constabstract origin or specification out of rangeinvalid abstract origin or specificationinvalid directory index in line number program headermissing file name in line number program headerexecutable file is unrecognized ELF versionexecutable file is unexpected ELF classexecutable file has unknown endiannessELF symbol table strtab link out of rangesymbol string index out of rangefailed to read executable informationlibbacktrace could not find executable to openinvalid file number in DW_AT_call_file attributeunsupported line number versionnon-zero segment_selector_size not supportedinvalid directory index in line number programinvalid file number in line number program%s in %s at %dDWARF underflowunrecognized address size.debug_addrLEB128 overflows uint64_t.debug_str_offsetsranges offset out of range.debug_rangesrnglists offset out of range.debug_rnglistsunrecognized DW_RLE valueinvalid abbreviation codeDW_FORM_strp out of rangeDW_FORM_strp_sup out of rangeunrecognized DWARF form.debug_info]8;;pp_begin_urlmmap.debug//usr/lib/debug/executable file is not ELFELF section name out of range.note.gnu.build-idGNU.gnu_debuglink.gnu_debugaltlink.gnu_debugdata.opd/usr/lib/debug/.build-id/fstatunrecognized DWARF versionabbrev offset out of range.debug_abbrev/proc/curproc/file/proc/self/exe/proc/%ld/object/a.outunit line offset out of range.debug_line.debug_str.debug_line_strKˋAW^WPIB;4Yuۤ#.EEb{!GdΦDuҧ+Ш\_sFuuuuҧҧҧҧxxxxxxxxxx7zXZ####Wtll"Zllt n  7ee tt E\ eNYYYYeeeeeeeeeeeYYYY                                         P p00 ` @P X x8@ h( H` T t48 d$DX \ |<H l,( Lh R r24 b"BT Z z:D j*$ Jd V v6< f&F\ ^  ~>L n.,Nl Q q12 a!AR Y y9B i)" Ib U u5: e%EZ ]  }=J m-* Mj S s36 c#CV [ {;F k+& Kf W w7> g'G^ _ ?N o/.On% O %%@@@(tthh@@@@@@@@@@@@@@@t@@@@@@@@@@00@@t@@@@n@@@@@th@@@@@@@@@@@@@@tt@nnnnt@@@@@@@@h K K K K K K K K 4##K ^#K K K K K q! ""K #3" ##$<$b$$Y$$$%#$#$R%)))I+))++,,,, ,,,+5,,,,,,+(,+0/0//b0/0T/y0////////k/7///09r:r:;>>?\?? @R@@@'AnAAACBBBCCCCEEEEEEEtDtDEEFLFF,G/HH/HPIPI >IMJJ[Q KK3LN[QQQ[Q[QRRUTVVV!VWXX)Y[QY9CCmW :EYEERGR}RRR[[[[[[L\`\.\B\V\j\v\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\[\[[khkl8m8mgm3n.qrrs3sww{tEswukky%zMz&||Y{{zz0w,aQ mjp5c飕d2yҗ+L |~-d jHqA}mQDžӃVlkdzbeO\lcc=  n;^iLA`rqgjm Zjz  ' }Dңhi]Wbgeq6lknv+ӉZzJgo߹ホCՎ`~ѡ8ROggW?K6H+ L J6`zA`Ugn1yiFafo%6hRw G "/&U;( Z+j\1е,[d&c윣ju m ?6grWJz+{8 Ғ |! ӆBhn[&wowGZpj;f\ eibkaElx TN³9a&g`MGiIwn>JjѮZf @;7SŞϲG0򽽊º0S$6к)WTg#.zfJah]+o*7 Z-memory exhaustedmunmapinternal_error_no_backtrace]8;;\]8;;get_end_url_string--param l1-cache-size=%u --param l2-cache-size=%u }}}}}%{!shared: -lgcc_s --pop-state}%{shared-libgcc: --push-state --as-needed ix86_excess_precisionrecip_maskix86_isa_flags2_explicitix86_isa_flags_explicitdump_base_name_prefixedexit_after_optionsflag_dump_all_passedflag_opts_finishedflag_stack_usage_infoflag_warn_unused_resultin_lto_puse_gnu_debug_info_extensionshelp_enum_printedhelp_printedaux_base_namemain_input_basenamemain_input_filenamedebug_info_levelwrite_symbolsdebug_struct_genericdebug_struct_ordinaryflag_incremental_linkflag_stack_checkflag_complex_methodflag_debug_asmflag_dump_rtl_in_asmflag_gen_aux_infoflag_generate_ltoflag_generate_offloadflag_print_asm_nameflag_shlibmain_input_baselengthoptimize_debugoptimize_fastoptimize_sizerecip_mask_explicitrtl_dump_and_exittarget_flagsflag_sanitizeflag_sanitize_coverageflag_sanitize_recoverflag_zero_call_used_regshelp_columnsinitial_max_fld_aligntrace-pctrace-cmp%<-fsanitize=all%> option is not validunrecognized argument to %<-f%ssanitize%s=%> option: %q.*s; did you mean %qs?unrecognized argument to %<-f%ssanitize%s=%> option: %q.*s %s%sout of memory allocating %lu bytes after a total of %lu bytes out of range for in-memory file--param l1-cache-line-size=%u }%{!static:%{!static-libgcc:%{!static-pie:%{!shared-libgcc:%{static|static-libgcc|static-pie:ix86_stack_protector_guard_offsetix86_stack_protector_guard_regix86_unsafe_math_optimizationsflag_instrument_functions_exclude_filesflag_instrument_functions_exclude_functionsN9__gnu_cxx20recursive_init_errorEN10__cxxabiv120__si_class_type_infoESt9type_info0123456789not enough space for format expansion (Please submit full bug report at https://gcc.gnu.org/bugsstd::bad_allocSt9bad_allocstd::bad_array_new_lengthSt20bad_array_new_lengthstd::bad_castSt8bad_caststd::bad_typeidSt10bad_typeidN10__cxxabiv117__class_type_infoE__gnu_cxx::__concurrence_lock_error__gnu_cxx::__concurrence_unlock_errorN9__gnu_cxx24__concurrence_lock_errorEN9__gnu_cxx26__concurrence_unlock_errorEstd::exceptionstd::bad_exceptionSt9exceptionSt13bad_exceptionN10__cxxabiv115__forced_unwindEN10__cxxabiv119__foreign_exceptionE< < RRRR < terminate called recursively ' what(): terminate called after throwing an instance of 'terminate called without an active exception basic_string::_S_createSt11logic_errorSt12domain_errorSt16invalid_argumentSt12length_errorSt12out_of_rangeSt13runtime_errorSt11range_errorSt14overflow_errorSt15underflow_errorbasic_string::_S_construct null not valid%s:%d: %s: Assertion '%s' failed. %s: __pos (which is %zu) > this->size() (which is %zu)__pos <= size()const value_type& std::basic_string<_CharT, _Traits, _Alloc>::operator[](std::basic_string<_CharT, _Traits, _Alloc>::size_type) const [with _CharT = char; _Traits = std::char_traits; _Alloc = std::allocator; std::basic_string<_CharT, _Traits, _Alloc>::const_reference = const char&; std::basic_string<_CharT, _Traits, _Alloc>::size_type = long unsigned int]/builddir/build/BUILD/gcc-11.5.0-20240719/obj-x86_64-redhat-linux/x86_64-redhat-linux/libstdc++-v3/include/bits/basic_string.hbasic_string::at: __n (which is %zu) >= this->size() (which is %zu)!empty()const value_type& std::basic_string<_CharT, _Traits, _Alloc>::front() const [with _CharT = char; _Traits = std::char_traits; _Alloc = std::allocator; std::basic_string<_CharT, _Traits, _Alloc>::const_reference = const char&]const value_type& std::basic_string<_CharT, _Traits, _Alloc>::back() const [with _CharT = char; _Traits = std::char_traits; _Alloc = std::allocator; std::basic_string<_CharT, _Traits, _Alloc>::const_reference = const char&]basic_string::copybasic_string::comparestd::basic_string<_CharT, _Traits, _Alloc>::value_type& std::basic_string<_CharT, _Traits, _Alloc>::operator[](std::basic_string<_CharT, _Traits, _Alloc>::size_type) [with _CharT = char; _Traits = std::char_traits; _Alloc = std::allocator; std::basic_string<_CharT, _Traits, _Alloc>::reference = char&; std::basic_string<_CharT, _Traits, _Alloc>::size_type = long unsigned int]std::basic_string<_CharT, _Traits, _Alloc>::value_type& std::basic_string<_CharT, _Traits, _Alloc>::front() [with _CharT = char; _Traits = std::char_traits; _Alloc = std::allocator; std::basic_string<_CharT, _Traits, _Alloc>::reference = char&]std::basic_string<_CharT, _Traits, _Alloc>::value_type& std::basic_string<_CharT, _Traits, _Alloc>::back() [with _CharT = char; _Traits = std::char_traits; _Alloc = std::allocator; std::basic_string<_CharT, _Traits, _Alloc>::reference = char&]basic_string::erasebasic_string::_M_replace_auxbasic_string::insertbasic_string::replacebasic_string::assignvoid std::basic_string<_CharT, _Traits, _Alloc>::pop_back() [with _CharT = char; _Traits = std::char_traits; _Alloc = std::allocator]basic_string::appendbasic_string::resizebasic_string::basic_stringbasic_string::substr?random_device: rdrand failedrandom_device: rdseed failedbasic_string::_M_construct null not validbasic_string::_M_create/dev/urandomrdrand/dev/randomrandom_device::random_device(const std::string&): unsupported tokenrandom_device::random_device(const std::string&): device not availablemt19937random_device could not be read@@std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::const_reference std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator[](std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type) const [with _CharT = char; _Traits = std::char_traits; _Alloc = std::allocator; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::const_reference = const char&; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type = long unsigned int]std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::reference std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator[](std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type) [with _CharT = char; _Traits = std::char_traits; _Alloc = std::allocator; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::reference = char&; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type = long unsigned int]std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::reference std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::front() [with _CharT = char; _Traits = std::char_traits; _Alloc = std::allocator; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::reference = char&]std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::const_reference std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::front() const [with _CharT = char; _Traits = std::char_traits; _Alloc = std::allocator; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::const_reference = const char&]std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::reference std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::back() [with _CharT = char; _Traits = std::char_traits; _Alloc = std::allocator; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::reference = char&]std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::const_reference std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::back() const [with _CharT = char; _Traits = std::char_traits; _Alloc = std::allocator; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::const_reference = const char&]void std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::pop_back() [with _CharT = char; _Traits = std::char_traits; _Alloc = std::allocator]basic_string::_M_replacestring::stringhhh^̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉<-- 0 PP Hh^>ɗޙҘX wڡ,,,,,,,,,,,T ,̧,,,,,,,,,,,,,,,,,,,,,,,,,,, 1111P11111111<"1111111111111111a1111111111111X ppppPPfP((80HH8HHHHp0 Hwp#s>4|||||||||||||||||||||D||||||||||||||||||||||||||||||||||||||||(anonymous namespace)decltype(auto)decltype(nullptr)string literal[abi:{default arg#}::auto:VTT for construction vtable for -in-typeinfo for typeinfo name for typeinfo fn for non-virtual thunk to covariant return thunk to java Class for guard variable for TLS init function for TLS wrapper function for reference temporary #hidden alias for non-transaction clone for _Sat _Accum_Fract, operatoroperator >(clqu : new falsetruejava resource decltype (this{parm#global constructors keyed to global destructors keyed to {lambda()#{unnamed type# [clone restrict volatile const transaction_safe noexcept throw&& _Complex _Imaginary::* __vector(_GLOBAL_(......) ... std::allocatorstd::basic_stringstd::stringstd::istreambasic_istreamstd::ostreambasic_ostreamstd::iostreambasic_iostreamaN&=aSaaalignof awco_await azconst_castcmco~dV/=dX[...]=delete[] dcdynamic_castdldelete .*dtdveO^=eo^eq==fLfRflfrlS<<=lioperator"" <<mI-=mL*=--new[]!=!nwoR|=oo||pL+=plpm->*->rM%=rS>>=rcreinterpret_cast%>>sPsizeof...sZscstatic_cast<=>sizeof sztwthrow booleanlong double__float128unsigned charunsigned intunsignedunsigned longunsigned __int128unsigned shortvoidwchar_tunsigned long longdecimal32decimal64decimal128halfchar16_tchar32_ttemplate parameter object for std::basic_string, std::allocator >std::basic_istream >std::basic_ostream >std::basic_iostream >,jjjj< jj j""""#"!p!0"p"P""#!dddddddddddddddddddddddddddddddd"1j\#1j 1jT#$$$# $ii$$i)$6$C$P$iZ$l$~$$$$U"AiAiAiAiAiAiAiAiAiAiAiAiAiAiAiAiAiAi$AiAiAiAiAi$$AiAi$4'''''&)*(*?*V*0'0Q0/(,l*+1}10)+,-/...hhhhhhhhhhhhhhhhhhhhhh)X/-2223.3w999985L33:m:924s55~86k77 h h h h h h h h h h h h h h h h h h h h h h2H8|6<<<<<<<<<<;<<<=<= >R@SSSR7g7g7g7gxS0S SR;00d0<00,1P118222&3T33D4t4H55 666767q8`|88$9|99 :h:*:q:$;z;;<_X<&<F<P,=\== >t>0>:?|?O?h?ul@@A|A,AZB(BBC} DxDLDVE E $FL Fr XJ|KLL.LT/`M0MJ1Mu1Nl6N9XO9lO:O :P:Q:TQ;Q<lFTmmΠm.oȢp.\ppdqqq@LrxrޤsNHsVs\s4tPt|tt|Huu.v1Pv@dvvvvvv wĩ4w˩Hwҩ\w٩pwwwwwww wx$x8x&Lx-`x4tx;xBxIxPxWy^(yePylxysyzyyz@zhzzzz{0{D{Ǫl{Ϊ{ժ{ܪ{{ |4|\||| ||}"8})L}0`}7}>}E}L}S~Z(~a<~hd~ox~v~~~~g~~ʬ,Ҭ@ܬTh|pu~*Hٯ88-T^pܲ́Դ'lԂs(pRP <XtE܄H<\ԅ7v4Lt*؆$pE 8dxԈC !l"#؉Z'$Z(l(i*Ԋ+ ,<d,T*-p--ċ18tn::;;,;@;\;p<D<Z<<<ԍ=>hS??Ď??3@0`@X@@@A؏B BhCIZJJK OK K4KH'L\LMQ8_`7`h`ؓe<bhhܔlm(mĕXmܕnpTpNqЖpqqrLsvVDT`4:(ֲP(ԝLhfDt@mğ~,PHpHxܠ&0l 8С6\8|dآV$d9xģl:PؤH (D"m D7l!L"t ##%4M&p')2)*@*T*p**+ܯ++G<GPHd%HxḬIJ$J8KK QS<TXV?WIJWW 4X$XD@Yp~Y ZԳZQ[[$[<[P\̴]]]h^$R^@^\^x^&_и~__.`<```aȹ\aa b4dbbbTbbbbb0bccTBdRd|bdrdd(ddDde@e$e$4e|DeTe`deteDee(ee$eeeeff(0f<ffLff fffff\fff<f|f$ffffHfgLg g gpgg` !g!,ggHg hlP'>(>(0?<)?)?)?\*(@*P@*@l,@,0A-A-A,/B/TB0B 1C5(D:D;(E;LEF?K|@PK@KAKA4LKLlLMOMONP$NP\N|S(OSDO|TOTO VPVPLV>l>>>>,A| ( *FAA ^AB S  tEEr8( FBA A(D0^ (A ABBA d ޢ[0 T +S, LMAK DKH A  ] , L;AC DH A (  $H <*FEA YBBp ~  $ ,7JDD ZGB ^  0 ,FDD G0\  AABA   08 L=FDA A(D0 (A ABBA T Я40p $ 0IEn E  "8 =hFBE A(B0J (D ABBA  5Fn4 nFBG D(D0M(D ABBDlG[U$\iEEG0UAAt 0@HdFBB A(D0D@g 0D(A BBBE "@HTFEB B(A0A8GP 8A0A(B BBBA L1PlLY A x A(lFDF x ABA $,+EDD [AA 4XFQ<HT`FJK E(D0D8DP 8A0A(B BBBA ~P$t?FDG `GB  HtFEF E(D0A8Q` 8A0A(B BBBA L`l!,ZAC HDO A D- $o>0(ZFDGDBX$@FBD D(E0C8L@SHAPI0I (A ABBA y (F ABBB <u0N (D CIFE D (H CDBE kFBE E(A0A8DU 8A0A(B BBBA BIGAZPIGAZSLGAVNIGAZqIGAZUh0<8FKA G`  FABA iD`LFHB B(A0A8L; 8A0A(B BBBA HA <hHEE F(F0Z (A BBBA l 0,X2 AMHp2=FBE B(A0A8D`8D0A(B BBB2} `2C/2g L3 ?FEB B(A0A8I  8A0A(B BBBA T3 Ht3EFBB B(A0H8DP 8A0A(B BBBE 3 P 3HEC M$4   A ,,4KFDC I ABA \42 jAB4L4A(4 L%EC M A 4 4@UfA5MEQ,5HD5MFBI I(D0A8FPo 8D0A(B BBBA 5O7P54N05R 5FBBB B(D0A8G@ 8A0A(B BBBD  8A0A(B BBBG  8A0A(B BBBI W 8A0A(B BBBG  8A0A(B BBBK >&3@`>HBEH H(D0D8D` 8A0A(B BBBD r 8A0A(B BBBD $T?K ADJ FIA|?P,Aj8?,PBBA A(D0U (A ABBA ?2f08?PBBA A(D0^ (A ABBA ,@2[0$H@JEN ] F J OHp@PBBE B(D0A8A@d 8D0A(B BBBA @2W@$@8Q.AKD [AAA@Q,A\Q$Ab4At2 LAXQ'`AT2$AXxA\QQA~ A K A A@20lAQLCA f AAA q DDE L AAE L AAE L AAE KAA$B18 Y AAE (DBpIOFDA { ABA pB1f (BxQEDJ AAA ,BEQn(R(?oFHONAB$Rk?=EAD lAADR?.FII B(D0M8Gp8I0A(B BBB8@Sf@sFIB D(I0A(I BBBD|S@FII I(H0I8G@8D0F(B BBB(STA]IDA KABSAEU TAEQ(TAEQDTA,XTAFAA Dp AAB TAEJvA(TaBEC P <TFFBE D(A0D@0A(A BBBUG_`,UHFIE E(D0I8D; 8D0A(B BBBE Y8A0A(B BBBUK0UKEEDC n AAE AAA(U'K?FDI hABV:KH $VKFIE D(G@(DVBLlFAA ^CB4pVLpHBA A(A0Z(C ABBHVL-!BEB B(A0A8G!8A0A(B BBBHVmFBB B(A0A8D`8A0A(B BBB@WOoUGM\Wo)IXtWoAEr@WohFBB A(A0DPL0D(A BBBWqED AWZrGWX(Xr [AD AAA4XfuXHXku) FBB B(A0A8GOOWA8A0A(B BBBHX8/BBB B(A0A8A@ 8D0F(B BBBHXFBB B(A0A8G8D0A(B BBBEDD jAA8hޥFEE A(G0o(A BBB1oUY E {؃A@EzeAaX '8 FDJ K(G(A BBB<\FPB H(K0 (d PII] ]0D FNV I(A0C8A@HHAPAXL`P JAB x 4p @LhLAG ] FAH XC I CAA + IIԅ@LEQPX5MU A 8.T` lXdEQ`hFFBE E(D0A8G`~ 8C0A(B BBBH j 8A0A(B BBBL 0TuEDG@W AAG }FAL4SFED D(G0a (A ABBG D(A ABBEQ܇1aN5EAF 5EAF,#5EAFH<5EAFdU5EAFzPLRx  $NX iFIA HXhFIA lXhFIA XhFIA XhFIA pChEC D.&~h  4XfhFIA @hXNhFIA dX6hFIA $ЧXhFIA ,BEF C(LEF DD A @xjFEB F(A0 (A BBBG  ЊEQ  ,EQL `t EQ  (EQ ܋(EG0l DA (EQ(DLFAD }ABXp}FEA D(D0d (F ABBE Z (A ABBH D(C ABBĽFEA A(G@A (C ABBC I(C ABBh 4` H\ \Xpdp)LX)LXp5EAF؍5EAF,x` :dAHJ  AAG r d ,$cBDN  DBC 0 c 1TT (_cEG A L5cdIh ajcHA A p 5Nc`I dyHX A <x Pt d x| x EQ| EQď ؏| EQ | EQ$ 8| Lx `t 0tp |BGD G0^  AABA  BAА!D e G ġ Ht"BEA D(G@\ (A ABBA D(C ABBL"j`UA8t#BDD D(G0 (A ABBA L4 #`FBB B(A0A8G 8A0A(B BBBC s`0 )Q[`FBB A(A0Gp m7`p )/`EAD ٠ `()Ȓ )ܒ)EAD )EAD))(,)<()EAD \();Eb I A A D)HEBx)IFED )dEԓ*) $ )*^FAA D0 [^A0D* ,X* LAA e DBG +\L_ E ,EL,Ԕ,EL, ,EL $,40,ELP4,\L_ E lx,EL|,,EL,̕,EL,,EL,,,EL8 ,\FAG m ABB O ABF \ ,EW,EWؖ,EW-EW8-[FAG m ABB O ABF Μ[ h<-EW@-EWD-EWH-Kj A 0ܗ-AAG F DAD jAA4.xBGF p DBK dAB(H\.FO f AD XH t/<$ ,/jZLg E L D 4t/sZFUИt/*/4$|/j/ZLg E L D 0 ZFU@0*T 048L0YFDD y ABF T ABA (Y t0EWܙx0EW|0EW0EW80YFDD y ABF T ABA ΙX 0EW0EW0EWܚ00 0ZE^ E K E (0DE\ G O A $(1ZXE^ E K E `1WFP`1L110$T1WFG N EH |RDlW <02{[WFEG D(H0J (A ABBA :3W0tP2 L2 H2&HU`2 Ȝ\2 4`X2VFLD D@]  ABBA V@42|VFLD D@h  ABBA PQV@2HI2EL2HI4\2UFLD D@]  ABBA U@4$3UFLD D@h  ABBA tU@l3HIt3EL4@x33UFLD D@]  ABBA xU@43TFLD D@h  ABBA T@l3HI4EL4$4yTFLD D@]  ABBA \4NT@4|<46TFLD D@h  ABBA  T@P4HIh4EL44SFLD D@]  ABBA @pS@4`4|SFLD D@h  ABBA (QS@45HIL5EL45SFLD D@]  ABBA $R@4DT5RFLD D@h  ABBA |dR@5HI05ELL5HI453RFLD D@]  ABBA  ВR@4@5QFLD D@h  ABBA xQ@06HI,86EL4<6yQFLD D@]  ABBA  NQ@4$t66QFLD D@h  ABBA \đ Q@6HI6EL46PFLD D@]  ABBA HP@47|PFLD D@h  ABBA @QP@ܤH7HIP7ELP7(EAI0d7D`7 X\7 lX7T7 P7)Xl7'_7Х7!77 7+ 7&48&H8&\88&pT8%p8 l8x88Ԧ88 88$888 L8`8t8 8 88 ħ8\|8;=M\8#U83MT8CMd 4 9nLt H J A Xl9-l9FM9FM99̨9H9FBB B(A0A8DP 8D0A(B BBBF ,:(@:0FEG REB$l:IFHD pDB8@:yFBH A(D0N (D ABBD Щ:(:0FEG REB:5P$:tKBB D(D0q (H BBBJ D(A BBBAx:(:0FEG REB: H̪:}FBA A(D0J (D ABBG D(H DBB ;(,;0FEG REBX ; Hl;pFBB A(A0G (A BBBF A(H BBB,;(̫(;0FEG REB,;84 X;dFBH A(D0E(D ABBD;(X;0FEG REB;=$;WEAD JAA(;EAD _ AAA (X<EDD n AAA 4bAE q DBA >ES>EU̮> > ><>yH r F ($P?EAG0F AAK HP?1FHE I(A0D8G` 8A0A(B BBBC AQUU F VJ$Bԯ0BQL$4B5FDD `DB$LB9FDD gAB@dB*YL(\xBCEDD b DAA (BWEAD c DAF BOER I L D (ذB_EAD f DAK 0CJFk A $ dC3EHG YDA$H|C>QFD ]DAHpCPBG A(D0~ (D ABBK G (D ABBA CбC7_$D7ELG YDA (DEj dD4pDH|D&I\HdDdFED G(G0f (D ABBD J(D ABB(DET s FN Q DK ܲEFMEAl$ E.FGG IGE4E $HE.FGG IGE@pElFGA D0A  IABI P  DABA  G ȳGDl(ܳXG0FED XBB\GXGCd0G70DGEDG F DAE jAA(xHEAG@g AAJ 8HFBD A(D0X (D ABBF 4I <0IFBE A(A0s (D BBBD 84IFBD A(D0 (D ABBG pJ $J.FGG IGEJ $J.FGG IGE8JFBD A(D0m (D ABBI $KPD<HK HPDK|FBA C(G0B (A ABBE U(A ABBHxKFBD A(F0C (D ABBA U(D ABB8l.K ;>EAG@a AAH  AAE .L#>HI@LO TLEG | AG x,MbHa G K E (xMFDD0` DBD ȷbG/H[ E <cPBH A(A0 (A BBBG Tchc|d4\$4d4EMI SDALdBgdd#F\$d2EKI SDA$d48d LdDl`$et0eche FY$le4FDJ MJDe3[e7_eEm(fTFEG \ EDE 8HLflFEG D(G0` (G DEBE fGlfJofJo4gGlpgNvgJogJo8$huFED G(J0l (G ABBE Lhh6^(`hPFDD c AEA h|H| E iqHn E i|ixiAl(iMFDJ _ GBE ,i)]@i)] TjfIt C J A x\jhkdk`k\k(Xk0FEG REB\k(Xk0FEG REBH\k5P\ktKEB D(D0o (H BBBI D(A BBBAk(k0FEG REBk Hk}FBA A(D0J (D ABBG D(H DBBPk(dk0FEG REBk HkpFBB A(A0F (A BBBG A(H BBBl(l0FEG REB0l84D0ldFBH A(D0E(D ABB|hl(dl0FEG REBhl=$lWEAD JAA(lEAD \ AAA ($0mEGD k AAA 4PmmFED A(D0R(A ABB<mFBB D(A0g (A BBBA (\nEGD X AAA nn<Gn%FFD C(G0G (D ABBA 0\oFDG G0L  AABH o0oFDG G0L  AABH p0(pFDD G0^  AABI  p4p<Hpg$FBD E(G0h (D ABBA p?g(qGodqpq|q$xqAFMG YGBq(q<qPdrCdrxLsgsTswXb F <XtJKG A AAA L AAB Rt%8uFED A(G0C (A ABBH LuK(`ujACG i AAJ (v[4tvBBA G(G0(A ABBDvKEH K(H0h (A BBBF  w84xBKA D(D` (A ABBA px8yJBAA { ABF  AIF H{ BBB B(A0A8GP  8D0A(B BBBH  `gP(,HAAD0 AAD 4XzBAG q LBG W CBD dAi F L D @AAG o AAF u AAI  AAA D< BAA Y ABH ? ABF  AEA 4@BAD  DBH Q DBI $x|eH uAEP @BDA D0  AABA t  JABE <BBB A(A0 (D BBBB $ BBB A(D0Q (D BBBJ  (A EBBE A (A BBBH a (A BBBH _ (A BBBJ LBBD D(D@ (A ABBA l (J ABBE HX;BEB B(A0A8JP 8D0A(B BBBD 8HLBAD k CBI X DBJ PBAD D@m  DABA   AABL   DABF D BAD E ABA ] LBE w AEC X t=BBB B(A0D8Gt 8A0A(B BBBF  8L0A(B BBBH  8I0A(B BBBE r 8I0A(B BBBE  8K0A(B BBBE  8I0A(B BBBE c 8F0A(B BBBE  8H0A(B BBBE  8A0A(B BBBE c 8F0A(B BBBE  8I0A(B BBBL f 8L0A(B BBBE  8L0A(B BBBI  8F0A(B BBBE  8I0A(B BBBE c 8I0A(B BBBE c 8I0A(B BBBE c 8I0A(B BBBE c 8I0A(B BBBE c 8I0A(B BBBE c 8I0A(B BBBE c 8I0A(B BBBE  8I0A(B BBBE c 8I0A(B BBBE c 8I0A(B BBBE c 8I0A(B BBBE c 8I0A(B BBBE  8I0A(B BBBE , 8I0A(B BBBE c 8I0A(B BBBE  8I0A(B BBBE c 8I0A(B BBBE c 8I0A(B BBBE  8I0A(B BBBE c 8I0A(B BBBE m 8I0A(B BBBE M 8H0A(B BBBN ^ 8K0A(B BBBE  8G0A(B BBBE B 8L0A(B BBBE X 8I0A(B BBBE  8I0A(B BBBE  8I0A(B BBBE  8K0A(B BBBE ^ 8K0A(B BBBE ^ 8I0A(B BBBE ^ 8I0A(B BBBE ^ 8K0A(B BBBF  8I0A(B BBBE F 8K0A(B BBBE O 8L0A(B BBBE  8L0A(B BBBE ! 8H0A(B BBBE (|ADD@ AAA `: BBB D(D0f (I BBBM  (A BBBF  (T BBBD 8 YBBD D(G0  (A ABBE HHBBB B(A0A8Dp 8A0A(B BBBA HBEB E(D0A8G@ 8A0A(B BBBB HBBA D(D0I (F ABBO (A ABB,,AC BQ" A 0\BAD G@+  AABC ddVBE B(A0A8G@H@T 8F0A(B BBBE ` SBB B(A0A8D@U 8D0A(B BBBG H@@\hxFBB A(A0G` 0D(A BBBI .RN9E lEn E n A $ (Hy G g I O E 4HQLHLdHP|HP1HZ F |LD  A {S A J S E HSH4@BBB B(A0A8G 8A0A(B BBBH R LBEB B(A0D8G 8A0A(B BBBH R H4 XF BEIF E y A \!R H|H XF BEIF E  A Q |$wBPB H(A0A8D` 8A0A(B BBBG L 8F0A(B BBBE  8F0A(B BBBH hQ`8l*uBID D(J (A ABBI PH+?BBI H(A0D8J 8A0A(B BBBG ,ePLLh,jBBB E(D0F8G2 8D0A(B BBBE Oh-<OA- |-E OA - 4-H- \- p- -"H0Y- - (-EKNAA.D.EC DSIHP  G  C A  L[N  @p1EC DIIGL  A  C A <P3EC HIIP  C A B M  <4EC HM a A  C A  XYM  |5!(5EC DEIH L X6d6&D6BHG E(D0A8DP8A0A(B BBBLL6BBA A(G0Y (A ABBD D (H ABBO h7B LA`8MBBF I(D0A8G 8D0A(F BBBE T8A0A(B BBB(|:RYq F A(H:AEF O AAC $t ;ADG AAL<BEB B(A0E8G 8D0A(B BBBI (KcBGD KDB(LKCAFD n AAA 4D@*ADK0d DAG  AAJ H|AhBEB F(G0A8D` 8D0A(B BBBC L IQBE F(D0(A BBBHA0I0H8\IBBB B(A0A8Dp 8A0A(B BBBD BIp@pLBED F BBK J BBJ KBB0LBN o ED b EA QEH $4MUBY b BA DL<\8MFEB A(A0v (A BBBD 4H00MFAA G0e  AABH G00 M)FHD G0  AABD @G0H\NBEB B(D0A8G` 8A0A(B BBBG 7G`d,QBEB B(D0A8G`w 8D0A(B BBBE  8C0A(B BBBH 0F`PdG,HchS0|S8SMQw(T$DT,`TAEwTTT%TIL0T FBB B(D0A8G  8D0A(B BBBF iE @`&A<&A<&A<&A<&A< &A<&A<&A<&A<     @E!c   b}h 6veo}HBz Bz 9;t 9;t  #16 (6o[  0@  0@&  0@  0@&  0@  0@&  0@  0@&  0@  0@&  0@  0@&  0@  0@&  0@  0@&  0@  0@& !B}<S-E  @gG7al1<m!}d 1,k (7JbYP pY (wi m m3'-J'W';'E'P'_'l'z'*'T''(w m'''U''''''l(w' mi['((($(/(((6(=(K(Y()`(s  m  d(G W'o(9o<v((((((( m(('(:((((((z(A(y'((w(()) m)))!).)(w;) mH)I)N)M)?W; m6('((R)p)W)_)g)[)l)t)=pk =|). 0))))))(w)h=')kG #))) m)kG #W )* m* m * m**h*"*)*/*6*eˀ<* m҈A*pk F*O*S*EEEEAAY*Y* E^*c*k*A s*z*;**H*p$**********iA ***************++ ++++++++#++(++-++2++7++<++A++F++K++P++U++Z++_++d+g+o+s+w+z+}+z++z+"++  ++ +++++++++++PiA +*+*+*+*+*+*+++++++++++++++++++,+',+++*8,8,+H,#+H,-+H,2+H,7+H,H,p+W,+W,(+W,W,A+\,K+\,U+\,_+\,\,<+k,F+k,P+k,Z+k,k,p,@x@  h.F 0h5F / HO/" \/" Hj/ w/ Hy&/(/h//0// 0@//0/ |/0|00800@S00|@h0y0@000000@0000@10@,1/ 0@71 B1 HN1~b1~Hw1g1h11o1q11 0 2 2/r2 0)2/rhe 32e$$a((P a,)a0 P-a4%a8Px$a<8!a@,aDL28aHXeLePeT@x0eXb2e\z22e`8ed2heh2el"epd`(etd ( ex "e|P  .a  'e2@ e2 e3 e  e  !e?Bx  e .3 e   +e0 ` *e   e@ ` eL3 ad3( ap  +a 8 %ap $e #e 8 %a a  ap !aP x !e (e 8 ep  e   eH p e  &ed@B~3` ed3 e3 aH h e  e( H e   "e @ (e   ed( P "ed3 e @ ` e$  !e(3H e, 4 e00 X e4  e88 h 'e<   e@  !eD8 X eH  #eL$4 eP  H &eT  (eXH h e\  ,e`h  -ed?4[4ehv44el44ep  @ et4 ex   e|4  e 5P e#5  A95 e H $aP5 e &e! 8! %ex! ! &e! " &eP" " 'e" # 'e# # .ed($ X$ )en5$ a% (% %a5`% a5% a% & "e5X& e& & +e& ' !ep' ' #e5' e5 ( e 6X( e( ( #e( ) e@) h) "e) ) "e8* `* #e* * $e + H+ &a+ + !e(, H, e?B, , !e ?B(60- e?B- -  eF6- e8. `. "e. . e _6/ e$P/ p/ e(/ / 'e,@0 h0 "e00 0 e481 X1 e81 1 e<2 82 'e@2 2 "eDx62 eH 3 P3 'eL3 3 eP 4 P4 )eT64 eX5 (5 e\5 5 %e`6 86  ed66 eh66 el67 ep87 `7 et7 7 "ex 8 H8 !e|68 e 9 (9  eh9 9 e9 : #ech: : .e(; `; 0e; < &eX< < %e < < ep= 7 e= H8 e7= e?B> (> &ep> >  a > ? !a57h? eR7? en7? a? @ "eP@ x@ !e7@ eA @A 'e7A e7A e78B e7pB eB B +ehC C eC C $e88D e`D D !e18D e8E hE (eE E "ePF xF  edF G a N80G eXG G "ed8G e{88H e8H e 8H e$8I e(XI I  e,8I e09J e498J a8"59J e<J K e@R9XK eD#K L *eHdL L "eL2M (M  ePm9xM eTM M &eX N HN e\N N  a`9N ed`O O ehO O *el8P `P  ep9P etP Q "exQ Q e|8R `R  eR R ed S HS $edS S  e0T PT eT T  eU (U e`U U  ed9U eHV xV (e9V e9(W e :xW eX 8X (eX X )eXY Y  e':Y e Z PZ )e Z Z -e [ 8[ %e[ [ e[ \ *ex\ \ e ] P] (ed] ^ ed^ ^ e_ 0_ .ed_ _ %edp` ` ed@:a ea a !aa b 'a`b b #eb c  e@Bpc c e@Bc d e @B\:8d e@Bhd d "eXe xe ee e ed8f pf 1e z:f a$f g e(Pg xg &e,@g g )e0Xh h -e4h i !e8:u: 0 :w :y:z:s:sH:w :|;|H;}i  1;~I;[;v;;;H;;i ;t ; ;;;H< < < #<d-< H&8< (Q<X<yi< w<0< 0<.<.@<<(o&(</ </ =j .=* =$=j (=j .+=<&0k 00.=xk 1=k @5=k @9=l 0<=Hl &?=B=^=xl / b=l /f=l j=m n=0m / s=`m w=m m {=m m =(n  = =-Xn d=n $=n $=o $=0o ========H==H==H==._-Xo " >o 0@>H#>o 0D)> p  H3>p 0B:>p LK>0q pPU>`q 0Tp>q "Xq r "\>Pr  `>r d>r i m  >r  Bh5>>>Xs 0Bp>s  0x??p|*?0t pB@?t  L?u "e?Pu "u u &"|?v "?Hv "?v "v v ""?@w "?w "w x  "hx x #"x x "Hy hy "y y "Hz hz "?z "{ 0{ +"@{ "{ { -"*@H| "| | !"D@| X@0} 0k@}  "z@} b@} x  0@} 0B@0~ @`~ @~ ՞ "@~ b@ "AX  "A 0A* m 0=A  0BKA  0ZAp 0  Ȁ 0kA 0AX  A  A   A    AP   $A  A   (A  A , BH 0B 4.B؃ 8?B "<PB  "@]B "@qB 0DB  0HB(  @LB` ՞   B`  BPB 0TBȅ XB 0B(  \C  `C  0dC  h0CP 0l:CEC 0\C plC  tC0  xCp |C  CЈ "C 0"C8  C  CD0)DЉ  5D SD@  gDx  D  p"D  Dp  D "( P    Ȍ !  DP  D  "D؍  E /EX  0=E  LEȎ 0_E zE` 0E 0E؏  E  0EH  0Ex  0E 0EEp ؐ F$#P `,Fx   9F 0PF "XF   eFP  ! tFx "0FȒ  #0F ՞ 1$0FH %0F  &0Fȓ '0 F (0$FH ՞ *)0FȔ 0B(G0 +0,!Gp ,005G ՞ .-0IG 0B4^G`  /08kG 00<G 0B@G 20DG bHGp 4"PG 5TGȗ 6XG 7"G( 80\HX 90`$H :0d9H  ;hDHm( =<"[Hؘ bl >psHP  ?tH @xH A|HB0H C H0 DH E Iؚ F I(  G0!Ih H&*I I;I J0QI0 K0gI LzI MI NI8 O I P"I؝ Q I  R0IH SJHJV bJ  b&JȞ W8J X IJ` Y0cJ  Z0pJ  [0|J@ \"J ]0JȠ ^"J _0J `0J a0"JH b0K c K0 d 0K e0EK f0 VK0 g0mKp h0Ki0K jK kKl"K0 m K n"$ Lȥ o(Lp0)L  q0,5L0 r 0LLX s04dLqL t 8Lئ  u0<L( v@L` L mw0Lȧ L mxpL( L m3y"M L mVz" M L m{"1M8 L m|0FM  } DQM ~ HaMP  LwM  PMȪ 0TM 0XM) m 0M`  0B\M "`M dMx "hMЬ  lM pN0 t,Nh  x:N  "|EN 0ZN8  oNh N N NHN "NP 0N 0Nد "N  0OH  "O  #O ՞  3O  BDO(  VOh 0fO 0xOб  O OP 0Op 0O O  OpO@  O Pȳ  P .P@ 0@Px  QP  bP   mP(  wPP  0 P " P   Ph 0 P   P 0 P " P"P`   Q "Q " 1Q "AQ0  "$ PQ 0( gQ 0, ~Qи 00 Q ՞ 0Q 0B4 Q(  08 QP 0< Q   @ Qع  D Q 0H RX 0L &R 0P ;RX 0T VR  @dR "X vRH  b` R "R 0bh Rм  l R "R 0bp RH t Rx x S 0| #S` x  07S 0B LS8 0 `S 0 vS   S " S " S 0 Sh " S " T " )TX " AT " WT   jTp   wT 0 T  0 T 0 T`  0 T 0 T " T@  0 T   T 0" T  U  Uh 0 .U  ` :U    FU   TUH  mU  " {U  0 U8 " Up  " U  U 0 UH  Uh   U " U p U| "V| "+V  HV 0"$ QV@ "( lV ", V x  0V 0B0 V 4 V "8 VV "< W( 0@ %Wh  0D 5W  "H HW  0L XWH  "P gWx  0"T yW X WW  \ W p` W( 0d P p "h W   l W  p W  t XX 0x X 0B %X8 0 5Xp    @X 0 XX 0   hX 0 }X8   XX@X XX @XX X. 0X  X& `XhX  |.1XjYj@Y `YH - H'Yp - H4Y -  BYLY- gY - tY- @ Y- @ . - .@ - / - Y-Y- Y- Y- YY<Y ? Y( = YY@Yx  @ Z  ` "Z C  3Z( 0@ p  E F$ FZ8 G VZhZH$ Zd Z`  J$ Z d( ZZ L$0 Zd8 ZZ N$@ [ dH [ ՞ Q P ,[  @P ;[ R@P[H T a[ T o[ U$X [ V\ [ ` [Xd P 'Yh [ Z$l [[[ \\ \ p 8\ ] t R\8 `x f\p _ }\ `  a \@ b \p c \ d \ e  8 f \x g` ]| h ]| i .]| j J]| k d] ` z]]m0 ] n@ ] o$ ]  p ] q$ ]H  r$ ]p  s ^ ` ^P  u ^  v *^  w 6^8  x$ B^p @ W^  z@ f^ @@ v^` |$ ^ }$ ^ ~  ^  ^0 ^@ ^_p &_ 0@1_B_K_   Z_0  r_x  ` _  ` _  $ _@   _x `_ 0_<* _ ` _   ` `p  1`    =` 0T` @]`   h`  ` t` 0` 0` 0(  0P %0` 0` 0` 0x 0a0a 0 )0 0  0%a 0 0>a 0@  0Rah  0]a  @$ haxa$( a $, a@  0 aax (4 % h8 a  $@ a`   D a  @H b   L b( 00b  Abp $P Rb @kb  @T bx  @X b  @\ b  @` b  @h b   l b $p bH  t bh  $x c $| !c  3c $ Fc $ YcH kcp c  c   c  ` c $ cc@c  c  0c@ ` d  d @@ d8  &d`  @d  Xd  odH  d  d   d  d8   dp  d  d   e(  e`  $e   3e   @e  Pe@   de  we  e  e  e  e8  ep  e  $ e $ f $ fP $ 7fx  $ Ff  _f $ |fk# f0 h fp `f ` f ` f    0 "` x  g `$ <# (+g  ( Dg  , [g  0 P p  4 ug ` g0  8  <  @ g@ hD gg0g  ` gg@h  @@"h  @@.hP  @@9h  H Eh  0^h  @ih $L oh@ ` wh 0P h 0T h  X h8  \  `   d P x  h    l h8  p h  t h  x i  | *i@  Ei|  Qi @civi ` i " iH # i $ i ` i & iH  ' j $(j)j ) Cj   Oj + aj@ , yj - jj.$ j/  j  0  j 1   2 P p 3 j 4 k 50$k 60@Bkp 70^k ` hk 9  {k: kk ;$ kH d k 0@k >$ k8 ?  l @0 l A  2lh B BlC Wl]lD yl E$l F l ` lp  H$l I$l ` l@ J lp J@l Lm  N$ m O *m  P 7m8 Q$Kmh  dZm S$sm  @mP  @m  m @m Wm@  Y0mZ m [ n \$n  ]$('n ^ ,;n0 _$0Bnh `$4Vn  a$8an  b$<knp c$@un~ndDn `n@  f Hn`  Ln h Pn  i Tn  jXn0  @nx l\o m`*o ndAo  o@hSo o@pko qxo  @o(  @o`  t@o  @o  @o  @op  x$|o y$p z$p{ ,p ;| @p}(Gp~hOpX $fp  rp {p[  pp p $p  $pp@qh  q  3q Cq0  Xqlq$q`  q @q  q( @qh q @q  @r  $ rp r $/r $H h $Br`Rr `br @yr` $r 0@r  @ p (`  ,`rh r r @s  @s!  $s8! $&s  9sh!  $Hs! $Rs! $fs(" $zs|  sX"  $s"  $s" $s" $s# $sH# $ s# $s# $t$ $t|  +t@$ $5th$ d Ft$ $$[t$ $(ot8%  d,}tp% $0t% $4t%  `8 & H& "$<X' ' $$@tX( @Dt( $Ht(  $Lt$Pt) TuP)  X*u)  \?u)  `Wu  cu*  dP* x*   h* * u @u0+  lu`+ u @u+  pu , 0tv,  xv,  $|*vd|:v$Uv8- Hfv($vv- dvX. $v.  v/ v`/   v|   v/ $v/ $w  w,w$Hw`/  Zw/ $pw0  $|w@0  w`0 `w  w0 ` w1   w81  wx1 `w1 w2 @xP2 0@x2 @"x3  $/x03 @Hx3  `Vx3 @ox3 0@xH4 @x4 @x4   x5  xH5  x5  x5  y6 ` y6  @@/y6  ?y @Py7  iywy  y`7 y @y7  y7  y y7  @y8   z@8  $z8 $ 3z8 $$Jz9  0(Zz 0dz 0pz 0|z  @z z09  ,zh9  0z9  Lz9 4z z8: $8 { <{ 0{h:   @>{: @DR{; Hi{h; L{; P{; T{ < X{p< \{< `{<  `d!{8= =  !h{= "$h|= @@ ||$l%|X>  %@p4|> &x=|>  '|K|> ( \|?  )$g|@?  ` s|| + |? ,$|? -$| . |?  /| @  0$|P@  d|@  2}}3$.}@ 4dJ}A 5 ^} 60i}8A 70z}} 8$}pA  9$}A  :$}A  ; }B `$}hB > }B > }B ?} C @$~pC  ` ~~` 6~C C L~D D@]~@D  @l~C F ~D G@~D H$~D I$~0E  J~`E K ~E L0~E M  F N PF  O #F P 8F  `GG ``G `xH T hH `H  HI `I ` I Y$(8J `0J [$8,J \ <=K `@'UK `D(gK  _ Hu0L  `L a LL bP c L  ` À8M  eTрhM X M XM XM \ N \%0N \5XN  l`CN m$dUN n hkO l}8O lpO  qpv?O r$tO s$| t Áu@܁P v$x@P w$|pP d)P P y$(Q z$0XQ {@Q |WQ } ^(R  ~(kR R $  S 8S "$ @тS $S `T !(0T `XT  T `$T ` 8U `U !(9E h^U $V (V $y`V $V $V $V $܃(W $`W $W  $W $-W $? X $[HX $qxX $X d8Y dY `΄Y $  Z $ `Z $Z $0Z D[ $V  \X[ $[ [ !$ \ 8\ $sp\ $\ $\  ` ]  (ȅ]  ,օ]  00^   4`^  $8^ $<_  @#8_ $D4x_ 0HG_  7LU_  $Pd0` dT3w` $X`  \(a $`Ά $dha  $ha   la $pa $t.  9 b  $xH`b  $|Ub  @*cb  rc j   `c  dc $  (d ` ׇxd ` d $d $(e $0e $Ie  d,Xf  fHf  nf  ${$  f $ƈf   ՈXg   g $g (w m  *g  `/?Ph @Oh  _h   mh  `x՞ Hi @e (i  @щ @j  @Hj  pj  +j  $:j  O@k   ]pk  sk  `2 l $Xl $0@l 0@͊m   ۊm @m @m @ n @)Xn @<n @Nn @_n $o o $who  $o $o  $p $  Ћ(p $Xp $   p  $p  $!p $7q  $B0q $ RXq  $$q q  $(]q  $,v r  $0|   hr  $4r $8Ό`/  r $<r $@ s  $DXs dH1s $LDt  $PS8t  $T^`t  $Xit  $\x   t $`u  $d(u $h`u  $lōu  $pЍ    ! u "$t##$xAu  $$|L| % e(v &$v `Hv  ($xv )$v  *Îw + Ԏߎ ,@0w -$ .*Xw  /$9 0 Uw 1$qw 20H x 37L4$Hx 5$яx 6 x 7 x  9(  y  8(Xy  :(&; :I <$dy =$y y  >$z ?$hz z @$z W';'BA  { d3{  C ȐoD(Ґ{ E${  @@P| G | H ,|  `0:0} J$@[ K L[L \`} `4m}  N z}  O } P  ~ Q@P~ R$  S~ T ~ 0@֑  Vh W H Y$0 Z$ [[  \ X `3 ^ M  _q- hY_`Hl8 `b(}p `c( `d( `e( `f( `g( ` h(  `i($ϒ@ `khג j{h( j(, j(,@ ` 0h `oh ` w(4 ` q8" `r(<` `s(@2 `H8 tk-`@? v x(4MP ` p(4X `y(Dn ` z(H| `|h( {h` `}(L ` ~(P,&І `(T `(X0 `"(X̓X `hғ `hړ jh `( `hz&` \ 0 /؈ /0  @`X  / /0  `h( 'p 0/ 09 0B8  0O 0bf z@qeȋ p0Ӕؔ0 00 0_0$,=`  I]x P  0 @ P%ȕ 0@Ε 0ԕ Pt   P"@  P1p  P@  RȎ  8]  8hH  8s x}PPƖ 0̖ 0Ӗ @ А   8  8  8   0+  06  0A  0 L  0@W 0a  0n  0y  0  0  0  0 X 8@ 0@ӗ( 8ݗ 0ؙ 0   P@ /  < B@  8M  0Za0{ 8P TP( 0X 8˘  8@ 0 x 1 :  PI P[P 0 a 0@h  u@ h  P  0 PÙX =R Й 0יȠ S 0 0U", /h  P= 8CС 8 L T8  ^` P y   PÚ` @ ښ PP S*O*  8@ P-FWop 0 0  @ Pț Pۛ   0  8  8P  0     #*> 8F 8O@ X mz   Ĝx 0@ΜȨ  ۜ  P     0   8'P !0- "06 )`($#F P&] P$y  &0 '0 (8P  ) *8  +0,0 ۝ -@0 P` / 0     P("(3FX 40@L 50Sخ  68@_ 78eP 80k 90s : ;( <0h =0 > ?0Ǟ( 0 Ξ A0@מ( B0  C0@D0  p F0-G P C P(h P0`ȳ P8+y L< P@. N O0ğ  PD1ӟ Q(  R8h  PH TPP&/E V8Mȵ W8Ta P| Y(  Z0h  [  \8  ]88 ^8 Ǡ͠0p `0 a0b0 ( c0@Fз d0OR  Xx11]( el+ p      ˡP & /`p rhաء :l:0 :й  p: i:t;Hx;2;J;\;w;@ ;H;; 5x  ;BK  @RU_ 0f  t; w H; 0 p  ;;H<ɢ٢    ,  ; Rػ dv <  yP    ȼ    ã  Σ@  ٣h          P  8 $` -` 6 ? H Q Z8 c` l  w    (  X      Ƥ8  Ӥx        H    !H  .  ;  H  SH  ^H  i  t  (  (  `      ѥ8  8 ` ` +(  7X -@<@R<s:HCSj< x< 0co <  0  ( (p&h  @0 !Ӧ֦`Cz mYrPit@RtU` (D|H7P ٦C \A l *n *u ^*l } j j  ( 2 @ G O V ` l m~; ԓΓC H U ^ LVg s { (wl            & . 9 B P X \ ` h w         S*   c      ! ( / 6 =   D   I @U @` @i @l @u @ z @  @  @    @  @  @  @`  @`  @`  @  @  @   @  @  @  @  @  I  I    !`  "h  #w  $  %  H.  &  (  b)  *  +  t,&    . $  $ 9   B  @ P  젃Bt X  O \  OpS* @  @ @ @ @ !@" !@/ !@ 8 !@ B !@ n "@a u " @ L " `V " `` "@ h "@ m "@ w "@  "@  "@  "@  "@ c"@a  "@  "@a  "@  "@a  "@  "@a  #@$ #@$ $T/d  %W?d   &_? '( */ +@'6 , T-= -K / ( @ d! ) l         G 0   PhO) D?: `@ K @Z  ~ T q  C{ T T@  7a t     @ _(w, M N N N'n Q3 RoC oR [ [b l ٓ{ pO  4O O": p" 6  O JBbzI`J~bfIr`JbpI^ Jbb^ID_yB qB ~B B +B B B **{++t+B B B B B Q / -[) О Ξٞ מ Ɩ ̖ c a j[YWЕ Ε  -+CA86NLpn{yca× !"#$%&B 'ʕ(ȕ)D*BO+M\,Z}-{B .B /012B 3Й?4=B 5B 6Lhn789:;<H=FB >?)@'{AyBCDEFHGFUHSaI_gJemKkLMONMOPB QRSHTFjUh_V]TWRGXEEYCĠZC [\՗]ӗ?W X VX V X ,V RV X V Xp p p ]k sk ,~k @k Hk Pk Qk Rk Sl Tl U0l V9l WWl Xil `vl hl pl xl l l l l m m 1m @m Um gm ym m m m 2m m m m n n "n 0n Gn ]n vn n p p n n  t--a   b   s F i ؗ 1 o)  16 dD H 2R Ȗ Ȗ T ϖ '   )) Ɩ Ɩ ݖ ݖ Ԗ                ϖ / & & Ҕ Ҕ 9 9 C C M M X X __] ] f f 5 5 a d g # j `   m v y  m P Ó v  !>   +  gTϕ +# Õ ƕ +Ε ѕ Ԕ ԕ  ˕ ו ڕ ݕ   Ҕ  Ҕ  Ҕ  Ҕ (S |k  G :     iC ~     * (ϕ *   -" m \% ' >* - 0 3  +1 6 9 < *? B 1**@F Ɠ 7? I L O R V Y j :Al o r | r  M M  J  t--a   b   s F i ؗ 1 o)  16 dD H 2R a d g # j `   m v y  m P Ó v  !>   +  gTϕ +# Õ ƕ +Ε ѕ Ԕ ԕ  ˕ ו ڕ ݕ   Ҕ  Ҕ  Ҕ  Ҕ (S |k  G :     iC ~     * (ϕ *   -" m \% ' >* - 0 3  +1 6 9 < *? B 1**@F Ɠ 7? I L O R V Y j :Al o r | r  M M  J  Ȗ Ȗ T ϖ '   )) Ɩ Ɩ ݖ ݖ Ԗ                ϖ / & & Ҕ Ҕ 9 9 C C M M X X __] ] f f 5 5 D q FCkl|D`q EClloowunl nEq PDo0oooPo oDr FDtttD@r DDtutDhr F E@u`u0uDr F`EuuuDr PDEvvoowuvw`vD s FD`s FFxx`x(FxxpxEs Ds FEs Et F|||F|||FFDu FD u xGD@u xGD`u xGDu xGDu FDu GDu GDu GxGPGЎG0GPpGGpH HЍ8H0 P   oH  Kp PC@* ooPoo2o I0P@PPP`PpPPPPPPPPPQQ Q0Q@QPQ`QpQQQQQQQQQRR R0R@RPR`RpRRRRRRRRRSS S0S@SPS`SpSSSSSSSSSTT T0T@TPT`TpTTTTTTTTTUU U0U@UPU`UpUUUUUUUUUVV V0V@VPV`VpVVVVVVVVVWW W0W@WPW`WpWWWWWW% Pj j j pj j  ,j ""j j j 'j G T j j j W ` j x 0 H P P h `    j  ĐQ Q Q Q Q Q 1Q xQ pQ hQ `Q Q XQ Q PQ( HQ1 Qr/XPW;Q9 @Q Q Q C pP 3X 0^uQ uc Pr (u u 8Q uU/0Q (Q P Q Q Q hP HP @P- PPC Q P `Pd P$Q E| A Y*   Z )     % /  FF6stapsdt libstdcxxthrow8@%rdi 8@%rsi8stapsdt libstdcxxrethrow8@%rdx 8@%rax:stapsdt libstdcxxcatch8@%r8 8@-80(%rbx)4stapsdtD libgccunwind8@%rdi 8@%rsiGA$3a1PGA$3a1gcc-11.5.0-14.el9.alma.1.x86_64.debug7zXZִF!t/ᲯU]?Eh=(aK"a=E8֍ ( YoF22Cl3$z16 vu8l4Cㅳs3{]Uc!Wxv)8ėŶ!Zc:$i2 u!fw֏iȮn9Loqr( ӘԻ t%.U/6~4gv!u\o3iT5zK(2nR\(U|@KE̹;3nJ\WQT6C{i]AuNzVׁ '|i*6Qp&0EӕJ6 T;HV*<BB53id/C{1'YR  TFL-Gd}t^Fxb+| i% ;ne'T3p#|h5? Ql4!0'μh@< MsydT_Kz=K [Wz ˅qjcx&%Ljj/5V وI{^ U7&NTե;q4R"sb݃CMv#ÚՍ(~ϗq`l|g | ]Z ɨ;'$cF2YsZ[IjX,JuMvoy ^{M/:ֻe߄[ yw; 1oov|1 0\IdD;oKszz®TTnus>4@]hl.8}RW{ XdS'2CXK=ݛ#æͺ(P'HXgty]GH4 Gw- %ꨥ</XE%?xL%K&c9?br;¹F+ *gg;%4UmQF'i$u hh<;`^͹:I4Q},P%Cmt̹gld}DJ.!n6A>&=Ց lENS]{OGo4$S: EjQ4Sǃb-j~`ْ\ y2e%o Z3$9,5lp r#i #򊬛6y~^r9x@T}f2 @.+E"@2  ELwEݳ p7-E,P &&(~Y뼝h6B87^d\JmLi'%1$`JC$p)C2ݎKб^ީw~e ŨEcZVs$ =Xtk2zos]_JScMݨ>u5EGn& | y?ЖKaLeDdia.-[rH0B4b|%=qYOAQ5<e 0ż6^lzJ(֯>dӴ̪%Rh *Xofɞmhh6@ pT&bH22|ЅKqs-5m/{3P&o{zsNPp{-۝pC7"*-UR@d|{kFmi.xڎsa^'"#d3\+oo-4PvbqzwG^~apS @/H$=lvC"7/~iʑ}r3(URlſ,5rl(^Nl? }!%yQ)8fn00nmV1捣w-Kڟ<8K!;lʹn{# Ì#_pmO2@/Nkx'}t3!wԻYz 20i"7Z'@9'/t 'E 'bsΛm J"w5D-k-Qvk|6Sn݂fJ8gԺKM[ ]qTm7u<2wIj1bH9VBg'I?ᆦRMS84Gq<a dmFAIZd}%-b7ku k1vMX2*Qh|ǜt ZQiD]#ɝÉmZMƀ( ^3Hb{!Xej5Q@S{Wɤvaam UgP -ĽFUjy 'RF`q[n&uӻtYH ~dcJQ6ӳq=[ Lp>,ǸCxKn%ɟF|0&o!pEw?CRՀ<ƴ,7 Kx5*a_ly)2:/)|*ףWw:F g?T V>]s D䮤RP]TOBsvs9\!}g-%b0(Y k!CrG.tYDO^InTO삍A}!'Y/vwvʫJIܿ 7TtӋ63šڡ\_WH7j/)3|y9u>Mnu'3w0Ox`*ш%4pÎjwbZlԵƫU2~b8LiC:(ekg hM'hmDv>-W<\ѷ߼ae7dR7J;7Xk6Q5O(Qtb8|w7Âo3VӾ6r1ͯ0Q8?-ԊE[R~'2\8zT|A?~SoVM#;e)//׺E)P-U)=#(& pedʳ.OUCU_A<`1*_%9[`N-# okؽȢGb*d򓀮cۆ=wnIG6Aaz&D( .G^s+\ pTeFqgG P‘fףgj%/Cw^D`cl5G6STр@Uc5bߢrr{L[Ɣ8@1&TZCI~^ϣb}`'` [ty ,r.;rgڙ#pC( . 5*UA¸ wĞB[4Ohˈtl X=FƤ,rk`noOt6;EUbD2.O*8,f.1|Ӷj 7s ; ikӈX;; Z,ܶ__Bflv"TeُNV%;ϼ=U*MVkΫ\D[hW\Y87xZ7l/N[NwFug֣bD`P\v4>$뾬 ӟ@=nEAn[2Z0}@+!7SNEcOTRŬzm*Nl;>XYA E?[&_k܇yD2 =\.ɪy\nlC#!O&woݱPpy-ϊtM7?<ֱqJ B3v:",x6hyO7H)p-q߇cCdJTq\@Y7ލ{%"3FZ?UjLr\ aY \/7oeNla"T[xk>01vbQƌm#H:sjZWbUy ";>(Gh5xNVhxH\R[%b]na&7wdM͂(IA?#on7Ȭ[يf=I\<^VY c蠆 \}&OA +JD#]WW&G+Nqe%M<\)#,GZ_#Iu,^[j _4#`3PCoiXn|}y ۚKF.ZԐduSZV.t8t턮TKyOˎ٭Wuf{?qڹ m:+Bʲt\$ڈg\n[Z\dnI8^dMf+KdAWb''}Z1m`)N^:HO}5eء +E^qܝ__j1{o{>LgsB UM^I$tϮ{?0[RG("x3X+#-ٺs -WM*2x~yx3|!,ja_ *Z,OH\Wu3rr?(0hhr"٤y4jkAss.FꂮЈT+CEuTG{ !|Vu@[zGٲNp҄ Ѕl6<ƚH/VТKaӾ՜/7Hڜ8O(aU,=i_J<'k,h2y5Y}Z7lnD:4k>u2ībG@\L5F }V,>.FWw>XH߰9ɏ5KOK7D/l&VUDVݓ!<}"qirc]ph#窼Īl@|DxH3}X:<9af&TH КrleǫLI.ޕjog=e?n$YƲlR~s8<.P :Kk<͉c4!z)8)+Ǯ>kxR rE|J"fT3*ud _jUzf - ={[_l%d2 ~V r3帎 q}YH,o*_*x&m\7h)wI;ܴ xw%5E@|ЎI..qDzT3֬ʽ)#cZjTfQT0#[;1Q6P^#{Ӳxoc40w"v},ZoE>je8: ϧTz*UTm pë\tNr[ "0n :-ىnc%64X٠C=#B~cfG?ҫ8y%Z>nf:jR^ExV‹=}䞐3|6hY$$Ĕ6gNb=Ԓ%%[}'- ~>("i'+gP?%lxp16(xϏf`1" or(e26HHjV>MgVeȵE2P+q>=*ᆴgNmym?!1͉(WަG k*:/41eBfS 'd\S t->xMp98X|"D<{N|-vT'!׻ֺח Ð-eh.M4M'h~6zV *lYF9!v5^Ԫ -m~N𒴃&h-N6\f%a."(sBQ~XX{p7} 蕷ζr'w}/}E8 rЀ0Dq22Sp=BvE3z6i\ gm?Ml2ھVJq 2v@:"ETS /ąqx5֪IߝmX +]e\~~{~xZ;Y S>}|فgw= '?"!._sdDKQJB%qm1kw'M]0 R1$c$rO@)vHazd!a䚬^Jupًb~zJc0y\6@bH.uZmC2 M6cqɿ9⾖w5i鄅 tӁ'oq`qZS1agUM.!^O"~]ւ>2$<Ș?KsY@t2Dz٣EuRa,L U7A*q(^+!|j}PA þэ˫tX..6^I7yݩ.j :$tHVichWHA[e'Sbt%}NB O5ӧc[Ri)p*nʍO%%R8 kZ*He_ u׺+SӵfK+x5$\Ilat!SM`>zߥi,=wݡW52\kX$*b9e *"{= 6BmgYztt9~Y1dg2>\!xΡ8M¼O lC\BABdslj{d:P'k׍v85Q6O^TRHEeH83W.^.N⋫[Gσ4NcwgJAexk1 [) n;Bτ)PRO۞^gH̻R8" H\}=Pͽ$;Zd%u'dNA9;snWŖzlHMx00+8W qeAsf|8TgnLWѽcq F5O1OM_c ? 5-6f`Эn@[\LF}E|G]ou*GFcOi)D{jX]"e| -Q^%X 6|K*㐭D]Jq%8ј")(3p e{_[pnjfH:+p~+{4ޓTTmN8pgԞH>R(CkEľAfEhl0Gu8 "ƽѶwUu)vfE´m'ut Ov K#DYQntmقG/Cx6bYPZCL9ƌ缙Đ)֦9-+RLbY"VE`l6I`%kjδʿ1U`G 3%Ui 3γ :3]=ቌTN;=9Rq5 ax i YZT~\_/,B 7n+OV!O V0s9tKA7iZ2qO&ıI"@&ju2N\S0i}ϓJ= {ğovxlbq$:WU<{6i܎wP;j}`13jL-C#o;wjv̵sխI%nN,{9 IȉRX|B/wT{ ([)me]*Ķ?,/ʞi$ UMeIT _0Wh^v/GFe׃ǎ[ӛMaOE\'xJXB}`mF#a<^1uڄ EZڣtFSd6dtwxiD.A{ *>|,'1K`TrעdfUܟ)~]o4B!K#y~)~dRr\燑>wt-aP!!I]i9hsUW `I*6͚ /rg%+e+lJ xY]BQsSg$A H4?>8!koF%b܉{YǓ j gq r5ɀ~hP#ؑED@+&\1غbsEٸCM1 9m,̈́ tz )9[-hp Y7?HKh=?wKer* nH#5M#6b4J4^tg@,+ɏe$5?zP\A,̵?Ӌ`Z+2sAH{m6pI{f",¨s8.姄=bֻp*EͤpM[26{ޫ6$ qkBO+\\rl@H %YMI_gew:뷑Nkw 64gCDUD{fL&1 )H{3hQĺݼv8\~13X|o$*z}%*!␑ !{'vh$*9F`cHvbk;`U8a?H 5v}配D!P3*u8D0#gRQU]sep|TL}AEh!kgWp4aFs 1R Uo(cV&v%chdA-2ބ̿`KZ EGiPVV!ssnxW$ ves,>$0 ̳sD&o9ݪ_'XWS>3q|_TøQcgc?ۘ+~cq%&3K˺~GȄ]ފ)ن}ȃwya0h}QJ"CS1RL"N5c\viZ)@.l9S:c9:%Ɗ9R|ۤk,Vku(Sa6ٗH`bi:)b6t;lSCPݰYQr]Uv83^=^OxmCԸܺOQv- P[D?*51jIfazSO)Չ#Cs`E2T (hQ‡VK6o||R$J-MRI&^Aa?ӱ7#q>rR2[I>iP#Qȭ_(m wp`Ǯfo F\SP|e`*`~϶Eymrh6 i+.1+]喅1RKTHmXW=Cz+&`7foB {_N deF\I-p\Gޔ"1Y B5\}<ʥ"F:Mؗ0z5h{k7 {/2p>eU΂z^ i1}Pb."֚LvmU5ʥ.4G;.H?RVTu)yӈ]˕w|h1⭞XZv~$SYYB?WHR*t9; M1W.|.ZꙧAkOy2wz<0ezj\mEvģ/H ?Tt F=Π1Tuy IYk,]kv00Df;[ deaՙeMQyh$tU',Hު*^"f!0|?:'?*U@ ⢞|;ȣlmor{v=bNOOզ4Y[:#$#m ʆ d z cr93` +NVDf܀{-ջN96i=^96 RC0WO6 IaGi ڪw|P$`x6}h;vZ>ES:E#+sbc]kI[[ 7j+jC@2 +FIIBQ?ѧ/բD2FJ=d?q<^7l-odYIt htHj+wsP]~)ҍΪK:e@StΧc4U}kRY-} D-c"rPlbx~36*nxFCc}vX>.,)ɥ~A4%JN goDߙc)/O3C0Q "?Z2`\mUH ܧmQ*TȀM"?vE+( ` hC]tyUM,5p(*\aśq4 Np9RM&*r.atG,60r2ww_m\fԃMr$YD-ؐƲQV_ήH=0|5/АCBŘWg{RkVA>v_ N}nĨ;*OO%26$7~{AWjMvK G - -t5y@>wyhō&j؀C9 ^bm!:xĮtO2M`Gn [`?SOxSRSǠjd,!1S[j>?kJg}^Z~&qކ-h} y/jD̼b[^TnՃ9x p ČWaEW:{Kgmݰ#(16}]"h\L&71-Pkػ8!fD> W={ܮ Eи;^tQEO{7-/Z="o2.^sw:Anϛo؃0I_75nam!(㎜K=&8 &͵S w%6;Gя Ic'[ }2wFSS>ci8TeȮ-NjwX]SevɋKU{vdM=@)q8Ûzo,Vٮ\Ȁ;aj}γ"S3ywJ/~Ģ_ɩ?4jZcG~h2mUR!n\6jǷy1d@%wZ`)L# ~&m':|!#A"nfCXq@nF}O$Iyjy.׀=! r[.u Ȑ|<8$k+/]s< D?Kuz!*eX#qؑH8e /B;_p[ve %//3Nvq)5ڈ+˽V^kkMN`!)bn̰kuSrjh~o8xHO1;Z&cin"d޾/^zleRS9L5@2®hΎ)8sAήzh-#եP:A L7 Z7mt פ.V Khˊ] [@KO0-4_P3Sd*-ØH+"@K<+Ss"zϣw05(hjR;t1*l!NR5W͉wDvO1M[}=6+x(YYra6l\ѸۚSQXb/fe:YbL<8i1eS?Vo/L҈FzB D?ղ8#*t 1h=b5'fJ)lr[xMho1vE!&yEI)XSO@Hv\E^B=!àW݀<;w/$)b2q Rf 4紙he`ksIڧ2A 1N3SgMk87$}h==2:7&s4R-S)Lt->Ӱ@py3bOf}V4Øcp: ]1Xgj.YI0ͥQ B>yejfok"L*W\t(jq] V{=y6#g  J; Rb;qu~+\~]Rg9='.\QEM@ژkbP\wf.0R9O;`!=Isg 60I& N| rzؚHrK1uQL`u@,j}/d03WG [L}!=xͧHnCbAa{CO zrM*AyCRzz579Uʽ{n:5C'^J)%ROՅ?7Q׶ 3=dL#=˦MO~R-2ȏ1TCFmy"<Ε&ƕ5vaNeZ TܣGkHE sHFyoО8MU[1 u^]? ރtou}KQɩ?VYV_e^Xe+a#WtytL>k'tq^Cq^S٠4ώP$XɺGuv G9@ e"YFV+bZdXA$(eۆ`=!I }^DU|lflf&]K~!6/VR7 5s5ז/N{ ν&S=1 f0Xk 맮Y^ ޶daѱy&fz=d0QǑ}LMCh O v9QeM2Oιͨe_;n0&Rs:)8]Gϙ0LU>`g) b]/;E ;M$Ąڌod+ l* #xo(ڎc+\79xr9ugkI-g-w9[a 6א="$UJpTYt7!*rMőچ$!?~V"ⵂov&j!Y"m^̀pv;6^WƦq".A <0c)_UKXscDzPOCGH0|Lu>a@Z ~5i¿lh6ڂ[W/CTϚJMD^;'Rh 1]% pW-69R?ք#z阋H&N3XVhݓ\3+_yh/-=W7gc*H Wquèy I$kcDʉC'd0t!PwkP!لoɼwW .Eǐ @:Z.BWo?'Kvx>\Z0uZmʶf%ڬTpwd9RYN~LL!9;kF:/VleL+x1 QI95=RuN85c%7j? pVBtU_@_ "*qe۾_ d̝rPZąUPX.<x PsM.#2I1H?Qw򆅀%5ҋQ(.#]w +:TU`i-g/N熜a*RA,7's5OH{Q@yb<{y#"Aٚ,ie6( e`QYm jU}z:2*#D2WIqÇNe̪INL e7})b4;S=~528v7m>jw,A8ydؤe^b6>wfr0A S \fN~x{x:=«PAT?z,<̶ZwQI g sGyeɡf]Qe|R q|],lrBP޷m=k'ǗEnH0 .ī#Oj&5G..kiN&$2$~9홋rH\jGl.N]\RӹZG)L[ؚYQ'AE^Y٘k4N!/}4}_p eڤW$c2ќgcѓ1z_#$|NMs~\!unE`oYE,_lޭU=)wQ'g,2.G0T _էnAO$@Sue qd@_je( 8%?+]$}pHڍ3v,CFJ,뇠NFv8+տQS.>rTn1pEA}_^dƴOVtoo!_V`Pl{`MHTM,cMUУr